Problema con l'esecuzione di un programma

di il
13 risposte

Problema con l'esecuzione di un programma

Ho bisogno di capire perché non funziona questo codice, si tratta di un programmino che gestisce una segreteria di studenti e l'utente può inserire,cancellare,cercare ecc..uno studente. nella funzione ricerca però quando vado a inserire questa riga di codice "*ps=cerca(matricola, n);" mi da un bel po di errori e non capisco perché.potreste aiutarmi?
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define MAX 30



typedef struct {
   char nome[MAX];
   char cognome[MAX];
   int matricola;
   int voto;   } studente;


studente studenti[230];

int main ()
{
    system("color A1");
    int posizione=0, i, k, e;
    int scelta=stampa_menu();

    
    do{
    switch(scelta){
        case 0:
            posizione= aggiungi_studente(posizione);
            system("cls");
            scelta=stampa_menu();
            break;
        case 1:
            
            system("cls");
            scelta=stampa_menu();
            break;
        case 2:
            visualizza_tutto(posizione);
            system("pause");
            system("cls");
            scelta=stampa_menu();
            break;
        case 3:
            system("cls");
            scelta=stampa_menu();
            break;


    }   
    }while (scelta!=5);

    
    system("pause");
    return 0; 
    

}
////////////////////////////////////////////////////////////////////////////////
void visualizza(studente *pt, int posizione) {

    printf("\n---------------\n");
    printf("Cognome: %s\n", pt->cognome);
    printf("Nome: %s\n", pt->nome);
    printf("Numero matricola: %d\n", pt->matricola);
    printf("---------------\n");

}
////////////////////////////////////////////////////////////////////////////////
int visualizza_tutto(int pos){
    int i=0;
    studente *ps= &studenti[0];
    
    for(i=0; i<pos;i++)
        visualizza(ps++, pos);         
}    
////////////////////////////////////////////////////////////////////////////////
int aggiungi_studente(int posizione){
    
    printf("\n\t\tINSERIMENTO STUDENTE.\n\n");
    printf("Inserisci il cognome dello studente: "); scanf("%s",studenti[posizione].cognome);
    printf("Inserisci il nome dello studente: "); scanf("%s",studenti[posizione].nome);
    printf("Inserisci il numero della matricola: "); scanf("%d", &studenti[posizione].matricola);
    posizione++;
    return(posizione);
    
}   
////////////////////////////////////////////////////////////////////////////////
void ricerca(n) {

   int i, matricola;
   studente *ps;

   printf("\n\t\tRICERCA DELLO STUDENTE.\n\n");
   printf("Inserisci il numero della matricola da ricercare: ");
   scanf("%d", &matricola);
   
   
   *ps=cerca(matricola, n);
   
   //if(ps==NULL) 
      //printf("Lo studente non e' presente in archivio.\n"); 

   //visualizza(ps, posizione);

}
////////////////////////////////////////////////////////////////////////////////
studente *cerca(int mat, int posizione) {
   int i;
   
   for(i=0; i<posizione; i++) 
       if(studenti[i].matricola==mat) 
        return(&studenti[i]); 
        else 
        return(NULL);   
}
////////////////////////////////////////////////////////////////////////////////
int stampa_menu(void)
{
    char voci[6][50] = {
            "0 Aggiungi studente.",
            "1 Cancella studente.",
            "2 Visualizza tutti gli studenti.",
            "3 Ricerca studente.",
            "4 Studenti che non hanno sostenuto esami.",
            "5 Exit."
        };
    int scelta, numVoci;
    numVoci = 6;
    
    scelta = menu("usa le frecce per selezionare una voce, premi invio per confermare", voci, numVoci);
    return scelta;
}    
int menu(char *titolo, char voci[6][50], int numVoci) {
    int i;
    int pos = 0;
    char ch;
    int scelta = -1;
    do {
        system("cls");
        printf("%s\n", titolo);
        for (i = 0; i < numVoci; i++) {
            if (pos == i) {
                printf("->"); 
            }
            else {
                printf("  ");     
            }
            printf(" %s", voci[i]);
            printf("\n");
        }
  
        ch = getch();
        if (ch < 0) {
            ch = getch();
            switch(ch) {
                case 80:
                    pos = (pos + 1) % numVoci;
                    break;
                case 72:
                    pos--;
                    if (pos < 0) {
                        pos = numVoci - 1;
                    }
                    break;    
            }
        }
        else {
            if (ch == 13)  {
                scelta = pos;
            }
        }
    }
    while (scelta < 0);
    return scelta;
}

13 Risposte

  • Re: Problema con l'esecuzione di un programma

    La funzione cerca restituisce un puntatore quindi deve essere semplicemente

    ps=cerca(matricola, n);
  • Re: Problema con l'esecuzione di un programma

    Si, avevo già provato ma non funziona nemmenocosì
  • Re: Problema con l'esecuzione di un programma

    Strano che non funzioni se segui le indicazioni di Oregon. Non è che "tocchi" qualcos'altro?
  • Re: Problema con l'esecuzione di un programma

    
    for(i=0; i<posizione; i++)
           if(studenti[i].matricola==mat)
            return(&studenti[i]);
            else
            return(NULL);   
    
  • Re: Problema con l'esecuzione di un programma

    Esistono *altri* problemi in compilazione ma quello che hai indicato va risolto come ti ho detto.

    Quando identifichi degli errori in compilazione, elencali e comincia ad affrontarli e risolvere uno dopo l'altro. Non ha senso risolvere il primo e dire "continua a non funzionare" perché il problema successivo è diverso dal precedente.

    Ad esempio, hai scritto

    void ricerca(n)

    ma dovrebbe essere

    void ricerca(int n)

    e poi hai indicato che la funzione

    int visualizza_tutto(int pos)

    restituisce un intero ma non lo restituisci affatto ...

    e così via.
  • Re: Problema con l'esecuzione di un programma

    Credo di aver risolto. praticamente mi è bastato spostare e dichiarare alcune funzioni diversamente da come avevo fatto.
  • Re: Problema con l'esecuzione di un programma

    L'unica cosa che non mi funziona adesso è la funzione cancella_studente... mi compila e mi lancia il programma ma arrivato all'istruzione "ps=cerca(matricola,posizione);" mi si blocca tutto. la cosa strana è che uso la stessa istruzione nella funzione ricerca ma non mi da nessun problema. qualche soluzione?
    void cancella_studente(int posizione)
    {
        studente *ps;
        int matricola;
        puts("digitare il numero della matricola dacancellare");
        scanf("%d", matricola);
        ps=cerca(matricola,posizione);
    }
  • Re: Problema con l'esecuzione di un programma

    Qual è il codice adesso?

    Si blocca tutto che vuol dire? Hai errori?

    Se si blocca quando chiami la funzione cerca, probabilmente il problema sarà in quella funzione. Hia fatto un po' di debugging?
  • Re: Problema con l'esecuzione di un programma

    Il codice è questo
    #include <stdio.h>
    #include <stdlib.h>
    #include<string.h>
    #define MAX 30
    
    
    typedef struct {
       char nome[MAX];
       char cognome[MAX];
       int matricola;
       int voto;   } studente;
    
    
    studente studenti[230];
    
    studente *cerca(int mat, int posizione);
    void ricerca(int n);
    void cancella_studente(int posizione);
    
    int main ()
    {
        system("color A1");
        int posizione=0, i, k, e;
        int scelta=stampa_menu();
    
        
        do{
        switch(scelta){
            case 0:
                posizione= aggiungi_studente(posizione);
                system("cls");
                scelta=stampa_menu();
                break;
            case 1:
                cancella_studente(posizione);
                system("cls");
                scelta=stampa_menu();
                break;
            case 2:
                visualizza_tutto(posizione);
                system("pause");
                system("cls");
                scelta=stampa_menu();
                break;
            case 3:
                ricerca(posizione);
                system("pause");
                system("cls");
                scelta=stampa_menu();
                break;
            case 4:
                system("cls");
                scelta=stampa_menu();
                break;
    
    
        }   
        }while (scelta!=5);
    
        
        system("pause");
        return 0; 
        
    
    }
    ////////////////////////////////////////////////////////////////////////////////
    void visualizza(studente *pt, int posizione) {
    
        printf("\n---------------\n");
        printf("Cognome: %s\n", pt->cognome);
        printf("Nome: %s\n", pt->nome);
        printf("Numero matricola: %d\n", pt->matricola);
        printf("---------------\n");
    
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    studente *cerca(int mat, int posizione) {
       int i;
       for(i=0; i<posizione; i++){
            
            if(studenti[i].matricola == mat) 
            return(&studenti[i]); 
       }
       return(NULL);
               
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    int visualizza_tutto(int pos){
        int i=0;
        studente *ps= &studenti[0];
        
        for(i=0; i<pos;i++)
            visualizza(ps++, pos);         
    }    
    ////////////////////////////////////////////////////////////////////////////////
    int aggiungi_studente(int posizione){
        
        printf("\n\t\tINSERIMENTO STUDENTE.\n\n");
        printf("Inserisci il cognome dello studente: "); scanf("%s",studenti[posizione].cognome);
        printf("Inserisci il nome dello studente: "); scanf("%s",studenti[posizione].nome);
        printf("Inserisci il numero della matricola: "); scanf("%d", &studenti[posizione].matricola);
        posizione++;
        system("cls");
        puts("\t\tStudente inserito correttamente.\n\n");
        system("pause");
        return(posizione);
        
    }   
    ////////////////////////////////////////////////////////////////////////////////
    void ricerca(n) {
    
       int i, matricola;
       studente *ps;
    
       printf("\n\t\tRICERCA DELLO STUDENTE.\n\n");
       printf("Inserisci il numero della matricola da ricercare: ");
       scanf("%d", &matricola);
       
       
       ps=cerca(matricola, n);
       
       if(ps == NULL) 
          printf("Lo studente non e' presente in archivio.\n"); 
       else
       visualizza(ps, n);
    
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    int stampa_menu(void)
    {
        char voci[6][50] = {
                "0 Aggiungi studente.",
                "1 Cancella studente.",
                "2 Visualizza tutti gli studenti.",
                "3 Ricerca studente.",
                "4 Studenti che non hanno sostenuto esami.",
                "5 Exit."
            };
        int scelta, numVoci;
        numVoci = 6;
        
        scelta = menu("usa le frecce per selezionare una voce, premi invio per confermare", voci, numVoci);
        return scelta;
    }    
    ////////////////////////////////////////////////////////////////////////////////
    void cancella_studente(int posizione)
    {
        studente *ps;
        int matricola;
        puts("digitare il numero della matricola dacancellare");
        scanf("%d", matricola);
        ps=cerca(matricola,posizione);
        
        /*if(s){
            system("cls");
        
        
            printf("\n\t\tVUOI ELIMINARE QUESTO STUDENTE?  (DIGITARE S/N).\n\n");
            printf("Cognome: %s\n", s->cognome);
            printf("Nome: %s\n", s->nome);
            printf("Numero matricola: %d\n", s->matricola);
            printf("\t\t-------------------------------------------------\n");
    
        
            int i;
            for(i=0; i<posizione; i++)
            {
                if(&studenti[i]==s)
                puts("preso");
            } 
               
        }    */
        
    
    }    
    ////////////////////////////////////////////////////////////////////////////////
    int menu(char *titolo, char voci[6][50], int numVoci) {
        int i;
        int pos = 0;
        char ch;
        int scelta = -1;
        do {
            system("cls");
            printf("%s\n", titolo);
            for (i = 0; i < numVoci; i++) {
                if (pos == i) {
                    printf("->"); 
                }
                else {
                    printf("  ");     
                }
                printf(" %s", voci[i]);
                printf("\n");
            }
      
            ch = getch();
            if (ch < 0) {
                ch = getch();
                switch(ch) {
                    case 80:
                        pos = (pos + 1) % numVoci;
                        break;
                    case 72:
                        pos--;
                        if (pos < 0) {
                            pos = numVoci - 1;
                        }
                        break;    
                }
            }
            else {
                if (ch == 13)  {
                    scelta = pos;
                }
            }
        }
        while (scelta < 0);
        return scelta;
    }
  • Re: Problema con l'esecuzione di un programma

    E no, non mi da nessun errore,il programma funziona fino a che non uso la funzione cancella, dove eseguendo quella riga di codice mi impalla il programma. XD
  • Re: Problema con l'esecuzione di un programma

    Qui

    scanf("%d", matricola);

    c'è un errore ... magari non è l'unico.
  • Re: Problema con l'esecuzione di un programma

    Ok, vedo se mi viene con una modifica.
  • Re: Problema con l'esecuzione di un programma

    Funziona tutto adesso. problema risolto, grazie ^^!
Devi accedere o registrarti per scrivere nel forum
13 risposte