MeHow Opublikowano 21 Października 2004 Zgłoś Opublikowano 21 Października 2004 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? :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
pit Opublikowano 22 Października 2004 Zgłoś Opublikowano 22 Października 2004 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 ;] Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
MeHow Opublikowano 22 Października 2004 Zgłoś Opublikowano 22 Października 2004 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
marcinEc Opublikowano 23 Października 2004 Zgłoś Opublikowano 23 Października 2004 Cytat 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()! Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
pit Opublikowano 23 Października 2004 Zgłoś Opublikowano 23 Października 2004 moj sposob jest nie tyle smieszny co wskazuje tylko jedna z wielu metod, co zreszta zaznaczylem .... Cytat //... 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.... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
MeHow Opublikowano 23 Października 2004 Zgłoś Opublikowano 23 Października 2004 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] Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
pit Opublikowano 23 Października 2004 Zgłoś Opublikowano 23 Października 2004 w takim razie zle zrozumialem pytanie ... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
marcinEc Opublikowano 24 Października 2004 Zgłoś Opublikowano 24 Października 2004 Cytat 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: Cytat 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 ;-> Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Megabyte Opublikowano 24 Października 2004 Zgłoś Opublikowano 24 Października 2004 Cytat 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 ? http://msdn.microsoft.com/library/default.....2c_.wscanf.asp Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...