2016-10-12 2 views
0

Мне нужна помощь, моя программа не работает, она продолжает показывать мне 0 как ценность! Что не так с моим кодом?Как найти третье наибольшее целое число в C без использования массивов?

Программа требует, чтобы пользователь вводил число целых чисел в начале.

#include <stdio.h> 
int main(void) 
{ 
    int num; 
    int largest= 0; 
    int secondlargest= 0; 
    int thirdlargest=0; 
    printf("Please enter the number of integers:"); 
    scanf("%d", &num); 

    if(num > 2) 
    { 
     scanf("%d",&largest); 

     while(--num > 0) 
     { 
      int tmp; 
      scanf("%d",&tmp); 
      if(tmp>largest) 
      largest=tmp; 

      if(tmp > secondlargest && tmp < largest) 
      secondlargest=tmp; 

      if(tmp > thirdlargest && tmp < secondlargest && tmp < largest) 
      thirdlargest=tmp; 
     } 
      printf("The third largest number is %d\n",thirdlargest); 

    } 
    else 
    { 
     printf("There is no third largest number."); 
    } 
    return 0; 
    } 

вот мой код, как написано выше! Мне нужно отправить его без использования массива! Любая помощь будет глубоко оценена!

+0

почему тег 'C#'? –

+1

Что следует печатать в том случае, если указаны 3 номера и введено 3 одинаковых номера - вы должны напечатать это значение как третье по величине, напечатать ноль или вы хотите распечатать «Нет третьего по величине номера»? – PaulF

ответ

2

Когда вы обнаружили первый или второй по величине, вам нужно «сдвинуть» более мелкие (и вы можете заменить второй и третий, если «else if»). Если вы хотите обработать вход негативов, установите 3 наибольших наименьших int. И используйте> = вместо> для обработки дубликатов.

int num; 
    int largest = INT_MIN; 
    int secondlargest = INT_MIN; 
    int thirdlargest = INT_MIN; 
    printf("Please enter the number of integers:"); 
    scanf_s("%d", &num); 

    if (num > 2) 
    { 
     scanf_s("%d", &largest); 

     while (--num > 0) 
     { 
      int tmp; 
      scanf_s("%d", &tmp); 
      if (tmp >= largest){ 
       thirdlargest = secondlargest; 
       secondlargest = largest; 
       largest = tmp; 
      } 
      else if (tmp >= secondlargest){ 
       thirdlargest = secondlargest; 
       secondlargest = tmp; 
      } 
      else if (tmp > thirdlargest) 
       thirdlargest = tmp; 
     } 
     printf("The third largest number is %d\n", thirdlargest); 

    } 
    else 
    { 
     printf("There is no third largest number."); 
    } 
    return 0; 
+1

Это неправильно обрабатывает отрицательные входы. – Peter

+0

Действительно, учитывая исходный код, я подумал, что это не будет важно. Вам просто нужно инициализировать 1-й, 2-й и 3-й по величине до наименьшего возможного значения int – taktak004

+1

. Этот код не работает, если имеется один или несколько дублированных чисел, например. 3 числа 1 3 3 возвращает 0 как третий по величине. – cdlane

1

Если вы хотите обрабатывать негативы, установите три самых больших значения в минимальное целое. Кроме того, использование else if вместо if, так что вы можете использовать простые сравнения, вместо сложных из них, а затем, перемещая переменные:

#include <stdio.h> 
#include <limits.h> 

int main(void) 
{ 
    int number; 

    printf("Please enter the number of integers: "); 
    (void) scanf("%d", &number); 

    if (number < 3) 
    { 
     printf("There is no third largest number."); 

     return 1; 
    } 

    int largest = INT_MIN; 
    int secondlargest = INT_MIN; 
    int thirdlargest = INT_MIN; 

    while (number-- > 0) 
    { 
     int temporary; 
     (void) scanf("%d", &temporary); 

     if (temporary > largest) 
     { 
      thirdlargest = secondlargest; 
      secondlargest = largest; 
      largest = temporary; 
     } 
     else if (temporary > secondlargest) 
     { 
      thirdlargest = secondlargest; 
      secondlargest = temporary; 
     } 
     else if (temporary > thirdlargest) { 
      thirdlargest = temporary; 
     } 
    } 

    printf("The third largest number is %d\n", thirdlargest); 

    return 0; 
} 
0

Некоторые псевдо-код, который упрощает и корректирует вашу if() структуру.

int largest1 = INT_MIN; 
int largest2 = INT_MIN; 
int largest3 = INT_MIN; 

int input = ...; 

if (input > largest3) { 
    largest3 = input; 
    if (largest3 > largest2) { 
    swap(largest2, largest3); 
    if (largest2 > largest1) { 
     swap(largest1, largest2); 
    } 
    } 
} 
Смежные вопросы