Консультация № 177448
24.03.2010, 21:50
43.65 руб.
0 8 2
Здравствуйте,уважаемые эксперты!
Срочно нужно реализовать (по отдельности) 2 задачи-(желательно с применением стандартных printf scanf):
1.Дан текст. Найти сумму всех имеющихся в нем чисел.
2. Дан текст. Найти максимальную из имеющихся в нем чисел.


Спасибо!!!

Обсуждение

Неизвестный
24.03.2010, 22:47
общий
это ответ
Здравствуйте, Миронычев Виталий.


Код тестировал в MVS2008

1 задача

Код:

#include <stdio.h>
#include <ctype.h>
#include <conio.h>

int main()
{
char string[256];
int sum=0,num;

printf("Vvedite stroku : \n");
gets(string);

int i=0;
while(string[i]!='\0')
{
if(isdigit(string[i]))
{
sum+=(string[i]-0x30);
}
i++;
}
printf("\nSumma = %d",sum);
getch();
}



2 задача

Код:

#include <stdio.h>
#include <ctype.h>
#include <conio.h>

int main()
{
char string[256];
int max=0,num;

printf("Vvedite stroku : \n");
gets(string);

int i=0;
while(string[i]!='\0')
{
if(isdigit(string[i]))
{
num=(string[i]-0x30);
if(num>max)
max=num;
}
i++;
}
printf("\nMax = %d",max);
getch();
}
3
Неправильно поняли задание!<br>Необходимо найти сумму всех чисел, а не цифр<br>
давно
Академик
320937
2216
25.03.2010, 07:20
общий
Kamerad:
В задании требуется
1.Дан текст. Найти сумму всех имеющихся в нем ЧИСЕЛ.
Ваша программа 1 считает сумму ЦИФР. Та же ошибка и в решении задачи 2.
Неизвестный
25.03.2010, 12:25
общий
lamed:
Абсолютно с вами согласен!
Необходимо найти сумму всех чисел
давно
Академик
320937
2216
25.03.2010, 16:12
общий
Миронычев Виталий:
Как определить числа в тексте? (Другими словами, что считать разделителями?). Пример
йуйукцйк123 454654 54645лорол 7868
Что здесь считать числами:123, 454654, 54645, 7868 или только 454654, 7868?
Неизвестный
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;
}
Неизвестный
25.03.2010, 17:20
общий
lamed:
числами считать только 454654 и 7868
давно
Академик
320937
2216
25.03.2010, 20:00
общий
Миронычев Виталий:
Код:
#include <stdio.h>
#include <ctype.h>

int main()
{
int curr, prev=EOF;
int in_number = 0;
int was_number = 0;
int num=0, max;
while ((curr=getchar()) != EOF)
{
if (isspace(curr) && in_number)
{
if (!was_number)
{
was_number = 1;
max = num;
}
else if (num > max)
max = num;
num = 0;
}
else if (isdigit(curr) && (isspace(prev) || prev == EOF || in_number))
{
in_number = 1;
num = 10 * num + (curr - '0');
}
else
{
in_number = 0;
num = 0;
}
prev = curr;
}
if (in_number && num > max)
max = num;

if (was_number)
printf("max=%d\n", max);
else
printf("Строка не содержит чисел\n");
return 0;
}

Неизвестный
25.03.2010, 20:38
общий
lamed:
Спасибо вам огромное!
Форма ответа