Informatika2-2015/Gyakorlat12
A MathWikiből
(Változatok közti eltérés)
(Új oldal, tartalma: „= 12. gyakorlat - Új típusok = Ezen a gyakorlaton az előző heti előadás anyagát dolgozzuk fel. == Feladatok == …”) |
|||
11. sor: | 11. sor: | ||
* matrix_szorzas_2 | * matrix_szorzas_2 | ||
* atlag | * atlag | ||
+ | |||
+ | == Feladatok megoldása == | ||
+ | |||
+ | === fibonacci === | ||
+ | |||
+ | <c> | ||
+ | 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; | ||
+ | } | ||
+ | </c> | ||
+ | |||
+ | === matrix_szorzas_1 === | ||
+ | |||
+ | <c> | ||
+ | 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]; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </c> | ||
+ | |||
+ | === matrix_szorzas_2 === | ||
+ | |||
+ | <c> | ||
+ | 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; | ||
+ | } | ||
+ | </c> | ||
+ | |||
+ | === 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). | ||
+ | |||
+ | <c> | ||
+ | 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; | ||
+ | } | ||
+ | } | ||
+ | </c> |
A lap jelenlegi, 2015. május 9., 22:29-kori változata
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; } }