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

C Scan f - sprawdzenie czy wpisana wartość jest liczbą czy innym znakiem

0 głosów
190 wizyt
pytanie zadane 18 czerwca 2019 w C i C++ przez boniek Nowicjusz (190 p.)
edycja 19 czerwca 2019 przez Eryk Andrzejewski

Potrzebuję funkcji która sprawdzi mi czy podana wartość jest liczbą i innym znakiem, znalazłem taki kod 

#include <stdio.h>

int main(){

   double a;
   int retVal;
   char ch;

   printf("Podaj liczbe a:");
   retVal = scanf("%lf", &a);

   while (retVal != 1)
   {
      while((ch = getchar()) != '\n' && ch != EOF);
      printf("Podaj liczbę a ponownie:");
      retVal = scanf("%lf", &a);
   }

   return 0;
}

Ten kod jest prawidłowy, działa tak jak powinien. Mam tylko problem z zrozumieniem warunku

while((ch = getchar()) != '\n' && ch != EOF);

Czy ktoś mógłby mi go wytłumaczyć ? Z góry dziękuję za pomoc

komentarz 19 czerwca 2019 przez Eryk Andrzejewski Mędrzec (163,940 p.)

Taka porada - wrzucając kod w bloczek, warto też ustawić mu odpowiedni język programowania - wtedy składnia będzie poprawnie kolorowana. smiley

1 odpowiedź

+2 głosów
odpowiedź 19 czerwca 2019 przez Eryk Andrzejewski Mędrzec (163,940 p.)

Trzeba ten warunek rozbić na mniejsze fragmenty. Kluczowym elementem, który trzeba zrozumieć jest to, jak zachowuje się przypisanie wewnątrz warunku.

Masz tam taki kod:

ch = getchar()

Jak nietrudno się domyślić, przypisuje on do zmiennej  ch  to, co zwróci funkcja getchar(). Lecz teraz trzeba sobie zadać pytanie - co taki zapis robi w warunku i jak on się tam zachowuje. Można je sformułować inaczej - jaką wartość zwraca poniższy kod: (czyli jaka wartość zostanie "podstawiona" w to miejsce w momencie wykonania kodu).

(ch = getchar())

Odpowiedź jest prosta - w to miejsce zostanie podstawiona nowa wartość zmiennej ch, czyli ta wartość którą zwróciła funkcja getchar().

Dysponując już taką wiedzą, można zrozumieć o co chodzi w tym zapisie. Po prostu w jednym miejscu zapisujemy do zmiennej ch nową wartość i sprawdzamy, czy wartość ta nie jest przypadkiem różna od znaku nowej linii i tak dalej… całego warunku już nie będę tłumaczył. Kod ten pozwala po prostu skrócić zapis (choć może to komplikować zrozumienie kodu - ja osobiście starałbym się takich rzeczy wewnątrz warunku nie robić).

Dodatkowo za pętlą dano średnik, co jest równoznaczne z tym, że ta pętla ma nie robić nic, dopóki znak jest różny od znaku nowej linii lub EOF.

Jeżeli jestem jeszcze w stanie rozsądnie myśleć o tej godzinie, to alternatywny zapis tej pętli będzie taki:

do {
    ch = getchar();
} while (ch != '\n' && ch != EOF);

Mam nadzieję, że pomogłem. smiley

komentarz 19 czerwca 2019 przez boniek Nowicjusz (190 p.)
Dzięki wielkie, teraz już wiem :)
komentarz 19 czerwca 2019 przez Eryk Andrzejewski Mędrzec (163,940 p.)

Cieszę się. smiley

Podobne pytania

0 głosów
1 odpowiedź 73 wizyt
+2 głosów
3 odpowiedzi 253 wizyt
0 głosów
4 odpowiedzi 1,061 wizyt
pytanie zadane 26 maja 2017 w C i C++ przez Kuba2263 Nowicjusz (200 p.)
Porady nie od parady
Zadając pytanie postaraj się o odpowiedni tytuł, kategorię oraz tagi.Tagi

84,132 zapytań

132,902 odpowiedzi

293,920 komentarzy

55,556 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...