Zaloguj się, aby obserwować  
Bartuc

Język C / C++ / C# / Java - pytania, problemy...

1979 postów w tym temacie

Ma problem i bardzo proszę o radę.
Chcę zrobić tak, aby program po zakończeniu nie wracał do systemu. Tzn. np oblicza pole kwadratu. Obliczy je i chcę aby nie wracał do systemu tylko od razu żeby można było obliczyć następne pole kwadratu bez wychodzenia z systemu.
Natknąłem się na taki sposób:
do
{
tutaj kod do pola kwadratu i jego wypisanie na konsoli;
cout<<"czy chcesz dokonać następnych obliczeń?"<< endl;
replay=getchar();
}
while (replay==''y'' || replay==''Y'');
}
niestety mimo tego nie działa. Tzn zamyka program.
Proszę o pomoc!

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

>/.../
-> Przyznam, ze ze standardowej funkcji bibliotecznej getchar() nie korzystalem, wiec nie wiem w czym tkwi problem, podejrzewam ze skladnik conio.h - getch() powinien dzialac (nie mam teraz jak sprawdzic), a standardowe std::cin dziala na pewno - sprawdzilem :)
Znaczy zamien na:

...
cin>>replay;
} while...

I powinno byc ok.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Niestety nic z tego. Pełny mój kod to:


int main()
{
richtig = 0;
falsch = 0;
char replay;
do
{
cout<<"Zapraszam do konkursu"<<endl;
pytanie1 ();
pytanie2 ();
pytanie3 ();
pytanie4 ();
pytanie5 ();
pytanie6 ();
pytanie7 ();
pytanie8 ();
pytanie9 ();
pytanie10 ();
cout<<"Liczba prawidlowych odpowiedzi ="<<richtig<< endl;
cout<<"Liczba nieprawidlowych odpowiedzi="<<falsch<<endl;
cout<<"Czy chcesz odpowiedziec jeszcze raz?"<< endl;
replay=getchar();
}
while(replay==''y'' || replay==''Y'');
system("PAUSE");
return 0;
}
Dalej bardzo proszę o pomoc/

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Masz tu działający kod w C (tylko dorzuć sobie wywołania funkcji i przerób na Cpp jeśli musisz):

#include <stdio.h>
int main()
{
int richtig = 0;
int falsch = 0;
char replay;

do
{
printf("Zapraszam do konkursu\n");
printf("Liczba prawidlowych odpowiedzi = %d\n", richtig);
printf("Liczba nieprawidlowych odpowiedzi= %d\n", falsch);
printf("Czy chcesz odpowiedziec jeszcze raz?\n");
scanf("\n%c", &replay);
}
while((replay == ''y'') || (replay==''Y''));

return 0;
}

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

I to jest dokładnie to co napisał mi LifaRno i co zadziałało. Po prostu z pośpiechu nie uważnie wprowadziłem zmiany i nie udało się, ale później już byłem bardziej dokładny i jest ok. Dzięki za pomoc.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

A jeśli mogę to mam jeszcze jeden mały problem. Sprawa jest dokładnie taka sama jak wcześniej tylko teraz to nie wiem gdzie wstawić tą instrukcję, Gdzie bym nie wstawił jest źle. Oto kod:
//program obliczajńÖcy pola figur pŇāaskich
#include <iostream>
using namespace std;

int main (int argc, char * const argv[])
{
char znak;
int a, b;
int pole;
cout<<" 1 - Oblicz pole kwadratu"<<endl;
cout<<" 2 - Oblicz pole prostokata"<< endl;
cout<<" 3 - Oblicz pole trojkata"<< endl;
cout<<" 4 - Oblicz pole kola"<<endl;
znak= getchar();
cout<<"Wprowadz dlugosc boku pierwszego:"<< endl;
cin>> a;
cout<<"Wprowadz dlugosc boku drugiego:"<< endl;
cin>> b;

switch(znak)
{
case ''1'':
pole= a*a;
cout<<"Pole kwadratu wynosi:"<< pole<<endl;
break;
case ''2'':
pole= a*b;
cout<<"Pole prostokata wynosi:"<< pole<< endl;
break;
}

system("PAUSE");
return 0;
}

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 11.10.2007 o 21:57, pretorianie napisał:

/.../

Na poczatek polecilbym podzielic program na kilka procedur (pewnie pojecie klas jest Ci na razie obce), np wyswietlajaca menu, zwracalaby ona znak wpisany przez uzytkownika

int menu(void)
{
//wyswietl wszystko
return getchar();
};

i osobna funkcje (raczej procedura ale to malo istotne w tej chwili ;) do obliczania kazdego pola, np.

void kwadrat(void)
{
//uzytkownik wprowadza dane
//pokazujesz wynik
}

a w main robisz wtedy

switch( menu() )
{
case 1:
...
...
}

wtedy w do {...} while () , dajesz wlasnie samego switcha w main.

Oczywiscie mozna to rozwiazac na wiele innych sposobow, a to taka moja propozycja na poczatek nauki jezyka :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Funkcje już przerabiałem a klasy dopiero zacząłem. Więc proponujesz mi podzielić wszystko na funkcje?
A nie rozdrobni mi to niepotrzebnie kodu? Kod się będzie wydłużał tylko dlatego że będę chciał go zamknąć klamrami do{}while. Bo przecież pod case ''1'' będę musiał wsadzić funkcję np
case ''1'':
pole kwadratu ();

a później po switchu jeszcze wszystkie funkcje

int pole kwadratu (int pole)
{


}

Nie za dużo tego wszystkiego i to do tego niepotrzebnie?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 11.10.2007 o 22:55, pretorianie napisał:

Nie za dużo tego wszystkiego i to do tego niepotrzebnie?

-> Nie wydluzy sie niepotrzebnie, tylko potrzebnie ulatwi czytelnosc programu :) Bo rownie dobrze moglbys objac obecnie w do...while wszystko procz deklaracji zmiennych - tylko czy aby tak nalezy programowac ? :) Zwroc tez uwage na to, ze obecnie kod ktory podales jest niepelny, bo nie oblicza pola kola, ani trojkata, a na dodatek przyjmuje jedynie dwie zmienne - a i b, ktore zawsze sa bokami. O ile sprawdza sie to w przypadku kwadratu i prostokata, to by zmiescic wszystko w main musialbys bawic sie ifami, switchem lub czyms innym, by uzytkownik wprowadzil odpowiednie dane (raz promien, raz podstawa i wysokosc, raz oba boki, raz jeden bok) - to wydluzy program bardziej niz spiecie wszystkiego w kilka funkcji/procedur a i utrudni zrozumienie, po co to wszystko zrobiles :)
Poza tym, zadanie ma chyba pomoc Ci w nauce programowania - a programowanie proceduralne to jedna z technik programowania - nie mozna zaczac jej nauki od razu od duzych projektow - chyba kazdy zaczyna od podstaw :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

No i poradziłem sobie z tym wszystkim tak jak chciałem, Bez tworzenia funkcji itp. I nie utrudniło mi to niczego.
Kod oczywiście, że jest nieskończony. Do tych pól trzeba te dwa dopisać a do tego jeszcze dojdzie pole trapezu i rombu. Do dwóch zmiennych dojdzie jeszcze dwie h i r oraz stała PI i to wszystko. Nie wydłuży w żaden sposób programu. Więc jak sam widzisz nie jest to aż tak bardzo skomplikowane. Jeśli chodzi o tworzenie funkcji i rozbicie tak żeby było jak najbardziej czytelne to pokazałem ( w poprzednim zadaniu o które Ciebie pytałem) że jakoś sobie z tym radzę. Tak jak mówisz chodzi o uczenie się programowania więc robienie drugiego programu takiego samego ( z wykorzystaniem funkcji, które się tylko układa w main() ) nie ma sensu. A jeśli są problemy w programie i się je jakoś rozwiąże to tylko pomaga w dalszej nauce.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Popatrz tutaj masz cały kod programu. Czy wygląda na jakiś trudny? Ja miałem w pewnych momentach z nim problem, ale ja dopiero zaczynam. Dla kogoś średniozaawansowanego będzie on z pewnością bardzo czytelny.

//program obliczajńÖcy pola figur pŇāaskich
#include <iostream>
#include <math.h>
using namespace std;
# define PI 3.14
int main (int argc, char * const argv[])
{
char znak, replay;
float a, b, h, r;
float pole;
do
{
cout<<" 1 - Oblicz pole kwadratu"<<endl;
cout<<" 2 - Oblicz pole prostokata"<< endl;
cout<<" 3 - Oblicz pole trojkata"<< endl;
cout<<" 4 - Oblicz pole kola"<<endl;
cin>>znak;
switch(znak)
{
case ''1'':
cout<<"Wprowadz dlugosc boku:"<< endl;
cin>> a;
pole= a*a;
cout<<"Pole kwadratu wynosi:"<< pole<<endl;
break;
case ''2'':
cout<<"Wprowadz dlugosc boku a:"<<endl;
cin>> a;
cout<<"Wprowadz dlugosc boku b:"<<endl;
cin>> b;
pole= a*b;
cout<<"Pole prostokata wynosi:"<< pole<< endl;
break;
case ''3'':
cout<<"Wprowadz dlugosc podstawy: "<<endl;
cin>> a;
cout<<"Wprowadz wysokosc: "<<endl;
cin>> h;
pole= (a/2) * h;
cout<<"Pole trojkata wynosi: "<< pole<< endl;
break;
case ''4'':
cout<<"Wprowadz dlugosc promienia: "<<endl;
cin>> r;
pole= PI * (r*r);
cout<<"Pole kola wynosi: "<< pole<< endl;
break;
}
cout<<"Czy chcesz wykonac jeszcze jakies obliczenia?"<<endl;
cin>>replay;

}

while (replay==''y'' || replay==''Y'');

system("PAUSE");
return 0;
}

Dziękuję za pomoc!

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

>/.../
-> Masz racje - osoby obeznane z programowaniem, program i jego dzialanie bez problemu zrozumieja - ale i pewnie zapytaja, dlaczy to wszystko jest tak zrobione ? :) Masz racje, ze moze i nie ma sensu zabawa w robienie funkcji czy klas w prostych programach, na kilkanascie/kilkadziesiat linijek kodu. Ale nie to jest najwazniejsze - najwazniejsza jest nauka i pewne nawyki, ktore gdy juz raz nabyte, ciezko sie ich pozbyc. Rownie dobrze, moznaby w ogole nie uczyc np. wskaznikow, referencji, dynamicznego zarzadzania pamiecia - przeciez do prostych programow starcza zmienne globalne, ktore nie obciaza nam systemu.
Po prostu programujac prawidlowo, uczysz sie programowac prawidlowo, a programujac niechlujnie tak wlasnie nauczysz sie programowac.
To troche jak z ortografia i internetem - na poczatku jest dobrze, widzisz ze inni pisza zle, wylapujesz ich bledy, ale z czasem jak widzisz po raz ktorys "hodzić" to sam nie wiesz, czy to nie jest czasem prawidlowa forma ;)
No i na sam koniec powiedz czy nie ladniej wyglada taka forma funkcji main:

int main()
{
do
{
switch( znak=menu() )
{
case 1:
kwadrat(); break;
case 2:
prostokat(); break;
case 3:
trojkat(); break;
case 4:
kolo(); break;
default:
break;
}
} while ( (znak >= ''1'') && (znak <= ''4'') );
return EXIT_SUCCES;
}

:)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Pozostaje też pytanie po co używać biblioteki math.h? Ewentualnie do liczby Pi, ale zamiast używać M_PI tutaj kolega sam definiuje jej wartość, przez co biblioteka staje się niepotrzebna.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 12.10.2007 o 00:53, Marros napisał:

Pozostaje też pytanie po co używać biblioteki math.h? Ewentualnie do liczby Pi, ale zamiast
używać M_PI tutaj kolega sam definiuje jej wartość, przez co biblioteka staje się niepotrzebna.

Biblioteka ta będzie potrzebna przy pierwiastkach, które tutaj jeszcze dojdą.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Chcesz powiedzieć, że program jest napisany niechlujnie?
A jeśli chodzi o naukę to wykorzystałem tutaj więcej zagadnień związanych z programowaniem niż gdybym zdecydował się na funkcje.
Ale każdy pracuje inaczej. Ważne żeby program prawidłowo działał.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 12.10.2007 o 10:57, pretorianie napisał:

Ale każdy pracuje inaczej. Ważne żeby program prawidłowo działał.

Nie do końca o to chodzi. To, że program ma działać jest oczywiste :) Jednakże musisz sobie zdawać sprawę z tego, że kiedyś będziesz pisał duże programy a nawyki, których teraz się uczysz będziesz wykorzystywał później.
Przyjdzie taki czas, że z Twoich np. bibliotek będzie korzystał ktoś inny (będziesz programował w jednej firmie i zmienisz pracę a na Twoje miejsce przyjmą kogoś innego). Jak zobaczy kod napisany w sposób niezrozumiały, nieczytelny itp wyrobi sobie na Twój temat nieciekawą opinię. A opinia się potem będzie ciągnąć za Tobą jak ...

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ok. ja to rozumiem, ale mam się uczyć zresztą często to mówicie. Powiedz jaki sens miałoby przedstawienie programu Wam, który byłby napisany w taki sam sposób (funkcje) jak program, który przedstawiłem wcześniej?
Chodziło mi o to, żeby się sprawdzić czy potrafię napisać program troszkę większy niż 3 linijki wykorzystujący switch..case nie używając do tego funkcji.
A to, że wersja z funkcją jest ładniejsza i milsza dla oka to chyba nikogo nie trzeba przekonywać.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 12.10.2007 o 10:57, pretorianie napisał:

Ale każdy pracuje inaczej. Ważne żeby program prawidłowo działał.

-> Skupie sie tylko na tej czesci Twojej wypowiedzi :)
Nie tylko. Wazne zeby byc w stanie kod utrzymac i zeby byl on zrozumialy (nie tylko dla Ciebie). Jak bedziesz dalej rozbudowywal ten program, to main rozrosnie sie do takich rozmiarow, ze bedzie to na pewno nieczytelne, a jakiekolwiek dalsze zmiany sprowadza sie do przepisania calego kodu na nowo i dopiero dodania nowej opcji.
No ale Twoj wybor, na razie sie uczysz i mozesz w tym czasie nauczyc sie pisac tak, jak powinno wejsc Ci w krew, lub nauczyc sie pisac zle :)
Moge tylko powtorzyc to co napisal Jarys, a Ty zrobisz to co bedziesz chcial. Dopowiem tylko, ze jesli masz trudnosci teraz z programowaniem proceduralnym (nie chodzi o to, ze nie umiesz, tylko o to, ze uznajesz to za niepotrzebne), to programowanie hierarchiczne, czy dalej obiektowe uznasz za calkowita glupote.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 12.10.2007 o 19:00, pretorianie napisał:

Ok. ja to rozumiem, ale mam się uczyć zresztą często to mówicie. Powiedz jaki sens miałoby
przedstawienie programu Wam, który byłby napisany w taki sam sposób (funkcje) jak program,
który przedstawiłem wcześniej?

Chodzi w dużej mierze o nawyki. Podam Ci przykład z życia wzięty (mojego zresztą).
Kiedyś w czasach dinozaurów tata kupił mi komputer. Jak już troszeczkę sobie pograłem, chciałem zrobić coś więcej, pisałem krótkie programiki w Logo czy Basicu. Żeby napisać jakąś prostą gierkę tekstową trzeba dużo pisać na klawiaturze. Wszyscy mi mówili "ucz się pisać bez patrzenia na klawiaturę". Wydawało mi się to na tamten moment bezużyteczne. Jak już dobrze pisałem, patrząc na klawiaturę, przyszła myśl, że jednak gdybym patrzył bezpośrednio na monitor to szło by mi dużo lepiej (korekta błędów od razu rzuca się w oczy jak się patrzy na monitor a nie klawiaturę). No i postanowiłem uczyć się pisać w ten sposób. Na dzień dobry nie podobało mi się ułożenie rąk na klawiaturze - całkiem inne do jakiego byłem przyzwyczajony, pomijam już fakt, że często się łapałem na tym, że patrzę na klawiaturę. Wiesz jaki problem był z przestawieniem się na ten rodzaj pisania?
I właśnie z tego powodu proponuję Ci starać się pisać w przyjętych standardach, potem będziesz miał problemy z odzwyczajeniem się - a uwierz mi, nie jest to takie proste :)
Oczywiście, tak jak napisał LifaR - zrobisz jak będziesz uważał. My Ci tylko doradzamy :)

Aha - w basicu nauczyłem się używać GOTO - też nie za dobry nawyk ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Utwórz konto lub zaloguj się, aby skomentować

Musisz być użytkownikiem, aby dodać komentarz

Utwórz konto

Zarejestruj nowe konto na forum. To jest łatwe!


Zarejestruj nowe konto

Zaloguj się

Masz już konto? Zaloguj się.


Zaloguj się
Zaloguj się, aby obserwować