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

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;
}

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;
}
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ę.

2

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.

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