• 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

VPS Starter Arubacloud
+1 głos
2,460 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,940 wizyt
pytanie zadane 12 maja 2016 w C i C++ przez Jakub Norek Użytkownik (560 p.)
0 głosów
1 odpowiedź 246 wizyt
0 głosów
1 odpowiedź 911 wizyt
pytanie zadane 7 czerwca 2016 w Rozwój zawodowy, nauka, praca przez m_rij_v Użytkownik (660 p.)

92,452 zapytań

141,262 odpowiedzi

319,078 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...