Forum Gry Hobby Sprzęt Rozmawiamy Archiwum Regulamin

Forum: Prosty program w C

28.11.2011 16:43
Shreddy
😊
1
Shreddy
93
Konsul

Prosty program w C

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

28.11.2011 16:48
nagytow
2
odpowiedz
nagytow
146
Firestarter

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.

28.11.2011 16:49
hopkins
3
odpowiedz
hopkins
218
Zaczarowany

I na zajeciach prowadzacy wm kazal uzyc funkcji goto? :)

28.11.2011 16:49
4
odpowiedz
zanonimizowany227597
72
Generał

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)

28.11.2011 16:49
Regis
😊
5
odpowiedz
Regis
133

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

28.11.2011 16:50
Shreddy
6
odpowiedz
Shreddy
93
Konsul

Dzięki za wytłumaczenie, zaczynam chwytać. Owszem, prowadzący kazał nam użyć goto :)

28.11.2011 16:51
hopkins
7
odpowiedz
hopkins
218
Zaczarowany

Regis o to mi chodzi :)
w C znak rownosci nie znaczy rowna sie... == jest rowna sie, a = oznacza przypisanie wartosci do zmiennej.

28.11.2011 16:55
Shreddy
8
odpowiedz
Shreddy
93
Konsul

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? ;)

28.11.2011 17:03
Regis
9
odpowiedz
Regis
133

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.

28.11.2011 17:04
przemek__
10
odpowiedz
przemek__
134
F1 2016

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.

28.11.2011 17:07
graf_0
11
odpowiedz
graf_0
117
Nożownik

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

28.11.2011 22:36
Shreddy
12
odpowiedz
Shreddy
93
Konsul

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

28.11.2011 22:41
13
odpowiedz
zanonimizowany227597
72
Generał

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

28.11.2011 22:49
Shreddy
14
odpowiedz
Shreddy
93
Konsul

Tzn. jak mam to rozdzielić? :)
I ok, pozbędę się goto :)

28.11.2011 22:52
15
odpowiedz
zanonimizowany227597
72
Generał

if(warunek)
<otwierasz blok>
if(drugi warunek)

itd.

Nie wiem czemu nawiasy klamrowe nie chcą na golu działać...

28.11.2011 23:08
hopkins
16
odpowiedz
hopkins
218
Zaczarowany

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?

28.11.2011 23:14
Shreddy
17
odpowiedz
Shreddy
93
Konsul

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.

28.11.2011 23:24
hopkins
18
odpowiedz
hopkins
218
Zaczarowany

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

28.11.2011 23:27
nagytow
19
odpowiedz
nagytow
146
Firestarter

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.

28.11.2011 23:44
graf_0
20
odpowiedz
graf_0
117
Nożownik

if (a>=b)
printf("%d,%d\n",a,b);
else
printf("%d,%d\n",b,a);

Choć pewnie da się krócej :D

28.11.2011 23:46
hopkins
😁
21
odpowiedz
hopkins
218
Zaczarowany

No Graf gratulacje :)

edit: Wszystko pasuje!

28.11.2011 23:49
graf_0
22
odpowiedz
graf_0
117
Nożownik

Coś nie pasuje?

edit - to dobrze, bo myślałem że może zgłupiałem z wiekiem...

29.11.2011 01:10
😊
23
odpowiedz
zanonimizowany550804
35
Generał

[5]da sie ;)

a, b = b, a #ojojoj

ale C tez fajne.

29.11.2011 08:57
Regis
😊
24
odpowiedz
Regis
133

[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 ;)

29.11.2011 09:47
nagytow
25
odpowiedz
nagytow
146
Firestarter

A biedny OP tak pewnie siedzi, czyta te wasze posty i ma jedno wielkie wtf :P

Forum: Prosty program w C