Anagram (matura 2010)
Kod był wyświetlany 5212 razy.
    /*
  Name: Anagram (matura 2010)
  Copyright: GPL GNU
  Author: Przemyslaw Sierocinski
  Date: 31-05-10 20:48
  Description: 
    
Anagram to słowo powstałe z innego słowa przez przestawienie liter. Przez słowo rozumiemy w tym zadaniu dowolny ciąg (malych) liter alfabetu  łacińskiego.

    Przykłady anagramów:
        dla słowa: barok – korba, robak, arobk, rokab, orkab …
        dla słowa: ranty – tyran, narty, ntyra, natyr, ytnar …
    
    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.
    
    Przykład:
        abcd cdba dbac cbad dcba
        barbakan xle ala foto otof
        smok ayszkm lampa ayszkm bakara
        skok arabanta oko agnieba dyskietka
        ……
        
    Napisz program w wybranym przez siebie języku programowania, za pomocą 
    którego wykonasz poniższe polecenia:
        
        a) 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. Zapisz te 
        wiersze w pliku odp_4a.txt.
        b) Wyszukaj w pliku anagram.txt wszystkie wiersze tekstu, w których 
        wszystkie słowa są anagramami pierwszego słowa w danym wierszu. Zapisz 
        te wiersze w pliku odp_4b.txt.
        
        Dziala, ale nie jest do konca prawidlowe.
*/

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main()
{
    bool anagram;
    int i,n,alfabet[5][26];
    unsigned l,j,k;
    string tmp;
    vector<string> dane;
    ifstream wej("anagram.txt");
    ofstream a("odp_4a.txt"),b("odp_4b.txt");
    if(!wej||!a||!b)
    {
        cout<<"\n\n\tBlad pliku.";
        getchar();
        return 0;
        }
    
    /* wczytanie danych */
    for(n=0;!wej.eof();n++) 
    {
        wej>>tmp;
        dane.push_back(tmp);
        }
    n--; 
    wej.close();
    
    /* a) */
    for(i=0;i<n;i+=5)
    {
        l=dane[i].length();
        if(l==dane[i+1].length()) // Dlugosci...
        {                           // wszystkich...
            if(l==dane[i+2].length()) // piecu...
            {                           // slow...
                if(l==dane[i+3].length()) // z linii...
                {                           // sa...        
                    if(l==dane[i+4].length()) // rowne.
                    {
                        for(j=0;j<5;j++)
                        a<<dane[i+j]<<" "; // przepisz linie do odp_4a.txt
                        a<<endl;
                    
                        /* b) */
                        anagram=true;
                        
                        for(j=1;j<5;j++) // jesli ktores slowo
                        if(dane[i]==dane[i+j]) // jest takie samo jak pierwsze
                        anagram=false; // to nie jest jego anagramem
                        // if(!anagram)
                        // continue;
                        
                        for(j=0;j<5;j++) 
                            for(k=0;k<26;k++)
                            alfabet[j][k]=0; // wyzerowanie tablicy na litery
                            
                        for(j=0;j<5;j++) // dla kazdego slowa
                            for(k=0;k<l;k++) // dla kazdego jego znaku
                            alfabet[j][dane[i+j][k]-'a']++; // zliczenie liter
                            
                        for(k=0;k<26;k++) // dla kazdej litery alfabetu
                        { // porownanie jej wystapien w kazdym slowie
                            if(alfabet[0][k]==alfabet[1][k])
                                if(alfabet[1][k]==alfabet[2][k])
                                    if(alfabet[2][k]==alfabet[3][k])
                                        if(alfabet[3][k]==alfabet[4][k])
                                        continue; // jesli rowne - nastepny cykl
                            anagram=false; // to nie anagramy
                            break;
                            }
                        
                        if(anagram)
                        {
                            for(j=0;j<5;j++)
                            b<<dane[i+j]<<" "; // przepisz linie do odp_4b.txt
                            b<<endl;
                            }
                        }   
                    }
                }
            }
        }
    a.close();
    b.close();
    
    cout<<"\n\n\tGotowe. Sprawdz pliki odp_4a.txt i odp_4b.txt.";
    getchar();
    return 0;
} 
    
Pobierz plik tekstowy
Administrator WJL
PHP&SQL coded by NOVA-IT