[C++ -Algoritmi (cls X) ]

Un mediu integrat de dezvoltare -IDE (integrated development environment) este format din editor de cod sursa (programul din fisierul cu extensia .cpp de exemplu),compilator(creeaza cod obiect  adica fisiere cu extensia .obj),depanator(permite rulare pas cu pas ,urmarirea continutului variabilelor etc),help integrat(adesea e inlocuit cu un help online cu multe tutoriale ),link-editor (adauga la fisierul cod obiect obtinut prin compilare un cod suplimentar reprezentat de bibliotecile precompilate  iostream ,math,conio,ifstream etc)
PARTEA DE HELP ESTE EXTINSA  IN IDE-URILE ACTUALE CU BLOGURI ,FORUMURI , EXEMPLE DE COD GEN INTELISENSE IN VISUAL STUDIO SAU IN ANDROID STUDIO 
Structura unui program C++ :

zona de declaratii
#include.....//se pun fisiere header numite si fisiere antet uneori se scriu fara .h daca asa cere compilatorul 
int a,..
float c...//se declara variabile , tipuri de date , functii create de programator


zona de instructiuni 
aici se pun in ordine toate instructiunile functiei principale (numita si programul principal main)
incepe cu void main () {.......}
sau incepe cu int main(){....return 0;}
daca incepe cu int instructiunea return e obligatorie . 


Functiile create si declarate ca atare in zona de declaratii au si ele o zona proprie de declaratii si o zona proprie de instructiuni .


Uneori compilatoarele lucrează cu nume de spatii de lucru .
MINGW si CODEBLOCKS , dar si CPPDROID  utilizează instrucţiunea used namespace std;

INSTRUCTIUNI C++ :


  • instructiuni de scriere printf si cout ex: printf("%f",c); cout<<c;
  • de citire scanf si cin ex: scanf("f",&c) ; cin>>c;
  • de atribuire =
  • instructiunea compusă {......mai multe instructiuni separate prin ; }
  • instrucţiuni repetitive
        for(contor=val initiala ;contor<=val finala;contor++)                 instructiune ; 
          sau while(conditie) {instr;}
          sau do{ instr; } while(conditie);
     instructiunea cu test initial are conditia inainte de executia grupului de instr pe care il repeta
     instr repetitiva cu test final are conditia  dupa grupul de instr repetat
 efect : la instr repetitive (numite si iterative) daca avem contor avem repetitia facand diferenta intre valoarea maxima si cea minima a contorului ; daca avem test initial si testul e fals de la bun inceput instr nu se va executa niciodata ; daca avem test fals si avem instr repetitiva cu test final atunci aceasta se executa cel putin o data

  • instrucţiuni de declarare 
  • cunoştinţe despre expresii in C++ , de fapt evaluarea se face pe baza conceptiei de "precedenta a operatorilor " (stim ca se executa intai produsul apoi scaderea , se poate evita o situatie ambigua folosind paranteze cand e cazul in cadrul expresiilor) 
Observatie :
in C++ si in multe alte limbaje de programare se folosesc doar paranteze rotunde la expresii , nu paranteze drepte sau acolade ca la expresiile din manuale de matematică

  • instructiuni selective(numite si conditionale sau alternative) 
if (cond) instr; e selectia simpla
if(cond) instr1 ; else instr 2 ; e selectia duală

Există şi instr selectivă cu variabilă selector
(numita si selectie multipla) :

case(c)
{
valoare_1:instr_1; break;
valoare_2:instr_2;break;
valoare_n:instr_n; break;
else instr;
}

SINTAXA -totalitatea regulilor utilizate în scrierea programelor
Spre exemplu o regulă : se separă instrucțiunile cu punt și virgulă.
! reprezintă negația
||   ori (sau) logic
&& si logic
; separator instructiune
/* text */   comentariu pe mai multe randuri (text explicativ)
v++ postincrementare - cresterea variabilei v cu o unitate dupa ce e folosita cu
valoarea curenta
++v-preincrementare a lui v
 creste cu 1 si apoi e folosit in expresii
--v- deincrementeaza v si apoi se foloseste v in calcule
v--   utilizare cu valoarea curenta si apoi deincrementare
v=v+5;     v+=5; echivalente
! -negatia logica
= atribuire v=5;
== egalitate
a==b e propozitie cu valoarea 1 daca e adevarat si 0 altfel
cout<<"text"<<v; afiseaza text si apoi valoarea lui v
cout<<endl; trece la randul urmator endline
cout<<"text"<<v<<endl;  
cin>>v;
gets(v); daca v e sir de caractere sau caracter
puts(v); daca v sir/caracter
getchar(v); pt caracter
putchar(v); caracter
getch();
getche(); citire cu ecou a unui caracter
scanf("%d", &v);  citire cu format       printf("%d  text",v); scriere cu format


 APLICATIE SCRIERE SI CITIRE
#include<stdio.h>
using namespace std;

float a,b=3.67;//b var initializata
//b se comporta ca o const daca nu e modif
int main()
{
printf("a= ");
scanf("%f",&a);
printf ("suma=%f",a+b);//%f descriptor de format
return 0;
}


TEST REZOLVAT 

Se dă algoritmul de mai jos in pseudocod .
Declară n,i,s
citeste n
s=0
scrie n+10
Pentru i de la 1 la 10 
{
scrie n+i
s=s+n+i
}
scrie s
a. Ce afiseaza pt n=10 ?
b.Inlocuiti structura repetitiva pentru (cu contorul i) cu instr repetitiva cu test initial
c.program C++ pt alg de mai sus


REZOLVARE

a.
n
i
s


10
1
11



2
22



3
33



……
……




110


R: 20 11 12 ……20 110

b. i=1cat timp(i<=10){.................................................i=+1}

c.#include<iostream.h>

int n,i,s;

void main()

{cin>>n;s=0;cout<<n+10;

for(i=1;i<=10;i++) { cout<<n+i; s=s+n+i; }cout<<s;}

TEST 1
Test cu 4 intrebări. la sfarsit
Pentru itemul 1, scrieţi pe foaia de examen litera corespunzătoare răspunsului corect.
1. Variabila x este de tip real. Care dintre următoarele expresii C/C++ are valoarea 1 dacă şi
numai dacă numărul real memorat în variabila x aparţine intervalului (5,8]? (1p.)
a. (x<8) && (x>=5) b. (x<=8) || (x>5)
c. (x>8) || (x<=5) d. (x<=8) && (x>5)
Scrieţi  răspunsul pentru fiecare dintre cerinţele următoare.
2. Se consideră algoritmul alăturat, descris în pseudocod.
citeşte n (număr natural)
z=0
p=1
┌cât timp n>0 execută
│ c=n%10
│ n=[n/10]
│┌dacă c%3=0 atunci
││ z=z+p*(9-c)
││ p=p*10
│└■
└■
scrie z
S-a notat cu x%y restul împărţirii numărului întreg x la numărul
întreg nenul y şi cu [a] partea întreagă a numărului real a.
a) Scrieţi valoarea care se va afişa dacă se citeşte
n=103456. (3p.)
b) Scrieţi toate numere naturale impare, distincte, fiecare
având exact două cifre, care pot fi citite pentru variabila
n astfel încât să se afişeze valoarea 3. (2p.)
c) Scrieţi în pseudocod un algoritm, echivalent cu cel dat,
în care să se înlocuiască structura cât timp...execută
cu o structură repetitivă de alt tip. (2p.)

2p (of)

Rezolvare:
La 1 avem raspuns corect b si d
la 2 a) se face un tabel 

n
c
z
p

103456
6
0
1

10345

3
10

1034
5



103
4




3
63
100

10
0
963
1000

1
1



0






Cel mai probabil afiseaza 963  
2 b)  pt n=16 observam 
n
c
z
p

16

0
1

1
6
3
10

0
1




























presupunem ca daca prima cifra nu e diviz cu 3 dar ultima e 6 avem f probabil valorile 
16,26,46,56,76,86

c) citeşte n (număr natural)
z=0
p=1
daca n>0 atunci 
┌repeta 
│ c=n%10
│ n=[n/10]
│┌dacă c%3=0 atunci
││ z=z+p*(9-c)
││ p=p*10
│└■
 pana cand(n=0)
scrie z

S-a inlocuit instructiunea repetitiva cu test initial cu cea cu test final.
Intrebari
1.  Observati ca am inlocuit instr repetitiva cu test initial cu instr repetitiva cu test final !
De ce se pune inaintea instructiunii repetitive cu test final o instructiune conditionala cu exact aceeasi conditie ca in instr repetitiva cu test initial?
2.Mentionati numele variabilelor intalnite in algoritm
3.Mai sus avem doua modalitati diferite de reprezentare  a algoritmilor . Care sunt ?
4.Ce inseamna % , &&, ||, [ ] in algoritmul de mai sus ? 


Test 2 (lucrare scrisa)
1. Se da algoritmul
Declarăm n,i,s
Citește n
S=0
Scrie n*n
Pentru i de la 1 la 5
{
Scrie n* n
s=s+n+1
}
Scrie s
a. Ce afișează pt n=5?
b.inlocuiti structura repetitiva pentru cu alta structura repetitiva
c.scrieti programul C++

Raspuns la a ) 25 25 25 25 25 25 30
pentru ca datele arata conform tabelului 
n
i
s
5

0
5
1
6
5
2
12
5
….
…..
5
5
30
la b) avem   o initializare a variabilei i cu 
                  i=1
                 Cat timp( i< =5)
     {. ......  i++;  }
La c) e listat mai jos  

#include<iostream.h>

int n,i,s;

int main()

{cin>>n;s=0;cout<<n*n;

  for(i=1;i<=5;i++) 

  cout<<n*n; s=s+n+1; }cout<<s;return 0;}


TEST 3 (Varianta 002 la bac-subiectul I)
Pentru itemul 1, scrieţi litera corespunzătoare răspunsului corect.
1. Variabilele x şi y sunt tip int. Care dintre expresiile C/C++ de mai jos are valoarea 1
dacă şi numai dacă valorile întregi nenule memorate în variabilele x şi y sunt egale? (4p.)
a. (x%y==0) && (y%x==0) && (x*y>0) b. (x<=y) && (y<x)
c. (x<=y) || (y<=x) d. x*x==y*y
Scrieţi răspunsul pentru fiecare dintre cerinţele următoare.
2. Se consideră algoritmul alăturat, descris în
pseudocod.
S-a notat cu x%y restul împărţirii numărului întreg x la
numărul întreg nenul y.
a) Scrieţi ce se va afişa dacă se citesc, în această
ordine, numerele: 17 22 13 101 2 7 5 0.
b) Scrieţi un şir de date de intrare, format doar din
numere naturale cu cel mult două cifre fiecare,
care să determine afişarea valorii 9877. 
citeşte x (număr natural nenul)
┌cât timp x>0 execută
│ citeşte y (număr natural)
│┌dacă x>y atunci
││ scrie x%10
││altfel
││ scrie y%10
│└■
│ x=y
└■
c) Scrieţi în pseudocod un algoritm echivalent cu cel dat, în care să se înlocuiască structura
cât timp...execută cu o structură repetitivă de alt tip. (6p.)
d) Scrieţi programul C/C++ corespunzător algoritmului dat. 


Rezolvare
a)
17 22 13 101 2 7 5 0
x
y
17
22
22
13
13
101
101
2
2
7
7
5
5
0
0
Se vor afisa 2  2  1  1  7  7  5

b) pentru a afisa 9877 se va citi de la tastatura sirul 
9,8,7,7,0
Am pus 0 pt ca algoritmul sa se opreasca
c) citeste x
daca x>0 atunci  repeat
                             citeste y;
                               daca x>y atunci scrie x%10 altfel scrie y%10;
                               x=y;
                               pana cand x=0
d) programul C++
#include<iostream.h>
int x,y;
void main()
{
cin>>x;
while(x>0)  { cin>>y;
                        if x>y cout<<x%10 ; else cout <<y%10;
                      }
x=y;
}                             

      

Operații cu fișiere 

http://lectiideticsiinfo.blogspot.ro/p/operatii-cu-fisiere-text-bac.html

Probleme propuse

Se dau a,b, c . Verificati daca sunt sau nu laturi ale unui triunghi .

rezolvare

Inegalitatea triunghiului


#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
    int a, b, c;
    cin>>a>>b>>c;
    if (!((a+b>c) && (a<b+c) && (b<a+c)) )
        {
        cout<<"nu este triunghi";
         exit(0);
        }
       else  cout<<"este triunghi";
    return 0;
}
!! SE CERE PT PROBLEMA REZOLVATA MAI SUS CU INEGALITATEA TRIUNGHIULUI  SA CITITI A,B,C DIN A.TXT SI SA SCRIETI DACA E SAU NU TRIUNGHI IN B.TXT

Se citeste n din fisierul a.in si se scrie in b.out daca este sau nu număr prim .

Se dau a si b numere intregi . Sa se scrie in fisierul a.out daca sunt divizibile cu 3.

Se va lua un numar si se vor elimina zerourile dintre cifrele sale .

Se va verifica daca un numar este palindrom . (citit dreapta -stanga e la fel cu citirea stanga-dreapta) 

Se va scrie un program pentru extragerea radicalului dintr-un numar real a.

alte probleme rezolvate ,propuse pt pregătire suplimentară

Se va scrie un program pt calculul ariei unui triunghi cu formula lui Heron . ( SE VA VERIFICA DACA a,b,c sunt laturi ale unui triunghi) .

Se vor face grupe de maxim 5 elevi si se va realiza proiectul in format .doc  .cpp si ca prezentare .

APLICATIE :CMMDC pt n numere folosind fisierele a.txt pt citirea lui n si a n numere , urmând ca rezultatul să se scrie în b.txt . 

#include<iostream>
#include<fstream>

uses namespace std; 

int a[10],n,i,j,k;

ifstream f("a.txt");

ofstream g("b.txt");

int  main()

{

clrscr();
f>>n;for(i=1;i<=n;i++)
f>>a[i];
for(i=1;i<n;i++)
while(a[i]!=a[i+1])
{if(a[i]>a[i+1])  a[i]=a[i] -a[i+1];
if (a[i]<a[i+1]) a[i+1]=a[i+1]-a[i];
}
g<<a[n]<<"    este    cmmdc";
return 0 ;
}

Aplicație  Distante.Segmente.Reprezentare și calcul.

Calculati pt doua puncte A de coordonate x0,y0,z0  si B de coordonate x1,y1 si z1 distanta d . Coordonatele se vor introduce dintr-un fisier .  
Se cere si o reprezentare grafica . 
Indicatie 1  : pt a reprezenta grafic segmentul pe ecran  se poate utiliza in Turbo C++ codul :
#include<graphics.h>
#include<conio.h>
#include<iostream.h>
int x1,x2,y1,y2,gd=DETECT,gm;
int main()
{
cout<<"x1=";cin>>x1;cout<<"x2=";cin>>x2;
cout<<"y1=";cin>>y1;cout<<"y2=";cin>>y2;
initgraph(&gd,&gm,"");
setcolor(10);
line(x1,y1,x2,y2);
getch();
closegraph();
getch(); return 0;
}


Dacă avem un segment în spațiul tridimensional se utilizează perspectiva (metodă de reprezentare în plan bidimensional cum e ecranul unui calculator a unui obiect din spatiul 3D).


Indicatie 2 :distanta dintre A și B în planul tridimensional  este radical de suma patratelor diferentelor dintre x0 si x1  , y0 si y1 , z0 si z1 . 

Se utilizeaza # include <math.h> 
DISTANTA INTRE A si B
#include <iostream>
#include<math.h>
using namespace std;
double x1,y1,z1,x2,y2,z2;
int main()
{
    cout << "x1= " ;
    cin>>x1;
    cout<<"y1=";cin>>y1;
    cout<<"z1=";cin>>z1;
    cout << "x2= " ;
    cin>>x2;
    cout<<"y2=";cin>>y2;
    cout<<"z2=";cin>>z2;
    cout<<"distanta este = "<<sqrt(pow(x2-x1,2)+pow(y2-y1,2)
+pow(z2-z1,2));
    return 0;
}


Aplicatie -verificare scris si practic
 CEL MAI MIC MULTIPLU COMUN DINTRE a si b 
Stiind ca cel mai mic multiplu comun pentru a si b este a*b/(a,b) , unde cu (a,b) se noteaza conventional cmmdc dintre a si b se cere  sa scrieti programul corespunzator avand in vedere ca datele de intrare sa foloseasca fisierul in.txt si cele de iesire out.txt .
De asemeni se cere codificarea in stil CodeBlocks -compilator MINGW .

APLICATIE PRACTICA MINIMUL intr-un vector 

#include<iostream.h>
int i,j,min,a[10];
int main()
{
cout<<"nr de elemente = " ;cin>>j;
min=32767;//maxint 
for(i=0;i<j;i++) { cin>>a[i]; if (a[i]<min) min=a[i]; }
cout<<min;
return 0; 
}