Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Pomoc z programem (poziom maturalny)

Ostatnio zmodyfikowano 2017-03-29 18:09
Autor Wiadomość
MsWarfare123
Temat założony przez niniejszego użytkownika
Pomoc z programem (poziom maturalny)
» 2017-03-28 20:41:49
Witam, mam pewien problem z zadaniem o danej treści:

"W pliku hasla.txt znajduje się zestaw 2000 haseł. W każdej linii umieszczona jest para haseł.
Każde hasło zapisane jest wielkimi literami alfabetu łacińskiego.
Utwórz wszystkie możliwe trójki bez powtórzeń z liter A, B, C.
Wypisz te hasła, w których którakolwiek z trójek wystąpiła więcej niż jeden raz. Jeśli
w danym haśle wystąpiły wielokrotnie różne trójki to wypisz to hasło tylko raz.
Dodatkowo wypisz ile razy każda trójka wystąpiła w pliku."

Wypisanie ile razy każda trójka wystąpiła w pliku niby nie powinno być problemem, lecz wyniki zawsze różnią się o 2, 3 albo 1 (czasami się zgadzają)

Natomiast z wypisaniem haseł w których którakolwiek trójka wystąpiła więcej niż jeden raz nie mogę sobie kompletnie poradzić

Z góry za pomoc dziękuję
Oto mój obecny kod:
C/C++
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    fstream plik, wynik;
    string slowo1;
    string slowo2;
    string wariacja[ 5 ];
    wariacja[ 0 ] = "ABC";
    wariacja[ 1 ] = "ACB";
    wariacja[ 2 ] = "BAC";
    wariacja[ 3 ] = "BCA";
    wariacja[ 4 ] = "CAB";
    wariacja[ 5 ] = "CBA";
    int zliczanie[ 6 ] = { 0, 0, 0, 0, 0, 0 };
    plik.open( "hasla.txt", ios::in | ios::out );
    wynik.open( "wyniki.txt", ios::out | ios::app );
    if( plik.good() == true ) {
        while( !plik.eof() ) {
            plik >> slowo1 >> slowo2;
           
            for( int i = 0; i < 6; i++ )
            {
               
                if( slowo1.find( wariacja[ i ] ) != string::npos || slowo2.find( wariacja[ i ] ) != string::npos )
                {
                    zliczanie[ i ] ++;
                   
                   
                }
               
            }
        }
        for( int i = 0; i < 5; i++ )
        {
            wynik << wariacja[ i ] << " " << zliczanie[ i ] << endl;
           
        }
        plik.close();
        wynik.close();
       
        return 0;
    }
}
P-159547
darko202
» 2017-03-29 11:13:19
1.
>> Natomiast z wypisaniem haseł w których którakolwiek trójka wystąpiła więcej niż jeden raz nie mogę sobie kompletnie poradzić

poszukiwanie takiego samego tekstu  powinno wyglądać jakoś tak
C/C++
std::string str( "There are two needles in this haystack with needles." );
std::string str2( "needle" );

// different member versions of find in the same order as above:
std::size_t found = str.find( str2 );
if( found != std::string::npos )
     std::cout << "first 'needle' found at: " << found << '\n';

found = str.find( str2, found + 1, 6 ); //drugie szukanie od pozycji+1 znalezienia poprzedniego ciągu znaku
if( found != std::string::npos )
     std::cout << "second 'needle' found at: " << found << '\n';

przykład z
http://www.cplusplus.com​/reference/string/string/find/

2.
>> Wypisanie ile razy każda trójka wystąpiła w pliku niby nie powinno być problemem, lecz wyniki zawsze różnią się o 2, 3 albo 1 (czasami się zgadzają)

trudno jest powiedzieć dlaczego program przy każdym wykonaniu zwraca różne wyniki
nie widać elementów które mogłyby na to wpłynąć

jedynym elementem który bym o to podejrzewał to linia
 plik >> slowo1 >> slowo2;
być może w pliku hasła są jakieś znaki które są czasami różnie interpretowane
tzn. kończą słowo  
może być sytuacja gdzie np. słowo1 = "ADFRABC" a słowo2= <coś co nie jest stringiem>
przy kolejnym wywołaniu słowa są wczytywane inaczej tzn. dzielone

jaki to system operacyjny w tym 32/64 bit ?
jakiego kompilatora (narzędzia) używasz  ?


uwaga na boku :
znalazłem na
http://forum.hotfix.pl​/webmastering​/wczytywanie-z-pliku-tekstowego-do-tablicy-stringow-t10514.html
"problem nieciągłości stringa"
nie widzę tekstu, bo nie jestem zalogowany, dlatego nie mogę zrozumieć na czym to polega.
a wcześniej nie spotkałem się z tym problemem

podobnie :
"Widzę że piszesz w C++, a używasz funkcji z C, co nie jest złe. Nie mniej jednak proponuję, użycie nagłówka fstream.h z C++"

z
http://www.cplusplus.com​/reference/cstdio/fopen/
fopen z std  (C++ library)
http://www.cplusplus.com​/reference/fstream/ifstream​/open/
open z fstream  (C library)


3.
z treści zadania nie wynika (przynajmniej ja nie widzę) dlaczego równocześnie badasz oba hasła z linii 
chyba można to rozdzielić
C/C++
while( !plik.eof() ) {
    plik >> slowo1 >> slowo2;
   
    for( int i = 0; i < 6; i++ )
    {
       
        if( slowo1.find( wariacja[ i ] ) != string::npos )
        {
            zliczanie[ i ] ++;
           
           
        }
        if( slowo2.find( wariacja[ i ] ) != string::npos )
        {
            zliczanie[ i ] ++;
           
           
        }
       
    }
P-159563
MsWarfare123
Temat założony przez niniejszego użytkownika
» 2017-03-29 18:09:45
Dziękuję za pomoc, zwłaszcza za pierwszy punkt, bardzo się przydał :)

Zadanie zostało rozwiązane
P-159577
« 1 »
  Strona 1 z 1