Wczytywanie zmiennych liczbowych w C

soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Wczytywanie zmiennych liczbowych w C

Post autor: soku11 »

Ogolnie w C nie ma takiego pojecia jak klawiatura... Masz do dyspozycji TYLKO strumienie stdin i stdout. Aby sprawdzic poprawnosc wprowadzonych danych wystarczy sprawdzic, co zwroci scanf. Bo jak wiadomo, scanf zwraca ilosc poprawnie wczytanych danych. Czyli jesli cos sie nie powiedzie (czekal na cyfre, a sczytano znak), to nie zwroci poprawnej ilosci danych. Przyklad:

Kod: Zaznacz cały

#include <stdio.h>

int main()
{
  int liczba;

  printf("Podaj LICZBE: ");
  if(scanf("%d",&liczba)!=1)
    printf("To nie jest liczba!\n");
  else
    printf("Wpisales: %d\n",liczba);

  return 0;
}

Co do 'czyszczenia', to niestety rozwiazanie to nie jest dobre. Warto wogole zauwazyc, do czego sluzy funkcja fflush(), bo gwarantuje ze na pewno nie do czyszczenia bufora :) Poprostu w niektoryh implementacjach dziala to tak jak dziala. Aby normalnie oczywiscic bufor trzeba pobrac wszystkie oczekujace w nim znaki.

Pozdrawiam.
Awatar użytkownika
Harry Xin
Użytkownik
Użytkownik
Posty: 545
Rejestracja: 9 sie 2007, o 19:15
Płeć: Mężczyzna
Podziękował: 148 razy
Pomógł: 83 razy

Wczytywanie zmiennych liczbowych w C

Post autor: Harry Xin »

soku11, nie obsługujemy tu pliku tylko klawiaturę, więc problemu nie widzę.
A propos... Funkcja printf nie zwraca wartości true lub false, tylko liczbę typu int, więc przyrównywanie tego do jedynki nie jest chyba najlepszym pomysłem.
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

Wczytywanie zmiennych liczbowych w C

Post autor: matshadow »

Harry Xin pisze: matshadow, ja błędu nie widzę - chcemy otrzymać liczbę z tego przedziału 1-10, więc pętla ma się wykonywać dopóki nie zostanie podana taka wartość.
Jeżeli byśmy zaprzeczyli, to pętla wykonywałaby się dopóki podawalibyśmy wartości z tego przedziału.
To chyba właśnie ma sens Bo wtedy podajesz aż nie podasz spoza przedziału, a bez mojego warunku po jednym wczytaniu liczby z przedziału [0-10] program by się zakończył - jak chcemy tylko raz wczytać, to na jasną cholerę pętlę robić?
Chociaż jak wiadomo, "zależy od punktu widzenia"
Pozdrawiam
Awatar użytkownika
Harry Xin
Użytkownik
Użytkownik
Posty: 545
Rejestracja: 9 sie 2007, o 19:15
Płeć: Mężczyzna
Podziękował: 148 razy
Pomógł: 83 razy

Wczytywanie zmiennych liczbowych w C

Post autor: Harry Xin »

Po co tak robić?
Na przykład wyświetlasz menu i dopisujesz: "Wpisz numer opcji (1-10)." Jak ktoś poda inną to wystarczy ten program rozwinąć o jednego printfa - "Blad. Nie ma takiej opcji. Sprobuj ponownie." i już jesteśmy dobrze zabezpieczeni przed błędami. A jakby ktoś wpisał źle i nie byłoby pętli to nie wiadomo co by się dalej działo.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Wczytywanie zmiennych liczbowych w C

Post autor: soku11 »

Mowie po raz kolejny - w C nie wiemy nic o klawiaturze, tylko o strumieniach. Aby to potwierdzic wystarczy uruchomic jakikolwiek program z przekierowaniem strumienia wejsciowego z np. pliku i podobnie ze strumieniem wyjsciowym. Wtedy polecenia scanf czytalyby z pliku pierwszego, a printf pisalo do drugiego. Nawet nie bralbys udzialu w dzialaniu programu. Ponadto pliki sa tez pewnymi strumieniami...

Co do tego flusha, to radze poczytac:
... flush.html
Jak widac dla strumieni wejsciowych jest on niezdefiniowany:
If it was open for reading and the last operation was an input operation, the behavior depends on the specific library implementation. In some implementations this causes the input buffer to be cleared, but this is not standard behavior.
Nie przyrownuje zadnego printfa, tylko scanfa. I on rzeczywiscie zwraca liczbe typu int, bedaca liczba poprawnie wprowadzonych danych. Chce wczytac jedna liczbe, wiec jak zwroci cos innego od 1, to znaczy ze wczytal zle.

Co do warunku w petli while, to jest on jak najbardziej poprawny. Zadne not przed nim nie jest potrzebne.

Pozdrawiam.
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

Wczytywanie zmiennych liczbowych w C

Post autor: kadiii »

Zaciekawiło mnie to zadanko bo jest to widoczne niedopracowanie języka C. Kod, który ma spełniać to zadanie powinien wygladać tak(nie używa niezdefiniowanych zachowań funkcji wiec powinien działać na wszystkich platformach):

Kod: Zaznacz cały

#include<stdio.h>
int main()
{
 int liczba=-1,e=2;
 char c='\0';
do
{
  printf("Podaj liczbe [0-10]:");
  e=scanf("%d",&liczba);
  while ( ( c = getchar() ) != '\n' && c != EOF ) ; // 1
}while((e!=1)||(liczba<0||liczba>10));
 printf("Nasza poprawna liczba to :%d",liczba);
 return 0;
}
Ciekawym elementem jest tu oczyszczanie bufora(1), swoją drogą powinno to być lepiej rozwiazane.
ODPOWIEDZ