Základy algoritmizace a programování

Petr Sváček, Luděk Beneš, Olga Majlingová
Ústav technické matematiky

Přednáška č. 9

Matice. Ukazatel jako výstupní argument funkce. Dynamická alokace vektoru.

Podrobně: Vektor a matice (statická alokace), základní aritmetické operace na maticích. Násobení matic. Dynamická alokace pole. Funkce součet vektoru s dynamickou alokací.

STATICKÁ ALOKACE MATICE (DVOUROZMĚRNÉHO POLE) NENÍ VHODNÁ PRO POUŽITÍ VE FUNKCI,
A TEDY V PRAXI SE ŘEŠÍ JINAK. Nicméně koncepce 2 rozměrného pole je důležitá.

Vysvětlené progamy: Načtení čtvercové matice (z klávesnice, ze souboru). Výpis matice na obrazovku. Součet matic. Test symetrická matice. Součin čtvercových matic. Součin matice a vektoru. Dynamická alokace vektoru. Součet dvou vektorů s dynamickou alokaci.


Stručně algoritmy z přednášek (zapsané v jazyce C)

  1. Načtení čtvercové matice z klávesnice nebo souboru
    (max. 100x100).
    #include <stdio.h>
    
    main()
    {
       int n;
       float A[100][100];
       int i,j;
       
       printf("Zadej rozmer ctvercove matice n:\n");
       scanf("%d",&n);
       for(i=0;i<n;i++)
       {
         for(j=0;j<n;j++)
         {
            printf("A[%d][%d]=",i,j);
            scanf("%f",&A[i][j]);
         }
       }
    }
    
    Načtení čtvercové matice ze souboru.
    #include <stdio.h>
    
    main()
    {
       int n;
       float A[100][100];
       FILE *fid;
       int i,j;
       
       fid=fopen("matice.txt","r");
       if (fid==NULL)
       {
          printf("Soubor matice.txt neexistuje.\n");
          return 1;
       }
       fscanf(fid,"%d",&n);
       for(i=0;i<n;i++)
       {
         for(j=0;j<n;j++)
         {
            fscanf(fid,"%f",&A[i][j]);
         }
       }
       fclose(fid);
    }
    
  2. Výpis čtvercové matice na obrazovku.
      printf("Matice:\n------------\n");
      for(i=0;i<n;i++)
      {
         for(j=0;j<n;j++)
         {
            printf("%f ",A[i][j]);
         }
         printf("\n");
      }
    
  3. Součet matic. (Využívá funkce pro načtení matice a tisk matice, a knihovnu stdio.h)
    main()
    {
      float A[100][100],B[100][100],C[100][100];
      int n,nB;
      int i,j;
    
      /* nacteni matice A ... DOPLNTE */
    
      /* nacteni matice B ... DOPLNTE */
    
      if (n!=nB)
      {
         printf("Matice nelze scitat!\n");
         return 1;
      }
    
      for(i=0;i<n;i++)
      {
        for(j=0;j<n;j++)
        {
          C[i][j]=A[i][j]+B[i][j];
        }
      }
      /* TISK MATICE C ... DOPLNTE */
      
    }
    
  4. Test symetrická matice. (Využívá funkce pro načtení matice a tisk matice, a knihovnu stdio.h)
    main()
    {
      float A[100][100];
      int n;
      int i,j;
      int symetricka;
    
      /* NACTI MATICI A ... DOPLNIT */
    
      symetricka=1;
      for(i=0;i<n;i++)
      {
        for(j=0;j<n;j++)
        {
          if (A[i][j]!=A[j][i])
          {
             symetricka=0;
          }
        }
      }
      if (symetricka==1) 
      { 
        printf("Matice je symetricka.\n");
      } 
      else
      {
        printf("Matice neni symetricka.\n");
      }
      
    }
    
  5. Výpočet součinu čtvercových matic typu n x n, C=A*B
    Jen část kódu, která výpočet dělá.
    for(i=0;i<n;i++)
    {
       for(j=0;j<n;j++)
       {  
          sum=0.;
          for(k=0;k<n;k++) 
          {
            sum=sum+A[i][k]*B[k][j];
          }
          C[i][j]=sum;
       }
    }
    
  6. Výpočet součin matice x vektor
      int i,j; 
      float sum;
    
    
    
      for(i=0;i<n;i++)
      {
         sum=0.;
         for(j=0;j<n;j++) 
          {
            sum=sum+A[i][j]*U[j];
          }
          X[i]=sum;
       }
    }
    
  7. Dynamická alokace vektoru
    
    main()
    {
      int i,n;
      float *X;
    
      printf("Zadej velikost vektoru:\n");
      scanf("%d",&n);
    
      X=(float *)malloc(sizeof(float)*n);
    
      printf("Zadej vektor:\n");
      for(i=0;i<n;i++)
      {
        scanf("%f",&X[i]);
      }
      
      printf("Vektor:\n");
      for(i=0;i<n;i++)
      {
        printf("X[%d]=%f\n",i,X[i]);
      }
      
    
      free(X);
    
      
    }  
    
  8. Funkce součet dvou vektorů s dynamickou alokací a ukázka použití
    float *soucet_vektoru(float *U,float *V,int n)
    {
       float *S;
       int i;
       S=(float *)malloc(sizeof(float)*n);
       for(i=0;i<n;i++)
       {
         S[i]=U[i]+V[i];
       }
    
       return S;
    
    }
    
    main()
    {
      float a[3],b[3];
      float *soucet;
    
      a[0]=1; a[1]=2; a[2]=-1;
      b[0]=3; b[1]=-3; b[2]=5;
    
      soucet=soucet_vektoru(a,b,3);
    
      printf("X=(%f %f %f)\n",soucet[0],soucet[1],soucet[2]);
      
      free(soucet);
    }
    

Úlohy pro 10. cvičení:
Součin obdélníkových matic, součin vektor krát obdélníková matice apod.