Sunteți pe pagina 1din 7

Obiective:

Săptămâna 4  Identificarea structurii


 Utilizarea corectă
Strucura altenativă  Imbricarea structurii
 Operații cu fișere text

Deseori am întâlnit în viaţa de zi cu zi o situaţie de forma:

Se remarcă aici trei cuvinte ce au un rol deosebit: DACĂ, ATUNCI, ALTFEL. Structura
alternativă este implementată în limbajul C++ de instrucţiunea IF. În continuare vom prezenta modul
de reprezentare a acestei structuri în limbaj pseudocod, în schemă logică şi în limbajul de programare
C++. Modul de execuţie este identic pentru oricare din cele trei reprezentări. Sintetizănd cu notaţiile
de mai sus structura alternativă se poate reprezenta astfel:
Pot exista şi cazuri particulare de utilizare a acestei structuri, atunci cand unul dintre cele doua blocuri
de instrucţiuni lipseste.

Schema logică Pseudocod Instructiune C++

Nu Da dacă c atunci if(expresie logica)


C B1 instructiune1;
altfel else
B2 B1 B2 instructiune2;
sfârșit_dacă

Cazul 1. Dacă lipseste acțiunea B2 atunci structura se reprezinta astfel:


Schema logică Pseudocod Instructiune C++

Nu Da dacă c atunci if(expresie logica)


C B1 instructiune1;
sfârșit_dacă
B1
Cazul 2. Dacă lipsește acțiunea B1 atunci structura se reprezinta astfel:
Schema logică Pseudocod Instructiune C++

Nu Da dacă not c atunci if(!expresie logica)


!C
B2 instructiune2;
sfârșit_dacă
B2

Pot exista şi situaţii în care structurile alternative sunt incluse unele in altele. In acest caz
spunem ca instrucţiunilie if sunt imbricate. Exista o regula de asociere a cuvântului else de if:

„În situația instrucțiunilor if imbricate, și atunci când, pentru gruparea instrucţiunilor nu se folosesc
acolade cuvântul else se asociază primului cuvant if aflat la stânga lui.(asemănător cu asocierea închiderii
corecte a grupurilor de paranteze de la matematică).”

În exemplul următor este sugerat cum sunt imbricate trei instructiuni if. Pentru a le putea
identifica ușor ele sunt scrise cu culoari diferite (verde, albasru, portocaliu).
if(c1)
if(c2) Instrucțiunea principală
if(c3)
instrucțiune1;
else Se execută atunci doar când c1 este adevărată
instructiune2;
else Se execută atunci când c1 și c2 sunt adevărate
instrucțiune3;
else
instrucțiunea4;

Dacă în aceasta schemă grupăm instrucţiunile cu acolade se poate schimba fundamental


structura programului:

if(c1)
if(c2) Instrucțiunea principală
{if(c3)
instrucțiune1;}
else Se execută atunci doar când c1 este adevărată
instrucțiune2;
else Se execută atunci când c1 și c2 sunt adevărate
instrucțiunea3;

Se observă că primul cuvânt else este asociat cu cel de-al doilea if, acest lucru fiind determinat
de gruparea între acolade a instructiunii if (c3), reprezentate pe desen cu portocaliu

1. Maximul dintre două numere


Se citesc două numere întregi a şi b. Să se determine valoarea maximă dintre ele.

Date de intrare: Fișerul text numere.in conține pe primul rând, două numere întregi separate
printr-un spațiu
Date de ieșire: Cel mai mare număr din fișerul de intrare se va scrie în fișierul maxim.out
Restricții: a,b numere întregi ce aparțin intervalului [-109,109]
Exemplu: dacă fișierul de intrare are forma de mai jos, atunci în fișerul de ieșire trebuie afișata
valoarea 18.
numere.in maxim.out
18 10 18

Rezolvare:

1. Se deshide fișierul numere.in pentru citire


2. Se deschide fișerul maxim.out pentru scriere
3. citesc din fișierul de intrare valorile celor doua numere
4. compar între ele cele două valori, iar valoarea cea mai mare va fi scrisă în fișierul de ieșire.

#include<fstream>
using namespace std;
ifstream fin(“numere.in”); //deschid fișierul prntru operația de citire
ofstream fout(“maxm.out”); //deschid fișierul pentru operația de scriere
int main()
{int a,b; //declararea variabilelor
fin>>a>>b; //citesc valoarea celor doua numere
if(a>b) // le compar, pentru a determina valoarea maxima
fout<<a; // scriu rezultatul in fisier
else
fout<<b;
return 0;
}
3.Maximul dintre trei numere
Se citesc trei numere notate a,b și c. Scrieți un algoritm și un program C++ care să afișeze
cel mai mare număr citit.
Date de intrare: Fișerul text numere.in conține pe primul rând, trei numere întregi separate printr-
un spațiu
Date de ieșire: cel mai mare număr din fișerul de intrare se va scrie în fișierul maxim.out
Restricții: a,b și c numere întregi, ce aparțin intervalului [-109,109]
Exemplu: dacă fișierul de intrare are forma de mai jos, atunci în fișerul de ieșire trebuie afișata
valoarea 18.
numere.in maxim.out
18 5 10 18

Tinând cont de exemplul anterior, o modalitate simplă de rezolvare ar consta în compararea


două câte două, a valorilor variabilelor a, b, şi c. Se compară, spre exemplu, prima dată valoarea
variabilei a cu valoarea variabilei b şi presupunem că relaţia a>b este adevărată. Dacă menţinem
adevărată această presupunere, atunci valoarea maximă obţinută până acum este a. Mai rămâne să
comparăm valoarea variabilei c faţă de valoarea a. În această situaţie există două cazuri şi anume:
Cazul 1: dacă valoarea variabilei c este mai mare decât
valoarea variabilei a, atunci valoarea memorată în variabila c este
maximă.
Cazul 2: când valoarea variabilei c este mai mică decât valoarea
variabilei a (nu contează în acest moment raportul dintre variabilele b şi
c), deci rezultă că valoarea maximă dintre cele trei numere este valoarea
lui a.
Algoritm în pseudocod Sursca C++
din fișierul de intrare: #include<fstream>
-citeste a using namespace std;
-citeste b ifstream fin(“numere.in”);
-citeste c ofstream fout(“maxm.out”);
daca a>b atunci
| daca c>a atunci int main()
| | scrie c în fișierul de intrare {int a,b,c;
| |altfel fin>>a;
| | scrie a în fișierul de intrare fin>>b;
| |_▄ fin>>c;
|altfel if(a>b)
| daca c>b atunci if(c>a)
| | scrie c în fișierul de intrare fout<<c;
| |altfel else
| | scrie b în fișierul de intrare fout<<a;
| |_▄ else
|_▄ if(c>b)
fout<<c;
else
fout<<b;
return 0;
}
Dar, acest mod de determinarea valorii maxime este greu de aplicat atunci când numărul
variabilelor creşte la mai mult de trei. Pentru a obţine un algoritm simplu de aplicat pentru
determinarea valorii maxime dintre oricâte variabile se va proceda astfel:

Pas 1 : Compar prima dată valoarea variabilei a cu valoarea variabilei b, şi dacă valoarea lui a este
mai mare decât valoarea lui b interschimb valorile celor două variabile, obţinând în acest fel valoarea
maximă dintre primele două variabile în variabila b.

Pas 2: Compar de aceasta data valoarea variabilei b cu valoarea variabilei c, şi dacă valoarea
variabilei b este mai mare decât valoare lui c interschimb valorile celor două variabile, obţinând
astfel valoarea maximă dintre cele trei variabile în variabila c.

Pas 3: afişez valoarea variabilei c ca fiind valoarea maxima dintre a,b si c.


Algoritm în pseudocod Sursca C++
din fișierul de intrare: #include<fstream>
-citeste a using namespace std;
-citeste b ifstream fin(“numere.in”);
-citeste c ofstream fout(“maxm.out”);
daca a>b atunci
| aux=a int main()
| a=b {int a,b,c,aux;
| b=aux fin>>a>>b>>c;
|_▄ if(a>b)
daca b>c atunci {aux=a;
| aux=b a=b;
| b=c b=aux;
| c=aux };
|_▄ if(b>c)
scrie c {aux=b;
b=c;
c=aux;
};
gout<<c;
return 0;
}

1. Se citește o valoare naturală, nenulă, notată a. Să se realizeze un program care va afișa cele mai
apropiate două numere naturale pare de numărul x.

Date de intrare: Fișerul text numar.in conține pe primul rând, un număr natural nenul.
Date de ieșire:Fișierul numere.out conține două numere naturale scrise pe prima linie, separate
print-un spați și care reprezintă cele mai aproiate numere pare față de numărul dat
Restricții: a∈ 𝑁 ∗ , număr natural, nenul (0,109]
Exemplu:
numar.in numere.out
15 14 16
200 198 202

2. Se citește un număr natural, notat x. Să se afișeze numele lunii care are ca număr de ordine
valoarea dată.

Date de intrare: Fișerul text numar.in conține pe primul rând, un număr natural nenul.
Date de ieșire: Fișierul rez.out conține numele lunii corespunzătoare numărului dat, sau
mesajul ”Date gresite!”, dacă numărul dat nu este 1≤x≤12.
Restricții: a∈ 𝑁 ∗ , număr natural, nenul (0,109]
Exemplu:
numar.in rez.out
10 octombrie
15 Date gresite!

3. Scrieți un algoritm și un program C++, care să determine ultima cifră a numărului m=2n, fără a
calcula valoarea m.

Date de intrare: Fișerul text numar.in conține pe primul rând, un număr natural n.
Date de ieșire: Fișierul cifra.out conține o singură cifră, care reprezintă rezultatul cerut.
Restricții: n∈ 𝑁 ∗ , număr natural n∈ [0,109]
Exemplu:
numar.in cifra.out
0 1 (ultima cifră a lui 20 este 2)
5 2 (ultima cifră a lui 25 este 2)

4. Se citește o valoare naturală, notată n. Să se realizeze un program care va afișa mesajul ”par”, sau
”impar”, în funcție de paritatea numărului dat

Date de intrare: Fișerul text numar.in conține pe primul rând, un număr natural nenul.
Date de ieșire:Fișierul date.out conține mesajul
Restricții: n∈ 𝑁 ∗ , număr natural n∈ [0,109]
Exemplu:
numar.in date.out
15 impar
200 par

5. Se citesc două numere naturale, notate n și m. Să se realizeze un program care va afișa 1 dacă m
în divide pe n, sau 0 altfel.

Date de intrare: Fișerul text numere.in conține pe primul rând, două număre naturale nenule
separte printr-un spațiu.
Date de ieșire:Fișierul date.out conține o singură cifră, 1 dacă m îl divide pe n, sau 0 altfel.
Restricții: n, 𝑚 ∈ 𝑁 ∗ , numere naturale n,m≤ (0,109]
Exemplu:
numere.in date.out
15 3 1
15 4 0
6. Se citesc două numere naturale, notate n și m. Să se realizeze un program care va afișa 1 dacă
cele două numere au aceiași paritate, sau 0 altfel.
Date de intrare: Fișerul text numere.in conține pe primul rând, două numere naturale nenule
separate printr-un spațiu.
Date de ieșire:Fișierul date.out conține conține o singură cifră, 1 dacă cele două numere au
aceiași paritate, sau 0 altfel
Restricții: n, 𝑚 ∈ 𝑁 ∗ , numere naturale n,m≤ [0,109]
Exemplu:
numere.in date.out
15 3 1
15 4 0

7. Se citesc trei numere întregi, notate x, a, b. Scrieți un program care va afișa 1 dacă și numai dacă
numărul x este mai mare sau egal decât a și mai mic sau egal decât b, sau 0 altfel.

Date de intrare: Fișerul text numere.in conține pe primul rând, trei numere întregi x, a ,b
separate printr-un spațiu.
Date de ieșire:Fișierul rez.out conține conține o singură cifră, 1 dacă x este mai mare sau egal
decât a și mai mic sau egal decât b, sau 0 altfel.
Restricții: numere întregi x,a,b∈[10-9,109], a ≤b .
Exemplu:
numere.in rez.out
15 3 100 1
15 40 100 0

8. Se citesc trei numere naturale, nenule, notate k, a, b. Scrieți un program care va afișa 1 dacă și
𝑎
numai dacă numărul k simplifică fracția 𝑏, sau 0 altfel.

Date de intrare: Fișerul text numere.in conține pe primul rând, trei numere întregi k, a ,b
separate printr-un spațiu.
Date de ieșire:Fișierul rez.out conține conține o singură cifră, 1 dacă numărul k simplifică fracția
𝑎
, sau 0 altfel .
𝑏
Restricții: numere întregi k, a, b∈[0,109] .
Exemplu:
numere.in rez.out
15 3 100 1
15 40 100 0

9. Se citesc două numere naturale, notate n și m. Să se realizeze un program care va afișa 1 dacă
cele două numere sunt consecutive, sau 0 altfel.

Date de intrare: Fișerul text numere.in conține pe primul rând, două numere naturale nenule
separate printr-un spațiu.
Date de ieșire:Fișierul rez.out conține conține o singură cifră, 1 cele două numere sunt
consecutive, sau 0 altfel.
Restricții: n, 𝑚 ∈ 𝑁 ∗ , numere naturale n,m≤ [0,109]
Exemplu:
numere.in rez.out
14 15 1
15 14 1
13 15 0
10. Se citesc trei numere notate a,b și c. Scrieți un algoritm și un program C++ care să afișeze cel
mai mic număr citit.

Date de intrare: Fișerul text numere.in conține pe primul rând, trei numere întregi separate
printr-un spațiu
Date de ieșire: cel mai mic număr din fișerul de intrare se va scrie în fișierul minim.out
Restricții: a,b și c numere întregi, ce aparțin intervalului [-109,109]
Exemplu: dacă fișierul de intrare are forma de mai jos, atunci în fișerul de ieșire trebuie afișata
valoarea 5.
numere.in maxim.out
18 5 10 5

11. Se citesc trei numere, distincte, notate a,b și c. Scrieți un algoritm și un program C++ care să
afișeze suma dintre cel mai mic număr citit și cel mai mare număr citit.

Date de intrare: Fișerul text numere.in conține pe primul rând, trei numere întregi separate
printr-un spațiu
Date de ieșire: suma dintre cel mai mic număr citit și cel mai mare număr se va scrie în fișierul
suma.out
Restricții: a,b și c numere întregi, ce aparțin intervalului [-109,109]
Exemplu:
numere.in maxim.out
18 5 10 23

12. O broscută face în fiecare minut câte un salt. Lungimea primului salt este p, după care, fiecare
salt are lungimea dublă față de lungimea saltului anterior făcut. Realizați un program care afișează
distanta totala parcursa de broscuță în m salturi.

Date de intrare: Fișerul text broscuta.in conține pe primul rând, două numere naturale separate
printr-un spațiu și care reprezintă lungimea primului salt p și numărul de salturi m.
Date de ieșire: Fișierul broscuța.out conține un număr natural, care reprezintă distanța totală
parcursă de broscuță în cele m salturi.
Restricții: n∈ 𝑁 ∗ , număr natural n∈ [0,109]
Exemplu:
broscuța.in broscuța.out
2 4 30

Indicații:
primul salt are lungime => 2
al doilea salt are lungime dublă față de primul salt=>4 (22)
al treilea salt are lungime dublă față de al doilea salt=>8(23)
al patrulea salt are lungime dublă față de al treilea salt=>16(24)
2+4+8+16=21+22+23+24=30( se va utiliza relația 21+22+23+...+2m=2m+1-2)
(Centrul de Pregătire pentru Performanță Hai la Oimpiadă, clasa V, Iași)

S-ar putea să vă placă și