[C] Conferma esercizio sequenza numeri

floppyes
Ciao a tutti!
Vorrei chiedervi se secondo voi ho svolto correttamente l'esercizio, oppure se si poteva fare in modo diverso:

Testo esercizio:
Si sviluppi un programma in linguaggio C che, ricevendo in ingresso una sequenza di
lunghezza arbitraria di almeno due numeri interi diversi da zero, terminata da uno zero,
produca in uscita i due valori massimi letti in ingresso (escluso l’ultimo zero).
Ad esempio, ricevendo in ingresso la sequenza 7 2 19 4 45 3 7 9 3 -5 0
produce in uscita 45 19


Codice che ho scritto:
#include <stdio.h>
#include <stdlib.h>
int main ()
{
    int val, i, size=0, temp, j;
    int *vett=NULL;
    printf("Inserisci numeri nel vettore, digita 0 per terminare.\n");
    
    ciclo:
    do
    {
        printf("\tInserisci il %d numero: ", size+1);
        scanf("%d", &val);
        if (val==0 && size<2)
        {
            goto ciclo;
        }
        else
        {
            size++;
            vett=(int*)realloc(vett,(size)*(sizeof(int)));
            vett[size-1]=val;
        }
     } while (val!=0);
    
    
    
    for (i=1;i<size;i++)
    {
        for (j=0;j<i;j++)
        {
            if (vett[i]<vett[j])
            {
                temp=vett[i];
                vett[i]=vett[j];
                vett[j]=temp;
            }
        }
    }
    
    printf("\nEcco il vettore:");
    for (i=0;i<size;i++){
    printf("%3d", vett[i]);}
    
    printf("\nDue numeri maggiori:\n\t%d e %d", vett[size-2], vett[size-1]);
    
    
    return 0;
}


Ho utilizzato l'istruzione goto per soddisfare la richiesta: almeno due numeri interi diversi da zero

Grazie mille in anticipo
Ciaoo :-)

Risposte
Summerwind78
Ciao
il programma che hai scritto di per se funziona, mi piace l'idea di usare un'allocazione dinamica della memoria per i vari numeri
l'unico consiglio che mi sentirei di darti è quello di evitare quanto più possibile i "goto". Sono una pratica obsoleta e decisamente pericolosa.
mi sono permesso di fare qualche modifica al tuo programma, dimmi se ti piace
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
int main ()
{
int val, i, size=0, temp, j;
int *vett=NULL;
printf("Inserisci numeri nel vettore, digita 0 per terminare.\n");
unsigned char bExit = FALSE;
do
{
printf("\tInserisci il %d numero: ", size+1);
scanf("%d", &val);
if (val==0 && size>=2){
bExit = TRUE;
}
else
{
if (val==0)
printf("\tInserisci almeno 2 valori diversi 0 prima di terminare\n");
else{
size++;
vett=(int*)realloc(vett,(size)*(sizeof(int)));
vett[size-1]=val;
}
}
} while (bExit == FALSE);
for (i=1;i<size;i++)
{
for (j=0;j<i;j++)
{
if (vett[i]<vett[j])
{
temp=vett[i];
vett[i]=vett[j];
vett[j]=temp;
}
}
}
printf("\nEcco il vettore:");
for (i=0;i<size;i++){
printf("%3d", vett[i]);}
printf("\nDue numeri maggiori:\n\t%d e %d", vett[size-2], vett[size-1]);
return 0;
}

floppyes
Ciao!

Si mi piace molto di più il tuo codice :D in effetti non avevo pensato al do con abbinato l'else! Ora si che è perfetto, il goto non mi entusiasmava, però non mi venivano in mente altre alternative :D

Grazie ancora!
Ciaoo :)

Summerwind78
beh in pratica si tratta solo di una variabile che dice se puoi uscire o meno dal ciclo "do"


il fatto di usare il goto è un metodo che si usava negli anni ottanta quando si programmava in basic

all'epoca era una metodo abbastanza comune ma è caduto in disuso perchè usandolo fai dei "salti" da una parte all'altra del codice in modo poco facilmente controllabile, diventa difficile soprattutto gestire lo stato delle variabili quando il programma diventa corposo. E pensa che pasticcio se si incomincia a saltare usando i goto mentre magari si è all'interno di funzioni o cose simili...

Fino a quando fai programmini in C ANSI in teoria andrebbero ancora bene, ma quando scriverai programmi "event driven" tipo in VB.NET o simili, l'uso del goto darebbe origine al caos :D

floppyes
Grazie mille per la spiegazione :)

In effetti anche in tanti altri esercizi non ho mai trovato un goto, giusto nel capitoletto riservato all'argomento :D

Cercherò allora altre soluzioni :D

Grazie
Ciaoo!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.