|
Programiranje Programski jezici, tehnike, alatke... |
|
Alatke vezane za temu | Vrste prikaza |
10.8.2008, 15:01 | #1 |
Član
Član od: 27.7.2007.
Lokacija: Loznica
Poruke: 46
Zahvalnice: 6
Zahvaljeno 0 puta na 0 poruka
|
Zadaci sa bitovima, ili kako već da ih nazovem..
Ma koliko mi glupo bilo da otvaram ovu temu, ali nisam bash uspela da pronadjem neke korisne sadrzaje na netu, a u vezi sa zadacima koji me chekaju na ispitu iz programiranja1, a koje jednostavno ne znam kako da nauchim da reshavam.
Uchenje napamet ne vidim kao reshenje, jer nikad ne uchim tako i jer ne mogu da zapamtim, a i glupo mi je narochito da C uchim napamet.. Shvatate i sami poentu - zelim da nauchim da radim zadatke sa bitovima, ali ne znam kako, jer ja tu nishta ne razumem.. Da biste shvatili o chemu tachno govorim evo i par zadataka: 1.Napisati program na jeziku C koji: a) chita sa tastature ceo broj n, velichine chetiri bajta, zadat u heksadecimalnom obliku. b) odredjuje i prikazuje na ekranu poziciju (od bita najmanje tezine) prvog i poslednjeg pojavljivanja binarne kombinacije 101 u zadatom broju n 2.Napisati program na jeziku C koji: a) chita sa tastatre ceo broj n, velichine chetiri bajta, zadat u decimalnom ili heksadecimalnom obliku, b) odredjuje i prikazuje na ekranu broj parova susednih bitova zadatog broja koji imaju razlichite vrednosti (u binarnom obliku: 01 ili 10). i td. Iako sam iz drugog predmeta uchila operacije sa bitovima tj. binarnim brojevima i tome slichno i iako relativno razumem sve to, ne mogu da shvatim kako se ovi zadaci rade (nije da nemam reshenja istih, ali... )... Imate li neku pametnu ideju? Unapred zahvaljujem. pozzzz Edit: ---------------> uglavnom nije problem da skapiram kako se rade ovi zadaci pod a), ali one operacija sa bitovima nemam blage veze... O.O |
10.8.2008, 17:28 | #2 |
Član
Član od: 9.7.2007.
Poruke: 119
Zahvalnice: 2
Zahvaljeno 31 puta na 29 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
int je obično 4-bajta dužine. Kada pretvoriš ulaz u broj, imaćeš, recimo, promenljivu po imenu "broj" dužine 4 bajta sa vrednošću koju si izračunala iz ulaza.
Kod:
int broj; Jednostavan način (ali ne obavezno i najoptimalniji) je da koristiš operator pomeranja bitova "shift": Kod:
int pozicija = 0; const int maska = 5; /* u binarnom obliku 101 */ while (broj > 0) { if ((broj & maska) == maska) /* Binarna logicka operacija "I". Na primer 1001 & 101 ce dati "1" */ { printf("Pozicija: %d\n", pozicija); } broj = broj >> 1; /* Pomeri bitove jedno mesto udesno "binary shift right". Na primer 0100 ce posle ovoga biti 0010 */ pozicija++; /* Povecaj poziciju */ } Poslednja ispravka: rile (10.8.2008 u 17:33) Razlog: nekako pritisnuh enter pre zavrsetka poruke |
10.8.2008, 21:26 | #3 |
Član
Član od: 27.7.2007.
Lokacija: Loznica
Poruke: 46
Zahvalnice: 6
Zahvaljeno 0 puta na 0 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
mislim da je jedini razlog zashto ovo dobro objashnjenje ne pomaze to shto je moj mozak ochigledno ogranichen da udje u sushtinu sabiranja, oduzimanja, maskiranja i shiftovanja bitova.. mislim, sve ostalo iz programiranja 1 mogu da razumem (jer je u principu sve to opipljivo), ali ovo nema shanse...
ipak, hvala na odvojenom vremenu. |
11.8.2008, 3:26 | #4 |
Starosedelac
Član od: 10.12.2005.
Lokacija: ¯\_(ツ)_/¯
Poruke: 1.397
Zahvalnice: 811
Zahvaljeno 404 puta na 255 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
Cisto ovako jedno pitanje. Da li znas Bulovu algebru?
|
11.8.2008, 7:54 | #5 |
Član
Član od: 27.7.2007.
Lokacija: Loznica
Poruke: 46
Zahvalnice: 6
Zahvaljeno 0 puta na 0 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
O.O
Nope.. je l bi trebalo? O.o |
11.8.2008, 11:13 | #6 |
Starosedelac
Član od: 10.12.2005.
Lokacija: ¯\_(ツ)_/¯
Poruke: 1.397
Zahvalnice: 811
Zahvaljeno 404 puta na 255 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
Pa za pisanje ovakvih zadataka, po mom skromnom znanju, ako ne znas proste logicke operacije neces moci ni da napises valjan program.
Nauci tablice logickog sabiranja i mnozenja. pa posle nadji (sigurno ste negde radili) u nekoj tvojoj svesci gde ste vezbali operacije sa bitovima. Kad shvatis taj teorijski deo, tek onda pristupi programiranju. |
11.8.2008, 13:51 | #7 |
Član
Član od: 27.7.2007.
Lokacija: Loznica
Poruke: 46
Zahvalnice: 6
Zahvaljeno 0 puta na 0 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
jutros sam definitivno bila pospana kad sam odgovarala na tvoje pitanje.. <_<
dakle, naravno da znam osnovne logichke operacija sa nulama i jedinicama, ali mi to ne pomaze u reshavanju zadataka u C-u... Boze, koji sam debil da kazem da ne znam neshto shto znam.. |
11.8.2008, 15:37 | #8 |
Član
Član od: 11.12.2005.
Lokacija: Pancevo
Poruke: 269
Zahvalnice: 52
Zahvaljeno 22 puta na 20 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
zadaci sa vise elektor ako uspem da nadjem moje carobne puskice stavicu ih ovde (nazalost to je bilo jedino resenje u mom slucaju)
|
11.8.2008, 21:20 | #9 |
Član
Član od: 27.7.2007.
Lokacija: Loznica
Poruke: 46
Zahvalnice: 6
Zahvaljeno 0 puta na 0 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
nikad nisam uchila sa pushkica - bilo bi to neobichno iskustvo..
|
12.8.2008, 6:26 | #10 |
Član
Član od: 9.7.2007.
Poruke: 119
Zahvalnice: 2
Zahvaljeno 31 puta na 29 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
Nije tako teško kao što možda deluje.
Logička operacija "i" ili logičko množenje dva jednobitna broja: 1 i 1 daje 1 a sve ostale kombinacije daju 0 Logička operacija "ili" ili logičko sabiranje daje 1 ako je barem jedan operand 1 U C-u operatori koji se izvršavaju nad svakim bitom datih operanda rade datu logičku operaciju bit-po-bit za svaki bit tih operanda. Tako recimo bit-logička operacija "i" odnosno operator "&" nad binarnim brojevima 10110 i 00101 daju: 00100 Slično, bit-logička operacija "ili": 10110 ili 00101 daju: 10111 Izraz "maska" je uobičajen u programiranju kada se bit-logičko "i" koristi za "isključivanje" određenih bitova. Naime svaka 0 u "masci" će dati nulu bez obzira da li je u drugom broju na tom mestu jedinica. A ovo mi upravo govori da sam napravio grešku u primeru koji sam dao. Maska ne treba da bude "101" nego "111". Da li vidiš zbog čega? Dakle moj prethodni primer je neispravan, a ovo bi trebalo da bude bolje: Kod:
int pozicija = 0; const int maska = 7; /* u binarnom obliku 111 */ const int trazenakombinacija = 5; /* u binarnom obliku 101 */ while (broj > 0) { if ((broj & maska) == trazenakombinacija) /* Binarna logicka operacija "I". Na primer 1101 & 111 ce dati "101" */ { printf("Pozicija: %d\n", pozicija); } broj = broj >> 1; /* Pomeri bitove jedno mesto udesno "binary shift right". Na primer 0100 ce posle ovoga biti 0010 */ pozicija++; /* Povecaj poziciju */ } Naravoučenije: ne piši primere na brzinu. |
Sledeći korisnik se zahvaljuje korisniku rile na korisnoj poruci: | ||
forrest_gump (12.8.2008) |
12.8.2008, 7:30 | #11 | ||
Član
Član od: 27.7.2007.
Lokacija: Loznica
Poruke: 46
Zahvalnice: 6
Zahvaljeno 0 puta na 0 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
Citat:
Citat:
|
||
14.8.2008, 7:22 | #12 | ||
Član
Član od: 27.7.2007.
Lokacija: Loznica
Poruke: 46
Zahvalnice: 6
Zahvaljeno 0 puta na 0 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
u zelji da ne smaram ljude vishe ovom temom poslala sam riletu pp i dobila sam kritiku shto to nisam javno pitala. citiram - Mislim da si mogla da postaviš ovo pitanje javno, možda bi još neko imao koristi od toga.
i zato evo mog pitanja: Citat:
Citat:
pozz i hvala Rile. |
||
17.8.2008, 21:30 | #13 |
Član
Član od: 27.7.2007.
Lokacija: Loznica
Poruke: 46
Zahvalnice: 6
Zahvaljeno 0 puta na 0 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
Nisam htela da otvaram novu temu iako ovaj zadatak nema veze sa naslovom.
Dakle, moze li neko, molim vas, da mi objasni gde je ovde greshka? Kod:
#include <stdio.h> main() { int n; char odg; while(1) { printf("\nUnesite redni broj meseca.\n"); scanf("%d",&n); if(n<1 || n>12) { printf("\nUneli ste pogreshan broj.\n\n"); break; } else switch(n) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: printf("\nMesec ima 31 dan.\n"); break; case 2: { printf("\nDa li je godina prestupna (D/d za DA i N/n za NE)?\n"); scanf("%c",&odg); if(odg=='d' || odg=='D') printf("\nMesec ima 29 dana.\n"); else if(odg=='n' || odg=='d') printf("\nMesec ima 28 dana.\n"); } break; case 4: case 6: case 9: case 11: printf("\nMesec ima 30 dana.\n"); break; default: break; } printf("\n\n"); } } Gde greshim? Hvala unapred! PS-Najzanimljivije od svega mi je kada mi kompajler ne prijavljuje greshku (kao sad), a program ipak ne radi. Poslednja ispravka: forrest_gump (17.8.2008 u 21:48) |
17.8.2008, 22:42 | #14 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
Izbaci vitičaste zagrade bloka u case bloku za dvojku.
|
17.8.2008, 22:52 | #15 |
Član
Član od: 27.7.2007.
Lokacija: Loznica
Poruke: 46
Zahvalnice: 6
Zahvaljeno 0 puta na 0 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
^
probala. nije pomoglo. |
18.8.2008, 1:27 | #16 |
Član
Član od: 21.9.2006.
Lokacija: Suburbia ,Beograd
Poruke: 472
Zahvalnice: 411
Zahvaljeno 190 puta na 102 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
else if(odg=='n' || odg=='d') - mozda si ovde pogresila.
|
18.8.2008, 6:01 | #17 | |
Član
Član od: 9.7.2007.
Poruke: 119
Zahvalnice: 2
Zahvaljeno 31 puta na 29 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
Citat:
Pokušaj sa sledećom izmenom: Kod:
... case 2: { printf("\nDa li je godina prestupna (D/d za DA i N/n za NE)?\n"); scanf("%1s", &odg); ... |
|
Sledeći korisnik se zahvaljuje korisniku rile na korisnoj poruci: | ||
forrest_gump (18.8.2008) |
18.8.2008, 7:17 | #18 |
Član
Član od: 27.7.2007.
Lokacija: Loznica
Poruke: 46
Zahvalnice: 6
Zahvaljeno 0 puta na 0 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
@Apprentice
da, to jeste dobro uochena greshka u kodu, ali to nije ometalo rad programa. @rile da, ovo jeste reshilo problem, ali te molim za objashnjenje jer kod: Kod:
#include <stdio.h> main() { char odg; printf("\nDa li je godina prestupna (D/d za DA i N/n za NE)?\n"); scanf("%c",&odg); if(odg=='d' || odg=='D') printf("\nMesec ima 29 dana.\n"); else if(odg=='n' || odg=='N') printf("\nMesec ima 28 dana.\n"); printf("\n\n"); } hvala vam svima, tebi Rile, posebno! |
18.8.2008, 19:05 | #19 | |
Član
Član od: 9.7.2007.
Poruke: 119
Zahvalnice: 2
Zahvaljeno 31 puta na 29 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
Problem je u unosu u kome zadaješ broj meseca, kada uneseš "2" pa zatim "enter" poziv na scanf će očitati samo broj, dok će karakteri kraja linije (pod windows konzolom je to par karakterea '\r' '\n') ostati u ulaznom baferu.
Format "%c" će preuzeti bilo koji karakter, uključujući i karaktere beline (kao što su pomenuti karakteri kraja linije). Tako odgovor "d" ili "n" dolazi tek kao treći karakter (na windowsu). Detaljnije objašnjenje scanf funkcije možeš da pročitaš ovde: http://www.opengroup.org/onlinepubs/009695399/ ili sa http://msdn.microsoft.com Za kraj napomena: Još jednom sam bacio pogled na tvoj program, ukoliko koristiš predloženi "%1s" format, tvoj program, iako će najverovatnije da radi, ima jedan sakriveni ali potencijalno katastrofalan bag; ako pročitaš pažljivo šta kaže standard za format %s, videćeš ovo: Citat:
Kod:
char odg[2]; Nadam se da ovo pojašnjava stvari. |
|
Sledeći korisnik se zahvaljuje korisniku rile na korisnoj poruci: | ||
forrest_gump (18.8.2008) |
28.8.2008, 3:50 | #20 |
Veteran
Član od: 17.1.2008.
Lokacija: Београд
Poruke: 636
Zahvalnice: 481
Zahvaljeno 128 puta na 85 poruka
|
Re: zadaci sa bitovima ili kako vec da ih nazovem..
Ako ti treba jedan karakter mozes da koristis neke od nestandarnih funkcija kao sto je _getch().
Kod:
#include <conio.h> //za _getch #include <stdio.h> //za printf int main(int argc, char **argv) { char ch; ch=_getch(); printf("Pritisnula si %c"); _getch(); //za pauzu return 0; } |
Bookmarks sajtovi |
Alatke vezane za temu | |
Vrste prikaza | |
|
|
Slične teme | ||||
tema | temu započeo | forum | Odgovora | Poslednja poruka |
Kako skinuti klip sa kobajagrande.com ? | NemesisTT | Brbljaonica | 2 | 11.6.2008 12:59 |
Kako ohladiti Gigabyte 8800gt sa stock coolerom | Mali Robot | Grafika | 5 | 22.2.2008 18:34 |
leadtek Winfast 2000 expert - nemogu da dobijem signal na s-video ulazu sa sat. risiv | ural | Foto i audio/video | 17 | 30.8.2006 1:36 |
kako da skinem half life 2 sa neta | Crusader88 | O igrama uopšte | 15 | 26.8.2006 12:59 |
Kako spasti podatke sa cd-rw | chris | Nosači podataka | 4 | 2.5.2006 21:50 |