Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <assert.h>
- #define FILENAME "f"
- #define FILENAME2 "g"
- #define MAXLENWORD 20
- #define MINLENWORD 5
- // записать одно число
- void writefloat(float v, FILE *f)
- {
- fwrite((void*)(&v), sizeof(v), 1, f);
- // записать начиная с адреса &v, размер элемента sizeof(v), количество 1 элемент, файл f
- }
- // прочитать одно число
- float readfloat(FILE *f)
- {
- float v;
- fread((void*)(&v), sizeof(v), 1, f);
- // прочитать в адрес &v, размер элемента sizeof(v), количество 1 элемент, из файл f
- return v;
- }
- // сгенерировать случайное число в диапазоне [0, top]
- float gen_float(float top)
- {
- return (float)rand() / ((float)RAND_MAX / top);
- }
- // формирование файла для задания a
- void generate_a_file()
- {
- FILE * fp = fopen(FILENAME, "w"); // открыть файл на запись (write)
- assert(fp != 0);
- int k = 0;
- printf("Create file for task A\nCount of numbers: ");
- scanf("%d", &k);
- // printf("Input numbers: ");
- for(int i = 0; i < k; ++i)
- {
- float v;
- // v = scanf("%f", &v);
- v = gen_float(10.0); // генерация случайного числа от 0 до 10.0
- writefloat(v, fp);
- }
- fclose(fp);
- }
- // генерация случайного слова длины len
- char * gerate_word(int len, int mod)
- {
- assert(mod < 37 && mod > 1);
- // mod задает количество символов: mod = 10 - только цифры, 10 <= mod < 37 - цифры и буквы
- char * res = (char *) calloc(len+1, sizeof(char));
- for(int i=0; i<len; ++i)
- {
- int x = rand() % mod;
- if (x < 10)
- res[i] = '0' + x;
- else if (x < 36)
- res[i] = 'A' + x - 10;
- }
- return res;
- }
- // формирование файла для задания a
- void generate_b_file()
- {
- FILE * fp = fopen(FILENAME, "w");
- assert(fp != 0);
- fflush(stdin);
- int k = 0;
- printf("Input word counts: ");
- scanf("%d", &k);
- for(int i=0; i<k-1; ++i)
- {
- int r = rand() % 0x7FFF; // делаем выбор на основе случайных значений
- if (r < 5000) // 14%
- fprintf(fp, "\n");
- else if (r < 20000) // 43%
- fprintf(fp, "%s ", gerate_word(rand() % MAXLENWORD + MINLENWORD, 36)); // генерация слова из букв и цифр
- else if (r < 30000) // 29%
- fprintf(fp, "%s ", gerate_word(rand() % MAXLENWORD + MINLENWORD, 10)); // генерация слова только из цифр
- else
- fprintf(fp, " ");
- }
- fprintf(fp, "%s", gerate_word(rand() % 20 + 5, 36)); // заканчиваем файл словом
- fclose(fp);
- }
- // показать содержимое файла a
- void show_a()
- {
- float e;
- FILE * fp = fopen(FILENAME, "r"); // открыть файл на чтение
- assert(fp != 0);
- fseek(fp, 0L, SEEK_END); // переход к концу файла
- int sz = ftell(fp) / sizeof(float); // получаем количество чисел в файле
- rewind(fp); // смещаемся к началу файла
- // printf("%d\n", sz);
- printf("File A:\n");
- for(int i=0; i<sz; ++i)
- {
- float v = readfloat(fp);
- printf("%f ", v);
- }
- printf("\n");
- fclose(fp);
- }
- // получить данные из файла в виде массива вещественных чисел
- float * get_data_a(int * data_size)
- {
- FILE * fp = fopen(FILENAME, "r"); // открыть файл на чтение
- assert(fp != 0);
- fseek(fp, 0L, SEEK_END); // переход к концу файла
- int sz = ftell(fp) / sizeof(float); // получаем количество чисел в файле
- rewind(fp); // смещаемся к началу файла
- float * data = (float *)calloc(sz, sizeof(float));
- fread((void *) data, sizeof(*data), sz, fp); // считываем данные в буфер (массив)
- fclose(fp);
- *data_size = sz; // вернуть размер массива через параметр
- return data;
- }
- // решение задания a
- void solve_a()
- {
- int sz = 0;
- float * data_float = get_data_a(&sz); // читаем файл в массив
- int n;
- printf("Input element number: ");
- scanf("%d", &n);
- assert(n > 0 && n <= sz); // номер не может быть отрицательным и не может быть больше числа компонент в файле
- FILE * fp = fopen(FILENAME, "w");
- assert(fp != 0);
- float sum = 0;
- for(int i=0; i<sz; ++i)
- sum += data_float[i]; // считаем сумму всех элементов
- fwrite((void *)data_float, sizeof(*data_float), n, fp); // записать первые n элементов в файл
- writefloat(sum, fp); // записываем сумму
- if (n < sz) // если не все элементы записаны
- fwrite((void *)(data_float + n), sizeof(*data_float), sz - n, fp); // записываем в файл оставшуюся часть
- free(data_float); // очистить память
- fclose(fp);
- }
- // вывод содержимого файла g на экран
- void show_g()
- {
- FILE * fp = fopen(FILENAME2, "r");
- assert(fp != 0);
- fseek(fp, 0L, SEEK_END); // переход к концу файла
- int sz = ftell(fp) / sizeof(char); // получаем количество символов в файле
- rewind(fp); // смещаемся к началу файла
- char * data = (char *)calloc(sz + 1, sizeof(char));
- fread((void *) data, sizeof(*data), sz, fp);
- fclose(fp);
- printf("File g:\n%s", data);
- free(data);
- }
- // решение задачи b
- void solve_b()
- {
- FILE * ff = fopen(FILENAME, "r"); // файл f открываем на чтение
- FILE * fg = fopen(FILENAME2, "w"); // файл g открываем на запись
- char word[256] = {0}; // буфер (массив) для чтения из файла
- // читаем из ff по словам
- while (!feof(ff))
- {
- fscanf(ff, "%s", word); // прочитать слово из файла
- int is_suit = 1;
- for(int i=0; word[i] != 0; ++i) // проверяем слово - есть ли в нем не цифры
- if ( word[i] < '0' || word[i] > '9' )
- {
- is_suit = 0;
- break;
- }
- if (is_suit)
- fprintf(fg, "%s\n"); // пишем слово в файл g, если в нем только цифры
- }
- fclose(fg);
- fclose(ff);
- }
- // задача a
- void task_a()
- {
- generate_a_file(); // 1. Генерация массива
- show_a(); // 2. Вывод массива на экран
- solve_a(); // 3. Решение задачи
- show_a(); // 4. Вывод массива на экран
- }
- // задача b
- void task_b()
- {
- generate_b_file(); // 1. Генерация файла со строками
- solve_b(); // 2. Решение задачи
- show_g(); // 3. Вывод файла g
- }
- // меню программы
- void menu()
- {
- while (1)
- {
- printf("1. Task A\n2. Task B\n3. Exit\n");
- int choice;
- printf("Input number of action [1-3]: ");
- scanf("%d", &choice);
- if (choice < 1 || choice > 3)
- {
- printf("You type wrong number\n Please retry\n");
- continue;
- }
- if(choice == 3) break;
- if (choice == 1) task_a();
- else task_b();
- printf("\n");
- }
- }
- // точка входа в программу
- int main()
- {
- srand(time(0)); // инициализация генератора случайных чисел
- menu();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment