RSS

Category Archives: C2_3 Limbajul C/C++ – avansat

Matrici. Caractere. Siruri de caractere. Functii

Numere mari

sursa: http://ler.is.edu.ro/~cex_is/Informatica/pregatire.html

Numere mari

Necesitatea

In momentul cand unei variabile i se stabileste un tip intreg, limitam valorile pe care le poate avea variabila, la tipul folosit.

Name Description Size* Range*
Char Character or small integer. 1byte signed: -128 to 127
unsigned: 0 to 255
short int (short) Short Integer. 2bytes signed: -32768 to 32767
unsigned: 0 to 65535
int Integer. 4bytes signed: -2147483648 to 2147483647
unsigned: 0 to 4294967295
long int (long) Long integer. 4bytes signed: -2147483648 to 2147483647
unsigned: 0 to 4294967295

 

Ce facem insa daca avem nevoie de numere intregi mai mari decat tipurile existente?

Putem reprezenta numarul intreg ca un vector ce contine sirul de cifre ale numarului.

x=40375 Vectorul asociat va fi

5 7 3 0 4

 

Dupa cum observati, in vector, numarul este scris in ordine inversa, astfel incat sa putem efectua cu usurinta operatiile aritmetice.

Declararea tipului corespunzator unui numar mare poate fi:

Typedef int nrmare[1000];

Citirea unui numar mare.

Putem realiza citirea unui numar mare intr-un sir de caractere pe care il vom transforma in vector de cifre.

void citire(nrmare v, int n)

{int I; char sir[100];

fin.get(sir,100); n=strlen(sir); //sir de caractere

for (i=n-1; i>0;i–) v[n-i-1]=(int) (sir[i]-‘0’); //convertesc caracterul cifra in cifra… numerica

}

Afisarea unui numar mare

void afisare(nrmare v, int n)

{int i;

for(i=n-1;i>0;i–) cout<<v[i];

}

Adunarea a doua numere mari

Presupunem ca avem 2 vectori Asi B, reprezentand numere cu NA, respectiv NB cifre si calculam suma C, dintre A si B.Trebuie sa efectuam operatia de adunare, cifra cu cifra, avand grija de problema depasirii ordinului. De asemenea, trebuie avute in vedere situatiile:

  • Daca valorile nu au acelasi ordin va trebui sa completam numarul mai mic cu zerouri
  • Daca in urma adunarii obtinem depasire de ordin, va trebui sa mai adaugam o cifra la vectorul suma.

Void suma (nrmareA, nrmare B, nr mare C, int NA,int NB, int N)

{Int I, t;

If (NA<NB) {for(i=NA; i<nb; i++) A[i]=0; NA=NB;}

Else {for(i=NB; i<NB; i++) B[i]=0; NB=NA;}

N=NB;t=0;

For(i=0;i<N;i++) {t=A[i]+B[i]+t;C[i]=t %10; t=t/10;}

If(t>0) {N++;C[N-1]=t;}

}

Compararea a doua numere mari

Fie A (cu NA cifre) si B (cu NB cifre) doua numere mari. Vom realiza o functie care va stabili care dintre valorile A si B este mai mare. Functia va returna -1 daca A<B, 0 daca A=B si +1 daca A>B.

Intcompar(nrmare A, nrmare B, int NA, int NB)

{if (NA<NB) return -1; //B estemai mare

if (NB<NA) return +1; //A estemai mare

//suntempecazul NA=NB.

//Cautamceamaisemnificativadiferenta de cifre.

For(i=NA; i>=0 && A[i]==B[i]; i–);

If(i<=0) return 0 ; //numerelesuntidentice

If (A[i]<B[i]) return -1;

else return +1;

}

Diferenta a doua numere mari

Calculam diferenta D dintre A (cu NA cifre) si B  (cu NB cifre). Presupunem ca B este mai mic si are completate spatiile libere cu zerouri.

Void diferenta (nrmare A, nrmare B, nr mare &D, int NA, int NB, int&N)

{IntI,t=0;

For (i=0,i<NA; i++)

{D[i]=A[i]-B[i]+t;

If(D[i]<0) {D[i]=D[i]+10; t=-1;}

Else t=0;

}
while(i>=0 && D[i]==0) i–;

N=I+1;

}

Inmultirea cu un scalar

Fie un numar mare A (cu NA cifre) si un numar natural X. Trebuie sa realizam inmultirea numarului A cu X.

Void scalare(nrmare A, int NA, int X)

{intI,t;

t=0;

for(i=0;i<NA;i++) {t=A[i]*x+t; A[i]=t%10; t=t/10;}

//ramane sa completam cu cifrele lui t, in masura in care mai exista

While (t>0) {NA++; A[NA-1]=t%10; t=t/10;}

}

Inmultirea a doua numere mari

Fie A si B doua numere mari. Dorim sa realizam produsul P intre A si B. Practic este vorba de o inmultire succesiva a  numarului mare A cu salarul B[i]. De observat ca pozitia in care incepem sa completam P este tot i.

Void produs(nrmare A, nrmare B, nrmare P, int NA, int NB, int NP)

{int I, j, t;

For (i=0;i<NB;i++)

{//produsul intre A si scalarul B[i]

t=0;

for(j=0;j<NA;j++)

{t=t+A[j]*B[i]+p[i+j];

p[i+j]=t%10;

t=t/10;}

if (t>0) p[i+j]=t;

}

NP=NA+NB+1;

}

Impartirea a doua numere mari

Fie A (cu NA cifre) si B (cu NB cifre). Vrem sa realizam impartirea lui A la B. Folosim observatia conform careia impartirea este o scadere repetata.

 

Void impartire(nrmare&A, nrmare B, nrmare C, int&NA, int NB, int&NC)

{NrmareD;

IntNC,I,ND;

NC=0;ND=0;

For(i=0;i<900;i++) c[i]=0;

While (compar(A,B,NA,NB)>0)

{//fac diferenta si o memorez tot in A

Diferenta(A,B,D,NA,NB,ND);

For(i=0;i<ND;i++) A[i]=D[i];

//incrementez catul C

t=1;

For(i=0;t!=0;i++)

{t=t+c[i];

c[i]=t%10;

t=t/10;

}

NC=i+1;

}

Afisare(A,NA);

Afisare(C,NC);

}

 

Problemepropuse:

  1. http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=438
  1. http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=74
  1. http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=258
  1. http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=432
  1. http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=500
 
 

Coada

Coada

Definitie

Coada este o structura la care adaugarea elementelor se realizeaza la sfarsit (PUSH) iar eliminarea unui element se realizeaza de la inceput.

OBS: conform definitiei se pate afirma ca o coada este de tip FIFO (first input, first output = primul venit, primul servit). Evident, modelul unui sir la un ghiseu este cea mai nimerita reprezentare pentru o coada.

Implementare 1

Ca si la stiva, putem folosi vectorul in reprezentarea unei cozi.

Declarare:

int C[100], sc;  //sc este sfarsitul cozii

Coada vida

sc=0; //nu exista nici un element in coada

PUSH – adaugarea unui element (la sfarsit)

sc++; cin>>c[sc]; //facem loc unui noi valori si citim valoarea dorita

POP – eliminarea primului element

Urmand modelul real (al unei cozi la un ghiseu), toate elementele, incepand cu pozitia a 2-a, vor fi mutate la stanga. Coada va avea acum un element in minus.

for(I=2;i<=sc;i++) c[I-1]=c[I];

sc–;

Practic, oricare operatie tip POP este de complexitate N (numarul de elemente din coada), ceea ce este destul de mult. O alternativa ar fi sa nu respectam modelul real, in care se muta cei care stau la rand, ci sa il punem pe functionar sa se miste cu biroul lui.

Avem nevoie de un indice IC care sa arate cine este persoana/elementul din fata functionarului.

Implementare 2

Declarare:

int C[100], sc, ic;  //sc este sfarsitul cozii; ic este inceputul cozii

Coada vida

Initial: sc=0; ic =0//nu exista nici un element in coada

Pe parcurs coada va fi vida cand ic>sc

PUSH – adaugarea unui element (la sfarsit)

if(sc==0) ic++; //marchez inceputul cozii
sc++; cin>>c[sc]; //facem loc unui noi valori si citim valoarea dorita

POP – eliminarea primului element

Eliminarea primului element se reduce la deplasarea inceputului cozii la dreapta.

if(ic<=sc) ic++;

Se observa ca operatia se rezolva intr-un pas, nu in N ca in cazul anterior

 

Ciurul lui Eratostene – sirul numerelor prime

Definitii

  • Un numar se numeste prim daca nu are alti divizori in afara de el si 1.
  • Un numar prim are 2 divizori.
  • Un numar neprim se numeste divizibil.

Problema 1. Sa se determine numerele prime pana la N.

Problema 2. Sa se determine primele N numere prime.

Evident exista si alte probleme ce necesita lucrul cu mai multe valori prime (descompunerea in factori primi, … ).

De aceasta problema, a determinarii primelor numere prime, s-a ocupat si Eratostene, cel care a dat si metoda care ii poarta numele: ciurul lui Eratostene. El a realizat o matrice 10*10 in care a marcat numerele pana la 100. Apoi a luat, pe rand, fiecare valoare (nemarcata) incepand cu 2 si a marcat (sters) multiplii ei. Au ramas nemarcate tocmai numerele prime pentru ca, asa cum spune definitia lor, nu au nici un divizor.

Din punct de vedere al optimizarii procesuli de calcul, putem determina mai usor sirul numerelor prime pana la N decat sa cercetam fiecare valoare in parte daca este prima sau nu.

METODA 1

Daca incercam implementarea algoritmul lui Eratostene (numerele prime pana la 100), rezolvam practic problema 1. Fiecare valoare C[I] din vector va avea valoarea 1 (daca I este prim), respectiv 0 daca I este divizibil.

int C[100], N, I, J;

cin>>N;

for(I=1;I<=N; I++) C[I] =1;

for (I=2;i<=N;I++)

    if(C[I] == 1) // I este prim => multiplii pana la N vor fi zero

         for(J=2;J*I <= N;J ++)  C[I*J] = 0;

//afisarea numerelor prime

for(I=1;I<=N; I++)

    if(C[I] ==1) cout <<I<< “este prim”<<endl;

Gratie vectorului generat, putem afirma intr-un singur pas daca o valoare X este numar prim sau nu: C[X]==1 ?

METODA 2

S-ar putea ca o problema sa doreasca numai numerele prime, ca in cazul descompunerii in factori primi sau a problemei 2.

O metoda de a construi un vector format numai din numere prime (evident in ordine crescatoare) ar putea fi urmatoarea. Algoritmul porneste de la observatia ca daca un numar nu are divizori printre numerele prime mai mici decat el, atunci este un numar prim.

int C[100], NC, I, J;

//2 este primul numar prim

C[1]=2; NC=1; cin >>N;

for(I=3; NC<N; I=I+2) //merg doar pe numere impare

{//caut divizori pentru I

for(J=1;J<=NC && I % C[J]!=0 ;J++);

if(J>NC) //nu s-a gasit divizor=> I este prim si il adaug la sfarsitul vectorului

{NC++; C[NC]=I;}

}

//ies cand NC==N

//afisez primele N numere prime

for(I=1;I<=N;I++) cout<<C[I]<<” “;

 
 

Tags:

Tablouri. Vectori

Pana in acest moment sunteti obisnuiti cu ideea “1 variabila reprezinta 1 valoare” si probabil, la sirurile de valori sau la lucrul cu fisiere s-a simtit nevoia memorarii simultane a mai multor valori.

De acest aspect se ocupa TABLOURILE. Un tablou este un sir de valori de acelasi tip, aflate in locatii consecutive de memorie.

Tablourile pot fi :

  • vectori( tablouri unidimensionale): siruri obisnuite de valori
  • matrici (tablouri bidimensionale): un orar, o tabla de sah plina cu numere, …
  • multidimensionale (nu studiem in liceu)

Vectori

Declararea:

tip numevector [numar_maxim_de_elemente];

Exemplu:

int  V[100];
int  I, N;
 

OBSERVATII:

  • S-a declarat un vector V cu maxim 100 de elemente, fiecare element fiind de tip intreg.
  • Asa cum banuiti, s-a rezervat spatiu pentru MAXIM 100 de elemente si nu e obligatoriu sa le folositi pe toate. De aceea este necesara si variabila N care sa memoreze numarul efectiv de elemente ale vectorului.
  • elementele vectorului se pot referi prin V[0], V[1], V[2], …. ; Pentru operatii asupra fiecarui element vom avea nevoie variabila I  care sa parcurga elementele V[i]

Reprezentarea in memorie. Parcurgerea vectorilor

V[0] V[1] V[2] V[3] …. V[N-2] V[N-1] SPATIU NEOCUPAT

Implicit, prima pozitie dintr-un vector este V[0]. De vreme ce vectorul are N elemente, deducem ca ultimul element este V[N-1].  A trece prin elementele vectorului presupune parcurgerea tuturor celor N elemente , de la V[0] la V[N-1] .

for(I=0;I<N;I++)
      prel V[I];

Pentru ca numararea de la 0 la N-1 poate fi incomoda, puteti ignora pozitia V[0].

for(I=1;I<=N;I++)
      prel V[I];

Trebuie sa aveti grija la numarul de elemente. Daca problema spune ca “vectorul are maxim 100 de elemente” declararea normala ar fi int V[100];, gandind ca avem valori de la V[0] la V[99]. Daca folositi numararea de la 1, practic aveti numai 99 de locatii de memorie disponibile pentru cele 100 de valori. In acest caz declararea corecta ar fi  int V[101];.

Citirea vectorilor

Citirea unui vector presupune stabilirea unei valori de pornire pentru fiecare din cele N valori din vector: V[1], V[2], …. V[N].

for(I=1;I<=N;I++)
      cin>>V[i];
 

Afisarea vectorilor

Afisarea unui vector presupune tiparirea in ecran a fiecarei din cele N valori din vector: V[1], V[2], …. V[N]. Pentru a nu se lipi valorile, dupa fiecare V[i] am afisat si o virgula si un spatiu.

for(I=1;I<=N;I++)
      cout<<V[i]<<“, “;
 

Probleme – parcurgeri.

Fie V un vector cu N valori intregi.

  1. Sa se numere cate valori sunt pare/impare.
  2. Sa se numere cate valori sunt pozitive, negative, nule.
  3. Sa se stabileasca daca o valoare X se regaseste in vector sau nu.
  4. Sa se numere de cate ori apare valoarea X in vector.
  5. Sa se determine valorile minima si maxima din vector
  6. Sa se determine in mod optim (cu numar minim de pasi) valoarea maxima si de cate ori apare in vector.
  7. Sa se rearanjeze elementele lui V astfel incat, la afisare, elementele sa apara in oglinda (2, 5, 3, 6 => 6, 3, 5, 2)

Probleme – modificarea structurii unui vector

  1. Sa se adauge un nou element X la sfarsitul vectorului.
  2. Sa se insereze un nou element X in pozitia K, restul elementelor ramanand in aceeasi ordine. (Exemplu. Elevii clasei dvs se duc la film si ocupa un rand intreg, incepand cu locul 1. In sfarsit apareti si dvs si, din diverse motive doriti sa va asezati pe locul K. In afara de aceasta, nu este permisa modificarea ordinii initiale.)
  3. Sa se stearga elementul din pozitia K a vectorului. (Din cauza intarzierii sunteti intampinat cu ostilitate si va horarati sa plecati. Dupa eliberarea locului, colegii se restrang in forma initiala)

Probleme – vectorii ca multimi

  1. Sa se verifice daca V poate reprezenta o multime (elementele vectorului trebuie sa fie distincte – diferite oricare doua)
  2. Fie A si B doi vectori cu NA si NB elemente, reprezentand doua multimi. Sa se creeze un vector C (NC elemente) in care sa se memoreze elementele intersectiei C= “A intersectat cu B” (elementele comune celor doua multimi A si B).
  3. Fie A si B doi vectori cu NA si NB elemente, reprezentand doua multimi. Sa se creeze un vector C (NC elemente) in care sa se memoreze elementele diferentei C= “A – B” (elementele din A, care nu apar in B)
  4. Fie A si B doi vectori cu NA si NB elemente, reprezentand doua multimi. Sa se creeze un vector C (NC elemente) in care sa se memoreze elementele reuniunii C= “A reunit cu B” (elementele comune si necomune a celor doua multimi A si B, luate o singura data)
 
 

Tags:

Fisiere – prelucrarea valorilor

Despre preluarea datelor dintr-un fisier, o problema ne poate anunta ca avem

  • un numar determinat de valori: “Se citesc dintr-un fisier o valoare N si apoi N valori de tip…”
  • un numar nedeterminat de valori: “Fisierul contine un maxim 10000 de valori de tip… “

Prelucrarea unui numar determinat de valori

Evident, intai trebuie citita valoarea N si apoi, pe rand fiecare valoare din fisier, de exact N ori. Imediat dupa citire, valoarea citita poate fi prelucrata.

fin>>N;
for(I=1;I<=N;I++)
{fin>>X;
PREL X;}

Pe acest sablon se pot lucra toate problemele de la siruri de valori:

  • numarul de valori pare/impare din sir
  • de cate ori apare in sir o valoare data Y?
  • care este valoarea maxima/minima din sir?
  • cate valori din sir au o proprietate anume (numar prim, palindrom, …)

Prelucrarea unui numar nedeterminat de valori

In cazul unui sir nedeterminat de valori, problema este ca nu stim cand anume ne oprim din citit si prelucrat. Pentru aceasta, C/C++ ne vine in intampinare cu doua posibilitati de a rezolva situatia.

Varianta 1

while (fin>>X) PREL X;

Asa cum stim, instructiunea WHILE cicleaza conform rezultatului unei conditii. In acest caz, se incearca citirea din fisier a valorii X. Daca instructiunea se executa cu succes, se returneaza valoarea 1 (ADEVARAT) si putem prelucra valoarea citita. Daca citirea din fisier nu se poate realiza, se va returna valoarea 0 (FALS).

Cu aceasta situatie ne-am mai intalnit la situatii de genul

A=7;
if (A=5) cout <<” este 5″; else cout<<“nu este 5”;
 

Rezultatul acestui cod este intotdeauna “este 5“. Care este motivul? Asa cum vedeti , la intrarea in test variabila A are valoarea 7. In test A primeste valoarea 5; Instructiunea se executa corect (A poate primi valoarea 5) si sistemul returneaza valoarea 1, pentru executie corecta; In consecinta. instructiunea care se executa este cout <<” este 5″. Corect ar fi fost sa se scrie:

A=7;
if (A==5) cout <<” este 5″; else cout<<“nu este 5”;
 

Varianta 2

Aceasta varianta foloseste o functie atasata variabilelor tip fisier de intrare, functia EOF (End Of File = Sfarsit De Fisier) Aceasta functie verifica daca mai exista valori pana la sfarsitul fisierului.

  • fin.eof() are valoarea 1 daca pana la sfarsitul fisierului nu mai exista nici o valoare
  • fin.eof() are valoarea 0 daca pana la sfarsitul fisierului mai exista valori
//cat timp nu este sfarsitul fisierului….
while (! fin.eof() )
{ fin>>x;
PREL X;}
 

Probleme propuse:

  • numarul de valori pare/impare din sir
  • de cate ori apare in sir o valoare data Y?
  • care este valoarea maxima/minima din sir?
  • cate valori din sir au o proprietate anume (numar prim, palindrom, …)
  • numarul de schimbari de semn din sir
  • numarul de schimbari de paritate (par-impar si impar=par)
  • numarul de “vai” si “dealuri” (o vale este o succesiune de tipul 7-3-5; un deal este o sucesiune de tipul 3-7-5)
  • lungimea maxima a unui subsir crescator
  • lungimea maxima a unui subsir de valori cu aceeasi paritate
 
 

Tags:

Fisiere

Introducere

Asa cum stim deja, ca pe baza unor date de intrare, algoritmul (acum sub forma unui program C/C++) realizeaza calculele necesare si trebuie sa ne ofere niste date de iesire (rezultatele asteptate sau un mesaj lamuritor).

Date de intrare-> Program-> Date de iesire

Datele de intrare se introduc manual, de la tastatura si se afiseaza pe ecran (in consecinta, se pierd).

Folosirea fisierelor propune reutilizarea rezultatelor intre programe. Practic, datele de iesire ale unui program (rezultatele ) pot fi date de intrare pentru alt program. Din aceasta perspectiva, modelul ar trebui schimbat putin .

Fisier de intrare-> Program-> Fisier de iesire

Pentru a accesa fisierul de intrare sau de iesire avem nevoie de cate o variabila tip fisier. De asemenea trebuie specificat modul de acces la fisire (pentru citire sau afisare) si faptul ca fisierul trebuie sa fie deschis in vederea realizarii citirii/afisarii sau inchis.

OBS: Folosirea fisierelor presupune utilizarea bibliotecii FSTREAM. De aceea din codul dvs nu trebuie sa lipseasca, in sectiunea INCLUDE , urmatoarea linie:

#include <fstream>

Declararea variabilelor fisier.

ifstream fin(“date.in”);

  • s-a declarat o variabila pe nume  fin de tip ifstream (INPUT FILE STREAM – flux de date de intrare) si s-a asociat cu fisierul fizic date.in.

ofstream fout(“date.out”);

  • s-a declarat o variabila pe nume  fout de tip ofstream (OUTPUT FILE STREAM – flux de date de iesire) si s-a asociat cu fisierul fizic date.out.

OBS: Fisierele de date trebuie sa se gaseasca in acelasi folder cu fisierul CPP; daca fisierul de date se gaseste in alt folder, trebuie adaugata calea completa pana la fisier.

ifstream fin(“C:\Users\Mihai\Documents\date.in”);

Operatii de intrare/iesire

Citirea din fisier

  • fin>>var1>>var2;
  • se citesc rand pe rand valorile din fisier  si se atribuie variabilelor din lista;
  • se citesc in ordinea normala, ignorandu-se ideea de rand nou (ENTER), ca si cum datele ar curge (stream = flux …de date)

Scrierea in fisier

  • fout<<expr1<<expr2<<endl;
  • in fisier se afiseaza, in ordine, valorile expresiilor; constanta endl determina trecerea la rand nou in fisierul de iesire

Inchiderea fisierelor

Accesul la un fisiere se finalizeaza prin inchiderea fisierelor.

  • fin.close();
  • fout.close();

Exemplu: In fisierul DATE.IN se gasesc 2 valori inttregi. Sa se afiseze suma lor in fisierul DATE.OUT.

#include <fstream>
int a,b;
ifstream fin(“date.in”);
ofstream fout(date.out”);
int main ()
{
fin>>a>>b;
fout<<a+b;
fin.close();
fout.close();
return 0;
}
 
 

Tags:

Tipul Caracter

Variabilele de tip CHAR memoreaza valori intregi de la -128 pana la 127. Practic, in relatia cu utilizatorul/programatorul sunt afisate caractere corespunzatoare valorilor memorate : ‘a’,’b’,….’z’, ‘A’, … ,’Z’, …. ‘0’, ‘1’, …,’9’

Aceasta relatie unica intre un caracter si codul lui se numeste CODUL ASCII (American Standard Code for Information Interchange): oricarui caracter ii corespunde in mod unic o valoare de la 0 la 255 (256 de caractere)

  • codul standard: 0..127 (semnele de pe tastatura)
  • codul extins: 128..255

Declarare: char ch, cuvant[100];
Citirea: cin>>ch;
OBS: Utilizatorul tasteaza un caracter iar variabila ch memoreaza codul ascii asociat.
Afisarea: cout<<ch;
OBS : Variabila memoreaza o valoare intreaga si afiseaza caracterul cu codul ASCII corespunzator valorii.

Probleme:
1. Sa se afiseza toate caracterele existente si codul lor
2. Pentru caractere alese de utilizator, sa se afiseze codul lor ASCII.

Problema 1.

#include <fstream.h>
ofstream fout (“date.out”);
int main ()
{ int i;
for (i=0;i<=255;i++)
 fout <<(char) i<< ” are codul ”<< i;
fout.close();
return 1;
}

OBS:

  • (char) i  – converteste valoarea de tip INT la tipul caracter
  • dupa rulare obtinem ‘0’,’1’,….. ‘9’, …’A’,’B’, ..’Z’, … ,’a’,’b’,….,’z’ (literele mici au cod mai mare decat literele mari)
  • codurile respecta ordinea naturala a cifrelor, literelor mari si mici
  • diferenta intre codurile literei mari si a celei mici este aceeasi pebtru orice fel de litera (‘a’-‘A’=’b’-‘B’=…=’z’-‘Z’)

Problema 2.

#include <iostream.h>
char ch;
int main ()
{while (1==1)
 {cin>>ch;
 cout<< ” are codul ”<<(int) ch<<endl;}

return 1;
}


 
 
%d bloggers like this: