Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182

    [C++] verifiche e manipolazioni in un array bidimensionale

    ho fatto questo esercizio:

    La figura seguente mostra un esempio di tabellone per un torneo in cui sono coinvolte 4 squadre:
    codice:
    	S1	S2	S3	S4
    S1	-	2	0	1
    S2	1	-	2	2
    S3	1	1	-	2
    S4	0	0	1	-
    Secondo il tabellone, quando la squadra s1 ha giocato in casa, ha vinto contro s4, pareggiato contro s3 e perso contro s2. Nelle partite in cui la squadra s4 ha giocato fuori casa, ha perso contro s1 e vinto contro s2 ed s3. Sulla diagonale principale sono presenti dei trattini ad indicare che non è previsto che una squadra giochi contro se stessa.
    Quindi, 1 se la squadra in casa(righe) ha vinto, 2 se ha perso e 0 se ha pareggiato.

    Si vuole la squadra con il maggior numero di vittorie in casa* (nell’esempio precedente, è la squadra s3 che ha due vittorie in casa).
    Ecco il mio codice:
    codice:
    #include <iostream>
    using namespace std;
    
    void piuvittorieincasa(char tabellone[][], int dim, int vittorie[]);
    int verifica(int vittorie[], int dim);
    
    
    int main(){
        const int dim=5;
    char tabellone[dim][dim]={{'-','2','0','1'},
                              {'1','-','2','2'},
                              {'1','-','2','2'},
                              {'0','0','1','-'}}; 
    int vittorie[dim]={0};    
        
        
        
    system("pause");
    return 0;
    }
    
    
    void piuvittorieincasa(char tabellone[][], int dim, int vittorie[]){
         for(int i=0; i<dim; i++){
                 for(int j=0; j<dim; j++){
                         if(tabellone[i][j]=='1')
                         ++vittorie[i];
                         verifica(vittorie, dim);
                         }
                 }
    }
    
    
    int verifica(int vittorie[], int dim){
     int pos=1;
         for(int i=0; i<dim; i++){
                 if(vittorie[i]>max){
                 max=vittorie[i];   
                 pos=i;
                 }
         }
    }
    cosa c'è che non va? Il programma non mi compila e penso ci sia qualche problema sull'array bidimensionale..magari devo immaginare una diversa struttura? Ho scelto di fare una matrice di char per mettere anche il trattino! Altrimenti avrei fatto una matrice di interi..

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    1) Cosa è max?

    2) Perché passi dim a tutte le funzioni se è una costante?

    3) Per un array bidimensionale come parametro devi indicare almeno l'ultima dimensione

    char tabellone[][dim]

    4) la funzione verifica è dichiarata di tipo int, ma non restituisce alcun valore


    Se vedi l'elenco degli errori, e li affronti uno per volta, riesci a risolvere ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Infatti c'erano una marea di errori, a partire da variabili non dichiarate fino ad arrivare a funzioni inutili.
    Ho "corretto" in questo modo. Sul pc mio funziona e ti restituisce il numero della riga della squadra che ha effettuato più vittorie. Cerca di migliorarlo inserendo il nome della squadra e, soprattutto stampando più di una squadra se ci sono due di esse che hanno effettuato uguale numero di vittorie.

    codice:
    #include <iostream>
    using namespace std;
    
    int piuvittorieincasa(char tabellone[][5], int dim){
        int vittorie=0;
        int max=0;
        int squadra;
        for(int i=0; i<dim; i++){
                for(int j=0; j<dim; j++){ 
    		    if(tabellone[i][j]=='1'){
    			vittorie++;
                        }
    	    }
    	    if(vittorie>max){
    	    squadra=i+1; //ho inserito un '+1' in quanto il conteggio della variabile i parte da 0.
    	    max=vittorie;
    	    }
    	    vittorie=0;
         }
         return(squadra);
    }
    
    
    int main(){
            const int dim=5;
    	char tabellone[dim][dim]={{'-','2','0','1'},
    					      {'1','-','2','2'},
    					      {'0','-','1','2'},
    					      {'0','1','1','-'}}; 
    
    	printf("%d \n", piuvittorieincasa(tabellone, dim));
    	
    	system("pause");
    	return 0;
    }
    Ho potuto far restituire un intero alla funzione in quanto prendo il numero della riga della squadra che ha effettuato più vittorie in casa e lo stampo. Se ci fosse il nome o un carattere avrei dovuto dichiarare la funzione CHAR così come anche la variabile 'squadra' e stampare la variabile con %c e non %d.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    Originariamente inviato da Longo8
    Infatti c'erano una marea di errori, a partire da variabili non dichiarate fino ad arrivare a funzioni inutili.
    Ho "corretto" in questo modo. Sul pc mio funziona e ti restituisce il numero della riga della squadra che ha effettuato più vittorie. Cerca di migliorarlo inserendo il nome della squadra e, soprattutto stampando più di una squadra se ci sono due di esse che hanno effettuato uguale numero di vittorie.

    codice:
    #include <iostream>
    using namespace std;
    
    int piuvittorieincasa(char tabellone[][5], int dim){
        int vittorie=0;
        int max=0;
        int squadra;
        for(int i=0; i<dim; i++){
                for(int j=0; j<dim; j++){ 
    		    if(tabellone[i][j]=='1'){
    			vittorie++;
                        }
    	    }
    	    if(vittorie>max){
    	    squadra=i+1; //ho inserito un '+1' in quanto il conteggio della variabile i parte da 0.
    	    max=vittorie;
    	    }
    	    vittorie=0;
         }
         return(squadra);
    }
    
    
    int main(){
            const int dim=5;
    	char tabellone[dim][dim]={{'-','2','0','1'},
    					      {'1','-','2','2'},
    					      {'0','-','1','2'},
    					      {'0','1','1','-'}}; 
    
    	printf("%d \n", piuvittorieincasa(tabellone, dim));
    	
    	system("pause");
    	return 0;
    }
    Ho potuto far restituire un intero alla funzione in quanto prendo il numero della riga della squadra che ha effettuato più vittorie in casa e lo stampo. Se ci fosse il nome o un carattere avrei dovuto dichiarare la funzione CHAR così come anche la variabile 'squadra' e stampare la variabile con %c e non %d.
    tutti errori da distrazione! Ecco questo è il mio problema in programmazione. Mi sembra ci fossero solo errori di sintassi/dichiarazioni,no?
    Domani provo a rifarla! Tu hai messo tutto in un unica funzione

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ma in programmazione quelli non sono errori meno gravi ... bisogna essere molto attenti mentre si scrive il codice.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    Originariamente inviato da Longo8
    Infatti c'erano una marea di errori, a partire da variabili non dichiarate fino ad arrivare a funzioni inutili.
    Ho "corretto" in questo modo. Sul pc mio funziona e ti restituisce il numero della riga della squadra che ha effettuato più vittorie. Cerca di migliorarlo inserendo il nome della squadra e, soprattutto stampando più di una squadra se ci sono due di esse che hanno effettuato uguale numero di vittorie.

    codice:
    #include <iostream>
    using namespace std;
    
    int piuvittorieincasa(char tabellone[][5], int dim){
        int vittorie=0;
        int max=0;
        int squadra;
        for(int i=0; i<dim; i++){
                for(int j=0; j<dim; j++){ 
    		    if(tabellone[i][j]=='1'){
    			vittorie++;
                        }
    	    }
    	    if(vittorie>max){
    	    squadra=i+1; //ho inserito un '+1' in quanto il conteggio della variabile i parte da 0.
    	    max=vittorie;
    	    }
    	    vittorie=0;
         }
         return(squadra);
    }
    
    
    int main(){
            const int dim=5;
    	char tabellone[dim][dim]={{'-','2','0','1'},
    					      {'1','-','2','2'},
    					      {'0','-','1','2'},
    					      {'0','1','1','-'}}; 
    
    	printf("%d \n", piuvittorieincasa(tabellone, dim));
    	
    	system("pause");
    	return 0;
    }
    Ho potuto far restituire un intero alla funzione in quanto prendo il numero della riga della squadra che ha effettuato più vittorie in casa e lo stampo. Se ci fosse il nome o un carattere avrei dovuto dichiarare la funzione CHAR così come anche la variabile 'squadra' e stampare la variabile con %c e non %d.
    non ho capito perchè mi da errore se passo la dimensione della colonna con il nome della variabile cosi:
    codice:
    char matrice (matrice[][dim], int dim)
    e invece se metto il valore va bene..

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    Ho revisionato il programma. Forse è uno spreco usare la funzione verifica?! Andava meglio facendo tutto in un unica funzione?
    ora dice anche il nome della squadra...ma solo perchè sono tutte s1,s2...sn !
    Se fossero stati tipo: Inter, juve, roma, milan?

    codice:
    #include <iostream>
    using namespace std;
    
    void piuvittorieincasa(char tabellone[][5], int dim, int vittorie[]);
    int verifica(int vittorie[], int dim);
    
    
    int main(){        
        const int dim=5;
    char tabellone[][dim]={{'-','2','0','1'},
                              {'1','-','2','2'},
                              {'1','1','-','2'},
                              {'0','0','1','-'}}; 
    int vittorie[dim]={0};    
        
       piuvittorieincasa(tabellone,dim,vittorie);
        
    system("pause");
    return 0;
    }
    
    
    void piuvittorieincasa(char tabellone[][5], int dim, int vittorie[]){
         for(int i=0; i<dim; i++){
                 for(int j=0; j<dim; j++){
                         if(tabellone[i][j]=='1'){
                         ++vittorie[i];
                         }                     
                 }
    }
    cout<<"la squadra con piu vittorie in casa e': s"<<verifica(vittorie, dim)<<endl;
    }
    
    int verifica(int vittorie[], int dim){
     int pos=0, max=0;
         for(int i=0; i<dim; i++){
                 if(vittorie[i]>max){
                 max=vittorie[i];   
                 pos=i+1;
                 }
         }
     return pos;
    }

  8. #8
    hai inserito di nuovo la funzione VERIFICA??
    vabbè, comunque per farti restituire il nome dovresti dichiarare la funzione char e fare un RETURN del vettore in cui il nome è salvato. Oppure con un puntatore che indirizzi al nome della squadra in questione.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    Originariamente inviato da Longo8
    hai inserito di nuovo la funzione VERIFICA??
    vabbè, comunque per farti restituire il nome dovresti dichiarare la funzione char e fare un RETURN del vettore in cui il nome è salvato. Oppure con un puntatore che indirizzi al nome della squadra in questione.
    si ho modificato la mia versione prestando piu attenzione quindi ho lasciato verifica. Tanto non è sbagliato no?
    Per restituire il nome della squadra quindi avrei potuto mettere un array di char corrispondente al vettore vittorie allora!
    Comunque ripeto:
    quando dichiaro un array bidimensionale perchè non mi fa inserire il nome della variabile ma solo il valore? Ad esempio non mi fa fare così:
    codice:
    int matrice(char prova[ ] [ dim],int dim)
    ma cosi:
    codice:
    int matrice(char prova[ ] [ 5 ],int dim)
    con dim=5;

  10. #10
    Se la variabile dim è una costante puoi farlo. Altrimenti devi inserire per forza un numero. Infatti non so se hai notato che prima l'ho usato, ma prima era una costante.

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.