Vissza

Mutatók  II.

Megoldott feladatok:
1. Vizsgáljuk meg két véletlenszerű elemekkel inicializált kétdimenziós tömbről, hogy egyformák-e? ( Forráskód )
2. Határozzuk meg két kétdimenziós tömb szorzatát, ahol az elemeket állományból olvassuk ki. ( Forráskód )
3. Fűzzünk egymás után két egydimenziós tömböt, rekurzív algoritmust írva. ( Forráskód )
4. Függvényt írva, töltsünk fel egy kétdimenziós tömböt 'llom'nyban levő értékekkel, majd írjuk ki az elemeit a képernyőre. ( Forráskód )

Forráskódok:
1.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int same(int ** m1, int **m2, int n, int m);

int main()
{
    int **mat1 ;
    int **mat2;
    int n, m, i, j, e;
    n = 3;
    m = 4;
    // az elso tombnek szukseges memoria zona lefoglalasa
    mat1 = (int**) malloc (n* sizeof (int *));

    for (i = 0; i < n; ++i)
        mat1[i] = (int*)malloc(m * sizeof(int));
   
    srand(time(NULL));
   
for (i = 0; i < n; ++i) {
        for (j = 0; j < m; ++j) {
            mat1[i][j] = rand()%2;
            printf("%4i", mat1[i][j]);
        }
        printf("\n");
    }
    printf("\n");

   
// a második tombnek szukseges memoria zona lefoglalasa
    mat2 = (int**) malloc (n* sizeof (int *));
    for (i = 0; i < n; ++i)
        mat2[i] = (int*)malloc(m * sizeof(int));
   
    for (i = 0; i < n; ++i)
    {
        for (j = 0; j < m; ++j)
        {
            mat2[i][j] = rand()%2;
            printf("%4i", mat2[i][j]);
        }
        printf("\n");
    }

    e = same(mat1, mat2, n, m);
    if(e) printf("egyformak\n");
    else printf("nem egyformak\n");
    for (i = 0; i < n; ++i)
    {
        free (mat1[i]);
        free (mat2[i]);
    }
    free (mat1);
    free (mat2);
    return 0;
}

// a ket tomb egyenloseget megvizsgalo fuggveny
int same(int ** m1, int **m2, int n, int m)
{
    int i, j;
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
            if (m1[i][j] != m2[i][j]) return 0;
    return 1;
}

Vissza

2. A szamok.txt állomány tartalma legyen a következő:
3 4

1 2 3 4
1 1 1 1
12 3 4 5

4 2

1 1
1 2
1 0
1 2

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int ** multiply(int ** m1, int **m2, int n, int m, int p);

int main()
{
    // a ket tombot konstans ertekekkel inicializaljuk
    int **mat1;
    int **mat2;
    int **e;
    int n, m, p, i, j;

    FILE * F;
    F = fopen ("szamok.txt", "r");
    fscanf(F, "%i", &n);
    fscanf(F, "%i", &m);
    mat1 = (int**) malloc (n* sizeof (int *));
    for (i = 0; i < n; ++i){
        mat1[i] = (int*)malloc(m * sizeof(int));
        for (j = 0; j < m; ++j){
            fscanf(F, "%i", &mat1[i][j]);
            printf("%4i", mat1[i][j]);
        }
        printf("\n");
    }
   
    printf("\n");
    fscanf(F, "%i", &m);
    fscanf(F, "%i", &p);
    mat2 = (int**) malloc (m* sizeof (int *));
    for (i = 0; i < m; ++i){
        mat2[i] = (int*)malloc(p * sizeof(int));
        for (j = 0; j < p; ++j){
            fscanf(F, "%i", &mat2[i][j]);
            printf("%4i", mat2[i][j]);
        }
        printf("\n");
    }
    fclose(F);
    printf("\nA szorzat: \n");
    e = multiply(mat1, mat2, n, m, p);
    for (i = 0; i < n; ++i)
    {
        for (j = 0; j < p; ++j)
            printf("%4i", e[i][j]);
        printf("\n");
    }
    for (i = 0; i < n; ++i)
        free(mat1[i]);
    free(mat1);
    for (i = 0; i < m; ++i)
        free(mat2[i]);
    free(mat2);
    for (i = 0; i < n; ++i)
        free(e[i]);
    free(e);
    return 0;
}

// a két tomb osszeszorzasat megvalosito fuggveny
int ** multiply(int ** m1, int **m2, int n, int m, int p)
{
    int i, j, k, osz;
    int ** newm = (int**) malloc (n * sizeof (int *));
    for (i = 0; i < n; ++i)
        newm[i] = (int*) malloc (p * sizeof(int));

    for (i = 0; i < n; ++i)
        for (j = 0; j < p; j++)
        {
            osz = 0;
            for (k = 0; k < m; ++k)
                osz += m1[i][k] * m2[k][j];
            newm[i][j] = osz;
        }
    return newm;
}

Vissza

3.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int * fuz(int * m1, int *m2, int n1, int n2, int *n);

main()
{
    //a ket tombot konstans ertekekkel inicializaljuk
    int tomb1[] = {1,2,3,4,5,6,7,8,9} ;
    int tomb2[] = {17,18,19};
    int n1 = sizeof(tomb1) / sizeof(tomb1[0]);
    int n2 = sizeof(tomb2) / sizeof(tomb2[0]);
    int n, i;
    int *newt;

    // az osszefuzest megvalosito fuggveny meghivasa, az uj tomb elemszamat cim szerinti
    // parameteratadassal hatarozzuk meg, az uj tomb pedig a fuggveny visszatertesi erteke lesz
    newt = fuz(tomb1, tomb2, n1, n2-1, &n);
    for(i = 0; i < n; ++i)
            printf("%4i", newt[i]);
    printf("\n");
    free (newt);
}

int * fuz(int * m1, int *m2, int n1, int n2, int *n)
{
    int *newt, i;
    if (n2 < 0)
    {
        //atmasoljuk az elso tomb elemeit az uj tombe, melynek dinamiksan foglalunk le helyet
        newt = (int*)malloc(n1*sizeof(int));
       
for (i = 0; i < n1; ++i)
            newt[i] = m1[i];
        (*n) = i;
        return newt;
    }
   
//a rekurziv hivas utan fuzzuk hozza a a masodik tomb elemet az uj tombhoz
    newt = fuz (m1, m2, n1, n2-1, n);
 
    newt = (int*) realloc (newt, ((*n) + 1)* sizeof(int));
    newt[*n] = m2[n2];
    (*n) ++;
    return newt;
}
Vissza

4.
#include <stdio.h>
#include <stdlib.h>

void beolvas(int ***tomb,int*n,int *m);
void kiir(int **tomb,int n,int m);

void main()
{
    int **tomb;
    int n, m;
    beolvas (&tomb, &n, &m);
    kiir (tomb, n, m);
    for( i = 0; i < n; ++i)
        free(tomb[i]);
    free(tomb);
}

void beolvas(int ***tomb, int*n, int *m)
{
    int i,j;
    FILE *F;
    F = fopen ("szamok.txt", "r");
    fscanf(F, "%i", n);
    fscanf(F, "%i", m);
    *tomb = (int**)malloc((*n)*sizeof(int));
    for (i = 0; i < (*n); i++)
        *((*tomb) + i) = (int*) calloc( (*m), sizeof(int));
      
    for (i = 0; i < (*n); i++)
        for (j = 0; j < (*m); j++)
            fscanf(F,"%d", *((*tomb) + i) + j );
    fclose(F);
}

void kiir(int **tomb,int n,int m)
{
    int i,j;
    for (i = 0; i < n; ++i){
        for (j = 0; j < m; j++)
            printf("%4d", *(*(tomb + i) + j));
        printf("\n");
    }
}


Vissza