👤
a fost răspuns

[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?


LIMBAJUL C Danduse Un Fisier Sa Se Afiseze Pentru Fiecare Caracter Din Fisierul Respectiv Numarul De Biti 1 Conversia Codului ASCII In Baza 2 Se Numara Cati Bit class=
LIMBAJUL C Danduse Un Fisier Sa Se Afiseze Pentru Fiecare Caracter Din Fisierul Respectiv Numarul De Biti 1 Conversia Codului ASCII In Baza 2 Se Numara Cati Bit class=

Răspuns :

#include <iostream>
using namespace std;
char a='A';
int main()
{
    int contor=0;
    int ascii=a;
    cout<<ascii<<endl;

    while(ascii!=1) //bucla continua pana ascci =1
    {
        if(ascii%2==1)//daca are biti de 1
        {
            contor++; // ii numaram
        }
        ascii/=2; //reducem valoarea initiala
        if(ascii==1) //daca ultimul bit este 1
            contor++; //il numaram
    }
    cout<<"are "<<contor<<" de bit 1"; //afisam
    return 0;
}
Ok, problema e aceeași ca și dincolo :))) la transformarea din baza 10 în baza 2...
(ai acolo un 97, dar cred că era 7 :))) )
În loc de asta:

for (i = 97; i >= 0; i--) {
binaryArray[i] = deci % 2; // Conversia in baza 2
deci = deci / 2;
}

Faci așa:
for(i=0;i<8;i++)binaryArray[i]=0;
for (i = 7; i >= 0 && deci; i--) {
binaryArray[i] = deci % 2; // Conversia in baza 2
deci = deci / 2;
}

Deci scrii în vector 0-uri, apoi faci ce făceai tu, doar că mai pui o condiție ca deci să fie diferit de 0


Deci program final:

#include <stdio.h>
#include <stdlib.h>

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 = 0; i < 8;i++)binaryArray[i]=0;
    for (i = 7; i >= 0 && deci; 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);
}