jazykc  2013.3
upoljazykc
 All Classes Files Functions Variables Typedefs Macros Pages
t19u1.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4 #include <math.h>
5 
6 #define VELIKOST_BLOKU 50
7 #define PRESNOST 100
8 #define DIMENZE 3
9 
10 /* hlavicky lokalnich funkci */
11 int generuj_data(char *nazev, int max, long pocet);
12 int precti_data(char *nazev);
13 double vel_vektor(double *v);
14 int uprav_data(char *nazev);
15 
16 /* definice funkci */
17 int main()
18 {
19  generuj_data("data.dat", 100, 123);
20  precti_data("data.dat");
21  uprav_data("data.dat");
22  printf("\nNova data: \n");
23  precti_data("data.dat");
24  system("pause");
25  return 0;
26 }
27 
28 /* funkce vytvori binarni soubor s cisly typu double od 0 do max - 1,
29  * parametr pocet udava pocet cisel v souboru
30  */
31 int generuj_data(char *nazev, int max, long pocet)
32 {
33  FILE *f;
34  double data[VELIKOST_BLOKU];
35  long i, j;
36  unsigned int zapsano;
37 
38  /* otevreni souboru */
39  f = fopen(nazev, "wb");
40  if (f == NULL)
41  return 1;
42 
43  /* inicializace generetoru nahodnych cisel */
44  srand((unsigned) time(NULL));
45 
46  /* generovani a zapis uplnych datovych bloku */
47  for (i = 0; i < pocet / VELIKOST_BLOKU; i++) {
48 
49  /* generovani jednoho datoveho bloku */
50  for (j = 0; j < VELIKOST_BLOKU; j++) {
51  data[j] = (rand() % (max * PRESNOST)) / (double) PRESNOST;
52  }
53 
54  /* zapis jednoho datoveho bloku */
55  zapsano = (unsigned) fwrite(data, sizeof(double), VELIKOST_BLOKU, f);
56 
57  /* test uspesnosti zapisu */
58  if (zapsano != VELIKOST_BLOKU) {
59  fclose(f);
60  return 2;
61  }
62  }
63 
64  /* generovani posledniho neuplneho datoveho bloku */
65  for (j = 0; j < pocet % VELIKOST_BLOKU; j++) {
66  data[j] = (rand() % (max * PRESNOST)) / (double) PRESNOST;
67  }
68 
69  /* zapis posledniho datoveho bloku */
70  zapsano = (unsigned) fwrite(data, sizeof(double), pocet % VELIKOST_BLOKU, f);
71 
72  /* test uspesnosti zapisu */
73  if (zapsano != pocet % VELIKOST_BLOKU) {
74  fclose(f);
75  return 2;
76  }
77 
78  /* uzavreni proudu a test uspesnosti */
79  if (EOF == fclose(f))
80  return 3;
81  return 0;
82 }
83 
84 /* funkce cte binarni soubor s cisly typu double a vypisuje je na std. vystup */
85 int precti_data(char *nazev)
86 {
87  FILE *f;
88  double data[VELIKOST_BLOKU];
89  unsigned int i;
90  unsigned int precteno;
91 
92  /* otevreni souboru */
93  f = fopen(nazev, "rb");
94  if (f == NULL)
95  return 1;
96 
97  /* cte se dokud to jde */
98  do {
99  /* cteni celeho bloku */
100  precteno = (unsigned) fread(data, sizeof(double), VELIKOST_BLOKU, f);
101 
102  /* vypis bloku dat na obrazovku */
103  for (i = 0; i < precteno; i++) {
104  printf("%g ", data[i]);
105  }
106  printf("\n");
107  } while (precteno == VELIKOST_BLOKU);
108 
109  /* uzavreni proudu a test uspesnosti */
110  if (EOF == fclose(f))
111  return 3;
112  return 0;
113 }
114 
115 /* funkce pro vypocet delky vektoru urcite DIMENZE */
116 double vel_vektor(double *v)
117 {
118  double out = 0.0;
119  int i;
120  for (i = 0; i < DIMENZE; i++)
121  out += v[i] * v[i];
122  return sqrt(out);
123 }
124 
125 int uprav_data(char *nazev)
126 {
127  /* DOPLNTE */
128 }