Domanda Aiuto esercizio in c++.

Chronalt14

Utente Silver
12 Agosto 2022
184
39
23
87
Salve, ho delle difficoltà a svolgere un'esercizio in c++, vi scrivo il testo a capo:
Una casa editrice stampa libri scolastici.
Per ognuno degli N libri di testo (N è inserito in input) vengono registrate le seguenti informazioni: titolo, materia e numero di pagine.
Realizza un programma che permetta di calcolare:
quanti sono i libri di testo di Italiano;
quanti libri di Matematica hanno più di 300 pagine;
quale è il numero medio di pagine per i libri di Matematica;
il titolo del libro che ha il maggior numero di pagine;
il titolo del libro di Italiano che ha il minor numero di pagine.

Io avevo intenzione di procedere tramite il ciclo while e gli if per quanto riguarda le informazioni, solo che è da un pò di tempo che ci sbatto e non sto capendo più niente...
 
Ciao, dovresti intanto condividere il codice che hai scritto sono ad ora.

Comunque ti servirà un ciclo per inserire gli N libri, e poi puoi procedere in svariati modi: potresti tenere il conto sia delle pagine che delle materie durante questo ciclo di inserimento; oppure farti due funzioni, entrambe con un ciclo per scorrere i libri e svolgere le operazioni necessarie.

Sono giusto due idee.
 
  • Mi piace
Reazioni: Chronalt14
Io avevo intenzione di procedere tramite il ciclo while e gli if per quanto riguarda le informazioni, solo che è da un pò di tempo che ci sbatto e non sto capendo più niente...
bene o male è questo.

non ti funziona qualcosa?
condividi il codice, mi sembra tu sia con struct e ricerche

poi while e for, perchè dipende se devi fermarti al primo oppure devi "scorrerli" tutti
 
  • Mi piace
Reazioni: Chronalt14
perchè dipende se devi fermarti al primo oppure devi "scorrerli" tutti
Da quello che ho capito deve scorrerli tutti per poter rispondere alle richieste dell'esercizio.
Non so però se conviene fare i calcoli durante l'inserimento tramite costrutti if e dei contatori oppure fare i calcoli dopo aver completato l'inserimento di tutti i libri con un menù composto dalle voci per ogni richiesta.
 
  • Mi piace
Reazioni: Chronalt14
Ultima modifica:
Ecco il codice che ho scritto fino ad ora:
C++:
#include<iostream>
#include<string>
using namespace std;
int main()
{
    int fb_N=0;
    string fb_titolo="";
    string fb_materia="";
    int fb_numero_pagine=0;
    int fb_libri_italiano=0;
    int fb_libri_matematica_con_più_300_pagine=0;
    int fb_numero_medio_pagine_libri_matematica=0;
    string fb_titolo_libro_con_maggior_numero_pagine="";
    string fb_libro_italiano_con_minor_numero_pagine="";

    cout<<"Inserisci il numero dei libri di testo: ";
    cin>>fb_N;
    while(fb_N>0)
    {
        cout<<"Inserisci il titolo del libro: ";
        cin>>fb_titolo;

        cout<<"Inserisci la materia del libro: ";
        cin>>fb_materia;
        if(fb_materia=="Italiano")
        {
            fb_libri_italiano++;
        }

        if(fb_materia=="Matematica"&&fb_libri_matematica_con_più_300_pagine>300)
        {
            fb_libri_matematica_con_più_300_pagine++;
        }

        cout<<"Inserisci il numero di pagine del libro: ";
        cin>>fb_numero_pagine;

        // Mi sono bloccato qui.
    }
}
Messaggio unito automaticamente:


Le iniziali fb nelle variabili sono le iniziali del mio nome e cognome; il professore per cercare di rallentarci nel copiare ce li fa inserire così almeno non facciamo copia e incolla senza non modificare niente dice XD
 
Ecco il codice che ho scritto fino ad ora:
C++:
#include<iostream>
#include<string>
using namespace std;
int main()
{
    int fb_N=0;
    string fb_titolo="";
    string fb_materia="";
    int fb_numero_pagine=0;
    int fb_libri_italiano=0;
    int fb_libri_matematica_con_più_300_pagine=0;
    int fb_numero_medio_pagine_libri_matematica=0;
    string fb_titolo_libro_con_maggior_numero_pagine="";
    string fb_libro_italiano_con_minor_numero_pagine="";

    cout<<"Inserisci il numero dei libri di testo: ";
    cin>>fb_N;
    while(fb_N>0)
    {
        cout<<"Inserisci il titolo del libro: ";
        cin>>fb_titolo;

        cout<<"Inserisci la materia del libro: ";
        cin>>fb_materia;
        if(fb_materia=="Italiano")
        {
            fb_libri_italiano++;
        }

        if(fb_materia=="Matematica"&&fb_libri_matematica_con_più_300_pagine>300)
        {
            fb_libri_matematica_con_più_300_pagine++;
        }

        cout<<"Inserisci il numero di pagine del libro: ";
        cin>>fb_numero_pagine;

        // Mi sono bloccato qui.
    }
}
Messaggio unito automaticamente:

Alcuni punti chiave, prima che me li scordi:

  • non usare le lettere accentate nelle variabili
  • ti consiglierei anche di usare il minuscolo per le variabili, quindi fb_N dovrebbe diventare fb_n (il maiuscolo lo si usa per le costanti, solitamente)
  • prima di fare il confronto della stringa, è meglio se uniformi l'input: trasforma tutto in minuscolo e confronta con "italiano" e "matematica"
Io lo imposterei dando una logica più seria, anche se alcune informazioni possono essere calcolate subito (come il nr. di libri per materia).

Di sicuro la soluzione non potrà essere però scrivere tutto il codice nel main(), come stai facendo. Non penso abbiate visto le classi ancora, quindi ve lo farà usare come fosse C...

Quindi ti direi: non so se puoi usare i vector a questo punto, se non puoi, usa un VLA, quindi:

C++:
cin>>fb_n;
Book books[fb_n];

(oh si scusa, importante: fb_books :rofl: )

Dove Book è una cosa come:

C++:
struct Book {
    string title;
    string subject; // la "materia", non so bene come tradurlo
    int pages;
};

Spero abbiate trattato le strutture almeno, che mi sembra il modo migliore per gestire decentemente un problema come questo.

A questo punto ti fai un bel for da 0 a fb_n dove richiedi tutti i vari libri, con le relative info, schematicamente:

Codice:
cout << Inserimento libro #" << i << endl;
cout << "Inserisci il titolo:" << endl;
cin >> books[i].title;
......

Al termine del for avrai un array di tipo Book che contiene i tuoi N books. Qui richiamerai le tue funzioni passando come parametro alla funzione l'array di libri.
Il main quindi lo userai solo per popolare il tuo array di libri (puoi farlo anche separatamente se vuoi, ma evitiamo di complicare troppo le cose) e per richiamare le funzioni che ti restituiranno il valore desiderato, eg. per i libri di testo in italiano la firma delle funzione potrebbe essere per esempio:

C++:
int nr_italian_books(struct Book books[]);

// Che richiamerai quindi semplicemente così

cout << "Nr. di libri di italiano: " << nr_italian_books(books) << endl;

Così è come lo strutturerei io almeno. Mi sembra pulito come codice, e facile da adattare ad altre situazioni. ;)

Non uso C++ da un secolo, però non dovrei aver sbagliato (troppo) la sintassi degli "esempi".

Le iniziali fb nelle variabili sono le iniziali del mio nome e cognome; il professore per cercare di rallentarci nel copiare ce li fa inserire così almeno non facciamo copia e incolla senza non modificare niente dice XD

Non ho parole...
Invece di farvi dare nomi esplicativi e farvi usare un prefisso in maniera sensata, fa così. :rofl:
 
Ultima modifica:
Alcuni punti chiave, prima che me li scordi:

  • non usare le lettere accentate nelle variabili
  • ti consiglierei anche di usare il minuscolo per le variabili, quindi fb_N dovrebbe diventare fb_n (il maiuscolo lo si usa per le costanti, solitamente)
  • prima di fare il confronto della stringa, è meglio se uniformi l'input: trasforma tutto in minuscolo e confronta con "italiano" e "matematica"
Io lo imposterei dando una logica più seria, anche se alcune informazioni possono essere calcolate subito (come il nr. di libri per materia).

Di sicuro la soluzione non potrà essere però scrivere tutto il codice nel main(), come stai facendo. Non penso abbiate visto le classi ancora, quindi ve lo farà usare come fosse C...

Quindi ti direi: non so se puoi usare i vector a questo punto, se non puoi, usa un VLA, quindi:

C++:
cin>>fb_n;
Book books[fb_n];

(oh si scusa, importante: fb_books :rofl: )

Dove Book è una cosa come:

C++:
struct Book {
    string title;
    string subject; // la "materia", non so bene come tradurlo
    int pages;
};

Spero abbiate trattato le strutture almeno, che mi sembra il modo migliore per gestire decentemente un problema come questo.

A questo punto ti fai un bel for da 0 a fb_n dove richiedi tutti i vari libri, con le relative info, schematicamente:

Codice:
cout << Inserimento libro #" << i << endl;
cout << "Inserisci il titolo:" << endl;
cin >> books[i].title;
......

Al termine del for avrai un array di tipo Book che contiene i tuoi N books. Qui richiamerai le tue funzioni passando come parametro alla funzione l'array di libri.
Il main quindi lo userai solo per popolare il tuo array di libri (puoi farlo anche separatamente se vuoi, ma evitiamo di complicare troppo le cose) e per richiamare le funzioni che ti restituiranno il valore desiderato, eg. per i libri di testo in italiano la firma delle funzione potrebbe essere per esempio:

C++:
int nr_italian_books(struct Book books[]);

// Che richiamerai quindi semplicemente così

cout << "Nr. di libri di italiano: " << nr_italian_books(books) << endl;

Così è come lo strutturerei io almeno. Mi sembra pulito come codice, e facile da adattare ad altre situazioni. ;)

Non uso C++ da un secolo, però non dovrei aver sbagliato (troppo) la sintassi degli "esempi".



Non ho parole...
Invece di farvi dare nomi esplicativi e farvi usare un prefisso in maniera sensata, fa così. :rofl:
Grazie per i consigli, modificherò subito il mio codice. Comunque fino ad ora abbiamo fatto: if, switch, while, do while e for (quest'ultimo abbiamo più o meno le basi), quindi come puoi capire non siamo molto avanti. Non abbiamo ancora iniziato invece con i vettori e neanche la funzione struct (anche se ci ha accennato qualcosina). Ah, dimenticavo, neanche gli array abbiamo fatto XD!
 
Un problema del genere avresti potuto risolverlo in maniera professionale con un array di struct. Sono allibito per quello che vi ha imposto di fare il prof con l'assegnazione dei nomi delle variabili: è quanto di più stupido e controproducente si possa fare per programmare bene...le variabili devono avere nomi chiari e significativi. Certi soggetti non dovrebbero insegnare...questo in particolare merita 30 anni di carcere. 😂😂😂
 
  • Mi piace
Reazioni: Chronalt14
Un problema del genere avresti potuto risolverlo in maniera professionale con un array di struct. Sono allibito per quello che vi ha imposto di fare il prof con l'assegnazione dei nomi delle variabili: è quanto di più stupido e controproducente si possa fare per programmare bene...le variabili devono avere nomi chiari e significativi. Certi soggetti non dovrebbero insegnare...questo in particolare merita 30 anni di carcere. 😂😂😂
Lo penso anche io, li fanno molto difficili e non abbiamo ancora delle competenze raccomandate per svolgere in maniera autonoma questo problema, ma intanto che vogliamo fare, il professore ha sempre ragione...
 
Ultima modifica:
A me sembra che eri a buon punto. Questo è il tuo codice, un po' riordinato, a cui ho aggiunto qualche suggerimento.

C++:
#include<iostream>
#include<string>

using namespace std;

int main() {
    int fb_libri_italiano = 0;
    int fb_libri_matematica = 0;                                            // NOTA: Questa l'ho aggiunta io
    int fb_numero_pagine_libri_matematica = 0;                              // NOTA: Questa l'ho aggiunta io
    int fb_libri_matematica_con_piu_300_pagine = 0;

    int fb_numero_pagine_libro_con_maggior_numero_pagine = 0                // NOTA: Questa l'ho aggiunta io
    string fb_titolo_libro_con_maggior_numero_pagine = "";
 
    int fb_numero_pagine_libro_italiano_con_minor_numero_pagine = 1000000;  // NOTA: Questa l'ho aggiunta io
    string fb_libro_italiano_con_minor_numero_pagine = "";
 
    int fb_n;
    cout << "Inserisci il numero dei libri di testo: ";
    cin >> fb_n;

    for (int i = 1; i <= fb_n; i++) {
        string fb_titolo;
        cout << "Inserisci il titolo del " << i << "^ libro: ";
        cin >> fb_titolo;

        string fb_materia;
        cout << "Inserisci la materia del " << i << " libro: ";
        cin >> fb_materia;

        int fb_numero_pagine;
        cout << "Inserisci il numero di pagine del " << i << " libro: ";
        cin >> fb_numero_pagine;

        if (fb_materia == "Italiano") {
            fb_libri_italiano++;
        }

        if (fb_materia == "Matematica" && fb_numero_pagine > 300) {         // NOTA: Questa l'ho modificato io
            fb_libri_matematica_con_piu_300_pagine++;
        }
 
        // TODO: Cose che ti restano da fare:
        // 1) contare il numero di libri di matematica (guarda come hai fatto per italiano);
        // 2) sommare il numero di pagine di tutti i libri di matematica (in fb_numero_pagine_libri_matematica)
        // 3) trovare il libro di italiano con minor numero di pagine (guarda come ho fatto io per trovare il libro con maggior numero di pagine)

        // IL TUO CODICE VA QUI

        // Se il libro attuale ha più pagine del libro con maggior numero di pagine
        if (fb_numero_pagine > fb_numero_pagine_libro_con_maggior_numero_pagine) {
           // Aggiorno i valori del libro con maggior numero di pagine
            fb_titolo_libro_con_maggior_numero_pagine = fb_titolo;
            fb_numero_pagine_libro_con_maggior_numero_pagine = fb_numero_pagine;
        }
    }

    // La media si calcola in questo modo, ma `fb_numero_pagine_libri_matematica' e `fb_libri_matematica' li devi ancora calcolare
    float fb_numero_medio_pagine_libri_matematica = fb_numero_pagine_libri_matematica / (float)fb_libri_matematica;
 
    // TODO: Stampa (cout) i valori richiesti dall'esercizio
    // IL TUO CODICE VA QUI

    return 0;
}

Nota che ho cambiato il tuo while in un for e sono volutamente rimasto sul semplice. Vediamo se basta per sbloccarti.