• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Matura 2013 zadanko pytanko!

0 głosów
1,120 wizyt
pytanie zadane 14 grudnia 2015 w C i C++ przez Memories Obywatel (1,410 p.)

 

Mam takie zadanie. Oczywiscie wiem, ze nie daje tego pliku "napisy", ale mam nadzieje, ze i bez tego zdolacie mi pomoc. Chodzi mi dokladnie o punkt b).

 

 

Tak wyglada moj kod.

#include<iostream>
#include<cstdlib>
#include<string>
#include<fstream>
using namespace std;

int main()
{
string a;
int z=0, j=0, l=0,k=0;
ifstream odczyt("napisy.txt");
if(!odczyt.is_open())
cout<<"Error";
else
{

	for(int i=0;i<1000;i++)
	{
		odczyt>>a;
		for(int i=2;i<=a.size();i++)
        {
		if(a[i]=='0')
            z++;
        if(a[i]=='1')
            j++;
        }
        if(z==j)
            k++;
	}
cout<<k;

}
odczyt.close();

return 0;
}

 

 

Mi wyswietla sie odpowiedz 5. Jednak poprawna odpowiedzia jest 110. Wie ktos gdzie mam blad ? Co robie zle ? Jesli ktos potrzebuje tego pliku niech napisze.

 

2 odpowiedzi

+1 głos
odpowiedź 14 grudnia 2015 przez draghan VIP (106,230 p.)

Pierwsza sprawa - nazywaj sensownie swoje zmienne. Nic nikomu nie mówi coś, co się nazywa a, j czy z. Szczególnie, kiedy nie piszesz dla siebie - a na egzaminie tak właśnie jest. ;)

Druga sprawa - nie rozumiem, dlaczego w pierwszym kodzie zaczynasz pętlę wewnętrzną od i = 2 - to nie ma sensu, przecież każdy łańcuch musisz przeszukać od samego początku.

Trzecia sprawa - nie iteruj aż i <= a.size(), bo wychodzisz poza zakres. Metoda std::string::size() zwraca liczbę elementów, a nie ostatni indeks. Powinno być i < a.size().

Twój ostatni kod jest prawie dobry. :) Poza tym wykraczaniem poza zakres a. Wystarczy tylko wyciągnąć porównywanie ilości zer i jedynek poza wewnętrznego fora. ;)

komentarz 14 grudnia 2015 przez Memories Obywatel (1,410 p.)
Tak tak, zaczynalem od 2 bo zmylilem sie czyms innym, ale poprawilem to co nie ;d (w drugim kodzie).

Mozesz mi wierzyc lub tez nie: przed chwila tez sie skumalem, ze wychodze poza zakres, wlasnie to zmienilem. Serio, tez to zauwazylem!

Dzieki jesli chodzi o te zmienne: kilka razy juz dostalem za to ochrzan, postaram sie nazywac to sensowniej, przepraszam!

 

Co do ostatniego: wyciagnalem tego ifa o ktorym mowisz (te porownywanie 0 i 1), pokazuje mi wtedy 1 ;/.
komentarz 14 grudnia 2015 przez draghan VIP (106,230 p.)
else
{
 
    for(int i=0;i<1000;i++)
    {
        odczyt>>a;
        for(int i=0;i<a.size();i++)
        {
        if(a[i]=='0')
            z++;
        if(a[i]=='1')
            j++;
        }
        if(z==j)
            k++; 
    }
cout<<k;
 
}

 

komentarz 14 grudnia 2015 przez Memories Obywatel (1,410 p.)
Dookladnie tak juz mam :D
komentarz 14 grudnia 2015 przez draghan VIP (106,230 p.)
No to super. :) Cieszę się, że rozwiązałeś swój problem. :)

Rozumiem, że zamierzasz pisać maturę z informatyki? Jeśli tak, to czy można wiedzieć, kiedy?
komentarz 14 grudnia 2015 przez Memories Obywatel (1,410 p.)
Pisze ja w tym roku :D.

Skad zaciekawienie ? :D
komentarz 14 grudnia 2015 przez draghan VIP (106,230 p.)
Tak tylko... z ciekawości. >.-

O ile się nie mylę w datach, to ja pisałem akurat tę maturę. :)

Powodzenia. :)
komentarz 14 grudnia 2015 przez Memories Obywatel (1,410 p.)
O, jaki ten swiat jest maly :D.

 

Dziekuje bardzo!
0 głosów
odpowiedź 14 grudnia 2015 przez Memories Obywatel (1,410 p.)
#include<iostream>
#include<cstdlib>
#include<string>
#include<fstream>
using namespace std;

int main()
{
string a;
int z=0, j=0, l=0,k=0;
ifstream odczyt("napisy.txt");
if(!odczyt.is_open())
cout<<"Error";
else
{

	for(int i=0;i<1000;i++)
	{
		odczyt>>a;
		for(int i=0;i<=a.size();i++)
        {
		if(a[i]=='0')
            z++;
        if(a[i]=='1')
            j++;
        if(z==j)
            k++;
        }

	}
cout<<k;

}
odczyt.close();

return 0;
}


 

 

Poprawilem lekko koncowke. Chyba wiem co robie zle. ja sprawdzam tylko pojedyncze 0 i 1 prawda ?

 

 

//edit tak kompletnie zle robie to zadanko,, az mi troszku wstyd. Pomoze ktos jakos lekko?

komentarz 14 grudnia 2015 przez Mikrokontroler xD Stary wyjadacz (13,500 p.)
edycja 14 grudnia 2015 przez Mikrokontroler xD
zobacz wczytujesz sobie pierwszą linijkę z 0101... później masz
z++;
j++;
k++;

wczytujesz następną i do poprzednich wartości "z" , "j" , "k" robisz 

z++;
j++;
k++;

czyli jak miałeś w pierwszej linijce np cztery zera  a w drugiej dwa zera to zmienna 
"z" będzie równa 6. a że w pliku txt jest 1000 linii to chyba duża liczba tobie wychodzi.

 

komentarz 14 grudnia 2015 przez Memories Obywatel (1,410 p.)
aaaaaa, te zadanko jakies trudniejsze jest ...
komentarz 14 grudnia 2015 przez Mikrokontroler xD Stary wyjadacz (13,500 p.)
sorki za edycję ale jakiś błąd się wdał :).

Bardziej chodzi żeby wyzerować twoje zmienne pomocnicze po przebiegu tej drugiej pętli :)

więc dodajesz 3 instrukcje.

Jednak przed wyzerowaniem powinieneś wykonać operacje które rozwiążą twój problem.

Np dodać ilość zer do ilości jedynek i podzielić to na 2 jeżeli wynik jest bez reszty oznacza że jest parzysta.

A w drugim robisz praktycznie to samo to znaczy dzielisz ilość zer przez ilość jedynek lub odwrotnie i jeżeli jest równe 1 to oznacza że jest ich tyle samo :). Jednak tutaj musisz zabezpieczenie napisać żeby nie dzielić przez 0.

Pozdrawiam
komentarz 14 grudnia 2015 przez Memories Obywatel (1,410 p.)
Czyli zamiast tego mojego sprawdzienia z==j dac twoja pierwsza propozycje (z suma ilosci zer i jedynek) albo te dzielenie przez ilosci 1 przez ilosc 0 tak? Nie moge wyzerowac mojego "k" ktore zlicza ilosc napisow ktore posiadaja taka sama ilosc 0 i 1 co nie?
komentarz 14 grudnia 2015 przez Memories Obywatel (1,410 p.)

Pomysl z wyzerowaniem byl dobry, zadzialalo.

#include<iostream>
#include<cstdlib>
#include<string>
#include<fstream>
using namespace std;

int main()
{
string a;
int z=0, j=0, l=0,k=0;
ifstream odczyt("napisy.txt");
if(!odczyt.is_open())
cout<<"Error";
else
{

	for(int i=1;i<=1000;i++)
	{
		odczyt>>a;
		for(int i=0;i<a.size();i++)
        {
		if(a[i]=='0')
            z++;
        if(a[i]=='1')
            j++;
        }
        if(z==j)
            k++;
z=0;
j=0;
	}

cout<<k;

}
odczyt.close();

return 0;
}

 

 

 

 

Zrobilem jednak cos takiego. Jak myslisz, nie jest to jakis magiczny przypadek, ze mi dobrze wychodzi? rzucisz okiem na kod czy jest poprawny?

 

komentarz 14 grudnia 2015 przez Mikrokontroler xD Stary wyjadacz (13,500 p.)
edycja 14 grudnia 2015 przez Mikrokontroler xD

Jedna rzecz

for(int i=1;i<=1000;i++)
{
      //kod
       for(int i=0;i<a.size();i++)
       {

       }
}

@Edit Start

Jeszcze jedno zrefaktoryzuj sobie kod to znaczy żebyś zamienił na bardziej sensowne nazwy zmianę którą ci proponuje niżej z "i" na "j" może spowodować błąd ponieważ już masz "j" w swoim programie więc proszę mniej to na uwadze i albo znajdź inną zmienną albo zrefaktoryzuj że "j" będzie tylko w pętli

@Edit Stop

zauważ że 2 razy używasz tej samej zmiennej jako indeks w pętli.
proponowałbym w drugiej pętli użyć innej zmiennej np "j" zamiast "i".

(o tym zapomniałem wspomnieć)

to co zrobiłeś 

if(z==j)

jest lepsze niż to co ja mówiłem (chwila słabości proszę o wybaczenie :) )
Po co masz zerować twoje "k" to co zrobiłeś jest dobre.

Jeszcze zrób sobie przed zerowaniem sprawdzenie czy ilość tych 010... jest parzysta.

komentarz 14 grudnia 2015 przez b00ny Mądrala (6,050 p.)
Nie znam się za bardzo na C++, ale wygląda na poprawny, ale niech lud przemówi :D
komentarz 14 grudnia 2015 przez Memories Obywatel (1,410 p.)
Racja z tym licznikiem, dzieki za bardzo dobre rady.

Dzieki Ci serdecznie za pomoc, zdrowka zycze!

Podobne pytania

0 głosów
2 odpowiedzi 1,738 wizyt
pytanie zadane 28 grudnia 2016 w C i C++ przez Krystek102 Bywalec (2,440 p.)
0 głosów
2 odpowiedzi 2,793 wizyt
pytanie zadane 16 grudnia 2016 w C i C++ przez Krystek102 Bywalec (2,440 p.)
0 głosów
1 odpowiedź 323 wizyt
pytanie zadane 23 czerwca 2022 w Rozwój zawodowy, nauka, praca przez polandonion Dyskutant (7,730 p.)

93,787 zapytań

142,750 odpowiedzi

323,421 komentarzy

63,392 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...