obiboqs Opublikowano 11 Grudnia 2007 Zgłoś Opublikowano 11 Grudnia 2007 (edytowane) Witam. Mam problem/dylemat. Jestem początkujący i mam dylemat z wielowarunkową funkcją if/else wykonującą blok instrukcji dla warunku. Gdy zapiszę to tak: (...)if (warunek1){instrukcja1;instrukcja2;}else if (warunek2) { instrukcja3; instrukcja4; } else if (warunek3) { instrukcja5; instrukcja6; }to program wogóle jakby tego bloku tej funkcji warunkowej "nie widział". Jak mam to więc zapisać? Pzdr. Edytowane 11 Grudnia 2007 przez obiboqs Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
SGJ Opublikowano 11 Grudnia 2007 Zgłoś Opublikowano 11 Grudnia 2007 else if Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
obiboqs Opublikowano 11 Grudnia 2007 Zgłoś Opublikowano 11 Grudnia 2007 Oj, tak, else if (rozkojarzony byłem i źle zapisałem) - oczywiście w kompilatorze miałem zapisane poprawnie (else if), tutaj tylko popełniłem błąd z pośpiechu. Zaraz poprawię. Jednakże to nie zmienia faktu że jako tako nie chce mi ten konspekt działać - na końcu mam getchar() więc w momencie gdy ma przejść do rozpatrzenia właśnie tego konspektu program zostaje zakończony na poprzedniej funkcji i po wciśnięciu klawisza okienko się wyłącza. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 11 Grudnia 2007 Zgłoś Opublikowano 11 Grudnia 2007 moja dobra rada... naucz się korzystać z debugera i odpal sobie program w pracy krokowej :) ewentualnie postaw pułapkę (tzw BreakPoint) w miejscu w którym chcesz aby program się zatrzymał a dalsze wykonywanie kodu będziesz mógł sobie linijka po linijce oglądać, podglądając wartości zmiennych - zależnie od tego w jakim środowisku pracujesz. Nie do końca tez rozumiem ostatniego posta. Co się wykonuje, jaka poprzednia funkcja, skąd wiesz że nie wykonuje się, jak to Ty nazywasz konspekt :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
obiboqs Opublikowano 11 Grudnia 2007 Zgłoś Opublikowano 11 Grudnia 2007 Po prostu mam program, do którego rozwiązania prowadzi taki właśnie konspekt warunków jaki napisałem w kodzie powyżej (rzecz jasna z zapisanymi odpowiednimi warunkami i instrukcjami) - po tym jest już tylko zakończenie pracy programu - getchar() aby można było zobaczyć wartości rozwiązania wyprowadzone w jednej z instrukcji tego "konspektu" i cin.ignore(). Program tak jakby realizuje ten "wstęp", "omija" ten konspekt funkcji warunkowych i od razu przechodzi do zakończenia. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
tukamon Opublikowano 11 Grudnia 2007 Zgłoś Opublikowano 11 Grudnia 2007 dorzuc jeszcze kontrolnego else'a, bo moze nie lapie sie w zasieg warunkow ifow Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
KrOOliK89 Opublikowano 11 Grudnia 2007 Zgłoś Opublikowano 11 Grudnia 2007 if (warunek1){ instrukcja1; instrukcja2;}else{ if (warunek2) { instrukcja3; instrukcja4; } else { if (warunek3) { instrukcja5; instrukcja6; } }} Nie lubię klamerek... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
obiboqs Opublikowano 11 Grudnia 2007 Zgłoś Opublikowano 11 Grudnia 2007 Dobra, wiem o co chodzi. Jednak zastosowałem to co sugerował KrOOlik89 i też coś jest nie tak. Podam Wam więc kod źródłowy i powiedzcie mi co tutaj powinienem poprawić... Dla informacji: To nie jest moje zadanie domowe do szkoły ani nic takiego, dokształcam się we własnym zakresie. Zdaję sobie bowiem sprawę że wziąłem może taki nieszczęśliwy przykład który mógłby być (z racji tego że jest dość mocno związany ze szkołą) kojarzony jako zadanie domowe itp. O co mi chodzi? Chcę stworzyć algorytm, który obliczał będzie wartości pierwiastków równania kwadratowego w postaci ax2+bx+c=0. Jednocześnie chcę by algorytm uwzględniał założenie równania kwadratowego (że a musi być różne od 0). Lista kroków wyglądałaby następująco: 1. Rozpoczęcie2. Wprowadzenie danych3. Sprawdzenie czy a=0- jeżeli tak to komunikat o błędnych danych i koniec- w przeciwnym wypadku kontynuujemy3. Obliczenie wyróżnika4. Obliczenie pierwiastka z wyróżnika5. Sprawdzenie, czy wyróżnik jest mniejszy od 0- jeżeli tak to komunikat że nie ma pierwiastków i koniec- jeżeli nie to sprawdzenie czy wyróżnik jest równy 0* jeżeli tak to obliczenie jedynego pierwiastka, wyprowadzenie i koniec* jeżeli nie (tzn. że wyróżnik jest większy od 0) to obliczenie i wyprowadzenie obu pierwiastków i koniec Kod źródłowy jaki mi się udało stworzyć to: (poprawcie wszelkie błędy jeżeli możecie, bo wiem że ich jest dużo - poza tym jeżeli mogę prosić to bez jakichś skomplikowanych rozwiązań bo jestem początkujący - wiem że Cpp jest na tyle elastyczny że jedno można zapisac na wiele sposobów) #include <iostream.h> #include <math.h>main() {int a, b, c;float delta, x1, x2, pierwdel;cout << "Wprowadz a: ";cin >> a;cout << "Wprowadz b: ";cin >> b;cout << "Wprowadz c: ";cin >> c;if(a=0){cout << "Nieprawidłowe dane. Wspolczynnik a musi byc wiekszy od 0";getchar();}else{delta=b^2-(4*a*c);pierwdel = sqrt(delta);cout << "Wyróżnik trójmianu kwadratowego wynosi: " << delta;cout << "Pierwiastek z wyroznika wynosi: " << pierwdel;if(delta<0) { cout << "Rownanie nie ma pierwiastkow w zbiorze liczb rzeczywistych"; getchar(); cin.ignore(); } else { if(delta=0) { x1=-b/2*a; cout << "Rownanie ma jeden pierwiastek podwojny. Wynosi on: " << x1; getchar(); cin.ignore(); } else if(delta>0) { x1 = (-b + pierwdel)/4*a; x2 = (-b - pierwdel)/4*a; cout << "Rownanie ma dwa pierwiastki. /n Pierwszy pierwiastek wynosi: "; cout << x1; cout << "/n Drugi pierwiastek wynosi: "; cout << x2; getchar(); cin.ignore();}}}} Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
KrOOliK89 Opublikowano 11 Grudnia 2007 Zgłoś Opublikowano 11 Grudnia 2007 (edytowane) #include <iostream.h> #include <math.h>main(){ int a, b, c; float delta, x1, x2, pierwdel; cout << "Wprowadz a: "; cin >> a; cout << "Wprowadz b: "; cin >> b; cout << "Wprowadz c: "; cin >> c; if(a=0) { cout << "Nieprawidłowe dane. Wspolczynnik a musi byc wiekszy od 0"; getchar(); } else { delta=b^2-(4*a*c); pierwdel = sqrt(delta); cout << "Wyróżnik trójmianu kwadratowego wynosi: " << delta; cout << "Pierwiastek z wyroznika wynosi: " << pierwdel; if(delta<0) { cout << "Rownanie nie ma pierwiastkow w zbiorze liczb rzeczywistych"; getchar(); cin.ignore(); } else { if(delta=0) { x1=-b/2*a; cout << "Rownanie ma jeden pierwiastek podwojny. Wynosi on: " << x1; getchar(); cin.ignore(); } else { if(delta>0) { x1 = (-b + pierwdel)/4*a; x2 = (-b - pierwdel)/4*a; cout << "Rownanie ma dwa pierwiastki. /n Pierwszy pierwiastek wynosi: "; cout << x1; cout << "/n Drugi pierwiastek wynosi: "; cout << x2; getchar(); cin.ignore(); } } } } } Pisane bez kompilatora:P Rób wcięcia bo bez tego ani rusz. Jak to nie zadziała to jutro odpalę kompilator i zobaczę:P edit. Tak sobie przejrzałem ten kod i : if(delta=0)zastanawiam się co to k[ciach] jest?! "=" jest operatorem przypisania! Więc nie możesz zrobić if(delta=0), a musisz if(delta==0). "==" To jest porównanie! Poczytaj o instrukcjach warunkowych itp... Bez tego nic nie zrobisz. A program pewnie nie działa przez tego typu "głupoty". To samo na początku: if(a=0) Dlatego warunek nie jest spełniony, a zapewne staje się zerem i koniec programu.... Edytowane 12 Grudnia 2007 przez KrOOliK89 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
tukamon Opublikowano 12 Grudnia 2007 Zgłoś Opublikowano 12 Grudnia 2007 no i b*b a nie b^2 imo Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
obiboqs Opublikowano 12 Grudnia 2007 Zgłoś Opublikowano 12 Grudnia 2007 Jeżeli wpiszę do kompilatora: #include <iostream.h> #include <math.h>main(){ int a, b, c; float delta, x1, x2, pierwdel; cout << "Wprowadz a: "; cin >> a; cout << "Wprowadz b: "; cin >> b; cout << "Wprowadz c: "; cin >> c; if(a==0) { cout << "Nieprawidłowe dane. Wspolczynnik a musi byc wiekszy od 0"; getchar(); } else { delta=b*b-(4*a*c); pierwdel = sqrt(delta); cout << "Wyróżnik trójmianu kwadratowego wynosi: " << delta; cout << "Pierwiastek z wyroznika wynosi: " << pierwdel; if(delta<0) { cout << "Rownanie nie ma pierwiastkow w zbiorze liczb rzeczywistych"; getchar(); cin.ignore(); } else { if(delta=0) { x1=-b/2*a; cout << "Rownanie ma jeden pierwiastek podwojny. Wynosi on: " << x1; getchar(); cin.ignore(); } else { if(delta>0) { x1 = (-b + pierwdel)/4*a; x2 = (-b - pierwdel)/4*a; cout << "Rownanie ma dwa pierwiastki. /n Pierwszy pierwiastek wynosi: "; cout << x1; cout << "/n Drugi pierwiastek wynosi: "; cout << x2; getchar(); cin.ignore(); } } } } }To program się skompiluje, ale nastąpi jego zamknięcie zaraz po wpisaniu danych. Jeżeli zrobię delta=b^2-(4*a*c) [tak jak było na początku] to wywali mi jakąś zbitkę tekstu z wszystkich warunków po trochu. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
KrOOliK89 Opublikowano 12 Grudnia 2007 Zgłoś Opublikowano 12 Grudnia 2007 (edytowane) Cytat Tak sobie przejrzałem ten kod i : if(delta=0)zastanawiam się co to k[ciach] jest?! "=" jest operatorem przypisania! Więc nie możesz zrobić if(delta=0), a musisz if(delta==0). "==" To jest porównanie! Poczytaj o instrukcjach warunkowych itp... Bez tego nic nie zrobisz. A program pewnie nie działa przez tego typu "głupoty". To samo na początku: if(a=0) Dlatego warunek nie jest spełniony, a zapewne staje się zerem i koniec programu.... Jak zrozumiesz co tu napisałem, to będziesz wiedział czemu. Błąd jest banalny, ale trochę własnego wkładu... Poprawiłeś w jednym miejscu, a zostało if(delta=0) Edytowane 12 Grudnia 2007 przez KrOOliK89 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
obiboqs Opublikowano 12 Grudnia 2007 Zgłoś Opublikowano 12 Grudnia 2007 (edytowane) Oh, sh#t :P Faktycznie - w jednym miejscu poprawiłem, w drugim zostało.. Zrozumiałem jak najbardziej to co napisałeś ;) Tylko że nie zwróciłem uwagi że jest drugi warunek z "=". Za warunkiem gdy a=0 dopisałem za "getchar();" "cin.ignore();" bo inaczej program sam się wyłączał. Poza tym przypisanie zmiennej pierwdel wartości sqrt(delta) przerzuciłem z miejsca w którym się do tej pory znajdowało do miejsca wykonywania instrukcji gdy delta>0 (bo inaczej gdy delta była mniejsza od 0 musiało wyciągać pierwiastek kwadratowy z liczby ujemnej co jest kompletną bzdurą) jednocześnie mażąc wyświetlenie komunikatu o tym, ile wynosi pierwiastek z delty. Teraz już pozostaje tylko fakt tego, że komunikaty które się ukazują są zbitką tekstu pomimo wstawienia przeze mnie "/n" w niektórych tam momentach - o ile znam życie to popełniłem tam podobnie głupi błąd jak z tym przypisaniem w warunku no ale jakoś nie umiem tego rozszyfrować.. :P Pzdr. edit: Obecnie kod wygląda następująco: #include <iostream.h> #include <math.h>main(){ int a, b, c; float delta, x1, x2, pierwdel; cout << "Wprowadz a: "; cin >> a; cout << "Wprowadz b: "; cin >> b; cout << "Wprowadz c: "; cin >> c; if(a==0) { cout << "Nieprawidłowe dane. Wspolczynnik a musi byc wiekszy od 0"; getchar(); cin.ignore(); } else { delta=b*b-(4*a*c); cout << "Wyroznik trojmianu kwadratowego wynosi: " << delta; if(delta<0) { cout << "Rownanie nie ma pierwiastkow w zbiorze liczb rzeczywistych"; getchar(); cin.ignore(); } else { if(delta==0) { x1=-b/2*a; cout << "Rownanie ma jeden pierwiastek podwojny. Wynosi on: " << x1; getchar(); cin.ignore(); } else { if(delta>0) { pierwdel = sqrt(delta); x1 = (-b + pierwdel)/4*a; x2 = (-b - pierwdel)/4*a; cout << "Rownanie ma dwa pierwiastki. /n Pierwszy pierwiastek wynosi: "; cout << x1; cout << "/n Drugi pierwiastek wynosi: "; cout << x2; getchar(); cin.ignore(); } } } } } edit2: Jak to skończę to się biorę za pętle iteracyjne - zobaczymy jak mi to pójdzie ;) :P Edytowane 12 Grudnia 2007 przez obiboqs Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kfgz Opublikowano 12 Grudnia 2007 Zgłoś Opublikowano 12 Grudnia 2007 (edytowane) Cytat Teraz już pozostaje tylko fakt tego, że komunikaty które się ukazują są zbitką tekstu pomimo wstawienia przeze mnie "/n" w niektórych tam momentach - o ile znam życie to popełniłem tam podobnie głupi błąd jak z tym przypisaniem w warunku no ale jakoś nie umiem tego rozszyfrować\n lub newline Edytowane 12 Grudnia 2007 przez Dj_AnT Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
obiboqs Opublikowano 12 Grudnia 2007 Zgłoś Opublikowano 12 Grudnia 2007 Aha, nie ten ukośnik - rozumiem :P Ale ze mnie n00b... :lol: Dobra, biorę się za pętle. Na razie dzięki wszystkim za pomoc - jak będę miał jeszcze jakieś problemy to się odezwę. Pzdr. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
KrOOliK89 Opublikowano 13 Grudnia 2007 Zgłoś Opublikowano 13 Grudnia 2007 (edytowane) obiboqs napisał(a): Oh, sh#t :P Faktycznie - w jednym miejscu poprawiłem, w drugim zostało.. Zrozumiałem jak najbardziej to co napisałeś ;) Tylko że nie zwróciłem uwagi że jest drugi warunek z "=". Napisałem tak bo nie zauważyłem, że poprawiłeś w jednym ifie. Później to zobaczyłem i edytowałem post. obiboqs napisał(a): cout << "Wprowadz a: "; cin >> a; cout << "Wprowadz b: "; cin >> b; cout << "Wprowadz c: "; cin >> c; Hmm nie lepiej zrobić tak: cout<<"Wprowadz a: "; cin>>a;Jakoś tak lepiej (imo). Cytat Za warunkiem gdy a=0 dopisałem za "getchar();" "cin.ignore();" bo inaczej program sam się wyłączał.Znów piszę z pamięci ale można też zrobić tak: system("PAUSE");lub: #include<conio.h>getch(); obiboqs napisał(a): Teraz już pozostaje tylko fakt tego, że komunikaty które się ukazują są zbitką tekstu pomimo wstawienia przeze mnie "/n" w niektórych tam momentach - o ile znam życie to popełniłem tam podobnie głupi błąd jak z tym przypisaniem w warunku no ale jakoś nie umiem tego rozszyfrować.. :PMożesz robić tak jak napisał Dj_AnT lub: cout<<"Jakis tekst"<<endl; edit: Parę błędów Edytowane 13 Grudnia 2007 przez KrOOliK89 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 14 Grudnia 2007 Zgłoś Opublikowano 14 Grudnia 2007 widzę ze kolega odporny na wiedzę :) Już byś 100x zauważył błąd korzystając z debugera :) Przecież bez tego się NIE DA pisać programów. Jesli chcesz sie uczyć programować zacznij od nauki obsługi debugera.. która sprowadza się raptem do 4 klawiszy (put breakpoint, step in, step over, run) oraz co najciekawsze - podglądu zmiennych po najechaniu na nie mychą. Już nie wspomnę o tym, że visual studio pokazuje nawet wartości zwracane z funkcji i ma w ogóle 30 innych ficzerów z czego z 20 to nawet ja nie korzystam :) - a na codzień po 8g dziennie debuguje programy Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
obiboqs Opublikowano 15 Grudnia 2007 Zgłoś Opublikowano 15 Grudnia 2007 PelzaK napisał(a): widzę ze kolega odporny na wiedzę :) Już byś 100x zauważył błąd korzystając z debugera :) Przecież bez tego się NIE DA pisać programów. Jesli chcesz sie uczyć programować zacznij od nauki obsługi debugera..Słusznie. Wybacz moją "odpornośc na wiedzę" i miej wyrozumiałość - bo nie mam tak jak Ty styczności z tym od lat, a dopiero od kilku tygodni i to jeszcze w takim "trybie weekendowym". Wiem że powinienem nauczyć się używać debuggera i tak dalej - ale to wszystko w swoim czasie. Na razie starałem się opanować podstawowe funkcje i to, gdzie co i w jaki sposób daną funkcję zapisywać (tzn. nauczyć się gdzie wstawić średnik, a gdzie klamerkę mówiąc tak "na chłopski rozum"). Wolałem więc, aby wątpliwości w tym pomógł mi rozwiązać ktoś obeznany w temacie (abym mógł to lepiej zrozumieć i otrzymać odpowiedź konkretnie pod kątem tego przykładu - bo to w końcu podstawy) - debugger swoją drogą i w swoim czasie. Pzdr. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 15 Grudnia 2007 Zgłoś Opublikowano 15 Grudnia 2007 nie, opanuj najpierw debuger to zobaczysz, że szybciej zrozumiesz jak działają funkcje i jak wykonuje się kod - nikt inny jak debuger w pracy krokowej nie pokaże Ci jak działa program i dlaczego nie działa tak jak byś tego chciał. Jak ja zaczynałem to nie miałem od kogo wysłuchać dobrych rad :) ale na moje szczęście jak używałem delphi to zainteresowałem się 2 magicznymi guziczkami do pracy krokowej. Nie mówię Ci przecież żebyś od razu uczył się debugować programy wielowątkowe. Poznanie debugera na tylw aby ustawić breakpointa i puścić program krok po kroku to 10 minut nauki raptem - na czym możesz tylko zyskać podczas uczenia się jak działa np funkcja switch(). Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...