Forum » Programiranje » program za računajene v šestnajstiški obliki
program za računajene v šestnajstiški obliki
Lolek18 ::
Sem čisto novi uporabnik ,še začetnik v programiranju tako da res prosim za pomoč
Napišite program v C++ ki prebere tri števila: število bitov, ki je lahko 4,8, 16, 32, 64 ali 128, števili A in B, nato zmožite. Števili A in B vmesete v šestnajstiški obliki. Program izračuna produkt števil P = A * B z uporabo Booth-ovega algoritma. Rezultat izpišete v šestnajstiški obliki.
Pomoč za reševanje Boothov algoritem
Zdaj pa 16 ma številke od 0 do 9 in črke od Ado F
Mislim in kaj naj pol narejim tolk if stavkov ali kak naj sploh vstavim številke oziroma dopovem uporabniku možne številke ki jih lahko vstavi.
Res prosim za pomoč iskušene mojstre ki ste na tem forumu.
Napišite program v C++ ki prebere tri števila: število bitov, ki je lahko 4,8, 16, 32, 64 ali 128, števili A in B, nato zmožite. Števili A in B vmesete v šestnajstiški obliki. Program izračuna produkt števil P = A * B z uporabo Booth-ovega algoritma. Rezultat izpišete v šestnajstiški obliki.
Pomoč za reševanje Boothov algoritem
Zdaj pa 16 ma številke od 0 do 9 in črke od Ado F
Mislim in kaj naj pol narejim tolk if stavkov ali kak naj sploh vstavim številke oziroma dopovem uporabniku možne številke ki jih lahko vstavi.
Res prosim za pomoč iskušene mojstre ki ste na tem forumu.
Urko ::
Mislim da Boothov algoritem dela samo za dvojiska stevila.
Vnesena stevila moras najprej spremeniti v dvojiska in nato izracunati produkt A*B z
Boothovim algoritmom in nato rezultat spremenis nazaj v HEX.
Za razlogo delovanja Boothovega algoritma pa poglej na Google in napisi Boothov algoritem.
Vnesena stevila moras najprej spremeniti v dvojiska in nato izracunati produkt A*B z
Boothovim algoritmom in nato rezultat spremenis nazaj v HEX.
Za razlogo delovanja Boothovega algoritma pa poglej na Google in napisi Boothov algoritem.
Zgodovina sprememb…
- spremenil: Urko ()
Lolek18 ::
PozdravljenI, prosil bi za pomoč ker namreč zdaj sn nekak uspel bootha naredfit da mi v dvojiskem sistemu dela zdaj pa nevem tocno kak naj vnesem pretvorbo.
In nevem zakaj ampak ne gre mi preverjat nekih pogojev oziroma moral bi narditi neskoncno zanko pa mi nekak ne deluje.
#include
#include
#include
#include
//inicializacija polja
void Nicle(int stevilo[], int n)
{
for(int i = 0; i < n; i++) //napolnimo polje s samimi niclami
stevilo[i] = 0;
}
//metoda za spremembo iz char polje v int polje (vnos)
void Vnos(char niz[], int stevilo[], int n)
{
int dolzina; //dolzina niza
dolzina = strlen(niz);
if(dolzina > n) //ce smo vnesli predolgi niz
{
cout <<"Napaka stevilo ne obstaja je predolgo!" << endl;
exit(1); //izhod iz programa,program se zakljuci
}
else
{
//stevilo ustreza vsem pogojem zato preverjamo vpisane znake (niz)
for(int i = 0; i < dolzina; i++) //prepisemo niz v polje
{
//ce niz vsebuje 1 to prepisemo kot 1 drugace kot 0
if(niz[i] == '1')
{
stevilo[i] = 1;
}
else
{
stevilo[i] = 0;
}
}
}
}
//funkcija za izpis polja v binarni obliki
void IzpisBinarno(int stevilo[], int n)
{
for(int i = 0; i < n; i++) //premikamo se po polju in izpisujemo clene
cout << stevilo[i];
}
//izpis stevila v desetiski obliki
int IzpisDesetisko(int stevilo[], int n)
{
int desetisko = 0; //spremenljivka za stevilo zapisano v desetiski
for (int i = n-1; i >= 0; i--)
desetisko = desetisko + stevilo[i]*(int)pow(2, n- i -1);
//formula: Stevilo=Stevilo + bit * 2^E
if(stevilo[0] == 1) //ce je predznak negativen
desetisko = -desetisko;
return desetisko;
}
//Pomik v desno (right shift) - prvo mesto ima vrednost, ki je bila tam nazadnje
void RShift(int stevilo[], int n)
{
for(int i = n-1; i > 0; i--)
stevilo[i] = stevilo[i-1]; //pomika v desno - brez da spremenimo predznak
}
//vsota dveh stevil iste dolzine
void Sestevanje(int stevilo_a[], int stevilo_b[], int rezultat[], int n)
{
int prenos = 0; //prenos ali bit
int vsota = 0; //pomozna vsota
for(int i = n-1; i >= 0; i--)
{
vsota = (stevilo_a[i] + stevilo_b[i] + prenos); //sestevek - pomozna vsota
if(vsota == 1) //v dvojiskem, ce imamo 1 je rezultat = 1, prenos 0
{
rezultat[i] = 1;
prenos = 0; //bit
}
else if(vsota == 2) //v dvojiskem, ce imamo 2 je rezultat 0, prenos 1
{
rezultat[i] = 0;
prenos= 1; //bit
}
else if(vsota == 3) //v dvojiskem, ce imamo 3 je rezultat 1, prenos 1
{
rezultat[i] = 1;
prenos = 1;
}
}
}
//dvojiski komplement
void DvojiskiKomplement(int stevilo[], int n)
{
int enka[512]; //pomozno polje (vrednost 1), ki sluzi kot pristevek k eniskemu komplementu
Nicle(enka, 512); //zapisemo same nicle v pomozno polje (ga inicializiramo
enka[n-1] = 1; //zadnji bit postavimo na 1
//(dejansko ni zadnji amapak je na n-1 mestu, ko imamo n bitna sevila)
//racunamo eniski komplement
for(int i = 0; i < n; i++)
{
if(stevilo[i] == 0) //ce je prej bila vrednost 0, je zdaj 1
stevilo[i] = 1;
else
stevilo[i] = 0; //drugace je zdaj 0
}
Sestevanje(stevilo, enka, stevilo, n); //klicemo metodo sestevanje, da dodamo 1 na koncu
}
//mnozenje dveh binranih stevil (boothov nacin)
void Mnozenje(int stevilo_a[], int stevilo_b[], int produkt[], int n)
{
int primerjalni = 0; //spremenljivka za primejalni bit za primerjavo
int stevec = 1; //stevec za izpis korakov
int stevilo = 2*n; //novo stevilo bitov produkta (2x vecje od stevila mnozencev)
//prepisemo v drugo polovico produkta bite stevila A
for(int i = 0; i < n; i++)
{
produkt[i+n] = stevilo_a[i];
}
for(int z = 0; z < n; z++)
{
//zadnji bit = 0, primerjalni bit = 1 - pristej stevilo B k produktu
if(produkt[stevilo-1] == 0 && primerjalni == 1)
{
int zacasni[2*512]; //pomozno polje 2x dolzine
Nicle(zacasni, 2*512);
for(int i = 0; i < n; i++) //shranimo stevilo B v zacasno polje
{
zacasni[i] = stevilo_b[i];
}
//klicemo metodo setej, da sestejemo produkt int zacasni
Sestevanje(produkt, zacasni, produkt, stevilo);
}
//zadnji bit = 1 primerjalni bit = 0 - odstej stevilo B od produkta (pristej B komplement)
else if(produkt[stevilo-1] == 1 && primerjalni == 0)
{
int zacasni[2*512]; //pomozno polje
Nicle(zacasni, 2*512); //inicialziacija
for(int m = 0; m < n; m++) //prepisemo drugo stevilo v zacasni1
{
zacasni[m] = stevilo_b[m];
}
DvojiskiKomplement(zacasni, n); //stevilo je negativno zato moramo narditi dvojiski komplement
Sestevanje(produkt, zacasni, produkt, stevilo); //sesteje produkt + (-B)
}
//zadnji bit = 0, primerjalni bit = 0 - samo pomik v desno
//zadnji bit = 1, primerjalni bit = 1 - samo pomik v desno
primerjalni = produkt[stevilo-1]; //bit za primerjavo
RShift(produkt, stevilo); //vedno (tudi ko sestevamo oz. odestevamo) shiftamo
stevec++; //povecamo stevec
}
cout << endl;
}
// TO FUNKCIJO SN ZDAJ NAPISAL SAMO ZDAJ JE NE ZNAM VKLJUCIT V KODO.
void Hexadecimal (int n){
if (n > 15)Hexadecimal (n/16);
if (n % 16 < 10) cout << n % 16;
else{
switch (n%16){
case 10:
cout << "A";
break;
case 11:
cout << "B";
break;
case 12:
cout << "C";
break;
case 13:
cout << "D";
break;
case 14:
cout << "E";
break;
case 15:
cout << "F";
}
}
}
void booth(int biti)
{
//rezerviramo max. velikost polja (256),ponavadi kasneje ne uporabljamo,
//ker je preveliko za vnos
int produkt[128*2];
//nasi polji (stevili)
int stevilo1[128];
int stevilo2[128];
//stevilo bitov
// int biti;
//polje znakov za vnos stevila
char a[128];
char b[128];
//inicializacija vseh polj
Nicle(produkt, 128*2);
Nicle(stevilo1, 128);
Nicle(stevilo2, 128);
{
//branje stevil A in B
cout << "vpisite stevilo A: ";
cin >> a;
Vnos(a, stevilo1, biti);
cout << "vpisi stevilo B: ";
cin >> b;
cout << endl;
Vnos(b, stevilo2, biti);
//izracun in izpis
cout << "Stevilo A dvojisko : ";
IzpisBinarno(stevilo1, biti);
cout << endl;
cout << "Stevilo B dvojisko : ";
IzpisBinarno(stevilo2, biti);
cout << endl;
//klicanje metode Mnozenje
Mnozenje(stevilo1, stevilo2, produkt, biti);
cout << "Rezultat" << endl;
cout << "---------------" << endl;
cout << "Dvojisko: ";
//dvojiski izpis
IzpisBinarno(produkt, 2*biti);
cout << endl;
cout << "Desetisko: ";
//desetiski izpis
if(produkt[0] == 1) //ce je stevilo negativno naredimo dvojiski komplement
{
DvojiskiKomplement(produkt, (biti*2));
int zacasni = IzpisDesetisko(produkt,2*biti);
cout << -zacasni;
}
else //ce je stevilo pozitivno
{
int zacasni = IzpisDesetisko(produkt,2*biti);
cout << zacasni;
}
cout << endl;
}
}
//glavni program
int main()
{
int biti;
//vnos stevila bitov
//TU MI MANJKA NESKONCNA ZANKA ZA PREVERJANJE POGOJA.
cout << "Vnesite stevilo bitov: ";
cin >> biti;
if( biti!=4 || biti!=8 || biti!=16 || biti!=32 || biti!=64 || biti!=128)
{
cout<<"Napacen vnos"< cout<<"Vnesite stevilo bitov"<<" ";
cin>>biti;
}
else (biti==4 || biti==8||biti==16||biti==32||biti==64||biti==128);
booth(biti);
return 0;
}
NAJLEPŠA HVALA ZA TRUD
In nevem zakaj ampak ne gre mi preverjat nekih pogojev oziroma moral bi narditi neskoncno zanko pa mi nekak ne deluje.
#include
#include
#include
#include
//inicializacija polja
void Nicle(int stevilo[], int n)
{
for(int i = 0; i < n; i++) //napolnimo polje s samimi niclami
stevilo[i] = 0;
}
//metoda za spremembo iz char polje v int polje (vnos)
void Vnos(char niz[], int stevilo[], int n)
{
int dolzina; //dolzina niza
dolzina = strlen(niz);
if(dolzina > n) //ce smo vnesli predolgi niz
{
cout <<"Napaka stevilo ne obstaja je predolgo!" << endl;
exit(1); //izhod iz programa,program se zakljuci
}
else
{
//stevilo ustreza vsem pogojem zato preverjamo vpisane znake (niz)
for(int i = 0; i < dolzina; i++) //prepisemo niz v polje
{
//ce niz vsebuje 1 to prepisemo kot 1 drugace kot 0
if(niz[i] == '1')
{
stevilo[i] = 1;
}
else
{
stevilo[i] = 0;
}
}
}
}
//funkcija za izpis polja v binarni obliki
void IzpisBinarno(int stevilo[], int n)
{
for(int i = 0; i < n; i++) //premikamo se po polju in izpisujemo clene
cout << stevilo[i];
}
//izpis stevila v desetiski obliki
int IzpisDesetisko(int stevilo[], int n)
{
int desetisko = 0; //spremenljivka za stevilo zapisano v desetiski
for (int i = n-1; i >= 0; i--)
desetisko = desetisko + stevilo[i]*(int)pow(2, n- i -1);
//formula: Stevilo=Stevilo + bit * 2^E
if(stevilo[0] == 1) //ce je predznak negativen
desetisko = -desetisko;
return desetisko;
}
//Pomik v desno (right shift) - prvo mesto ima vrednost, ki je bila tam nazadnje
void RShift(int stevilo[], int n)
{
for(int i = n-1; i > 0; i--)
stevilo[i] = stevilo[i-1]; //pomika v desno - brez da spremenimo predznak
}
//vsota dveh stevil iste dolzine
void Sestevanje(int stevilo_a[], int stevilo_b[], int rezultat[], int n)
{
int prenos = 0; //prenos ali bit
int vsota = 0; //pomozna vsota
for(int i = n-1; i >= 0; i--)
{
vsota = (stevilo_a[i] + stevilo_b[i] + prenos); //sestevek - pomozna vsota
if(vsota == 1) //v dvojiskem, ce imamo 1 je rezultat = 1, prenos 0
{
rezultat[i] = 1;
prenos = 0; //bit
}
else if(vsota == 2) //v dvojiskem, ce imamo 2 je rezultat 0, prenos 1
{
rezultat[i] = 0;
prenos= 1; //bit
}
else if(vsota == 3) //v dvojiskem, ce imamo 3 je rezultat 1, prenos 1
{
rezultat[i] = 1;
prenos = 1;
}
}
}
//dvojiski komplement
void DvojiskiKomplement(int stevilo[], int n)
{
int enka[512]; //pomozno polje (vrednost 1), ki sluzi kot pristevek k eniskemu komplementu
Nicle(enka, 512); //zapisemo same nicle v pomozno polje (ga inicializiramo
enka[n-1] = 1; //zadnji bit postavimo na 1
//(dejansko ni zadnji amapak je na n-1 mestu, ko imamo n bitna sevila)
//racunamo eniski komplement
for(int i = 0; i < n; i++)
{
if(stevilo[i] == 0) //ce je prej bila vrednost 0, je zdaj 1
stevilo[i] = 1;
else
stevilo[i] = 0; //drugace je zdaj 0
}
Sestevanje(stevilo, enka, stevilo, n); //klicemo metodo sestevanje, da dodamo 1 na koncu
}
//mnozenje dveh binranih stevil (boothov nacin)
void Mnozenje(int stevilo_a[], int stevilo_b[], int produkt[], int n)
{
int primerjalni = 0; //spremenljivka za primejalni bit za primerjavo
int stevec = 1; //stevec za izpis korakov
int stevilo = 2*n; //novo stevilo bitov produkta (2x vecje od stevila mnozencev)
//prepisemo v drugo polovico produkta bite stevila A
for(int i = 0; i < n; i++)
{
produkt[i+n] = stevilo_a[i];
}
for(int z = 0; z < n; z++)
{
//zadnji bit = 0, primerjalni bit = 1 - pristej stevilo B k produktu
if(produkt[stevilo-1] == 0 && primerjalni == 1)
{
int zacasni[2*512]; //pomozno polje 2x dolzine
Nicle(zacasni, 2*512);
for(int i = 0; i < n; i++) //shranimo stevilo B v zacasno polje
{
zacasni[i] = stevilo_b[i];
}
//klicemo metodo setej, da sestejemo produkt int zacasni
Sestevanje(produkt, zacasni, produkt, stevilo);
}
//zadnji bit = 1 primerjalni bit = 0 - odstej stevilo B od produkta (pristej B komplement)
else if(produkt[stevilo-1] == 1 && primerjalni == 0)
{
int zacasni[2*512]; //pomozno polje
Nicle(zacasni, 2*512); //inicialziacija
for(int m = 0; m < n; m++) //prepisemo drugo stevilo v zacasni1
{
zacasni[m] = stevilo_b[m];
}
DvojiskiKomplement(zacasni, n); //stevilo je negativno zato moramo narditi dvojiski komplement
Sestevanje(produkt, zacasni, produkt, stevilo); //sesteje produkt + (-B)
}
//zadnji bit = 0, primerjalni bit = 0 - samo pomik v desno
//zadnji bit = 1, primerjalni bit = 1 - samo pomik v desno
primerjalni = produkt[stevilo-1]; //bit za primerjavo
RShift(produkt, stevilo); //vedno (tudi ko sestevamo oz. odestevamo) shiftamo
stevec++; //povecamo stevec
}
cout << endl;
}
// TO FUNKCIJO SN ZDAJ NAPISAL SAMO ZDAJ JE NE ZNAM VKLJUCIT V KODO.
void Hexadecimal (int n){
if (n > 15)Hexadecimal (n/16);
if (n % 16 < 10) cout << n % 16;
else{
switch (n%16){
case 10:
cout << "A";
break;
case 11:
cout << "B";
break;
case 12:
cout << "C";
break;
case 13:
cout << "D";
break;
case 14:
cout << "E";
break;
case 15:
cout << "F";
}
}
}
void booth(int biti)
{
//rezerviramo max. velikost polja (256),ponavadi kasneje ne uporabljamo,
//ker je preveliko za vnos
int produkt[128*2];
//nasi polji (stevili)
int stevilo1[128];
int stevilo2[128];
//stevilo bitov
// int biti;
//polje znakov za vnos stevila
char a[128];
char b[128];
//inicializacija vseh polj
Nicle(produkt, 128*2);
Nicle(stevilo1, 128);
Nicle(stevilo2, 128);
{
//branje stevil A in B
cout << "vpisite stevilo A: ";
cin >> a;
Vnos(a, stevilo1, biti);
cout << "vpisi stevilo B: ";
cin >> b;
cout << endl;
Vnos(b, stevilo2, biti);
//izracun in izpis
cout << "Stevilo A dvojisko : ";
IzpisBinarno(stevilo1, biti);
cout << endl;
cout << "Stevilo B dvojisko : ";
IzpisBinarno(stevilo2, biti);
cout << endl;
//klicanje metode Mnozenje
Mnozenje(stevilo1, stevilo2, produkt, biti);
cout << "Rezultat" << endl;
cout << "---------------" << endl;
cout << "Dvojisko: ";
//dvojiski izpis
IzpisBinarno(produkt, 2*biti);
cout << endl;
cout << "Desetisko: ";
//desetiski izpis
if(produkt[0] == 1) //ce je stevilo negativno naredimo dvojiski komplement
{
DvojiskiKomplement(produkt, (biti*2));
int zacasni = IzpisDesetisko(produkt,2*biti);
cout << -zacasni;
}
else //ce je stevilo pozitivno
{
int zacasni = IzpisDesetisko(produkt,2*biti);
cout << zacasni;
}
cout << endl;
}
}
//glavni program
int main()
{
int biti;
//vnos stevila bitov
//TU MI MANJKA NESKONCNA ZANKA ZA PREVERJANJE POGOJA.
cout << "Vnesite stevilo bitov: ";
cin >> biti;
if( biti!=4 || biti!=8 || biti!=16 || biti!=32 || biti!=64 || biti!=128)
{
cout<<"Napacen vnos"< cout<<"Vnesite stevilo bitov"<<" ";
cin>>biti;
}
else (biti==4 || biti==8||biti==16||biti==32||biti==64||biti==128);
booth(biti);
return 0;
}
NAJLEPŠA HVALA ZA TRUD
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | DIJKSTROV_ALGORITEMOddelek: Programiranje | 2221 (1455) | krneki0001 |
» | [C++] Naloga seznamOddelek: Programiranje | 3303 (2578) | Matic1911 |
» | C++ NalogeOddelek: Programiranje | 2996 (2055) | boogie_xlr |
» | [c++] problem: pretvorba iz malih v velike crkeOddelek: Programiranje | 2134 (1781) | Makina |
» | [C++] - Tolmačenje povedi in izvedba operacij nad števkamiOddelek: Programiranje | 3349 (2585) | jernejl |