Informatika2-2015/Gyakorlat12

A MathWikiből

Tartalomjegyzék

12. gyakorlat - Új típusok

Ezen a gyakorlaton az előző heti előadás anyagát dolgozzuk fel.

Feladatok

Feladatok a CloudCoder-en megtalálhatóak. Ajánlott sorrend:

  • fibonacci
  • matrix_szorzas_1
  • matrix_szorzas_2
  • atlag

Feladatok megoldása

fibonacci

int fibonacci(int limit, int tomb[], int meret) {
    int i;
    tomb[0] = 1;
    tomb[1] = 1;
    for(i = 2; i < meret && tomb[i-1] + tomb[i-2] < limit; ++i) {
        tomb[i] = tomb[i-1] + tomb[i-2];
    }
    return i;
}

matrix_szorzas_1

void szoroz(matrix a, matrix b, matrix ret) {
  int i, j, k;
  for(i = 0; i < 2; ++i) {
    for(j = 0; j < 2; ++j) {
      ret[i][j] = 0;
      for(k = 0; k < 2; ++k) {
        ret[i][j] += a[i][k] * b[k][j];
      }
    }
  }
}

matrix_szorzas_2

struct MatrixTar szoroz(struct MatrixTar a, struct MatrixTar b) {
  int i, j, k;
  struct MatrixTar ret;
  for(i = 0; i < 2; ++i) {
    for(j = 0; j < 2; ++j) {
      ret.adat[i][j] = 0;
      for(k = 0; k < 2; ++k) {
        ret.adat[i][j] += a.adat[i][k] * b.adat[k][j];
      }
    }
  }
  return ret;
}

atlag

Amire itt figyelni kell, és sokaknak meglepő, hogy ha a mértani középnél "1 / N"-et írunk, akkor azt egész számok osztásaként értelmezi a C. Meg lehet mondani direkt hogy valós számokként kezelje őket, ha az egyiket valós számmá konvertáljuk, pl: "1 / (float)N". De egyszerűbb az "1" helyett, ami egy egész szám, azt írni hogy "1.0", ami már egy valós szám (a C szemszögéből).

float atlag(int tomb[], int N, enum atlag_fajta fajta) {
  float sum;
  int i;
  switch(fajta) {
    case SZAMTANI:
      sum = 0;
      for(i = 0; i < N; ++i) {
        sum += tomb[i];
      }
      return sum / N;
    case MERTANI:
      sum = 1;
      for(i = 0; i < N; ++i) {
        sum *= tomb[i];
      }
      return powf(sum, 1.0 / N);
    case NEGYZETES:
      sum = 0;
      for(i = 0; i < N; ++i) {
        sum += tomb[i] * tomb[i];
      }
      return sqrtf(sum / N);
    default:
      return -1;
  }
}
Személyes eszközök