Функции файлового ввода-вывода
⇐ ПредыдущаяСтр 2 из 2 int save_full_file(char*, float*, float*, float*, parametrs); Назначение: функция выполняет сохранение результатов в файл. Результаты сохраняются в виде таблицы. Перед таблицей будут описаны параметры цепи. Интерфейс: первым значением функция принимает имя файла, далее идут три указателя на массивы(отсчетов времени, входного и выходного сигналов), последним параметром структура parameters. В случае успешного сохранения функция вернет 1, а в случае ошибки – 0
int save_maxima_file(char*, char*, char*, float*, float*, float*, parametrs); Назначение: функция выполняет сохранение результатов в текстовые файлы: каждый массив сохраняется в отдельный файл. Это делается для чтения этих файлов программой wxMaxima. Интерфейс: первые три параметра – имена файлов (для отсчетов времени, для входного и для выходного сигналов), далее идут три указателя на массивы(отсчетов времени, входного и выходного сигналов), последним параметром идет структура parameters. В случае успешного сохранения функция вернет 1, а в случае ошибки – 0 Результат: После успешного выполнения этой функции в папке проекта будут сохранены три текстовых файла. void load_file(char*, parametrs*); Назначение: функция читает входные параметры из текстового файла Интерфейс: функция принимает имя файла, который нужно прочитать, и указатель на структуру parameters. Считываемые значения записываются в структуру. Возвращаемое значение отсутствует Результат: После успешного выполнения этой функции переменная структуры будет содержать рабочий набор параметров цепи. Таблица констант
Таблица идентификаторов
Тестирование программы Тест 1 Верхняя граница входного сигнала U1 = 100 В Нижняя граница входного сигнала U2 = 0 Начальное время tn = -5 с Конечное время tk = 15 c Отсчет времени t1 = 2 с Отсчет сигнала 1 0 В Отсчет сигнала 2 10 В Верхняя граница выходного сигнала 0 В Нижняя граница выходного сигнала 50 В Входной сигнал: Передаточная характеристика:
Выходной сигнал в wxMaxima Входной сигнал по точкам Выходной сигнал по точкам: Таблица Расчетов
Задний фронт входного и выходного сигнала: back front Uout = 1.005030 back front Uin = 10.452286 Заключение На данный момент написанная программа способна: · Рассчитывать входной и выходной сигналы · Находить длительность заднего фронта выходного сигнала · Выбирать варианты считывания рабочего набора · Записывать результаты в текстовый файл
Приложение Код С Main.c
#include "include.h"
int main(void) { char c; float acc; // точность, используется в пункте 4 parametrs p; // содержит текущий рабочий набор (параметры цепи) float af_time[MAXSIZE], af_uin[MAXSIZE], af_uout[MAXSIZE]; printf("COURSE WORK. VARIANT 31\n\n");
while ((c = menu())!= EXIT_CODE) { switch(c) { case 1: { // рабочий набор по умолчанию p.n = 11; p.tn = -10.0; p.tk = 8.0; p.t1 = -8.0; p.t2 = 6.0; p.ui1 = -1.0; p.ui2 = 3.0; p.uimax = 30.0; p.uimin = 0.0; p.uomax = 30.0; p.uomin = -10.0;
printf("______________________________________\n"); printf("Control calculation in %d points\n", p.n); create(af_time, af_uin, af_uout, p); display(af_time, af_uin, af_uout, p); break; } //case 1 case 2: { // чтение входных параметров из файла
//char filename[30]; //printf("filename: "); //gets(filename); //load_file(filename, &p);
load_file(F_INPUT, &p);
printf("___________________________________________________\n"); printf("Control calculation in %d points\n", p.n); create(af_time, af_uin, af_uout, p); display(af_time, af_uin, af_uout, p); break; } //case 2
case 3: { //ввод параметров с клавиатуры printf("n = "); scanf("%d", &p.n); printf("tn = "); scanf("%f", &p.tn); printf("tk = "); scanf("%f", &p.tk); printf("t1 = "); scanf("%f", &p.t1); printf("t2 = "); scanf("%f", &p.t2); printf("ui1 = "); scanf("%f", &p.ui1); printf("ui2 = "); scanf("%f", &p.ui2); printf("uimax = "); scanf("%f", &p.uimax);
printf("uimin = "); scanf("%f", &p.uimin); printf("uomax = "); scanf("%f", &p.uomax); printf("uomin = "); scanf("%f", &p.uomin);
printf("___________________________________________________\n");
printf("Control calculation in %d points\n", p.n); create(af_time, af_uin, af_uout, p); display(af_time, af_uin, af_uout, p); break; } //case 3
case 4: { // вывод на экран длительности заднего фронта выходного сигнала
printf("___________________________________________________\n");
//acc = 0.12; printf("Input accuraty = "); scanf("%f", &acc); printf("Control calculation with accuraty = %-10.5f\n", acc);
printf("back front Uout = %f\n", front(acc, p)); printf("___________________________________________________\n");
break; } //case 4
case 5: { //сохранение результатов в файл printf("___________________________________________________\n");
create(af_time, af_uin, af_uout, p); if (save_full_file(F_O_FULL, af_time, af_uin, af_uout, p)) printf("Full file saved!\n");
printf("___________________________________________________\n"); break; } //case 5 case 6: { //формирование файлов для wxMaxima printf("___________________________________________________\n");
create(af_time, af_uin, af_uout, p); if (save_maxima_file(F_O_MAXIMA_TIME, F_O_MAXIMA_UI, F_O_MAXIMA_UO, af_time, af_uin, af_uout, p)) printf("Maxima files saved!!\n");
printf("___________________________________________________\n"); break; } //case 6 case 7: { info(); break; } //case 7 default: { printf("___________________________________________________\n");
printf("ERROR: out of range\n");
printf("___________________________________________________\n"); break; } //default } //switch } //while printf("GOOD BYE!\n"); return 0; } //main()
Library.c
#include "include.h" // interface
// меню int menu(void) { int choice = 0;
printf("1.. To calculate with default parametrs press 1\n"); printf("2.. To input parametrs from file press 2\n"); printf("3.. To input free parametrs press 3\n"); printf("4.. To calculate back front of Uout press 4\n"); printf("5.. To save all calculations in.txt files press 5\n"); printf("6.. To save calculations for wxMaxima press 6\n"); printf("7.. To show information about programm press 7\n"); printf("0.. Press %d to exit\n\n", EXIT_CODE); printf("waiting user input... "); scanf("%d%*c", &choice); return choice; }
// вывод таблицы на экран void display(float* f_time, float* f_uin, float* f_uout, parametrs st) { int i;
printf("n = %d\ntn = %.3f\ntk = %.3f\nt1 = %.3f\nt2 = %.3f\n", st.n, st.tn, st.tk, st.t1, st.t2); printf("ui1 = %.3f\nui2 = %.3f\nuimax = %.3f\nuimin = %.3f\n", st.ui1, st.ui2, st.uimax, st.uimin); printf("uomax = %.3f\nuomin = %.3f\n\n", st.uomax, st.uomin);
printf("%-5s | %-7s | %-10s | %-10s\n", "step", "time", "u_in", "u_out");
for (i = 0; i < (st.n); i++) { printf("%-5d | %-7.3lf | %-10.4lf | %-10.6lf\n", i + 1, f_time[i], f_uin[i], f_uout[i]); } printf("___________________________________________________\n"); }
// вывод информации о программе void info(void) { printf("___________________________________________________\n"); printf("Cource work. variant 31\n"); printf("Implements by Nikonov Danil\n"); printf("Group: 904. SPBSUT\n"); printf("2010 year\n"); printf("___________________________________________________\n"); }
// arrays
//формирование трех массивов void create(float* f_time, float* f_uin, float* f_uout, parametrs st) { times(f_time, st); uins(f_uin, f_time, st); uouts(f_uout, f_uin, st); }
// подсчет шага при заданных начальном, конечном значениях и количестве точек float step(float f_tn, float f_tk, int i_n) { return ((f_tk - f_tn)) / ((float)(i_n - 1)); }
//формирование массива отсчетов времени void times(float* f_a, parametrs st) { float f_step = step((st.tn), (st.tk), (st.n)); float f_current = st.tn; int i; for (i = 0; i < (st.n); i++) { *f_a = f_current; f_current += f_step; f_a++; } }
//формирование массива входного сигнала void uins(float* f_uin, float* f_time, parametrs st) { int i; for (i = 0; i < (st.n); i++) { if (*f_time < (st.tn)) { *f_uin = st.uimin; } else if (*f_time < (st.t1)) { *f_uin = (*f_time - (st.tn)) * ((st.uimax) - (st.uimin)) / ((st.t1) - (st.tn)) + (st.uimin); } else if (*f_time < (st.t2)) { *f_uin = (st.uimax); } else if (*f_time < (st.tk)) { *f_uin = (*f_time - (st.t2)) * ((st.uimin) - (st.uimax)) / ((st.tk) - (st.t2)) + (st.uimax); } else { *f_uin = (st.uimin);} f_time++; f_uin++; } }
//формирование массива выходного сигнала (передаточная характеристика) void uouts(float* f_uout, float* f_uin, parametrs st) {
int i; for (i = 0; i < (st.n); i++) { if (*f_uin <= (st.ui1)) { *f_uout = (st.uomin); } else if (*f_uin < (st.ui2)) { *f_uout = (*f_uin - (st.ui1)) * ((st.uomax) - (st.uomin)) / ((st.ui2) - (st.ui1)) + (st.uomin); } else { *f_uout = (st.uomax); } f_uin++; f_uout++; } }
//подсчет количества точек для достижение требуемой точности int points_in_array_b(parametrs st, float acc) { int i_points = ci_N; float f_step = step(st.tn, st.tk, i_points); while (f_step > acc) { i_points*=2; f_step = step(st.tn, st.tk, i_points); } return i_points; }
// нахождение длительности заднего фронта выходного сигнала float front(float acc, parametrs st) { int i; float p, w, v = 10000, f_max; float time[MAXSIZE] = {0}, uin[MAXSIZE] = {0}, uout[MAXSIZE] = {0};
int i_front_min, i_front_max; do { create(time, uin, uout, st);
//находим максимальное в массиве f_max = uout[0]; for (i = 0; i < (st.n); i++) { if (uout[i] > f_max) f_max = uout[i]; }
//находим точки, по которым будем считать задний фронт выходного сигнала for (i = 0; i < (st.n); i++) { if ((uout[i] < 0.9 * f_max) && (uout[i + 1] > 0.9 * f_max)) i_front_min = i; if ((uout[i] < 0.1 * f_max) && (uout[i + 1] > 0.1 * f_max)) i_front_max = i; }
//длительность заднего фронта выходного сигнала w = time[i_front_min] - time[i_front_max];
p = fabs(w - v); if (w) v = w; (st.n)*= 2;
if ((st.n) >= (MAXSIZE/2)) { break;}
} while (p > acc);
if (p < acc) { return w; } else { printf("Demand accuraty do not reached!!;"); return 0; } }
// fileIO
// читаем параметры из файла void load_file(char* name, parametrs* st) { FILE* filestream; if (filestream = fopen(name, "r")) {
fscanf(filestream, "%d", &(st -> n)); fscanf(filestream, "%f", &(st -> tn)); fscanf(filestream, "%f", &(st -> tk));
fscanf(filestream, "%f", &(st -> t1)); fscanf(filestream, "%f", &(st -> t2)); fscanf(filestream, "%f", &(st -> ui1)); fscanf(filestream, "%f", &(st -> ui2)); fscanf(filestream, "%f", &(st -> uimax)); fscanf(filestream, "%f", &(st -> uimin)); fscanf(filestream, "%f", &(st -> uomax)); fscanf(filestream, "%f", &(st -> uomin));
fclose(filestream); } else { printf("ERROR: could not open file %s!!\n", name); } }
//сохранение результатов в файл int save_full_file(char* name, float af_time[], float af_uin[], float af_uout[], parametrs st) { const time_t timer = time(NULL); FILE *filestream;
int i; if(filestream = fopen(name, "w")) { fprintf(filestream, "SAVE TIME %s\n", ctime(&timer)); fprintf(filestream, "n = %d\ntn = %.3f\ntk = %.3f\nt1 = %.3f\nt2 = %.3f\n", st.n, st.tn, st.tk, st.t1, st.t2); fprintf(filestream, "ui1 = %.3f\nui2 = %.3f\nuimax = %.3f\nuimin = %.3f\n", st.ui1, st.ui2, st.uimax, st.uimin); fprintf(filestream, "uomax = %.3f\nuomin = %.3f\n\n", st.uomax, st.uomin); fprintf(filestream, "%-5s | %-7s | %-10s | %-10s\n", "step", "time", "u_in", "u_out"); for (i = 0; i < (st.n); i++) { fprintf(filestream, "%-5d | %-7.3lf | %-10.4lf | %-10.4lf\n", i + 1, af_time[i], af_uin[i], af_uout[i]); } fclose(filestream); return 1; } else { printf("ERROR: could not open file %s!!\n", name); return 0; } }
//создание файлов для построения дискретного графика в wxMaxima int save_maxima_file(char* name1, char* name2, char* name3, float af_time[], float af_uin[], float af_uout[], parametrs st) { FILE *filestream_t; FILE *filestream_ui; FILE *filestream_uo; int i; if (filestream_t = fopen(name1, "w")) { if (filestream_ui = fopen(name2, "w")) { if (filestream_uo = fopen(name3, "w")) { for (i = 0; i < (st.n); i++) { fprintf(filestream_t, "%-10.3lf", af_time[i]); fprintf(filestream_ui, "%-7.3lf", af_uin[i]); fprintf(filestream_uo, "%-7.3lf", af_uout[i]); } fclose(filestream_ui); fclose(filestream_uo); fclose(filestream_t); return 1; } else { printf("ERROR: could not open file %s!!\n", name3); return 0; } } else { printf("ERROR: could not open file %s!!\n", name2); return 0; } } else { printf("ERROR: could not open file %s!!\n", name1); return 0; } }
Include.h
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h>
#ifndef CONSTS_H #define CONSTS_H #define MAXSIZE 30000 #define ci_N 11 #define F_O_FULL "full.txt" #define F_O_MAXIMA_TIME "maxima_time.txt" #define F_O_MAXIMA_UI "maxima_ui.txt" #define F_O_MAXIMA_UO "maxima_uo.txt" #define F_INPUT "input.txt" #define EXIT_CODE 0 #endif //CONSTS_H
#ifndef STRUCT_H #define STRUCT_H typedef struct { int n; float tn; float tk; float t1; float t2; float ui1; float ui2; float uimax; float uimin; float uomax; float uomin; } parametrs; #endif //STRUCT_H
#ifndef INCLUDE_H #define INCLUDE_H
//work_with_arrays
/* работа с массивами */ //создание трех рабочих массивов void create(float*, float*, float*, parametrs); //вычисление шага по начальному, конечному времени и количеству точек float step(float, float, int); //создание массива отсчетов времени void times(float*, parametrs); // создание массива входного сигнала void uins(float*, float*, parametrs); // создание массива выходного сигнала void uouts(float*, float*, parametrs); // нахождение кол-ва точек для достижения необходимой точности int points_in_array_b(parametrs, float); // нахождение длительности заднего фронта float front(float, parametrs);
//interface /* интерфейс */ // меню int menu(void); // вывод таблицы на экран void display(float*, float*, float*, parametrs); // информация о программе void info(void);
//fileIO /* файловый ввод - вывод */ // сохранение результатов в файл int save_full_file(char*, float*, float*, float*, parametrs); // сохранение файла для wxMaxima int save_maxima_file(char*, char*, char*, float*, float*, float*, parametrs); // чтение рабочих параметров из файла void load_file(char*, parametrs*); #endif //INCLUDE_H
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|