Анализ сигнала на выходе электрической сети

Курсовая работа по предмету «Программирование»
Информация о работе
  • Тема: Анализ сигнала на выходе электрической сети
  • Количество скачиваний: 39
  • Тип: Курсовая работа
  • Предмет: Программирование
  • Количество страниц: 26
  • Язык работы: Русский язык
  • Дата загрузки: 2015-01-11 23:48:13
  • Размер файла: 111.53 кб
Помогла работа? Поделись ссылкой
Информация о документе

Документ предоставляется как есть, мы не несем ответственности, за правильность представленной в нём информации. Используя информацию для подготовки своей работы необходимо помнить, что текст работы может быть устаревшим, работа может не пройти проверку на заимствования.

Если Вы являетесь автором текста представленного на данной странице и не хотите чтобы он был размешён на нашем сайте напишите об этом перейдя по ссылке: «Правообладателям»

Можно ли скачать документ с работой

Да, скачать документ можно бесплатно, без регистрации перейдя по ссылке:

КУРСОВАЯ РАБОТА
по дисциплине
«Программирование»
на тему:
«Анализ сигнала на выходе электрической сети»





Вариант 22
Выполнил: студент первого курса факультета ИКСС группы ИКПИ-42
Научный руководитель: профессор кафедры цифровой и вычислительной техники и информатики (ЦВТ и И)


Оглавление
Введение 4
1. Постановка задачи 5
2. Анализ поставленной задачи 6
3. Таблица идентификаторов 6
4. Разработка структуры программы 6
5. Реализация программы 7
5.1. Описание меню 7
5.2. Описание функций 8
5.2.1. main() иget_choice() 8
5.2.2. FILE* get_file( 8
5.2.3. void input_from_keyboard_and_create_arrays() 9
5.2.4. void input_from_file_and_create_arrays() 9
5.2.5. void create_array_Time() 9
5.2.6. void create_array_Uvx() 9
5.2.7. void create_array_Uvix() 9
5.2.8. void table_display() 10
5.2.9. void table_save() 10
5.2.10. int table_load() 10
5.2.11. double calc_dlit() 10
5.2.12. Функции для записи массивов для wxMaxima 11
6. Тестирование программы 11
6.1. Тест большого сигнала 11
6.2. Тест малого сигнала 13
6.3. Контрольный расчет 14
7. Инструкция пользователю 16
Заключение 18
Использованная литература 19
Приложение 20
1. Исходные файлы 20
1.1. menu.c 20
1.2. main.c 20
1.3. arrays.c 21
2. Заголовочные файлы 25
2.1. menu.h 25
2.2. arrays.h 25


Введение
Целью данной курсовой работы является получение навыков в разработке программного обеспечения, а также анализ и решение поставленной задачи и обоснование выбранных методов реализации программы.

Постановка задачи
Имеется электрическая цепь, входной сигналUвх которой задан функцией, зависящей от времени t:
Uвх(t)={█(0,&при t<tнач@U/(t1-tнач)*(t-tнач),&при tнач≤t<t1@U/(tкон-t1)*(tкон-t),&при t1≤t≤tкон@0,&при tкон≤t)┤
Рабочий набор:
tнач=10с
t1=12с
tкон=28с
U=100В
Сигнал на выходе Uвых формируется в соответствии с передаточной характеристикой:

Рабочий набор:
U1=10В
U2=100В
Нужно вывести формулу зависимости Uвых от t. Рассчитать значения Uвх и Uвых, записать значения в файл и построить графики зависимости Uвх и Uвых от t. Также необходимо рассчитать длительность импульса для входного и выходного сигнала.
Анализ поставленной задачи
Рассмотрим график зависимости Uвых от Uвх. Очевидно, что выходной сигнал Uвых здесь задан функциями: Uвых(Uвх)=U2/U1 Uвх и Uвых(Uвх)=U2. Таким образом, можно ввести систему уравнений для выходного сигнала:
Uвых(Uвх)={█(U2/U1*Uвх,&Uвх≤U1@U2,&Uвх>U1)┤
Таблица идентификаторов
Обозначение в задаче Идентификатор Назначение
tнач tn начальный момент времени наблюдения входного напряжения
tкон tk конечный момент времени наблюдения входного напряжения
N n количество точек разбиения
t Time[MSIZE] массив времени
Uвх Uvx[MSIZE] массив входного напряжения
Uвых Uvix[MSIZE] массив выходного напряжения
- dt шаг между точками разбиения
t1 t1 константа времени
U u константа входного сигнала
U1 u1 константа выходного сигнала
U2 u2 константа выходного сигнала
- dlit_Uvx длительность импульса входного сигнала
- dlit_Uvix длительность импульса выходного синала
Разработка структуры программы
Программа разбита на функции, выполняющие свои задачи. Функции будут сгруппированы в модули, решающие схожие задачи. Возможны различные варианты организации структуры – программа может состоять из единственного файла, но гораздо целесообразнее разбить ее на модули. Разбиение на модули может происходить по-разному, но исходя из того, что наша программа имеет меню, выделим главный модуль, в котором опишем действия в меню, модуль, описывающий интерфейс меню и модуль, в котором описаны все расчеты.
Роль массивов в реализации функций программы существенна –эта структура данных, представляющая собой набор элементов одного типа, позволяет нам с легкостью хранить и обращаться к данным программы независимо от их объема.
Реализация программы
Описание меню
Для удобства взаимодействия пользователя с программой имеется меню, в котором при выборе номера пункта выполняется одна из следующих функций:
Ввод данных с клавиатуры. Пользователь вводит количество точек (N), начальное значение t (tn), константу времени (t1), конечное значение t (tk), напряжение U и константы, необходимые для расчета выходного сигнала: U1 и U2. Вводимые данные записываются в соответствующие переменные, затем формируются массивы значений Time, Uvxи Uvix для N точек от tnдо tk. Значения временных характеристик записываются в переменные dlit_Uvx и dlit_Uvix (длительности входного и выходного сигнала).
Ввод данных из файла. Пользователь вводит имя файла, из которого читаются те же исходные данные, записанные в виде:
N: <целое_число>
tn: <вещественное_число>
t1: <вещественное_число>
tk: <вещественное_число>
u: <вещественное_число>
u1: <вещественное_число>
u2: <вещественное_число>
В остальном функция не отличается от описанной в первом пункте: производятся те же расчеты и создаются массивы.
Вывод на экран таблицы. На экран выводитсятаблица вычисленных значенийTime, Uvx, Uvix для Nточек с tnдо tk.
Сохранение таблицы в файл. Пользователь вводит имя файла, в который сохраняются исходные данные, значения временных характеристик и таблица значений Time, Uvxи Uvix для Nточек с tnдо tk.
Загрузка таблицы. Пользователь вводит имя файла, в котором хранится таблица, записанная предыдущим пунктом меню. Программой производится загрузка и запись в переменные исходных данных, временных характеристик и элементов массивов Time, Uvx и Uvix.
Вывод длительности импульса для входного сигнала (Uvx) и выходного (Uvix).
Выход. Завершение работы программы.
Описание функций
main() иget_choice()
Функция main() описана в модуле main.c. В функции реализован вызов функций, соответствующих выбранному пункту меню, посредством переключателя switch, заключенный в цикл while (выводить меню пока не будет введено значение, равное EXIT_CODE (объявленное в menu.h), по которому происходит выход из программы).
Функция get_choice() описана в модуле menu.c. Вывод строк меню. Также имеется защита от ввода неправильного числа.
FILE* get_file(
Пользователь вводит имя файла, и программа открывает файл с этим именем. Параметром функции является параметр открытия файла: запись “w” или чтение “r”. Функция вспомогательная, необходима функциям ввода-вывода. Закрытие файла необходимо вызывать в функции, использующей get_file().
voidinput_from_keyboard_and_create_arrays()
В параметрах функции передаются адреса на переменные исходных данных, временных характеристик и массивов. Пользователь вводит исходные данные (количество точек N, tn, t1, tk, U, U1, U2) затем программа формирует массивы значений Time, Uvxи Uvix в соответствующих функциях:
create_array_Time(*n, *tn, *tk, Time);
create_array_Uvx(*n, *tn, *t1, *tk, *u, Time, Uvx);
create_array_Uvix(*n, *u1, *u2, Uvx, Uvix);
а также считает и записывает значения временных характеристик:
*dlit_Uvx = calc_dlit(*n, Uvx, Time[1]-Time[0]);
*dlit_Uvix = calc_dlit(*n, Uvix, Time[1]-Time[0]);
voidinput_from_file_and_create_arrays()
Функция аналогична предыдущей, с разницей лишь в том, что чтение исходных данных происходит не с клавиатуры а из файла, который передается параметром get_file("r").
voidcreate_array_Time()
В параметрах передается количество точек N, tn, tk и формируемый массив Time. Расчет шага dt по формуле dt=(tk-tn)/(n-1). Создание массива времени Timeс tnпо tkс шагом dt.
voidcreate_array_Uvx()
Параметры функции: n, tn, t1, tk, u, массив времени Time и формируемый массив Uvx. Массив заполняется в соответствии с системой:
Uвх(t)={█(0,&при t<tнач@U/(t1-tнач)*(t-tнач),&при tнач≤t<t1@U/(tкон-t1)*(tкон-t),&при t1≤t≤tкон@0,&при tкон≤t)┤
voidcreate_array_Uvix()
В параметрах функции количество точек n, параметры u1 и u2, массив значений входного сигнала Uvx и формируемый массив значений выходного сигнала Uvix. Формирование массива происходит в соответствии с системой:
Uвых(Uвх)={█(U2/U1*Uвх,&Uвх≤U1@U2,&Uвх>U1)┤
voidtable_display()
В функцию передается количество точек n и массивы Time, Uvx, Uvix. На экран выводится таблица, состоящая из заголовка и nстрок значений Time, Uvx и Uvix.
voidtable_save()
Параметры функции – все исходные данные, массивы Time, Uvx и Uvix, длительности импульса входного и выходного сигнала и файл.
Функция сохраняет в файл, передаваемый параметром, исходные данные, временные характеристики и таблицу n значений Time, Uvxи Uvix.
inttable_load()
В параметрах функции передаются указатели на переменные исходных данных, временных характеристик и массивы времени, входного и выходного сигнала и файл.
Функция читает из файла с таблицей, записанной функцией table_save(), указанные выше значения, пропуская пустые и текстовые строки.
Возвращаемое значение функции – n, количество строк считанной таблицы.
doublecalc_dlit()
Параметры функции – количество точек n, массив напряженияи шаг времени dt. Функция выполняет расчет длительности импульса на уровне 0.5 от максимального значения сигнала. Uimp=Umin +0.5*(Umax - Umin)
Здесь Umax – максимальное значение массива отсчетов сигнала,
Umin- минимальное значение массива отсчетов сигнала,
Umax-Umin – амплитуда сигнала.
Программа рассчитывает Umaxи Umin, считает Uimp, а затем с помощью цикла считает в скольких точках значение сигнала больше либо равно Uimp, и получившееся значение, умноженное на шаг dt, и возвращает функция.
Функции для записи массивов для wxMaxima
voidwrite_array()
Параметры функции – количество точек n, массив и имя файла строкового типа. Функция открывает файл с указанным именем для записи? записывает туда значения массива через пробел и закрывает файл.
voidwrite_arrays_for_plot()
Параметры функции – количество точек n, массивы Time, Uvx, Uvix. Функция записывает в текстовые файлы Time.txt, Uvx.txt, Uvix.txt массивы, вызывая функции write_array() для каждого массива.
Тестирование программы
Тесты, подтверждающие правильность работы программы, выполненные в wxMaxima.
Тест большого сигнала
N=21,tn=20с,t1=30с,tk=40с,U=100В,U1=10В,U2=100В
Time Uvx UvxwxMaxima Uvix UvixwxMaxima
20.000 0.000 0 0.000 0
21.000 10.000 10 100.000 100
22.000 20.000 20 100.000 100
23.000 30.000 30 100.000 100
24.000 40.000 40 100.000 100
25.000 50.000 50 100.000 100
26.000 60.000 60 100.000 100
27.000 70.000 70 100.000 100
28.000 80.000 80 100.000 100
29.000 90.000 90 100.000 100
30.000 100.000 100 100.000 100
31.000 90.000 90 100.000 100
32.000 80.000 80 100.000 100
33.000 70.000 70 100.000 100
34.000 60.000 60 100.000 100
35.000 50.000 50 100.000 100
36.000 40.000 40 100.000 100
37.000 30.000 30 100.000 100
38.000 20.000 20 100.000 100
39.000 10.000 10 100.000 100
40.000 0.000 0 0.000 0
График зависимости Uvx(t) для большого сигнала:

Uvix(t):

Тест малого сигнала
N=21,tn=20с,t1=30с,tk=40с,U=1В,U1=10В,U2=100В
Time Uvx UvxwxMaxima Uvix UvixwxMaxima
20.000 0.000 0 0.000 0
21.000 0.100 1 1.000 1
22.000 0.200 2 2.000 2
23.000 0.300 3 3.000 3
24.000 0.400 4 4.000 4
25.000 0.500 5 5.000 5
26.000 0.600 6 6.000 6
27.000 0.700 7 7.000 7
28.000 0.800 8 8.000 8
29.000 0.900 9 9.000 9
30.000 1.000 10 10.000 10
31.000 0.900 9 9.000 9
32.000 0.800 8 8.000 8
33.000 0.700 7 7.000 7
34.000 0.600 6 6.000 6
35.000 0.500 5 5.000 5
36.000 0.400 4 4.000 4
37.000 0.300 3 3.000 3
38.000 0.200 2 2.000 2
39.000 0.100 1 1.000 1
40.000 0.000 0 0.000 0
График зависимости Uvx(t) для малого сигнала:

Uvix(t):


Контрольный расчет
N=19,tn=10с,t1=12с,tk=28с,U=100В,U1=10В,U2=100В
Time Uvx UvxwxMaxima Uvix UvixwxMaxima
10.000 0.000 0 0.000 0
11.000 50.000 50 100.000 100
12.000 100.000 100.0 100.000 100
13.000 93.750 93.75 100.000 100
14.000 87.500 87.5 100.000 100
15.000 81.250 81.25 100.000 100
16.000 75.000 75.0 100.000 100
17.000 68.750 68.75 100.000 100
18.000 62.500 62.5 100.000 100
19.000 56.250 56.25 100.000 100
20.000 50.000 50.0 100.000 100
21.000 43.750 43.75 100.000 100
22.000 37.500 37.5 100.000 100
23.000 31.250 31.25 100.000 100
24.000 25.000 25.0 100.000 100
25.000 18.750 18.75 100.000 100
26.000 12.500 12.5 100.000 100
27.000 6.250 6.25 62.500 62.5
28.000 0.000 0 0.000 0
График зависимости Uvx(t) для рабочего набора:

Uvix(t):

Инструкция пользователю
Сразу после запуска программы вы увидите текстовое меню. Для того чтобы выбрать какой-либо пункт меню нужно ввести число от 1 до 8и нажать [Enter] (Вводить можно только числа без кавычек):
Чтобы ввести исходные данные с клавиатуры введите «1». Далее вводите данные следуя подсказкам. Вводите только (!) числа. В качестве значения для ввода количества точек можно использовать только целое число. После ввода очередного числа нажмите [Enter]. Когда на экране снова появится меню – ввод данных закончен.
Для использования альтернативного варианта (и, по мнению автора, наиболее удобного) ввода данных – из файла, введите «2». После этого вам нужно ввести с клавиатуры имя файла, в котором хранятся исходные данные в таком виде:
N: 41
tn: 20
t1: 30
tk: 40
u: 20
u1: 10
u2: 100
После ввода имени файла нажмите [Enter] и данные загрузятся в программу.
Введите «3» чтобы вывести на экран таблицу рассчитанных значений времени (Time), входного сигнала (Uvx)и выходного сигнала (Uvix).
Для сохранения файла, содержащего исходные данные, длительность импульса входного и выходного сигнала, а такжетаблицу значений времени (Time), входного сигнала (Uvx)и выходного сигнала (Uvix) в файл введите «4», затем введите имя файла и снова нажмите [Enter].
Чтобы загрузить файл, содержащий исходные данные, временные характеристики (длительности импульсов) и таблицу значений времени (Time), входного сигнала (Uvx)и выходного сигнала (Uvix)введите «5», затем имя файла, содержащего эти данные и нажмите [Enter].
Для вывода на экран временных характеристик введите «6».
Введите «7» для формирования файлов, содержащих массивы времени, входного и выходного напряжения, для дальнейшего использования wxMaxima’ой. Затем запустите plot.wxmв wxMaxima чтобы построить графики зависимости Uвх(t) и Uвых(t).
Для выхода из программы введите «8».
Правила ввода имени файла:
Имя файла вводится в формате «имя.расширение» и содержит только латинские символы, точку и цифры.

Заключение
По заданным начальным данным были получены следующие результаты:
• Расчет для n равностоящих точек значений времени t, напряжения входного сигнала Uвх(t) и напряжения выходного сигнала Uвых(t).
• Расчет параметров для Uвых(t).
• Сделана запись в файл.
• Построены графики зависимости напряжения входного и выходного сигнала в wxMaxima.
• Сделан контрольный расчёт в wxMaxima. Результаты вычислений в NetBeans сошлись с результатами в wxMaxima.
Поставленная задача успешно проанализирована и решена, получены навыки разработки программного обеспечения на языке C, а также навыки отладки и тестирования программы. Так как программа имеет модульную структуру, легко осуществить ее возможное расширение. Например, возможно добавить графический интерфейс переписав меню, но не затрагивая остального кода; также программа может быть адаптирована под решение более сложной задачи путем расширения соответствующих функций вычислений.

Использованная литература
1. Б. Керниган, Д. Ритчи – «Язык программирования С» 2011
2. С. В. Козин, Н. А. Матиясевич– «Практикум по программированию на языке Си. Часть 1» 2008
3. Л. Н. Бережной И.О. Воронцова Д.В. Окунева– «Информатика. Анализ сигнала на выходе электрической цепи. Методические указания к курсовой работе» 2012

Приложение
Исходный код:
Исходные файлы
menu.c
#include<stdio.h>
#include"menu.h"
intget_choice()
{
intchoice;
printf("


");
printf("%5d %-50s
", 1, "Input source data from the keyboard");
printf("%5d %-50s
", 2, "Input source data from file");
printf("%5d %-50s
", 3, "Show table on screen");
printf("%5d %-50s
", 4, "Save table to file");
printf("%5d %-50s
", 5, "Load table from file");
printf("%5d %-50s
", 6, "Show pulse duration");
printf("%5d %-50s
", 7, "Plot");
printf("%5d %-50s
", EXIT_CODE, "Exit");
printf("Your choice: ");
scanf("%d%*c", &choice);
while (choice < 1 || choice > EXIT_CODE)
{
printf("Range choice: 1 .. %d
", EXIT_CODE);
printf("Your choice: ");
scanf("%d%*c", &choice);
}
returnchoice;
}
main.c
#include<stdio.h>
#include "arrays.h"
#include "menu.h"

intmain(void)
{
intchoice, n = 21;
doubletn = 20.0, tk = 40.0, t1 = 30.0, u = 50.0, u1 = 10.0, u2 = 100.0;
doubledlit_Uvx, dlit_Uvix;
double Time[MSIZE], Uvx[MSIZE], Uvix[MSIZE];

create_array_Time(n, tn, tk, Time);
create_array_Uvx(n, tn, t1, tk, u, Time, Uvx);
create_array_Uvix(n, u1, u2, Uvx, Uvix);
dlit_Uvx = calc_dlit(n, Uvx, Time[1]-Time[0]);
dlit_Uvix = calc_dlit(n, Uvix, Time[1]-Time[0]);

while ((choice = get_choice()) != EXIT_CODE)
{
switch (choice)
{
case 1:// Вводданныхсклавиатуры
input_from_keyboard_and_create_arrays(&n, &tn, &t1, &tk, &u,
&u1, &u2, Time, Uvx, Uvix, &dlit_Uvx, &dlit_Uvix);
break;
case 2:// Ввод данных из файла
input_from_file_and_create_arrays(&n, &tn, &t1, &tk, &u, &u1,
&u2, Time, Uvx, Uvix, &dlit_Uvx, &dlit_Uvix,
get_file("r"));
break;
case 3:// Выводтаблицынаэкран
table_display(n, Time, Uvx, Uvix);
break;
case 4:// Сохранение таблицы в файл
table_save(n, tn, t1, tk, u, u1, u2, Time, Uvx, Uvix, dlit_Uvx,
dlit_Uvix, get_file("w"));
break;
case 5:// Загрузка таблицы из файла
n = table_load(&tn, &t1, &tk, &u, &u1, &u2, Time, Uvx, Uvix,
&dlit_Uvx, &dlit_Uvix, get_file("r"));
break;
case 6:// Выводдлительностиимпульса
printf("Pulse duration for:
Uvx: %f
Uvix:%f",
dlit_Uvx = calc_dlit(n, Uvx, Time[1]-Time[0]),
dlit_Uvix = calc_dlit(n, Uvix, Time[1]-Time[0]));
break;
case 7:// Построениеграфиков
write_arrays_for_plot(n, Time, Uvx, Uvix);
break;
case EXIT_CODE: // Завершение работы
printf("End of work
");
getchar();
break;
}
}
return 0;
}
arrays.c
#include<stdio.h>
#include"arrays.h"
#include<math.h>

// Открытие файла
FILE* get_file(char parametr[])
{
FILE* f;
char filename[MSIZE] = "";
printf("Filename: ");
gets(filename);
f = fopen(filename, parametr);
return f;
}

// Ввод исходных данных с клавиатуры
voidinput_from_keyboard_and_create_arrays(int* n, double* tn, double* t1,
double* tk, double* u, double* u1, double* u2, double Time[],
doubleUvx[], double Uvix[], double* dlit_Uvx, double* dlit_Uvix)
{
printf("%-5s ","N: ");
scanf("%d", n);
printf("%-5s ","tn: ");
scanf("%lf", tn);
printf("%-5s ","t1: ");
scanf("%lf", t1);
printf("%-5s ","tk: ");
scanf("%lf", tk);
printf("%-5s ","U: ");
scanf("%lf", u);
printf("%-5s ","U1: ");
scanf("%lf", u1);
printf("%-5s ","U2: ");
scanf("%lf", u2);

create_array_Time(*n, *tn, *tk, Time);
create_array_Uvx(*n, *tn, *t1, *tk, *u, Time, Uvx);
create_array_Uvix(*n, *u1, *u2, Uvx, Uvix);

*dlit_Uvx = calc_dlit(*n, Uvx, Time[1]-Time[0]);
*dlit_Uvix = calc_dlit(*n, Uvix, Time[1]-Time[0]);

printf("Initial data successfully entered
");
}

// Вводисходныхданныхизфайла
voidinput_from_file_and_create_arrays(int* n, double* tn, double* t1,
double* tk, double* u, double* u1, double* u2, double Time[],
doubleUvx[], double Uvix[], double* dlit_Uvx, double* dlit_Uvix, FILE* f)
{
if (f != NULL)
{
fscanf(f, "%*s%d", n);
fscanf(f, "%*s%lf", tn);
fscanf(f, "%*s%lf", t1);
fscanf(f, "%*s%lf", tk);
fscanf(f, "%*s%lf", u);
fscanf(f, "%*s%lf", u1);
fscanf(f, "%*s%lf", u2);

create_array_Time(*n, *tn, *tk, Time);
create_array_Uvx(*n, *tn, *t1, *tk, *u, Time, Uvx);
create_array_Uvix(*n, *u1, *u2, Uvx, Uvix);

*dlit_Uvx = calc_dlit(*n, Uvx, Time[1]-Time[0]);
*dlit_Uvix = calc_dlit(*n, Uvix, Time[1]-Time[0]);

printf("Initial data successfully entered
");
}
else
printf("Can not open file
");
fclose(f);
}

// Созданиемассива Time
voidcreate_array_Time(constint n, const double tn, const double tk,
double Time[])
{
doubledt = (tk - tn) / (n - 1);
double t = tn;
for (inti = 0; i< n; i++)
{
Time[i] = t;
t += dt;
}
}

// СозданиемассиваUvx
voidcreate_array_Uvx(constint n, const double tn, const double t1,
const double tk, const double u, const double Time[], double Uvx[])
{
for (inti = 0; i< n; i++)
{
if (Time[i] <tn)
Uvx[i] = 0;
else if (Time[i] < t1)
Uvx[i] = u * (Time[i] - tn) / (t1 - tn);
else if (Time[i] <= tk)
Uvx[i] = u / (tk - t1) * (tk - Time[i]);
else
Uvx[i] = 0;
}
}

// Создание массива Uvix
voidcreate_array_Uvix(constint n, const double u1,
const double u2, const double Uvx[], double Uvix[])
{
for (inti = 0; i< n; i++)
{
if (Uvx[i] <= u1)
Uvix[i] = Uvx[i] * u2 / u1;
else
Uvix[i] = u2;
}
}

// Выводтаблицынаэкран
voidtable_display(constint n, const double Time[], const double Uvx[],
const double Uvix[])
{
printf("%10s %10s %10s %10s
", "Number", "Time", "Uvx", "Uvix");
for (inti = 0; i< n; i++)
{
printf("%10d %10.3lf %10.3lf %10.3lf
", i+1, Time[i], Uvx[i],
Uvix[i]);
}
}

// Сохранение таблицы значений t, Uvx и Uvix в файл
voidtable_save(constint n, const double tn, const double t1, const double tk,
const double u, const double u1, const double u2, const double Time[],
const double Uvx[], const double Uvix[], const double dlit_Uvx,
const double dlit_Uvix, FILE* f)
{
fprintf(f, "%10s %10s %10s %10s %10s %10s
", "tn", "t1", "tk", "u",
"u1", "u2");
fprintf(f, "%10.3f %10.3f %10.3f %10.3f %10.3f %10.3f
", tn, t1, tk,
u, u1, u2);

fprintf(f, "
%30s
", "Pulse duration");
fprintf(f, "%17s%17s
", "Uvx", "Uvix");
fprintf(f, "%17.3f%17.3f
", dlit_Uvx, dlit_Uvix);

fprintf(f, "
%35s

", "Input/Output Signal: ");
fprintf(f, "%10s %10s %10s %10s
", "Number", "Time", "Uvx", "Uvix");
for (inti = 0; i< n; i++)
{
fprintf(f, "%10d %10.3f %10.3f %10.3f
", i+1, Time[i], Uvx[i],
Uvix[i]);
}

fclose(f);
printf("Table successfully saved to file");
}

// Загрузка сохраненной таблицы значений t, Uvx и Uvix из файла.
// Функция возварщает n - количество точек
inttable_load(double* tn, double* t1, double* tk, double* u, double* u1,
double* u2, double Time[], double Uvx[], double Uvix[],
double* dlit_Uvx, double* dlit_Uvix, FILE* f)
{
inti = 0;
charbuf[MSIZE] = "";

if (f != NULL)
{
fgets(buf, sizeof(buf), f);
fscanf(f, "%lf%lf%lf%lf%lf%lf", tn, t1, tk, u, u1, u2);
for (inti = 0; i< 4; i++)
fgets(buf, sizeof(buf), f);
fscanf(f, "%lf%lf", dlit_Uvx, dlit_Uvix);
for (int i = 0; i < 5; i++)
fgets(buf, sizeof(buf), f);
while (fscanf(f, "%*d%lf%lf%lf", &Time[i], &Uvx[i], &Uvix[i]) != EOF)
i++;

printf("Table successfully loaded
");
}
else
printf("Can not open file
");

fclose(f);
return i;
}

// Расчет длительности импульса
doublecalc_dlit(constint n, const double U[], const double dt)
{
int count = 0;
doubleUmax = U[0];
doubleUmin = U[0];

for (inti = 1; i< n; i++)
{
if (U[i] >Umax)
Umax = U[i];
if (U[i] <Umin)
Umin = U[i];
}
doubleUimp = Umin+0.5*(Umax-Umin);

for (inti = 0; i< n; i++)
if (U[i] >= Uimp)
count++;
returndt*(count-1);
}

/* РАБОТА С ГРАФИКАМИ - НАЧАЛО */
// Запись массива в файл для wxMaxima
voidwrite_array(constint n, const double array[],
const char filename[])
{
FILE* f = fopen(filename, "w");
for(inti=0; i<n; i++)
fprintf(f, "%f ", array[i]);
fclose(f);
}

// Записьмассивов Time, Uvx, UvixвфайлыдляwxMaxima
voidwrite_arrays_for_plot(constint n, const double Time[], const double Uvx[],
const double Uvix[])
{
write_array(n, Time, "Time.txt");
write_array(n, Uvx, "Uvx.txt");
write_array(n, Uvix, "Uvix.txt");
printf("%s
", "Arrays saved to Time, Uvx and Uvix format "txt".");
printf("%s
", "To plot run "plot.wxm"");
}
/* РАБОТА С ГРАФИКАМИ - КОНЕЦ */
Заголовочные файлы
menu.h
#ifndef _MENU_H

#define _MENU_H
intget_choice();
#define EXIT_CODE 8

#endif
arrays.h
#ifndef _ARRAYS_H

#define _ARRAYS_H
#define MSIZE 100

// Вводисходныхданныхсклавиатуры
voidinput_from_keyboard_and_create_arrays(int* n, double* tn, double* t1,
double* tk, double* u, double* u1, double* u2, double Time[],
doubleUvx[], double Uvix[], double* dlit_Uvx, double* dlit_Uvix);

// Вводисходныхданныхизфайла
voidinput_from_file_and_create_arrays(int* n, double* tn, double* t1,
double* tk, double* u, double* u1, double* u2, double Time[],
doubleUvx[], double Uvix[], double* dlit_Uvx, double* dlit_Uvix, FILE* f);

// Созданиемассива Time
voidcreate_array_Time(constint n, const double tn, const double tk,
double Time[]);

// СозданиемассиваUvx
voidcreate_array_Uvx(constint n, const double tn, const double t1,
const double tk, const double u, const double Time[], double Uvx[]);

// СозданиемассиваUvix
voidcreate_array_Uvix(constint n, const double u1,
const double u2, const double Uvx[], double Uvix[]);

// Выводтаблицынаэкран
voidtable_display(constint n, const double Time[], const double Uvx[],
constdoubleUvix[]);

// Сохранение исходных данных и таблицы значений t, Uvx и Uvix в файл
voidtable_save(constint n, const double tn, const double t1, const double tk,
const double u, const double u1, const double u2, const double Time[],
const double Uvx[], const double Uvix[], const double dlit_Uvx,
const double dlit_Uvix, FILE* f);

// Загрузка исходных данных и таблицы значений t, Uvx и Uvix из файла.
// Функциявозварщает n - количествоточек
inttable_load(double* tn, double* t1, double* tk, double* u, double* u1,
double* u2, double Time[], double Uvx[], double Uvix[],
double* dlit_Uvx, double* dlit_Uvix, FILE* f);

// Открытиефайла
FILE* get_file(char parametr[]);

// Расчетдлительностиимпульса
doublecalc_dlit(constint n, const double U[], const double dt);

/* РАБОТА С ГРАФИКАМИ - НАЧАЛО */
// Запись массива в файл
voidwrite_array(constint n, const double array[],
const char filename[]);

// Записьмассивов Time, Uvx, UvixвфайлыдляwxMaxima
voidwrite_arrays_for_plot(constint n, const double Time[], const double Uvx[],
constdoubleUvix[]);
/* РАБОТА С ГРАФИКАМИ - КОНЕЦ */

#endif