Benvenuto su Inforge
Rimuovi la pubblicità e partecipa alla più grande comunità italiana sul mondo digitale presente sul web sin dal 2007.
Iscriviti

Discussione Ufficiale Programmiamo con Inforge | Esercitazione 01 in C | Livello base

Una Discussione Ufficiale punta a raccogliere tutte le informazioni su un argomento o un fatto di attualità, con costanti aggiornamenti da parte del creatore e dei partecipanti.

Kode

Utente Emerald
10 Dicembre 2013
1,336
334
393
@Kode il malloc.h non sono sicuro del perché l'ho messo, forse pensavo che per usare il malloc servisse la libreria o.ò
La funzione del minore dovrei averla sistemata, o almeno in un file nuovo funziona (e mi sembra di aver capito che il return funziona solo con numeri interi, e i float li arrotonda, quindi tocca per forza fare una stampa?)
C++:
void array_min_index(float arr_1[],int dim)
{
float min=arr_1[0];

    for(int i=1;i<dim;i++)
    {
        if(arr_1[i]<arr_1[0] && arr_1[i]<min)
            {
                min=arr_1[i];           
            }
    }
    printf("\nMin=%f",min);
    //return min;
}

Scelta l'ho messa per fare in modo che si potessero richiamare le funzioni tutte le volte che si vuole fino a che non si "chiude il menu", senza star a eseguire di continuo.
Probabilmente va in loop per il default, così su due piedi: ho cercato velocemente un modo per controllare che l'input rientrasse nel range richiesto da me(da 0 a x ovvero il numero di funzioni da mettere dentro lo switch, e ora che ci penso avrei potuto anche mettere un controllo per evitare lettere, caratteri speciali etc.) e consigliavano di farlo in una funzione, così da richiamarla nel default per "resettarla" ma immagino che vada fatto in un certo modo.
Al momento non conosco altri metodi per resettare uno switch.
Ci siamo quasi, hai sistemato il punto di partenza, ossia hai assegnato per default che il minimo fosse il primo elemento. Ora basta vedere solamente se un elemento i-esimo è minore del minimo corrente, se lo è lo assegni a min altrimenti vai avanti. Per quanto riguarda il ciclo conta che facendo cosi dovresti andare in overflow. Perché? Perché gli indici di un array con n elementi va da 0 a n-1, quindi quando legge arr_1[n] vai fuori dall'area di memoria dell'array instanziato.

Per quanto riguarda lo statement nella clausola if il fatto che dovresti controllare ogni valore dell'array con l'elemento della prima cella può essere evitato.Perchè? Perché a te interessa solamente il confronto con il valore minimo corrente salvato all'interno della variabile min. Per quanto riguarda la stampa puoi benissimo metterla fuori e porre il valore di ritorno a float dato che è un float e fuori ti prelevi il valore come se fosse un float quindi puoi benissimo spostare quella stampa anche fuori.

In sintesi:
C:
// da void a float
float array_min_index(float arr_1[],int dim)
{
float min=arr_1[0];

    for(int i=1;i<dim-1;i++) // da 1 a dim-1, non facciamo il controllo a 0 dato che min = arr_1[0]
    {
        if( arr_1[i]<min) // il confronto solo con il valore min corrente
            {
                min=arr_1[i];           // nel caso sia minore quello letto dall'array, sarà il nuovo minimo
            }
    }
    // printf("\nMin=%f",min); lo possiamo fare fuori
    return min;
}

// [...]

//public void scelta([...]){

// dentro il case di array_min_index...

float x = array_min_index(arr_1, dim);
printf("\nMin=%f\n", min);
break;
 
  • Love
Reactions: Not an engineer

Sax3r28

Utente Gold
8 Aprile 2016
589
293
218
Ci siamo quasi, hai sistemato il punto di partenza, ossia hai assegnato per default che il minimo fosse il primo elemento. Ora basta vedere solamente se un elemento i-esimo è minore del minimo corrente, se lo è lo assegni a min altrimenti vai avanti. Per quanto riguarda il ciclo conta che facendo cosi dovresti andare in overflow. Perché? Perché gli indici di un array con n elementi va da 0 a n-1, quindi quando legge arr_1[n] vai fuori dall'area di memoria dell'array instanziato.
i<dim non va bene? Su {5,4,3,2,1} i[0] non lo controllo, quindi con un ciclo che va da [1] a [4] ovvero i<dim=5 non dovrebbe avere problemi, o no?
Per quanto riguarda lo statement nella clausola if il fatto che dovresti controllare ogni valore dell'array con l'elemento della prima cella può essere evitato.Perchè? Perché a te interessa solamente il confronto con il valore minimo corrente salvato all'interno della variabile min. Per quanto riguarda la stampa puoi benissimo metterla fuori e porre il valore di ritorno a float dato che è un float e fuori ti prelevi il valore come se fosse un float quindi puoi benissimo spostare quella stampa anche fuori.

In sintesi:
C:
// da void a float
float array_min_index(float arr_1[],int dim)
{
float min=arr_1[0];

    for(int i=1;i<dim-1;i++) // da 1 a dim-1, non facciamo il controllo a 0 dato che min = arr_1[0]
    {
        if( arr_1[i]<min) // il confronto solo con il valore min corrente
            {
                min=arr_1[i];           // nel caso sia minore quello letto dall'array, sarà il nuovo minimo
            }
    }
    // printf("\nMin=%f",min); lo possiamo fare fuori
    return min;
}

// [...]

//public void scelta([...]){

// dentro il case di array_min_index...

float x = array_min_index(arr_1, dim);
printf("\nMin=%f\n", min);
break;
Sul doppio controllo ho realizzato adesso che è inutile, non so cos'avevo in testa quando l'ho messo ahahah
Il return però l'ho messo commentato perché arrotondava i decimali, quindi mettendo 1.1 restituiva sempre 1, 0.9 dava 0 etc.
C'è un modo per fare in modo che non accada? O all'eventuale variabile che richiama la funzione arriva lo stesso il valore corretto?
 

Kode

Utente Emerald
10 Dicembre 2013
1,336
334
393
i<dim non va bene? Su {5,4,3,2,1} i[0] non lo controllo, quindi con un ciclo che va da [1] a [4] ovvero i<dim=5 non dovrebbe avere problemi, o no?

Sul doppio controllo ho realizzato adesso che è inutile, non so cos'avevo in testa quando l'ho messo ahahah
Il return però l'ho messo commentato perché arrotondava i decimali, quindi mettendo 1.1 restituiva sempre 1, 0.9 dava 0 etc.
C'è un modo per fare in modo che non accada? O all'eventuale variabile che richiama la funzione arriva lo stesso il valore corretto?

Se ad un float assegni un altro float non dovrebbero esserci arrotondamenti dato che il numero è sempre a singola precisione.
 
Supporta Inforge con una donazione
Lv.105 - Middleschool - International SV

Sax3r28

Utente Gold
8 Aprile 2016
589
293
218
Se ad un float assegni un altro float non dovrebbero esserci arrotondamenti dato che il numero è sempre a singola precisione.
return int1.png

return int 2.png
return int3.png
 

Sax3r28

Utente Gold
8 Aprile 2016
589
293
218
Il mio 'problema' è che se metto float con decimali diversi da 0, quelli vengono arrotondati per difetto. Quindi se ho un 5.2 e un 5.1, il return dà 5 e non 5.1
Si può cambiare o mi devo accontentare di stamparlo?
 
Lv.105 - Middleschool - International SV
Supporta Inforge con una donazione

DispatchCode

Moderatore
24 Maggio 2016
380
245
193
Il mio 'problema' è che se metto float con decimali diversi da 0, quelli vengono arrotondati per difetto. Quindi se ho un 5.2 e un 5.1, il return dà 5 e non 5.1
Si può cambiare o mi devo accontentare di stamparlo?

Forse ho capito che intendi guardando i tuoi screen li sopra. Tu il valore devi comunque stamparlo formattato (con %f), e non farlo "tornare" dal main().
Il valore di ritorno del main serve solo per capire se il processo termina andando a buon fine oppure no (e il tipo di ritorno del main infatti è un intero).

Quindi tu dovresti aggiungere il printf con la stampa a video nella funzione main().
 
  • Mi piace
Reactions: Kode e Sax3r28
Lv.105 - Middleschool - International SV
Supporta Inforge con una donazione

InfinityStudio

Utente Electrum
19 Marzo 2020
426
57
115
Ultima modifica:
Proviamo ad imparare esercitandosi.

#Aggiornamento 1 gli esercizi sono belli tosti, essendo all'inizio mi manca proprio la parte del pensiero che porta alla soluzione, ma esercitandomi e risolvendo gli errori sto apprenendo quindi è stra utile.
 
Supporta Inforge con una donazione
Lv.105 - Middleschool - International SV
Supporta Inforge con una donazione
Lv.105 - Middleschool - International SV