PROBLEMA Non stampa

Francesco C.

Utente Attivo
264
40
CPU
Intel Celeron
HDD
SSD 256 GB
RAM
4GB di ram
Monitor
Integrato nel PC
Net
FTTC Vodafone 200mb
OS
Windows 10 Home 64bit
Salve a tutti, stavo facendo qualche esercizio con i record e gli array di record (le struct) per prepararmi al compito di informatica.
Il programma che ho pensato è questo:
Il programma deve sapere per 10 studenti il nome e il cognome e 5 voti. Il programma deve calcolare la media e mostrare a schermo il nome e cognome di quelli che hanno raggiunto o superato la sufficienza.

Funziona senza problemi fino alla somma dei numeri poi, arrivati all'if che controlla se il numero è maggiore di 6 lo salta e si blocca. Come posso risolvere?

Premetto che sto all'inizio delle struct, infatti ho anche altre domande:

- Per valorizzare una variabile nella struct (usando gli array di record) come devo fare ? Se scrivo nomestruct.variabile=0; mi da errore, stessa cosa se scrivo =0 alla varabile direttamente nella struct.
- Come mai non posso valorizzare una variabile direttamente nella struct, se lo faccio mi da errore ?

--------------------
Vi inserisco il codice del programma che non funzione:

C:
#include <stdio.h>
typedef struct
{
    char nome[20];
    char cognome[20];
    int voto[5];
    float media, somma;
} test;

int main()
{
    test A[10];
        int i, j;
        
  test.media=0;
 
        for(i=0; i<10; i++) 
            {
                printf("Nome e cognome: \n");
                scanf("%s", A[i].nome);
                scanf("%s", A[i].cognome);
                
                    for(j=0; j<5; j++)
                        {
                            printf("Inserisci voto %d/5 =  ", j);
                            scanf("%d", &A[i].voto[j]);
                            A[i].somma = A[i].somma + A[i].voto[j];
                            
                            printf("media =  %f \n\n", A[i].media);
                        }
            }
            
            for(i=0; i<10; i++)
                {
                     A[i].media  =   A[i].somma / 5;
        
                                if(A[i].media > 6)
                                    {
                                        printf("%s %s SUFFICIENZA RAGGIUNTA con la media del %f \n \n", A[i].nome, A[i].cognome, A[i].media);
                                    }
                            
                        
                }

    return 0;
}

per chi non riuscisse a leggere e/o vuole provare a far girare il programma, cliccando qui si può vedere il codice su onlinegdb

Grazie a tutti quelli che mi aiuteranno.
Buona giornata
 

Albo89

Utente Èlite
5,904
2,465
CPU
Ryzen 5700G
Dissipatore
Deep Cool castle 360 rgb v2
Scheda Madre
Rog Strix B550-F GAMING (WI-FI)
HDD
980 1TB
RAM
Ballistix 3600mhz 8Gbx2
GPU
1080 Ti Aorus xtreme
PSU
Corsair RM750x
- Per valorizzare una variabile nella struct (usando gli array di record) come devo fare ? Se scrivo nomestruct.variabile=0; mi da errore, stessa cosa se scrivo =0 alla varabile direttamente nella struct.
- Come mai non posso valorizzare una variabile direttamente nella struct, se lo faccio mi da errore ?

ti riferisci all'istruzione "test.media=0;" vero? test è solo un tipo (sarebbe come fare "int = 0;", non puoi assegnarci valori; devi ciclare tutte e 10 le "test" presenti nell'array A e per ognuna fare A.media = 0;
 

Francesco C.

Utente Attivo
264
40
CPU
Intel Celeron
HDD
SSD 256 GB
RAM
4GB di ram
Monitor
Integrato nel PC
Net
FTTC Vodafone 200mb
OS
Windows 10 Home 64bit
ti riferisci all'istruzione "test.media=0;" vero? test è solo un tipo (sarebbe come fare "int = 0;", non puoi assegnarci valori; devi ciclare tutte e 10 le "test" presenti nell'array A e per ognuna fare A.media = 0;
Ciao e grazie. Però quando faccio gli struct normali (senza usare typedef) scrivendo nomestruct.variabile=0; non mi segnala nessun errore.

Per quanto riguarda il programma, come posso risolvere il problema che non stampa il nome e cognome dopo l'if?

Grazie
 

bigendian

Utente Attivo
749
432
OS
Linux
1) typedef, capire cosa sia e decidere se usarlo o meno, le cose non vanno usate per forza o a pappagallo, se no si chiama cargo-cult programming. Per questo esercizio non serve a nulla, toglilo e parti con una semplice struttura.
2) per il resto piu o meno funziona, con minimi cambiamenti:

Codice:
#include <stdio.h>

struct elemento {
    char nome[20];
    char cognome[20];
    int voto[5];
    float media, somma;
};

int main()
{
    struct elemento e[10] = {0};
    int i, j;

    for (i = 0; i < 1; i++) {
        printf("Nome e cognome: \n");
        scanf("%s", e[i].nome);
        scanf("%s", e[i].cognome);

        for (j = 0; j < 5; j++) {
            printf("Inserisci voto %d/5 =  ", j);
            scanf("%d", &e[i].voto[j]);
            e[i].somma = e[i].somma + e[i].voto[j];
        }
    }

    for (i = 0; i < 1; i++) {
        e[i].media = e[i].somma / 5;

        if (e[i].media > 6) {
            printf("%s %s SUFFICIENZA RAGGIUNTA con la media del "
                "%f\n\n",
                e[i].nome, e[i].cognome, e[i].media);
        }
    }

    return 0;
}

Nome e cognome:
pippo pippolo
Inserisci voto 0/5 = 5
Inserisci voto 1/5 = 6
Inserisci voto 2/5 = 9
Inserisci voto 3/5 = 11
Inserisci voto 4/5 = 12
pippo pippolo SUFFICIENZA RAGGIUNTA con la media del 8.600000
 

Andretti60

Utente Èlite
6,440
5,091
1) typedef, capire cosa sia e decidere se usarlo o meno, le cose non vanno usate per forza o a pappagallo, se no si chiama cargo-cult programming. Per questo esercizio non serve a nulla, toglilo e parti con una semplice struttura.
Su questo non sono in accordo, il typedef in C viene usato per ridefinire il tipo dei dati con un altro nome, permettendo una scrittura più compatta e facilitando la lettura, una tecnica molto comune che prende il nome di Syntactic Sugar.
Semmai il problema in questo caso è la nomenclatura (scrissi una Guida a riguardo in questo forum che si può trovare nella lista in rilievo), usare il nome ‘test’ è una scelta poco adeguata (come la tua ‘struct elemento’) perché dice ben poco di cosa ci sia dentro, per esempio io avrei usato ‘DatiStudente’.
 
  • Mi piace
Reazioni: toni1705

bigendian

Utente Attivo
749
432
OS
Linux
Ciao Andretti,

e' l'esatto opposto, ovvero, si compattezza ma leggibilita' pegigore.

Strettamente vietato in molti progetti, come nel kernel linux. Cito dal kernel codingstyle:

"Maybe there are other cases too, but the rule should basically be to NEVER EVER use a typedef unless you can clearly match one of those rules." Regole che sono casi eccezzionali.

Oltre al fatto che i typedef rendono il codice poco comprensibile e spesso sono usati in maniera errata:

Codice:
struct pippo p;

Sai benissimo cosa sia p, leggedo questo codice.

Codice:
vps_t p;
Questo comincia a complicare la lettura. Magari e' un puntatore, a cosa ?.

Molte persone pensano i typedef aiutino la lettura, non e' cosi. In grossi progetti C dove vengono usati a dismisura complicano non poco la vita.

Sono invece utili per:
- oggetti totalmente opachi, utili sono in determinate situaizoni
- altri casi specifici, come tipi di interi piu chiari, etc

io resto dell'idea che le cose si usano se si capipscono e se servono. Non per atteggiarsi a super programmatori, ne perche' il professore te lo dice. Sconsiglio di usarli in ogni caso a chi e' all'inizio, magari usi il typedef ma non hai capico cosa sia neanche la struttura o un puntatore ad essa.
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
@bigendian per favore leggiti la mia guida sulla scelta della terminologia, in quanto l’esempio da te fatto (vps_t) è uno di quelli che io consiglio di evitare come la peste.

Lo sviluppo del kernel di Linux prevede molte regole (le ho lette in passato), proibire il typedef è solo una delle tante, ma il fatto che lo proibisca non vuole dire che l’uso sia sbagliato. Ogni organizzazione/azienda ha le sue regole da usare per scrivere il codice, nella mia carriera ne ho dovuto seguire diverse, ma servono solo per “normalizzare” il codice in modo che tutti possono aprire un documento e capirlo senza doversi sbattere. In passato ho lavorato su un prodotto scritto solo in C, potevamo usare typedef ma con molte regole su come dovevano essere definite (certamente NON vps_t) e non avevamo problemi alcuni, anzi.

Parlo quindi per esperienza personale (trentennale, e non per imporre la mia superiorità, non mi considero superiore a nessuno). Uno studente deve imparare TUTTO il possibile e anche di più, solo così si può fare una conoscenza e decidere poi il suo stile di programmazione, tenendo poi presente che dovrà poi adeguarsi alle regole quando e se dovrà poi lavorare in una organizzazione.

Comunque rispetto la tua idea se non vuoi usare il typedef. Come ogni cosa, come dici tu, non va abusato.
 

bigendian

Utente Attivo
749
432
OS
Linux
@bigendian per favore leggiti la mia guida sulla scelta della terminologia, in quanto l’esempio da te fatto (vps_t) è uno di quelli che io consiglio di evitare come la peste.

mah. come esperienza siamo vicini, programmo da quando avevo 18 anni, quindi, 32. Oltre 20 in C. E da circa 10 anni contribuisco al kenrel con 49 patch accettate in mainline, tra cui vari driver completi, sd card, dma, rtc, 1 wire eeprom etc. Giusto cosi per conoscerci, anche a me le gare non interessano, mi basta divertirmi, e imparare ogni giorno se c'e' bisogno.

Rispetto la tua opinione Andretti. Resto dell'idea che typedef e' generalmente offuscante, poi ognuno e' libero in casa sua di fare cio che vuole, e usare ogni funzionalita' che un linguaggio offre.

Qui vedo tuttavia molti che chiedono gli esercizietti per casa, e l'unica cosa che gli interessa e' che funzioni e darlo al prof. :) Quindi, a tutto costoro probabilmente del typedef non importa un fico secco :)
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili