You are on page 1of 7

PROGRAMIRANJE 4.AUDITORNE VJEBE 22.10.

2014 1

4. Auditorne vjebe


OPERATORI S BITOVIMA

& AND
| OR
^ XOR
<< SHIFT LEFT
>> SHIFT RIGHT
~ NOT

Operatori &, |, ^ su binarni (definirani nad dva bita), a operator ~ unarni (definiran nad
jednim bitom).

Djelovanje bitovnih operatora (b1 i b2 predstavljaju bitove):
b1 b2 b1 & b2 b1 | b2 b1 ^ b2
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

b1 ~b1
0 1
1 0

Primjer:
Izraunati izraze 3 & 5, 3 | 5, 3 ^ 5, ~3

0000 0011 (3)
& 0000 0101 (5)
---------
0000 0001 (1)

0000 0011 (3)
| 0000 0101 (5)
---------
0000 0111 (7)

0000 0011 (3)
^ 0000 0101 (5)
---------
0000 0110 (6)

PROGRAMIRANJE 4.AUDITORNE VJEBE 22.10.2014 2


~ 0000 0011 (3)
---------
1111 1100 (252 ili 4)

Operatori << i >> slue za pomak svih bitova vrijednosti varijable u lijevo ili u desno. Pomak
bitova u varijabli za jedno mjesto u lijevo odgovara mnoenju vrijednosti varijable sa 2, dok
pomak za jedno mjesto u desno rezultira dijeljenjem vrijednosti varijable sa 2.
Elektronika raunala u skupu svojih strojnih naredbi u pravilu imaju naredbe za pomak
vrijednosti u registru i tako izvreno mnoenje ili dijeljenje s viekratnikom broja 2 bitno je bre
u odnosu na klasino mnoenje i dijeljenje.
Broj pomaka u lijevo ili desno odreen je parametrom.

Primjer:
Izraunati izraze 2 << 1, 37 >> 2

0000 0010 (2)
Nakon pomaka u lijevo za jedno mjesto, rezultat je umnoak vrijednosti s 2:
0000 0100 (4)

0010 0101 (37)
Nakon pomaka u desno za dva mjesta, rezultat je cjelobrojno dijeljenje s 4:
0000 1001 (9)

Oprez:
U sluaju da je podatak spremljen u jedan oktet bez bita za predznak, izraunati 128 << 1:

1000 0000 (128)
Nakon pomaka za jedno mjesto:
0000 0000 (0)

U sluaju da je podatak spremljen u jedan oktet sa bitom za predznak, izraunati 64 << 1:

0100 0000 (64)
Nakon pomaka za jedno mjesto:
1000 0000 (-128)



PROGRAMIRANJE 4.AUDITORNE VJEBE 22.10.2014 3

ZADACI
Sportske vijesti (switch)

Ante radi u sportskom tjedniku, i njegov jedini zadatak je da odabere jednu utakmicu i
izbroji koliko je bilo golova (g), udaraca u okvir (o), udaraca prema golu (u), kornera (k),
faulova (f) i kartona (z ili c) , i to za svaku ekipu posebno. Vi mu trebate napisati program u
koji on unosi znak po znak, ovisno to se u utakmici dogodilo, a program na kraju ispisuje
cijeli rezime. Kada treba voditi evidenciju za nesto vezano za domacu ekipu, on unosi malo
slovo, a za gostujucu veliko. Npr., kad unese G, to znaci da je gostujuca ekipa zabila gol.
Ako unese g, znaci da je domaca ekipa zabila gol. Za kraj unosi znak *.

#include <stdio.h>

int main()
{
int g=0,G=0,z,Z,c,C,f=0,F=0;
char ch;
while(ch != '*')
{
scanf(" %c",&ch);
switch(ch)
{
case 'g': g++; break;
case 'G': G++; break;
case 'f': f++; break;
case 'F': F++; break;
//itd...
Default: printf(Krivi unos...\n); break;
}
}
printf("%d:%d\n", g,G);
printf("Faulova:\n%10d|%10d\n", f,F);
//itd...

return 0;
}


PROGRAMIRANJE 4.AUDITORNE VJEBE 22.10.2014 4

Kralj Drislav

Kralj Drislav ima vrlo darovite vizionare, koji mu pomau kod kodiranja i dekodiranja
tajnih poruka koje on alje svojim trupama na bojinici. Pri slanju poruka, Drislav koristi
slova engleske abecede (kako bi to bolje zbunio protivnike ukoliko poruka doe u krive
ruke), razmake i interpunkcije. Drislav svaki znak poruke pretvara u jedan broj, na sljedei
nain:

Izabere dva proizvoljna broja, izmeu 0 i 2
16
-1, te ih pretvore u binarni zapis (naime, njegovi
vizionari su predvidili da e to biti dobar nain prikaza broja, samo ne znaju kada). Zatim
modificiraju zadnjih osam bitova tih brojeva na nain da prvom broju upiu 0 na sva parna
mjesta (u zadnjih 8 bitova), a drugom upiu 0 na sva neparna mjesta (u zadnjih 8 bitova).
Ilustrirajmo to primjerom (X i Y su znamnke 0 ili 1, ovisno koji smo broj odabrali)
1. broj binarno XXXXXXXX X0X0X0X0
2. broj binarno YYYYYYYY 0Y0Y0Y0Y
Nakon toga uzmu znak koji je Drislav idiktirao, i pretvore ga u binarni zapis, duljine 8
bitova. Nakon toga vrijednost svakog bita od tih 8 ubace u prvi ili drugi broj, tamo gdje je 0,
na sljedei nain:
Znak binarno: ABCDEFGH (vizionari koriste ASCII tablicu za prikaz znakova)
1. broj binarno XXXXXXXX XBXDXFXH
2. broj binarno YYYYYYYY AYCYEYGY

Va zadatak je da na temelju uneenog znaka ispiete 2 broja kojim se ti znakovi kodiraju.
Takoer, napiite dio programa koji iz 2 broja saznaje koji je to znak.

#include <stdio.h>

int main()
{
char zn;
unsigned short b1,b2;

b1 = 0xffff;//rand()%(1<<16);
b2 = rand()%(1<<16);

printf("Random brojevi su %hu i %hu\n", b1, b2);
b1 &= 0xFFAA;
b2 &= 0xFF55;

printf("Random brojevi nakon nuliranja su %hu i %hu\n", b1, b2);

scanf("%c",&zn);

b1 |= zn&0xFF55;
b2 |= zn&0xFFAA;

printf("Kod za znamenku %c je %hu %hu\n", zn, b1, b2);

printf("Pretvorba natrag...\n");

zn = '\0';
zn = b1 & 0x0055 | b2&0x00AA;

PROGRAMIRANJE 4.AUDITORNE VJEBE 22.10.2014 5

printf("Uneseni znak je %c\n", zn);

return 0;
}


PROGRAMIRANJE 4.AUDITORNE VJEBE 22.10.2014 6

Tramvaj

Stjepan se voli voziti tramvajem iz jednog razloga, a to je da kad stane na semaforu ili
stanici, brzo proita tablicu nekog najblieg auta i izrauna kod tog auta. Kod se rauna na
nain da se vrijednost tablice zamisli kao heksadekadski broj, a Stjepan onda taj broj pretvori
u dekadski. Ukoliko neko slovo na tablici nije heksadekadski znak (npr., slovo Z) tada on to
slovo jednostavno ignorira. Pomozite Stjepanu tako da napiete program kojim unosi brojeve
i slova s tablice (znak po znak svaki u novom retku), a kao rezultat dobije traeni kod. Imajte
na umu da tablica moe imati 3 ili 4 sredisnja broja te 1 ili 2 pratea znaka. Kao kraj tablice,
stjepan unosi znak *. Stjepan zna brojati u dvojnom komplementu od -2
31
do 2
31
-1.

On uvijek unosi velika slova.

Primjer: Za unos ZG499B*, rezultat je broj 499B pretvoren u dekadski broj, tj., 18843

#include <stdio.h>

int main()
{
int rez = 0;
char z;
while(z != '*')
{
scanf("%c",&z);
getchar(); //Poto unosimo u svaki redak posebno
if(z >= '0' && z <= '9')
{
rez <<= 4;
rez |= z - '0';
}
else if( z >= 'A' && z <= 'F')
{
rez <<= 4;
rez |= z - 'A' + 10;
}
}
printf("%d", rez);

return 0;
}


PROGRAMIRANJE 4.AUDITORNE VJEBE 22.10.2014 7

Selidba

Stanko radi u poduzeu koje se bavi selidbama, i njegov je zadatak da stavlja kutiju u kutiju.
Napisite program koji mu na temelju unesenih dimenzija kutija, kaze kako da kutiju okrene
da bi stala u drugu kutiju, a ako ne stane, da ispise odgovarajucu poruku. On nikad ne stavlja
kutije ukoso, jer je to zabranjeno.

#include <stdio.h>

int main()
{
float k1s,k1v,k1d,k2s,k2v,k2d;

scanf("%f %f %f %f %f %f", &k1s,&k1v,&k1d,&k2s,&k2v,&k2d);

if(k1s >= k2s && k1d >= k2d && k1v >= k2v
|| k1s >= k2s && k1d >= k2v && k1v >= k2d
|| ... ... ...)
{
printf("Stanu kutije");
}
else
printf("Ne stanu kutije!");

return 0;
}

You might also like