Problema con codifica in C++
salve, sto preparando l' esame di informatica per ingegneria civile, ma svolgendo le vecchie tracce d' appello ho dei problemi con i RECORD. Ho questo esercizio: parametri : un vettore A di elementi di tipo T_STUDENTE (Matricola: numerico; Cognome:
vettore di 50 caratteri; Nome: vettore di 50 caratteri; AnnoNascita: di tipo numerico; Sesso:
di tipo carattere), la dimensione n del vettore A;
• valore di ritorno : nessuno;
• calcolo da eseguire : ricercare e visualizzare i dati dello studente di sesso maschile con
anno di nascita minore (in pratica il più grande come età).
Il mio problema è impostare la ricerca del sesso maschile. Grazie per il vostro aiuto
vettore di 50 caratteri; Nome: vettore di 50 caratteri; AnnoNascita: di tipo numerico; Sesso:
di tipo carattere), la dimensione n del vettore A;
• valore di ritorno : nessuno;
• calcolo da eseguire : ricercare e visualizzare i dati dello studente di sesso maschile con
anno di nascita minore (in pratica il più grande come età).
Il mio problema è impostare la ricerca del sesso maschile. Grazie per il vostro aiuto
Risposte
Probabilmente al campo "Sesso" viene assegnato 'm' per gli studenti e 'f' per le studentesse. Quindi devi controllare solo gli elementi con Sesso = 'm'.
Comunque non userei la parola "codifica", che ha di norma altri significati in programmazione (più o meno è sinonimo di "formato"). Meglio "esercizio", "problema", "programma"...
Comunque non userei la parola "codifica", che ha di norma altri significati in programmazione (più o meno è sinonimo di "formato"). Meglio "esercizio", "problema", "programma"...
ma se scrivo : A.sesso==m, mi dice che m è la prima volta che lo uso nella funzione. Io ho scritto così:
#include
#include
#define MAX_ELEMENTI 100
typedef struct
{
char cognome[50];
char nome[50];
char sesso[50];
int matricola;
int annonascita;
}STUDENTE;
int main()
{
int i,n,max;
STUDENTE A[MAX_ELEMENTI];
STUDENTE mas;
do
{
printf("Quanti Studenti Vuoi Inserire? ");
scanf("%d",&n);
}while(n<1 || n>100);
for (i=0;i
{
printf("Inserire matricola: ");
scanf("%d",&A.matricola);
printf("Inserire cognome: ");
fflush(stdin);
gets(A.cognome);
printf("Inserire nome: ");
gets(A.nome);
printf("Anno nascita: ");
scanf("%d",&A.annonascita);
fflush(stdin);
printf("Inserire sesso: ");
gets(A.sesso);
}
mas= A[0];
for(i=0;i
{
if( A.annonascita>mas.annonascita && A.sesso==m)
{
printf("%d %s %s %d %s",mas.matricola,mas.cognome,mas.nome,mas.annonascita,mas.sesso);
getch();
}
}
}
#include
#include
#define MAX_ELEMENTI 100
typedef struct
{
char cognome[50];
char nome[50];
char sesso[50];
int matricola;
int annonascita;
}STUDENTE;
int main()
{
int i,n,max;
STUDENTE A[MAX_ELEMENTI];
STUDENTE mas;
do
{
printf("Quanti Studenti Vuoi Inserire? ");
scanf("%d",&n);
}while(n<1 || n>100);
for (i=0;i
printf("Inserire matricola: ");
scanf("%d",&A.matricola);
printf("Inserire cognome: ");
fflush(stdin);
gets(A.cognome);
printf("Inserire nome: ");
gets(A.nome);
printf("Anno nascita: ");
scanf("%d",&A.annonascita);
fflush(stdin);
printf("Inserire sesso: ");
gets(A.sesso);
}
mas= A[0];
for(i=0;i
if( A.annonascita>mas.annonascita && A.sesso==m)
{
printf("%d %s %s %d %s",mas.matricola,mas.cognome,mas.nome,mas.annonascita,mas.sesso);
getch();
}
}
}
Racchiudilo tra apici singoli, è un carattere, non una variabile:
if (A[i].annonascita > mas.annonascita && A[i].sesso == 'm')
ho fatto ma non funziona

Nel testo del problema dice che "sesso" è un carattere, non un array di 50 caratteri.
Qualche altra considerazione:
- Questo è codice C, non C++.
- conio.h è un header non standard risalente al DOS. Non usarlo, esegui direttamente il programma dal prompt dei comandi, oppure usa "getchar" invece di "getch".
- fflush(stdin) è espressamente vietato dallo standard C (e C++). Puoi usare questo sostituto per "mangiare" i caratteri di newline non letti (preso da qua):
Qualche altra considerazione:
- Questo è codice C, non C++.
- conio.h è un header non standard risalente al DOS. Non usarlo, esegui direttamente il programma dal prompt dei comandi, oppure usa "getchar" invece di "getch".
- fflush(stdin) è espressamente vietato dallo standard C (e C++). Puoi usare questo sostituto per "mangiare" i caratteri di newline non letti (preso da qua):
while((c = getchar()) != '\n' && c != EOF) /* discard the character */;
Riguardo a fflush più che vietato, lo standard dice espressamente che lavora su uno stream di output e non di input. L'uso di fflush(stdin) è pertanto dipendente dal compilatore che stai usando. Il tuo programma è assolutamente non standard e molto antiquato. Non capisco come si possa insegnare il C++ in questo modo. Nel tuo codice di fatto avrei forse inserito uno fflush(stdout) più che con stdin...
Tieni conto che. come ha detto claudio, codifica viene generalmente tradotto in inglese come encoding . Il tuo titolo viene interpretato in modo molto diverso da quello che tu immagini. Usa un titolo meno generico la prossima volta.
Tieni conto che. come ha detto claudio, codifica viene generalmente tradotto in inglese come encoding . Il tuo titolo viene interpretato in modo molto diverso da quello che tu immagini. Usa un titolo meno generico la prossima volta.
"vict85":
Riguardo a fflush più che vietato, lo standard dice espressamente che lavora su uno stream di output e non di input. L'uso di fflush(stdin) è pertanto dipendente dal compilatore che stai usando.
In realtà è più complicato. Chiamare fflush() su uno stream di input come stdin ha comportamento indefinito (undefined behavior) secondo lo standard C. Questo significa che il compilatore è libero di generare codice qualsiasi. Potrebbe anche generare codice diverso ogni volta che chiami fflush(stdin). Potrebbe generare codice diverso ogni volta che compili.
Esistono situazioni che hanno un comportamento dipendente dal compilatore, ma quelle che risultano in comportamento indefinito vanno evitate sempre.
Si certo, ci sono casi in cui la dipendenza dal compilatore è più "definita", come le dimensioni delle variabili, dei buffer e queste cose così. Bisogna dire che immagino molti compilatori non facciano proprio nulla alla chiamata fflush(stdin), altrimenti non ci sarebbero tutti questi professori che lo insegnano. Al primo compilatore che ti blocca il programma a quella chiamata con un assert impareresti la lezione. Che poi non capisco perché a questo punto non si limitino ad un più innocuo fflush(NULL) che secondo lo standard dovrebbe fare fflush a tutti gli stream su cui è ben definito.
In ogni caso a me non è mai capitato di dover chiamare fflush tranne su Eclipse in cui se non lo fai prima di ogni scanf rischi di non vedere la richiesta di inserimento. E anche lì serviva solo se tu facevi partire il programma all'interno della console di Eclipse. Immagino che avesse più senso negli anni 90 oppure nei dispositivi embedded meno potenti.
In ogni caso a me non è mai capitato di dover chiamare fflush tranne su Eclipse in cui se non lo fai prima di ogni scanf rischi di non vedere la richiesta di inserimento. E anche lì serviva solo se tu facevi partire il programma all'interno della console di Eclipse. Immagino che avesse più senso negli anni 90 oppure nei dispositivi embedded meno potenti.