hurricane Temat założony przez niniejszego użytkownika |
Wczytywanie EOF przez automatyczną sprawdzarkę » 2014-06-28 21:13:25 Szanowni Państwo, Piszę proste programy do zadań ze strony http://main.edu.pl/pl. Wszystko szło dobrze dopóki nie spotkałem zadania gdzie na wyjściu mają być dane tekstowe. Napisałem 3 programy korzystające z różnych typów zmiennych i metod "wyrzucania" danych, każdy program jak dla mnie działa dobrze, ale zawsze serwer podaje komunikat "zła odpowiedź. W szczegółach dowiedziałem się,że mój program zawsze wyrzuca EOF. Poczytałem pobieżnie na ten temat, ale niestety powiązań nie widzę. Byłbym wdzięczny za wszelkie sugestie. Po drugie (w powiązaniu z tematem) chciałbym poprosić o krótkie wyjaśnienie, jak wyglądają dane tekstowe w c++ w kontekście znaku 0 na końcu łańcucha. Co to takiego jest i co się dzieje jak tego nie ma? Poniżej kod jednej z trzech wersji "Szyfru Cezara" (jakby potrzeba było to objaśnię zagadnienie, ale założyłem że błąd nie tkwi w samym algorytmie, wrzucam więc dla reguły). #include <iostream> #include <string> #include <cstdio> #include <cstring>
using namespace std;
int mod( int a, int b ) { if( a % b < 0 ) { return a % b + b; } else { return a % b; } }
int main() { string opcja; cin >> opcja; int k; cin >> k; char x[ 10000 ]; cin.sync(); gets( x ); if( opcja == "szyfruj" ) { for( int i = 0; i < strlen( x ); i++ ) { if( static_cast < int >( x[ i ] ) >= 97 && static_cast < int >( x[ i ] ) < 123 ) { x[ i ] = static_cast < char >( mod((( static_cast < int >( x[ i ] ) - 97 ) + k ), 26 ) + 97 ); } if( static_cast < int >( x[ i ] ) >= 65 && static_cast < int >( x[ i ] ) < 91 ) { x[ i ] = static_cast < char >( mod((( static_cast < int >( x[ i ] ) - 65 ) + k ), 26 ) + 65 ); } } } if( opcja == "odszyfruj" ) { for( int i = 0; i < strlen( x ); i++ ) { if( static_cast < int >( x[ i ] ) >= 97 && static_cast < int >( x[ i ] ) < 123 ) { x[ i ] = static_cast < char >( mod((( static_cast < int >( x[ i ] ) - 97 ) - k ), 26 ) + 97 ); } if( static_cast < int >( x[ i ] ) >= 65 && static_cast < int >( x[ i ] ) < 91 ) { x[ i ] = static_cast < char >( mod((( static_cast < int >( x[ i ] ) - 65 ) - k ), 26 ) + 65 ); } } } printf( "%s", x ); int i = 0; return 0; }
|
|
pekfos |
» 2014-06-28 21:23:36 W szczegółach dowiedziałem się,że mój program zawsze wyrzuca EOF |
Cytat..? chciałbym poprosić o krótkie wyjaśnienie, jak wyglądają dane tekstowe w c++ w kontekście znaku 0 na końcu łańcucha. Co to takiego jest i co się dzieje jak tego nie ma? |
Tekst w C++ to c-stringi, zakończone znakiem zera. Bez zera nie ma c-stringa i takich danych nie można użyć jako tekstu w większości funkcji. |
|
hurricane Temat założony przez niniejszego użytkownika |
» 2014-06-29 22:40:01 Cytuję (podanie linku jest niemożliwe)
Raport
Data: 2014-06-25 22:52:53 Wynik: 600 Komentarz: Zadanie: szy/Szyfr Cezara Data: 2014-06-28 20:36:18 Wynik: 0/100 Pliki: rozwiązanie Test Wynik Czas/Limit Punkty 0a Zła odpowiedź1 0.01s/10.00s 0/0 0b Zła odpowiedź2 0.00s/10.00s 0/0 1 Zła odpowiedź3 0.00s/10.00s 0/9 2 Zła odpowiedź4 0.00s/10.00s 0/9 3 Zła odpowiedź5 0.00s/10.00s 0/9 4 Zła odpowiedź6 0.00s/10.00s 0/9 5 Zła odpowiedź7 0.00s/10.00s 0/9 6 Zła odpowiedź8 0.00s/10.00s 0/9 7 Zła odpowiedź9 0.00s/10.00s 0/9 8 Zła odpowiedź10 0.00s/10.00s 0/9 9 Zła odpowiedź11 0.00s/10.00s 0/9 10 Zła odpowiedź12 0.00s/10.00s 0/9 11 Zła odpowiedź13 0.00s/10.00s 0/10 1 wczytano EOF, a oczekiwano 'Xedkw' 2 wczytano EOF, a oczekiwano 'Szyfr' 3 wczytano EOF, a oczekiwano 'Zkz' 4 wczytano EOF, a oczekiwano 'Ala' 5 wczytano EOF, a oczekiwano 'Tqspcvk' 6 wczytano EOF, a oczekiwano 'Sprobuj' 7 wczytano EOF, a oczekiwano '"nyT!Aw' 8 wczytano EOF, a oczekiwano '"xiD!Kg' 9 wczytano EOF, a oczekiwano 'K"pKhA(hGl,rq?qfkh?XR;ccU' 10 wczytano EOF, a oczekiwano ')a-C"e.;?-cGw(qT-:k' 11 wczytano EOF, a oczekiwano 'D()PzePelH,jo;fl'FWilMW:f;L-b?!vOX::!VP!e..!!"BeS;i!?D!'":Xyeds' 12 wczytano EOF, a oczekiwano 'S()EotEtaW,yd;ua'ULxaBL:u;A-q?!kDM::!KE!t..!!"QtH;x!?S!'":Mntsh' 13 wczytano EOF, a oczekiwano ')jkI,ukgcshq,Ybfd)h?xe!z:v)NgJpJu(uYwj"Q(v.bfLgj"ro;lonbdcu;"eZx.vmw.,P'
|
|
Monika90 |
» 2014-06-29 23:10:28 Co to wg Ciebie robi? Nie ma takiej funkcji. (oficjalnie jeszcze jest, ale jej dni są policzone, bo to zła funkcja, bardzo zła) "wzytano EOF" prawdopodobnie znaczy, że nic nie wczytano, tzn. Twój program nie wyprodukował żadnego wyjścia. Powinieneś usuwać ze strumienia białe znaki (zwłaszcza \n) po wczytaniu opcji, a przd wczytaniem tekstu do szyfrowania. |
|
hurricane Temat założony przez niniejszego użytkownika |
» 2014-06-30 12:28:24 Niezbyt zrozumiałem: jak usunąć ze strumienia białe znaki? Rozumiem problem z gets(x), ale poniżej wstawiam kod z użyciem getline(x), wyskakuje ten sam błąd. A co do cin.sync() - bez tego getline() oraz gets(x) wczytywały mi białe znaki. #include <iostream> #include <string>
using namespace std;
int mod( int a, int b ) { if( a % b < 0 ) { return a % b + b; } else { return a % b; } }
int main() { string opcja; cin >> opcja; int k; cin >> k; string x; std::cin.sync(); getline( cin, x ); string odp = ""; if( opcja == "szyfruj" ) { for( int i = 0; i < x.length(); i++ ) { bool czy = 1; if( static_cast < int >( x[ i ] ) >= 97 && static_cast < int >( x[ i ] ) < 123 ) { odp = odp + static_cast < char >( mod((( static_cast < int >( x[ i ] ) - 97 ) + k ), 26 ) + 97 ); czy = 0; } if( static_cast < int >( x[ i ] ) >= 65 && static_cast < int >( x[ i ] ) < 91 ) { odp = odp + static_cast < char >( mod((( static_cast < int >( x[ i ] ) - 65 ) + k ), 26 ) + 65 ); czy = 0; } if( czy ) { odp = odp + x[ i ]; } } } if( opcja == "odszyfruj" ) { for( int i = 0; i < x.length(); i++ ) { bool czy = 1; if( static_cast < int >( x[ i ] ) >= 97 && static_cast < int >( x[ i ] ) < 123 ) { odp = odp + static_cast < char >( mod((( static_cast < int >( x[ i ] ) - 97 ) - k ), 26 ) + 97 ); czy = 0; } if( static_cast < int >( x[ i ] ) >= 65 && static_cast < int >( x[ i ] ) < 91 ) { odp = odp + static_cast < char >( mod((( static_cast < int >( x[ i ] ) - 65 ) - k ), 26 ) + 65 ); czy = 0; } if( czy ) { odp = odp + x[ i ]; } } } cout << odp; return 0; } |
|
Monika90 |
» 2014-06-30 12:36:34 żeby usunąć znak przejścia do nowej linii który zostaje w strumieniu po wykonaniu string opcja; cin >> opcja;
int k; cin >> k;
dodaj to: std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');a std::cin.sync(); wywal, bo ja nie wiem co to robi |
|
hurricane Temat założony przez niniejszego użytkownika |
» 2014-06-30 12:44:18 Dziękuję za wszelką udzieloną pomoc. Ostatecznie postąpiłem według kursu z niniejszej strony, rozdział 9 http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Obsluga-strumienia-wejsciowego/12 Jak się okazało, programy są wywoływane na Linuxie, więc dopiero kod std::cin.clear(); std::cin.ignore( 1000, '\n' );
Sprawił, że rozwiązanie uznano za poprawne. Spróbowałem też użyć metody opisanej przez Monika90, jakkolwiek nie wiem, do jakiej biblioteki należy numeric_limits, kompilator nie chciał go przyjąć. Podsumowując, ponownie dziękuję za pomoc. |
|
« 1 » |