RSS

Category Archives: C2_2 Limbajul C/C++

Instructiuni. Vectori. Fisiere

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
 
Leave a comment

Posted by on 21/11/2014 in C2_2 Limbajul C/C++

 

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;
  • valorile din fisier se citesc rand pe rand si se atribuie variabilelor din lista; se citesc in ordinea normala, ignorandu-se ideea de rand nou (ENTER)

Scrierea in fisier

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

Inchiderea fisierelor

Accesul la un fisier se sfarseste 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;
}
 
Leave a comment

Posted by on 14/11/2014 in C2_2 Limbajul C/C++

 

Instructiunea FOR

Exista trei instructiuni (structuri) repetitive folosite in toate limbajele:

  • instructiunea repetitiva cu test initial CAT TIMP (WHILE) (se foloseste cand numarul de repetitii este nedefinit)
  • instructiunea repetitiva cu test final REPETA-PANA CAND (DO WHILE sau REPEAT) (se foloseste cand numarul de repetitii este nedefinit)
  • instructiunea repetitiva cu un numar cunoscut de pasi PENTRU (FOR) (se foloseste cand numarul de repetitii este cunoscut - un numar fix de ori.)

Sintaxa:

  • FOR(initializare; test final; pasul urmator) instructiune;
  • for (i=A; i<=B; i++) {secventa de repetat}
  • for (i=1; i<=n; i++) {secventa de repetat}

Efect:

  • pentru fiecare valoare a contorului i intre expresia initiala si expresia finala se executa instructiunea;

Exemplufor (i=1; i<=n; i++) cout<<” Nu ma prinzi!”;

  • pentru fiecare valoarea a variabilei i, de la 1 la N, se afiseaza ” Nu ma prinzi!”; de N ori
  • daca secventa ce trebuie repetata contine mai multe instructiuni, acestea se vor grupa cu acolade

Observatii:

  • instructiunea este “ceruta” daca descrierea algorimului spune “de la valoarea X la valoarea Y”, “pentru primele X valori”, “de X ori”, …


 
Leave a comment

Posted by on 14/02/2012 in C2_2 Limbajul C/C++

 

L11. Instructiunea WHILE

Exista trei instructiuni (structuri) repetitive folosite in toate limbajele:

  • instructiunea repetitiva cu test initial CAT TIMP (WHILE) (se foloseste cand numarul de repetitii este nedefinit)
  • instructiunea repetitiva cu test final REPETA-PANA CAND (DO WHILE sau REPEAT) (se foloseste cand numarul de repetitii este nedefinit)
  • instructiunea repetitiva cu un numar cunoscut de pasi PENTRU (FOR) (se foloseste cand numarul de repetitii este cunoscut - un numar fix de ori.)

Instructiunea WHILE

Sintaxa :

  • while (expL) instructiune;

Efect

  1. Se evalueaza expresia logica
  2. Daca valoarea expresiei logice este 1 (adevarata) se executa instructiunea si se revine la pasul 1
  3. daca valoarea expresiei logice este zero (falsa) se continua cu instructiunea de dupa punct-virgula

Observatii:

  • in esenta, cat timp valoarea expresiei logice este adevarata, se executa instructiunea
  • daca valoarea expresiei logice este falsa de la inceput atunci instructiunea nu se mai executa
  • daca WHILE trebuie sa repete mai mult de o instructiune, acestea se vor incadra intre acolade;
  • instructiunea WHILE se mai numeste “repetitiva cu test initial” sau “conditionata anterior”, pentru ca intai verifica valoarea conditiei si apoi executa secventa ce trebuie repetata

Problema exemplu. Fie A si B doua valori naturale. Sa se simuleza impartirea cu rest a lui A la B (prin scaderi repetate) si sa se determine catul si restul impartirii.

#include <iostream.h>
void main()
{//declararea
int A, B, C=0;
//citirea
cin>>A>>B;
//prelucrarea
while(A>=B) {A=A-B; C++;};
//Afisarea rezultatelor
cout<<"catul este :"<<C<<endl;
cout<<"restul este : "<<A;
}

Explicatii. Cand impartim pe A la B cautam “de cate ori se cuprinde” B in A, altfel spus cate scaderi ale lui B din a se pot face.

Un tip e problema ce necesita folosirea instructiunii WHILE este prelucrarea unui sir de valori ce se incheie cu zero.

Ideea : Se citeste fiecare valoare si daca este nenula se prelucreaza; Acest pas se repeta pana citim valoarea zero. (Ex: 23, -4, 5, 12, 79, 0).

Codul corespunzator este:

cin>>x;
While (x!=0) { //prelucrez valoarea X citita;
               ..............................
               //citesc urmatoarea valoare din sir
               cin>>x;};

Probleme ce folosesc acest algoritm pot umari:

  • numarul de valori din sir
  • valoarea maxima/minima
  • numarul de aparitii a unei valori K
 
7 Comments

Posted by on 12/11/2010 in C2_2 Limbajul C/C++

 

L10. Instructiunea DO – WHILE

Exista trei instructiuni (structuri) repetitive folosite in toate limbajele:

  • instructiunea repetitiva cu test initial CAT TIMP (WHILE) (se foloseste cand numarul de repetitii este nedefinit)
  • instructiunea repetitiva cu test final REPETA-PANA CAND (DO WHILE sau REPEAT) (se foloseste cand numarul de repetitii este nedefinit)
  • instructiunea repetitiva cu un numar cunoscut de pasi PENTRU (FOR) (se foloseste cand numarul de repetitii este cunoscut - un numar fix de ori.)

Instructiunea DO – WHILE

Sintaxa: do { instructiuni} while (conditie) ;

Efect:

  1. se executa secventa de instructiuni
  2. se evalueaza conditia
  3. daca valoarea conditiei este adevarata se revine la pasul 1
  4. daca valoarea conditiei este falsa se continua cu instructiunea de dupa punct si virgula

Observatii:

  • do-while se mai numeste instructiune cu test final sau conditionata posterior
  • observati ca intai se executa secventa de instructiuni (macar o data) si apoi se testeaza
  • succesiunea de operatii este instructiune, test, instructiune, test, ….. test, instructiune, test.

Exemplu:

O problema la care putem folosi DO-WHILE este prelucrarea cifrelor unui numar natural/intreg. Cifrele vor fi prelucrate pe rand, de la sfarsitul numarului catre inceput, de fiecare data taind ultima cifra (deja prelucrata). Algoritmul se reia pana cand nu mai sunt cifre in numar, adica valoarea N ajunge la valoarea zero.

Sesizati ca orice numar are o ultima cifra, motiv pentru care intai prelucrez  si tai , si apoi verific daca mai sunt cifre de prelucrat.

Scheletul algoritmului ar fi:

cin>>n;
do { //prelucrarea ultimei cifre
      ..............;
      // tai ultima cifra
     n=n/10;
    } while (n!=0);

Observatii: puteti determina intai ultima cifra (int uc=n%10; )  si apoi sa prelucrati variabila uc

Probleme. fie N un numar natural.

  1. Cate cifre are N?
  2. Care este suma cifrelor lui N?
  3. Care este cea mai mare cifra din numar? (valoarea maxima). Analog minima.
  4. Sa se determine prima cifra a numarului N.
  5. De cate ori apare o cifra data C, in numarul N?
  6. Sa se genereze “oglinditul” numarului N. (daca N=1987 atunci oglinditul va fi 7891)
  7. Folosind problema de mai sus, stabiliti daca numarul N este palindrom.
 
4 Comments

Posted by on 12/01/2010 in C2_2 Limbajul C/C++

 

L9. Instructiunea IF

Instructiunea IF

Sintaxa: if (exp_logica) instrDA;  else instrNU;

Efect:

  • se evalueaza valoarea expresie logice
  • daca valoarea calculata este adevarata (nenula) se executa instructiunea instrDA si apoi instructiunea de dupa IF
  • daca valoarea calculata a expresiei este nula se executa instructiunea instrNU (daca exista ramura ELSE) si apoi instructiunea de dupa IF

Exemplu:

  • if (a%2==0) cout>>”valoarea este para”; else cout<<” valoarea este impara”;
  • se verifica daca restul impartirii la 2 a variabilei A este zero
  • daca DA se executa cout>>”valoarea este para”;
  • daca NU se executa cout>>”valoarea este impara”;

Observatii:

  • in C/C++ instructiunile, pe langa efectul lor, returneaza o valoare adevarat (1 – unu) daca se executa corect si fals (0 – zero) daca executia a fost eronata;
  • secventa if (a=b) instr1; else instr2; va executa intotdeauna numai instr1 pentru ca atribuirea a=b se executa corect
  • a nu se confunda a=b (lui a i se atribuie valoarea lui b) cu a==b (care verifica daca cele doua valori sunt egale)
  • daca in loc pentru o valoare a conditiei testate algortimul impune executarea a mai mult de o instructiune, acestea se vor incadra intre acolade: if (conditie) { …instructiuni pe ramura DA} else {instructiuni pe ramura NU};

Probleme:

  1. Fie N un numar natural. Sa se afiseze textul PAR sau IMPAR, functie de valoarea lui N.
  2. Fie N un numar natural. Sa se afiseze  textul POZITIV,  NEGATIV sau ZERO dupa caz.
  3. Fie A si B capetele unui interval. Sa se stabileasca daca o valoare X apartine intervalului [A,B].
  4. Fie A si B doua valori intregi. Sa se afiseze A si B in ordine crescatoare.
  5. Fie A si B doua valori intregi. Sa se calculeze X, solutia ecuatiei A*X+B=0.

Observatii:

  1. Se verifica valoarea expresiei N%2==0
  2. Se compara N cu 0 si se afiseaza dupa caz.
  3. Daca A este mai mare decat B, valorile trebuie interschimbate.
  4. -
  5. Trebuie verificat daca A nu este zero, caz in care se afiseaza un mesaj si se iese fortat, cu RETURN.
     
    4 Comments

    Posted by on 11/01/2010 in C2_2 Limbajul C/C++

     

    L8. Atribuirea

    Variabilele pot primi valori prin citire sau atribuire.

    Atribuirea

    Sintaxa: variabila=expresie;

    Efect:

    • se calculeaza valoarea expresiei
    • aceasta valoare se scrie in variabila, peste vechea valoare, care se pierde

    Exemple:

    • A=0;
    • B=5;
    • A=B+6;
    • A=B+A; (in A se va memora suma dintre A si B)
    • un caz deosebit este incrementarea (cresterea cu 1 a valorii unei variabile)
      • a=a+1;
      • aceasta operatie se mai scrie a++; (++ este operator unar)
    • operatia analoga, de scadere cu 1 a valorii unei variabile, se numeste decrementare:
      • a=a-1;
      • sau a–;
    • citind diverse programe realizate in C/C++ puteti intalni si exprimari de genul:
      • a=a+ –b; cu semnificatia b–; a=a+b; (analog ++b)
      • a+=b; cu semnificatia a=a+b;
    • … cum va place!

    Probleme

    1. Teodor is consuma jumatate din salariul sau pe facturi. Cititi salariul lui Teodor si afisati cu cat ramane Teodor.
    2. Cititi de la tastatura distanta si timpul necesar unui tren pentru a parcurge respectiva distanta. Calculati viteza medie de deplasare.
    3. Ana si Bogdan sunt colegi de banca. In pauza s-au gandit sa-si schimbe scaunele intre ei astfel incat , in orice moment, fiecare sa stea pe un scaun. Copiii astia chiar n-au treaba!!!

    Observatii:

    • la problema 1 pot apare urmatoarele dificultati:
      • daca salariul are valoare impara, rezultatul nu este real => float rez=(float) salar/2;
      • salariul este declarat int salar; si introduceti un salariu mai mare de 32767 rezultatele sunt imposibile; de ce? => variabilele de tip int nu pot depasi 32767; de aceea, valorile mai mari sunt trunchiate
    • la problema 2, pe langa valori de bun simt, puteti incerca si impartirea la zero :)
    • problema 3 face apel la o tehnica de lucru numita interschimbarea a doua valori;
      • una dintre variantele de rezolvare face apel la inca un scaun (variabila): int aux=a; a=b;b=aux;
      • exista si o varianta fara variabila auxiliara (pentru cazul in care vorbim de valori :) ): a=a+b; b=a-b;a=a-b;

    Sa privim inainte:

    • din exemplele de mai sus este limpede ca variabilele/datele de intrare trebuiesc verificate inainte de a fi prelucrate
    • de aceea, vom studia in continuare instructiunea IF
     
    1 Comment

    Posted by on 10/01/2010 in C2_2 Limbajul C/C++

     
     
    Follow

    Get every new post delivered to your Inbox.

    Join 58 other followers

    %d bloggers like this: