zhukov000

Untitled

Mar 10th, 2020
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.80 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <assert.h>
  5.  
  6. #define FILENAME "f"
  7. #define FILENAME2 "g"
  8.  
  9. #define MAXLENWORD 20
  10. #define MINLENWORD 5
  11.  
  12. // записать одно число
  13. void writefloat(float v, FILE *f)
  14. {
  15.   fwrite((void*)(&v), sizeof(v), 1, f);
  16.   // записать начиная с адреса &v, размер элемента sizeof(v), количество 1 элемент, файл f
  17. }
  18.  
  19. // прочитать одно число
  20. float readfloat(FILE *f)
  21. {
  22.   float v;
  23.   fread((void*)(&v), sizeof(v), 1, f);
  24.   // прочитать в адрес &v, размер элемента sizeof(v), количество 1 элемент, из файл f
  25.   return v;
  26. }
  27.  
  28. // сгенерировать случайное число в диапазоне [0, top]
  29. float gen_float(float top)
  30. {
  31.   return (float)rand() / ((float)RAND_MAX / top);
  32. }
  33.  
  34. // формирование файла для задания a
  35. void generate_a_file()
  36. {
  37.   FILE * fp = fopen(FILENAME, "w"); // открыть файл на запись (write)
  38.   assert(fp != 0);
  39.   int k = 0;
  40.   printf("Create file for task A\nCount of numbers: ");
  41.   scanf("%d", &k);
  42.   // printf("Input numbers: ");
  43.   for(int i = 0; i < k; ++i)
  44.   {
  45.     float v;
  46.     // v = scanf("%f", &v);
  47.     v = gen_float(10.0); // генерация случайного числа от 0 до 10.0
  48.     writefloat(v, fp);
  49.   }
  50.   fclose(fp);
  51. }
  52.  
  53. // генерация случайного слова длины len
  54. char * gerate_word(int len, int mod)
  55. {
  56.   assert(mod < 37 && mod > 1);
  57.   // mod задает количество символов: mod = 10 - только цифры, 10 <= mod < 37 - цифры и буквы
  58.   char * res = (char *) calloc(len+1, sizeof(char));
  59.   for(int i=0; i<len; ++i)
  60.   {
  61.     int x = rand() % mod;
  62.     if (x < 10)
  63.       res[i] = '0' + x;
  64.     else if (x < 36)
  65.       res[i] = 'A' + x - 10;
  66.   }
  67.   return res;
  68. }
  69.  
  70. // формирование файла для задания a
  71. void generate_b_file()
  72. {
  73.   FILE * fp = fopen(FILENAME, "w");
  74.   assert(fp != 0);
  75.   fflush(stdin);
  76.   int k = 0;
  77.   printf("Input word counts: ");
  78.   scanf("%d", &k);
  79.   for(int i=0; i<k-1; ++i)
  80.   {
  81.     int r = rand() % 0x7FFF; // делаем выбор на основе случайных значений
  82.     if (r < 5000) // 14%
  83.       fprintf(fp, "\n");
  84.     else if (r < 20000) // 43%
  85.       fprintf(fp, "%s ", gerate_word(rand() % MAXLENWORD + MINLENWORD, 36)); // генерация слова из букв и цифр
  86.     else if (r < 30000) // 29%
  87.       fprintf(fp, "%s ", gerate_word(rand() % MAXLENWORD + MINLENWORD, 10)); // генерация слова только из цифр
  88.     else
  89.       fprintf(fp, " ");
  90.   }
  91.   fprintf(fp, "%s", gerate_word(rand() % 20 + 5, 36)); // заканчиваем файл словом
  92.   fclose(fp);
  93. }
  94.  
  95. // показать содержимое файла a
  96. void show_a()
  97. {
  98.   float e;
  99.   FILE * fp = fopen(FILENAME, "r"); // открыть файл на чтение
  100.   assert(fp != 0);
  101.   fseek(fp, 0L, SEEK_END); // переход к концу файла
  102.   int sz = ftell(fp) / sizeof(float); // получаем количество чисел в файле
  103.   rewind(fp); // смещаемся к началу файла
  104.   // printf("%d\n", sz);
  105.  
  106.   printf("File A:\n");
  107.   for(int i=0; i<sz; ++i)
  108.   {
  109.     float v = readfloat(fp);
  110.     printf("%f ", v);
  111.   }
  112.   printf("\n");
  113.   fclose(fp);
  114. }
  115.  
  116. // получить данные из файла в виде массива вещественных чисел
  117. float * get_data_a(int * data_size)
  118. {
  119.   FILE * fp = fopen(FILENAME, "r"); // открыть файл на чтение
  120.   assert(fp != 0);
  121.  
  122.   fseek(fp, 0L, SEEK_END); // переход к концу файла
  123.   int sz = ftell(fp) / sizeof(float); // получаем количество чисел в файле
  124.   rewind(fp); // смещаемся к началу файла
  125.  
  126.   float * data = (float *)calloc(sz, sizeof(float));
  127.   fread((void *) data, sizeof(*data), sz, fp); // считываем данные в буфер (массив)
  128.   fclose(fp);
  129.  
  130.   *data_size = sz; // вернуть размер массива через параметр
  131.   return data;
  132. }
  133.  
  134. // решение задания a
  135. void solve_a()
  136. {
  137.   int sz = 0;
  138.   float * data_float = get_data_a(&sz); // читаем файл в массив
  139.  
  140.   int n;
  141.   printf("Input element number: ");
  142.   scanf("%d", &n);
  143.   assert(n > 0 && n <= sz); // номер не может быть отрицательным и не может быть больше числа компонент в файле
  144.  
  145.   FILE * fp = fopen(FILENAME, "w");
  146.   assert(fp != 0);
  147.  
  148.   float sum = 0;
  149.   for(int i=0; i<sz; ++i)
  150.     sum += data_float[i]; // считаем сумму всех элементов
  151.  
  152.   fwrite((void *)data_float, sizeof(*data_float), n, fp); // записать первые n элементов в файл
  153.   writefloat(sum, fp); // записываем сумму
  154.   if (n < sz) // если не все элементы записаны
  155.     fwrite((void *)(data_float + n), sizeof(*data_float), sz - n, fp); // записываем в файл оставшуюся часть
  156.  
  157.   free(data_float); // очистить память
  158.   fclose(fp);
  159. }
  160.  
  161. // вывод содержимого файла g на экран
  162. void show_g()
  163. {
  164.   FILE * fp = fopen(FILENAME2, "r");
  165.   assert(fp != 0);
  166.  
  167.   fseek(fp, 0L, SEEK_END); // переход к концу файла
  168.   int sz = ftell(fp) / sizeof(char); // получаем количество символов в файле
  169.   rewind(fp); // смещаемся к началу файла
  170.  
  171.   char * data = (char *)calloc(sz + 1, sizeof(char));
  172.   fread((void *) data, sizeof(*data), sz, fp);
  173.   fclose(fp);
  174.  
  175.   printf("File g:\n%s", data);
  176.   free(data);
  177. }
  178.  
  179. // решение задачи b
  180. void solve_b()
  181. {
  182.   FILE * ff = fopen(FILENAME, "r");  //  файл f открываем на чтение
  183.   FILE * fg = fopen(FILENAME2, "w");  // файл g открываем на запись
  184.   char word[256] = {0}; // буфер (массив) для чтения из файла
  185.  
  186.   // читаем из ff по словам
  187.   while (!feof(ff))
  188.   {
  189.     fscanf(ff, "%s", word); // прочитать слово из файла
  190.     int is_suit = 1;
  191.     for(int i=0; word[i] != 0; ++i) // проверяем слово - есть ли в нем не цифры
  192.       if ( word[i] < '0' || word[i] > '9' )
  193.       {
  194.         is_suit = 0;
  195.         break;
  196.       }
  197.     if (is_suit)
  198.       fprintf(fg, "%s\n"); // пишем слово в файл g, если в нем только цифры
  199.   }
  200.  
  201.   fclose(fg);
  202.   fclose(ff);
  203. }
  204.  
  205. // задача a
  206. void task_a()
  207. {
  208.   generate_a_file();  // 1. Генерация массива
  209.   show_a();           // 2. Вывод массива на экран
  210.   solve_a();          // 3. Решение задачи
  211.   show_a();           // 4. Вывод массива на экран
  212. }
  213.  
  214. // задача b
  215. void task_b()
  216. {
  217.   generate_b_file();  // 1. Генерация файла со строками
  218.   solve_b();          // 2. Решение задачи
  219.   show_g();           // 3. Вывод файла g
  220. }
  221.  
  222. // меню программы
  223. void menu()
  224. {
  225.   while (1)
  226.   {
  227.     printf("1. Task A\n2. Task B\n3. Exit\n");
  228.     int choice;
  229.     printf("Input number of action [1-3]: ");
  230.     scanf("%d", &choice);
  231.     if (choice < 1 || choice > 3)
  232.     {
  233.       printf("You type wrong number\n Please retry\n");
  234.       continue;
  235.     }
  236.     if(choice == 3) break;
  237.     if (choice == 1) task_a();
  238.     else task_b();
  239.     printf("\n");
  240.   }
  241. }
  242.  
  243. // точка входа в программу
  244. int main()
  245. {
  246.   srand(time(0)); // инициализация генератора случайных чисел
  247.   menu();
  248.   return 0;
  249. }
Advertisement
Add Comment
Please, Sign In to add comment