Ćwiczenie 1.6 z książki "Język ANSI C", program nie działa, świeżak prosi o pomoc :)

0

Hej, jestem zupełnie świeży w programowaniu i postanowiłem nauczyć się w końcu programować. Napotkałem bardzo szybko przeszkodę - mianowicie nie mogę wykonać ćwiczenia 1.6 z książki Język ANSI C.
Treść polecenia:

  • Sprawdź, że wyrażenie getchar() != EOF może mieć wartość 0 lub 1. *

Zgodnie z opisem książki, w/g mnie program powinien wyglądać tak:

#include <stdio.h>

main()
{
        int c;
        while(c=getchar() != EOF)
            putchar(c);
}

Niestety - program się zachowuje wtedy dokładnie tak, jakbym zapisał 'while((c=getchar()) != EOF)', próbowałem także dać wyrażenie z polecenia w nawias - nic nie działa. Coś robię źle?

Używam kompilatora Code::Blocks 10.05
Dziękuję za pomoc

0

Nawiasy.

0

Które nawiasy i dlaczego?

0

while(c=getchar() != EOF)
Co najpierw sprawdzasz c, czy to co zwróciło getchar()?

0
X153 napisał(a):

Niestety - program się zachowuje wtedy dokładnie tak, jakbym zapisał 'while((c=getchar()) != EOF)'
coś kręcisz. Skompiluj jeszcze raz, sprawdź, przeklej obydwa kody na forum. Pierwszy program po wpisaniu tekstu powinien wypisywać "krzaczki" lub nic natomiast drugi powinien wypisać wszystkie znaki jakie podajesz na wejściu.

0

Po zatwierdzeniu enterem pojawiają się uśmiechnięte buźki (przewiduję, że to taki bonus od twórców kompilatora), po ctrl + C program się wyłącza (EOF?)

#include <stdio.h>
main()
{
    int c;
    c=(getchar()!= EOF);
    putchar(c);

}

ten program natomiast zwraca wartość (0, 1), a konkretnie tylko 1, ctrl + c go zamyka.

Program ma tak działać czy ja robię coś nie tak?

0

Aby pojawił się EOF musisz nacisnąć <Ctrl-Z><Enter>

0

Moglibyście przy okazji rzucić okiem na błąd w programie do zliczania liczby wierszy?

#include <stdio.h>
main()
{
    int c, nl;

    nl = 0;
    while ((c = getchar()) != EOF)
        if (c == '\n')
            ++nl;
    printf("%d\n", nl);
}

Jestem właściwie pewny, że kod przepisałem z książki poprawnie - program jednak nie wyświetla ilości wierszy...

Z EOF masz rację, czyli program działał, tylko spanikowałem :). Dzięki wielkie za pomoc.

0

Odpalaj z konsoli lub dopisz sztuczne zatrzymanie:

while(getchar()!='\n'){} getchar();
0

Rozumiem, że mam to zapisać jako ostatni wers funkcji main i pętla ta będzie powodować, że tak długo jak znakiem nie będzie \n program ma nie robić nic (zamknięte klamry), a następnie (po zakończeniu drugiej pętli while) pobrać kolejny tekst?
I miałbym tutaj też pytanie składniowe - czy zapis po pętli klamr w przypadku, gdy mamy tylko jedno-linijkowe polecenie jest poprawny? (W książce Język ANSI C autorzy nie zapisują klamr) Taka pętla z klamrami wygląda dużo lepiej według mnie i dużo lepiej się wyróżnia, ale wolałbym trzymać się standardów (na drugim roku studiów będę miał chyba sporo C, więc warto byłoby mieć wyrobione dobre nawyki).
Dzięki za odpowiedzi raz jeszcze :)

0

Próbowałem tą linijkę wklepać wszędzie i nie osiągnąłem żadnego rezultatu - nic się nie zmieniło.

0

Chyba rozwiązaniem jest nauka korzystania z terminala systemu windows.
Cały bajer polegał na tym, żeby zapisać tekst bez CTRL + Z, na końcu (nowa linijka) dać CTRL + Z i zatwierdzić enterem - po tym program wyświetla ile linijek ma tekst.

Doszedłem do tego, gdy próbowałem przypisać do innych klawiszy i wyszło to trochę nie chcący (wciskałem spację z 3 linijki, nacisnąłem enter, zirytowałem się, wcisnąłem CTRL+Z i enter, a tu... wow). Zapis ze znakiem != jest nie potrzebny - windows widocznie nie potrzebuje wzmianki o EOF.

Dzięki wszystkim za pomoc, będę się meldował z kolejnymi problemami ;)

0

tyle, że Ctrl+Z to jest właśnie EOF

0

Nie muszę zapisać warunku while ((c = getchar ()) != EOF). Równie dobrze działa z while ((c = getchar())) - tj też reaguje na EOF.

0
X153 napisał(a):

Po zatwierdzeniu enterem pojawiają się uśmiechnięte buźki (przewiduję, że to taki bonus od twórców kompilatora)

To nie jest bonus od 'twórców kompilatora' :D zerknij tutaj

0

Mam kolejny problem z tą książką - mianowicie chodzi mi o program 1.10 o treści:
"Napisz program, który przepisując z wejścia na wyjście, każdy znak tabulacji zastąpi sekwencją \t, każdy znak cofania przez sekwencję \b, oraz każdy znak \ przez \ takie znaki".

Moje pytanie brzmi - w jaki sposób mam zmusić program do zarejestrowania backspace'a?
Tutaj mój program - z pewnością napisany dość nieporadnie, ale...

#include <stdio.h>
main()
{
    int c;
    while((c=getchar())!=EOF)
    {
        if (c=='\t')
            {
                printf("\\t");
            }
        if (c=='\b')
            {
                printf("\\b");
            }
        if (c=='\\')
            {
                printf("\\\\");
            }
        if (c!='\t' && c!='\b' && c!='\\')
            {
                putchar(c);
            }
    }
}

Dzięki jeszcze raz za pomoc ;)

0
#include <stdio.h>
int main()
  {
   int c;
   while((c=getchar())!=EOF)
     {
      if(c=='\t') printf("\\t");
      else if(c=='\b') printf("\\b");
      else if(c=='\\') printf("\\\\");
      else putchar(c);
     }
   return 0;
  }

Skompilować do tamtenprogram.exe

#include <stdio.h>
int main()
  {
   puts("n=\nr=\rt=\tb=\b");
   return 0;
  }

Skompilować do tenprogram.exe
Odpalać:
tenprogram | tamtenprogram

0

W książce nie zostało omówione else if, return, puts. Wiem co robi else if i return, ale puts już nie koniecznie.
Nie da się tego programu zrobić w bardziej podstawowy sposób? Co konkretnie źle zrobiłem pisząc powyższy program?
Nie mogę sobie pozwolić na przepisanie tego programu - bo chcę to programowanie umieć dokładnie (idę na EiT i będę musiał w C klepać sterowniki, teoretycznie też powinienem umieć od podstaw zaprogramować proste mikroukłady cyfrowe), a nie omijać problem, bo "jakoś to i tak zadziała". W/g autorów program się musi dać napisać bez takiego (na pewno małego w porównaniu do dużych programów) komplikowania - więc muszę się dowiedzieć w jaki sposób mogę to zrobić ;). Dzięki wielkie za dotychczasowe i dalsze wskazówki :)

0

działanie backspace jest zależne od konsoli. Żeby przetestować działanie wyślij ctrl+h w większości przypadków powinno zadziałać.

0

Książka jest pisana 'pod UNIXa' z tego co zrozumiałem.
Tak - else if jest omówione później, tak - wiem, że zamysłem autora było to, bym się pomęczył z tymi zadaniami z samymi ifami i to chciałem zrobić. Autor raczej nie miał w zamyśle, że odpalę dwa programy nie szczególnie wiedząc czemu w ten sposób mam to wykonać.
I nie latam z każdym problemem, zresztą dwa poprzednie raczej dotyczyły spraw nie związanych z samym językiem - bo nie zrozumiałem, że w ASCII buźka to 1 oraz nie ogarnąłem jak zrobić EOF w konsoli konkretnie.
Próbowałem z ctrl + h, program zachowuje się dalej tak samo :/. Program ma jakiś konkretny błąd, czy problem robi mi konsola windowsa, która nie wysyła backspace'a do programu? Jeśli tak to może najlepiej będzie jak sobie na vmware postawię linuksa, żeby uniknąć problemów?

0

Ten problem też nie dotyczy stricte samego języka. Problem w konsoli która nie przepuszcza <backspace> interpretując go odpowiednio. Pokazałem ci jak to załatwić za pomocą drugiego programu który generuje ten <backspace> tak a propos jeżeli przepiszesz tą moją propozycje tak aby ona czytała ze strumienia i wypluwała na odwrotnej zasadzie niż to twoje zadanie to bardzo łatwo przetestujesz to pierwsze. Oczywiście będzie to dodatkowe wyzwanie.

0

sprawdź kombinacje ctrl+i w twoim programie.

edit:

x153 napisał(a):

I nie latam z każdym problemem, zresztą dwa poprzednie raczej dotyczyły spraw nie związanych z samym językiem

samodzielne szukanie odpowiedzi na twoje pytania wniosłoby więcej pożytku w twoją naukę niż zadawanie ich tutaj na forum (dodatkowo w dziale dla osób bardziej doświadczonych). Niestety kolego ale programowanie polega na rozwiązywaniu problemów i nie zawsze to muszą być problemy stricte algorytmiczne czy dotyczące składni. Niejednokrotnie się jeszcze spotkasz z różnymi problemami wynikającymi ze środowiska w jakim programujesz bądź implementacji biblioteki, z której korzystasz i uwierz mi, że poszukiwanie samemu odpowiedzi poza wielką satysfakcją sprawia, że po drodze uczysz się wielu innych zagadnień.

1 użytkowników online, w tym zalogowanych: 0, gości: 1