Ion Smeureanu, Marian Dardala, „Programarea in limbajul C/C++”, Editura CISON, Bucuresti 2001
Ion Smeureanu, Marian Dardala, „Programarea orientata obiect in limbajul C++”, Editura CISON, Bucuresti 2002
Tutorial C++: http://www.cplusplus.com/doc/tutorial/index.html
Bruce Eckel, „Thinking in C++, 2nd Edition”,
Prentice Hall 2000
http://mindview.net/Books/TICPP/ThinkingInCPP2e.html
Bartosz Milewski, „C++ In Action: Industrial
Strength Programming Techniques”, Addison Wesley, 2001
http://www.relisoft.com/book/index.htm
Crearea unui proiect
i.
Application
type: Console Application
ii.
Additional
options: Empty project
Pentru testare se poate folosi urmatorul program:
// include obiectele
standard
// pentru
intrari/iesiri cu consola
#include <iostream>
// permite
folosirea obiectelor standard
// fara
calificativul 'std::'
using namespace
std;
// functia
principala a programului
void main()
{
// afiseaza textul si un sfarsit de
linie
cout << "Cel mai simplu program." <<
endl;
}
Pentru citirea
datelor de la tastatura se foloseste obiectul cin (declarat in biblioteca standard iostream) si operatorul >> (numit extractor).
Sintaxa folosita
este:
cin >> nume_variabila;
nume_variabila reprezinta o variabila de oricare din tipurile
standard (char, int, long, float, double, …).
Exemplu:
// declarare variabile
int nr;
char nume[100];
// citire date de la tastatura
cin >> nr;
cin >> nume;
Se pot citi mai
multe valori intr-un singur pas folosind:
cin >> variabila_1
>> variabila_2 >> ... >> variabila_n;
In acest caz, variabilele vor fi citite in ordine de la stanga la dreapta. Valorile introduse pot fi separate prin spatiu, tab sau linie noua.
Pentru citirea sirurilor de caractere care contin spatii se poate folosi metoda getline a obiectului cin:
cin.getline(variabila_sir,
dimensiune_maxima);
Exemplu:
char denumire[120];
cin.getline(denumire, 120);
Afisarea datelor pe monitor se face utilizand obiectul cout si operatorul << (numit inserter).
Sintaxa folosita este:
cout << element_1 <<
element_2 << ... << element_n;
element_n poate fi:
·
un
nume de variabila
·
o
constanta (Ex: 7.3, "un text", …)
·
un manipulator (Ex: endl, dec, hex, …)
Manipulatorii sunt functii speciale incluse in lantul de operatori << si folosite pentru specificarea informatiilor de formatoare. Cei mai folositi manipulatori sunt:
Manipulator |
Efect |
endl |
|
setw(int n) |
Stabileste latimea zonei de afisare |
setprecision(int n) |
Stabileste numarul de cifre zecimale ale unui numar real |
scientific |
Reprezentarea unui real in format stiintific |
fixed |
Reprezentarea unui real in format fix |
showpoint |
Afisarea punctului zecimal chiar daca numarul nu are cifre zecimale semnificative |
ws |
Elimina spatiile din stream. |
Efectul manipulatorilor (cu exceptia setw si endl) se manifesta pana la o noua setare. De exemplu, daca s-a folosit manipulatorul scientific, toate variabilele de tip real vor fi afisate in format stiintific pana la revenirea la formatul normal prin utilizarea manipulatorului fixed.
Exemplu de utilizare:
#include <iostream>
#include <iomanip>
using namespace
std;
void main()
{
int n = 10;
char nume[] =
"Popescu";
double f1 = 6.5, f2 =
27.35333, f3 = 8;
// afisare variabile si constante
// si folosirea manipulatorului de
sfarsit de linie
cout << "Numarul este " << n <<
endl;
cout << "Numele este '" << nume <<
"'" << endl;
// afisare numere reale in formatul
implicit
cout << "Format implicit (fix): " << f1
<< " " << f2 << endl;
// afisare numere reale in formatul
stiintific
cout << "Format stiintific: " <<
scientific << f1 << endl;
// manipulatorul 'scientific'
actioneaza in continuare
// pana la revenirea la formatul fix
prin utilizarea
// manipulatorului 'fixed'
cout << "Tot format stiintific: " << f2
<< endl;
// fortare afisare numere reale cu
trei zecimale
cout << fixed << showpoint <<
setprecision(3)
<< "Trei zecimale:" << f1
<< " " << f2 << " " << f3 <<
endl;
// afisare tabel cu aliniere la
dreapta
// manipulatorii 'fixed',
'showpoint'
// si setprecision(3) au in
continuare efect
cout
<< setw(10) << f1 << endl
<< setw(10) << f2 << endl
<< setw(10) << f3 << endl;
}
Rezultatul obtinut este:
Numarul este 10
Numele este
'Popescu'
Format implicit
(fix): 6.5 27.3533
Format stiintific:
6.500000e+000
Tot format
stiintific: 2.735333e+001
Trei zecimale:6.500
27.353 8.000
6.500
27.353
8.000
Pentru un student se cunosc notele si numele. Se cere:
· sa se defineasca un articol care sa permita stocarea datelor referitore la un student si calculul ulterior al mediei
· sa se scrie functia pentru citirea de la tastatura a datelor unui student si initializarea cu 0 a mediei
· sa se scrie functia pentru afisarea pe monitor a datelor corespunzatoare unui student
· sa se exemplifice utilizarea functiilor create
Rezolvare:
Pentru definirea structurii vom folosi doua constante pentru specificarea numarului maxim de note si a dimensiunii maxime a numelui studentului. Declaratia structurii asticolului este:
// numarul maxim
de note pentru un student
const int
DIM_MAX_NOTE = 20;
// dimensiunea
maxima a numelui
const int
DIM_MAX_NUME = 100;
// declaratie
structura
struct Student
{
// numele studentului
char Nume[DIM_MAX_NUME];
// notele obtinute
int NumarNote;
int Note[DIM_MAX_NOTE];
// media notelor
float Media;
};
Functia de citire a datelor va crea o variabila de tip Student, va citi datele corespunzatoare si va returna stuctura astfel initializata apelantului:
Student CitireStudent()
{
// declarare variabila de tip
structura
Student stud;
// citire nume
// se foloseste functia getline
pentru
// a se putea introduce un nume care
// contine spatii
cout << "Nume:";
cin >> ws; // elimina
eventualele spatii
cin.getline(stud.Nume, DIM_MAX_NUME);
// citire numar note
cout << "Numar note:";
cin >> stud.NumarNote;
// citire note
for (int
i = 0; i < stud.NumarNote; i++)
{
cout << "Nota " << i+1 <<
": ";
cin >> stud.Note[i];
}
// initializare medie
stud.Media = 0;
// intoarcere rezultat
return stud;
}
Functia de citire primeste ca parametru un articol de tip Student si afiseaza datele corespunzatoare folosind obiectul cin si manipulatorii prezentati anterior:
void AfisareStudent(Student
student)
{
// afisare nume aliniat la stanga
cout << setw(DIM_MAX_NUME) <<
setiosflags(ios::left) << student.Nume;
// afisare medie (daca a fost
calculata)
if (student.Media > 0)
// se folosesc manipulatorii
fixed, showpoint
// si 'setprecision' pentru a
forta afisarea
// mediei cu 2 zecimale
cout << fixed << showpoint
<< setprecision(2) << student.Media
<< " ";
// afisare note
cout << "Note:";
for (int
i = 0; i < student.NumarNote; i++)
cout << " " << student.Note[i];
cout << endl;
}
Pentru exemplificarea utilizarii functiilor create vom scrie programul principal pentru citirea datelor corespunzatoare unui student si afisarea lor pe monitor:
void main()
{
// creare student si initializare
prin
// citire de la tastatura
Student s = CitireStudent();
// afisarea datelor citite
AfisareStudent(s);
}
Codul sursa complet:
#include <iostream>
#include <iomanip>
using namespace
std;
// numarul maxim
de note pentru un student
const int
DIM_MAX_NOTE = 20;
// dimensiunea
maxima a numelui
const int
DIM_MAX_NUME = 20;
// declaratie
structura
struct Student
{
// numele studentului
char Nume[DIM_MAX_NUME];
// notele obtinute
int NumarNote;
int Note[DIM_MAX_NOTE];
// media notelor
float Media;
};
Student CitireStudent()
{
// declarare variabila de tip
structura
Student stud;
// citire nume
// se foloseste functia getline
pentru
// a se putea introduce un nume care
// contine spatii
cout << "Nume:";
cin >> ws; // elimina
eventualele spatii
cin.getline(stud.Nume, DIM_MAX_NUME);
// citire numar note
cout << "Numar note:";
cin >> stud.NumarNote;
// citire note
for (int
i = 0; i < stud.NumarNote; i++)
{
cout << "Nota " << i+1 <<
": ";
cin >> stud.Note[i];
}
// initializare medie
stud.Media = 0;
// intoarcere rezultat
return stud;
}
void AfisareStudent(Student
student)
{
// afisare nume aliniat la stanga
cout << setw(DIM_MAX_NUME) <<
setiosflags(ios::left) << student.Nume;
// afisare medie (daca a fost
calculata)
if (student.Media > 0)
// se folosesc manipulatorii
fixed, showpoint
// si 'setprecision' pentru a
forta afisarea
// mediei cu 2 zecimale
cout << fixed << showpoint
<< setprecision(2) << student.Media
<< " ";
// afisare note
cout << "Note:";
for (int
i = 0; i < student.NumarNote; i++)
cout << " " << student.Note[i];
cout << endl;
}
void main()
{
// creare student si initializare
prin
// citire de la tastatura
Student s = CitireStudent();
// afisarea datelor citite
AfisareStudent(s);
}