1

配列の最大数と最小数を表示する方法を見つける必要があります。配列のサイズは100であり、それを超えることはなく、入力の検証は必要ありません。プログラムは、0が検出されるまで入力を要求し続け、それも配列に追加されます。

最大値と最小値を追跡する方法を除いて、すべてを理解しました。誰かが私のコードを修正したり見せてくれたりしてくれれば幸いです。私が抱えているもう1つの問題は、入力が0のときに、ループを終了させ、whileループ内で最大/最小計算を実行することです。

/*
 ============================================================================
 Name        : test.c
 Author      :
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#define n  100
int main(void){


 int numbers[n];
 int i = 1;
 int j;
        int input;
 int maxvalue;
 int minvalue;

   printf("Enter the next array element>");

input = scanf("%d", &numbers[100]);



while (input != 0){

  numbers[i] = input;
  i++;
  printf("Enter the next array element, while loop>");
  input = scanf("%d", &numbers[n]);
  if (input == 0){
printf("Enter the next array element, if loop");
   numbers[i] = 0;

   for (j =2;j <= i; j++){
    minvalue = numbers[1];

    j++;
    if (numbers[j] > minvalue){
     maxvalue = numbers[j] ;
    }
    else{
     minvalue = numbers[j] ;
    }

   }


  }
 }


printf("%f\t", maxvalue);

printf("%f\n", minvalue); 
 }

編集:私はあなたの提案をすべて取り除き、私のコードを編集しました。これは以下の私のコードです。しかし、それは私が期待しているものではありません。

#include <stdio.h>
#include <stdlib.h>
#define N  100
int main(void){


    int numbers[N];
    int i = 0;
    int j;
        int input;
    int maxvalue;
    int minvalue;

            printf("Enter the next array element>");

scanf("%d", &input);



while (input != 0){

        numbers[i] = input;
        i++;

        if (input == 0){
                   i++;
            numbers[i] = 0;
                        minvalue = numbers[0];
                        maxvalue = numbers[0];
                        for (j=0;j<=i-1;j++){

                            if (minvalue >= numbers[j]){
                                minvalue = numbers[j];
                            }else if (maxvalue <= numbers[j]){
                                maxvalue = numbers[j];
                            }


                        }

/* min = value of first array element
max = value of first array element

begin loop for each array element, index = 0 to (n-1)

--- if array element value is less than min, set min to this value
--- if array element value is more than max, set max to this value

increment index and repeat loop til last index is completed

average = sum / number of elements (n).
max and min will hold their correct values.*/




        }
                printf("Enter the next array element, while loop>");
    scanf("%d", &input);
    }


printf("%d\t", maxvalue);
printf("%d", minvalue);
    }

これは出力です、私は得ています!誰かが私のためにこれを解決できますか?

Enter the next array element>1
Enter the next array element, while loop>2
Enter the next array element, while loop>3
Enter the next array element, while loop>0
12190144 l6Press [Enter] to close the terminal

最終編集:私はこれを自分で解決しました。最小/最大チェックをマスターWHILEループの外側に配置しました。これにより、0の入力を配列に入力できるようになりました。

#include <stdio.h>
#include <stdlib.h>
#define N  100
int main(void){


    int numbers[N];
    int i = 0;
    int j;
        int input;
    int maxvalue =1;
    int minvalue = 1;
            printf("Enter the next array element>");

scanf("%d", &input);
minvalue = input;
maxvalue = input;



while (input != 0){
    numbers[i] = input;

    ++i;
                printf("Enter the next array element>");
    scanf("%d", &input);

if (input == 0){
numbers[i] = 0;
  ++i;

  }

}
for (j =0;j<i;j++){
 if (numbers[j] >= maxvalue){
                                maxvalue = numbers[j];
                            }
                            if(numbers[j] < minvalue){
                                minvalue = numbers[j];
                            }

}

printf("%d\t", maxvalue);
printf("%d\n", minvalue);

    }
4

5 に答える 5

2

まず、inputの戻り値に割り当てますscanf()。これは、呼び出しによって割り当てられたアイテムの数であり、入力は常に正しいと言うので、この値は常にになります1

numbers[]次に、次の行を使用して配列の終わりを超えて書き込んでいます。

input = scanf("%d", &numbers[100]);

(代わりに実行し、ループ内の入力にscanf("%d, &input)割り当てる必要があります。numbers[i]

最後に、ループのすべての反復を再計算maxvalueminvalueて反復する必要はありません。numbers[]代わりに、それらを比較してinput、それに応じて割り当てます。

うまくいけば、これはあなたを正しい軌道に乗せるでしょう。

于 2010-09-26T07:23:32.500 に答える
2

あなたの中心的な問題は、各数値をとだけ比較することだと思われますminvalue。これは、現在のを置き換えるかどうかを決定するのに問題minvalueありませんが、明らかに、各要素との関係については何も教えてくれませんmaxvalue

別の問題:最初の要素からminvalueを初期化することは理にかなっていますが、ループで初期化する場合はそうではありません。それはあなたの以前のすべての仕事を無効にするだけです。

maxvalueでも同じ初期化を行う必要があります。その番号を最初の値に初期化する必要があります。

また、データを蓄積するとき、または完了したらデータをパススルーするときに、最小値と最大値の計算について決定する必要があります。ただし、やりたくないことは、過去の要素を新しい要素ごとにループすることです。それはあなたのプログラムに二次時間計算量を与えますが、利益はありません。

最後に、不格好なフォーマットを容認しないでください。デバッグには常にコードの調査が含まれ、物事について専門的であり、自分の作品を読みやすくするために、常に完全にフォーマットされている必要があります。

于 2010-09-26T07:29:17.607 に答える
2

最小/最大計算とループの戦略について、2つの質問をしています。(自分自身に対して)それをしないでください、しかし一度に一つの問題を解決してください。だから最初に次のようなものを置きます

signed int input[] = { 8, -5 , /* some more values */ };
size_t const n = sizeof input/ sizeof input[0];

scanf最初に、あなたの問題を忘れてください。

次に、最小/最大検出を適切なループ命令でラップします。

次に、次の警告を表示してコードをコンパイルします。たとえば-Wallgcc。ただし、これはコンパイラによって異なる場合があります。

私は私に何かを教えてくれます:

test-numbers.c:21:警告:「maxvalue」はこの関数で初期化されていない状態で使用できますtest-numbers.c:22:警告:「minvalue」はこの関数で初期化されていない状態で使用できます

これは、アルゴリズムの開始点を十分に考慮していないことで、非常に間違ったことをしていることを示しています。

于 2010-09-26T07:40:17.747 に答える
0

コードを再インデントし、その多くを `/ * ... PLACEHOLDER ...*/に置き換えました

#include <stdio.h>
#include <stdlib.h>
#define N  100
int main(void) {
    int numbers[N];
    int i = 0;
    int input;
    int maxvalue;
    int minvalue;

    printf("Enter the next array element>");
    scanf("%d", &input);

    while (input != 0) {
        numbers[i] = input;
        i++;

        if (input == 0) {
            /* ...PLACEHOLDER... */
        }
        printf("Enter the next array element, while loop>");
        scanf("%d", &input);
    }
    printf("%d\t", maxvalue);
    printf("%d", minvalue);
}

うまくいけば、1、2、または3を入力したとき、および0を入力したときに何が起こるかを確認できます。

ヒント:値は変更されませんmaxvalueminvalue

別のヒント:行は何回while()実行されますか?


実行例で編集

この例の実行では、コードは左側にあり、何が起こるかは左側にあります

        printf( "次の配列要素を入力>"); |
        scanf( "%d"、&input); | 42を入力してください
                                                 |
        while(input!= 0){| 入力は42なので、ループを実行します
            数値[i]=入力; | 数値[0]=42
            i ++; | i = 1
                                                 |
            if(input == 0){| 入力!= 0; プレースホルダーをスキップ
                / * ... PLACEHOLDER ... * / |
            } |
            printf( "次を入力...>"); |
            scanf( "%d"、&input); | 3を入力してください
        } |
        while(input!= 0){| 入力は3です
            数値[i]=入力; | 数値[1]=3
            i ++; | i = 2
                                                 |
            if(input == 0){| 入力!= 0; プレースホルダーをスキップ
                / * ... PLACEHOLDER ... * / |
            } |
            printf( "次を入力...>"); |
            scanf( "%d"、&input); | 0を入力してください
        } |
        while(input!= 0){| 入力は0、本文はスキップ
            / * ... PLACEHOLDER ... * / |
        } |
        printf( "%d \ t"、maxvalue); | maxvalueが初期化されていません
        printf( "%d"、minvalue); | minvalueは変更されていません
于 2010-09-27T00:20:55.570 に答える
-3
int cmp(const void *a,const void *b)
{
  return *(const int*)a-*(const int*)b;
}
...
qsort( numbers, 100, sizeof(numbers[0]), cmp );
printf("\nmin: %d\nmax: %d",numbers[0],numbers[99]);
于 2010-09-26T07:26:33.517 に答える