Skocz do zawartości
MeHow

Jak spowodowac, aby nie mozna bylo wpisywac liter w scanf?

Rekomendowane odpowiedzi

Napisalem taki program:

[php:1:d1a772835c]

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

 

int main()

 

{

float x; //deklaracja liczby, ktora bedzie ulamkiem

long double epsilon=1; //deklaracja liczby epsilon, ktora bedzie warunkowac zatrzymanie petli

int i; //deklaracja stalej, ktora bedzie uzyta w petli "for"

printf("nnnttttt wersja 1.01 © nn");

printf("Program obliczajacy wartosc funkcji arctg dla danego argumentunnn");

printf("=====================================nn");

printf(" podaj argument z zakresu (-1,1) nn"); // komentarz informujacy o koniecznosci podania liczby, ktora zostanie poddana funkcji arctg

printf("=====================================nn");

scanf("%f", &x); //wczytywanie liczby x

if (x>=1 || x<=-1) //sprawdzanie, czy liczba nalezy do przedzialu (-1;1)

{

printf("podales argument z blednego przedzialun"); //komentarz informujacy o wprowadzeniu blednych danych

exit(0); //wyjscie z programu

}

for (i=1 ; epsilon>=pow(10, -8) ; i++) //petla liczaca arctg

{

epsilon = (pow(x, 1+2*i)/(1+2*i)); //wzor na kazdy kolejny element szeregu potegowego

x += pow(-1, i)*epsilon; //dodaje kolejne wyrazy ciagu z minusem lub plusem

}

printf("nnfunkcja arctg dla podanego argumentu przyjmuje wartosc:nn");

printf("%.8fn", x); //wypisuje wynik

return(0); //konczy program i zwraca 0 do pamieci komputera

// program posiada jeden bug - mozna wpisac literke, co spowoduje wypisanie wartosci 0.00000000

}

[/php:1:d1a772835c]

 

Z gory prosze o nie smianie sie z mojego programu, bo jest to jeden z pierwszych ;]

 

Skompilowany program znajduje sie pod takim adresem:

http://paranoya.org/~mehow/beta.exe

 

Moj problem jest dosyc prosty. Program ma wypisywac wartosci funkcji arctg dla x<|1| , usunalem jak powyzej widac mozliwosci x>1 lub x<-1 , ale ciagle istnieje mozliwosc wpisania litery. Wtedy wynik wynosi 0.00000000 , a ja chcialbym, aby program wypisywal komunikat informujacy uzytkownika o braku inteligencji :) . Probowalem za rada Paranoika, czegos takiego:

[php:1:d1a772835c]

if (x>='A' && x<='Z' || x>='a' && X<='z')

printf("zle dane");

exit(0);

[/php:1:d1a772835c]

kompilator nie wyrzuca bledu, lecz ciagle moge wpisac w/w literki :/

 

Jakies pomysly? :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

metoda uno

int zmienna;    char tmp[11];    scanf("%10[0123456789-]", tmp);    zmienna = atoi(tmp);

metoda due

int zmienna, i = 0;    const int n = 11;    char tmp[n], znak;    ZeroMemory(tmp, sizeof tmp);    do    {        znak = getch();                    if(isdigit(znak) || znak == '-')        {                tmp[i] = znak;                printf("%c", znak);                i++;        }        else if(znak == 8)        {                printf("%c %c", znak, znak);                tmp[--i] = 'n';        }        else                break;    }while(znak != 'n');    zmienna = atoi(tmp);

metod jest jeszcze kilka .... generalnie wcisnij f1 i pobaw sie funkcjami zaczynajacymi sie od is+mala litera ;]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pit, probowalem uzyc tego twojego pierwszego zapisu i kicha mi wyszla :/ czy moglbys mi dokladnie objasnic co i jak wstawic do mojego kodu, zeby wyszlo poprawnie :/ doszedlem do tego, ze wywalalo litery, ale przy okazji dla cyfr wyswietlalo wynik zawsze 0.000000 a to juz bardzo zle ;] ;] ;] . Sorry, ale w programowanie bawie sie od tygodnia i jak na razie nie lapie wszystkiego :).

 

Pozdr

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

metoda uno

int zmienna;    char tmp[11];    scanf("%10[0123456789-]", tmp);    zmienna = atoi(tmp);
metoda due

int zmienna, i = 0;[...]metod jest jeszcze kilka .... generalnie wcisnij f1 i pobaw sie funkcjami zaczynajacymi sie od is+mala litera ;]Tak, tak - wszystko ładnie pięknie ale chodzi o wczytanie float... a nie int. I niestety prosta zmiana typu zmiennej zmienna i funkcji na atof() nie zda się na wiele. Dlaczego? Bo chcę np. wczytać liczbę "1e-10" i co wtedy? Nie mówiąc już o "0.5", bo przecież nie mogę mieć kropki...MiHow zapewne się tylko niepotrzebnie zestresował próbując zmusić podany przez pita kod do działania...Niestety, MiHow, nie ma prostego sposobu na to żeby nie można było wpisywać liter przy użyciu funkcji scanf() W TRAKCIE WPISYWANIA. Natomiast można to zrobić PO wczytaniu znaków ale nie w taki śmieszny sposób jak podał pit.Można wczytać łańcuch znaków (np. przez fgets()) do bufora i dokonać analizy tego łańcucha na występowanie liter [znowu problem 1e-10], cyfr, znaku '-' i '.' ale to jest skomplikowane...Można prościej :)[php:1:c077bd5fad]//...int ii;ii = scanf( "%f", &x );

if (ii == 0)

{

printf("Blad: musisz podac liczbe zmiennoprzecinkowa!n");

exit(-1);

}

//...

[/php:1:c077bd5fad]

 

Wykorzystuj to co zwraca Ci funkcja scanf()!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

moj sposob jest nie tyle smieszny co wskazuje tylko jedna z wielu metod, co zreszta zaznaczylem ....

 

//... int ii; ii = scanf( "%f", &x ); if (ii == 0) {     printf("Blad: musisz podac liczbe zmiennoprzecinkowa!n");     exit(-1); } //...
to jest dopiero smieszne, bo wogole nie rozwiazuje problemu jakim jest w tym przypadku wpisywanie liter przy scanf....

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

marcinEc ... dzieki za pomoc ! teraz wszystko gra, mam tylko pytanie, dlaczego robisz if (ii == 0) , zeby wywalalo blad. Z czego wynika fakt, ze przy wpisaniu litery ii przybiera wartosc 0 ?

 

 

EDIT

Pit, jak to nie dziala jak dziala? Teraz mam taki kod i wszystko jest ok

[php:1:b10284ec70]

#include <stdio.h>

#include <stdlib.h>

#include <math.h> //odpowiedzialne za potegowanie

 

int main()

 

{

float x; //deklaracja liczby, ktora bedzie ulamkiem

long double epsilon=1; //deklaracja liczby epsilon, ktora bedzie warunkowac zatrzymanie petli

int i; //deklaracja stalej, ktora bedzie uzyta w petli "for"

int ii;

printf("nnnttttt wersja 1.01 © Michal Plewkann");

printf("Program obliczajacy wartosc funkcji arctg dla danego argumentunnn");

printf("=====================================nn");

printf(" podaj argument z zakresu (-1,1) nn"); // komentarz informujacy o koniecznosci podania liczby, ktora zostanie poddana funkcji arctg

printf("=====================================nn");

ii = scanf( "%f", &x );

if (x>=1 || x<=-1) //sprawdzanie, czy liczba nalezy do przedzialu (-1;1)

 

{

printf("Blad: podales argument z blednego przedzialun"); //komentarz informujacy o wprowadzeniu blednych danych

exit(0); //wyjscie z programu

}

 

if (ii == 0) //sprawdzanie, czy nie wprowadzono litery :)

 

{

printf("Blad: musisz podac liczbe zmiennoprzecinkowa!n");

exit(0);

}

 

for (i=1 ; epsilon>=pow(10, -8) ; i++) //petla liczaca arctg

 

{

epsilon = (pow(x, 1+2*i)/(1+2*i)); //wzor na kazdy kolejny element szeregu potegowego

x += pow(-1, i)*epsilon; //dodaje kolejne wyrazy ciagu z minusem lub plusem

}

 

printf("nnfunkcja arctg dla podanego argumentu przyjmuje wartosc:nn");

printf("%.8fn", x); //wypisuje wynik

return(0); //konczy program i zwraca 0 do pamieci komputera

}

[/php:1:b10284ec70]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

to jest dopiero smieszne, bo wogole nie rozwiazuje problemu jakim jest w tym przypadku wpisywanie liter przy scanf....

pit - spokojnie. Przeczytaj sobie oryginalny post, przeczytaj odpowiedź jeszcze raz... i znowu przeczytaj... :roll:

 

marcinEc ... dzieki za pomoc ! teraz wszystko gra, mam tylko pytanie, dlaczego robisz if (ii == 0) , zeby wywalalo blad. Z czego wynika fakt, ze przy wpisaniu litery ii przybiera wartosc 0 ?

Czy dysponujesz opisem bibliotek standardowych C? Masz internet? Możesz znaleźć opis... :)

scanf() zwraca ilość POPRAWNIE przypisanych sekwencji formatujących (lub EOF). U nas jest tylko jedna ("%f") i oznacza ona liczbę zmiennoprzecinkową, dlatego po poprawnym rozpoznaniu liczby i przypisaniu scanf() zwróci wartość 1, a przeciwnym wypadku 0, co oznacza niemożność rozpoznania wpisanego łańcucha - ale to tylko w tak prostym przypadku jak u nas! Można np. wczytać dwie liczby "%f %f" wtedy scanf() może zwrócić 0, 1 lub 2 - zależnie od ilości poprawnych przypisań. 8)

 

p.s. Sory za MiHow, zamiast MeHow ;->

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...