Advertisement
thebys

Ukol #4 C IB001/19 p2013

Dec 10th, 2013
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.70 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //Zase nejaka elementarni zacyklena maticka a fileIO/stdO
  4. struct Matrix //so nice :>
  5. {
  6.     int cols;
  7.     int rows;
  8.     int **data;
  9. };
  10.  
  11. void init( struct Matrix *m )
  12. {
  13.     //DONE: implementace tak, ze matice m bude mit vse vynulovane
  14.     //vse vcetne poctu sloupcu a radku?
  15.     m->cols = 0;
  16.     m->rows = 0;
  17.     m->data = 0; //nullptr to nebere :(
  18.     //nebo jenom nastavit nuly do data?
  19. }
  20.  
  21. void create( struct Matrix *m, int rows, int cols )
  22. {
  23.     m->cols = cols;
  24.     m->rows = rows;
  25.     m->data = (int**)malloc( rows * sizeof(int*) ); //sakra, tohle chtělo okomentovat, matne si vzpominam na nejaky ty... pole prvnich prvku?
  26.     //sizeof(int*) je velikost sloupce nebo ne? ... fuck this shit
  27.     for ( int i = 0; i < rows; ++i )
  28.     {
  29.         m->data[ i ] = (int*)malloc( cols * sizeof( int ) ); //fakt bych to potřeboval ještě jednou vysvětlit... (velikost buňky v řádku?)
  30.         for ( int j = 0; j < cols; ++j )
  31.             m->data[ i ][ j ] = 0;
  32.     }
  33. }
  34.  
  35. void destroy( struct Matrix *m )
  36. {
  37.     for ( int i = 0; i < m->rows; ++i )
  38.         free( m->data[ i ] );
  39.     free( m->data );
  40.     init( m );
  41. }
  42.  
  43. void load( struct Matrix *m, FILE *f )
  44. {
  45.     // DONE: implementace nacteni matice ze souboru v predepsanem formatu
  46.     // Hint: pouzit funkci create
  47.     if(fscanf(f, "%d %d ", &m->rows, &m->cols) != 2) //mezera za %d...mela/musi tam bejt!
  48.     {
  49.         //chyba vstupu, bylo by vhodne to osetrit
  50.     }
  51.     create(m, m->rows, m->cols); //je to(konstruktor?) void :( jinak m=create(...)?
  52.     for(int i = 0; i < m->rows; ++i)
  53.     {
  54.         for(int j = 0; j < m->cols; ++j)
  55.         {
  56.             fscanf(f, "%d ", &m->data[i][j]);
  57.             // printf("num. %d \n", m->data[i][j]); //mozno smazat, cekovani vstupu :)
  58.         }
  59.     }
  60.  
  61. }
  62.  
  63. void print( struct Matrix *m, FILE *f )
  64. {
  65.     // DONE: implemntace zapsani matice do souboru v predepsanem formatu
  66.     fprintf(f, "%d %d\n", m->rows, m->cols);
  67.     for(int i = 0; i < m->rows; ++i)
  68.     {
  69.         for(int j = 0; j < m->cols; ++j)
  70.         {
  71.             fprintf(f, "%d ", m->data[i][j]);
  72.         }
  73.         fprintf(f, "\n");
  74.     }
  75. }
  76.  
  77. void transpose( struct Matrix *m )
  78. {
  79.     // DONE: provede transpozici matice, ale pouze v pripade, ze matice je ctvercova
  80.     //chtel jsem udelat novou sturct Matrix, ale vubec mi to tady neslo deklarovat :( ...
  81.     //struct Matrix tm;
  82.     //create(&tm, m->cols, m->rows); //COLS are the new ROWS! YAY! :D //kdybych nevedel co delam, byla by to prasarna...
  83.  
  84.     //takze jsem skoncil s timhle no... skoda, rad bych na obou stranach "=" videl ->
  85.     int tm[m->cols][m->rows];
  86.  
  87.     for(int i = 0; i < m->rows; ++i)
  88.     {
  89.         for(int j = 0; j < m->cols; ++j)
  90.         {
  91.             tm[j][i] = m->data[i][j];
  92.         }
  93.     }
  94.     for(int i = 0; i < m->cols; ++i)
  95.     {
  96.         for(int j = 0; j < m->rows; ++j)
  97.         {
  98.             m->data[i][j] = tm[i][j];
  99.         }
  100.     }
  101. }
  102.  
  103. int main( )
  104. {
  105.     //vzorovy main, tyto prikazy nemente
  106.  
  107.     struct Matrix m;
  108.     FILE *file = fopen( "input.txt", "r" );
  109.     load( &m, file );
  110.     fclose( file );// zavreni souboru input.txt
  111.  
  112.     print( &m, stdout );// vypis na obrazovku, mel by byt ten samy, jako obsah souboru input.txt
  113.  
  114.     transpose( &m );
  115.  
  116.     print( &m, stdout );// vypis na obrazovku, transponovana matice
  117.  
  118.     transpose( &m );// 2. transpozice, tedy matice by mela byt shodna s puvodni
  119.  
  120.     file = fopen( "output.txt", "w" );// otevreni jineho souboru
  121.     print( &m, file );// zapis matice do souboru output.txt, mel by byt shodny se souborem input.txt (az na mezery na konci radku)
  122.     fclose( file );// zavreni souboru output.txt
  123.  
  124.     destroy( &m );// zahodit matici
  125.  
  126.     return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement