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

Wypisanie z pliku do pliku ile znajduje się liczb o danej długości.

Object Storage Arubacloud
0 głosów
1,137 wizyt
pytanie zadane 25 lutego 2021 w C i C++ przez xTMx3 Obywatel (1,560 p.)

Witam.

języka C++ uczę się krótko i pomimo że miałem go również w szkole, nadal mam z nim problemy. Dostałem zadanie do wykonania o takiej treści: 

W pliku napisy.txt znajduje się 1000 napisów o długościach od 2 do 16 znaków, każdy napis w osobnym wierszu. W każdym napisie mogą wystąpić jedynie dwa znaki: „0” lub „1”. W wybranym przez siebie języku programowania napisz program, za pomocą którego uzyskasz odpowiedzi na poniższe polecenia.

Odpowiedzi zapisz w pliku zadanie4.txt, a odpowiedź do każdego podpunktu poprzedź literą oznaczającą ten podpunkt.

a) Podaj, ile jest napisów o parzystej długości.

b) Podaj, ile jest napisów, które zawierają taką samą liczbę zer i jedynek.

c) Podaj, ile jest napisów składających się z samych zer, oraz podaj, ile jest napisów składających się z samych jedynek.

d) Dla każdej liczby k = 2, 3, ...,16 podaj liczbę napisów o długości k znajdujących się w pliku napisy.txt, tzn. podaj, ile jest napisów 2-znakowych, ile jest napisów 3-znakowych itd.

Zrobiłem podpunkty a, b oraz c, lecz przy ostatnim podpunkcie mam problem. Chodzi dokładnie o to, że program zamiast wypisywać mi ilość napisów o danej długości, wypisuje mi jedną i ciągle tą samą liczbę (podejrzewam że po prostu zlicza długości wszystkich wyrazów). 

Wszystkie podpunkty mam w jednym pliku napisane, więc wklejam tylko fragment kodu odpowiedzialny za niedziałający podpunkt d). 

A oto kod:


int ileZnakow=1;

    while(plik>>linijka)
    {
        for(int i=0;i<linijka.size();i++)
        {
            for(int k=2; k<17; k++)
            {
                if(linijka.size()==k)
                {
                    ileZnakow++;
                }
            }
        }
    }
    
    for(int j=2;j<17;j++)

    wyjscie<<"k="<<j<<" : "<<ileZnakow<<endl;

A taki dostaje wynik w pliku "zadanie4.txt":

k=2 : 9617
k=3 : 9617
k=4 : 9617
k=5 : 9617
k=6 : 9617
k=7 : 9617
k=8 : 9617
k=9 : 9617
k=10 : 9617
k=11 : 9617
k=12 : 9617
k=13 : 9617
k=14 : 9617
k=15 : 9617
k=16 : 9617

Mógłby ktoś wskazać gdzie mam błąd, lub co powinienem zrobić, aby program zadziałał? Byłbym też wdzięczny za wytłumaczenie dlaczego w taki sposób a nie inny się to ma odbywać. 

Z góry dzięki za pomoc. 

1 odpowiedź

+1 głos
odpowiedź 25 lutego 2021 przez SzkolnyAdmin Szeryf (86,360 p.)
wybrane 26 lutego 2021 przez xTMx3
 
Najlepsza
1. Zadeklaruj tablicę przechowującą liczby całkowite (int). Może mieć indeksy od 0 do 16 (wtedy nie wykorzystasz dwóch pierwszych, ale łatwiej będzie liczyć ciągi) lub od 0 do 14. Wypełnij tablice zerami.

2. Po odczytaniu ciągu inkrementujesz odpowiednią komórkę tablicy:

a) w przypadku tablicy z indeksami od 0 do 16 - tablica[linijka.size()]++

b) w przypadku tablicy z indeksami od 0 do 14 - tablica[linijka.size()-2]++
komentarz 26 lutego 2021 przez xTMx3 Obywatel (1,560 p.)

A mógłbym prosić nieco jaśniej, w którym dokładnie momencie ta inkrementacja ma być i czy poza jej zrobieniem mam coś usuwać, dodatkowo dopisać? Zrobiłem tablicę (od 0 do 16) i wypełniłem zerami, ale jak wstawiłem tą inkrementację, to w pliku, dla każdego "k" wypisuje mi takie coś: 0x61f9d0.

 

    int ileZnakow[17];
    for(int i=0;i<17;i++)
    {
        ileZnakow[i]=0;
    }

    while(plik>>linijka)
    {
        for(int i=0;i<linijka.size();i++)
        {
            for(int k=2; k<17; k++)
            {
                if(linijka.size()==k)
                {
                    ileZnakow[linijka.size()]++;
                }
            }
        }
    }

    for(int j=2;j<17;j++)

    wyjscie<<"k="<<j<<" : "<<ileZnakow<<endl;

 

komentarz 26 lutego 2021 przez SzkolnyAdmin Szeryf (86,360 p.)

Wewnątrz pętli while tylko

ileZnakow[linijka.size()]++;

 

komentarz 26 lutego 2021 przez xTMx3 Obywatel (1,560 p.)
Działa :)

Dodatkowo miałem błąd przy wyjściu na samym końcu bo o nawiasie klamrowym zapomniałem przy odczycie z tablicy.

Dzięki za pomoc.

Podobne pytania

0 głosów
1 odpowiedź 546 wizyt
0 głosów
1 odpowiedź 257 wizyt
+1 głos
2 odpowiedzi 1,737 wizyt
pytanie zadane 30 lipca 2016 w C i C++ przez Nightmare43 Użytkownik (630 p.)

92,568 zapytań

141,420 odpowiedzi

319,624 komentarzy

61,956 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!

...