Nieprawidłowe wyniki Matura 2011 - Liczby inaczej (C++)

Odpowiedz Nowy wątek
2015-01-23 22:19
0

Witam, jestem licealistą i przygotowuję się do pisania w tym roku matury z informatyki. W tym celu rozwiązuję arkusze z zeszłych lat i ostatnio zagięło mnie pewne zadanie, a dokładniej, wspomniane w tytule, "Liczby inaczej" z roku 2011. W kodzie nie udało mi się znaleźć błędu, jednak jako początkujący podejrzewam, że coś pominąłem.

Zadaniem tego kodu ma być wczytanie 1000 liczb zapisanych w systemie binarnym w pliku liczby.txt, a następnie wykonanie na nim paru operacji, tj. policzenia liczb parzystych i policzenie liczb posiadających dokładnie 9 znaków. I tu się pojawił problem, ponieważ gdy poprawna odpowiedź na pytanie o liczby parzyste wynosi 497, a na drugie zadanie 101, to w wyniku niestety zwykle dostaję liczbę różniącą się (całkowicie losowo) o około 2, jednak czasem zdarza się i większa różnica.
Nie jestem w stanie sam określić na czym polega problem i jak go rozwiązać. Będę wdzięczny za wszystkie sensowne sugestie.
Do prawidłowego działania wymagany jest plik liczby.txt (załącznik), a generowany jest plik Zadanie6.txt, który w teorii ma zawierać odpowiedzi na wszystkie pytania.
Kod (C++):


#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, char** argv) {

    ////////////////////////////// Wgranie do tablicy 1-wymiarowej  
    int i=0;
    char Plik[16000];
    ifstream liczby;

    ofstream odpowiedz;
    odpowiedz.open("zadanie6.txt");

    liczby.open("liczby.txt");
    while(!liczby.eof()){
        liczby.get(Plik[i]);
        i++;
    }
    liczby.close();
    ////////////////////////////// Wgranie do tablicy 2-wymiarowej      
    char Tablica[16][1000];
    int x=0,y=0;

    for (i=0;i<strlen(Plik);i++){
        if(Plik[i]=='0'||Plik[i]=='1'){
            Tablica[x][y]=Plik[i];
            x++;
        }
        else{
            y++;
            x=0;
        }
    }
    ////////////////////////////// Dopisuje zera na początku każdego wiersza - tj.  1101 ----- 00001101
    for(y=0;y<1000;y++){
        while(Tablica[15][y]!='0'&&Tablica[15][y]!='1'){
            for(x=15;x>=0;x--){
                Tablica[x][y]=Tablica[x-1][y];
            }
            Tablica[0][y]='0';
        }   
    }
    ////////////////////////////// a) - Liczby parzyste
    int s=0;
    for (i=0;i<1000;i++){
        if (Tablica[15][i]=='0'){
            s++;    
        }   
    }
    cout<<"Liczb parzystych w pliku jest: "<<s<<endl;
    odpowiedz<<"a) "<<s<<endl;
    ////////////////////////////// Wgranie liczby w dziesiętnym do tablicy jendo wymiarowej
    int Dzies[1000];
    int a=0;
    for(y=0;y<1000;y++){
        s=0;
        if(Tablica[15][y]=='1')
            s=s+1;
        if(Tablica[14][y]=='1')
            s=s+2;
        if(Tablica[13][y]=='1')
            s=s+4;
        if(Tablica[12][y]=='1')
            s=s+8;
        if(Tablica[11][y]=='1')
            s=s+16;
        if(Tablica[10][y]=='1')
            s=s+32;
        if(Tablica[9][y]=='1')
            s=s+64;
        if(Tablica[8][y]=='1')
            s=s+64*2;
        if(Tablica[7][y]=='1')
            s=s+64*4;
        if(Tablica[6][y]=='1')
            s=s+64*8;
        if(Tablica[5][y]=='1')
            s=s+64*16;
        if(Tablica[4][y]=='1')
            s=s+64*32;
        if(Tablica[3][y]=='1')
            s=s+64*64;
        if(Tablica[2][y]=='1')
            s=s+64*64*2;
        if(Tablica[1][y]=='1')
            s=s+64*64*4;
        if(Tablica[0][y]=='1')
            s=s+64*64*8;
    Dzies[y]=s;
    }   
    ////////////////////////////// b) - Znalezienie najwiekszej liczby
    s=0;
    for (i=0;i<1000;i++){
        if(Dzies[i]>s){
            s=Dzies[i];
            y=i;    
        }
    }
    cout<<"Najwieksza liczba, to:\n"<<s<<" w systemie dziesietnym."<<endl;
    odpowiedz<<"b) "<<s<<endl;
    for (i=0;i<16;i++){
        cout<<Tablica[i][y];
        odpowiedz<<Tablica[i][y];
    }
    odpowiedz<<endl;
    cout<<" w systemie binarnym."<<endl;
    ////////////////////////////// 
    s=0;
    a=0;
    for (i=0;i<1000;i++){
        if(Tablica[0][i]=='0'&&Tablica[1][i]=='0'&&Tablica[2][i]=='0'&&Tablica[3][i]=='0'&&Tablica[4][i]=='0'&&Tablica[5][i]=='0'&&Tablica[6][i]=='0'&&Tablica[7][i]=='1'){
            a++;
            s=s+Dzies[i];
        }
    }
    cout<<"Liczb skladajacych sie z 9 cyfr jest: "<<a<<endl<<"Ich suma, to:"<<endl<<s<<" w systemie dziesietnym."<<endl;

    odpowiedz.close();

    return 0;
}

Pozostało 580 znaków

2015-01-24 00:01
Wielki Młot
1
int main()
{
  std::ifstream in("liczby.txt");
  uint32_t even_count = 0, nine_digits_count = 0;
  std::for_each(std::istream_iterator<std::string>(in), std::istream_iterator<std::string>(), [&](const std::string& s) { 
    auto len = s.length(); 
    even_count += (s[len - 1] == '0'); 
    nine_digits_count += (len == 9); 
  });

  std::ofstream out("Zadanie6.txt");
  out << even_count << std::endl << nine_digits_count;
  return 0;
}
Zapomniałem się zalogować :/ - satirev 2015-01-24 00:03

Pozostało 580 znaków

2015-02-05 14:56
0

Dziękuję za podanie mi rozwiązania, jednak jeżeli to możliwe, chciałbym, aby ktoś wytłumaczył mi czemu nie działa prawidłowo kod, który sam napisałem.
Z góry dziękuję.

Pozostało 580 znaków

2015-02-05 15:05

Poczytaj o odpluskwianiu kodu.

Możesz to robić na kilka sposobów:

  • przy pomocy printf/cout (forma tracingu)
  • przy pomocy debugera
  • przez "wyrywanie nóżek": wyłączasz to co niepotrzebne i patrzysz czy się jeszcze rusza. Potem dokładasz z powrotem funkcje.

Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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