TEMA 11

From Algopedia
Jump to navigationJump to search

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

???