Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otchet_k_kursachu.doc
Скачиваний:
4
Добавлен:
25.09.2019
Размер:
300.54 Кб
Скачать

7.12 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;

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]