In vederea asigurarii unei transmiteri cat mai exacte a informatiilor pe retea, transmiterea se efectueaza caracter cu caracter, fiecare caracter fiind dat prin codul sau ASCII, adica o grupa de 8 biti (octet). Pentru fiecare 8 biti transmisi se calculeaza un bit de paritate care are valoarea 0 (daca codul ASCII al caracterului contine un numar par de cifre binare 1) sau 1 (in caz contrar). Deoarece in problema noastra se transmit numai caractere ASCII standard, cu codul ASCII din intervalul [32,127], codul lor ASCII are bitul 7 (primul bit din stanga) egal cu 0. Pe aceasta pozitie va fi pus bitul de paritate, economisind astfel cate un bit pentru fiecare caracter transmis. De exemplu, daca mesajul care trebuie trasmis contine caracterele "Paritate", succesiunea de biti transmisa va fi:
01010000 11100001 01110010 01101001 01110100 11100001 01110100 01100101
In plus, pe langa caracterele amintite, in mesaj mai poate sa apara un caracterul special, caracter care indica trecerea la inceputul unui nou rand. Acest caracter are codul ASCII 10.
Cerinta
Sa se scrie un program care sa verifice daca un text a fost sau nu transmis corect.
Date de intrare
Fisierul de intrare paritate.in are pe prima linie o succesiune de caractere '0' si '1' care reprezinta mesajul transmis. Intre caractere nu exista spatii. Linia se termina cu caracterul marcaj de sfarsit de linie (newline).
Date de iesire
Fisierul de iesire paritate.out are pe prima linie mesajul DA daca textul a fost transmis corect sau NU in caz contrar. In cazul in care mesajul de pe prima linie este DA liniile urmatoare vor contine textul transmis in clar. In cazul in care mesajul de pe prima linie este NU linia urmatoare va contine numerele de ordine ale caracterelor care nu au fost transmise corect, in ordine strict crescatoare, separate prin cate un spatiu.
Restrictii
Cei 8 biti ai codului ASCII a unui caracter se numeroteaza de la 0 la 7, de la dreapta la stanga, cel mai din stanga bit fiind bitul 7 iar cel mai din dreapta bitul 0.
Textul transmis are cel mult 60000 caractere.
Numarul de caractere '0' si '1' din prima linie a fisierului de intrare este multiplu de 8.
Codurile ASCII ale caracterelor din text apartin multimii {10, 32-127}, codul 10 insemnand trecerea la inceputul unui rand nou.
Nici o linie din fisierul de iesire nu va avea mai mult de 255 caractere.
Caracterele din text sunt numerotate incepand de la 0.
Mesajele DA/NU din prima linie a fisierului de iesire se scriu cu majuscule.
In Pascal va rog!
Răspunsuri la întrebare
Răspuns de
3
#include <stdio.h>
#define MAX 60000
using namespace std;
char a[MAX]; //0: eroare; Caracter: corect
char c;
long i, j;
int BitP, Cod, Bit, Nr1;
long Eroare; //va contine ultima pozitie
//a unui cod eronat sau 0 daca nu sunt erori
FILE *f, *g;
int main()
{
f=fopen("paritate.in", "rt");
g=fopen("paritate.out", "wt");
i=-1; Eroare=0; c=0;
fscanf(f, "%c", &c);
while (c!='\n')
{
i++; //pozitie caracter
BitP=c-'0'; //bitul de paritate
Cod=0; //aici formez codul
Nr1=0; //cati de 1
for (j=1; j<=7; j++) //citesc ceilalti 7 biti
{
fscanf(f, "%c", &c); //citesc bit
Bit=c-'0';
if (Bit==1) Nr1++; //daca e 1 il numar
Cod=Cod*2+Bit; //formez codul
}
if ((Nr1+BitP)%2==0) //daca cod corect
a[i]=Cod; //pun caracterul in vector
else //altfel
{
a[i]=1; //pun 1
Eroare=i; //si retin pozitia
}
fscanf(f, "%c", &c);
}
if (Eroare==0) //daca nu sunt erori
{ //scrie DA si
fprintf(g, "DA\n");
for (j=0; j<=i; j++) //afiseaza cele i+1 caractere
if (a[j]==10) //avand grija la caracterul cu codul 10
fprintf(g, "\n");
else //altfel
fprintf(g, "%c", a[j]); //scrie caracterul
// fprintf(g, "\n");
}
else //eroare!!!
{
fprintf(g, "NU\n"); //scrie NU si
for (j=0; j<Eroare; j++)
if (a[j]==1) //cauta erorile - cod 01
fprintf(g, "%ld ", j); //si afiseaza pozitia lor
fprintf(g, "%ld\n", Eroare); //afiseaza pozitia ultimei erori
}
fclose(g);
return 0;
}
#define MAX 60000
using namespace std;
char a[MAX]; //0: eroare; Caracter: corect
char c;
long i, j;
int BitP, Cod, Bit, Nr1;
long Eroare; //va contine ultima pozitie
//a unui cod eronat sau 0 daca nu sunt erori
FILE *f, *g;
int main()
{
f=fopen("paritate.in", "rt");
g=fopen("paritate.out", "wt");
i=-1; Eroare=0; c=0;
fscanf(f, "%c", &c);
while (c!='\n')
{
i++; //pozitie caracter
BitP=c-'0'; //bitul de paritate
Cod=0; //aici formez codul
Nr1=0; //cati de 1
for (j=1; j<=7; j++) //citesc ceilalti 7 biti
{
fscanf(f, "%c", &c); //citesc bit
Bit=c-'0';
if (Bit==1) Nr1++; //daca e 1 il numar
Cod=Cod*2+Bit; //formez codul
}
if ((Nr1+BitP)%2==0) //daca cod corect
a[i]=Cod; //pun caracterul in vector
else //altfel
{
a[i]=1; //pun 1
Eroare=i; //si retin pozitia
}
fscanf(f, "%c", &c);
}
if (Eroare==0) //daca nu sunt erori
{ //scrie DA si
fprintf(g, "DA\n");
for (j=0; j<=i; j++) //afiseaza cele i+1 caractere
if (a[j]==10) //avand grija la caracterul cu codul 10
fprintf(g, "\n");
else //altfel
fprintf(g, "%c", a[j]); //scrie caracterul
// fprintf(g, "\n");
}
else //eroare!!!
{
fprintf(g, "NU\n"); //scrie NU si
for (j=0; j<Eroare; j++)
if (a[j]==1) //cauta erorile - cod 01
fprintf(g, "%ld ", j); //si afiseaza pozitia lor
fprintf(g, "%ld\n", Eroare); //afiseaza pozitia ultimei erori
}
fclose(g);
return 0;
}
Alte întrebări interesante
Matematică,
8 ani în urmă
Matematică,
8 ani în urmă
Matematică,
8 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă