TEMA 11
From Algopedia
Solutii Diagonal
Razvan
Observatii:
- La afisare caractere out<< e lent. Am recomandat sa folosesti fputc, sau macar fin.put(c) din c++;
- Greseli de identare: acolade de deschidere pe linie noua sau acolada de inchidere dupa instructiuni, linii nealiniate, identare la spatiu variabil, scriere mai multe instructiuni pe aceeasi linie.
- initializare la declarare ci nu cum ar trebui inainte de codul care folosese initializarea.
- poti separa codul cu linii goale ca sa marchezi bucatile de cod, pentru lizibilitate
#include <fstream>
using namespace std;
ifstream in("diagonal.in");
ofstream out("diagonal.out");
char v[101][101];
int main()
{
int n=0,x,i,j;
x=in.get();
while(x!='\n'){
v[0][n]=x;n++;x=in.get();}
for(i=1;i<n;i++){
for(j=0;j<n;j++)
v[i][j]=in.get();
in.get();
}
for(i=n-1;i>=0;i--)
for(j=0;j<n-i;j++)
out<<v[j+i][j];
for(j=1;j<=n-1;j++)
for(i=0;i<n-j;i++)
out<<v[i][i+j];
out<<'\n';
for(i=0;i<=n-1;i++)
for(j=i;j>=0;j--)
out<<v[i-j][j];
for(i=1;i<=n-1;i++)
for(j=0;j<=n-i-1;j++)
out<<v[i+j][n-j-1];
out<<'\n';
return 0;
}
// corectare Raz
#include <fstream>
using namespace std;
ifstream in("diagonal.in");
ofstream out("diagonal.out");
char v[101][101];
int main(){
int n,x,i,j;
x=in.get();
n=0;
while(x!='\n'){
v[0][n++]=x;
x=in.get();
}
for(i=1;i<n;i++){
for(j=0;j<n;j++)
v[i][j]=in.get();
in.get();
}
for(i=n-1;i>=0;i--)
for(j=0;j<n-i;j++)
out.put(v[j+i][j]);
for(j=1;j<=n-1;j++)
for(i=0;i<n-j;i++)
out.put(v[i][i+j]);
out.put( '\n' );
for(i=0;i<=n-1;i++)
for(j=i;j>=0;j--)
out<<v[i-j][j];
for(i=1;i<=n-1;i++)
for(j=0;j<=n-i-1;j++)
out.put(v[i+j][n-j-1]);
out.put( '\n' );
return 0;
}
cod Teo
Observatii:
- multe variabile in for
- Am recomandat sa folosesti fputc, sau macar fin.put(c) din c++;
#include <fstream>
using namespace std;
ifstream in("diagonal.in");
ofstream out("diagonal.out");
char m[100][100],e;
int main() {
int i,j,n,c;
n=0;
in.get(e);
while(e!='\n') {
m[0][n]=e;
n++;
in.get(e);
}
for(i=1;i<n;i++)
for(j=0;j<n;j++)
in>>m[i][j];
for(i=n-1; i>=0; i--)
for(j=i,c=0; j<n; j++,c++)
out<<m[j][c];
for(i=1; i<n; i++)
for(j=i,c=0; j<n && c<n; j++,c++)
out<<m[c][j];
out.put('\n');
for(i=0; i<n; i++)
for(j=i,c=0; j>=0 && c<n; j--,c++)
out<<m[c][j];
for(i=1; i<n; i++)
for(j=i,c=n-1; j<n && c<n; j++,c--)
out<<m[j][c];
out<<'\n';
return 0;
}
Andrei
Observatii:
- Fara tema
Solutii Cautare
Sol Teo
Observatii:
- NU ai aplicat algoritmul recomandat pentru cautare. Avand in vedere ca nu stim cand ne oprim, nu puteam sa folosim for, am conventit ca folosim for doar pentru numar cunoscut de pasi. Uu ai nevoie de stegulete nici de break. Cand vei da uitarii comanda break vei incepe sa gandesti mai bine conditiile de ciclare: cautam cat timp nu am terminat domeniul in care catam si cat timp elementul curent e ok, aici ok inseamna ca este egal cu elementul corespondent din cealalalta matrice.
- atentie la identare.
#include <fstream>
using namespace std;
ifstream in("cautare.in");
ofstream out("cautare.out");
char m1[100][100],m2[100][100];
int main()
{
int n,m,i,j,i1,j1,i2,j2,c,cj,ok;
in>>n>>m;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
in>>m1[i][j];
for(i=0;i<m;i++)
for(j=0;j<m;j++)
in>>m2[i][j];
c=0;
for(i=0;i<=n-m;i++) {
for(j=0;j<=n-m;j++) {
ok=1;
for(i1=i,i2=0;i1<i+m && i2<=m;i1++,i2++)
for(j1=j,j2=0;j1<j+m && j2<=m;j1++,j2++)
if(m1[i1][j1]!=m2[i2][j2]){
ok=0;
break;
}
if(ok)
c++;
}
}
out<<c;
return 0;
}
Sol Raz
Obs:
- NU ti-ai insusit pe deplin codul de la cautare, din lectie. Acolo aveai un singur while, nu doua. Cand pui 2 trebuie sa te inghijesti sa le opresti pe amandoua nu doar pe unul. Ai mai jos corectura de cod. Te rog, indenteaza corect, nu iti pot citi codul.
#include <fstream>
using namespace std;
ifstream in("cautare.in");
ofstream out("cautare.out");
char x[101][101],y[101][101];
int main()
{
int n,m,i,j,a,b,cnt=0;
in>>n>>m;
in.get();
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
x[i][j]=in.get();
in.get();
}
for(i=0; i<m; i++)
{
for(j=0; j<m; j++)
y[i][j]=in.get();
in.get();
}
for(i=0;i<=n-m;i++)
for(j=0;j<=n-m;j++)
{
a=i;
b=j;
while(a<i+m)
{
b=j;
while(b<j+m and x[a][b]==y[a-i][b-j])
b++;
a++;
}
if(a==i+m and b==j+m)
cnt++;
}
out<<cnt;
return 0;
}
// corectare cod Raz
#include <fstream>
#include <iostream>
using namespace std;
ifstream in("cautare.in");
ofstream out("cautare.out");
char x[101][101],y[101][101];
int main(){
int n,m,i,j,lin,col,cnt;
in>>n>>m;
in.get();
// citire matrice mare
for(i=0; i<n; i++) {
for(j=0; j<n; j++)
x[i][j]=in.get();
in.get();
}
// citire matrice mica
for(i=0; i<m; i++) {
for(j=0; j<m; j++)
y[i][j]=in.get();
in.get();
}
// parcurgem elementele matricei mari care pot fi colturile de
// inceput ale unei aparitii ale matricei mici
cnt = 0;
for(i=0;i<=n-m; i++)
for(j=0;j<=n-m;j++){
lin=i;
col=j;
while(lin<i+m && x[lin][col]==y[lin-i][col-j]){
col++;
if(col>=j+m ){
lin++;
col=j;
}
}
if(lin>=i+m){
cnt++;
//cout<< i << " " <<j<<"\n";
}
}
out<<cnt;
return 0;
}
Sol Andrei
???
Solutiie ZOOM
Razvan
Observatii:
- iar identare vraiste :) abia reusesc sa citesc codul, te rog da-mi o mana de autor sa citesc mai usor
- de ce v[101][101] NU pune elemente in plus.
#include <fstream>
using namespace std;
ifstream in("zoomx2.in");
ofstream out("zoomx2.out");
char v[101][101];
int main()
{
int n,k=2,i,j,y,z;
char x;
in>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
in>>x;
for(y=k*i;y<=k*i+k-1;y++)
for(z=k*j;z<=k*j+k-1;z++)
v[y][z]=x;
}
for(i=0;i<k*n;i++){
for(j=0;j<k*n;j++)
out<<v[i][j];
out<<'\n';
}
return 0;
}
Teo
???
Andrei
???