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

Poprawność działania programu zliczającego słowa

Object Storage Arubacloud
0 głosów
305 wizyt
pytanie zadane 29 września 2018 w C i C++ przez Shimeo7 Obywatel (1,910 p.)

Cześć, napisałem(nauka z książką) program, który zlicza wiersze, słowa, znaki. Autor w zadaniach każe sprawdzić poprawność programu zliczającego słowa oraz pyta się jakie rodzaje danych wejściowych mogą ułatwić wykrycie błędu. Problem w tym, że myślę i myślę i d*pa. Czy ktoś z Was mógłby mnie nakierować jak ,,złapać" to zadanie? Z góry dziękuję za pomoc. Poniżej kod programu.

#include <stdio.h>

# define IN 1 /* wewnatrz slowa */
# define OUT 0 /* poza slowem */

/* zliczanie wierszy, slow i znakow */

main()
{
    int c, nl, nw, nc, state;

    state = OUT;
    nl = nw = nc = 0;

    while( (c = getchar()) != EOF ) {
        ++nc;
        if( c == '\n' )
           ++nl;
        if( c == ' ' || c == '\n' || c == '\t')
           state = OUT;
        else if( state == OUT ) { /* wykonywana w chwili nie spelnienia instrukcji1 */
            state = IN;
            ++nw;
        }
    }
    printf("%3d\t%6d\%9d\n", nl, nw, nc);

}

 

3
komentarz 29 września 2018 przez monika90 Pasjonat (22,940 p.)
Autor książki przespał ostatnie 20 lat.
komentarz 30 września 2018 przez mokrowski Mędrzec (155,460 p.)
Nie wiem czy przespał. Jeden ze współautorów i twórca języka C (Dennis Ritchie), nie żyje od 2011 roku. Brian Kernighan jeszcze żyje. Przykład pochodzi z klasycznej książki: The C (ANSI C) Programming Language https://en.wikipedia.org/wiki/The_C_Programming_Language#/media/File:The_C_Programming_Language_cover.svg
komentarz 1 października 2018 przez monika90 Pasjonat (22,940 p.)
A jednak program nie jest napisany w ANSI C, bo w ANSI C nie ma implicit int.
komentarz 1 października 2018 przez mokrowski Mędrzec (155,460 p.)
Na tę książkę prawo autorskie jeszcze nie wygasło. Tak więc publikuję link wyłącznie na prawach cytatu (link jest nie mój): http://www.dipmat.univpm.it/~demeio/public/the_c_programming_language_2.pdf

Strona 20 pkt 1.5.4

To klasyk i tyle...

3 odpowiedzi

+1 głos
odpowiedź 30 września 2018 przez mokrowski Mędrzec (155,460 p.)
wybrane 1 października 2018 przez Shimeo7
 
Najlepsza
Książka którą się posługujesz jest absolutnym klasykiem jeśli chodzi o książki dotyczące C. Niemniej jednak jeśli chcesz się z niej uczyć dobrych praktyk, od czasów jej napisania już się sporo zmieniło. To jest tak jakby czytać klasycznych filozofów  i konstatować że rzeczywistość jest nieco inna :-) Niby ziarno prawdy jest ale wymaga dość ściśle zdefiniowanego sita którym to przesiejesz.

Nie będę poprawiał kodu który wstawiłeś. Zapytałeś o możliwe testy.

W takich przypadkach teoria testowania wyróżnia:

1. Warunki brzegowe - co ma dziać się na krańcu przedziału

2. Klasy równoważności - jak przetestować elementy w danym przedziale.

Masz także (z racji tego że program zwraca 3 poniekąd niezależne wartości), 3 osie testowania:

1. Ilość znaków

2. Ilość linii

3. Ilość słów.

Stąd testy to przykłady dla:

1. Zerowej wartości każdej z osi testowania

2. Pojedynczej wartości każdej z osi testowania

3. Ew. ujemnej wartości w każdej z osi testowania (zastanów się czy to możliwe)

4. Maksymalnej wartości każdej z osi testowania

5. Maksymalnej + 1 wartości w każdej z osi testowania

6. Maksymalnej - 1 wartości w każdej z osi testowania

7. Wybranej wartości lub wielu wartości gdzieś pomiędzy max i min.

Tyle teoria a jakie są moje propozycje (oczywiście niepełne bo pełne uzyskasz przeglądając to co wyżej):

Pusty plik, plik z jedną linią (jeden enter), plik z wieloma pustymi liniami, plik z 1 linią złożoną z samych białych znaków, plik z wieloma liniami złożonymi z białych znaków, plik złożony ze słów jednoliterowych, ....

Już chyba masz dużo pomysłów :)
+1 głos
odpowiedź 29 września 2018 przez RafalS VIP (122,820 p.)
edycja 30 września 2018 przez RafalS

Ten kod jest brzydki :( Ta książka jest zła

# define IN 1 /* wewnatrz slowa */

po co preprocesor? Po co komu typy w języku, którego zaletą jest silne typowanie? Nazwał stałą IN. Nie dziwne, że musi pisać komentarz, żeby ktoś mógł domyślić się co to znaczy :P.

	int c, nl, nw, nc, state;

A tutaj to dopiero poleciał z nazwami zmiennych. Brak słów. I ja nie żartuje. Ten kod wygląda jak napisany przez osobe, która dopiero uczy się programować :P

\%9d\n"

to wygląda jak błąd. Nie ma sensu escapować procentu.

Co do samego pytania to popróbuj z nietypowymi danymi. Np:

     no    4ffs fdsf       
                elo  

Aczkolwiek sam algorytm nie wygląda najgorzej. Nie widać prostych luk

1
komentarz 30 września 2018 przez mokrowski Mędrzec (155,460 p.)

Ten kod nie jest zły tylko jest niesamowicie stary. Proponuję napisać do Brian'a Kernighana (bo jeszcze żyje) by usunął kod z klasycznej książki The C (ANSI C) Programming Language i przy okazji poprosić ACM oraz IEEE o odebranie tytułów Dennisowi Ritchiemu bo "źle książki piszą".

O powodach dlaczego tak się pisało zamilknę....

Pierwszy raz widzę by ktoś krytykował twórcę języka i klasyka za to że jest klasykiem :)

Tu znajdziesz stronę Kernighana: http://9p.io/who/bwk/index.html żebyś cokolwiek wiedział że i w AWK zamieszani.. i APL'a ... 

Co algorytmów tych 2 panów (BTW twórców Unix'a), proponuję poszukać przykładu ograniczonego parsera gramatyki regularnej który jeden z nich popełnił. W kilkudziesięciu linijkach perełka.

–2 głosów
odpowiedź 29 września 2018 przez profesorek96 Szeryf (91,420 p.)
Jeśli uczysz się C++ to poczytaj o tablicach asocjacyjnych w C++ zwanych mapami. Natomiast w C będzie ci to trudno zrobić.
komentarz 30 września 2018 przez j23 Mędrzec (194,920 p.)
Tablice asocjacyjne do zliczania linii i słów? Osobliwe...

Podobne pytania

0 głosów
1 odpowiedź 355 wizyt
0 głosów
1 odpowiedź 147 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...