getchar/putchar kontra while - gdzie tu jest błąd?

Odpowiedz Nowy wątek
2017-04-20 14:50
0
int c;
 
        c = getchar();
        while ((c=getchar() <=5))
            putchar (c);
            {
             printf("To jest mniej jak 5");
        }
        while ((c=getchar() >6))
        putchar (c);
        {
            printf("To jest wiecej jak 6");
        }

Program sprawdza dane z klawiatury. Dla każdej wpisanej liczby wyświetla ten sam komunikat i nie kończy pętli wyświetlając jakiegoś krzaka ....

edytowany 1x, ostatnio: Patryk27, 2017-04-20 15:17
Poprawiłem kolorowanie na C. - Patryk27 2017-04-20 15:18
Co wpisujemy dla poprawnego kolorowania w C? Samo C zaraz po " ?? U mnie to nie działa dlatego używam PHP - gavallon 2017-04-20 15:26
Dobra, działa. - gavallon 2017-04-20 15:26

Pozostało 580 znaków

2017-04-20 15:17
2
c=getchar() <=5

Kolejność działań ma znaczenie - Twoje wyrażenie jest rozumiane jako:

c = (getchar() <= 5)

Btw, formatuj kod należycie - na to nie da się patrzeć :P


edytowany 1x, ostatnio: Patryk27, 2017-04-20 15:17
Już zajarzyłem. - gavallon 2017-04-20 15:41

Pozostało 580 znaków

2017-04-20 15:22
0

Też nic z tego. Po podaniu cyfry z zakresu 0-5 działa prawidłowo wyświetlając TO AUTO JEST MŁODE.
Po podaniu cyfry >5 ten sam komunikat.

#include <stdio.h>
#include <windows.h>
 
int main (void)
 
{
 
    char* autor = "Kamilka";
    char* opel = "OPEL";
    char* insignia = "INSIGNIA";
    char* astra = "ASTRA";
    char* laguna = "LAGUNA";
    char* opla = "OPLA";
    char* insignie = "INSIGNIE";
    char* astre = "ASTRE";
    char* lagune = "LAGUNE";
 
HANDLE kolor;
kolor = GetStdHandle( STD_OUTPUT_HANDLE );
    SetConsoleTextAttribute( kolor, 1 );
        printf (" ***** ROZPOCZECIE PROGRAMU ***** \n\n\n");
 
kolor = GetStdHandle( STD_OUTPUT_HANDLE );
    SetConsoleTextAttribute( kolor, 7 );
 
    printf(" Witamy w programie: %s \n\n", autor);
    printf(" Moj obecny samochod to: %s %s \n\n", opel, insignia);
    printf(" %s mi sie znudzila i zmienilem na: %s \n" , insignia, astre);
    printf(" %s jednak nie przypadla mi \n do gustu i kupilem nowa: %s \n", astra, lagune);
    printf(" %s okazala sie jednak szrotem i ponownie kupilem %s \n\n", laguna, opla);
    printf(" ***** TERAZ ZMIANA NAZW ZMIENNYCH ***** \n\n\n");
 
    char* corsa = "CORSA";
            printf(" Obecnie moj samochod to %s %s \n", opel, corsa);
 
        corsa = "corsunia";
            printf(" Tak bardzo lubie swojego %s ze nazwalem go %s \n", opla, corsa);
 
    char* corsidlo = "CORSIDLO";
            printf(" ale nazwa %s okazala sie lipna i nazwalem ja %s \n", corsa, corsidlo);
            printf(" \n\n\n");
 
    printf("W jakim wieku jest Twoje auto?? - wpisz cyfre i wcisnij ENTER : \n");
 
int c;
     c = getchar();
            while (c=getchar() <=5)
            putchar (c);
            {
             printf("To jest mlode auto");
            }
        while (c=getchar() >6)
            putchar (c);
            {
            printf("To auto jest stare");
        }
 
return 0;
 
}

Gdy zrobię tak jak mówisz czyli:

while c=getchar() <=5

to kompilator błąd wywala podając że przed c=getchar brakuje "(" a za nim ";"

edytowany 4x, ostatnio: gavallon, 2017-04-20 15:29
Interesujące formatowanie kodu. - J0ras 2017-04-20 15:43
Jeszcze się uczę :-) - gavallon 2017-04-21 14:08
To żadne usprawiedliwienie. Jak nie umiesz sam formatować to zawsze przepuść kod przez http://format.krzaq.cc/ - twonek 2017-04-21 14:21
Nie wiem o co w tym chodzi. Prata w książkach mówi (pisze) by używać tabulatora i się nie bać. Zatem celowo zacząłem przesuwać wszystko by mi się wygodniej czytało. Poważnie jest to błędem? Wrzuciłem na podaną stronkę i po formatowaniu wszystko puściło mi równiuteńko po 1xTAB od góry do dołu. Teraz ciężko mi szukać szybko różnych linii. - gavallon 2017-04-21 14:26
W wielu projektach się nie używa nawet tabulatora, tylko 4 spacji. A takie przesuwanie kodu w te i we wte to wielki wtf i w żadnym projekcie tego nie przyjmą. Pisz kod tak, by nie trzeba szukać (krótkie funkcje itd.) - twonek 2017-04-21 14:31

Pozostało 580 znaków

2017-04-20 15:32
3

Na to, co robisz, istnieje fachowa nazwa: https://en.wikipedia.org/wiki/Programming_by_permutation

Gdy zrobię tak jak mówisz czyli:

W którym momencie napisałem, abyś tak zrobił?

Po podaniu cyfry >5 ten sam komunikat.

Cyfry nie mają wartości, zatem nie istnieje coś takiego jak cyfra większa od ....


edytowany 2x, ostatnio: Patryk27, 2017-04-20 15:33
Ależ oczywiście że mają: na przykład ta piątka 5 jest większa od tej piątki. :P - Althorion 2017-04-20 15:34
@Althorion: zastanawiałem się właśnie czy wziąć to pod uwagę, czy nie ;-) - Patryk27 2017-04-20 15:36
He,he, dobre :-) - gavallon 2017-04-20 15:40

Pozostało 580 znaków

2017-04-20 15:37
0

Coś nie tak jest z komunikatami na forum. W powiadomieniu jest że ktoś w wątku odpisał a postu nie widać:
title

Wracając do tematu...
To co zrobić by program oczekiwał liczb z zakresu np. 0-100 i tylko na nich operował?

Sądziłem że getchar() czeka na jakąś liczbę i gdy otrzyma np. cyfrę 3 to porówna zmienną wejściową z tym co ma zapisane czyli if <=5 to coś tam... itd.

@iM32 zdążył po prostu usunąć swojego posta, zanim otworzyłeś wątek. - Patryk27 2017-04-20 15:39
Na przyszłość: Firefox pozwala na bezpośrednie robienie zrzutu ekranu wyświetlanej strony: naciśnij Shift + F2 by otworzyć konsolę i wpisz screenshot nazwa_pliku.png. Oszczędzisz sobie cenzurowania. - Althorion 2017-04-20 15:45
@Althorion, dzięki za info. Aż wstyd się przyznać że głupim się umrze. Szok. Ja to pójdę zaraz robić kurs haftowania a nie C. - gavallon 2017-04-20 15:52
@gavallon: jak Cię to pocieszy, to ja się o tym dowiedziałem wczoraj wieczorem. I teraz szerzę wiedzę po ludziach, jak widzę że się niepotrzebnie męczą. - Althorion 2017-04-20 15:54
@Althorion: Ło matko, ale cuda :) warto wiedzieć ;) - Burdzi0 2017-04-20 16:23
No cuda, cuda i faktycznie, pocieszyło mnie :-) Pierwsze co pomyślałem gdy zapodałeś te "cudo" to: Boże, jaki ja głupi... - gavallon 2017-04-21 06:32

Pozostało 580 znaków

2017-04-20 15:38
2

Sądziłem że getchar() czeka na jakąś liczbę i gdy otrzyma np. cyfrę 3 to porówna zmienną wejściową z tym co ma zapisane czyli if <=5 to coś tam... itd.

Napiszę jeszcze raz to samo, co wyżej:

Kolejność działań ma znaczenie - Twoje wyrażenie jest rozumiane jako:

c = (getchar() <= 5)

Już abstrahując od tego, że ukryty jest tu drugi błąd: getchar zwraca znak ASCII, a nie cyfrę (w tym sensie).


edytowany 1x, ostatnio: Patryk27, 2017-04-20 15:40
No faktycznie uśmieszek zamiast textu się pojawia ... - gavallon 2017-04-20 15:49

Pozostało 580 znaków

2017-04-20 15:47
0

Niestety nie umiem jeszcze tego ogarnąć.

Brak danych w łepetynie.
Syntax error! :-)

Jak to wyrażenie ma być napisane poprawnie?
Dobrze ja to ogarniam:

c = (getchar() <= 5)

zmienna c ma się równać zmiennej zapodanej z klawiatury ... i teraz mi nie pasuje w tym miejscu <=5
bo to bez sensu się czyta!

Nie wiem czy dobrze myślę ale chyba powinna być osobne wyrażenie do ustalenia jakiej zmiennej się oczekuje (liczby 0-100), osobne do przyjęcia c=getchar() oraz osobne do wykonania na tych zmiennych operacji, w tym przypadku porównania if=5, if=>5 itp. itd.

Pozostało 580 znaków

2017-04-20 15:52
3

Bo to jest bez sensu napisane. A napisałeś to, niestety, Ty. Patryk27 Ci tylko to lepiej sformatował, byś mógł łatwiej zauważyć, co takiego zrobiłeś: przypisałeś do zmiennej c wartość porównania getchar() <= 5 — czyli jeśli pobrany znak ma kod ASCII od zera do piątki (czyli NUL, SOH, STX, ETX, EOT lub ENQ — wszystkie sześć niedrukowalne), to w c ląduje 1 (czyli prawda), a jeśli nie, to 0 (czyli fałsz).

Dobra, poczytam o tym wszystkim i pokombinuję. Dam znać jutro czy coś mi z tego wyszło. - gavallon 2017-04-20 15:56

Pozostało 580 znaków

2017-04-20 20:58
1
gavallon napisał(a):
printf(" ***** TERAZ ZMIANA NAZW ZMIENNYCH ***** \n\n\n");

Ale zdajesz sobie sprawę, że nie ma możliwości zmiany nazwy zmiennej, a to co robisz to tworzenie zupełnie nowych kompletnie nie powiązanych z niczym zmiennych?
W zmiennych chodzi o to, że można zmieniać ich wartości a nie nazwy.

Tak, na chwilę obecną już to wiem ale gdy pisałem pierwszy program to jeszcze nie wiedziałem stąd w/w wpis. - gavallon 2017-04-21 06:33

Pozostało 580 znaków

2017-04-21 06:55
0

Słuchajcie, putchar i getchar w książce M.Ritchiego zostało opisane w około 20 linijkach bez jakiegokolwiek przykładu. Nadziałem się wczoraj na kursy internetowe (filmy z YT które kiedyś pobrałem na while itp) i nie chciał bym kolejny raz się męczyć.

c=getchar()   oraz   putchar(c)

są niestety opisane lekko niezrozumiale bo na przykładzie kopiowania plików:

#include <stdio.h>
#include <windows.h>
main()
    {
int c;         /*  deklaruję zmienną całkowitą c  -  zamiast INT można tu użyć CHAR ??  */
  c = getchar();   /* tutaj niby program czeka na wejście, pobiera znak z klawiatury */
    while (c != EOF) {   /*  no i dopóki C jest różne od EOF to jest PRAWDA i wykonuje się pętla, tak???   */
    putchar(c);      /* wyświetla znak */
    c = getchar();   /* i ponownie w pętli wykonuje do czasu FAŁSZU a po FAŁSZU program wykonuje następną linię spoza funkcji */
                     }
    printf(" ble,ble,ble");    /* czyli to...  */
}

Nie rozumiem tego EOF (koniec pliku). Zbyt ciężko Ritchie to opisał.

Mam pytanie: znaki z klawiatury wpisywane są tak jak je się widzi fizycznie (QWERTYUIOP....1234567890) czy np. w jakiś odpowiednikach w ASCII?
Można zrobić to tak?

#include <stdio.h>
#include <windows.h>
   main()
             {
    int c;                                        
    c = getchar();                            
          while (c != T) {               
 
       c = getchar();                    
                     }
      printf(" wybrano klawisz T");               
}
 
Wywala mi błąd że T jest niezadeklarowane!  Jak mam zadeklarować te T?

Chodzi mi o to że chciał bym użyć w programie zapytania do użytkownika: Czy chcesz rozpocząć program ? T/N
Jeśli USER wybierze T to tutaj chciał bym użyć znienawidzonej komendy GOTO :-)
W przypadku N tak samo ... dalsza część wykonywania programu od konkretnej linii.

Po czasie chciał bym aby program zapytał: W jakim wieku jest Twój ojciec?
getchar() od usera miał by być numeryczny z liczbami z zakresu 0-100.
Do pewnych zakresów 0-10, 10-20, 20-40, 40-60, 60-80, 80-100 chciał bym przypisać odpowiednie komunikaty...
User wpisuje 10 - program wyświetla "przecież to dziecko!" ale ... uwaga ... kończy pętlę! Nie pyta ponownie o wiek ...
Do break jeszcze nie doszedłem :-)

edytowany 4x, ostatnio: gavallon, 2017-04-21 07:00
Jeśli nie ogarniasz tej pętli getchar/putchar, to póki co proponuję zmianę awatara na http://tinyurl.com/k7c27vg - to są podstawy które człowiek się uczy w pierwszych tygodniach programowania (zwykle sam jeśli mu nie każą). - vpiotr 2017-04-21 07:06
Piotrku, miej chęć zauważyć że ... to właśnie są te pierwsze tygodnie a konkretniej pierwszy tydzień :-) I właśnie nie dość że pierwszy tydzień nauki jak mówisz to jeszcze ... robię to sam :-), nikt a nikt mi nie kazał :-) więc, spokojnie, spokojnie kolego. Jeszcze tydzień i to opanuję :-) - gavallon 2017-04-21 07:14
O goto zapomnij, niezależnie od tego co tam piszesz. - grzesiek51114 2017-04-21 07:29
Gwoli ścisłości: nie wiem co masz na myśli "w książce M.Ritchiego", ale jeśli chodzi o K&R to 1) jest to książka dwóch autorów 2) ten którego wymieniłeś nie żyje 3) przynajmniej z tego względu wypadało by podawać jego poprawne imię (tj D. Ritchie) 4) jest to jedna z najczytelniejszych (żeby nie powiedzieć najłatwiejszych) książek na rynku IT z jaką miałem do czynienia (z tym że nie czytałem nic z serii "programowanie na wesoło"). - vpiotr 2017-04-21 08:32
No faktycznie, Dennis M. Ritchie. Sorry. A co do łatwości to jeszcze nie wiem dokładnie kto lepiej pisał: Ritchie czy Prata. Planuję dzisiaj nabyć "Szkołę programowania - język C" właśnie od Praty. Wczoraj posiedziałem chwilę nad C++ właśnie z książką Praty i wydaje mi się naprawdę solidnie ogarnięta. Gdybym miał dokładnie taką samą do C to wydaje mi sie że było by znacznie łatwiej z nauką no chyba że C++ jest łatwiejszy od C a ja jeszcze tego nie czuję. Gdyby nie Arduino i AVR to zaczynał bym właśnie od C++. - gavallon 2017-04-21 08:52

Pozostało 580 znaków

2017-04-21 07:35
1

getchar() od usera miał by być numeryczny z liczbami z zakresu 0-100.

Czy wiesz do czego służy ta funkcja. Jej nazwa mówi, że co pobiera? Użyj scanf ale pewnie zaraz powiesz, ze jesteś zbyt początkujący zamiast zwyczajnie to sprawdzić.

Do break jeszcze nie doszedłem

Tja... to jest bardzo skomplikowane po prostu przerwać pętlę. Powód? Ten sam co wyżej.

Jeśli USER wybierze T to tutaj chciał bym użyć znienawidzonej komendy GOTO

Zapomnij jak najszybciej.

zamiast INT można tu użyć CHAR

Można jeżeli zmieścisz się na jednym bajcie. int zazwyczaj jest czterobajowy, a char jednobajtowy. Jeden bajt to osiem bitów więc osiem jedynek albo zer. Na ośmiu bitach możesz zapisać 256 kombinacji. Tak więc char potrafi przechować liczbę od zera do 255 więc w sam raz dla kodów klawiszy w standardzie ASCII. Jak wiadomo klawisz reprezentuje jeden znak czyli character, stąd nazwa typu danych: char, będąca skrótem od character.

Natomiast int jest skrótem od integer czyli liczba całkowita.

edytowany 8x, ostatnio: grzesiek51114, 2017-04-21 07:53
256 kombinacji*. - Patryk27 2017-04-21 07:50
nie można bo EOF - kq 2017-04-21 10:52

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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