25.03.2010, 16:57
общий
это ответ
Здравствуйте, Миронычев Виталий.
В приложении приведен мой вариант ответа, исходник детально прокомментирован. Поскольку бОльшая часть кода одинакова для обеих задач, то я позволил себе объединить их в один исходник. При этом я отметил, какие строки нужно удалить для того или иного варианта.
Программа распознает как положительные, так и отрицательные целые десятичные числа (в условии упоминаются просто "числа"). Нецелые десятичные числа (напр., 12.34, 12e-4) не распознаются.
Программа отлажена и протестирована в MSVC++ 6.0
Успехов!
Приложение:
/*
нужно реализовать (по отдельности) 2 задачи (желательно с применением стандартных printf scanf):
1. Дан текст. Найти сумму всех имеющихся в нем чисел.
2. Дан текст. Найти максимальную из имеющихся в нем чисел.
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <limits.h>
int main( int argc, char* argv[] )
{
char szNameBuf[_MAX_PATH], *pFileName;
// Если имя файла не передано в командной строке, то запрашиваем его у пользователя
if( argc >= 2 )
pFileName = argv[1];
else {
printf( "Enter file name: " );
pFileName = gets( szNameBuf );
}
// открываем файл
FILE* f = fopen( pFileName,"rt" );
if( !f ) {
printf( "Cannot open file "%s"\n", pFileName );
return 1;
}
// читаем файл построчно, находим все целые десятичные числа
// (как положительные, так и отрицательные), считаем сумму и определяем максимум
long sum = 0; // сумма, удалите для вар.2
long nMax = LONG_MIN; // максимум, инициализируем наименьшим возможным 32-битовым числом; удалите для вар.1
unsigned char str[1024]; // буфер для строк
while( fgets( (char*)str, sizeof str, f )) { // читаем очередную строку
unsigned char* p = str;
while( *p ) { // сканируем строку посимвольно
// ЗАМЕЧАНИЕ: в isdigit() надо передавать именно unsigned char,
// в противном случае в MSVC 6.0 isdigit() распознает, например,
// русскую букву 'н' как цифру.
if( isdigit(*p) ) { // цифра
int sign = 1; // знак - предполагаем положительное число
if( p > str && p[-1] == '-' ) // если в предыдущей позиции минус,
sign = -1; // то число отрицательное
// извлекаем число из строки
long n = 0;
while( isdigit(*p) )
n = n*10 + (*p++ - '0');
// sum += n *= sign; - короткая запись, если объединить оба варианта задачи
n *= sign; // число с учетом знака
sum += n; // суммируем, удалите для вар.2
if( n > nMax) nMax = n; // сравниваем с текущим максимумом, удалите для вар.1
}
else // пропускаем все нецифры
while( *p && !isdigit(*p) ) p++;
}
}
fclose( f ); // закрываем файл
if( nMax < 0 )
printf( "There are no numbers in file "%s"\n", pFileName );
else {
printf(
"Sum of all numbers = %ld\n"
"Maximum = %ld\n\n",
sum, nMax );
}
system( "pause" );
return 0;
}