Calcolo combinazione vincente Totogol

di il
7 risposte

Calcolo combinazione vincente Totogol

Ciao a tutti, sono nuovo. Sto rispolverando le mie nozioni di programmazione e al contempo cercare di imparare Java (ai miei tempi a scuola si studiava ancora il Turbo Pascal, quindi per me Java è un mondo totalmente nuovo, così come la programmazione ad oggetti).

Come esercizio da fare mi sono auto-assegnato il compito di scrivere un programma che calcola la combinazione vincente del Totogol, ricevendo in input i gol delle 14 partite della schedina.
Per chi non lo sapesse, il calcolo della combinazione avviene in questo modo:

-fra le 14 partite si prendono, in rigoroso ordine decrescente, le 7 che hanno segnato il maggior numero di gol;
-a parità di numero di gol prevale quella in cui la squadra in trasferta ha segnato più gol;
-in caso di ulteriore parità prevale la partita in schedina col numero di posizione più basso.

Ad esempio queste sono le partite e i risultati dell'ultima schedina (fra parentesi la posizione nella combinazione vincente.. che quindi è 14 - 3 - 7 - 9 - 11 - 5 - 8):


1 Udinese - Napoli 1-2
2 Juventus - Pescara 3-0
3 Sampdoria - Sassuolo 3-2 (2°)
4 Atalanta - Roma 2-1
5 Bologna - Palermo 3-1 (6°)
6 Crotone - Torino 0-2
7 Empoli - Fiorentina 0-4 (3°)
8 Lazio - Genoa 3-1 (7°)
9 Milan - Inter 2-2 (4°)
10 Novara - Frosinone 1-2
11 Como - Cremonese 2-2 (5°)
12 Akragas - Messina 0-0
13 Cosenza - Monopoli 2-1
14 Juve Stabia - Lecce 2-3 (1°)


Ho quindi scritto un programma che, presi in input i numeri di gol di ogni squadra, mi dà la combinazione vincente. Però non capisco perché non funziona bene.. i 7 numeri della combinazione li ottengo giusti, ma la loro posizione è sbagliata! Qualcuno riesce a individuare l'errore? Questo è il codice:
import java.io.*;
import java.util.*;

public class Totogol {

	public static void main(String[] args) {
	final int numero_match = 14;
	int i,j,temp,temp2,temp3,temp4;
	int[] pos,golcasa,golfuori;
	int[] totalegol;
	golcasa=new int[numero_match];
	golfuori=new int[numero_match];
	totalegol=new int[numero_match];
	pos=new int[numero_match];
	Scanner leggi=new Scanner (System.in);
	for (i=0;i<numero_match;i++) {pos[i]=i+1;
						      System.out.println("Inserisci numero di gol della squadra di casa del "+(i+1)+"° incontro: ");
						      golcasa[i]=leggi.nextInt();
				                      System.out.println("Inserisci numero di gol della squadra in trasferta del "+(i+1)+"° incontro: ");
					              golfuori[i]=leggi.nextInt();
				                      leggi.nextLine();
	}
	
	for (i=0;i<numero_match;i++) totalegol[i]=(golcasa[i]+golfuori[i]);
	
	for (i=0;i<numero_match;i++) {for (j=i;j<numero_match-1;j++) {
								if (totalegol[i]<totalegol[j+1]) {temp=totalegol[i]; temp2=pos[i]; temp3=golcasa[i];
								temp4=golfuori[i]; pos[i]=pos[j+1]; golcasa[i]=golcasa[j+1]; golfuori[i]=golfuori[j+1];
								totalegol[i]=totalegol[j+1]; pos[j+1]=temp2; golcasa[j+1]=temp3; golfuori[j+1]=temp4;
								totalegol[j+1]=temp;}
								
								else if ((totalegol[i]==totalegol[j+1]) && (golfuori[i]<golfuori[j+1])) {temp2=pos[i]; temp3=golcasa[i]; temp4=golfuori[i]; pos[i]=pos[j+1]; golcasa[i]=golcasa[j+1]; golfuori[i]=golfuori[j+1]; pos[j+1]=temp2; golcasa[j+1]=temp3; golfuori[j+1]=temp4;}  //(CODICE NON FUNZIONANTE) 
												      }
						      }

System.out.print ("La combinazione vincente è: ");
	for (i=0;i<7;i++) System.out.print(pos[i]+" ");
		                                             }
		             }
In particolare, il codice che non mi funziona (o meglio funziona ma non come dovrebbe) è il secondo IF. Senza quel codice ottengo solo i 7 numeri della combinazione vincente senza che il programma effettui le opportune verifiche nel caso di parità di reti. Come mai non mi funziona? Grazie.

Andrea

7 Risposte

  • Re: Calcolo combinazione vincente Totogol

    Più tardi posso provare a dare un'occhiata al ciclo, ma visto che hai detto che vuoi imparare la programmazione ad oggetti, perché non usare proprio gli oggetti?

    Adesso hai un sacco di vettori, variabili temporanee, è tutto una gran confusione!

    Crea la tua classe Partita, salva all'interno le variabili di interesse (ad esempio gol_casa, gol_fuori_casa). Inserisci un metodo che restituisca il totale dei gol (basta una somma), etc.

    Questo ti permetterà di avere un codice più chiaro, e intanto comincerai a prendere confidenza con gli oggetti. Poi imparerai a usare funzionalità molto comode, ora è ancora presto ma, piccolo esempio : basterebbe implementare Comparable nella tua classe Partita per poter effettuare l'ordinamento in automatico con una sola linea di codice
  • Re: Calcolo combinazione vincente Totogol

    Ansharja ha scritto:


    perché non usare proprio gli oggetti?

    Adesso hai un sacco di vettori, variabili temporanee, è tutto una gran confusione!
    Assolutamente!
  • Re: Calcolo combinazione vincente Totogol

    Ansharja ha scritto:


    Più tardi posso provare a dare un'occhiata al ciclo, ma visto che hai detto che vuoi imparare la programmazione ad oggetti, perché non usare proprio gli oggetti?

    Adesso hai un sacco di vettori, variabili temporanee, è tutto una gran confusione!

    Crea la tua classe Partita, salva all'interno le variabili di interesse (ad esempio gol_casa, gol_fuori_casa). Inserisci un metodo che restituisca il totale dei gol (basta una somma), etc.

    Questo ti permetterà di avere un codice più chiaro, e intanto comincerai a prendere confidenza con gli oggetti. Poi imparerai a usare funzionalità molto comode, ora è ancora presto ma, piccolo esempio : basterebbe implementare Comparable nella tua classe Partita per poter effettuare l'ordinamento in automatico con una sola linea di codice
    grazie dei consigli, il problema come detto è che ai tempi della scuola ho imparato solo a scrivere in procedurale con Turbo Pascal, sto cercando di imparare Java ma non mi viene naturale ragionare ad oggetti. Ho scritto altri programmi con Java utilizzando le classi, ma alla fine ricado sempre a scrivere in procedurale (che mi sembra il modo più facile e logico). Comunque cercherò di correggere questa cosa.. magari dopo che qualche anima pia qui mi spiega dove sta l'errore cercherò di riscrivere ad "oggetti" questo stesso programma.
    Ripeto che il problema di questo programma sta solo nel 2° "if", che non funziona come dovrebbe, e non capisco il perché. Ho provato anche a mettere i due "if" in due cicli separati ma niente, non funziona. Boh.
  • Re: Calcolo combinazione vincente Totogol

    Allora, ho corretto qualcosa nel codice del post iniziale perché mi sono accorto di un errore nel ciclo, ma non funziona nemmeno così .

    Ora comunque per agevolare chi legge ho semplificato il programma come di seguito, con soli 4 match con risultati pre-inseriti e ipotizzando una combinazione vincente di 4 partite (sempre secondo le regole del Totogol, ovvero la combinazione vincente deve essere formata dalle 4 posizioni in ordine decrescente di totale gol segnati; a parità di totale gol segnati prevale il maggior numero di gol segnati dalla squadra in trasferta, e in caso di ulteriore parità prevale la partita con numero di posizione più bassa). Ho anche modificato il nome delle variabili temporanee per renderle più chiare.

    Ho preso carta e penna e ho simulato passo passo l'esecuzione del programma e non trovo errori! Eppure Java mi restituisce una combinazione sbagliata
    La combinazione vincente deve essere 4-2-1-3, mentre eseguendo il programma mi dà combinazione 4-1-3-2! PERCHE'???

    Di seguito il programma, con pre-inseriti i seguenti risultati dei 4 ipotetiti match:

    match 1: 2-1
    match 2: 2-2
    match 3: 1-0
    match 4: 1-3

    combinazione vincente: 4-2-1-3
    public class Totogol {
    
    	public static void main(String[] args) {
    	final int numero_match = 4;
    	int i,j,temp_pos,temp_golcasa,temp_golfuori,temp_totalegol;
    	int[] pos,golcasa,golfuori,totalegol;
            pos=new int[numero_match];
            golcasa=new int[numero_match];
    	golfuori=new int[numero_match];
    	totalegol=new int[numero_match];
    	for (i=0;i<numero_match;i++) {pos[i]=i+1;}
    	golcasa[0]=2;
    	golfuori[0]=1;
    	golcasa[1]=2;
    	golfuori[1]=2;
    	golcasa[2]=1;
    	golfuori[2]=0;
    	golcasa[3]=1;
    	golfuori[3]=3;
    	
    	for (i=0;i<numero_match;i++) totalegol[i]=(golcasa[i]+golfuori[i]);
    	
    	for (i=0;i<numero_match;i++)  {for (j=i;j<numero_match-1;j++) {
    						if (totalegol[i]<totalegol[j+1]) {temp_pos=pos[i]; temp_golcasa=golcasa[i];
    						temp_golfuori=golfuori[i]; temp_totalegol=totalegol[i]; pos[i]=pos[j+1]; golcasa[i]=golcasa[j+1];
    						golfuori[i]=golfuori[j+1]; totalegol[i]=totalegol[j+1]; pos[j+1]=temp_pos; golcasa[j+1]=temp_golcasa;
    						golfuori[j+1]=temp_golfuori; totalegol[j+1]=temp_totalegol;}
    								
    						else if ((totalegol[i]==totalegol[j+1]) && (golfuori[i]<golfuori[j+1]))
    								{temp_pos=pos[i]; temp_golcasa=golcasa[i]; temp_golfuori=golfuori[i]; pos[i]=pos[j+1];
    								golcasa[i]=golcasa[j+1]; golfuori[i]=golfuori[j+1]; pos[j+1]=temp_pos;
    								golcasa[j+1]=temp_golcasa; golfuori[j+1]=temp_golfuori;}}
    								
    	System.out.print ("la combinazione vincente è: ");
    	for (i=0;i<numero_match;i++) System.out.print(pos[i]+" ");
    	}
    	}
    }
  • Re: Calcolo combinazione vincente Totogol

    BINGO!!!!!!!!! ci sono arrivato finalmente! Alla fine sapete qual era il problema??? una strònza di parentesi graffa!!
    In particolare nell'esempio sopra la colpa era della terzultima parentesi graffa chiusa, che andava chiusa due linee prima, cioè immediatamente all'uscita del ciclo esterno, altrimenti la "i" veniva modificata dal ciclo for utilizzato dall'ultima istruzione in cui viene stampata la combinazione vincente. Sono uno stupido.
  • Re: Calcolo combinazione vincente Totogol

    arg82 ha scritto:


    BINGO!!!!!!!!! ci sono arrivato finalmente! Alla fine sapete qual era il problema??? una strònza di parentesi graffa!!
    In particolare nell'esempio sopra la colpa era della terzultima parentesi graffa chiusa, che andava chiusa due linee prima, cioè immediatamente all'uscita del ciclo esterno, altrimenti la "i" veniva modificata dal ciclo for utilizzato dall'ultima istruzione in cui viene stampata la combinazione vincente.
    Ottimo!
    Avevo provato a trovare l'errore ma con il codice scritto così è dura!
    Comunque non hai bisogno di usare un if con l'else if, un if con tutti i casi è sufficiente (magari se ti salvi fuori i valori invece di prenderli sempre dal vettore per i confronti riesci a scriverlo più in breve).
    Se vuoi provare a creare la classe Partita e usare un approccio più a oggetti siamo qui
  • Re: Calcolo combinazione vincente Totogol

    Ansharja ha scritto:


    arg82 ha scritto:


    BINGO!!!!!!!!! ci sono arrivato finalmente! Alla fine sapete qual era il problema??? una strònza di parentesi graffa!!
    In particolare nell'esempio sopra la colpa era della terzultima parentesi graffa chiusa, che andava chiusa due linee prima, cioè immediatamente all'uscita del ciclo esterno, altrimenti la "i" veniva modificata dal ciclo for utilizzato dall'ultima istruzione in cui viene stampata la combinazione vincente.
    Ottimo!
    Avevo provato a trovare l'errore ma con il codice scritto così è dura!
    Comunque non hai bisogno di usare un if con l'else if, un if con tutti i casi è sufficiente (magari se ti salvi fuori i valori invece di prenderli sempre dal vettore per i confronti riesci a scriverlo più in breve).
    Se vuoi provare a creare la classe Partita e usare un approccio più a oggetti siamo qui
    sì sì, grazie, ho già iniziato a scrivere la classe Partita e il Main, ed in effetti così sembra tutto più ordinato, per ora non sto riscontrando particolari problemi. Se avrò dubbi sicuramente chiederò. Grazie.
Devi accedere o registrarti per scrivere nel forum
7 risposte