2016-10-12 3 views
0

私の助けが必要です、私のプログラムはうまくいかず、値として0を表示し続けます!私のコードで何が間違っていますか?配列を使わずにCで3番目に大きい整数を見つける方法は?

プログラムでは、開始時に整数の数を入力する必要があります。

#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つの同じ番号が入力された場合に印刷されるもの - その値を3番目に大きく印刷するか、0を印刷するか「3番目に大きい番号はありません」と印刷しますか? – PaulF

答えて

2

最初または2番目に大きいものを見つけたら、小さいものを「シフト」する必要があります(2番目と3番目を「else if」で置き換えることができます)。 ネガティブ入力を処理したい場合は、3番目に大きい整数を設定します。 >の代わりに> =を使用して重複を処理します。

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番目の最大値を初期化するだけです – taktak004

+1

重複した数字が1つ以上ある場合、このコードは機能しません。 3つの数字1 3 3は0を3番目に大きく返します。 – cdlane

1

ネガも処理したい場合は、3つの最大値を最小整数に設定します。

#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()構造を簡素化し、修正するいくつかの擬似コード:また、あなたはあなたの変数をシフトすることにより、その後の代わりに化合物のものの単純な比較を、使用することができますelse ifの代わり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); 
    } 
    } 
} 
関連する問題