max e min in c

Pubblicità

-THOR-

Utente Attivo
Messaggi
91
Reazioni
9
Punteggio
28
Premetto che ho da poco iniziato a studiare questo linguaggio.
questo è il mio codice:
Codice:
    main(){
    int N, n;
    printf("inserisci N:");
    scanf("%d",&N);
    for(N=N; N>0 || N<0; N=N-1){
                         printf("inserisci un numero intero:");
                         scanf("%d",&n);
return 0;
}
Ora vorrei che il programma trovasse il numero più basso e quello più alto da me inseriti, però dato che la variabile è una sola:n, non so come fare.:help:
Grazie in anticipo.:)
 
aspetta ti sto scrivendo il codice con dei commenti di fianco cosi ti esplicito tutti i miei passaggi e se hai dei dubbi puoi chiedermi
 
#include stdio.h

int main() {

int n, m;
int min = 100000, int max = -100000;

printf("Quanti numeri vuoi inserire? ")
scanf("%d", &m);
for(int i = 0; i < m; i++) {
printf("Inserire numero: ");
scanf("%d", &n);
if (n > max) max = n;
else if (n < min) min = n;
}
printf("Il minimo è %d e il massimo è %d", min, max);
return 0;
}

Ci saranno certamente errori... :lol:
 
Ultima modifica da un moderatore:
Ma la 'i' non l'hai dichiarata nelle variabili:nunu:
è un errore o è proprio così?
Comunque no non l'ho ancora studiato il do-while, devo prima studiarlo per risolvere il mio problema?
 
Ma la 'i' non l'hai dichiarata nelle variabili:nunu:
è un errore o è proprio così?
Comunque no non l'ho ancora studiato il do-while, devo prima studiarlo per risolvere il mio problema?

Devi per forza studiare un costrutto d'iterazione tipo il for, il while, do while ecc...

In questo caso ti consiglio un for perchè comunque devi scorrere tutto il vettore per trovare il minimo fino alla fine del vettore.

Codice:
int main()
{
 
int max, min, i, dim; /* i per l'iterazione e dim è il numero di elementi che verranno inseriti da parte dell'utente.*/
int vett[30];
printf("Quanti elementi vuoi inserire(max 30 elem)?: \n");
scanf("%d", &dim);
 
for(i = 0; i < dim; i++)
{
       printf("Inserisci l'elemento %d:\n", i);
       scanf("%d", &vett[i]);
}
 
min = vett[0];
for(i = 1; i < dim; i++)
{
       if(vett[i] <  min)
         min = vett[i];
}
 
max = vett[0];
for(i = 1; i < dim; i++)
{
        if(vett[i] > max)
         max= vett[i];
}
 
printf("Il minimo è: %d", min);
printf("Il massimo è: %d", max);
return 0;
}

Il codice può essere ulteriormente ottimizzato ma giusto per farti capire come funziona ho fatto così.
Spero ti sia chiaro :)(non l'ho testato ma non dovrebbe avere errori).
 
Visto che il problema richiede di trovare solo massimo e minimo, mi sembra inutile (e inefficiente) mantenere tutti i numeri in memoria... una soluzione che richiede spazio costante di memoria, indipendentemente dal numero di input, è la seguente:

Codice:
#include <stdlib.h>
#include <stdio.h>

int main() {
  int max, min, i, n, input;

  printf("Quanti elementi vuoi inserire? ");
  scanf("%d", &n);
 
  for(i = 0; i < n; i++) {
    printf("Inserisci l'elemento %d: ", i);
    scanf("%d", &input);
    if(i == 0)
      max = min = input;
    else {
      if(input > max)
        max = input;
      else if(input < min)
        min = input;
    }
  }

  printf("Il minimo è: %d\nIl massimo è: %d", min, max);

  return 0;
}

max e min, ad ogni esecuzione del ciclo for, contengono il massimo e il minimo elemento inseriti fino a quel momento (questa proprietà si chiama invariante del ciclo); se i è uguale a zero, allora sia a max che a min viene assegnato il valore letto in input (che è l'unico letto fino a quel momento, appunto), altrimenti l'input viene confrontato con max e min ed eventualmente li modifica.
In questo modo non devi inizializzare il valore di max e min, come proposto nell'implementazione di 8Ball, che ti porta a scrivere codice che non è sempre corretto: se inserissi, infatti, solo numeri inferiori a -100000, in quel caso, ti viene stampato che il numero massimo è -100000, sebbene tu non l'abbia mai inserito :)
 
Visto che il problema richiede di trovare solo massimo e minimo, mi sembra inutile (e inefficiente) mantenere tutti i numeri in memoria... una soluzione che richiede spazio costante di memoria, indipendentemente dal numero di input, è la seguente:

Codice:
#include <stdlib.h>
#include <stdio.h>
 
int main() {
  int max, min, i, n, input;
 
  printf("Quanti elementi vuoi inserire? ");
  scanf("%d", &n);
 
  for(i = 0; i < n; i++) {
    printf("Inserisci l'elemento %d: ", i);
    scanf("%d", &input);
    if(i == 0)
      max = min = input;
    else {
      if(input > max)
        max = input;
      else if(input < min)
        min = input;
    }
  }
 
  printf("Il minimo è: %d\nIl massimo è: %d", min, max);
 
  return 0;
}

max e min, ad ogni esecuzione del ciclo for, contengono il massimo e il minimo elemento inseriti fino a quel momento (questa proprietà si chiama invariante del ciclo); se i è uguale a zero, allora sia a max che a min viene assegnato il valore letto in input (che è l'unico letto fino a quel momento, appunto), altrimenti l'input viene confrontato con max e min ed eventualmente li modifica.
In questo modo non devi inizializzare il valore di max e min, come proposto nell'implementazione di 8Ball, che ti porta a scrivere codice che non è sempre corretto: se inserissi, infatti, solo numeri inferiori a -100000, in quel caso, ti viene stampato che il numero massimo è -100000, sebbene tu non l'abbia mai inserito :)

Vabè, se vogliamo essere proprio pignoli si può evitare un ciclo del for e l'if con il controllo se i == 0 ad ogni ciclo.;) Basta inizializzare max e min fuori dal ciclo leggendo il primo valore richiedendolo all'utente e poi far iniziare il ciclo con i = 1 e quindi eliminando ogni volta il controllo dell' i==0. Ma qui penso parlare di efficienza sia un pò esagerato dato che siamo partiti che l'utente non sapeva cos'è un ciclo do-while... :cav: Comunque l'importante è che l'utente ha capito:D
 
Pubblicità
Pubblicità
Indietro
Top