
- •Оглавление
- •1. Введение
- •Постановка задачи
- •2.1 Условия
- •2.2 Анализ графиков
- •3. Разработка алгоритма на языке Си
- •3.1 Проектирование
- •Реализация программы
- •3.3.1 Main.C
- •3.3.2 Library.C
- •Void times(float*, parametrs);
- •Void uins(float*, float*, parametrs);
- •Void uouts(float*, float*, parametrs);
- •Int save_full_file(char*, float*, float*, float*, parametrs);
- •Int save_maxima_file(char*, char*, char*, float*, float*, float*, parametrs);
- •Void load_file(char*, parametrs*);
- •3.3.3 Таблица констант
- •3.3.4 Таблица идентификаторов
- •4.1 Тест 1
- •5. Заключение
- •7. Приложение
- •7.11 Main.C
- •7.12 Library.C
- •7.13 Include.H
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;
}
}