Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    4

    overflow e multi-character [c++]

    Premetto che sono ancora un principiante, devo realizzare un convertitore per compito per casa.
    quando vado a compilare il programma mi compaiono diversi errori. vi posto il codice parziale che ho fatto fino adesso. (so già che gli ultimi mi compaiono perché non ho ancora completato il programma)


    codice:
     
    
    #include <iostream>
    #include <cstdlib>
    #include <string.h>
    #include <windows.h>
    #include <stdlib.h>
    
    using namespace std;
    
    main () {
        
        float risultato;
        int scelta;
        
        cout<< "Benvenuto nel programma di conversione, scegli il tipo di conversione che vuoi eseguire /n/n";
        cout<< "1 - Valuta"<<endl;
        cout<< "2 - Massa "<<endl;
        cout<< "3 - Lunghezza"<<endl;
        cout<< "4 - Superficie"<<endl;
        cout<< "5 - Volume"<<endl;
        cout<< "6 - Tempo"<<endl;
        cout<< "7 - Temperatura"<<endl;
        cin>> scelta;
    
        switch (scelta) {
            case 1:
                cout<< "Unità di misura: € £ $"<<endl;
                goto convertval;
                break;
            case 2:
                cout<< "Unità di misura: kg hg dag g dg cg mg"<<endl;
                goto convertmassa;
                break;
            case 3:
                cout<< "Unità di misura: km hm dam m dm cm mm"<<endl;
                goto convertlung;  
                break;
            case 4:
                cout<< "Unità di misura: km^2 hm^2 dam^2 m^2 dm^2 cm^2 mm^2"<<endl;
                goto convertsup;
                break;
            case 5:
                cout<< "Unità di misura: km^3 hm^3 dam^3 m^3 dm^3 cm^3 mm^3"<<endl;
                goto convertvol;
                break;
            case 6:
                cout<< "Unità di misura: a m g h min s"<<endl;       
                goto converttempo;
                break;
            case 7:
                cout<< "Unità di misura: C K F"<<endl;    
                goto converttemp;
                break;
            }
        
        
         convertmassa: {
            cout<< "Inserire unità di misura iniziale"<<endl;
            char misura1;
            cin>> misura1;
            cout<< "inserire cifra: ";
            float n1;
            cin >> n1;
            cout<< "inserire unità di misura finale"<<endl;
            string misura2;
            cin>> misura2;
            
            
            switch (misura1){
                            
                case 'kg':
                     
                      if (misura2 == "kg"){
                    cout <<"Risultato: "<<n1<<endl;
                    break;}
                    
                    if (misura2 == "hg"){
                    cout <<"Risultato: "<<n1*10<<endl;
                    break;}
                    
                    if (misura2 == "dag"){
                    cout <<"Risultato; "<<n1*100<<endl;
                    break;}
                    
                    if (misura2 == "g"){
                    cout <<"Risultato: "<<n1*1000<<endl;
                    break;}
                    
                    if (misura2 == "dg"){
                    cout <<"Risultato: "<<n1*10000<<endl;
                    break;}
                    
                    if (misura2 == "cg"){
                    cout <<"Risultato: "<<n1*100000<<endl;
                    break;}
                    
                    if (misura2 == "mg"){
                    cout <<"Risultato: "<<n1*1000000<<endl;
                    break;}
                    
                break;
                    
                case 'hg': 
                     
                      if (misura2 == "kg"){
                    cout <<"Risultato: "<<n1/10<<endl;
                    break;}
                    
                    if (misura2 == "hg"){
                    cout <<"Risultato: "<<n1<<endl;
                    break;}
                    
                    if (misura2=="dag"){
                    cout <<"Risultato; "<<n1*10<<endl;
                    break;}
                    
                    if (misura2=="g"){
                    cout <<"Risultato: "<<n1*100<<endl;
                    break;}
                    
                    if (misura2=="dg"){
                    cout <<"Risultato: "<<n1*1000<<endl;
                    break;}
                    
                    if (misura2=="cg"){
                    cout <<"Risultato: "<<n1*10000<<endl;
                    break;}
                    
                    if (misura2=="mg"){
                    cout <<"Risultato: "<<n1*100000<<endl;
                    break;}
                    
                break;  
                
                case 'dag':
                     
                      if (misura2 == "kg"){
                    cout <<"Risultato: "<<n1/100<<endl;
                    break;}
                    
                    if (misura2 == "hg"){
                    cout <<"Risultato: "<<n1/10<<endl;
                    break;}
                    
                    if (misura2=="dag"){
                    cout <<"Risultato; "<<n1<<endl;
                    break;}
                    
                    if (misura2=="g"){
                    cout <<"Risultato: "<<n1*10<<endl;
                    break;}
                    
                    if (misura2=="dg"){
                    cout <<"Risultato: "<<n1*100<<endl;
                    break;}
                    
                    if (misura2=="cg"){
                    cout <<"Risultato: "<<n1*1000<<endl;
                    break;}
                    
                    if (misura2=="mg"){
                    cout <<"Risultato: "<<n1*10000<<endl;
                    break;}
                    
                break;
                
                 case 'g':
                    
                     if (misura2=="kg"){
                    cout <<"Risultato: "<<n1/1000<<endl;
                    break;}
                    
                    if (misura2=="hg"){
                    cout <<"Risultato: "<<n1/100<<endl;
                    break;}
                    
                    if (misura2=="dag"){
                    cout <<"Risultato; "<<n1/10<<endl;
                    break;}
                    
                    if (misura2== "g"){
                    cout <<"Risultato: "<<n1<<endl;
                    break;}
                    
                    if (misura2=="dg"){
                    cout <<"Risultato: "<<n1*10<<endl;
                    break;}
                    
                    if (misura2=="cg"){
                    cout <<"Risultato: "<<n1*100<<endl;
                    break;}
                    
                    if (misura2=="mg"){
                    cout <<"Risultato: "<<n1*1000<<endl;
                    break;}
                    
                break;
                
                case 'dg':
                    
                     if (misura2=="kg"){
                    cout <<"Risultato: "<<n1/10000<<endl;
                    break;}
                    
                    if (misura2=="hg"){
                    cout <<"Risultato: "<<n1/1000<<endl;
                    break;}
                    
                    if (misura2=="dag"){
                    cout <<"Risultato; "<<n1/100<<endl;
                    break;}
                    
                    if (misura2=="g"){
                    cout <<"Risultato: "<<n1/10<<endl;
                    break;}
                    
                    if (misura2=="dg"){
                    cout <<"Risultato: "<<n1<<endl;
                    break;}
                    
                    if (misura2=="cg"){
                    cout <<"Risultato: "<<n1*10<<endl;
                    break;}
                    
                    if (misura2=="mg"){
                    cout <<"Risultato: "<<n1*100<<endl;
                    break;}
                    
                break;
                
                case 'cg':
                    
                     if (misura2=="kg"){
                    cout <<"Risultato: "<<n1/100000<<endl;
                    break;}
                    
                    if (misura2=="hg"){
                    cout <<"Risultato: "<<n1/10000<<endl;
                    break;}
                    
                    if (misura2=="dag"){
                    cout <<"Risultato; "<<n1/1000<<endl;
                    break;}
                    
                    if (misura2=="g"){
                    cout <<"Risultato: "<<n1/100<<endl;
                    break;}
                    
                    if (misura2=="dg"){
                    cout <<"Risultato: "<<n1/10<<endl;
                    break;}
                    
                    if (misura2=="cg"){
                    cout <<"Risultato: "<<n1<<endl;
                    break;}
                    
                    if (misura2=="mg"){
                    cout <<"Risultato: "<<n1*10<<endl;
                    break;}
                    
                break;
                
                case 'mg':
                    
                     if (misura2=="kg"){
                    cout <<"Risultato: "<<n1/1000000<<endl;
                    break;
                    }
                    
                    if (misura2=="hg"){
                    cout <<"Risultato: "<<n1/100000<<endl;
                    break;
                    }
                    
                    if (misura2=="dag"){
                    cout <<"Risultato; "<<n1/10000<<endl;
                    break;
                    }
                    
                    if (misura2=="g"){
                    cout <<"Risultato: "<<n1/1000<<endl;
                    break;
                    }
                    
                    if (misura2=="dg"){
                    cout <<"Risultato: "<<n1/100<<endl;
                    break;
                    }
                    
                    if (misura2=="cg"){
                    cout <<"Risultato: "<<n1/10<<endl;
                    break;
                    }
                    
                    if (misura2=="mg"){
                    cout <<"Risultato: "<<n1<<endl;
                    break;
                    }
                    
                break;
            }
        }    
            
                
        system("pause");
    }

    18 C:\Users\Federico\Desktop\Convertitore.cpp:72 [Warning] multi-character character constant
    C:\Users\Federico\Desktop\Convertitore.cpp In function `int main()':
    72 C:\Users\Federico\Desktop\Convertitore.cpp [Warning] overflow in implicit constant conversion
    18 C:\Users\Federico\Desktop\Convertitore.cpp:104 [Warning] multi-character character constant
    104 C:\Users\Federico\Desktop\Convertitore.cpp [Warning] overflow in implicit constant conversion
    104 C:\Users\Federico\Desktop\Convertitore.cpp duplicate case value
    72 C:\Users\Federico\Desktop\Convertitore.cpp previously used here
    18 C:\Users\Federico\Desktop\Convertitore.cpp:136 [Warning] multi-character character constant
    136 C:\Users\Federico\Desktop\Convertitore.cpp [Warning] overflow in implicit constant conversion
    136 C:\Users\Federico\Desktop\Convertitore.cpp duplicate case value
    104 C:\Users\Federico\Desktop\Convertitore.cpp previously used here
    168 C:\Users\Federico\Desktop\Convertitore.cpp duplicate case value
    136 C:\Users\Federico\Desktop\Convertitore.cpp previously used here
    18 C:\Users\Federico\Desktop\Convertitore.cpp:200 [Warning] multi-character character constant
    200 C:\Users\Federico\Desktop\Convertitore.cpp [Warning] overflow in implicit constant conversion
    200 C:\Users\Federico\Desktop\Convertitore.cpp duplicate case value
    168 C:\Users\Federico\Desktop\Convertitore.cpp previously used here
    18 C:\Users\Federico\Desktop\Convertitore.cpp:232 [Warning] multi-character character constant
    232 C:\Users\Federico\Desktop\Convertitore.cpp [Warning] overflow in implicit constant conversion
    232 C:\Users\Federico\Desktop\Convertitore.cpp duplicate case value
    200 C:\Users\Federico\Desktop\Convertitore.cpp previously used here
    18 C:\Users\Federico\Desktop\Convertitore.cpp:264 [Warning] multi-character character constant
    264 C:\Users\Federico\Desktop\Convertitore.cpp [Warning] overflow in implicit constant conversion
    264 C:\Users\Federico\Desktop\Convertitore.cpp duplicate case value
    232 C:\Users\Federico\Desktop\Convertitore.cpp previously used here
    53 C:\Users\Federico\Desktop\Convertitore.cpp label `converttemp' used but not defined
    49 C:\Users\Federico\Desktop\Convertitore.cpp label `converttempo' used but not defined
    45 C:\Users\Federico\Desktop\Convertitore.cpp label `convertvol' used but not defined
    41 C:\Users\Federico\Desktop\Convertitore.cpp label `convertsup' used but not defined
    37 C:\Users\Federico\Desktop\Convertitore.cpp label `convertlung' used but not defined
    29 C:\Users\Federico\Desktop\Convertitore.cpp label `convertval' used but not defined

  2. #2
    Ciao, ascolta un consiglio.
    Scrivi troppa roba, nessuno si prenderà la briga di compilare e correggere il tuo programma.
    Devi isolarlo in blocchi finché poi potrai capire ogni errore da quale riga viene emesso.

  3. #3
    Il problema fondamentale è che usi variabili char come se fossero stringhe, mentre un char rappresenta un singolo carattere; inoltre, passando a stringhe "vere" (siano esse stringhe C - ovvero array di char -, o stringhe C++ - std::string) non puoi comunque usare il costrutto switch...case, che si può usare solo con tipi interi.

    Poi, l'uso dei goto è deprecabile, dovresti ristrutturare il programma in subroutine.

    Inoltre, non ha senso fare tutte quelle combinazioni di switch/case: scegli un'unità "interna" per qualunque tipo di misura (metri per la lunghezza, kg per il peso, m^2 per la superficie, ...) in cui andrai a convertire il valore dato in input, per poi convertirlo nel tipo desiderato. In questa maniera eviti il problema di dover scrivere il codice per n^2 conversioni (dove n è il numero di unità di misura per ciascuna categoria): vedi bene che stai scrivendo una montagna di codice per fare una semplice conversione!
    Un altro modo per tagliare sul codice ripetitivo da scrivere è individuare i prefissi e separarli dall'unità base: individua prima il prefissi a sinistra, e separalo dall'unità base. Questo codice si può scrivere una sola volta in una subroutine e riciclarlo per tutto il codice.

    In effetti, una volta separati i prefissi, il modo più furbo di tutti sarebbe usare una std::map (che di fatto è un albero rb) e avere come chiavi le unità di misura, e come valori la coppia tipo di unità di misura (peso, lunghezza, ...) e coefficiente di conversione all'unità di base. In questa maniera per convertire tra unità di misura basterebbero in tutto due lookup nella mappa. (ma mi sa che stiamo andando su argomenti un po' avanzati)
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    4
    ho capito, chiedo scusa se ho scritto qualche cosa di "blasfemo". Il fatto è che sono uno studente dl primo anno di specializzazione di informatica a un ITIS, e a scuola in tre settimane non abbiamo fatto molto; ancora non ho molta competenza.. Studierò di più.

  5. #5
    Invece di usare la terribile istruzione goto, ti consiglierei di dare una studiata generale alla "programmazione procedurale": quando si presentano problemi che richiedono una conoscenza che non si ha, conviene sempre mettere da parte per un attimo il problema e concentrarsi sul riparare queste lacune.

    Studiati le funzioni così il programma ti viene "più pulito".

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    4
    ok, grazie del consiglio! inoltre è proprio quello che andremo ad affrontare nelle prossime lezioni

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296

    Moderazione

    Originariamente inviato da fg-95
    ok, grazie del consiglio! inoltre è proprio quello che andremo ad affrontare nelle prossime lezioni
    Un altro consiglio è quello di utilizzare titoli più significativi, come da Regolamento, che ti suggerisco di leggere.

    Qui l'ho modificato io.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.