Come trovare il numero massimo e minimo in un array in c
Domanda
Devo trovare un modo per visualizzare il numero massimo e Minium in una matrice, la dimensione della matrice è 100 e non superiore a quello e non c'è necessità di convalida dell'input. Il programma continuare a chiedere per l'input fino a quando si incontra 0 e troppo otterrà aggiunto alla matrice.
Ho capito tutto tranne che come tenere traccia, che è la più grande e più piccolo valore. Sarei grato se qualcuno può risolvere il mio codice o mostrare problema me.Another sto avendo è sempre il ciclo di interrompere e fare / min max di calcolo all'interno del ciclo while quando l'ingresso è uguale a 0.
/*
============================================================================
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: Ho preso tutti fuori i vostri suggerimenti e modificato il mio codice. Questo è il mio codice qui sotto. Tuttavia, il suo output è neanche quello che mi aspetto.
#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);
}
Questa è l'uscita, mi sto! qualcuno può risolvere questo per me.
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
EDIT FINALE: Ho risolto questo per conto mio. Ho messo il min / max verifica al di fuori del ciclo WHILE maestro, questo ha permesso l'ingresso di 0 da inserire nella matrice.
#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);
}
Soluzione
Prima di tutto, si sta assegnando input
per il valore di ritorno di scanf()
. Questo è il numero di elementi assegnati dalla chiamata, e dal momento che si dice l'ingresso sarà sempre corretta, questo valore sarà sempre 1
.
In secondo luogo, si sta scrivendo oltre la fine della matrice numbers[]
con la linea:
input = scanf("%d", &numbers[100]);
(si dovrebbe fare scanf("%d, &input)
invece, e numbers[i]
assegnare per inserire nel vostro ciclo.
Infine, non è necessario ricalcolare maxvalue
e minvalue
scorrendo numbers[]
ogni iterazione del loop. Invece, basta confrontarle con input
e assegnarli conseguenza.
Speriamo che questo ti mette sulla strada giusta.
Altri suggerimenti
Sembra che il problema centrale è che si confrontano ogni numero solo contro minvalue
. Questo va bene per decidere se sostituire il minvalue
corrente, ma ovviamente non ti dice nulla circa la relazione di ogni elemento a maxvalue
.
Un altro problema: ha senso per inizializzare minvalue dal primo elemento, ma non se lo si fa nel ciclo. Quella appena invalida tutto il vostro lavoro prima.
È necessario fare lo stesso con l'inizializzazione maxvalue pure. Si dovrebbe inizializzare quel numero per il primo valore.
Si dovrebbe anche prendere una decisione circa il calcolo del minimo e massimo, come si accumulano i dati o in un passaggio attraverso i dati quando fatto. Quello che non si vuole fare, tuttavia, è un ciclo tra gli elementi del passato con ogni nuovo uno. Che dà il vostro programma quadratica tempo la complessità per nessun beneficio.
Infine, non tollerano scadente formattazione. Debug sempre coinvolge studiare il codice e si vuole che essere sempre perfettamente formattati sia per essere professionale circa le cose e anche per facilitare la lettura il proprio lavoro.
ti stai chiedendo due domande, circa la strategia per il min / max di calcolo e per il loop. Non farlo (a se stessi), ma risolvere un problema alla volta. Quindi, prima mettere qualcosa come
signed int input[] = { 8, -5 , /* some more values */ };
size_t const n = sizeof input/ sizeof input[0];
all'inizio e dimenticare i problemi scanf
.
Quindi avvolgere la min rilevamento / max nell'istruzione ciclo appropriata.
Poi compilare il codice con avvisi su:. Es -Wall
per gcc
, ma questo potrebbe variare per il compilatore
La mia l'mi dice qualcosa:
Test-numbers.c: 21: avvertimento: 'maxvalue' può essere utilizzato non inizializzati in questo funzione di test-numbers.c: 22: avviso: 'Minvalue' può essere utilizzato non inizializzato in questa funzione
Questo ti dice che si sta facendo qualcosa di molto sbagliato nel non considerando il punto di partenza del vostro algoritmo bene.
ho reindented il codice e un sacco di esso sostituito con `/ * ... 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);
}
Speriamo che si può vedere cosa succede quando si immette 1, o 2, o 3 e quando si enetr 0.
Suggerimento:. I valori maxvalue
e minvalue
sono mai cambiato
Un altro suggerimento:? Quante volte la linea while()
eseguire
Modifica con l'esempio run
Per questo esempio di esecuzione, il codice è sul lato sinistro, ciò che accade è sul lato sinistro
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]);