Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Problema con vettore stringa

    Ciao ragazzi,
    premetto che sono alle basi con il c++ e non conosco ancora tutti i termini specifici e via discorrendo, perciò vi prego di non usare un linguaggio troppo scientifico nelle risposte
    Detto questo, ecco il mio problema: per casa il prof ci ha assegnato il seguente esercizio:
    Far inserire all'utente 8 squadre con i relativi punteggi in campionato, ordinarle e visualizzare la classifica.
    A scuola non siamo riusciti a risolverlo perché mancava qualcosa che il professore non ci ha saputo spiegare (-.-) così me lo son risolto a casa per fatti miei cercando in internet qualcosa per risolvere il problema (ci aveva fatto dichiarare il vettore stringa come char invece che string) ma ancora non sono riuscito a completarlo, infatti il programma parte, riesco ad inserire squadre e punteggi poi si blocca.
    Ecco il codice:
    [spoiler]
    codice:
    #include <cstdlib>
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main()
    {
    string squadre[8];
    string app1[1];
    int punti[8], i, app, interr;
    
    for(i=0;i<8;i++) {
                     printf("Inserisci la %da squadra: ", i+1);
                     scanf("%s", &squadre[i]);
                     printf("Inserisci il suo punteggio: ");
                     scanf("%d", &punti[i]);
    }
    do {
        interr = 0;
        for(i=0;i<8;i++) {
                         if (punti[i]<punti[i+1]) {
                                                  app = punti[i];
                                                  punti[i] = punti[i+1];
                                                  punti[i+1] = app;
                                                  app1[0] = squadre[i];
                                                  squadre[i] = squadre[i+1];
                                                  squadre[i+1] = app1[0];
                                                  interr=1;
                                                  }
                                                  }
                                                  }
    while(interr==1);
    printf("Ecco la classifica: ");
    for(i=0;i<8;i++) {
                     printf("\n%d %s %d", i+1, squadre[i], punti[i]);
    }
    getchar();getchar();
    return 0;
    }
    [/spoiler]
    e questo è l'errore che viene fuori al rigo 35 (il printf finale, nel for):
    codice:
    35 C:\Users\Utente\Desktop\c++\esercizio con vettore stringa\main.cpp [Warning] cannot pass objects of non-POD type `struct std::string' through `...'; call will abort at runtime
    Da quel che so e che posso penasre credo sia sbagliato il modo di stampare il vettore squadre ma non ne son sicuro. Qualcuno può aiutarmi? :bai

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    non saprei cmq è un warning non un errore..

  3. #3
    Non puoi passare un oggetto std::string alla printf, che si aspetta un char *. Per ottenere da un std::string un const char * usa il metodo c_str():
    codice:
                     printf("\n%d %s %d", i+1, squadre[i].c_str(), punti[i]);
    .
    Tra l'altro, perché usi le funzioni di IO del C anche se stai lavorando in C++?
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Ho modificato come mi hai detto e ora non restituisce più un messaggio di errore dal compilatore, ma direttamente nel programma:
    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.

    Tra l'altro, perché usi le funzioni di IO del C anche se stai lavorando in C++?
    Se mi spieghi cos'è ti rispondo

  5. #5
    Originariamente inviato da kingfelix
    Ho modificato come mi hai detto e ora non restituisce più un messaggio di errore dal compilatore, ma direttamente nel programma:
    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
    Credo che il problema stia qui:
    codice:
                     scanf("%s", &squadre[i]);
    non puoi usare la scanf con le stringhe C++! In questa maniera vai a sovrascrivere i campi interni dell'oggetto string con dati che non c'entrano. Usa piuttosto la funzione getline e gli stream C++.
    codice:
    getline(cin, squadre[i]);
    Ah, manca anche l'include all'inizio
    codice:
    #include <string>
    .
    Se mi spieghi cos'è ti rispondo
    In due parole: perché usi scanf e printf invece di cin e cout?
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Stessa cosa, si blocca dopo aver inserito squadre e punteggi. :S

    Perché uso scanf e printf? Da quanto ne so cin e cout appartengono al c, queste altre 2 funzioni sono del c++.

    EDIT:

    Funzionaaa

    Ho provato un po' di cose oltre a quella che mi ha suggerito, quindi non ricordo quale sia stata quella che ha aggiustato il tutto, comunque son sicuro che sia stata la tua
    Inoltre c'era anche un errore nella logica dell'ordinamento, infatti la prima casella rimaneva vuota.
    Ecco il codice finale se siete curiosi:
    codice:
    #include <cstdlib>
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    string squadre[8];
    string app1[1];
    int punti[8], i, app, interr, c;
    
    for(i=0;i<8;i++) {
                     printf("Inserisci la %da squadra: ", i+1);
                     getline(cin, squadre[i]);
                     printf("Inserisci il suo punteggio: ");
                     scanf("%d", &punti[i]);
                     getchar();
    }
    do {
        interr = 0;
        for(i=0;i<8;i++) {
                         if (punti[i]>punti[i+1]) {
                                                  app = punti[i];
                                                  punti[i] = punti[i+1];
                                                  punti[i+1] = app;
                                                  app1[0] = squadre[i];
                                                  squadre[i] = squadre[i+1];
                                                  squadre[i+1] = app1[0];
                                                  interr=1;
                                                  }
                         }
    }
    while(interr==1);
    printf("Ecco la classifica: ");
    for(i=7, c=1;i>=0;i--,c++) {
                     printf("\n%d %s %d", c, squadre[i].c_str(), punti[i]);
    }
    getchar();
    return 0;
    }

    Grazie a tutti per la collaborazione

    AH UNA COSA!
    Ricordo che il prof ci ha consigliato di usare una cosa del tipo gets(vet[i]); al posto di scanf o getline(cin, squadre[i]);, qual è melgio utilizzare?

  7. #7
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    il cin e cout sono del c++ non del c..

  8. #8
    oh my god... insomma le basi che ci ha insegnato il nostro prof sono sbagliate... buono a sapersi :\

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da kingfelix
    oh my god... insomma le basi che ci ha insegnato il nostro prof sono sbagliate... buono a sapersi :\
    Beh ... c'e' anche una vaga possibilità che tu non sia stato attento durante la spiegazione ... no?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.