Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Функции файлового ввода-вывода




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. Считываемые значения записываются в структуру. Возвращаемое значение отсутствует

Результат: После успешного выполнения этой функции переменная структуры будет содержать рабочий набор параметров цепи.

Таблица констант

Имя Назначение
MAXSIZE Максимальный размер рабочих массивов
ci_N Минимальное количество точек
F_O_FULL Имя файла для результатов
F_O_MAXIMA_TIME Имя файла для массива времени
F_O_MAXIMA_UI Имя файла для массива входного сигнала
F_O_MAXIMA_UO Имя файла для массива выходного сигнала
F_INPUT Имя файла с входными параметрами
EXIT_CODE Код выхода из меню

Таблица идентификаторов

Имя Тип Назначение
c char Используется в конструкции switch. Хранит код пункта меню, который выбрал пользователь
p; 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; Структура, хранящая все текущие рабочие параметры (параметры цепи) Определена для облегчения передачи аргументов функции. Так как намного легче передать функции один параметр, чем 11.
af_time[MAXSIZE] float Массив отсчетов времени
af_uin[MAXSIZE] float Массив входного сигнала
af_uout[MAXSIZE] float Массив выходного сигнала

Тестирование программы

Тест 1

Верхняя граница входного сигнала U1 = 100 В

Нижняя граница входного сигнала U2 = 0

Начальное время tn = -5 с

Конечное время tk = 15 c

Отсчет времени t1 = 2 с

Отсчет сигнала 1 0 В

Отсчет сигнала 2 10 В

Верхняя граница выходного сигнала 0 В

Нижняя граница выходного сигнала 50 В

Входной сигнал:

Передаточная характеристика:

 

Выходной сигнал в wxMaxima

Входной сигнал по точкам

Выходной сигнал по точкам:

Таблица Расчетов

Time Uin Uout
-5 -4.8995 -4.799 -4.6985 -4.598 -4.4975 -4.397 -4.2965 -4.196 -4.0955 -3.995 -3.8945 -3.794 -3.6935 -3.593 -3.4925 -3.392 -3.2915 -3.191 -3.0905 -2.9899 -2.8894 -2.7889 -2.6884 -2.5879 -2.4874 -2.3869 -2.2864 -2.1859 -2.0854 -1.9849 -1.8844 -1.7839 -1.6834 -1.5829 -1.4824 -1.3819 -1.2814 -1.1809 -1.0804 -0.98 f(-5)=0 f(-4.8995)=1.4358 f(-4.799)=2.8715 f(-4.6985)=4.3073 f(-4.598)=5.743 f(-4.4975)=7.1788 f(-4.397)=8.6145 f(-4.2965)=10.05 f(-4.196)=11.486 f(-4.0955)=12.922 f(-3.995)=14.358 f(-3.8945)=15.793 f(-3.794)=17.229 f(-3.6935)=18.665 f(-3.593)=20.101 f(-3.4925)=21.536 f(-3.392)=22.972 f(-3.2915)=24.408 f(-3.191)=25.844 f(-3.0905)=27.279 f(-2.9899)=28.715 f(-2.8894)=30.151 f(-2.7889)=31.587 f(-2.6884)=33.022 f(-2.5879)=34.458 f(-2.4874)=35.894 f(-2.3869)=37.33 f(-2.2864)=38.765 f(-2.1859)=40.201 f(-2.0854)=41.637 f(-1.9849)=43.073 f(-1.8844)=44.508 f(-1.7839)=45.944 f(-1.6834)=47.38 f(-1.5829)=48.816 f(-1.4824)=50.251 f(-1.3819)=51.687 f(-1.2814)=53.123 f(-1.1809)=54.559 f(-1.0804)=55.994 f(-0.98)=57.43 time=-5 p(0)=0 time=-4.8995 p(1.4358)=7.1788 time=-4.799 p(2.8715)=14.358 time=-4.6985 p(4.3073)=21.536 time=-4.598 p(5.743)=28.715 time=-4.4975 p(7.1788)=35.894 time=-4.397 p(8.6145)=43.073 time=-4.2965 p(10.05)=50 time=-4.196 p(11.486)=50 time=-4.0955 p(12.922)=50 time=-3.995 p(14.358)=50 time=-3.8945 p(15.793)=50 time=-3.794 p(17.229)=50 time=-3.6935 p(18.665)=50 time=-3.593 p(20.101)=50 time=-3.4925 p(21.536)=50 time=-3.392 p(22.972)=50 time=-3.2915 p(24.408)=50 time=-3.191 p(25.844)=50 time=-3.0905 p(27.279)=50 time=-2.9899 p(28.715)=50 time=-2.8894 p(30.151)=50 time=-2.7889 p(31.587)=50 time=-2.6884 p(33.022)=50 time=-2.5879 p(34.458)=50 time=-2.4874 p(35.894)=50 time=-2.3869 p(37.33)=50 time=-2.2864 p(38.765)=50 time=-2.1859 p(40.201)=50 time=-2.0854 p(41.637)=50 time=-1.9849 p(43.073)=50 time=-1.8844 p(44.508)=50 time=-1.7839 p(45.944)=50 time=-1.6834 p(47.38)=50 time=-1.5829 p(48.816)=50 time=-1.4824 p(50.251)=50 time=-1.3819 p(51.687)=50 time=-1.2814 p(53.123)=50 time=-1.1809 p(54.559)=50 time=-1.0804 p(55.994)=50 time=-0.98 p(57.43)=50

 

Задний фронт входного и выходного сигнала:

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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...