Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C] Problema con doppia condizione

    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);
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,316
    Codice PHP:
    #include <stdio.h>
    #include <string.h>

    int mainvoid )
    {
        
    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>)
            {
                
    printf("%s %s Anzianità: %d Stipendio: %d"NMCGANST);
                
                if ( 
    ST>MAX )
                {
                    
    MAX=ST;
                    
    strcpy(NOMENM);
                }
            }
        }
        
        
    printf("\nIl dipendente che ha superato gli anni di anzianità stabiliti ed ha lo stipendio più alto è %s",NOME);


  3. #3
    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.
    Ultima modifica di The_Mustang_24; 26-08-2017 a 21:53

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,316
    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.

  5. #5
    Non potevo chiedere di meglio! Grazie mille!

  6. #6
    Quote Originariamente inviata da zacca94 Visualizza il messaggio
    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
    codice:
    void f();
    e sotto la chiamo con
    codice:
    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:
    codice:
    void f(void) {
        ...
    }
    (su una piattaforma con calling convention a callee-cleanup probabilmente questo scasserà lo stack).

    Se invece il prototipo fosse stato
    codice:
    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 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).
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,316
    yep chiedo scusa, ho fatto confusione, ottime correzioni

  8. #8
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    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
    codice:
    void f();
    e sotto la chiamo con
    codice:
    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:
    codice:
    void f(void) {
        ...
    }
    (su una piattaforma con calling convention a callee-cleanup probabilmente questo scasserà lo stack).

    Se invece il prototipo fosse stato
    codice:
    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 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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.