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

Zadanie maturalne - zad. 4, matura rok 2015

Object Storage Arubacloud
+1 głos
2,473 wizyt
pytanie zadane 12 maja 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)

Treść zadania:

Podaj, ile liczb z pliku liczby.txt ma w swoim zapisie binarnym więcej zer niż jedynek. Przykład: Dla zestawu liczb:

  • 101011010011001100111
  • 10001001
  • 1000000
  • 101010011100
  • 100010

wynikiem jest liczba 3 (3 podkreślone liczby mają w swoim zapisie więcej zer niż jedynek).

 

Mój pomysł na algorytm:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    fstream plik;
    plik.open("liczby.txt", ios::in);

    string dane;
    char znak;
    int licz_zera = 0;
    int licz_jedynki = 0;
    int licz_wyrazy = 0;

    while(!plik.eof())
    {
        plik >> dane;
        for (int i=0; i=dane.size(); i++)
        {
            if(dane[i] == '0')
            {
                licz_zera++;
            }
            else if(dane[i] == '1')
            {
                licz_jedynki;
            }
        }
        if(licz_zera > licz_jedynki)
        {
            licz_wyrazy++;
        }
    }
    cout << "Takich liczb jest: " << licz_wyrazy << endl;

    return 0;
}

Po uruchomieniu go cały jest cały czas czarny ekran i migający kursor. Moim pomysłem było:

1) Odczytanie pliku.

2) Pętla for która sprawdzi każdą cyferkę w pierwszej wczytanej liczbie.

3) Dwa warunki if, które będą liczyć ile jest jedynek a ile zer w danej liczbie.

4) Potem sprawdzamy czego było więcej - jedynek czy zer.

5) Pętla while zatacza kolejne kółko i wczytywana jest kolejna liczba z pliku tekstowego.

Mam gotowe rozwiązanie ze strony maturalnej, ale wolę dopracować to swoje, więc poprosiłbym o pomoc z tym obecnym.

komentarz 12 maja 2016 przez xandros Nałogowiec (29,450 p.)
else if(dane[i] == '1')
            {
                licz_jedynki;
            }

brakuje inkrementacji

3 odpowiedzi

0 głosów
odpowiedź 12 maja 2016 przez criss Mędrzec (172,590 p.)
wybrane 12 maja 2016 przez Evelek
 
Najlepsza

Po pierwsze kilka błędów:

  1. Nigdzie nie używasz zmiennej znak. Jest niepotzrebna.
  2. Nie inkrementujesz licz_jedynki.
  3. Nie zerujesz licz_jedynki i licz_zera po każdym obrocie pętli.

A powód jest w warunku pętli for - masz tam przypisanie, co zawsze jest konwertowane na true o ile string zawiera chociaż jeden znak.

komentarz 12 maja 2016 przez Evelek Nałogowiec (28,960 p.)
Zmienną wyrzuciłem. Dodałem inkrementację. Ustawiłem w odpowiednim miejscu licz_jedynki oraz licz_zera, dobrze że zauważyłeś, małe przeoczenie. A co do warunku pętli for to nie rozumiem. Przypisałem tam, że: i = 0. Od tego zaczynamy. Petla for trwa dopóki zmienna 'i' nie osiągnie dane.size. Gdy to osiągnie to wychodzi z pętli, a następnie od nowa wczytuje kolejna liczbę. Nie widzę tu błędu...ewentualnie bym zamienił dane.size na dane.length jesli by to miało pomoc.
komentarz 12 maja 2016 przez criss Mędrzec (172,590 p.)

W warunku powinno być coś zwracającego boola. Operator przypisania nie zwraca boola, tylko przypisaną wartość. Poza tym pętla for oczekuje warunku przejścia do kolejnej iteracji, a nie przerwania. Zadziałałoby i != dane.size()

komentarz 12 maja 2016 przez Evelek Nałogowiec (28,960 p.)
O bez kitu... A ja ti przyrównałem...dobra czaje już. Dzięki za pomoc. Kolega wyżej też podał ciekawy sposób na rozwiązanie tego.
komentarz 12 maja 2016 przez criss Mędrzec (172,590 p.)
Nawet nie przyrównałeś, tylko przypisałeś nową wartość :P
+1 głos
odpowiedź 12 maja 2016 przez xandros Nałogowiec (29,450 p.)

 

#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

int main()
{
    fstream plik;
    plik.open("liczby.txt", ios::in);

    string dane;
    int licz_wyrazy = 0;

    while(!plik.eof()) {
        plik >> dane;
        if(count(dane.begin(), dane.end(), '0') > count(dane.begin(), dane.end(), '1')) {
            licz_wyrazy++;
        }
    }
    cout << "Takich liczb jest: " << licz_wyrazy << endl;
    return 0;
}

źródło: http://stackoverflow.com/a/3871346

komentarz 12 maja 2016 przez Evelek Nałogowiec (28,960 p.)
Kurczę troche nowość takie rzeczy dla mnie. Dzięki za poprawienie kodu, wbije rano na kompa to skompiluje, popatrzę jak to działa.
0 głosów
odpowiedź 1 kwietnia 2020 przez Adamk151 Nowicjusz (140 p.)

Możesz zobaczyć jak napisać algorytm, który rozwiązuje zadanie w tym filmie:

https://www.youtube.com/watch?v=ls06z3t2774

komentarz 2 kwietnia 2020 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Śliczny odkop, prawie 4 lata laugh

Podobne pytania

0 głosów
3 odpowiedzi 1,978 wizyt
pytanie zadane 12 maja 2016 w C i C++ przez Jakub Norek Użytkownik (560 p.)
0 głosów
1 odpowiedź 255 wizyt
0 głosów
1 odpowiedź 945 wizyt
pytanie zadane 7 czerwca 2016 w Rozwój zawodowy, nauka, praca przez m_rij_v Użytkownik (660 p.)

92,550 zapytań

141,392 odpowiedzi

319,519 komentarzy

61,935 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...