PROBLEMA esercizio c++

LuIgIm912

Nuovo Utente
Buonasera, sono nuovo del forum e da poco mi sto avvicinando al mondo della programmazione
stavo tentando di risolvere questo esercizio
TRACCIA:
Sia dato il file di testo partite.txt che contiene (come da esempio) per ogni riga due stringhe (che rappresentano i nomi di due squadre) e
due numeri interi (che rappresentano le reti segnate dalle due squadre).
Si progettino quattro funzioni:
- leggi_risultati, che legge dal file partite.txt i nomi delle squadre e le reti segnate,
e li memorizza in un vettore di strutture (vett_partite). Ciascuna struttura conterrà quindi quattro campi: due stringhe,
per memorizzare il nome delle due squadre (quella che gioca in casa e quella che gioca in trasferta), e due interi, per memorizzare
le reti segnate dalla squadra di casa e da quella in trasferta;
- calcola_punti che riceve in ingresso due interi (che rappresentano le reti segnate dalle due squadre) e restituisce come valore
di ritorno un intero pari a 3, se il primo valore è maggiore del secondo, pari ad 1 se i due valori sono uguali, e pari a 0 altrimenti;
- calcola_punteggio che riceve in ingresso un vettore di strutture (vett_partite), il suo riempimento (riemp) ed una stringa (squadra)
che rappresenta il nome di una squadra, e, sfruttando la funzione calcola_punti, restituisce come parametro di uscita un intero che rappresenta
il numero totale di punti conseguiti da quella squadra nelle partite memorizzate in vett_partite;
- stampa_risultati che stampa a video un vettore di strutture (vedi esempio), contenente, in questo caso,
i risultati di una serie di partite (quelle memorizzate in vett_partite);
e si scriva un programma che, utilizzando la funzioni sopra descritte, legga, dal file partite.txt, i risultati di un insieme
di partite e da tastiera il nome di una squadra, calcoli il punteggio complessivo ottenuto da questa squadra in tali partite,
e lo stampi a video con un opportuno messaggio, dopo aver stampato i risultati contenuti nel file partite.txt.
Il programma dovrà essere suddiviso in moduli, uno contenente prototipi e dichiarazioni, uno contenente le funzioni leggi_risultati,
calcola_punti, calcola_punteggio e stampa_risultati ed un terzo contenente il main.
---------------------------------------------------------------------------------------------------------------------------------
Esempio
INPUT
(partite.txt):
Napoli Borussia 2 1
Arsenal Napoli 2 0
Borussia Arsenal 1 1
Arsenal Borussia 1 3
Borussia Napoli 2 1
Napoli Arsenal 2 0

(da tastiera)
Arsenal

OUTPUT :
Napoli Borussia 2-1
Arsenal Napoli 2-0
Borussia Arsenal 1-1
Arsenal Borussia 1-3
Borussia Napoli 3-1
Napoli Arsenal 2-0
I punti della squadra Arsenal sono: 4


il codice va in compilazione, ma non mi riporta i punteggi esatti (il contenuto del file è formato dalle partite nell'esempio)
potreste dirmi dove sbaglio per piacere?
grazie in anticipo per la risposta
ecco il codice:

C++:
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
using namespace std;
#define MAX 30
typedef char stringa[MAX];
struct risultati{
    stringa sq1;
    stringa sq2;
    int gol1;
    int gol2;
};
typedef risultati vett_partite[MAX];
//prototipi
void leggi_risultati(const char*, vett_partite, int&);
void stampa_risultati(const vett_partite, int);
int calcola_punti(int&, int&);
int calcola_punteggio(const vett_partite, int, stringa);
//definizioni funzioni
void leggi_risultati(const char* filename, vett_partite VP, int& riemp){
    int i=0;
    ifstream input;
    input.open(filename);
    if(input.fail()){
      cout<<"File non trovato..."<<'\n';
      exit (1);
    }
    
    while(!input.eof()){
        input>>VP[i].sq1;
        input>>VP[i].sq2;
        input>>VP[i].gol1;
        input>>VP[i].gol2;
        i++;
    }
    riemp=i;
}

void stampa_risultati(const vett_partite VP, int riemp){
    for(int i=0; i<riemp; i++){
        cout<<VP[i].sq1<<' '<<VP[i].sq2<<' '<<VP[i].gol1<<"-"<<VP[i].gol2;
        cout<<'\n';
    }
}

int calcola_punti(int& gol1, int& gol2){
    if (gol1>gol2)
       return 3;
    if (gol1<gol2)
       return 0;
    if (gol1==gol2)
       return 1;     
}

int calcola_punteggio(const vett_partite VP, int riemp, stringa squadra){
    int i, gol1, gol2, puntitot=0;
    for(i=0; i<riemp; i++){
        if(strcmp(squadra,VP[i].sq1)==0 || strcmp(squadra,VP[i].sq2)==0){
         gol1=VP[i].gol1;
         gol2=VP[i].gol2;
         puntitot=puntitot+calcola_punti(gol1, gol2);   
        }
    
    
    }
    return puntitot;
}

int main(){
    char filename[]="partiteprova.txt";
    vett_partite vp;
    int riemp;
    stringa squadra;
    leggi_risultati(filename, vp, riemp);
    cout<<"Ecco i risultati delle partite:"<<'\n';
    stampa_risultati(vp, riemp);
    cout<<"Inserisci la squadra di cui vuoi conoscere il punteggio: ";
    cin>>squadra;
    cout<<"I punti della squadra inserita sono: ";
    int punti=calcola_punteggio(vp, riemp, squadra);
    cout<<punti;
}
 

Andretti60

Utente Èlite
3,471
2,332
Hardware Utente
L'errore è in calcola_punteggio, devi controllare che la squadra che richiedi sia la prima o la seconda, e quindi confrontare i corrispondenti goal compiuti.
Post automaticamente unito:

PS stai usando C++ come se fosse il C, dovresti usare classi e metodi invece che strutture e funzioni, ma questo è un altro discorso.
 

LuIgIm912

Nuovo Utente
L'errore è in calcola_punteggio, devi controllare che la squadra che richiedi sia la prima o la seconda, e quindi confrontare i corrispondenti goal compiuti.
Post automaticamente unito:

PS stai usando C++ come se fosse il C, dovresti usare classi e metodi invece che strutture e funzioni, ma questo è un altro discorso.
potresti indicarmi come risolvere per piacere?
 

_Achille

Utente Èlite
2,993
685
Hardware Utente
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
Hard Disk
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
Scheda Video
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
Alimentatore
RM550X
Case
NZXT S340
Periferiche
Cooler Master XT; Razer Abyssus
Sistema Operativo
Windows 10 Pro
Ti consiglio di riscrivere l’intero codice e di identarlo bene, perché sinceramente faccio proprio fatica a controllarlo.
E inizia ad utilizzare le std::string, using invece del bruttissimo typedef e constanti const invece di macro.
 

Andretti60

Utente Èlite
3,471
2,332
Hardware Utente
L'errore sta qui:
C:
    if(strcmp(squadra,VP[i].sq1)==0 || strcmp(squadra,VP[i].sq2)==0)
    {
         gol1=VP[i].gol1;
         gol2=VP[i].gol2;
         puntitot=puntitot+calcola_punti(gol1, gol2);
la tua 'squadra' potrebbe essere o 'sq1' o 'sq2', vedi la tua istruzione if(), pero' poi il calcolo dei punti lo fai come la squadra fosse sq1.
Devi fare due confronti, uno con sq1 e uno con sq2.

PS ricorda che sommare un numero a una variabile si puo' scrivere puntitot+=... invece che puntitot=puntitot+..., dal punto di vista computazione non cambia nulla, e' solo molto piu' facile da leggere.
 

Entra

oppure Accedi utilizzando