În vederea asigurării unei transmiteri cât mai exacte a informaţiilor pe reţea, transmiterea se efectuează caracter cu caracter, fiecare caracter fiind dat prin codul său ASCII, adică o grupă de 8
biţi (octet). Pentru fiecare 8
biţi transmişi se calculează un bit de paritate care are valoarea 0
(dacă codul ASCII al caracterului conţine un număr par de cifre binare 1
) sau 1
(în caz contrar). Deoarece în problema noastră se transmit numai caractere ASCII standard, cu codul ASCII din intervalul [32,127]
, codul lor ASCII are bitul 7
(primul bit din stânga) egal cu 0
. Pe această poziţie va fi pus bitul de paritate, economisind astfel câte un bit pentru fiecare caracter transmis.
De exemplu, dacă mesajul care trebuie transmis conţine caracterele Paritate
, succesiunea de biţi transmisă va fi:
01010000 11100001 01110010 01101001 01110100 11100001 01110100 01100101
În plus, pe lângă caracterele amintite, în mesaj mai poate să apară un caracterul special, caracter care indică trecerea la începutul unui nou rând. Acest caracter are codul ASCII 10.
Cerința
Să se scrie un program care să verifice dacă un text a fost sau nu transmis corect.
Date de intrare
Fişierul de intrare paritate.in are pe prima linie o succesiune de caractere 0
şi 1
care reprezintă mesajul transmis. Între caractere nu există spaţii. Linia se termină cu caracterul marcaj de sfârşit de linie (newline).
Date de ieșire
Fişierul de ieşire paritate.out are pe prima linie mesajul DA
dacă textul a fost transmis corect sau NU
în caz contrar. În cazul în care mesajul de pe prima linie este DA
liniile următoare vor conţine textul transmis în clar. În cazul în care mesajul de pe prima linie este NU
linia următoare va conţine numerele de ordine ale caracterelor care nu au fost transmise corect, în ordine strict crescătoare, separate prin câte un spaţiu.
Restricții și precizări
- Cei
8
biţi ai codului ASCII a unui caracter se numerotează de la0
la7
, de la dreapta la stânga, cel mai din stânga bit fiind bitul7
iar cel mai din dreapta bitul0
. - Textul transmis are cel mult
60.000
caractere. - Numărul de caractere
0
şi1
din prima linie a fişierului de intrare este multiplu de8
. - Codurile ASCII ale caracterelor din text aparţin mulţimii
{10, 32–127}
, codul10
însemnând trecerea la începutul unui rând nou. - Nici o linie din fişierul de ieşire nu va avea mai mult de
255
caractere.
Exemplu
paritate.in
0101000011100001011100100110100101110100111000010111010001100101
paritate.out
DA Paritate
Explicație
Toate codurile sunt corecte.
Exemplu 2:
paritate.in
1101000011100001111100100110100101110100111000010111010011100101
paritate.out
NU 0 2 7
Explicatie
Primul caracter a fost transmis ca succesiunea de biţi 11010000
ceea ce înseamnă că fără bitul de paritate ar fi trebuit să existe un număr impar de cifre 1
, ceea ce este fals. Deci caracterul nu a fost transmis corect. Acelaşi lucru se verifică şi pentru caracterele cu numerele de ordine 2
şi 7
.
Exemplu 3:
paritate.in
010000011111101001101001000010100110010100001010011010100110111101101001
paritate.out
DA Azi e joi
Explicatie
Toate codurile sunt corecte. În text există două caractere cu cod ASCII 10
.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema ParitateOJI:
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <cstdarg>
using namespace std;
ifstream in("paritate.in");
ofstream out("paritate.out");
//ofstream out("paritate.out");
char raj[60001];
int rong[60001];
int main()
{
char t,bin;
bool wrong=false;
int nr1,ctr=0;
int rongctr=0;
while(in)
{
nr1=0;
t=0;
in>>bin;
if(bin=='1') nr1++;
for(register int i=6;i>=0;i--)
{
in>>bin;
if(bin=='1')
{
nr1++;
t+=pow(2,i);
}
}
if(nr1%2)
{
wrong=true;
rong[rongctr]=ctr;
rongctr++;
}
if(!wrong)
{
raj[ctr]=t;
}
ctr++;
}
if(wrong)
{
out<<"NU\n";
for(register int i=0;i<=rongctr-1;i++)
{
out<<rong[i]<<" ";
}
}
else
{
out<<"DA\n";
for(register int i=0;i<=ctr-2;i++)
{
if(raj[i]==10)
{
out<<'\n';
}
else
{
out<<raj[i];
}
}
}
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #1575 ParitateOJI
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1575 ParitateOJI de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!