A kiválasztott változat és az aktuális verzió közötti különbségek a következők.
tanszek:oktatas:muszaki_informatika:strukturak_c-ben [2024/02/13 19:40] knehez létrehozva |
tanszek:oktatas:muszaki_informatika:strukturak_c-ben [2024/02/13 19:41] (aktuális) knehez |
||
---|---|---|---|
Sor 1: | Sor 1: | ||
- | ==== Mátrixok használata ==== | + | **1. Feladat**: Olvasson be változó számú neveket és érdemjegyeket egy struktúrába és írassa ki az eredményt. |
- | + | ||
- | **1. feladat:** Adjunk össze két 3x3-as egész számokat tároló mátrix-ot és tároljunk le egy harmadikban az eredményt. Használjunk függvényt a mátrix elemeinek bekéréséhez. | + | |
<sxh c> | <sxh c> | ||
- | #include <stdio.h> | + | #include<stdio.h> // printf() és scanf() miatt kell |
+ | #include<stdlib.h> // malloc() miatt kell | ||
- | #define SIZE 3 // a matrix-ok merete | + | struct Kurzus |
- | void readMatrix(int m[][SIZE]) | + | |
{ | { | ||
- | for(int sor = 0; sor < SIZE; sor++) | + | char nev[30]; |
- | { | + | int jegy; |
- | for(int oszlop = 0; oszlop < SIZE; oszlop++) | + | }; |
- | { | + | |
- | scanf("%d", &m[sor][oszlop]); | + | |
- | } | + | |
- | } | + | |
- | } | + | |
int main() | int main() | ||
{ | { | ||
- | int A[SIZE][SIZE]; // Matrix 1 | + | struct Kurzus *ptr; |
- | int B[SIZE][SIZE]; // Matrix 2 | + | int i, db; |
- | int C[SIZE][SIZE]; // eredmeny Matrix | + | printf("Hany hallgato van? "); |
+ | scanf("%d", &db); | ||
- | printf("Kerem az elso matrix elemeit: \n"); | + | ptr = (struct Kurzus*) malloc (db * sizeof(struct Kurzus)); |
- | readMatrix(A); | + | |
- | printf("Kerem az masodik matrix elemeit: \n"); | + | |
- | readMatrix(B); | + | |
- | for(int sor = 0; sor < SIZE; sor++) | + | for(i = 0; i < db; ++i) |
{ | { | ||
- | for(int oszlop = 0; oszlop < SIZE; oszlop++) | + | printf("Kerem a nevet es a jegyet:\n"); |
- | { | + | scanf("%s %d", (ptr + i)->nev, &ptr[i].jegy); |
- | C[sor][oszlop] = A[sor][oszlop] + B[sor][oszlop]; | + | |
- | } | + | |
} | } | ||
- | + | printf("Osszesen:\n"); | |
- | printf("\nMatrixok osszege: A+B = \n"); | + | for(i = 0; i < db ; ++i) |
- | for(int sor = 0; sor < SIZE; sor++) | + | |
{ | { | ||
- | for(int oszlop = 0; oszlop < SIZE; oszlop++) | + | printf("%s\t%d\n", ptr[i].nev, (ptr + i)->jegy); |
- | { | + | |
- | printf("%d ", C[sor][oszlop]); | + | |
- | } | + | |
- | printf("\n"); // soronkent uj sor | + | |
} | } | ||
} | } | ||
</sxh> | </sxh> | ||
- | **2. feladat:** Az első feladatban a <sxh c>readMatrix()</sxh> függvényt cseréljük le: <sxh c>void readMatrix(int ** m)</sxh> -ra és próbáljuk meg mi történik és magyarázzuk meg miért? | + | **2. Feladat**: Láncolt lista: készítsünk egy //int szam//-ot tartalmazó struktúrát, ami tartalmaz egy mutatót egy önmagával megegyező típusra //next// néven. |
- | + | ||
- | **3. feladat:** Az első feladatban megadott feladatot oldjuk meg pointerekkel is. | + | |
<sxh c> | <sxh c> | ||
#include <stdio.h> | #include <stdio.h> | ||
- | + | struct Elem | |
- | #define SIZE 3 // a matrix-ok merete | + | |
- | void readMatrix(int *m) | + | |
{ | { | ||
- | for(int i = 0; i < SIZE * SIZE; i++) | + | int szam; |
- | { | + | struct Elem *next; |
- | scanf("%d", (m + i)); | + | }; |
- | } | + | |
- | } | + | |
int main() | int main() | ||
{ | { | ||
- | int A[SIZE][SIZE]; // Matrix 1 | ||
- | int B[SIZE][SIZE]; // Matrix 2 | ||
- | printf("Kerem az elso matrix elemeit: \n"); | + | } |
- | readMatrix(&A[0][0]); | + | </sxh> |
- | printf("Kerem az masodik matrix elemeit: \n"); | + | |
- | readMatrix(&B[0][0]); | + | |
- | int C[SIZE][SIZE]; // eredmeny Matrix | + | **3. Feladat**: Láncolt lista: az előzőből hozzunk éltre két darabot dinamikusan, az első a másodikra mutasson. |
- | for(int i = 0; i < SIZE * SIZE; i++) | + | <sxh c> |
- | { | + | #include <stdio.h> |
- | *(&C[0][0] + i) = *(&A[0][0] + i) + *(&B[0][0] + i); | + | #include <stdlib.h> |
- | } | + | struct Elem |
+ | { | ||
+ | int szam; | ||
+ | struct Elem *next; | ||
+ | }; | ||
- | printf("\nMatrixok osszege: A+B = \n"); | + | int main() |
- | for(int sor = 0; sor < SIZE; sor++) | + | { |
- | { | + | struct Elem* e1 = (struct Elem*) malloc(sizeof(struct Elem)); |
- | for(int oszlop = 0; oszlop < SIZE; oszlop++) | + | struct Elem* e2 = (struct Elem*) malloc(sizeof(struct Elem)); |
- | { | + | // osszekotes első variacio |
- | printf("%d ", C[sor][oszlop]); | + | e1->next = &e2[0]; |
- | } | + | // osszekotes 2. variacio |
- | printf("\n"); // soronkent uj sor | + | e1[0].next = e2; |
- | } | + | |
} | } | ||
</sxh> | </sxh> | ||
- | **4. feladat:** Ellenőrizzük, hogy a felhasználótól bekért 3x3-as mátrix felső háromszög típusú-e? | + | **4. Feladat**: Láncolt lista: Készítsünk egy függvényt, ami kiírja a lista összes elemét. Majd kérjünk be a felhasználótól tetszőleges számú dinamikusan létrehozott listaelemet. |
<sxh c> | <sxh c> | ||
#include <stdio.h> | #include <stdio.h> | ||
+ | #include <stdlib.h> | ||
- | #define SIZE 3 // a matrix-ok merete | + | typedef struct Elem // azért lett typedef, hogy kényelmes függvényparaméter lehessen |
- | void readMatrix(int m[][SIZE]) | + | |
{ | { | ||
- | for(int sor = 0; sor < SIZE; sor++) | + | int szam; |
+ | struct Elem *next; // a 'struct Elem' nem mas mint onmaga | ||
+ | } Elem; | ||
+ | |||
+ | void printList(Elem * head) | ||
+ | { | ||
+ | Elem * current = head; | ||
+ | |||
+ | while (current != NULL) | ||
{ | { | ||
- | for(int oszlop = 0; oszlop < SIZE; oszlop++) | + | printf("%d\n", current->szam); |
- | { | + | current = current->next; |
- | scanf("%d", &m[sor][oszlop]); | + | |
- | } | + | |
} | } | ||
} | } | ||
Sor 114: | Sor 97: | ||
int main() | int main() | ||
{ | { | ||
- | int A[SIZE][SIZE]; | + | int db; |
+ | printf("Hany elemet ad meg?"); | ||
+ | scanf("%d", &db); | ||
- | printf("Kerem a matrix elemeit: \n"); | + | Elem *last = NULL; |
- | readMatrix(A); | + | Elem *first = NULL; |
- | + | for(int i=0; i < db; i++) | |
- | int felsoHaromszog = 1; | + | |
- | // Hogyan jovunk ra a megoldasra? | + | |
- | // | + | |
- | // 1 2 3 [0,0] [0,1] [0,2] | + | |
- | // 0 4 5 =>[1,0] [1,1] [1,2] | + | |
- | // 0 0 6 [2,0] [2,1] [2,2] | + | |
- | // | + | |
- | // Mi a közös a három 0 érték indexeiben? | + | |
- | // - az hogy a sor index erteke mindig nagyobb mint | + | |
- | // az oszlop index!! | + | |
- | // | + | |
- | for(int sor = 0; sor < SIZE; sor++) | + | |
{ | { | ||
- | for(int oszlop = 0; oszlop < SIZE; oszlop++) | + | Elem* e = (Elem*) malloc(sizeof(Elem)); |
+ | e->next = NULL; // probaljuk ki úgy is, hogy ezt a sort kitoroljuk. Magyarazzuk meg miert tortenik? | ||
+ | if(last != NULL) // ha nem az elsőt töltjük fel | ||
{ | { | ||
- | // | + | last->next = e; |
- | // a foatlo alatti elemeknek 0-nak kell lenniuk | + | |
- | // | + | |
- | if(sor > oszlop && A[sor][oszlop]!=0) | + | |
- | { | + | |
- | felsoHaromszog = 0; | + | |
- | } | + | |
} | } | ||
+ | else // ha az elsőt töltjük fel, az elsőt eltároljuk, mert e nélkül elveszne az első eleme a listának | ||
+ | { | ||
+ | first = e; | ||
+ | } | ||
+ | printf("Kerem az %d.-t:", i); | ||
+ | scanf("%d", &e->szam); | ||
+ | last = e; // osszekotjuk a ket strukturat | ||
} | } | ||
- | if(felsoHaromszog) | + | printList(first); |
- | { | + | |
- | printf("felso haromszog matrix"); | + | |
- | } | + | |
- | else | + | |
- | { | + | |
- | printf("nem felso haromszog"); | + | |
- | } | + | |
} | } | ||
+ | </sxh> | ||
+ | **5. Feladat**: Értsük meg jobban a typedef használatát a _types.h kódrészlete alapján: | ||
+ | |||
+ | <sxh c> | ||
+ | /* sys/x86/include/_types.h in FreeBSD */ | ||
+ | /* this is machine dependent */ | ||
+ | #ifdef __LP64__ | ||
+ | typedef unsigned long __uint64_t; | ||
+ | #else | ||
+ | __extension__ | ||
+ | typedef unsigned long long __uint64_t; | ||
+ | #endif | ||
+ | ... | ||
+ | ... | ||
+ | typedef __uint64_t __size_t; | ||
</sxh> | </sxh> | ||
- | **5. feladat:** Írjon C programot, ami meghatározza, hogy egy mátrix ritka mátrix-e? Egy ritka mátrix olyan mártix aminek legalább elemeinek a fele 0. | + | A fenti kódpélda az **//unsigned long long//** ot rövidíti **//__size_t//**-nek (64 bites rendszereken). A következő kódrészlet 3 féle struktúradefiníciót alkalmaz: |
- | + | ||
- | **6. feladat:** Írjon C programot, ami bekér a felhasználótól egy 3x3-as mátrixot és kiírja a transzponáltját. | + | |
<sxh c> | <sxh c> | ||
#include <stdio.h> | #include <stdio.h> | ||
+ | #include <stdlib.h> | ||
- | #define SIZE 3 // a matrix-ok merete | + | /* uj tipust hozunk létre Item neven. |
- | void readMatrix(int m[][SIZE]) | + | A struct elem_t helyett Item-et irhatunk kesobb |
+ | */ | ||
+ | typedef struct elem_t | ||
{ | { | ||
- | for(int sor = 0; sor < SIZE; sor++) | + | char *text; |
- | { | + | int count; |
- | for(int oszlop = 0; oszlop < SIZE; oszlop++) | + | struct elem_t *next; /* itt meg nem lehet roviditeni */ |
- | { | + | } Item; |
- | scanf("%d", &m[sor][oszlop]); | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | int main() | + | /* normal struktura definicio */ |
+ | struct item | ||
{ | { | ||
- | int A[SIZE][SIZE]; | + | char *text; |
- | int E[SIZE][SIZE]; | + | int count; |
- | printf("Kerem a matrix elemeit: \n"); | + | struct item *next; |
- | readMatrix(A); | + | }; |
- | // Hogyan jovunk ra a megoldasra? | + | /* |
- | // Transzpontalt matrix pelda: | + | * ez valojaban egy nevtelen struktura |
- | // | + | */ |
- | // 1 2 3 1 4 7 | + | struct |
- | // 4 5 6 => 2 5 8 | + | { |
- | // 7 8 9 3 6 9 | + | int i; |
- | // | + | char c; |
- | // A matrix [i][j] elemét [j][i]-re kell cserelni | + | } nevtelen; |
- | for(int sor = 0; sor < SIZE; sor++) | + | |
- | { | + | |
- | for(int oszlop = 0; oszlop < SIZE; oszlop++) | + | |
- | { | + | |
- | E[sor][oszlop] = A[oszlop][sor]; | + | |
- | } | + | |
- | } | + | |
- | for(int sor = 0; sor < SIZE; sor++) | + | int main(void) |
- | { | + | { |
- | for(int oszlop = 0; oszlop < SIZE; oszlop++) | + | // mutato a "struct item"-re |
- | { | + | struct item *pi = (struct item *)malloc(sizeof(struct item));; |
- | printf("%d ", E[sor][oszlop]); | + | pi->count = 10; |
- | } | + | |
- | printf("\n"); | + | // Roviditett hasznalata a "struct item_t"-nek |
- | } | + | Item *iI = (Item *)malloc(sizeof(Item)); |
+ | iI->count = 5; | ||
+ | iI->next = iI; // onmagara mutat (csak a pelda kedveert) | ||
+ | |||
+ | // nevtelen structura | ||
+ | nevtelen.i = 9; | ||
+ | nevtelen.c = 'x'; | ||
} | } | ||
</sxh> | </sxh> | ||
- | **7. feladat:** Írjon C programot, ami összeszoroz két mátrixot. | + | **6. Feladat**: A 4. példához készítsünk egy **//Elem* pop()//** függvényt, ami az első elemet eltávolítja a listából |
<sxh c> | <sxh c> | ||
- | #include <stdio.h> | + | Elem* pop(Elem *first) |
- | + | ||
- | #define MAX_SOR 3 | + | |
- | #define MAX_OSZLOP 3 | + | |
- | void readMatrix(int m[][MAX_OSZLOP]) | + | |
{ | { | ||
- | for(int sor = 0; sor < MAX_SOR; sor++) | + | Elem *ret = first->next; |
- | { | + | free(first); |
- | for(int oszlop = 0; oszlop < MAX_OSZLOP; oszlop++) | + | return ret; |
- | { | + | |
- | scanf("%d", &m[sor][oszlop]); | + | |
- | } | + | |
- | } | + | |
} | } | ||
+ | </sxh> | ||
- | int main() | + | **7. Feladat**: A 4. példához készítsünk egy **//void sort(Elem*)//**, ami sorbarendezi növekvő sorrendbe a lista elemeit, az értékek módosításával. |
+ | |||
+ | <sxh c> | ||
+ | void sort(Elem *first) | ||
{ | { | ||
- | int A[MAX_SOR][MAX_OSZLOP]; | + | Elem *e1, *e2; |
- | int B[MAX_SOR][MAX_OSZLOP]; | + | e1 = first; |
- | int C[MAX_SOR][MAX_OSZLOP]; | + | while(e1->next != NULL) |
- | printf("Kerem az A matrix elemeit: \n"); | + | |
- | readMatrix(A); | + | |
- | printf("Kerem a B matrix elemeit: \n"); | + | |
- | readMatrix(B); | + | |
- | + | ||
- | + | ||
- | for (int sor = 0; sor < MAX_SOR; sor++) | + | |
{ | { | ||
- | for (int oszlop = 0; oszlop < MAX_OSZLOP; oszlop++) | + | e2 = e1->next; |
+ | while(e2 != NULL) | ||
{ | { | ||
- | int sum = 0; | + | if(e2->szam < e1->szam) |
- | for (int i = 0; i < MAX_OSZLOP; i++) | + | |
{ | { | ||
- | sum += (*(*(A + sor) + i)) * (*(*(B + i) + oszlop)); | + | int tmp = e2->szam; |
+ | e2->szam = e1->szam; | ||
+ | e1->szam = tmp; | ||
} | } | ||
- | *(*(C + sor) + oszlop) = sum; | + | e2 = e2->next; |
} | } | ||
+ | e1 = e1->next; | ||
} | } | ||
+ | } | ||
+ | </sxh> | ||
- | for(int sor = 0; sor < MAX_SOR; sor++) | ||
- | { | ||
- | for(int oszlop = 0; oszlop < MAX_OSZLOP; oszlop++) | ||
- | { | ||
- | printf("%d ", C[sor][oszlop]); | ||
- | } | ||
- | printf("\n"); | ||
- | } | ||
- | } | ||
- | </sxh> | ||
- | |||
- | **8. feladat:** Írja át az előző példában a sum += (*(*A + sor .... -t az egyszerűbb indexes A[i][j]- alakra! | ||
- | <sxh c> | ||
- | sum += A[sor][i] * B[i][oszlop]; | ||
- | </sxh> | ||