Witam. Zacząłem naukę programowania w C i na zajęciach pisaliśmy program sortujący 2 liczby od największej do najmniejszej:
void main()
‹
int a,b,p;
printf("Podaj a:\n");
scanf("%d",&a);
printf("Podaj b:\n");
scanf("%d",&b);
if (a>=b) goto bob;
p=a;
a=b;
b=p;
bob:
printf("%d, %d\n",a,b);
›
Prosiłbym o wytłumaczenie tego fragmentu kodu:
p=a;
a=b;
b=p;
Dlaczego najpierw piszemy, że p=a, potem a=b itd.?
Muszę też napisać program sortujący w ten sposób 3 liczby, mogę prosić o wsazówki?
Pozdrawiam i dzięki za pomoc. :)
W C zeby zamienic wartosci dwoch zmiennych trzeba uzyc trzeciej pomocniczej.
Jak liczysz samodzielnie i masz x=5, y=2, to mozesz sobie zamienic od razu x=2, y=5.
Komputer tak nie umie, bo jak nadpiszesz x (x=2) to bedziesz mial x=2, y=2 i tej 5 juz nie odzyskasz. Dlatego najpierw przypisujesz zmiennej pomocniczej wartosc p=5, potem x=2 i na koncu druga zmienna y=5.
Potrzebujesz zmiennej p by a i b zmienić miejscami.
W skrócie:
p=a; - używasz zmiennej pomocniczej i przypisujesz jej wartość a
a=b; - zmiennej a przypisujesz wartość b
b=p; - zmiennej b przypisujesz wartość p (czyli a)
Weź dwa kubki z różnymi sokami i zrób tak, żeby to co było w jednym kubku znalazło się w drugim, a to co w drugim - trafiło do pierwszego. Przelewanie to w tym przypadku odpowiednik "przypisania" (=). I zastanów się, czy da się to zrobić bez użycia trzeciego kubka :)
OMFG
GOTO?!
Ja p*#$%ole... Kto takich rzeczy uczy? Rozumiem, że istnieje 1 przypadek na 10000000 w którym goto ma sens, ale to NIE jest ten przypadek :|
Za uczenie tego powinni wieszać.
Dzięki za wytłumaczenie, zaczynam chwytać. Owszem, prowadzący kazał nam użyć goto :)
Regis o to mi chodzi :)
w C znak rownosci nie znaczy rowna sie... == jest rowna sie, a = oznacza przypisanie wartosci do zmiennej.
Wielkie dzięki, zrozumiałem o co chodzi z tymi zmiennymi :)
Mógłbym prosić jeszcze o wskazówki odnośnie napisania programu sortującego 3 liczby? Ilu zmiennych wtedy będę musiał użyć?
I dlaczego nie używać goto? ;)
1. Weź trzy rzeczy różnej wielkości połóż je przed sobą i sam wymyśl jak je posortować wg rozmiaru i ilu zmiennych do tego trzeba. Programowanie to przede wszystkim umiejętność myślenia, a dopiero potem umiejętność zamiany myśli na kod programu.
2. Na początku goto jest spoko - pozwala łatwo się przemieszczać po programie. Takie break/return/continue dla ubogich. Ale potem się robi problem, kiedy program się rozrasta i nie masz pewności jak dokładnie przebiegnie jego wywołanie od/do momentu wykonania instrukcji pod jakimś "labelem". To tak jakbyś mógł wezwać do siebie dowolnego człowieka żyjącego na świecie. Fajnie, jeśli trafi Ci się seksowna brunetka, ale równie dobrze możesz trafić na islamskiego fundamentalistę z bombą pod ubraniem.
Ilu zmiennych wtedy będę musiał użyć?
O jedną więcej niż poprzednio, bo musisz gdzieś przechować trzecią liczbę.
I dlaczego nie używać goto? ;)
Ponieważ taki kod jest ciężki w analizie.
Ostatni raz GOTO widziałem w basicu :) jak pisałem "animacje" za pomocą znaczków na klawiaturze atari :D
A swoją drogą to przepisywanie p=a, a=b ma cel edukacyjny jak sądzę, mimo że jest bez sensu :D
Na razie wykombinowałem coś takiego, ale niestety program nie działa tak jak powinien. ktoś może pokazać błąd?
if (a>=b>=c) goto bob;
if (a>=c>=b);
p=c;
c=b;
b=p;
if (a<=b<=c);
p=a;
a=c;
c=p;
bob:
printf("%d,%d,%d\n",a,b,c);
Jestem na 99% pewny, że w ifach nie możesz mieć wyrażeń warunkowych w tym stylu, że tak powiem, powsadzaj ify w ify i będzie dobrze :) I wywal to goto bo to naprawdę paskudnie wygląda...
if(warunek)
<otwierasz blok>
if(drugi warunek)
itd.
Nie wiem czemu nawiasy klamrowe nie chcą na golu działać...
Nie pamietam jak w C ale moze chodzic o operatory logiczne w if. Nie mozesz zapisac a>=b>=c, predzej a>=b && b>=c. Moge sie mylic :)
edit: A znasz funkcje if else?
z tego co pamiętam, to nie mieliśmy jeszcze if else, poza tym wydaje mi się, że mogę wykorzystać tylko funkcje z pierwszego posta.
printf("Podaj a i b\n");
scanf("%d",&a);
scanf("%d",&b);
if(b>a)
Nawias klamrowy
p=a;
a=b;
b=p;
printf("%d,%d\n",a,b);
zamykamy nawias klamrowy
else
printf("%d,%d\n",a,b);
Sprawdz. Nic nie obiecuje, a sam sprawdzic nie moge, bo kompilatora pod reka nie mam.
edit: Bez sensu bez else to robic :)
Naprawde polecam ci uzyc if else. Program jest duzo latwiejszy do napisania, duzo latwiejszy w analizie no i nie sadze, abys mial problemy przez wykazanie sie dodatkowa wiedza.
if (a>=b)
printf("%d,%d\n",a,b);
else
printf("%d,%d\n",b,a);
Choć pewnie da się krócej :D
[5]da sie ;)
a, b = b, a #ojojoj
ale C tez fajne.
[23] OK, tak się składa, że pracuję na co dzień w Pythonie, więc wiem, że taki zapis jest możliwy, ale moja odpowiedź dotyczyła poziomu "szkolnego". Poza tym to "trick", bo Python i tak "pod spodem" robi to inaczej, więc to tylko zapis, a nie rozwiązanie.
Rozwiązaniem (ale nie dla wszystkich typów) jest natomiast użycie XOR'a:
a ^= b;
b ^= a;
a ^= b;
lub krócej, acz mniej czytelnie:
a^= b^= a^= b;
Inną opcją (idea jest trochę zbliżona, ale z ryzykiem overflowa) jest użycie zwykłego dodawania i odejmowania:
a = a + b;
b = a - b;
a = a - b;
To tyle w temacie tak (pozornie) trywialnego problemu zamiany dwóch wartości ;)