Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

programčić
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
zrinka
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 27. 06. 2006. (20:33:54)
Postovi: (7F)16
Spol: žensko
Sarma = la pohva - posuda
-73 = 10 - 83
Lokacija: Grad Zagreb

PostPostano: 21:29 ned, 23. 7. 2006    Naslov: programčić Citirajte i odgovorite

Može mi li netko objasniti što radi sljedeći program (osobito kodovi označeni s :) ):

#include <stdio.h>
#define MASK1<<31 :)
main(){
int i, cijeli_broj;
printf ("učitaj cijeli broj: ");
scanf ("%d", &cijeli_broj);
for (i=1; i<=32; i++){
if ((MASK & cijeli_broj)==0) :)
printf ("0");
else
printf ("1");
cijeli_broj<<=1; :)
if (i%8==0) printf (" ");} :)
printf ("\n");} :roll: :?:
Može mi li netko objasniti što radi sljedeći program (osobito kodovi označeni s Smile ):

#include <stdio.h>
#define MASK1<<31 Smile
main(){
int i, cijeli_broj;
printf ("učitaj cijeli broj: ");
scanf ("%d", &cijeli_broj);
for (i=1; i<=32; i++){
if ((MASK & cijeli_broj)==0) Smile
printf ("0");
else
printf ("1");
cijeli_broj<<=1; Smile
if (i%8==0) printf (" ");} Smile
printf ("\n");} Rolling Eyes Question



_________________
ZRINKA
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
Hiroaki
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 16. 11. 2002. (23:50:56)
Postovi: (D)16
Sarma = la pohva - posuda
= 1 - 0

PostPostano: 18:20 pon, 24. 7. 2006    Naslov: Re: programčić Citirajte i odgovorite

[quote="zrinka"]Može mi li netko objasniti što radi sljedeći program (osobito kodovi označeni s :) ):
[/quote]
Evo, pokusat cu objasnit...
[quote]
#include <stdio.h>
#define MASK 1<<31 :)
[/quote]
Tu sam ubacio razmak izmedju MASK i 1 jer tako treba bit. Operator << shifta broj ulijevo. Gore se broj 1 shifta ulijevo za 31 mjesto. To znaci da ako napises 1 u binarnom zapisu sa 32 znamenke, tada taj broj izgleda ovako:
00000000000000000000000000000001,
a nakon shiftanja izgleda ovako:
10000000000000000000000000000000.

Primijeti da je shiftanje zapravo mnozenje broja potencijom broja 2. Ovdje mnozis 1 sa (2 na 31).
Ne znam koliko trebam ici u detalje, ali #define MASK 1 << 31 znaci da svugdje gdje se nalazi izraz MASK, to ce biti zamijenjeno sa izrazom 1 << 31. Vrlo je dobra navika to pisati #define MASK (1 << 31) jer u protivnom mozes dobiti nezeljene efekte kod nekih slucajeva, dakle uvijek koristi zagrade kod naredbe #define.

[quote]
main(){
int i, cijeli_broj;
printf ("učitaj cijeli broj: ");
scanf ("%d", &cijeli_broj);
for (i=1; i<=32; i++){
if ((MASK & cijeli_broj)==0) :)
[/quote]

Ovdje imas bitovni & operator. Taj operator od dva cijela broja daje treci i to na nacin da je i-ta binarna znamenka treceg broja jednaka 1 ako i samo ako su i-te binarne znamenke i prvog i drugog broja jednake 1. Npr 6 & 5 daje 4 zato sto je 6 u binarnom zapisu jednak 110, 5 je 101, pa je prva znamenka rezultata jednaka 1, a druga i treca su 0.
U tvom konkretnom slucaju, MASK ima samo vodecu znamenku jednaku 1 pa ce MASK & cijeli_broj biti jednak 0 ako i samo ako je najznacajniji bit varijable cijeli_broj jednak 0.
Tako da se u narednim linijama zapravo ispisuje najznacajniji bit varijable cijeli_broj.

[quote]
printf ("0");
else
printf ("1");
cijeli_broj<<=1; :)
[/quote]
U ovoj liniji se cijeli_broj shifta za jedno mjesto ulijevo. Tako ce se najznacajniji bit varijable cijeli_broj odbaciti, a iduci bit po znacajnosti ce postati najznacajniji. Buduci da se sve odvija u petlji kroz koju se prolazi 32 puta, ispisat ce se svi bitovi varijable cijeli_broj.
[quote]
if (i%8==0) printf (" ");} :)
[/quote]
Tu se pravi razmak izmedju svakih osam bitova varijable cijeli_broj. Valjda radi lakseg citanja. Dakle, kad je varijabla i djeljiva sa 8, tada se ispise jedan razmak.
[quote]
printf ("\n");} :roll: :?:[/quote]

Mislim da ce se svi sloziti da je moje objasnjenje za ispovracat se, ali ne znam bolje...

Uglavnom, taj programcic ispisuje uneseni broj u binarnom zapisu, ali tako da grupira po osam bitova unesenog broja. Program radi uz pretpostavku da ti je int 32-bitan. Probaj sama (na papiru) napravit test na 8-bitnim brojevima, cisto da se uvjeris da radi.
zrinka (napisa):
Može mi li netko objasniti što radi sljedeći program (osobito kodovi označeni s Smile ):

Evo, pokusat cu objasnit...
Citat:

#include <stdio.h>
#define MASK 1<<31 Smile

Tu sam ubacio razmak izmedju MASK i 1 jer tako treba bit. Operator << shifta broj ulijevo. Gore se broj 1 shifta ulijevo za 31 mjesto. To znaci da ako napises 1 u binarnom zapisu sa 32 znamenke, tada taj broj izgleda ovako:
00000000000000000000000000000001,
a nakon shiftanja izgleda ovako:
10000000000000000000000000000000.

Primijeti da je shiftanje zapravo mnozenje broja potencijom broja 2. Ovdje mnozis 1 sa (2 na 31).
Ne znam koliko trebam ici u detalje, ali #define MASK 1 << 31 znaci da svugdje gdje se nalazi izraz MASK, to ce biti zamijenjeno sa izrazom 1 << 31. Vrlo je dobra navika to pisati #define MASK (1 << 31) jer u protivnom mozes dobiti nezeljene efekte kod nekih slucajeva, dakle uvijek koristi zagrade kod naredbe #define.

Citat:

main(){
int i, cijeli_broj;
printf ("učitaj cijeli broj: ");
scanf ("%d", &cijeli_broj);
for (i=1; i⇐32; i++){
if ((MASK & cijeli_broj)==0) Smile


Ovdje imas bitovni & operator. Taj operator od dva cijela broja daje treci i to na nacin da je i-ta binarna znamenka treceg broja jednaka 1 ako i samo ako su i-te binarne znamenke i prvog i drugog broja jednake 1. Npr 6 & 5 daje 4 zato sto je 6 u binarnom zapisu jednak 110, 5 je 101, pa je prva znamenka rezultata jednaka 1, a druga i treca su 0.
U tvom konkretnom slucaju, MASK ima samo vodecu znamenku jednaku 1 pa ce MASK & cijeli_broj biti jednak 0 ako i samo ako je najznacajniji bit varijable cijeli_broj jednak 0.
Tako da se u narednim linijama zapravo ispisuje najznacajniji bit varijable cijeli_broj.

Citat:

printf ("0");
else
printf ("1");
cijeli_broj<⇐1; Smile

U ovoj liniji se cijeli_broj shifta za jedno mjesto ulijevo. Tako ce se najznacajniji bit varijable cijeli_broj odbaciti, a iduci bit po znacajnosti ce postati najznacajniji. Buduci da se sve odvija u petlji kroz koju se prolazi 32 puta, ispisat ce se svi bitovi varijable cijeli_broj.
Citat:

if (i%8==0) printf (" ");} Smile

Tu se pravi razmak izmedju svakih osam bitova varijable cijeli_broj. Valjda radi lakseg citanja. Dakle, kad je varijabla i djeljiva sa 8, tada se ispise jedan razmak.
Citat:

printf ("\n");} Rolling Eyes Question


Mislim da ce se svi sloziti da je moje objasnjenje za ispovracat se, ali ne znam bolje...

Uglavnom, taj programcic ispisuje uneseni broj u binarnom zapisu, ali tako da grupira po osam bitova unesenog broja. Program radi uz pretpostavku da ti je int 32-bitan. Probaj sama (na papiru) napravit test na 8-bitnim brojevima, cisto da se uvjeris da radi.



_________________
Sin:"Tata, šta je to rekurzija?"
Otac:"Rekurzija."
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan