Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [C] Problemino in un programma

    Ho un problema nel seguente programma:
    codice:
    #include <stdio.h>#include <stdlib.h>
    #include <string.h>
    #define MAX 20
    
    
    void eliminatejob(char job[0],int tempo[0],int esec[0]); 
    void visualmenu();
    void scelta(int *N);
    void gestione(int N,char job[0],int tempo[0],int esec[0],int j);
    void insjob(char job[0],int tempo[0],int esec[0],int j);
    void visualjob(char job[0],int tempo[0],int esec[0]);
    void execute(char job[0],int tempo[0],int esec[0]);
    void inizializzazione(char job[0]);
     
    
    
    int main(){
       char job[MAX];
       int tempo [MAX];
       int esec[MAX];
       int N;
       int j=0;
       
        inizializzazione(job);
        visualmenu();
        scelta(&N);
        while(N!=5){
        gestione(N,job,tempo,esec,j); 
        }
        
    
    
    
    
    
    
        
        system("PAUSE");
        return 0;
    }
    void inizializzazione(char job[0]){
         int i;
         for(i=0;i<MAX;i++)
         job[i]='x';
         
         return;
         }
    void visualmenu(){
         printf("\t\t\t\tSCHEDULAZIONE");
        printf("\n\n\tMENU: \n");
        printf("\n\t1:Inserisci job");
        printf("\n\t2:Esegui job");
        printf("\n\t3:Elimina job eseguiti");
        printf("\n\t4:Visualizza job presenti");
        printf("\n\t5:Exit");
    return;
    }
    void scelta(int *N){
    
    
        printf("\n\n\tScelta: ");
        scanf("%d",N);
        while((*N<1)||(*N>5)){
            printf("Errore");
            printf("Scelta: ");
            scanf("%d",*N);
        }
    
    
    return;
    }
    void gestione(int N,char job[0],int tempo[0],int esec[0],int j){
         switch(N){
         case 1: insjob(job,tempo,esec,j);         
                 break;
         case 2: execute(job,tempo,esec);
                break;
         case 3:eliminatejob(job,tempo,esec);              
                break;
         case 4: visualjob(job,tempo,esec);
                break;   
         }
         
         
         return;
         }
         
    void insjob(char job[0],int tempo[0],int esec[0],int j){
         if(j!=MAX){
           printf("\n\tInserisci nome: ");
           scanf("%s",&job[j]);
           printf("\n\tInserisci tempo di esecuzione: ");
           scanf("%d",&tempo[j]);
           esec[j]=0;
           j++;
         }else{
          printf("\n\t!! Memoria piena, impossibile inserire altri job !!");     
         }
         return;
         }
         
    void visualjob(char job[0],int tempo[0],int esec[0]){
         int i;
         printf("\n\tProgrammi in memoria - Tempo di esecuzione - Programmi eseguiti\n");
         for(i=0;(i<MAX);i++){
            if(job[i]!='x'){
            printf("\n\t %s - %d - %d\n",job[i],tempo[i],esec[i]);
            }
         }
         return;
    }
    void execute(char job[0],int tempo[0],int esec[0]){
         int minore,indice,i;
         indice = 0;
         minore = tempo[0];
         for(i=0;i<MAX;i++){
           if(job[i]!='x'){
           if(tempo[i]<minore){
             minore = tempo[i];
             indice = i;
             }
           }                                   
         }
         printf("Programma in esecuzione: %s",job[indice]);
         sleep(tempo[indice]);
         esec[indice] = 1;
         return;
         }
    
    
     void eliminatejob(char job[0],int tempo[0],int esec[0]){
         int i;
         for(i=0;i<MAX;i++){
           if(job[i] != 'x'){
             if(esec[i] = 1){
             job[i] = 'x';
             tempo[i] = 0;
             esec[i] = 0;
             }
           }                  
                            
         }
         printf("Programmi rimasti: ");
         for(i=0;(i<MAX);i++){
            if(job[i]!='x'){
            printf("\n\t %s - %d - %d\n",job[i],tempo[i],esec[i]);
            }
         
         }
         
         
         return;
         }
    In poche parole, quando inserisco 1, mi esce "Inserisci nome:" e "Inserisci tempo di esecuzione:" dopo aver inserito il tempo di esecuzione mi ri esce: "Inserisci nome:" e "Inserisci tempo di esecuzione:" e invece mi dovrebbe uscire il menu, come posso risolvere? E mi risulta provando questo codice che va in loop ma non riesco a trovare l'errore
    Ultima modifica di tommasoperilli; 10-05-2014 a 16:37

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    codice:
        inizializzazione(job);
        visualmenu();
        scelta(&N);
        while(N!=5){
            gestione(N,job,tempo,esec,j); 
        }
    Una volta inserito un valore in N, questo rimane, visto che non vi è nessuna nuova richiesta di valore per N .

    Potresti risolvere ripetendo la richiesta di un valore per N
    codice:
     
    
    inizializzazione(job);
     do {
        visualmenu();
        scelta(&N);
        gestione(N,job,tempo,esec,j); 
      }  while(N!=5);
    una volta inserito un valore richiama gestione ed esegue, poi ricomincia

    ALTRO PROBELMA

    codice:
    char job[MAX];       // è UN ARRAY DI CARATTERI NON PUOI INSERIRE UNA STRINGA PER INDICE
    scanf("%s",&job[j]); // DOVRESTRI USARE UN ARRAY BIDIMENSIONALE char job[MAX][20]
    Ultima modifica di MItaly; 13-05-2014 a 08:56 Motivo: Formattazione
    Tecnologia

  3. #3
    Okay ho modificato l'array char ma, riguardante il loop, posso inserire un fflush? perchè se io faccio il controllo in coda, se inserisco 5 al posto di uscire comunque entro nella gestione no?
    comunque ho modificato così:
    codice:
    inizializzazione(job);    visualmenu();
        scelta(&N);
        while(N!=5){
        gestione(N,job,tempo,esec,j); 
        scelta(&N);
        }
    Solo che quando vado a eseguire questa procedura:
    codice:
    void visualjob(char job[][20],int tempo[0],int esec[0]){     int i;
         printf("\n\tProgrammi in memoria - Tempo di esecuzione - Programmi eseguiti\n");
         for(i=0;(i<MAX);i++){
            if(job[i][0]!='x'){
            printf("\n\t %s - %d - %d\n",job[i],tempo[i],esec[i]);
            }
         }
         return;
    }
    Non mi escono tutti i job inseriti, ho fatto la prova inserendo solo 2 job e mi è visualizzato solo 1 ..
    Ultima modifica di tommasoperilli; 11-05-2014 a 12:33

  4. #4
    Mi correggo, mi esce solo l'ultimo job inserito .. come se la variabile j non si aggiornasse ogni volta
    Ultima modifica di tommasoperilli; 11-05-2014 a 13:55

  5. #5
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551
    Be , la variabile j , nella funzione insjob() è un parametro locale , una copia della variabile j del main , tu la incrementi , ma la variabile j del main rimane invariata , se vuoi modificarla devi passare un puntatore come hai fatto per la variabile N .

    Per il loop do while , il controllo sarebbe in coda , quindi inserendo 5 , richiami gestione che non ha nessun case 5 : quindi non farebbe niente , poi con la condizione del while uscirebbe senza fare niente ..
    Tecnologia

  6. #6
    Okay, ho modificato:
    codice:
    inizializzazione(job);    do{
        visualmenu();
        scelta(&N);
        gestione(N,job,tempo,esec,&j);
        }while(N!=5);
    mentre per il puntatore ho fatto così:
    codice:
    void gestione(int N,char job[][20],int tempo[0],int esec[0],int *j){     switch(N){
         case 1: insjob(job,tempo,esec,*j);         
                 break;
         case 2: execute(job,tempo,esec);
                break;
         case 3:eliminatejob(job,tempo,esec);              
                break;
         case 4: visualjob(job,tempo,esec);
                break;   
         }
         return;
         }
    
    void insjob(char job[][20],int tempo[0],int esec[0],int *j){
         if(*j!=MAX){
           printf("\n\tInserisci nome: ");
           scanf("%s",&job[j]);
           printf("\n\tInserisci tempo di esecuzione: ");
           scanf("%d",&tempo[j]);
           esec[*j]=0;
           *j++;
         }else{
          printf("\n\t!! Memoria piena, impossibile inserire altri job !!");     
         }
         return;
    Però comunque mi risulta qualche errore, come posso risolvere?
    Ultima modifica di tommasoperilli; 11-05-2014 a 15:47

  7. #7
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    codice:
    case1: insjob(job,tempo,esec,*j);
    Tu dereferenzi j *j , quindi gli passi il valore cioè zero , mentre devi passargli il puntatore j

    mentre nella funzione insjob dovrai usare sempre dereferenziato *j in tutti i casi , controlla bene
    e ripassa i puntatori ....
    Ultima modifica di torn24; 11-05-2014 a 15:55
    Tecnologia

  8. #8
    cosi?
    codice:
    void gestione(int N,char job[][20],int tempo[0],int esec[0],int *j){     switch(N){
         case 1: insjob(job,tempo,esec,&j);         
                 break;
         case 2: execute(job,tempo,esec);
                break;
         case 3:eliminatejob(job,tempo,esec);              
                break;
         case 4: visualjob(job,tempo,esec);
                break;   
         }
         
         
         return;
         }
         
    void insjob(char job[][20],int tempo[0],int esec[0],int *j){
         if(*j!=MAX){
           printf("\n\tInserisci nome: ");
           scanf("%s",&job[*j]);
           printf("\n\tInserisci tempo di esecuzione: ");
           scanf("%d",&tempo[*j]);
           esec[*j]=0;
           *j++;
         }else{
          printf("\n\t!! Memoria piena, impossibile inserire altri job !!");     
         }
         return;
         }
    non capisco mi esce sempre lo stesso problema .-.

  9. #9
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551
    case1: insjob(job,tempo,esec,&j);

    Puntatore = variabile che contiene l'indirizzo di memoria di un altra variabile
    int *j;
    *j= oggetto puntato "il contenuto dell'indirizzo "
    j= indirizzo della variabile
    &j= indirizzo del puntatore
    ----------------------------------
    tu dovrai passare l'indirizzo della variabile j del main .

    case1: insjob(job,tempo,esec,j);


    Il resto va bene , non fare modifiche a caso .
    Tecnologia

  10. #10
    quindi così?
    codice:
    void gestione(int N,char job[][20],int tempo[0],int esec[0],int *j){     switch(N){
         case 1: insjob(job,tempo,esec,j);         
                 break;
         case 2: execute(job,tempo,esec);
                break;
         case 3:eliminatejob(job,tempo,esec);              
                break;
         case 4: visualjob(job,tempo,esec);
                break;   
         }
         
         
         return;
         }
         
    void insjob(char job[][20],int tempo[0],int esec[0],int *j){
         if(*j!=MAX){
           printf("\n\tInserisci nome: ");
           scanf("%s",&job[*j]);
           printf("\n\tInserisci tempo di esecuzione: ");
           scanf("%d",&tempo[*j]);
           esec[*j]=0;
           *j++;
         }else{
          printf("\n\t!! Memoria piena, impossibile inserire altri job !!");     
         }
         return;
         }
    avevo sbagliato solo nella chiama alla procedura?
    Ultima modifica di tommasoperilli; 11-05-2014 a 16:55

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.