Avatar billede coldermars Nybegynder
19. december 2005 - 18:30 Der er 7 kommentarer

AccC++ loop på loop...crash

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using std::cout;
using std::cin;
using std::endl;
using std::sort;
using std::string;
using std::vector;


int main()
{
    vector<string> names;
    string name;
    int antal = 0;   
   
    cout << "Type in arbitrary words: ";                       
    while (cin >> name) {
        if (name == "q")
                break;
       
        names.push_back(name);
        ++antal;
    }   
   
    sort(names.begin(), names.end());
   
    cout << "Antal: " << antal << endl;
   
    //print the values in vector names to the screen
    for (int i = 0; i != antal; ++i) {
        cout << names[i] << endl;
    }   
       
   
    //nr. m element in the vector is analized
    for (int m = 0; m != antal; ++m) {
                 
        int k = 1;
       
        //nr. n element in the vector is analized
        for (int n = m+1; n != antal; ++n) {
           
            // if there is two identical words k will be incremented.
            // when m = 0, names[m-1] = names[-1]... therefore the switch statement.
            switch (((bool)m)) {
                case 0: {
                    if (names[m] == names[n]) {
                        ++k;
                    }
                }   
               
                case 1: {
                    if ((names[m] == names[n]) && (names[m] != names[m-1])) {
                        ++k;
                    }
                }
            }
        }       
         
        // when element m in the vector has been checked against the others
        cout << "Der er " << k << " ord paa formen " << names[m] << endl; 
    } 
 
  system("PAUSE");   
  return 0;
}


-----------------------------------
Dette lille program går mig på nerverne. Beskrivelse: indlæser nogle ord fra tastaturet, hvorefter programmet finder ud af, hvor mange gange de enkelte ord optræder i den vektor de er indlæst i. Ordene sorteres ved hjælp af sort() inden de udsættes 'loop på loop'.

Opgaven er fra bogen Accelerated C++: 3-3

Programmet kompileres uden problemer, men windows kan bestemt ikke lide det. Den kaster en fejlmeddelelse til skærmen og programmet går i stå.
Avatar billede jpk Nybegynder
19. december 2005 - 20:23 #1
Hvilken fejlmeddelelse?
Det virker fint hos mig (VC++ 7.1)
Avatar billede bertelbrander Novice
19. december 2005 - 20:40 #2
Skriver man ole pop ole går det galt.

Der er et problem med (names[m] != names[m-1]) hvis m er 0

jeg forstår ikke hvorfor:           
  switch (((bool)m)) {
Avatar billede arne_v Ekspert
19. december 2005 - 20:47 #3
prøv at sæt break ind i casene !
Avatar billede arne_v Ekspert
19. december 2005 - 21:01 #4
den switch skulle få den til at undlade at bruge m-1 hvis m=0, men det gør den
ikke p.g.a. den manglende break

(og ja det burde nok været kodet anderledes end med den switch, men ....)
Avatar billede coldermars Nybegynder
20. december 2005 - 00:33 #5
jeg har fået programmet til at virke ved indsætte breaks i den oprindelige switch statement. derudover var jeg nødt til at sætte en ny switch statement ind, hvor outputtet skulle skrives til skærmen:

---------------------------------------------

switch (((bool)m)) {
            case 0: {
                cout << "Der er " << k << " ord paa formen " << names[m] << endl;
                break;
            }
           
            case 1: {
                if (names[m] != names[m-1]) {
                    cout << "Der er " << k << " ord paa formen " << names[m] << endl;
                    break;
                }
            }
        }

------------------------------------------

idet programmet ellers skrev til skærmen for hvert element i vektoren selvom nogle elementer var ens

ex.

der er 3 ord på formen kylling
der er 1 ord på formen kylling
der er 1 ord på formen kylling

osv.

Jeg ville kun have den første udskrift.

Hvordan kan programmet optimeres? Nogle hint...
Avatar billede arne_v Ekspert
20. december 2005 - 00:36 #6
brug en map med ord som key og count som value
Avatar billede bertelbrander Novice
20. december 2005 - 00:40 #7
Måske noget i stil med:
    for (int m = 0; m != antal; ) {

        int k = 1;

        //nr. n element in the vector is analized
        for (int n = m + 1;  n != antal && names[m] == names[n]; ++n, k++) {
        // Just counting
        }

        cout << "Der er " << k << " ord paa formen " << names[m] << endl;
        m += k;
    }
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester