Problem racunanja realnog broja.

poruka: 22
|
čitano: 3.326
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
Problem racunanja realnog broja.

 

Pravim program koji pretvara brojeve iz baze odabrane u dekadski sustav...

ali neznam kako bi napravio ovo:

 

 

float t=2/b;

 

gdje je b integer...

npr ako je b=4 i onda je t=2/4=0.5 on meni ispise 0....

 

Program koji radim(nije ni blizu gotovo):

 

#include <iostream>

#include <conio.h>

#include <string.h>

#include <math.h>

#include <conio.h>

using namespace std;

 

float pretvorba(int b, char x[50]){

    int i=0;

    float a=0, t;

 

    for (i=0; i<strlen(x); i++){

      if (x[i]=='.'){

        i++;

        break;

        }

      }

 

    while (i<strlen(x)){

       switch (x[i]){

           case '0':

             a+=0;

             break;

           case '1':

             t=1/b;

             a+=t;

             break;

           case '2':

             t=2/b;

             a+=t;

             break;

           case '3':

             t=3/b;

             a+=t;

             break;

           case '4':

             t=4/b;

             a+=t;

             break;

           }

           cout<<a;

       i++;

       b*=b;

       }

   return a;

   }

 

int main(){

   char x[50];

   int b;

 

   cout<<"___ Program koji pretvara broj iz sustava u sustav ___\n";

 

   cout<<"Unesite broj: ";

   cin>>x;

   cout<<"Unesite bazu prethodno unesenog broja: ";

   cin>>b;

 

   float dekadski=pretvorba(b, x);

 

   cout<<"Uneseni broj u bazi 10 iznosi: "<<dekadski;

 

   getch();

   return 0;

   }

 

Poruka je uređivana zadnji put ned 17.10.2010 19:26 (calex3).
 
0 0 hvala 0
16 godina
neaktivan
offline
RE: Problem racunanja realnog broja.
calex3 kaže...

 

float t=2/b;

 

gdje je b integer...

npr ako je b=4 i onda je t=2/4=0.5 on meni ispise 0....

 

 

 

Vjerovatno zato sta si napisa da je b int, ili b deklariraj kao float ili napisi

 

float t = 2 / (float)b;

17 godina
offline
Problem racunanja realnog broja.

t = 2./b;

iza 2 stavi točku

 
1 0 hvala 0
15 godina
neaktivan
offline
RE: Problem racunanja realnog broja.

ok odo probat oboje :))

 

EDIT:

t=2/float(b);

radi savrseno :)))))

 

btw pokusava sam isto tako ali sam stavlja float(2/b) pa mi nije radilo pa mi nije palo na pamet da stavim samo b -.-"

Poruka je uređivana zadnji put ned 17.10.2010 19:59 (calex3).
15 godina
neaktivan
offline
RE: Problem racunanja realnog broja.

DRUGO PITANJE:

postoji li jednostavniji nacin za zapisat ovaj switch:

       switch (x[i]){

           case '0':

             a+=0;

             break;

           case '1':

             t=1/float(b);

             a+=t;

             break;

           case '2':

             t=2/float(b);

             a+=t;

             break;

           case '3':

             t=3/float(b);

             a+=t;

             break;

           case '4':

             t=4/float(b);

             a+=t;

             break;

           case '5':

             t=5/float(b);

             a+=t;

             break;

           case '6':

             t=6/float(b);

             a+=t;

             break;

           case '7':

             t=7/float(b);

             a+=t;

             break;

           case '8':

             t=8/float(b);

             a+=t;

             break;

           case '9':

             t=9/float(b);

             a+=t;

             break;

           case 'A':

             t=10/float(b);

             a+=t;

             break;

           case 'B':

             t=11/float(b);

             a+=t;

             break;

           case 'C':

             t=12/float(b);

             a+=t;

             break;

           case 'D':

             t=13/float(b);

             a+=t;

             break;

           case 'E':

             t=14/float(b);

             a+=t;

             break;

           case 'F':

             t=15/float(b);

             a+=t;

             break;

           }

17 godina
offline
Problem racunanja realnog broja.

Kvaka ti je u tome što operator pridruživanja ima niži prioritet od operatora djeljenja

Dakle za ovaj slučaj:

t = 2/b  // dijeli se cijeli sa cjelim i dobija se cijeli kao rezultat koji se sprema u float varijablu t

 

Da bi se to izbjeglo mora se jedan od dva cijela operatora pretvoriti u float i tako kao rezultat djeljenja dobio float:

t = 2./b // cijeli broj 2 se pretvara u float jer 2. u stvari je decimalni broj

t = 2/float(b) // cijeli broj b se pretvara u float cast operatorom

 

Izraz:

float(2/b)  // dijeljenje ima prioritet, dakle kao rezultat djeljenja dobijemo cjeli broj i tek onda se pretvara u float i ne dobija se željeni rezultat

 

Poruka je uređivana zadnji put ned 17.10.2010 20:16 (Floki).
 
0 0 hvala 0
15 godina
neaktivan
offline
RE: Problem racunanja realnog broja.
Floki kaže...

Kvaka ti je u tome što operator pridruživanja ima niži prioritet od operatora djeljenja

Dakle za ovaj slučaj:

t = 2/b  // dijeli se cijeli sa cjelim i dobija se cijeli kao rezultat koji se sprema u float varijablu t

 

Da bi se to izbjeglo mora se iedan od dva cijela operatora pretvoriti u float i tako kao rezultat djeljenja dobio float:

t = 2./b // cijeli broj 2 se pretvara u float jer 2. u stvari je decimalni broj

t = 2/float(b) // cijeli broj b se pretvara u float cast operatorom

 

Izraz:

float(2/b)  // dijeljenje ima prioritet, dakle kao rezultat djeljenja dobijemo cjeli broj i tek onda se pretvara u float i ne dobija se željeni rezultat

 

Hvala Puno, Shvatija sam ;))))))

17 godina
offline
Problem racunanja realnog broja.

Koliko sam skužio ti trebaš program koji pretvara sve oblike brojeva u dekadski oblik.

Za pretvaranje svih oblika brojeva u dekadski oblik algoritam je isti i on izgleda ovako:

0x125  //  heksadecimalni broj 125

5*16^0 + 2*16^1 + 1*16^2  =  293   // dakle heksadecimalni broj 0x125 je broj 293 u dekadskom sustavu

Algoritam je potpuno isti i za pretvaranje brojeva iz oktalnog i binarnog sustava u dekadski sustav

 

Na osnovu toga radi sljedeći program:

 

 

#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;


float pretvorba(string broj, int baza)
{
    float dekadski =0;
    reverse(broj.begin(), broj.end());                 // niz pišemo u obrnutom redosljedu da možemo primjeniti algoritam
   
    for(int i=0; i<broj.length(); ++i) {
       int br = 0;
       for(int j='0'; j<='9'; ++j)
          if(broj[i] == j) {
             dekadski += (broj[i]-48)* pow(baza, (float)i); // za pojedinu brojčanu znamenku niza računamo dekadsku vrijednost,
          br++;                        // koeficijent i u petlji koristimo kao potenciju
       }              
       if(broj[i]=='A' || broj[i]=='B' || broj[i]=='C' || broj[i]=='D' || broj[i]=='E' || broj[i]=='F') {     
          dekadski += (broj[i]%50-5)* pow(baza, (float)i);                  
          br++;                                                     
       }                                                            
       if(br==0) {
          cout<< "Nepostojeci broj!" << endl;
          return 0;
       }

       }
    return dekadski;
    }
int main()
{
    string broj;
    int baza;
   
    cout<< "Unesi broj: ";
    getline(cin, broj);
    cout<< "Unesi bazu prethodnog broja: ";
    cin>> baza;
    cout<< "Dekadski oblik broja " << broj << ": " << pretvorba(broj, baza) << endl;
    return 0;
}



Poruka je uređivana zadnji put uto 19.10.2010 18:48 (Floki).
 
0 0 hvala 0
15 godina
neaktivan
offline
RE: Problem racunanja realnog broja.

također radi i moj :D

 

#include <iostream>

#include <string.h>

using namespace std;

 

float pretvorba_dekadski(int b, char x[50]){

    int i=0, b2=b;

    float a=0;

    char y;

    for (i=0; i<strlen(x); i++){

      if (x[i]=='.'){

        i++;

        break;

        }

      }

    while (i<strlen(x)){

       y=x[i];

       switch (x[i]){

           case 'A':

             a+=10/float(b);

             break;

           case 'B':

             a+=11/float(b);

             break;

           case 'C':

             a+=12/float(b);

             break;

           case 'D':

             a+=13/float(b);

             break;

           case 'E':

             a+=14/float(b);

             break;

           case 'F':

             a+=15/float(b);

             break;

           default:

               a+=atoi(&y)/float(b);

           }

       i++;

       b*=b2;

       }

    i=0;

    for (i=0; i<strlen(x); i++){

      if (x[i]=='.'){

        break;

        }

      }

    b=1;

    do {

      i--;

      y=x[i];

      switch (x[i]){

         case 'A':

            a+=10*b;

            break;

         case 'B':

            a+=11*b;

            break;

         case 'C':

            a+=12*b;

            break;

         case 'D':

            a+=13*b;

            break;

         case 'E':

            a+=14*b;

            break;

         case 'F':

            a+=15*b;

            break;

         default:

             a+=atoi(&y)*b;

         }

      b*=b2;

      } while (i>0);

   return a;

   }

 

 

 

int main(){

   char x[50];

   int b;

 

   cout<<"___ Program koji pretvara broj iz sustava u dekadski ___\n";

 

   cout<<"\nUnesite broj: ";

   cin>>x;

   baza:

   cout<<"Unesite bazu prethodno unesenog broja [2-16]: ";

   cin>>b;

   if (b<2 || b>16){goto baza;}

 

   char dekadski_broj[50];

   sprintf(dekadski_broj, "%f", pretvorba_dekadski(b, x));

 

   cout<<"Uneseni broj u bazi 10 iznosi: "<<dekadski_broj;

 

   return 0;

   }

 

 

SAD radim pretvorbu iz dekadskog u bilo koju bazu koju cu dodat ovom programu ...jednostavno je takoder :)))

16 godina
odjavljen
offline
Problem racunanja realnog broja.

Za pretvaranje znamenki A - F u brojevnu vrijednosti možeš koristiti ovaj kod:

 

if((x[i]>=48)&&(x[i]<=57)) //Ako ASCII kod odgovara broju (najveća vjerojatnost, pa je zato prva provjera) broj dobiješ oduzimanjem ASCII vrijednosti nule (48)

  a+=(x[i]-48)/float(b);

else if((x[i]>=65)&&(x[i]<=70)) //Ako ASCII kod odgovara velikom slovu, oduzimaš 55 (+ 10 - 65) jer je ASCII od "A" = 65

  a+=(x[i]-55)/float(b);

else if((x[i]>=97)&&(x[i]<=102)) //Ako ASCII kod odgovara malom slovu, oduzimaš 87 (+ 10 - 97) jer je ASCII od "a" = 97  a+=(x[i]-87)/float(b);

else

  cout<<"invalid character"<<endl;

 

Analogno tome i za drugi dio koda ili možeš odmah obraditi i spremiti niz integera.

Heart: _/\_/\_/\_/\_/\_/\_/\_/\_ Brain: __________________________
 
0 0 hvala 0
17 godina
neaktivan
offline
Problem racunanja realnog broja.

A nešto ovako? Konkretno ovo pretvara dekadski u heksadekadski...

 

#include <stdio.h>

int main()
{
    int a;

    fscanf(stdin, "%d", &a);
    fprintf(stdout, "\n%X", a);

    return 0;
}

 

Crude, but effective.

http://3.141592653589793238462643383279502884197169399375105820974944592.com/index314.html
 
0 0 hvala 0
16 godina
odjavljen
offline
RE: Problem racunanja realnog broja.
1domagoj1 kaže...

A nešto ovako? Konkretno ovo pretvara dekadski u heksadekadski...

 

#include <stdio.h>

int main()
{
      int a;

      fscanf(stdin, "%d", &a);
      fprintf(stdout, "\n%X", a);

      return 0;
}

 

Crude, but effective.

Ovo ne pretvara ama baš ništa već formatira ispis. Ako ti poslje trebaš nešto napraviti s dobivenim rezultatom, onda ovo ne možeš koristiti. Nije od neke koristi ni ako se radi o zadatku za školu u kojem je potrebno implementirati algoritam, a ne samo dobiti točan rezultat.

Heart: _/\_/\_/\_/\_/\_/\_/\_/\_ Brain: __________________________
17 godina
neaktivan
offline
Problem racunanja realnog broja.

Da, nisam se dobro izrazio, formatira ispis, u pravu si. Zato kažem, crude. I dobro je jedino ako je svrha samo vidjeti koji broj u kojoj bazi je koji u nekoj drugoj. Koristiti rezultat se ne može.

http://3.141592653589793238462643383279502884197169399375105820974944592.com/index314.html
 
0 0 hvala 0
15 godina
neaktivan
offline
RE: Problem racunanja realnog broja.

MrBLC probat cu ovaj tvoj kod...btw taj ascii kod je naprimjer ovo??:

char x='A';

 

printf("%d", x);

 

 

RADI !!!! TNX MrBlc!!

 

sad zelim dovrsit program tako da pretvori broj u odabranu bazu koju korisnik odabere...

to znaci da sad dekadski broj ...uzme mu cijeli dio i trazi ostatke cijelobrojnog djeljenja sa odabranom bazom te smanjuje broj za cijelobrojno dijeljenje sa o. bazon ....zapisuje ih u string i na kraju string okrene ...ali isto mora zamjenjivati brojeve 10,11,12,13,14,15 u A,B,C,D,E,F ....pa me opet zanima postoji li jednostavnici nacin za ovo napraviti umjesto switchanja svih znakova? :D

Poruka je uređivana zadnji put ned 24.10.2010 16:55 (calex3).
16 godina
odjavljen
offline
RE: Problem racunanja realnog broja.
calex3 kaže...

MrBLC probat cu ovaj tvoj kod...btw taj ascii kod je naprimjer ovo??:

char x='A';

 

printf("%d", x);

 

 

RADI !!!! TNX MrBlc!!

 

sad zelim dovrsit program tako da pretvori broj u odabranu bazu koju korisnik odabere...

to znaci da sad dekadski broj ...uzme mu cijeli dio i trazi ostatke cijelobrojnog djeljenja sa odabranom bazom te smanjuje broj za cijelobrojno dijeljenje sa o. bazon ....zapisuje ih u string i na kraju string okrene ...ali isto mora zamjenjivati brojeve 10,11,12,13,14,15 u A,B,C,D,E,F ....pa me opet zanima postoji li jednostavnici nacin za ovo napraviti umjesto switchanja svih znakova? :D

Ima operaciju ostatak cijelobrojnog djeljenja: x = a%b, x je ostatak od a/b. Što se tiće pretvaranja 10-15 u A-F, to radiš prije dodavanja u string. Najbolje ti je vrijednost broja dodijeliti char varijabli, pa ako je ta varijabla manja od 10 dodaješ joj 48, a ako je veća (10 - 15) dodaješ joj 55 (odnosno 87 za ako želiš mala slova u ispisu), te na kraju taj char dodaješ na kraj stringa.

 

Još jedan hint:

Ako u string str ubaciješ rezultat char x na ovaj način:

str.insert(str.begin(),1,x);

Novu znamenku ubacuješ na početak stringa, tako da ne trebaš invertirati string.

Heart: _/\_/\_/\_/\_/\_/\_/\_/\_ Brain: __________________________
15 godina
neaktivan
offline
RE: Problem racunanja realnog broja.
Znam ali zar ne postoji nesto kao strran()? za okrecanje stringa...
ja bi to ovako napravio:
char x[...];
x[10]='A', x[11]='B' ....
if (a%b>=10){
strcat(string, x[a%b]);
}
Poruka je uređivana zadnji put ned 24.10.2010 22:02 (calex3).
17 godina
offline
RE: Problem racunanja realnog broja.
MrBlc kaže...

Za pretvaranje znamenki A - F u brojevnu vrijednosti možeš koristiti ovaj kod:

 

if((x[i]>=48)&&(x[i]<=57)) //Ako ASCII kod odgovara broju (najveća vjerojatnost, pa je zato prva provjera) broj dobiješ oduzimanjem ASCII vrijednosti nule (48)

  a+=(x[i]-48)/float(b);

else if((x[i]>=65)&&(x[i]<=70)) //Ako ASCII kod odgovara velikom slovu, oduzimaš 55 (+ 10 - 65) jer je ASCII od "A" = 65

  a+=(x[i]-55)/float(b);

else if((x[i]>=97)&&(x[i]<=102)) //Ako ASCII kod odgovara malom slovu, oduzimaš 87 (+ 10 - 97) jer je ASCII od "a" = 97  a+=(x[i]-87)/float(b);

else

  cout<<"invalid character"<<endl;

 

Analogno tome i za drugi dio koda ili možeš odmah obraditi i spremiti niz integera.

To je u stvari ono što sam ja napravio:

 

if(broj[i]=='A' || broj[i]=='B' || broj[i]=='C' || broj[i]=='D' || broj[i]=='E' || broj[i]=='F') {    

      dekadski += (broj[i]%50-5)* pow(baza, (float)i);          

      br++;   

 

Dalje se iz toga može izvesti:

if(broj[i]>=65 && broj[i]<=70) {

dekadski += (broj[i]%50-5)*pow(baza, (float i);

br++;

 

 

Princip je isti; svaki char znak ima svoju int vrijednost

 

 

Poruka je uređivana zadnji put pon 25.10.2010 13:00 (Floki).
17 godina
offline
RE: Problem racunanja realnog broja.
calex3 kaže...
Znam ali zar ne postoji nesto kao strran()? za okrecanje stringa...
ja bi to ovako napravio:
char x[...];
x[10]='A', x[11]='B' ....
if (a%b>=10){
strcat(string, x[a%b]);
}

Jednostavnije je koristiti string klasu koja je sastavni dio C++, nego char string

Onda obrtanje niza ide ovako:

reverse(broj.begin(), broj.end());

16 godina
odjavljen
offline
RE: Problem racunanja realnog broja.
Floki kaže...

 

if(broj[i]=='A' || broj[i]=='B' || broj[i]=='C' || broj[i]=='D' || broj[i]=='E' || broj[i]=='F')

Sve je to super, ali zašto raditi 6 komparacija i 5 I operacija kad može napraviti 2 komparacije i jednu "I" operaciju?

Heart: _/\_/\_/\_/\_/\_/\_/\_/\_ Brain: __________________________
17 godina
offline
RE: Problem racunanja realnog broja.
calex3 kaže...

MrBLC probat cu ovaj tvoj kod...btw taj ascii kod je naprimjer ovo??:

char x='A';

 

printf("%d", x);

 

 

RADI !!!! TNX MrBlc!!

 

sad zelim dovrsit program tako da pretvori broj u odabranu bazu koju korisnik odabere...

to znaci da sad dekadski broj ...uzme mu cijeli dio i trazi ostatke cijelobrojnog djeljenja sa odabranom bazom te smanjuje broj za cijelobrojno dijeljenje sa o. bazon ....zapisuje ih u string i na kraju string okrene ...ali isto mora zamjenjivati brojeve 10,11,12,13,14,15 u A,B,C,D,E,F ....pa me opet zanima postoji li jednostavnici nacin za ovo napraviti umjesto switchanja svih znakova? :D

Zašto bi uopće koristio switch, kad broj A-F možeš dobiti preko operatora %.

('A'%50)-5 = 10; ili (65%50)-5 = 10

 

char 'A' = int 65

međutim, dobio si odmah gotovi kod koji zaobilazi switch, samo ga se očito nisi udostojio ni pogledati

 

btw. Mr.Blic - to je i glavni razlog zašto sam koristio:

if(broj[i]=='A' || broj[i]=='B' || broj[i]=='C' || broj[i]=='D' || broj[i]=='E' || broj[i]=='F')

a ne:

if(broj[i]>=65 && broj[i]<=70)

Odgovorio sam njemu kako će zaobići switch

 

 

Poruka je uređivana zadnji put pon 25.10.2010 13:44 (Floki).
17 godina
moderator
online
RE: Problem racunanja realnog broja.
Floki kaže...

Zašto bi uopće koristio switch, kad broj A-F možeš dobiti preko operatora %.

('A'%50)-5 = 10; ili (65%50)-5 = 10

 

char 'A' = int 65

međutim, dobio si odmah gotovi kod koji zaobilazi switch, samo ga se očito nisi udostojio ni pogledati

 

btw. Mr.Blic - to je i glavni razlog zašto sam koristio:

if(broj[i]=='A' || broj[i]=='B' || broj[i]=='C' || broj[i]=='D' || broj[i]=='E' || broj[i]=='F')

a ne:

if(broj[i]>=65 && broj[i]<=70)

Odgovorio sam njemu kako će zaobići switch

MrBlc je dao posve opravdan komentar - u tvom slucaju, "zaobilazenje" switcha s if-om s hrpom usporedbi skoro pa je ravno pretakanju iz supljeg u prazno (i dalje su tu u pitanju "nabrajanja" slovcanih znamenki). Tim vise sto dalje racunas s ASCII vrijednostima znakova. Ovo drugo rjesenje je dobro (if(broj[i]>=65 && broj[i]<=70)).


BTW ne razumijem zasto se radi tako veliki problem s velikim i malim slovima u brojevima. Jednostavno se napravi:

broj[i] = toupper(broj[i]);
I rijesena stvar! Ne trebaju onda dva if-a i dva nacina preracunavanja!

17 godina
offline
RE: Problem racunanja realnog broja.
mbaksa kaže..

MrBlc je dao posve opravdan komentar - u tvom slucaju, "zaobilazenje" switcha s if-om s hrpom usporedbi skoro pa je ravno pretakanju iz supljeg u prazno (i dalje su tu u pitanju "nabrajanja" slovcanih znamenki). Tim vise sto dalje racunas s ASCII vrijednostima znakova. Ovo drugo rjesenje je dobro (if(broj[i]>=65 && broj[i]<=70)).


Slažem se ja s njegovim komentarom, to sporno nije, čim se radi sa ASCII vrijednosti znakova to stoji!

doduše jedna linija koda umjesto switch "kobasice" i nije baš "šuplje-prazno" pretvorba, he,he, ali

nabrajanje je nepotrebno, to stoji

Nisam ja ni proturječio Mr. Blicu, samo sam rekao da je korištenje ASCII vrijednosti znakova bolji način,

nego da se preko switcha dodijele int vrijednosti char znakovima, što je on i govorio

Poruka je uređivana zadnji put uto 26.10.2010 12:23 (Floki).
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice