Wie die größte und kleinste Zahl in einem Array in c finden
Frage
Ich habe einen Weg finden, das Maximum und Minium Zahl in einem Feld angezeigt wird, ist die Größe des Arrays 100 und nicht mehr als das und es ist nicht für die Eingabevalidierung benötigen. Das Programm wird für die Eingabe immer wieder gefragt, bis 0 angetroffen wird, und es wird zu dem Array hinzugefügt bekommen.
Ich habe alles herausgefunden, außer wie der Überblick zu behalten, welche der größte und kleinster Wert ist. Ich würde es begrüßen, wenn jemand meinen Code beheben oder zeigt me.Another Problem, das ich habe, ist die Schleife immer innerhalb der while-Schleife zu beenden und tut Berechnung max / min, wenn der Eingang gleich 0 ist.
/*
============================================================================
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);
}
EDIT: Ich habe alles aus Ihren Vorschlägen und bearbeiten meinen Code. Dies ist mein Code unten. Es ist jedoch die Ausgabe ist nicht, was ich erwarte.
#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);
}
Dies ist der Ausgang, ich bin immer! Kann jemand das für mich lösen.
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
FINAL EDIT: Ich löste das alleine. Ich stellte die min / max Prüfung außerhalb des WHILE-Schleife-Master, dies die Eingabe von 0 erlaubt in der Anordnung eingegeben werden.
#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);
}
Lösung
Zunächst einmal sind Sie input
auf den Rückgabewert von scanf()
zuweisen. Dies ist die Anzahl der Elemente von dem Anruf zugeordnet ist, und da Sie die Eingabe sagen immer richtig sein wird, wird dieser Wert immer 1
sein.
Zweitens, Sie schreiben über das Ende des numbers[]
Array mit der Zeile:
input = scanf("%d", &numbers[100]);
(Sie sollten scanf("%d, &input)
stattdessen tun, und assign numbers[i]
zur Eingabe in der Schleife.
Schließlich müssen Sie nicht neu zu berechnen maxvalue
und minvalue
durch jede Iteration der Schleife durch numbers[]
laufen. Stattdessen einfach vergleichen sie mit input
und ordnen sie entsprechend.
Hoffentlich bringen Sie auf dem richtigen Weg.
Andere Tipps
Es sieht aus wie Ihr zentrales Problem ist, dass Sie jede Zahl nur gegen minvalue
vergleichen. Das ist in Ordnung für die Entscheidung, ob die aktuelle minvalue
zu ersetzen, aber offensichtlich ist es nicht sagen Sie alles über das Verhältnis von jedem Element zu maxvalue
.
Ein weiteres Problem: es macht Sinn minvalue von dem ersten Elemente zu initialisieren, aber nicht, wenn Sie es in der Schleife tun. Das nur verlieren alle Ihre vorherige Arbeit.
Sie müssen die gleiche Initialisierung mit maxvalue auch tun. Sie sollten diese Nummer auf den ersten Wert initialisiert werden.
Sie sollten auch eine Entscheidung über die min Berechnung und max, wie Sie die Daten oder in einem Durchlauf durch die Daten akkumulieren, wenn Sie fertig. Was Sie nicht tun wollen, ist jedoch, mit Schleife durch die vergangenen Elemente jeder neuen. Das gibt Ihr Programm quadratische Zeitkomplexität für keinen Nutzen.
Schließlich toleriert keine miese Formatierung. Debuggen immer beinhaltet den Code zu studieren und Sie wollen es immer perfekt formatiert wird sowohl über die Dinge professionell zu sein und auch zu erleichtern Ihre eigene Arbeit zu lesen.
Sie sind zwei Fragen, über die Strategie für die Min- / Max-Berechnung und für die Schleife. Tun Sie das nicht (an sich selbst), aber ein Problem auf einmal lösen. Also zuerst put so etwas wie
signed int input[] = { 8, -5 , /* some more values */ };
size_t const n = sizeof input/ sizeof input[0];
am Anfang und vergessen Sie Ihre scanf
Probleme.
Dann wickeln Sie Ihre Min- / Max-Erkennung in der entsprechenden Schleifenanweisung.
Dann kompilieren Sie Ihren Code mit Warnungen auf. Z -Wall
für gcc
, aber dies könnte für Ihren Compiler variieren
Minen das sagt mir etwas:
Test-numbers.c: 21: Warnung: 'maxvalue' kann in diesem nicht initialisierte verwendet werden Funktionstest-numbers.c: 22: Warnung: ‚Minvalue‘ verwendet werden kann, nicht initialisierte in dieser Funktion
Das sagt Ihnen, dass Sie etwas sehr falsch in nicht unter Berücksichtigung der Ausgangspunkt Ihres Algorithmus gut tun.
Ich habe Ihren Code und ersetzt viele davon mit `/ * ... PLATZHALTER ... * /
reindented#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);
}
Hoffentlich können Sie sehen, was passiert, wenn Sie 1 eingeben, oder 2 oder 3, und wenn Sie 0 enetr.
. Hinweis: maxvalue
und minvalue
Werte werden nie geändert
Ein weiterer Hinweis: Wie oft hat die while()
Linie ausführen
Bearbeiten mit Beispiel run
In diesem Beispiel läuft, ist der Code auf der linken Seite, was auf der linken Seite passiert, ist
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]);