• 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,170 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,980 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,980 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ź 579 wizyt
0 głosów
1 odpowiedź 262 wizyt
+1 głos
2 odpowiedzi 1,777 wizyt
pytanie zadane 30 lipca 2016 w C i C++ przez Nightmare43 Użytkownik (630 p.)

92,687 zapytań

141,598 odpowiedzi

320,087 komentarzy

62,048 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

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!

...