[ kallafcb @ 14.10.2012. 14:16 ] @
Naime, potrebno je da konvertujem fajl koji je sacinjen od niza binarnih brojava, u fajl koji je sacinjen od konvertovanih tih binarnih brojeva u decimalne brojeve.
Binarni fajl izgleda : 01010010,01001001,01000110,01000110,11110110,11001111,00100000 , samo sto je ukupan broj ovakvih elemenata u fajla oko sto hiljada.
E sad potreban mi je izlazni fajl koji kad se izvrsi konverzija izgleda ovako: 82,73,70,70,246,207,32.
Znaci svaki ovaj 8-bitni broj kad se konvertuje treba da se kao decimalna vrednost upise u izlazni fajl. Tj. drugi binarni broj 01001001 treba da se upise u izlaznom fajlu kao drugi broj 73.
Moj kod preko kojeg sam pokusao ovo da izvedem je bio :
Code:

#include <stdio.h>
#include <string.h>

int main()
{
    
    FILE* izlaz;
    int i,br=0,b;

    int binary, digit, base = 1;
    int decimal=0;
    
    
    int niz2[]={11010010,11000110};
    izlaz=fopen("out2.h","w");
   
    for(i=0;i<2;i++)
    {

            while(br<8)
            {
                br++;

                digit = niz2[i] % 10;

                decimal += digit * base;

                base = base*2;
               niz2[i] /= 10;

            }
            br=0;
            fprintf(izlaz,"%d%c",decimal,',');
       

    }

}


Da li neko ima resenje, ili drugi kod za moj problem?
Hvala unapred.


[Ovu poruku je menjao X Files dana 14.10.2012. u 16:36 GMT+1]
[ X Files @ 14.10.2012. 15:55 ] @
Najmanji problem je uraditi funkciju i kod za konverziju serije binarnih u dekadne brojeve, i sve to spakovati u neki fajl.

Kod ovakvih zadataka, veće je pitanje preciziranje izgleda ulaznog fajla. Na primer:
- da li su brojevi uvek 8-bitni?
- da li su uvek vodeće nule ispred binarnog broja?
- da li je separator uvek zarez?
- da li se u fajlu mogu očekivati blankovi ispred/iza zareza ili još ponegde?
- šta raditi ako se naiđe na odstupanje od pravila?

Što je ulazni fajl liberalnije definisan, kod će biti sporiji (mada je to na svim modernim računarima skoro neprimetno), ali verovatno bolje ocenjen ako se radi o nekom školskom zadatku. Ako ulazne fajlove generiše neki drugi automatski sistem i strogo su definisani, onda se pravi kod koji 100% odgovara definiciji ulaznog fajla.

Zatim, pitanja vezana za interfejs..
- konzolni ili forms program
- da li ulazni i izlazni fajl da budu definisani kroz argumente komandne linije
- itd


[ plague @ 14.10.2012. 15:57 ] @
Izgleda da ti je X Files resio deo problema (falili su indexi kod niz2). Zaboravio si jos da resetujes "base" kada zavrsi while() petlja/ili ulazi u for().
Mozda bi bilo bolje i da promenis while() uslov u
Code:
while(niz2[i] > 0)
jer ovako izmenjeno radi i sa promenljivim brojem cifara, a i brze se zavrsava ako je broj npr: 00000111.

Edit: mislim da ce biti problem ako pocinje 0, to je valjda oznaka za Octalni broj. Ovo se odnosi na ovako napisan primer gde si direktno ubacivao int-ove u niz.
[ kallafcb @ 14.10.2012. 16:08 ] @
Prepravio sam while uslov kao sto ste rekli i stavio sam base=1 i decimal =0, ali kao sto je i napomenuto, kolko vidim pogresno radi kada binarni broj pocinje sa 0.
Kako bih jos mogao i taj problem da otklonim?
Inace binarni brojevi su uvek 8-bitni, odvojeni zarezom. Neki pocinju sa 0 neki sa 1 , zavisi od vrednosti samog broja.


Hvala na brzom odgovoru.
[ kallafcb @ 14.10.2012. 16:21 ] @
@plague
Na sta tacno mislis kad kazes da su falili indexi kod niz2?
[ plague @ 14.10.2012. 17:20 ] @
Pisalo je
Code:
niz2 /= 10
umesto
Code:
niz2[i] /= 10

Pogresno radi jer tumaci broj koji pocinje sa 0 kao oktalni (baza 8).
Moze se prevazici na vise nacina:
- Ako planiras da procitas prvo ceo file i smestis u niz stringova svaki od brojeva, mogao bi da castujes taj string u int cime bi suvisne nule izbacio i zavrsio sa nizom integera. Dalje bi te brojeve delio sa 10...
- Mozes sve u jednom prolazu citajuci karakter po karakter (ako je uvek isti format i uvek ima 8 cifara po broju) tako sto ces ici od najveceg stepena ka manjem (od 27 do 20) sve dok ne naidjes na "," sto je znak da prelazis na novi broj, resetujes "base" i upisujes stari.
- itd.
[ X Files @ 14.10.2012. 18:03 ] @
Citat:
plague: Pisalo je
Code:
niz2 /= 10
umesto
Code:
niz2[i] /= 10

Ovo je verovatno jer kod nije bio stavljen unutar CODE sekcije, pa je protumaceno kao ITALIC.
[ aleksandar1519 @ 18.10.2012. 00:18 ] @
Ukoliko znas da je svaki binarni broj 8 bitova (npr 00000011) i da se koristi zarez izmedju njih da ih rastavi, ne bi trebao da imas problema.
Znaci, prvo nadji broj zareza u datom fajlu, onda procitaj toliko binarnih brojeva +1 (za svaki po 8 bita) koje ces da prebacis u decimalne.
Sve razmake i ostale eventualne karaktere koje ne zelis moze lako da eliminises kad citas binarne brojeve.

POzdrav
[ Rapaic Rajko @ 19.10.2012. 08:32 ] @
A ovako nesto:

Code:

            while(br < 8)
            {
                digit = niz2[i] % 10;

                if (digit) 
                  decimal |=  1 << br++;

                niz2[i] /= 10;

            }


Ako sam negde omasio sintaksu, ne zamerite, ne koristim svakodnevno C...

Pozz
[ aleksandar1519 @ 19.10.2012. 15:08 ] @
Ne bas, ja sam sve to malo drugacije mislio. 2 funkcije, 1 da cita broj zareza (+1), npr int brj_zareza, toliko znaci imas 8bit brojeva.
Potom taj broj zareza, brj_zareza, posaljes 2. funkciji koja otvara zeljeni "file" i citas te 8bit binarne brojeve brj_zareza puta i stavljas u
array. Funkcija takodje sluzi za pretvaranje bin u dec. I ako zelis, zapises odgovore u taj neki novi fajl. E sada, svaki binarni broj citas
posebno kao karakter (fgetc) i, ako je procitani karakter nesto sto nije 1 ili 0, preskocis ga. Za pretvaranje bin u dec mozes da koristis vec navedene
sugestije, ili, jos jednostavnije, ako imas 8 bitova, tj 1,2,4,8.16,32,64,128 samo pomnozis sa 1 ili 0 i saberes posle sve. To je ako radis "peske"
bez ikakvih dodatnih funkcija itd.

Izvini, sad sam video da su ti brojevi vec u nizu? Ili sam pogresno razumeo? Ako imas 100 000 binarnih brojeva, bolje ti je da uradis kao sto sam rekao, da te binarne brojeve stavis u neki text file i onda ih citas i pretvaras u decimalne, jedan po jedan, pises u neki drugi file, opet citas itd itd..

[Ovu poruku je menjao aleksandar1519 dana 19.10.2012. u 16:40 GMT+1]