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

Wczytywanie EOF przez automatyczną sprawdzarkę

Ostatnio zmodyfikowano 2014-06-30 12:44
Autor Wiadomość
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).

C/C++
#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;
}
P-112896
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.
P-112897
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 '&quot;nyT!Aw'
8 wczytano EOF, a oczekiwano '&quot;xiD!Kg'
9 wczytano EOF, a oczekiwano 'K&quot;pKhA(hGl,rq?qfkh?XR;ccU'
10 wczytano EOF, a oczekiwano ')a-C&quot;e.;?-cGw(qT-:k'
11 wczytano EOF, a oczekiwano 'D()PzePelH,jo;fl'FWilMW:f;L-b?!vOX::!VP!e..!!&quot;BeS;i!?D!'&quot;:Xyeds'
12 wczytano EOF, a oczekiwano 'S()EotEtaW,yd;ua'ULxaBL:u;A-q?!kDM::!KE!t..!!&quot;QtH;x!?S!'&quot;:Mntsh'
13 wczytano EOF, a oczekiwano ')jkI,ukgcshq,Ybfd)h?xe!z:v)NgJpJu(uYwj&quot;Q(v.bfLgj&quot;ro;lonbdcu;&quot;eZx.vmw.,P'
P-112953
Monika90
» 2014-06-29 23:10:28

cin.sync();
Co to wg Ciebie robi?


gets( x );
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.
P-112959
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.
C/C++
#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;
}
P-112969
Monika90
» 2014-06-30 12:36:34
żeby usunąć znak przejścia do nowej linii który zostaje w strumieniu po wykonaniu
C/C++
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
P-112970
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-wejscioweg​o​/12 Jak się okazało, programy są wywoływane na Linuxie, więc dopiero kod
C/C++
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.
P-112971
« 1 »
  Strona 1 z 1