C/C++ - Наибольшее четное без массива

Ответить
Аватара пользователя
lerenia

C/C++ - Наибольшее четное без массива

Сообщение lerenia »

С клавиатуры вводится последовательность целых чисел. Определить наибольшее среди четных чисел. Признак конца ввода - 0



Среди положительных чисел у меня все нормально, а вот если вводить: 3,7,-4,-2 0 выводится 0(( а должно вывестись -2

Код: Выделить всё


# include 

int main()

{ 

	setlocale(LC_CTYPE, "");

	int k,l,max;

	l=0;

	printf("Введите цифры");

	while (k!=0)

{ 

	  scanf("%i", &k);

	  

	  if ((k%2)==0)

	  { l=1;

	  max=k;

	 if (l)

	 {

	  if (max
Аватара пользователя
deviance

Re: C/C++ - Наибольшее четное без массива

Сообщение deviance »

lerenia, ошибка в том, что Вы берете из потока ввода нуль и не завершаете цикл, а продолжаете его. Нужно добавить код:

Код:

Код: Выделить всё

if (k == 0){
    break;
}

Догадайтесь, куда?
Аватара пользователя
lerenia

Re: C/C++ - Наибольшее четное без массива

Сообщение lerenia »

deviance, промучаясь вчера еще часик я все таки добилась чего хотела) и кстати без break; не люблю его использовать так как всегда путаюсь с ним в цикле)

вообщем я решила проблему так:



Код:

Код: Выделить всё

#include 
#include 
# include 
# include 
int main()
{
	setlocale(LC_CTYPE, "");
    int k,l,max;
    printf ("Введите цифры:\n");
    scanf("%i",&k);
    l=0;
    while (k!=0)
    {
      if ((k%2)==0)
    {
      l=1;
      if (l==1)
      {
        max=k;
        l++;
      }
        else
       {
          if (k>max) max=k;
       }
        }
scanf("%i",&k);
}
if (l=0)
printf("Не введено ни одного чётного числа.\n");
else
printf("Максимальное четное число=%i",max);
getch();
}

Если предложите более разумный код, буду благодарна))
Аватара пользователя
deviance

Re: C/C++ - Наибольшее четное без массива

Сообщение deviance »

lerenia, Ошибка 1:



Код:

Код: Выделить всё

if (l=0)
printf("Не введено ни одного чётного числа.\n");

Выполняется не сравнение, а присваивание. Сообщение "Не введено ни одного чётного числа" не будет показано никогда.



Ошибка 2:



Код:

Код: Выделить всё

if ((k%2)==0)
{
    l=1;
    if (l==1)
   {
        max=k;
        l++;
    }
}

При таком алгоритме наибольшим четным всегда будет последнее четное. Проверить можно на тестовых данных:

Код:

Код: Выделить всё

-2 -990  0

Под катом одно из решений:
читать дальше »




Код:

Код: Выделить всё

#include 
#include 
#include 
#include 
int main()
{
    int max = INT_MIN; 
    int current = 0;
    const int term_value = 0;
    int at_least_one_even_got = 0;
    setlocale(LC_ALL, "");
    printf("Введите цифры (по одной в строке):\n");
    do {
        scanf("%i", &current);     
        if ( current == term_value){ 
            break;    
        } else if (current % 2 == 0 && max < current){
            at_least_one_even_got = 1;
            max = current;
        }
    } while (1);
    if (at_least_one_even_got == 0){
        printf("Не введено ни одного чётного числа\n",max);
    } else {
        printf("Максимальное четное число: %i\n",max);
    }
    system("pause");
    return 0;
}
Аватара пользователя
lerenia

Re: C/C++ - Наибольшее четное без массива

Сообщение lerenia »

deviance, решение внушительно) если честно половину из него не поняла) вроде бы задачка простенькая и такое громоздкое решение) что ж пойду разбираться
Аватара пользователя
deviance

Re: C/C++ - Наибольшее четное без массива

Сообщение deviance »

lerenia, у меня 33 строки, а у Вас - 35. У кого внушительнее?
Аватара пользователя
deviance

Re: C/C++ - Наибольшее четное без массива

Сообщение deviance »

deviance,

я не про количество строк, а про саму логику) но я уже разобралась)
Ответить

Вернуться в «Программирование и базы данных»