PDA

Visualizza la versione completa : [C] Problema con doppia condizione


The_Mustang_24
26-08-2017, 18:20
Il programma funziona bene, ma non riesce a stamparmi correttamente il nome di chi ha superato gli anni di anzianità ed ha lo stipendio più alto. Qualsiasi aiuto, suggerimento è ben accetto.

Supponendo di avere in input i dati relativi a N dipendenti di un'azienda: nome, cognome, anzianità, stipendio, scrivi un programma che stampi i dati relativi agli impiegati che hanno superato una determinata anzianità e tra questi stampa il nome del dipendente che ha lo stipendio più alto.

#include <stdio.h>
int N=0,X=0,AN=0,ST=0,MAX=0,CONT;
char NM[16],CG[16];
char *NOME;
main()
{
printf("Inserisci il numero di dipendenti: ");
scanf("%d",&N);
printf("Stabilisci gli anni di anzianità: ");
scanf("%d",&X);
for(CONT=0;CONT<N;CONT++)
{
printf("\nInserisci il nome del dipendente: ");
scanf("%s",&NM);
printf("Inserisci il cognome del dipendente: ");
scanf("%s",&CG);
printf("Inserisci l'anzianità del dipendente: ");
scanf("%d",&AN);
printf("Inserisci lo stipendio del dipendente: ");
scanf("%d",&ST);
if (AN>X) printf("%s %s Anzianità: %d Stipendio: %d",&NM,&CG,&AN,&ST);
if ((ST>MAX) && (AN>X)) MAX=(ST), NOME=(NM);
}
printf("\nIl dipendente che ha superato gli anni di anzianità stabiliti ed ha lo stipendio più alto è %s",NOME);
}

zacca94
26-08-2017, 19:08
#include <stdio.h>
#include <string.h>

int main( void )
{
int N=0,X=0,AN=0,ST=0,MAX=0,CONT;
char NM[16],CG[16];
char NOME[16];

printf("Inserisci il numero di dipendenti: ");
scanf("%d",&N);
printf("Stabilisci gli anni di anzianità: ");
scanf("%d",&X);

for(CONT=0;CONT<N;CONT++)
{
printf("\nInserisci il nome del dipendente: ");
scanf("%s",NM);
printf("Inserisci il cognome del dipendente: ");
scanf("%s",CG);
printf("Inserisci l'anzianità del dipendente: ");
scanf("%d",&AN);
printf("Inserisci lo stipendio del dipendente: ");
scanf("%d",&ST);

if ( AN>X )
{
printf("%s %s Anzianità: %d Stipendio: %d", NM, CG, AN, ST);

if ( ST>MAX )
{
MAX=ST;
strcpy(NOME, NM);
}
}
}

printf("\nIl dipendente che ha superato gli anni di anzianità stabiliti ed ha lo stipendio più alto è %s",NOME);
}

The_Mustang_24
26-08-2017, 21:36
Beh che dire, grazie mille! Se potessi darmi qualche consiglio, te ne sarei grato, ad esempio volevo sapere...
int main( void )
Void!?
printf("Inserisci il cognome del dipendente: ");
scanf("%s",CG);
printf("Inserisci l'anzianità del dipendente: ");
scanf("%d",&AN);
Perché in uno si usa & e nell altro no?
printf("%s %s Anzianità: %d Stipendio: %d", NM, CG, AN, ST);
Qui ad esempio si poteva anche mettere &AN, &ST ??
strcpy(NOME, NM);
Strcpy come e quando si usa?

Un ultima cosa se non sei troppo impegnato.. char *NOME; io avevo scritto così perché ho visto su un sito, sai dirmi qualcosa a riguardo?

Scusa per le troppe domande ma a scuola ci insegnano davvero poco!
Ovviamente anche il link di qualche guida ben fatta mi va più che bene.

zacca94
27-08-2017, 00:17
int main( void )

è consuetudine scrivere void se non ci sono parametri, come lo è scrivere return 1; se il programma termina su sistemi *nix e linux per segnalare che il programma è terminato con successo (su windows non so cosa segnala ma dovrebbe essere scritto comunque).

printf("Inserisci il cognome del dipendente: ");
scanf("%s",CG);
printf("Inserisci l'anzianità del dipendente: ");
scanf("%d",&AN);


perchè una stringa non è altro che un puntatore a differenti caratteri, cosa che non un intero: questa parte deve essere studiata per essere compresa.

printf("%s %s Anzianità: %d Stipendio: %d", NM, CG, AN, ST);

No.
Se mettevi & davanti alle variabili stampavi il valore dei puntatori (con il relativo %p).

strcpy(NOME, NM);

Copia semplicemente il contenuto di una stringa in un'altra stringa. Non puoi assegnare NOME = NM, non otterresti quello che vuoi.

char *NOME

Studia i puntatori... così ti togli tutti i dubbi.

The_Mustang_24
27-08-2017, 00:29
Non potevo chiedere di meglio! Grazie mille!

MItaly
27-08-2017, 15:06
int main( void )

è consuetudine scrivere void se non ci sono parametri, come lo è scrivere return 1; se il programma termina su sistemi *nix e linux per segnalare che il programma è terminato con successo (su windows non so cosa segnala ma dovrebbe essere scritto comunque).

Non è esattamente così... scrivere void se non ci sono parametri è semplicemente una consuetudine in C++ (e una consuetudine non vista di buon occhio, tra l'altro, visto che è inutile) e in C se si parla di definizioni di funzioni, mentre in C è necessaria nelle dichiarazioni per distinguere le funzioni che non hanno parametri (f(void)) da quelle per cui non sono stati specificati i parametri (f()). In sostanza, se dichiaro una funzione come


void f();

e sotto la chiamo con


f(5.2);

il compilatore non batterà ciglio, dato che void f() dichiara una funzione di cui non sono specificati i parametri. Nota che questo genererà undefined behavior se poi al momento della definizione della funzione salterà fuori che f ha dei parametri non corrispondenti a quelli che le sono stati passati, ad esempio:


void f(void) {
...
}

(su una piattaforma con calling convention a callee-cleanup probabilmente questo scasserà lo stack).

Se invece il prototipo fosse stato


void f(void);

la chiamata f(5.2) avrebbe generato un errore di compilazione.

La questione in generale è abbastanza ingarbugliata e ha a che fare con il C pre-standardizzazione e la relativa sintassi per la dichiarazione delle funzioni, rimando a qui (https://stackoverflow.com/a/36292431/214671) per una trattazione completa.

Nota comunque che in questo caso specifico questa distinzione non è importante, dato che qui si sta parlando della definizione del main (non della dichiarazione), dove f() e f(void) sono sostanzialmente equivalenti.

---

Sul return code: è esattamente il contrario di come hai detto. La convenzione più o meno universale (non è limitata solo a Linux) per i tool da riga di comando è che restituiscono 0 se tutto va bene, un numero differente in caso contrario. Nota che c'è una "regola magica" valida solo per il main per cui, se il main non restituisce niente, è come se restituisse zero (regola che consiglio di dimenticare, dato che è valida solo per il main ed è comunque buona pratica restituire esplicitamente sempre l'exit code).

zacca94
27-08-2017, 17:05
yep chiedo scusa, ho fatto confusione, ottime correzioni

The_Mustang_24
27-08-2017, 17:55
Non è esattamente così... scrivere void se non ci sono parametri è semplicemente una consuetudine in C++ (e una consuetudine non vista di buon occhio, tra l'altro, visto che è inutile) e in C se si parla di definizioni di funzioni, mentre in C è necessaria nelle dichiarazioni per distinguere le funzioni che non hanno parametri (f(void)) da quelle per cui non sono stati specificati i parametri (f()). In sostanza, se dichiaro una funzione come


void f();

e sotto la chiamo con


f(5.2);

il compilatore non batterà ciglio, dato che void f() dichiara una funzione di cui non sono specificati i parametri. Nota che questo genererà undefined behavior se poi al momento della definizione della funzione salterà fuori che f ha dei parametri non corrispondenti a quelli che le sono stati passati, ad esempio:


void f(void) {
...
}

(su una piattaforma con calling convention a callee-cleanup probabilmente questo scasserà lo stack).

Se invece il prototipo fosse stato


void f(void);

la chiamata f(5.2) avrebbe generato un errore di compilazione.

La questione in generale è abbastanza ingarbugliata e ha a che fare con il C pre-standardizzazione e la relativa sintassi per la dichiarazione delle funzioni, rimando a qui (https://stackoverflow.com/a/36292431/214671) per una trattazione completa.

Nota comunque che in questo caso specifico questa distinzione non è importante, dato che qui si sta parlando della definizione del main (non della dichiarazione), dove f() e f(void) sono sostanzialmente equivalenti.

---

Sul return code: è esattamente il contrario di come hai detto. La convenzione più o meno universale (non è limitata solo a Linux) per i tool da riga di comando è che restituiscono 0 se tutto va bene, un numero differente in caso contrario. Nota che c'è una "regola magica" valida solo per il main per cui, se il main non restituisce niente, è come se restituisse zero (regola che consiglio di dimenticare, dato che è valida solo per il main ed è comunque buona pratica restituire esplicitamente sempre l'exit code).
Grazie mille, essendo all'inizio è meglio imparare fin da subito quel che è corretto, altrimenti potrei risentirne più in la.

Loading