[LIMBAJUL C]
Dandu-se un fisier, sa se afiseze pentru fiecare caracter din fisierul respectiv numarul de biti 1 (conversia codului ASCII in baza 2, se numara cati biti de 1 are fiecare astfel de cod ASCII).
Exemplu: Daca in fisier se afla textul "A E" se va afisa:
3
1
4
Deoarece "A" are 3 biti de 1, SPACE are 1 bit de 1, E are 4 biti de 1.
Codul nu compileaza ("Bus error").
#include
#include
unsigned int count(unsigned int binaryCode[], unsigned int start, unsigned int stop) {
if (start == stop) {
if (binaryCode[start] == 1) {
return 1;
} else {
return 0;
}
}
return count(binaryCode, start, (start + stop) / 2) + count(binaryCode, (start + stop) / 2 + 1, stop);
}
unsigned int compute(char ch) {
unsigned int deci = (unsigned int) ch; // codul ASCII pentru fiecare caracter
unsigned int binaryArray[8]; // codul bina pentru caracterul de mai sus
unsigned int i;
for (i = 97; i >= 0; i--) {
binaryArray[i] = deci % 2; // Conversia in baza 2
deci = deci / 2;
}
return count(binaryArray, 0, 7);
}
int main(int argc, char** argv) {
FILE * fisier = fopen("testfile", "r");
int size = 0; // va stoca numarul de caractere din fisier
char ch; //auxiliar, va citi fisierul pentru a deplasa cursorul pana la capat
int lastPosition; // se va tine dupa cursor
// cand cursorul nu mai inainteaza, se iese din bucla si vom obtine numarul de caractere
while (1) {
fscanf(fisier, "%c", &ch);
if (lastPosition == ftell(fisier)) break;
lastPosition = ftell(fisier);
}
size = ftell(fisier) - 1;
// printf("\n%d", size); // OK! Merge!
fseek(fisier, 0, 0); // mut cursorul inapot pe prima pozitie
char vector[size + 1]; // vectorul asta va stoca toate caracterele din fisier pe cate o pozitie
unsigned int bitCount[size]; // asta va retine pentru fiecare pozitie corespunzatoare vectorului de mai sus numarul de biti de 1
// vector are dimensiuea size + 1 pentru ca si terminatorul de sir va ocupa o pozitie
int i;
for (i = 0; i < size; i++) {
fscanf(fisier, "%c", &vector[i]); // de aici incep sa citesc fiecare caracter
bitCount[i] = compute(vector[i]); // fiecarui caracter ii va corespunde un bitCount[i]
printf("\n%u", bitCount[i]);
}
return (EXIT_SUCCESS);
}
Vectorul care retine codul binar al fiecarui element are 8 pozitii (preferinta personala).
Idei de ce nu merge?

