質問
アレイに最大数とミニ数を表示する方法を見つけなければなりません。配列のサイズは100であり、それを超えず、入力検証は必要ありません。プログラムは、0が発生するまで入力を要求し続け、アレイに追加されるまでもなります。
最大かつ最小の価値である追跡方法を除いて、私はすべてを理解しています。誰かが私のコードを修正したり、私に見せたりすることができれば幸いです。私が抱えている別の問題は、入力が0に等しい場合、whileループ内で最大/min計算を終了し、最大/min計算を行うことです。
/*
============================================================================
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
最終編集:私はこれを自分で解決しました。ループ中にMIN/MAXチェックをマスターの外側に置きました。これにより、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);
}
解決
まず第一に、あなたは割り当てられています input
の返品値に scanf()
. 。これはコールによって割り当てられたアイテムの数であり、入力は常に正しいと言うので、この値は常に 1
.
第二に、あなたは終わりを過ぎて書いています numbers[]
行の配列:
input = scanf("%d", &numbers[100]);
(やったほうがいい scanf("%d, &input)
代わりに、割り当てます numbers[i]
ループに入力します。
最後に、再計算する必要はありません maxvalue
と minvalue
反復することによって numbers[]
ループのすべての反復。代わりに、それらを比較してください input
それに応じて割り当てます。
うまくいけば、これがあなたを正しい軌道に乗せます。
他のヒント
あなたの中心的な問題は、各数値をに対してのみ比較することです minvalue
. 。電流を交換するかどうかを決めるのは問題ありません minvalue
, 、しかし、明らかにそれは各要素の関係について何も教えていません maxvalue
.
別の問題:最初の要素からMinValueを初期化することは理にかなっていますが、ループでそれを行う場合ではありません。これは、以前のすべての作業を無効にするだけです。
MaxValueでも同じ初期化を行う必要があります。その番号を最初の値に初期化する必要があります。
また、データを蓄積したり、完了したらデータを通過したりするときに、MINとMAXの計算について決定する必要があります。ただし、やりたくないのは、新しい要素ごとに過去の要素をループすることです。それはあなたのプログラムに利益なしの二次時間の複雑さを与えます。
最後に、ぎこちないフォーマットを容認しないでください。デバッグには常にコードを勉強することが含まれます。あなたは、物事について専門的であり、またあなた自身の作品を読むことを促進するために、常に完全にフォーマットされていることを望みます。
MIN / MAX計算とループの戦略について、2つの質問をしています。それをしないでください(自分自身に)が、一度に1つの問題を解決してください。まず、ようなものを置きます
signed int input[] = { 8, -5 , /* some more values */ };
size_t const n = sizeof input/ sizeof input[0];
最初はあなたのことを忘れてください scanf
問題。
次に、適切なループ命令に最小/最大検出を包みます。
次に、次の警告でコードをコンパイルします -Wall
にとって gcc
, 、しかし、これはあなたのコンパイラによって異なるかもしれません。
私のものは私に何かを教えてくれます:
test-numbers.c:21:警告:「maxvalue 'はこの関数で非初期化されている場合がありますtest-numbers.c:22:警告:「minvalue」は、この関数では無効化されない場合があります
これは、あなたがあなたのアルゴリズムの出発点をうまく考えていない際に非常に間違ったことをしていることをあなたに示します。
私はあなたのコードを継承し、それをたくさん `/ * ...プレースホルダーに置き換えました... */
#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を入力し、0をEnettしたときに何が起こるかを見ることができます。
ヒント: maxvalue
と minvalue
値が変更されることはありません。
別のヒント:何回をしますか while()
行の実行?
編集 実行する例を使用して
この例の実行では、コードは左側にあります。左側には何が起こりますか
printf("Enter the next array element>"); | scanf("%d", &input); | Enter 42 | while (input != 0) { | input is 42, so you do the loop numbers[i] = input; | numbers[0] = 42 i++; | i = 1 | if (input == 0) { | input != 0; skip placeholder /* ...PLACEHOLDER... */ | } | printf("Enter the next ...>"); | scanf("%d", &input); | enter 3 } | while (input != 0) { | input is 3 numbers[i] = input; | numbers[1] = 3 i++; | i = 2 | if (input == 0) { | input != 0; skip placeholder /* ...PLACEHOLDER... */ | } | printf("Enter the next ...>"); | scanf("%d", &input); | enter 0 } | while (input != 0) { | input is 0, skip while body /* ...PLACEHOLDER... */ | } | printf("%d\t", maxvalue); | maxvalue hasn't been initialized printf("%d", minvalue); | minvalue hasn't been changed
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]);