Matura Maj 2010 - P. Roz.

0

Siema wszystkim!

Mam problem z zadaniem maturalnym, na poziomie rozszerzonym. Program spisuje mi o 1 grupę wyrazów za dużo (ostatnia linijka, w nowo utworzonym pliku wyniki.txt).

Byłbym NAPRAWDĘ wdzięczny gdyby ktoś potrafił znaleźć w moim kodzie błąd, a nie po prostu pisać od nowa własny.


Polecenie :
W pliku tekstowym anagram.txt znajduje się 200 wierszy zawierających po 5 słów w każdym wierszu. Słowa oddzielone są znakiem odstępu. Długość każdego ze słów wynosi od 1 do 20 znaków.

  • Wyszukaj w pliku anagram.txt te wiersze, w których wszystkie słowa znajdujące się w danym wierszu mają taką samą liczbę znaków.
#include <iostream>
#include <cstring>
#include <fstream>
#include <cstdlib>

using namespace std;

int main()
{
    string anagramy[201];
    string slowoa[10];
    int i=0;
    int max,h;
    string chwilowka;
    int dlugosc, dlugoscdwa;
    string temp,slowo;
    int w,g;
    int maxdl;

    ifstream anagram;
    ofstream wyniki;

    anagram.open("anagram.txt");
    wyniki.open("wyniki.txt");
    g=0;
    w=1;
    maxdl=0;

    // PRZEPISYWANIE DO TABLICY! //
    while(!anagram.eof())
    {
        i=i+1;
        getline(anagram, anagramy[i]);
    }

    max=i;

    //Główna petla programu!//

    for(i=1;i<=max;i++)
    {
        dlugosc=anagramy[i].length();
        chwilowka=anagramy[i];

        for(h=0;h<=dlugosc;h++)
        {
            if(isspace(chwilowka[h]))
            {
                w=w+1;
            }
            else
            {
                temp=chwilowka[h];
                slowoa[w]=slowoa[w]+temp;
            }
        }

        for(w=1;w<=4;w++)
        {
            dlugosc=slowoa[w].length();
            dlugoscdwa=slowoa[4].length();

            if(dlugosc!=dlugoscdwa)
            {
                g=1;
            }
        }

        if(g==0)
        {
            wyniki<<slowoa[1]+" "+slowoa[2]+" "+slowoa[3]+" "+slowoa[4]+" "+slowoa[5]<<endl;
        }

        /* Czyszczenie zawartosci zmiennych */
        g=0;
        w=1;
        slowoa[1].clear();
        slowoa[2].clear();
        slowoa[3].clear();
        slowoa[4].clear();
        slowoa[5].clear();
    }

    wyniki.close();
    anagram.close();

    cout<<"Koniec. Wcisnij ENTER.";
    getchar();
    return 0;
}

Problem jest w tym, że właśnie znajduje mi na końcu 1 wiersz, który nie ma równej ilości znaków.

Z góry dziękuję i pozdrawiam!

0

a ja byłbym naprawdę wdzięczny gdybyś sformatował normalnie kod (tak by dało się go czytać) i umieścił kod tutaj w znacznikach. Tego się nie da czytać.

0
#include <iostream>
#include <cstring>
#include <fstream>
#include <cstdlib>

using namespace std;

int main()
{
    string anagramy[201];
    string slowoa[10];
    int i=0;
    int max,h;
    string chwilowka;
    int dlugosc, dlugoscdwa;
    string temp,slowo;
    int w,g;
    int maxdl;
    ifstream anagram;
    ofstream wyniki;
    anagram.open("anagram.txt");
    wyniki.open("wyniki.txt");
    g=0;
    w=1;
    maxdl=0;
    /* PRZEPISYWANIE DO TABLICY! */
    while(!anagram.eof())
    {
        i=i+1;
        getline(anagram, anagramy[i]);
    }
    max=i;
    /* Główna petla programu! */
    for(i=1; i<=max; i++)
    {
        dlugosc=anagramy[i].length();
        chwilowka=anagramy[i];
        /* Petla ktora rozdziela caly wiersz na pojedyncze slowa */
        for(h=0; h<=dlugosc; h++)
        {
            /* Sprawdzanie czy znakiem jest spacja */
            if(isspace(chwilowka[h]))
            {
                w=w+1; // kolejne znaki beda dodawane do kolejnego, nowego slowa
            }
            /* Jezeli znakiem nie jest spacja, to zostanie on dodany do słowa */
            else
            {
                temp=chwilowka[h];
                slowoa[w]=slowoa[w]+temp;
            }
        }
        /* Porównywanie slów 1,2,3,4 z 5 */
        for(w=1; w<=4; w++)
        {
            dlugosc=slowoa[w].length();
            dlugoscdwa=slowoa[4].length();
            if(dlugosc!=dlugoscdwa)
            {
                g=1;
            }
        }
        /* Zapisywanie do plików wierszy, których słowa maja taka sama ilość znaków */
        if(g==0)
        {
            wyniki<<slowoa[1]+" "+slowoa[2]+" "+slowoa[3]+" "+slowoa[4]+" "+slowoa[5]<<endl;
        }
        /* Czyszczenie zawartosci zmiennych */
        g=0;
        w=1;
        slowoa[1].clear();
        slowoa[2].clear();
        slowoa[3].clear();
        slowoa[4].clear();
        slowoa[5].clear();
    }
    wyniki.close();
    anagram.close();
    cout<<"Koniec. Wcisnij ENTER.";
    getchar();
    return 0;
}
0

Normalne formatowanie wygląda tak:

#include <iostream>
#include <cstring>
#include <fstream>
#include <cstdlib>

using namespace std;

int main()
{
    string anagramy[201];
    string slowoa[10];
    int i=0;
    int max,h;
    string chwilowka;
    int dlugosc, dlugoscdwa;
    string temp,slowo;
    int w,g;
    int maxdl;
    ifstream anagram;
    ofstream wyniki;
    anagram.open("anagram.txt");
    wyniki.open("wyniki.txt");
    g=0;
    w=1;
    maxdl=0;
    // PRZEPISYWANIE DO TABLICY! //
    while(!anagram.eof())
    {
        i=i+1;
        getline(anagram, anagramy[i]);
    }
    max=i;
    //Główna petla programu!//
    for(i=1; i<=max; i++)
    {
        dlugosc=anagramy[i].length();
        chwilowka=anagramy[i];

        for(h=0; h<=dlugosc; h++)
        {
            if(isspace(chwilowka[h]))
            {
                w=w+1;
            }
            else
            {
                temp=chwilowka[h];
                slowoa[w]=slowoa[w]+temp;
            }
        }
        /* Porównywanie slów 1,2,3,4 z 5 */
        for(w=1; w<=4; w++)
        {
            dlugosc=slowoa[w].length();
            dlugoscdwa=slowoa[4].length();
            if(dlugosc!=dlugoscdwa)
            {
                g=1;
            }
        }
        /* Zapsiywanie do plikow wierszy, ktorych slowa maja taka sama ilosc znakow */
        if(g==0)
        {
            wyniki<<slowoa[1]+" "+slowoa[2]+" "+slowoa[3]+" "+slowoa[4]+" "+slowoa[5]<<endl;
        }
        /* Czyszczenie zawartosci zmiennych */
        g=0;
        w=1;
        slowoa[1].clear();
        slowoa[2].clear();
        slowoa[3].clear();
        slowoa[4].clear();
        slowoa[5].clear();
    }
    wyniki.close();
    anagram.close();
    cout<<"Koniec. Wcisnij ENTER.";
    getchar();
    return 0;
}

A teraz przepisz ten kod jak czlowiek. Podziel go na jakieś sensowne, małe funkcje.

0

Poprawione. Czy tak jest lepiej ?

0
    while(getline(anagram,anagramy[i])) ++i;

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0