Documente Academic
Documente Profesional
Documente Cultură
Raportul
Raportul
Raport
pentru practica de iniţiere în specialitate
tema : 20 Lăcusta
Introducere
2
Cuprins
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)
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.
------------------------------------------------MENIU-------------------------------------
Pentru a alege una din optiunele urmatore tastati cifra corespunzatoare comenzii:
'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<<"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:
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.
14
Bibliografie
http://www.scritub.com/stiinta/informatica/INTRODUCERE-IN-
INFORMATICA44919.php
http://www.noiscriem.net/2013/07/curs-informatica-capitolul-1-istoric.html
15