Professional Documents
Culture Documents
LUCRARE
DE
ATESTAT
Promoţia 2009-2010
Tablouri
Bidimensionale
(Matrici)
Cuprins:
Lucrare de atestat 1
CAPITOLUL I - Prezentarea lucră rii........................................3
Motivarea temei alese.................................................................3
CAPITOLUL V – Bibliografie.....................................................51
Lucrare de atestat 2
Motivarea temei alese
În limbajul Pascal, am ales tema „Tablouri bidimensionale”sau „Matrici”,
deoarece pe lâ ngă celelalte lecţii studiate la orele de informatică matricile mi-
au atras aţentia cel mai tare şi mi s-au pă rut cei mai interesanţi.
Lucrare de atestat 3
O matrice este un tabel cu elemente de acelaşi tip, dispuse pe linii şi coloane.
Datorită acestei aşeză ri a elementelor, o matrice este de fapt un tablou bidimensional.
Fiecare element al matricii se află pe o anumită linie şi pe o anumită coloană . Poziţia unui
element pe linie se mai numeşte şi indicele linie, iar poziţia elementului pe coloană se mai
numeşte şi indice de coloană .
1 1 5 7 4
2 2 3 8 9
3 6 10 1 0
linia
Se observă cum fiecare element e reprezentat de două coordonate. De exemplu
a[3,2] = 10, asta înseamnă că elementul de pe linia 3 şi coloana 4 este 10.
O variabilă matrice se declară asemă nă tor cu o variabilă vector, cu deosebirea că în
loc de numă rul maxim de elemente, trebuie sa preciză m două valori: numă rul maxim de
linii şi numă rul maxim de coloane.
Var <id_mat>:array[<tip1>,<tip2>]of <tip_e>;
<id_mat> indentificatorul (numele) variabilei matricei
<tip1>,<tip2> tipul inicilor de linie şi coloană
<tip_e> tipul elementelor matrici (shortin, integer, byte,
word, longint, real sau chiar char)
Un tip de date matrice este anonim, dar el poate fi denumit cu cuvâ ntul cheie type
(la fel ca tipurile vector).
EX: type mat=array [1..10,1..15] of real;
Var a:mat;
Tipul anonim array[1..10,1..15] of real a primit numele mat, apoi se declară variabila
matrice a ca fiind de tip mat.
Dacă am declarat o matrice a cu maxim 10 linii şi 15 coloane, asta nu înseamnă că
trebuie să folosim toate cele 150 de elemente ale sale. Aşa cum în cazul unui vector
defineam ca variabilă un numă r real de elemente (numă rul elementelor efectiv folosite), la
fel pentru o matrice a vom defini două variabile: un numă r real de linii şi un numă r real de
Lucrare de atestat 4
coloane, notate de obicei cu n şi m. În aceste condiţii, în mod implicit indicii de linie vor fi
1,2...n iar cei de coloană vor lua valori de la 1,2...m.
...................................
i=n j=1 a[n,1]
j=2 a[n,2]
....................................
j=m a[n,m]
Lucrare de atestat 5
Pentru j de la 1 la m execută
Citeşte (a[i,j])
Vom scrie o procedură prin care vom citi elementele unei matrici a. Vom declara o
variabilă pentru matricea a „matrice”, cu numere întregi, pentru a putea folosii matricea în
proceduri şi funcţii.
type matrice=array[1..100,1..100] of integer;
procedure citire_mat(n,m:integer;var a:matrice);
var i,j:byte;
begin
writeln(‘Dati numarul de linii’);
Readln(n);
Writeln(‘Dati numarul de coloane’)
Readln(m);
for i:=1 to n do
for j:=1 to m do
begin
writeln('Dati elementul de pe pozitia ',i,j);
readln(a[i,j]);
end;
end;
Observă m că la fiecare pas înainte de citirea propriu-zisă a elementului a[i,j] se
tipă reşte un mesaj care ne arată la ce element am ajuns cu citirea. Lungimea liniei şi
coloanei se citesc de asemenea de la tastatură .
În cazul unei matrici pă tratice citirea ei este exact aceaşi cu diferenţa că atâ t linile
câ t şi coloanele vor fi egale.
Lucrare de atestat 6
se gă sesc câ te m numere ce reprezintă elementele matricei, numere întregi, despă rţite
printr-un spaţiu.
Var a:matrice;
f:text;
i,j,n,m:integer;
Begin
Assign(f,’Date.in’); i se atribuie lui f fişierul date.in
Reset(f); se deschide fişierul f
Readln(f,n,m) se citesc numă rul de linii şi de coloane
For i:=1 to n do se parcurge fişierul
For j:=1 to m do
Read(f,a[i,j]); se citeşte numă rul din fişier şi in acelaşi timp el este pus
Close(f); în matrice pe poziţia a[i,j]
End;
End.
Meniul
Lucrare de atestat 7
Programul se deschide cu o interfaţă prietenoasă , ce ilustrează tema lucră rii, şi 3
exemple de matrici, realizate în modul grafic. Rolul acestei interfaţe este de al introduce şi
informa pe utilizator cu privire la tema programului.
Partea care îmbină toate elementele programului este meniul. Prin crearea acestuia
s-a fă cut posibilă navigarea acestui program într-un mod foarte simplu şi anume prin
apă sarea tastei corespunză toare obţiunii dorite.
Folosind tasta „0”, din interiorul programului, se face reîntoarcerea la meniul
anterior sau chiar ieşirea din program odată ajunşi la meniul principal.
Prin apă sarea tastei „5” în meniul principal se va apela submeniul Help care este
destinat pentru informarea utilizatorului despre program, acest meniu prezentâ nd
structura programului.
Generări de matrici
Generă ri matrici cu n linii şi m coloane (nxm)
Lucrare de atestat 8
b. Să se se scrie un subprogram care să genereze o matrice cu n linii şi m coloane astfel
încâ t, parcurgâ nd tabloul linie cu linie de sus în jos şi fiecare linie de la stâ nga la dreapta, să
se obţină şirul primelor n*m numere pare, ordonate crescă tor.
Exemplu: pentru n=4 şi m=3 se va genera urmă torul tablou:
0 2 4
6 8 10
12 14 16
18 20 22
La fel ca şi în problema anterioară se va folosi o variabilă
ajută toare şi care după ce este atribuită elementului de pe linia i şi coloana j creşte cu 2
unită ţi, deoarece diferenţa dintre 2 numere pare consecutive este 2.
Lucrare de atestat 9
begin
a[i,j]:=k; elementului de pe linia i şi coloana j i se atribuie valoarea k
inc(k); se creşte k cu o unitate
end
else dacă indicele liniei este impar atunci
for j:=m downto 1 do se începe parcurgea de la ultima coloană
begin
a[i,j]:=k; elementului de pe linia i şi coloana j i se atribuie valoarea k
0 0 0 0 0 0
0 1 1 1 1 0
0 1 2 2 1 0
0 1 2 2 1 0
0 1 1 1 1 0
0 0 0 0 0 0
Lucrare de atestat 10
for k:=1 to n div 2 do k ia valori de la 1 la jumă tate din n
for i:=1+k to n-k do Se parcurg linile si coloanele
for j:=1+k to n-k do se atribuie elementului a de pe linia i şi coloana j
a[i,j]:=k; valoarea k
end;
0 1 1 1 0
4 0 1 0 2
4 4 0 2 2
4 0 3 0 2
0 3 3 3 0
Se parcurge întreaga matrice şi pentru fiecare element
se verifică apartenenţa lui la una dintre cele 2 diagonale sau la una dintre cele patru zone
delimitate de diagonale, completâ ndu-l cu valoarea corespunză toare zonei din care face
parte. Matricea cu indicii liniei şi coloanei pentru n=5 arată aşa:
a11 a12 a13 a14 a15
a21 a22 a23 a24 a25
a31 a32 a33 a34 a35
a41 a42 a43 a44 a45
a51 a52 a53 a54 a55
Se observă că :
Elementele de pe diagonala principală sunt de forma a11, a22, adică indicele liniei şi
indicele coloanei sunt egale;
Elementele de pe diagonala secundară sunt de forma a15, a24, adică indicele liniei
adunat cu indicele coloanei ne dă întotdeauna n+1;
Elementele aflate deasupra celor 2 diagonale sunt de forma a12, a13, a23, adică indicele
liniei este mai mic decâ t indicele coloanei, şi suma celor 2 indici este mai mică decâ t n+1;
Elementele aflate sub cele 2 diagonale sunt de forma a43, a52, a53, adică indicele liniei
este mai mare decâ t indicele coloanei, şi suma celor 2 indici este mai mai mare decâ t n+1;
Elementele aflate în dreapta celor 2 diagonale sunt de forma a34, a25, a35, adică indicele
liniei este mai mic decâ t indicele coloanei, şi suma celor 2 indici este mai mai mare decâ t
n+1;
Lucrare de atestat 11
for j:=1 to n do begin
if (i=j)or(i+j=n+1) then a[i,j]:=0
else if (i<j)and(i+j<n+1) then a[i,j]:=1
else if (i<j)and(i+j>n+1) then a[i,j]:=2
else if (i>j)and(i+j>n+1) then a[i,j]:=3
else a[i,j]:=4;
end;
end;
1 0 0 0 0
2 1 0 0 0
3 2 1 0 0
4 3 2 1 0
5 4 3 2 1
Lucrare de atestat 12
d. Să se scrie un subprogram care să genereze o matrice cu n linii şi n coloane, o
matrice simetrică fata de diagonala secundară , ca în exemplu.
Exemplu: pentru n=5 se va genera urmă torul tablou:
1 2 3 4 5
2 3 4 5 4
3 4 5 4 3
4 5 4 3 2
5 4 3 2 1
Verificări
1. Să se scrie un subprogram care să verifice dacă o matricea citită de la tastatură este
opusă unei alte matrici citite de la tastatură . O matrice este opusa unei alte matrici dacă are
acelaşi grad şi dacă are toate elementele opuse elementelor celeilalte matrici.
Subprogramul va returna valoarea true dacă prima matrice este opusă celei de a doua şi
false dacă cele două matrici nu sunt opuse.
Exemplu: pentru matricea A şi B subrogramul va returna valoarea true iar pentru
matricea C şi D valoarea false:
1 1 1 1 -1 -1 -1 -1
1 2 1 1 -2 1
2 2 2 2 B= -2 -2 -2 -2 A= 2 C=
8 2 D= 5 -9 2
3 3 3 3 -3 -3 -3 -3
4 3 3 -2 3 7
4 4 4 4 -4 -4 -4 -4
Lucrare de atestat 13
Începem prin a pune problema dacă sunt de acelaşi grad. Astfel, compară m dacă
numă rul de linii şi coloane din prima matrice este egal cu numă rul de linii şi coloane din a
doua matrici. Se vor parcurge cele două matrici şi se observă că pentru a fi opuse elementul
de pe poziţia i, j din prima matrice A, adica a[i,j], trebuie să fie minus elementul de pe aceaşi
poziţie dar din matricea a doua B, b[i,j]. Astfel vom înmulţii elementele din matricea a doua
cu -1 şi dacă sunt egale cu elementele din prima matrice atunci cele două matrici sunt
opuse.
function verifica_opusa(var a,b:matrice;n,m,k,l:byte):boolean;
var i,j:byte;
begin
verifica_opusa:=true;
if (n=k) and (m=l) then begin
for i:=1 to n do
for j:=1 to m do
if a[i,j]<>b[i,j]*-1 then verifica_opusa:=false;
end;
1 2 1 1 2 4 1 2 1 1 1 8
A= B= 2 8 2 C=
2 8 3 2 8 2 D= 2 4 2
4 3 3 1 2 3 4 3 3 1 3 3
La fel ca în problema anterioară vom începe prin a studia gradele celor două matrici.
Vom parcurge matricile şi vom compara dacă elementul de pe linia i şi coloana j, a[i,j] este
egal cu elementul de pe linia j şi coloana i a celei de a doua matrici, b[j,i]. Unde A este prima
matrice iar B a doua matrice.
function verifica_transp(var a,b:matrice;n,m,k,l:integer):boolean;
var i,j:byte;
begin
verifica_transp:=true;
if (n=k)then begin
for i:=1 to n do
for j:=1 to n do
if a[i,j]<>b[j,i] then verifica_transp:=false;
end;
end;
Lucrare de atestat 14
3. Să se scrie un subprogram care să verifice dacă o matrice citită de la tastatură este o
matrice melc. O matrice melc este matricea ale că rei elemente sunt numere consecutive
aşezate circular începâ nd cu prima linie şi încheind cu elementul din mijlocul matricii.
Subprogramul va returna valoarea true dacă matricea dată este matrice melc şi false dacă
nu este matrice melc.
Exemplu: pentru matricea A subrogramul va returna valoarea true iar pentru
matricea B valoarea false.
1 2 3 1 2 1
A= 8 9 4 B= 4 9 4
7 6 5 7 5 5
Lucrare de atestat 15
Verificarea simetriei unei matrici
1 2 3 4 1 1 1 1
2 1 6 5
A= B= 2 2 2 2
3 6 1 4 1 1 1 1
4 5 4 1 2 2 2 2
Se observă că o matrice este simetrică dacă elementul de pe poziţia a1,2 este egal cu
elementul de pe poziţia a2,1, elementul de pe poziţia a1,3 este egal cu elementul de pe poziţia
a3,1 şi tot aşa, altfel spus, dacă elementul de pe poziţia ai,j este egal cu elementul de pe
poziţia aj,i
Lucrare de atestat 16
Function verifica_antisimetrica( var a:matrice;n,m:integer):boolean;
var i,j:byte;
begin
verifica_antisimetrica:=false;
for i:=1 to n-1 do
for j:=1+i to m do
if a[i,j]=-a[j,i] then verifica_antisimetrica:=true;
end;
1 5 5 1 1 1 1 1
2 6 6 2
A=
3 7 7 3
B= 2 2 3 3
3 3 2 2
4 8 8 4 1 1 1 1
1 2 3 4 1 1 1 1
5 6 7 8 2 2 3 3
A= 5 6 7 8
B=
3 3 2 2
1 2 3 4 1 1 1 1
Lucrare de atestat 17
function simetrie_orizontala(var a:matrice;n,m:integer):boolean;
var vb:boolean;i,j:byte;
begin
vb:=true;
for i:=1 to n div 2 do
for j:=1 to m do
if a[i,j]<>a[n-i+1,j] then vb:=false;
simetrie_orizontala:=vb;
end;
1 2 3 4 1 1 1
5 6 7 8 B= 2 2 2
A= 3 3 3
9 10 11 12
13 14 15 16 1 1 1
Lucrare de atestat 18
if (n=1)and(m<>1) then verifica_3:=true;
end;
c. Să se scrie un subprogram care să verifice dacă matricea citită de la tastatură este o
matrice coloană . O matrice este coloană dacă are o coloană şi n linii. Subprogramul va
returna valoarea true dacă matricea este coloană şi false dacă matricea nu este coloană .
Exemplu: pentru matricea A subrogramul va returna valoarea true iar pentru
matricea B valoarea false:
1
2 1 2 1
A= B= 1 1 1
3
1 1 2 1
0 0 0 1 2 1
A= 0 0 0 B= 1 1 1
0 0 0 1 2 1
Lucrare de atestat 19
Exemplu: pentru matricea A subrogramul va returna valoarea true iar pentru
matricea B valoarea false:
1 0 0 1 2 1
A= 0 1 0 B= 1 1 1
0 0 1 1 2 1
Lucrare de atestat 20
if vb=true then
for i:=1 to n do
for j:=1 to m do
if (i<>j)and (a[i,j]<>0) then vb:=false;
verifica_diag:=vb;
end;
Vom pune coniţia să fie pă tratică si vom studia dacă elementele de sub diagonala
principală sunt nule.
1 0 0 1 2 1
A= 1 2 0 B= 1 1 1
3 4 3 1 2 1
Lucrare de atestat 21
Ca şi în problema anterioară vom pune coniţia să fie pă tratică dar de data aceasta
vom studia dacă elementele aflate deasupra diagonalei principale sunt nule.
În cazul matrici de ordin 3 vom pă stra aceaşi idee de calcul, vom folosi formula
matematică , diferită de cea pentru determinanţii de ordin 2.
Lucrare de atestat 22
s:real;
begin
det2:=true;
for i:=1 to 3 do
for j:=1 to 3 do
s:=a[1,1]*a[2,2]*a[3,3]+a[2,1]*a[3,2]*a[1,3]+a[3,1]*a[1,2]*a[2,3]
-a[3,1]*a[2,2]*a[1,3]-a[1,1]*a[3,2]*a[2,3]-a[2,1]*a[1,2]*a[3,3];
If s=0 then det3:=false;
end;
Operaţii cu matrici
Adunarea a două matrici
Să se scrie un subprogram care să calculeze suma a două matrici, subprogramul va
returna o a treia matrice formata din suma celor 2.
Exemplu: pentru matricea A adunată cu matricea B, subprogramul va returna o a 3
matrice C:
1 1 1 2 2 2 3 3 3
A= 1 1 1 B= 4 4 4
C= 5 5 5
1 1 1 6 6 6 7 7 7
Pentru
ca două matrici să se poată aduna trebuie ca cele două matrici să fie de acelaşi grad.
Observă m că elementul c[i,j] este egal cu suma dintre elemenetul de pe poziţia a[i,j] şi
elementul de poziţia b[i,j].Astfel, c[1,1]=b[1,1]+b[2,2] adica 3=2+1. Pentru că subprogramul
trebuie să returneze o matrice vom folosi o procedură .
Lucrare de atestat 23
Scă derea a două matrici
Să se scrie un subprogram care să calculeze scă derea a două matrici, subprogramul
va returna o a treia matrice formată din diferenţa celor 2.
Exemplu: pentru matricea A din care se scade matricea B, subprogramul va returna
o a 3 matrice C:
4 2 4 2 2 2 2 0 2
A= 3 1 3 B= 4 4 4 C= -1 -3 -1
8 7 8 6 6 6 2 1 2
Lucrare de atestat 24
Produsul unei matrici cu un scalar
Să se scrie un subprogram care să calculeze produsul unei matrici cu un scalar dat
de la tastatură , subprogramul va returna o a doua matrice.
Exemplu: pentru matricea A din înmulţită cu scalarul X=3, subprogramul va
returna matricea C:
A= 1 2 C= 3 6
1 1 3 3
Ideea de rezolvare a problemei este ca fiecare element al matrici A să se înmulţească
cu scalarul dat.
A= 1 2 B= 1 4
4 1 2 1
Lucrare de atestat 25
Ş tergerea liniei sau coloanei unei matrici
a. Să se scrie un subprogram care să şteargă o linie citită de la tastatură .
Exemplu: pentru matricea A, subprogramul, în urma ştergerii liniei 2 va afişa
matricea B.
A= 1 4 2 B= 1 4 2
4 5 1
Pentru a şterge o linie a matrici, vom parcurge linile tabloului începâ nd de la linia ce
se vrea a fi ştersă pâ nă la n-1, iar parcurgerea coloanelor se face ca în mod normal. Fiecă rui
element îi vom schimba valoarea cu valoarea elementului de pe linia urmă toare dar aceaşi
coloană . În final vom scă dea numă rul linilor cu 1. Practic idea de ştergere a liniei este să îi
dă m elementelor de pe linii valoarea elementelor de pe liniile consecutive şi la afişare să
afişam n-1 linii. Adică dacă se vrea a fi ştersă prima linie a unei matrici de ordin 3, atunci
programul va da elementelor de pe prima linie valorile elementelor de pe linia 2, iar
elementelor de pe a 2 linie valorile elementelor de pe a 3 linie, în final scă dem numă rul
linilor cu o unitate.
1 1 2 1 2
A= 2 1 1 B= 2 1
1 2 1 1 1
Vom proceda la fel ca în cazul ştergerii unei linii cu diferenţa că de data aceasta
vom lucra pe coloane.
Lucrare de atestat 26
procedure stergere_2(var a:matrice;n,m,k:integer);
var i,j:byte;
begin
writeln('dati coloana care se vrea a fi stersa');
readln(k);
for i:=1 to n do
for j:=k to m-1 do
a[i,j]:=a[i,j+1];
m:=m-1;
end;
Lucrare de atestat 27
Minorii unei matrici
Să se scrie un subprogram care să afişeze minorii de n-1ai unei matrici.
Exemplu: pentru matricea A, subprogramul va afişa urmă torii minori:
1 2 3 5 4 6 4 6 5 2 3
A= 6 5 4 8 9 7 9 7 8 8 9
7 8 9
1 3 1 2 2 3 1 3
7 9 7 8 5 4 6 4
1 2
6 5
Vom folosi ştergerea liniei şi coloanei explicate mai sus, şi după fiecare ştergere a
unei liniii şi a unei coloane, vom afişa matricea iar după fiecare afişare vom iniţializa din
nou matricea.
Lucrare de atestat 28
Calcularea determinantului unei matrici
Să se scrie 2 subprograme care să calculeze determinantul unei matricei citite de la
tastatură . Se vor studia două cazuri determinatul matricilor de ordin 2 şi 3.
Exemplu: pentru matricea A de ordin 2 subrogramul va returna valoarea -2 iar
pentru matricea B de ordin 3 subprogramul va returna valoarea valoarea 0.
1 1 1
A= 3 4 B= 6 5 4
5 6
3 3 3
Matrici de ordin 2
Matrici de ordin 3
Lucrare de atestat 29
Odonarea lexicografică a matricilor după linie/coloană
Să se scrie un subprograme care să afişeze matricea dată ordonată lexicografic după
elementele linilor.
Exemplu: pentru matricea A subrogramul va afişa matricea B.
4 2 1 1 2 4
A= 6 5 4 B= 4 5 6
3 5 7 3 5 7
Vom parcurge linile, unde k reprezintă numă rul de linii ce trebuiesc parcurse, şi
facem o sortare crescă toare a elementelor.
Lucrare de atestat 30
aux:=a[i,k];
a[i,k]:=a[j,k];
a[j,k]:=aux;
end;
end;
Vom parcurge matricea linie cu linie şi coloană cu coloană şi vom compara toate
elementele din matrice, câ nd gă sim ceva mai mare atunci variabila max va lua valoarea
elementului favorabil.
Lucrare de atestat 31
Matrici rare
Matricile rare sunt acele matrici care conţin în mare parte elemente nule. Adică ,
vorbim de matrici de dimensiuni mari (de ex: 100*100), care au în proporţie de 80%
elemente nule.
În acest caz declararea obişnuită este nefavorabilă din mai multe puncte de vedere:
1. Memoria este ocupată într-o proporţie mai mare decâ t este nevoie.
2. Elementele trebuie introduse fiecare pe râ nd, inclusiv cele nule, ceea ce nu este
de dorit.
3. Matricea rară , fiind o matrice de dimensiuni mari, nu vom putea declara o
matrice atâ t de mare înâ t să acoperim toate posibilită ţiile.
Astfel, este de preferat o metodă prin care să fie introduse toate elementele diferite
de 0, împreună cu locaţiile lor, dar în aşa fel încâ t acestea să poată fi folosite ca în cadul unei
matrici normale.
Vom folosi un fişier text în care pe prima linie să fie scris numă rul de linii şi coloane,
practic numă rul de elemente, iar pe urmatoarele linii, linia, coloana şi valoarea elementului
nenul de pe respectiva poziţie. Astfel ,în fişier vor apă rea doar numerele nenule, împreună
cu poziţia pe care se află .
Vom crea fişierul Rare.in, ce va fi folosit pentru rezolvarea tuturor problemelor din
secţiunea matricilor rare şi care va avea urmatoarea structură :
Rare.in
100 80 numă rul de linii şi coloane
10 40 3
2 2 5 a[10,40]=3, a[2,2]=5, a[7,60]=-2 ….
7 60 -2 Prima valoare este indicele liniei, a doua valoare indicele
40 40 7 coloanei iar a treia valoare este valoarea elementului de
23 5 -1 pe poziţia respectivă .
După cum am mai vă zut elementele de pe diagonala principală au indicele liniei egal
cu indicele coloanei. Astfel, vom parcurge fişierul, vom reţine în 3 variabile, linia, coloana şi
elementul, iar dacă linia este egală cu coloana in variabila S se adună elementul.
procedure suma_2;
var n,m,i,j,x,sum:integer;
f:text;
Lucrare de atestat 32
begin
sum:=0;
assign(f,'Rare.in');
reset(f);
readln(f,n,m);
while not seekeof(f) do begin
readln(f,i,j,x);
if i=j then sum:=sum+x;
end;
close(f);
Writeln('Suma elementelor de pe diagonala principala este: ',sum);
end;
Vom parcurge fişierul, iar pentru fiecare coloană impară gă sită se adună elemenul
corespunză tor ei.
procedure suma_1;
var n,m,i,j,x,sum:integer;
f:text;
begin
sum:=0;
assign(f,'Rare.in');
reset(f);
readln(f,n,m);
while not seekeof(f) do begin
readln(f,i,j,x);
if j mod 2<>0 then sum:=sum+x;
end;
close(f);
Writeln('Suma elementelor de pe coloane impare este: ',sum);
end;
Lucrare de atestat 33
Determinarea maximului din matrice
Să se scrie un subprogram care să determine maximul din matrice.
Exemplu: pentru matricea citită din fişierul Rare.in, subrogramul va afişa valoarea
cea mai mare din fişier adică 7.
procedure max_rare;
var n,m,i,j,x,max:integer;
f:text;
begin
max:=0;
assign(f,'Rare.in');
reset(f);
readln(f,n,m);
while not seekeof(f) do begin
readln(f,i,j,x);
if x>max then max:=x;
end;
Writeln('Maximul din matrice este:',max);
end;
procedure min_rare;
var n,m,i,j,x,min:integer;
f:text;
begin
min:=0;
assign(f,'Rare.in');
reset(f);
readln(f,n,m);
while not seekeof(f) do begin
readln(f,i,j,x);
if x<min then min:=x;
end;
close(f);
Writeln('Minimul din matrice este: ',min);
end;
Lucrare de atestat 34
Să se scrie un subprogram care să determine numă rul de elemente impare din
matrice.
Exemplu: pentru matricea citită din fişierul Rare.in, subrogramul va afişa valoarea
4 (matricea avâ nd elemente impare pe 3, 5, 7, -1).
procedure impare_rare;
var n,m,i,j,x,k:integer;
f:text;
begin
k:=0;
assign(f,'Rare.in');
reset(f);
readln(f,n,m);
while not seekeof(f) do begin
readln(f,i,j,x);
if x mod 2<>0 then inc(k);
end;
close(f);
Writeln('Numarul elementelor impare din matrice: ',k);
end;
procedure nr_rare;
var n,m,i,j,x,k,a,b:integer;
f:text;
begin
repeat
writeln('Se citesc capetele intervalului');
writeln('Dati capul intervalului');
readln(a);
writeln('Dati coada intervalului');
readln(b);
if a>b then
writeln('Interval incorect');
until(a<b);
k:=0;
assign(f,'Rare.in');
reset(f);
readln(f,n,m);
Lucrare de atestat 35
while not seekeof(f) do begin
readln(f,i,j,x);
if (x>=a)and(x<=b) then inc(k);
end;
close(f);
Writeln('Numarul de elemente din [',a,',', b,']:',k);
end;
Lucrare de atestat 36
uses Crt,graph;
type matrice=array[1..100,1..100] of integer;
procedure interfata;
var grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
s:string;
i,j,xx:integer;
begin
grDriver := Detect;
InitGraph(grDriver, grMode,'d:\limbaje\bp7\bgi\');
ErrCode := GraphResult;
if ErrCode = grOk then
begin
moveto(190,130);
setcolor(11);
setbkcolor(black);
settextstyle(1,0,1);
setusercharsize(2,1,2,1);
outtext('Matrici');
settextstyle(8,0,1);
setcolor(9);
moveto(180,210);
outtext('Tablouri bidimensionale');
setcolor(9);
line(100,420,220,420);
line(100,420,100,300);
line(100,300,220,300);
line(220,300,220,420);
line(130,420,130,300);
line(160,420,160,300);
line(190,420,190,300);
line(100,330,220,330);
line(100,360,220,360);
line(100,390,220,390);
setcolor(11);
settextstyle(3,0,1);
for i:=0 to 3 do
for j:=0 to 3 do
begin
randomize;
xx:=random(2);
str(xx,s);
outtextxy(110+30*(i mod 4),300+30*(j mod 4),s);
Lucrare de atestat 37
delay(500);
end;
setcolor(9);
line(250,420,370,420);
line(250,420,250,300);
line(250,300,370,300);
line(370,300,370,420);
line(280,420,280,300);
line(310,420,310,300);
line(340,420,340,300);
line(250,330,370,330);
line(250,360,370,360);
line(250,390,370,390);
setcolor(11);
settextstyle(3,0,1);
for j:=0 to 3 do
for i:=0 to 3 do
begin
randomize;
xx:=random(5);
str(xx,s);
outtextxy(260+30*(i mod 4),300+30*(j mod 4),s);
delay(500);
end;
setcolor(9);
line(400,420,520,420);
line(400,420,400,300);
line(400,300,520,300);
line(520,300,520,420);
line(430,420,430,300);
line(460,420,460,300);
line(490,420,490,300);
line(520,330,400,330);
line(520,360,400,360);
line(520,390,400,390);
setcolor(11);
for i:=1 to 4 do
for j:=1 to 4 do
begin
randomize;
xx:=random(1);
str(xx,s);
outtextxy(410+30*(i mod 4),300+30*(j mod 4),s);
delay(500);
end;
moveto(150,440);
Lucrare de atestat 38
setcolor(4);
settextstyle(11,0,1);
setusercharsize(3,2,3,5);
outtext('Apasati ENTER pentru a intra in meniu...');
Readln;
CloseGraph;
end;
end;
var n,i,j,k,m,l,sum:integer;
a,c,B:matrice;
opt,o:byte;
x,y,t:char;
d:real;
f:text;
grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
begin
interfata;
textcolor(white);
textbackground(black);
clrscr;
repeat
textcolor(10);
gotoxy(2,2);
writeln('Sunteti in meniul principal');
gotoxy(30,8);
writeln('Alegeti optiunea:');
gotoxy(26,10);
textcolor(white);
writeln('1. Generari de matrici');
gotoxy(26,12);
writeln('2. Verificari de matrici');
gotoxy(26,14);
writeln('3. Operatii cu matrici');
gotoxy(26,16);
writeln('4. Matrici rare');
gotoxy(26,18);
Writeln('5. Help');
gotoxy(26,20);
writeln('0. Iesire');
textcolor(green);
Lucrare de atestat 39
gotoxy(15,24);
readln(opt);
textcolor(white);
case opt of
1:begin
clrscr;
repeat
textcolor(10);
gotoxy(2,2);
writeln('Sectiunea generari de matrici:');
gotoxy(29,10);
writeln('Alegeti optiunea:');
gotoxy(26,12);
textcolor(white);
writeln('1. Generare matrici nxm');
gotoxy(26,14);
writeln('2. Generare matrici patratice');
gotoxy(26,16);
writeln('0. Intoarcere');
textcolor(green);
gotoxy(15,24);
readln(o);
textcolor(white);
case o of
1:begin
clrscr;
repeat
textcolor(10);
gotoxy(2,2);
writeln('Sectiunea generari de matrici nxm');
gotoxy(28,9);
writeln('Alegeti optiunea:');
gotoxy(26,11);
textcolor(white);
writeln('a. Generare#1');
gotoxy(26,13);
writeln('b. Generare#2');
gotoxy(26,15);
writeln('c. Generare#3');
gotoxy(26,17);
writeln('0. Intoarcere');
textcolor(green);
gotoxy(15,24);
readln(x);
textcolor(green);
case x of
Lucrare de atestat 40
'a': generare_1(a,n,m);
'b': generare_2(a,n,m);
'c': generare_3(a,n,m);
end;
clrscr;
textcolor(white);
until x='0';
end;
2:begin
clrscr;
repeat
textcolor(10);
gotoxy(2,2);
writeln('Sectiunea generari de matrici patratice');
gotoxy(27,9);
writeln('Alegeti optiunea:');
textcolor(white);
gotoxy(25,11);
writeln('a. Generare#1');
gotoxy(25,13);
writeln('b. Generare#2');
gotoxy(25,15);
writeln('c. Generare#3');
gotoxy(25,17);
writeln('d. Generare#4');
gotoxy(25,19);
writeln('0. Intoarcere');
textcolor(green);
gotoxy(15,24);
readln(x);
textcolor(white);
case x of
'a':generarep_4(a,n);
'b':generarep_5(a,n);
'c':generarep_6(a,n);
'd':generarep_7(a,n);
end;
clrscr;
until x='0';
end;
end;
clrscr;
until o=0;
end;
2:begin
clrscr;
Lucrare de atestat 41
repeat
gotoxy(2,2);
textcolor(10);
Writeln('Sectiunea verificari');
gotoxy(24,7);
writeln('Alegeti optiunea:');
textcolor(white);
gotoxy(15,9);
writeln('1. Se verifica simetria unei matrici');
gotoxy(15,11);
writeln('2. Se verifica natura matricii');
gotoxy(15,13);
writeln('3. Se verifica daca matricea A este opusa matricii B');
gotoxy(15,15);
writeln('4. Se verifica daca matricea A este transpusa matricii B');
gotoxy(15,17);
writeln('5. Se verifica daca e triunghiulara');
gotoxy(15,19);
writeln('6. Se verifica daca e matrice melc');
gotoxy(15,21);
writeln('7. Se verifica daca e inversabila');
gotoxy(15,23);
writeln('0. Intoarcere');
textcolor(green);
gotoxy(15,24);
readln(o);
textcolor(white);
case o of
1:begin
clrscr;
repeat
gotoxy(2,2);
textcolor(10);
writeln('Sectiunea verifica simetria');
gotoxy(7,9);
writeln('Alegeti optiunea');
gotoxy(5,11);
textcolor(white);
writeln('a. Se verifica daca matricea e simetrica fata de diagonala principala');
gotoxy(5,13);
writeln('b. Se verifica daca matricea este antisimetrica');
gotoxy(5,15);
writeln('c. Se verifica daca matricea e simetrica fata de linia de mijloc verticala');
gotoxy(5,17);
writeln('d. Se verifica daca matricea e simetrica fata de linia de mijloc orizontala');
gotoxy(5,19);
Lucrare de atestat 42
writeln('0. Intoarcere');
textcolor(green);
gotoxy(15,24);
readln(x);
textcolor(white);
case x of
'a':verifica_1(a,n,m);
'b':verifica_antisimetrica(a,n,m);
'c':simetrie_verticala(a,n,m);
'd':simetrie_orizontala(a,n,m);
end;
clrscr;
until x='0';
end;
2:begin
clrscr;
repeat
gotoxy(2,2);
textcolor(10);
writeln('Sectiunea verifica natura matricii');
gotoxy(27,7);
writeln('Alegeti optiunea:');
gotoxy(25,9);
textcolor(white);
writeln('a. Matrice nula');
gotoxy(25,11);
writeln('b. Matrice linie');
gotoxy(25,13);
writeln('c. Matrice coloana');
gotoxy(25,15);
writeln('d. Matrice patratica');
gotoxy(25,17);
writeln('e. Matrice unitate');
gotoxy(25,19);
writeln('f. Matrice diagonala');
gotoxy(25,21);
writeln('0. Intoarcere');
textcolor(green);
gotoxy(15,24);
readln(x);
textcolor(white);
case x of
'a':verifica_2(a,n,m);
'b':verifica_3(a,n,m);
'c':verifica_4(a,n,m);
'd':verifica_5(a,n,m);
Lucrare de atestat 43
'e':verifica_uni(a,n,m);
'f':verifica_diag(a,n,m);
end;
clrscr;
until x='0';
end;
3:verifica_opusa(a,b,n,m,k,l);
4:verifica_transp(a,b,n,m,k,l);
5:begin
clrscr;
repeat
gotoxy(2,2);
textcolor(10);
writeln('Sectiunea verifica triunghiulara');
gotoxy(25,9);
writeln('Alegeti optiunea:');
gotoxy(23,11);
textcolor(white);
writeln('a. Triunghiulara superior');
gotoxy(23,13);
writeln('b. Triunghiulara inferior');
gotoxy(23,15);
writeln('0. Intoarcere');
textcolor(green);
gotoxy(15,24);
readln(x);
textcolor(white);
case x of
'a':verifica_tri_sup(a,n,m);
'b': verifica_tri_inf(a,n,m)
end;
clrscr;
until x='0';
end;
6:verifica_melc(a,n,m);
7:begin
clrscr;
repeat
textcolor(10);
gotoxy(2,2);
writeln('Sectiunea verificare inversabila');
gotoxy(28,9);
writeln('Alegeti o optiunea:');
gotoxy(26,11);
textcolor(white);
writeln('a. Matrice de ordinul 2');
Lucrare de atestat 44
gotoxy(26,13);
writeln('b. Matrice de ordinul 3');
gotoxy(26,15);
writeln('0. Intoarcere');
textcolor(green);
gotoxy(15,24);
readln(x);
textcolor(white);
case x of
'a':verif_inv2(a,n,m);
'b':verif_inv3(a,n,m);
end;
clrscr;
until x='0';
end;
end;
clrscr;
until o=0;
end;
3:begin
clrscr;
repeat
gotoxy(2,2);
textcolor(10);
writeln('Sunteti in sectiunea operatii cu matrici:');
gotoxy(25,4);
writeln('Alegeti optiunea:');
gotoxy(23,5);
textcolor(white);
writeln('1. Adunarea a 2 matrici');
gotoxy(23,7);
writeln('2. Scadeare a 2 matrici');
gotoxy(23,9);
writeln('3. Produsul a 2 matrici');
gotoxy(23,11);
writeln('4. Produsul unei matrici cu un scalar');
gotoxy(23,13);
writeln('5. Transpusa unei matrici');
gotoxy(23,15);
writeln('6. Stergere');
gotoxy(23,17);
writeln('7. Calcularea determinantului');
gotoxy(23,19);
writeln('8. Ordonare lecicografica');
gotoxy(23,21);
writeln('9. Determinare min si max din matrice');
Lucrare de atestat 45
gotoxy(23,23);
writeln('10. Minorii matricii');
gotoxy(23,25);
writeln('0. Intoarcere');
textcolor(green);
gotoxy(15,26);
readln(o);
textcolor(white);
case o of
1: suma(a,b,n,m,k,l,c);
2:diferenta(a,b,n,m,k,l,c);
3:produs(a,b,n,m,k,l,c);
4:prod_scalar(a,n,m,k,c);
5:transpusa(a,n,m);
6:begin
clrscr;
repeat
textcolor(10);
gotoxy(2,2);
writeln('Sectiunea stergere');
gotoxy(25,9);
writeln('Alegeti o optiune');
gotoxy(23,11);
textcolor(white);
writeln('a. Stergerea liniei');
gotoxy(23,13);
writeln('b. Stergerea coloanei');
gotoxy(23,15);
writeln('c. Stergerea liniei si coloanei');
gotoxy(23,17);
writeln('0. Intoarcere');
textcolor(green);
gotoxy(15,24);
readln(x);
textcolor(white);
clrscr;
case x of
'a':stergere(a,n,m,k);
'b':stergere_2(a,n,m,k);
'c': stergere_3(a,n,m,k,l);
end;
clrscr;
until x='0';
end;
7:begin
clrscr;
Lucrare de atestat 46
repeat
gotoxy(2,2);
textcolor(10);
writeln('Sectiunea determinant');
gotoxy(27,9);
writeln('Alegeti o optiune');
gotoxy(25,11);
textcolor(white);
writeln('a. Matrici de ordin 2');
gotoxy(25,13);
writeln('b. Matrici de ordin 3');
gotoxy(25,15);
writeln('0. Pentru intoarcere');
textcolor(green);
gotoxy(15,24);
readln(x);
textcolor(white);
clrscr;
case x of
'a':begin
clrscr;
gotoxy(5,5);
writeln('Se citeste matricea');
n:=2;
citire_mat_patrat(n,a);
clrscr;
d:=det2(a);
gotoxy(10,2);
textcolor(11);
writeln('D=',d:8:2);
textcolor(12);
writeln;
writeln('Apasati o tasta pentru a continua...');
textcolor(green);
readln;
textcolor(white);
end;
'b':begin
clrscr;
gotoxy(5,5);
writeln('Se citeste matricea');
n:=3;
citire_mat_patrat(n,a);
clrscr;
d:=det3(a);
gotoxy(10,2);
Lucrare de atestat 47
textcolor(11);
writeln('D=',d:8:2);
textcolor(12);
writeln;
writeln('Apasati o tasta pentru a continua...');
textcolor(green);
readln;
textcolor(white);
end;
end;
clrscr;
until x='0';
end;
8:begin
clrscr;
repeat
gotoxy(2,2);
textcolor(10);
writeln('Sectiunea ordonare lexicografica');
gotoxy(25,9);
writeln('Alegeti o optiune');
gotoxy(23,11);
textcolor(white);
writeln('a. Ordonarea lexicografica a elementelor de pe linii');
gotoxy(23,13);
writeln('b. Ordonarea lexicografica a elementelor de pe coloane');
gotoxy(23,15);
writeln('0. Intoarcere');
textcolor(green);
gotoxy(15,24);
readln(x);
textcolor(white);
clrscr;
case x of
'a':ordonare_linie(a,n,m);
'b':ordonare_coloana(a,n,m);
end;
clrscr;
until x='0';
end;
9:begin
clrscr;
repeat
gotoxy(2,2);
textcolor(10);
writeln('Sectiunea determinare min si max');
Lucrare de atestat 48
gotoxy(25,9);
writeln('Alegeti o optiune');
gotoxy(23,11);
textcolor(white);
writeln('a. Determinarea minimului din matrice');
gotoxy(23,13);
writeln('b. Determinarea maximului din matrice');
gotoxy(23,15);
writeln('0. Intoarcere');
textcolor(green);
gotoxy(15,24);
textcolor(green);
readln(x);
textcolor(white);
clrscr;
case x of
'a':minim(a,n,m);
'b':maxim(a,n,m);
end;
clrscr;
until x='0';
end;
10:minori(a,b,n,m,k,l);
end;
clrscr;
until o=0;
end;
4:begin
clrscr;
repeat
gotoxy(2,2);
textcolor(10);
writeln('Sunteti in sectiunea matrici rare:');
gotoxy(28,8);
writeln('Alegeti optiunea:');
gotoxy(23,10);
textcolor(white);
writeln('1. Suma elementelor de pe diagonala principala');
gotoxy(23,12);
writeln('2. Suma elementelor de pe coloane impare');
gotoxy(23,14);
writeln('3. Maximul din matrice');
gotoxy(23,16);
writeln('4. Minimul din matrice');
gotoxy(23,18);
writeln('5. Numarul de elemente impare din matrice');
Lucrare de atestat 49
gotoxy(23,20);
writeln('6. Numarul de elemente din intervalul [a,b]');
gotoxy(23,22);
writeln('0. Intoarcere');
textcolor(green);
gotoxy(15,24);
readln(o);
textcolor(white);
case o of
1:suma_2;
2:suma_1;
3:max_rare;
4:min_rare;
5:impare_rare;
6:nr_rare;
end;
clrscr;
until o=0;
end;
5:help;
end;
until(opt=0);
end.
CAPITOLUL V Bibliografie
Lucrare de atestat 50
Manual de clasa a X-a intensiv;
Autor: George Daniel Mateescu, Pavel Florin Moraru
Manual de clasa a XI-a neintensiv;
Autor: George Daniel Mateescu, Pavel Florin Moraru
Informatică intensiv: Manual pentru clasa a XI-a
Autor: Mariana Milosescu
Lucrare de atestat 51