Skocz do zawartości
obiboqs

[cpp] Funkcja If/else - Wiele Instrukcji Dla Warunku

Rekomendowane odpowiedzi

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 przez obiboqs

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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();}}}}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

#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 przez KrOOliK89

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  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 przez KrOOliK89

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez obiboqs

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  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 przez Dj_AnT

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  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ć.. :P

Możesz robić tak jak napisał Dj_AnT lub:

cout<<"Jakis tekst"<<endl;

edit:

Parę błędów

Edytowane przez KrOOliK89

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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().

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.



×
×
  • Dodaj nową pozycję...