c atoi

Sekcia o programovaní, programovacích jazykoch...
Užívateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

c atoi

Príspevok od užívateľa marko365 » Ne 10. Júl, 2011, 13:38

Ako sa da previest kusok pamate a ulozit do jednej premennej.
Nieco take mam na mysli :
int i;
int x;
char j[6];
j[0]=1;
j[1]=2;
j[2]=3;
j[3]='a';
j[4]='b';
j[5]=4;
j[6]=5;

i=atoi(j[0],j[1],j[2]); // ja viem ze to je zle to iba na ilustraciu
x=atoi(j[5 az 6]); // toto tiez

printf("%d %d",i,x);
Dalo by sa to kratenim 10 ale chcem vediet ci nieje nieco jednoduchsie.

Užívateľov profilový obrázok
kami_sama
Používateľ
Používateľ
Príspevky: 445
Dátum registrácie: Po 05. Sep, 2005, 20:00
Bydlisko: Bratislava
Kontaktovať užívateľa:

Re: c atoi

Príspevok od užívateľa kami_sama » Ne 10. Júl, 2011, 22:29

treba pouzit posuvacie operacie, cize operacie << a >>.

trosku na uvod (keby si to nahodou nevedel).

char ma velkost jedneho bajtu (8bit). int, ked sa nemylim v C ma velkost dva bajty.

char a je v pamati: [_ _ _ _ _ _ _ _]
int b je v pamati: [_ _ _ _ _ _ _ _][_ _ _ _ _ _ _ _]

nech je a=[00010110]
potom ked b=a, to znamena, ze b=[00000000][00010110]

posuvacie operacie ti posuvaju bity bud dolava (<<), alebo doprava (>>). cize na b z predchadzajuceho prikladu je b>>1 == [00000000][00001011], pre b>>2 == [00000000][00000101], atd. to iste plati pre opacnu operaciu (<<). cize posuva bity dalej. co vypadne, to vymaze a doplna nuly (lepsie by si to videl v asemblery, ale zatial to takto staci).

takze spat na otazku.

z char a[2] spravis int b nasledujucim sposobom:

Kód: Vybrať všetko

char a[0] = 1; //[00000001]
char a[1] = 2; //[00000010]
int b = 0;     //[00000000][00000000]
b = a[0];      //[00000000][00000001]
b = b << 8;    //[00000001][00000000] -> toto je inac hodnota 256 (2^8).
// ked teraz spravis b = a[1], tak to spravi, ze b=[00000000][00000010]. preto urobime toto:
b += a[1];     //[00000001][00000010] -> cize dostanes hodnotu 256 + 2 = 258 (2^8 + 2^1).
dufam ze som dobre pochopil tvoju otazku a toto si potreboval.

Užívateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: c atoi

Príspevok od užívateľa marko365 » Po 11. Júl, 2011, 12:31

A ak natrafi na znak tak potom co lebo mne ide hlavne o to aby som vedel rozdelit cislo pred znakom a za nim.
cize char j[0]=1;
j[1]=2;
j[2]=3;
j[3]=a;
j[4]=4;
int x,i;
i=123;
x=4;
j=a;

Užívateľov profilový obrázok
kami_sama
Používateľ
Používateľ
Príspevky: 445
Dátum registrácie: Po 05. Sep, 2005, 20:00
Bydlisko: Bratislava
Kontaktovať užívateľa:

Re: c atoi

Príspevok od užívateľa kami_sama » Po 11. Júl, 2011, 13:23

znak je iba jedna hodnota z moznych 256, co je v pamati ulozene. pozri si ASCII tabulku (napr. tu).

to znamena, ze napr. 'a' == [01100001] a 'A' == [01000001].

treba si uvedomit, ze vzdy pracujes s cislami, len su rozne reprezentovane. skus si nechal vypisat toto:

Kód: Vybrať všetko

printf("%d %c", 'A', 'A'); //mal by si dostat toto: 65 A
V podstate preto je velky rozdiel, ci do jedneho bajtu napises hodnotu 1, alebo hodnotu '1' (cize hodnotu znaku z ASCII tabulky). V prvom pripade to bude [00000001] v druhom pripade [00110001].

Na zaklade ASCII hodnot by si mal vediet vyhodit/rozpoznat znaky, ktore nepotrebujes.

Užívateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: c atoi

Príspevok od užívateľa marko365 » Po 11. Júl, 2011, 17:02

Ale ja chcem dostat cislo 12 a nie 258 ja potrebujem 000001100

Užívateľov profilový obrázok
pEpinko
Používateľ
Používateľ
Príspevky: 864
Dátum registrácie: Po 19. Máj, 2008, 09:31
Bydlisko: BA/NR

Re: c atoi

Príspevok od užívateľa pEpinko » Po 11. Júl, 2011, 19:12

1. Na beznych PC je int 32-bit.
2. Skusal si i=atoi(j), imho by to mohlo spravit ze i bude 123.

Užívateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: c atoi

Príspevok od užívateľa marko365 » Po 11. Júl, 2011, 19:16

Atoi som skusal ale nic a imho to je co/kto ?

Užívateľov profilový obrázok
pEpinko
Používateľ
Používateľ
Príspevky: 864
Dátum registrácie: Po 19. Máj, 2008, 09:31
Bydlisko: BA/NR

Re: c atoi

Príspevok od užívateľa pEpinko » Ut 12. Júl, 2011, 14:57

"imho" je skratka od in my humble opinion (teda nieco ako podla mojho nazoru).

Ako to funguje, ak j je pole charov (char*), tak atoi(j) konvertuje retazec j na cislo reprezentovane tymto retazcom. Ako sa to deje, co sa robi s necislami, je najditelne pomocou googlu. Problem je, ze z tvojho popisu nie je ani trochu jasne, co chces spravit. Najednoduhsie ako opisat, co chces je napisat co je vstup a co ma byt vystup. Pripadne uviest priklad, tvoje priklady ale maju problem s tym, ze nepopises, vyznam toho co tam mas.

Užívateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: c atoi

Príspevok od užívateľa marko365 » Ut 12. Júl, 2011, 21:10

Skusam si urobit kalkulacku (v konzole). Ak dostanem priklad napr. (1+1)*2-0+(8+8+4-2)*11+45 (vsetko v jednom riadku). Tak ako zistom ze su tam cisla 45,1,11,8 atd. Ja to skusam tak ze kontrolujem ci tam nie su zatvorky (ak ano tak hladam znaky *,/,+,- a urobim operaciu) potom znaky *,/,+,- a teraz potrebujem tie cisla aby som mohol urobit tie operacie (*,/,+,-). Kazdy znak mam v osobitnom poli tak ako ulozim do premennej(i) cislo 45 a nie iba 4 ?

Užívateľov profilový obrázok
kami_sama
Používateľ
Používateľ
Príspevky: 445
Dátum registrácie: Po 05. Sep, 2005, 20:00
Bydlisko: Bratislava
Kontaktovať užívateľa:

Re: c atoi

Príspevok od užívateľa kami_sama » Ut 12. Júl, 2011, 22:08

ked robis taketo nieco, tak sa skus pozriet na stromove struktury pre aritmeticke operacie. napr. podobne nieco, ako je to v tomto deme (aj ked to potrebuje viac zatvoriek...).

dalsia moznost je na to pouzit ANTLR.

btw: prevod cislic z char do int bez atoi:

Kód: Vybrať všetko

  int counter = 0, i = 0;
  char a [5];
  a[0] = '1';
  a[1] = '2';
  a[2] = '3';
  a[3] = 'a';


  for(i = 0; i < 5 && a[i]>'0' && a[i]<'9'; i++){
    counter *= 10;
    counter += (a[i] - '0');
  }

  printf("Tvoje cislo je: %d", counter);

Užívateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: c atoi

Príspevok od užívateľa marko365 » Št 14. Júl, 2011, 19:44

Neviem ci je chyba u mna ale to tvoje riesenie mi neide stale pise 0 ta podmienka v cykle sa vzdy vyhodnoti ako nespravna.

Užívateľov profilový obrázok
kami_sama
Používateľ
Používateľ
Príspevky: 445
Dátum registrácie: Po 05. Sep, 2005, 20:00
Bydlisko: Bratislava
Kontaktovať užívateľa:

Re: c atoi

Príspevok od užívateľa kami_sama » Št 14. Júl, 2011, 23:45

napis hodnoty, co si tam nahadzal. ked si tam dal 1, 2, ... a nie '1', '2', ..., tak samozrejme fungovat nebude.

Užívateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: c atoi

Príspevok od užívateľa marko365 » Pi 15. Júl, 2011, 11:41

Uz tomu rozumiem dik

Napísať odpoveď

Návrat na "Programovanie"