Sunteți pe pagina 1din 15

MINISTERUL EDUCAȚIEI AL REPUBLICII MOLDOVA

CENTRUL DE EXCELENȚĂ ÎN INFORMATICĂ


ȘI TEHNOLOGII INFORMAȚIONALE

Raport
pentru practica de iniţiere în specialitate
tema : 20 Lăcusta
Introducere

Obiectivele generale ale practicii de iniţiere în specialitate sunt următoarele:

* Consolidarea cunoştinţelor teoretice, obţinute pe întreg parcurs de instruire la


capitolul Programării Orientate pe Obiecte, utilizarea claselor, obiecelor și aplicarea lor
în practică.

* Însuşirea tehnologiilor eficiente de elaborare a unui program cu ajutorul obiectelor,


precum și perfecționarea elaborării programelor cu ajutorul limbajului de programare
C++ și platform IDE( Integrated Development Environment) – Code::Bloks.

* Dezvoltarea abilităţilor muncii de sine stătător şi în echipă;

* Formarea deprinderilor de cercetător( utilizaarea surselor internet, manual, etc.);

Competenţe specifice practicii de iniţializare în specialitate:


1. Analiza structurală a problemei în studiu.

2. Proiectarea descendentă a algoritmilor.

3. Aplicarea principiilor programării orientate pe obiecte în scrierea algoritmilor.

4. Utilizarea obiectelor în soluționarea problemelor.

5. Utilizarea tehnicilor eficiente la elaborare algoritmilor şi subprogramelor respective.

6. Gestionarea informaţiei utilizând resursele internet, manual și alte resurse


informaționale.

2
Cuprins

Enunțul sarcinii individuale........................................................................................................4


Decrierea modului de lucru.........................................................................................................5
Listingul programului................................................................................................................. 6
Rezultatele testării subprogramelor..........................................................................................12
Concluzii.................................................................................................................................. 14
Bibliografie............................................................................................................................... 15

3
Enunțul sarcinii individuale
20. Lăcusta Se consideră un teren agricol( figura 1) modelat printr-un tabel bidimesional
A[1..n][1..m] cu valori numere natural , care reprezintă unități condiționale de cereal, care pot
fi recoltate din zonele respective.
Datele, referitoare la metricea A, sunt înregistrate în fișierul
text Lacusta.in, care conține pe prima sa linie numerele
natural n și m, separate prin spațiu. Pe următoarele n linii ale
fișierului este reprezentată matricea A – pe fiecare linie câte
m numere naturale, separate prin spațiu.
Să se elaboreze un program care, folosind meniurile și
subprograme, să se realizeze, la solicitarea utilizatorului
următoarele prescripții:
1) 1) Înserează în matricea A o nouă linie/coloană; aleasă și
numărul liniei/coloanei de înserat se va indica de la
tastatură;
2) Exclude din matricea A linia și coloana la intersecția căror se află primul element minim
întâlnit la parcurgere pe coloane a elementelor acestei matrice;
3) Determină în câte rânduri ale matricei A există elementul maximal;
4) Calculează media aritmetică a elementelor de pe fiecare linie a matricei A;
5) Sorteză descrescător elementele fiecărei coloane ale matricei A prin metoda interclasării;
6) Creează fișierul Prime.txt cu n linii prin copierea doar a numerelor prime din liniile
respective ale matricei A;
7) Determină dacă în component matricei A există un pătrat magic de dimensiue k≥2, adică
sumele elementelor de pe linii, coloane și diagonalele pătratului sunt egale; în caz afirmativ la
ecran se va afișa mesajul DA, coordonatele colțului srânga-sus și dimesiunea k a pătratului
găsit, altfel se va afișa mesajul NU;
8) Rezolvă problema. Se consideră terenul agricol, modelat prin matricea A, descrisă mai sus.
În colțul stânga-sus al acestui teren se află o lăcustă- insect, care dăunează foarte mult
agriculturii, distrugând definitive cerialele din zonele atacate de ea.
Fie lăcusta are de traversat terenul in studiu pornind de colțul stânga-sus la colțul drepta-jos. O
traversare constă din mai multe traversări. La fiecare deplasare lăcusta execută un salt pe
orizontală și un pas pe verticală. Un salt înseamnă că lăcusta trece de la o celulă la oricare alta
aflată pe aceeași linie, iar un pas înseamnă că insect trece de la o celulă la celula aflată imediat
sub ea. Excepția ar putea face ultima deplasare, care, eventual, ar putea să se reducă doar la un
salt de la o celulă a ultimii linii la celula finală, situate în colțul dreapt-jos a terenului. Scrieți
un subprogram care, dintre toate traseele posibile ale lăcuste, va găsi unul pentru care
cantitatea sumară a cerialelor distruse va fi minimală.
Date de intrare: Fișierul textual Lacusta.in.
Date de ieșire: Fișierul de ieșire Lacusta.out va conține o singură linie pe care va fi scrisă
suma mininmă găsită.
Lacusta.in Lacusta.out Explicație Restricții:
45 28 Drumul este: 1≤ m, n ≤ 100
3447 9 (1,1)->(1,3)-> 1 ≤ A[i, j] ≤ 255
66344 (2,3)->(2,2)-> Timpul maxim de execuție/test:
63396 (3,2)->(3,3)-> 1 secundă

4
65382 (4,3)->(4,5)

Decrierea modului de lucru

Programul va utiliza o clasă meniu care va conține un set de subprogram, fiecare subprogram
al clasei reprezintă o prescripție/comandă a utilizatorului. La comanda utilizatorului se va
executa apelul unui subprogram care va rezolva sarcina propusă și va genera un răspuns.

La dispoziția utilizatorului va fi următorul meniu:

------------------------------------------------MENIU-------------------------------------

Pentru a alege una din optiunele urmatore tastati cifra corespunzatoare comenzii:

'1' Insereaza o line/coloana noua;

'2' Exclude linia si coloana la intersectia caror se afla elementul minimal;

'3' Determina cate randuri detin elementul maximal;

'4' Calculeaza media aritmetica a elementelor de pe fiecare linie;

'5' Sorteaza descrescator elementele fiecarei coloane;

'6' Creaza fisierul 'Prime.txt' cu numere prime de pe fiecare linie;

'7' Determina daca exista un patrat magic: sumele liniilor,coloanelor si diagonalelor sunt egale;

După execuția prima apelarei a utilizatorului și execuția ei, utilizatorul va trebui să decidă
dacă dorește să apeleze alte comenzi, la întrebare ”Continuați?” va răspunde DA în caz
afirmativ, în caz contrar NU.

5
Listingul programului

#include <cstdlib>
#include <stdio.h>
#include <iostream>
#define M 100
using namespace std;
FILE *fi,*fo;
int m,n,v,a[M][M],b[M][M],i,j,min1,min2,jmin;
class meniu{
public:
void afisare_matrice();
void rezolvare();
void insereaza();
void exclude();
void el_max();
void media_aritmetica();
void sortare();
void num_prime();
void p_magic();
};
void afisare_matrice(){
for(i=0; i<m; i++)
{
cout<<"\n";
for(j=0; j<n; j++)
cout<<a[i][j]<<" ";
}
}

void rezolvare(){
fi=fopen("lacusta.in", "rt");
fscanf(fi,"%u %u", &m, &n);
for(i=0; i<m; i++)
for(j=0; j<n; j++)
fscanf(fi,"%u",&a[i][j]);
fclose(fi);
b[1][0]=32000;
for(i=1; i<n; i++)
b[1][i]=a[0][0]+a[0][i]+a[1][i];
for(i=1; i<m-1; i++)
{
if(b[i][0]<=b[i][1])
{
min1=b[i][0];
min2=b[i][1];
jmin=0;
}
else
{

6
min1=b[i][1];
min2=b[i][0];
jmin=1;
}
for(j=2; j<n; j++)
if(b[i][j]<min1)
{
min2=min1;
min1=b[i][j];
jmin=j;
}
else
if(b[i][j]<min2)
min2=b[i][j];
for(j=0; j<n; j++)
if(j!=jmin)
b[i+1][j]=min1+a[i][j]+a[i+1][j];
else
b[i+1][j]=a[i][j]+a[i+1][j]+min2;
}
min1=b[m-1][0];
for (j=1; j<n; j++)
if(b[m-1][j]<min1) min1=b[m-1][j];
fo=fopen("lacusta.out", "wt");
if(b[m-1][n-1]==min1)
fprintf(fo,"%u\n", min1);
else
fprintf(fo,"%u\n", min1+a[m-1][n-1]);
fclose(fo);

};

void insereaza(){
char ch;
int c[100],lc;
cout<<"Pentru a insera o linie insereaza 'l', pentru coloana-> 'c'\n";
cin>>ch;

if(ch=='l'){
cout<<"Introduceti numarul liniei si "<<n<<" numere\n";
cin>>lc; lc--;
for(i=0;i<n;i++)
cin>>c[i];

cout<<"Matricea initiala\n";
afisare_matrice();

m++;
for(i=m;i>lc;i--)
for(j=0;j<n;j++)
a[i][j]=a[i-1][j];
for(i=0;i<n;i++)

7
a[lc][i]=c[i];
}else{

cout<<"Introduceti numarul coloanei si "<<m<<" numere\n";


cin>>lc; lc--;
for(i=0;i<m;i++)
cin>>c[i];

cout<<"Matricea initiala\n";
afisare_matrice();

n++;
for(j=n;j>lc;j--)
for(i=0;i<m;i++)
a[i][j]=a[i][j-1];
for(i=0;i<n;i++)
a[i][lc]=c[i];
}
//----afisare----------
cout<<"\n";
cout<<"\nMatricea dupa inserare:";
afisare_matrice();

void exclude(){
int imin=0,jmin=0,min=32000;
for(i=n-1;i>=0;i--)
for(j=m-1;j>=0;j--)
if(min>=a[j][i]){
min=a[j][i];
imin=i;
jmin=j;
}
cout<<min<<imin<<jmin;
cout<<"Matricea initiala:";
afisare_matrice();
//-----exclude------
for(i=0;i<m;i++)
for(j=imin;j<n-1;j++)
a[i][j]=a[i][j+1];

for(i=jmin;i<n;i++)
for(j=0;j<m;j++)
a[i][j]=a[i+1][j];
cout<<"\n";
cout<<"\nMatricea dupa excludere:";
m--;n--;
afisare_matrice();
}

void el_max(){

8
int max=0,nr=0;
bool t;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(max<a[i][j])
max=a[i][j];
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
if(max==a[i][j])
t=true;
if(t) nr++;
t=false;
};
cout<<"Numarul maxim="<<max<<" apare in "<<nr<<" randuri";
}

void media_aritmetica(){
float s=0,c[100];
for(i=0;i<m;i++){
for(j=0;j<n;j++)
s+=a[i][j];
c[i]=s/n;
s=0;
}
cout<<"Media aritmetica a elementelor de pe fiecare linie:\n";
for(i=0;i<m;i++){
for(j=0;j<n;j++)
cout<<""<<a[i][j]<<" ";
cout<<"\t: "<<c[i]<<"\n";

}
}

void sortare(){
int l,x;
cout<<"Matricea initiala:";
afisare_matrice();
cout<<"\n";
for(j=0;j<n;j++)
for(i=0; i<m-1; i++)
for(l=i+1; l<=m-1; l++)
if( a[i][j] > a[l][j] )
{
x = a[i][j];
a[i][j] = a[l][j];
a[l][j] = x;
}
cout<<"\nElemetele coloanelor sortate crescator:";
afisare_matrice();
}
void num_prime(){

9
FILE *fp;
int x=0,l;
fp=fopen("prime.txt","w");
for(i=0;i<m;i++) {
for(j=0;j<n;j++){
for(l=2;l<(a[i][j]/2+1);l++)
if(a[i][j]%l==0) x++;
if(x==0) fprintf(fp,"%d ", a[i][j]);
x=0;
}
fprintf(fp,"\n");
}
fclose(fp);
}
void p_magic(){
bool t=false;
int l,p2,p=0,sl=0,s=0,k=1;

for(k=2;k<m;k++){
for(i=0;i<m-k+1;i++)
for(j=0;j<n-k+1;j++){
t=true; l=0;
while(l<k){
l++;
for(p=i;p<i+k;p++)
s+=a[p][j];
for(p=i;p<i+k;p++){
for(p2=j;p2<j+k;p2++)
sl+=a[p][p2];
if(sl!=s) t=false;
sl=0;
}
for(p2=j;p2<j+k;p2++){
for(p=i;p<i+k;p++)
sl+=a[p][p2];
if(sl!=s) t=false;
sl=0;
}
s=0;
}
if(t) goto label;
}
}
label: if(t) {
cout<<"DA";
cout<<"\nCoordonatele: i="<<i<<" si j="<<j;
cout<<"\nk="<<k;
} else cout<<"NU";

}
int main()
{

10
int cmd;
char ch;
rezolvare();
label2:
cout<<"-----------------MENIU--------------";
cout<<"\nPentru a alege una din optiunele urmatore tastati cifra corespunzatoare comenzii: ";
cout<<"\n'1' Insereaza o line/coloana noua";
cout<<"\n'2' Exclude linia si coloana la intersectia caror se afla elementul minimal";
cout<<"\n'3' Determina cate randuri detin elementul maximal";
cout<<"\n'4' Calculeaza media aritmetica a elementelor de pe fiecare linie";
cout<<"\n'5' Sorteaza descrescator elementele fiecarei coloane";
cout<<"\n'6' Creaza fisierul 'Prime.txt' cu numere prime de pe fiecare linie";
cout<<"\n'7' Determina daca exista un patrat magic( sumele liniilor,coloanelor si diagonalelor sunt
egale)\n";
cin>>cmd;
switch(cmd){
case 1: insereaza(); break;
case 2: exclude(); break;
case 3: el_max(); break;
case 4: media_aritmetica(); break;
case 5: sortare(); break;
case 6: num_prime(); break;
case 7: p_magic(); break;
default :
cout<<" Ati introdus cifra incorect, reincercati!\n"; goto label2;
}
cout<<"\nContinuati? (DA/NU)";
cin>>ch;
if(ch=='D'||ch=='d') {system("cls"); goto label2;}
}

11
Rezultatele testării subprogramelor
1. Înserează o line/coloană nouă
Input:

Output:

2. Exclude linia si coloana la intersecția căror se află elementul minimal


Input : Apelarea comenzii Nr. 2 automat elimină linia/coloana
Output:

3. Determină câte rânduri dețin elementul maximal


Input: Apelarea comenzii Nr. 3 automat returnează rezultatul
Output:

4. Calculează media aritmetică a elementelor linii


Input: Apelarea comezii Nr. 4 automat returnează mediile
12
Output:

5. Sortează descrescător elementele fiecărei coloane


Input: Apelarea comezii Nr. 4 afișează elementele sortate
Output:

6. Crează fisierul 'Prime.txt' cu numere prime


Input: La apelarea subrogramului se creaza fișierul cu numere prime
Output:

7. Determină dacă există un pătrat magic


La apelarea subprogramului se verifică dacă este cel puțin un pătrat magic, în caz afirmativ la
ecran se va afișa mesajul DA, coordonatele colțului srânga-sus și dimesiunea k a pătratului
găsit, altfel se va afișa mesajul NU;

13
Concluzii
Practica de inițiere reprezintă o pregătire importantă pentru introducerea în cadrul
activității în domeniu ca specialist calificat și totodată reprezintă un focar al formării
deprinderilor de bază pentru ocuparea unui post de lucru.

Practica oferă posibilitatea de percepe ulterioarele probleme ce pot apărea în viitor și


concomitent oferă și modul de soluționarea a problemelor. La elaborarea unor fragmente de
program sunt necesare surse opționale( internet, manuale, etc.) la care, apelând, se pot
acumula cunoștințe noi și pot provoca apariția unor noi idei.

În cadrul elaborării unui program și în cadrul procesării datelor informaționale sunt


necesare cunoștințele teoretice pentru ca programul să fie cât mai funcțional, eficient și
compact, iar informația să fie redată clar, într-un mod original și atractiv.

Pe parcursul inițierii se dezvoltă calitățile necesare pentru o muncă eficientă:


punctualitatea, capaciatatea de concentrare, soluționarea rapidă a problemelor, lucru în
echipă, răbdare, etc.

Deci practica este un proces de familiarizare cu domeniul ales și o evoluție a


cunoștințelor, precum și a capacităților personale.

De menținut că programarea orientată pe obiecte, în comparație cu cea structurată și


procedurală, este mai efectivă cu o organizare mai bună din punct de vedere al structurii și
lizibilității, cu ajutorul clasei se pot genera noi obiecte fară mari eforturi și pot fi acesate
subprograme ale claselor, în caz de necesitate.

14
Bibliografie

 ”Totul despre C si C++. Manualul fundamental de programare in C si C++ ”,


Autor: Dr. Kris Jamsa Lars Klander, Editura: Teora ,Anul aparitiei: 2015 

 ”Programarea in limbajul C/C++ pentru liceu”, Autori: Marinel


Serban, Emanuela Cerchez, Editura: Polirom, Colectia: Calculatoare.
Informatica ,Anul aparitiei: 2010 

 Limbajul C# pentru incepatori, Autori: Lavinia Negrescu, Liviu Negrescu,


Editura: Albastra, Colectia: Programare 

 http://www.scritub.com/stiinta/informatica/INTRODUCERE-IN-
INFORMATICA44919.php

 http://www.noiscriem.net/2013/07/curs-informatica-capitolul-1-istoric.html

15

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