Файл input.h
Содержит в себе защиту от повторного включения, а так же прототипы оговоренных выше функций.
Модуль calc.c
Модуль содержит в себе функции: filling_time_array, fill_array_input_voltage, fill_array_output_voltage, length_signal, data_calculation.
filling_time_array
Принимает по указателям переменные t_n, t_k, n и массив time[].
Осуществляет заполнение массива времени с помощью цикла for.
Каждый следующий элемент массива изменяется на
величину dt (дельта t), вычисленную по формуле
_array_input_voltage
и
fill_array_output_voltage
Работают примерно так же как и предыдущая функция. С помощью цикла for идет заполнение соответствующих массивов (расчетные формулы были описаны в разделе Анализ поставленной задачи)_signal
Является универсальной функцией для подсчета
длительности импульса как входного, так и выходного сигнала (зависит от того,
какой массив в нее передается). Функция вычисляет максимальный элемент
переданного ей массива сигнала, делит его на 2 (см. по формуле в разделе Анализ
поставленной задачи) и считает количество точек, удовлетворяющих условию
.
Далее возвращает результат , полученный по формуле:
см. раздел (Анализ поставленной задачи)
data_calculation
Функция, содержащая в себе вызовы filling_time_array, fill_array_input_voltage, fill_array_output_voltage, length_signal . Создана для объединения всех функций, выполняющих задачу вычисления и табулирования. Именно эта функция вызывается в соответствующем разделе оператора switch из функции main. Так же принимает по указателю переменные length_input_signal и length_output_signal , которым присваевает значения, возвращаемые функцией length_signal.
Файл calc.h
Данный файл подключен к файлу main.h. Содержит в себе заголовки всех функций, реализованных в модуле calc.c , а так же защиту от повторного включения.
Модуль output.c
Модуль, отвечающий за вывод данных. Включает в себя функции: printTableHeader , output_table_on_the_console , console_output_source_data, print_time_and_UInput_and_UOutput_to_file,_table_data_to_file
Функция не принимает в себя никаких переменных и ничего не возвращает. Она лишь печатает с помощью функции printf заголовок, содержащий в себе разделительные линии и названия колонок данных._table_on_the_console
Функция, которая выводит сформированные массивы на консоль в виде таблицы. Происходит это с помощью цикла for и функции printf . Так же функция выводи длительность импульса. В этой функции реализована проверка с переменной zapolneno, суть которой, как говорилось выше, сводится к тому, чтобы сравнить количество удачно прочитанных при вводе рабочего набора переменных и количество переменных по условию задачи (в 24ом варианте их 7). Если переменная zapolneno равна 7, то программа продолжает работать, если нет , то выводит соответствующее сообщение._output_source_data
Данная функция выводит изначальный набор рабочих данных. Если с клавиатуры или из файла ничего не вводилось, но при этом функция была запущена, то при выводе все изначальные данные будут равны 0, так как в функции main переменные при объявлении были проинициализированы нулями. Это является примитивной, но в то же время весьма результативной защитой от некорректной работы программы. Без этой защиты, при запуске этой функции без ввода начальных данных с клавиатуры или файла будет выведен «мусор», хранящийся в переменных.
Результат работы
printTableHeader, output_table_on_the_console и
console_output_source_data
print_time_and_UInput_and_UOutput_to_file
Функция похожа на output_table_on_the_console. Разница заключается в том, что данная функция записывает массивы в три файла. Для этого в начале реализации функции объявлены три указателя на файловый ресурс. Далее файлы открываются на запись , после чего следует проверка существования файлов. Если проверка успешна, то программа работает. В противном случае выдается соответствующее сообщение. С помощью цикла for и функции fprintf происходит запись массивов в файлы.
Далее файлы закрываются. _table_data_to_file
Функция работает аналогично предыдущей. Задача этой функции - запись всей таблицы в текстовый файл. Функция использует те же средства что и предыдущая функция, а так же проверку, организованную по тому же методу, что и в предыдущей функции. После работы этой функции создается файл с названием, которое клиент задает с клавиатуры.
Файл output.h
Файл output.h подключает к себе файл main.h. В
данном файле имеется защита от повторного включения, и содержатся прототипы
функций, используемых в модуле output.c.
. Тестирование программы
Тесты, подтверждающие правильность работы программы (расчёты сделаны в WxMaxima):
Тест малого сигнала= 1= 10
UMax = 100_n = 0_m = 15_k =25
n = 51
|
Time |
Uin |
Uin Maxima |
Uout |
Uout Maxima |
|
0.000 |
0.000 |
Uvh(0)=0 |
0.000 |
Uvih(0)=0 |
|
0.500 |
0.033 |
Uvh(0.5)=0.0333 |
0.333 |
Uvih(0.5)=0.333 |
|
1.000 |
0.067 |
Uvh(1.0)=0.0667 |
0.667 |
Uvih(1.0)=0.667 |
|
1.500 |
0.100 |
Uvh(1.5)=0.1 |
1.000 |
Uvih(1.5)=1.0 |
|
2.000 |
0.133 |
Uvh(2.0)=0.133 |
1.333 |
Uvih(2.0)=1.3333 |
|
2.500 |
0.167 |
Uvh(2.5)=0.167 |
1.667 |
Uvih(2.5)=1.6667 |
|
3.000 |
0.200 |
Uvh(3.0)=0.2 |
2.000 |
Uvih(3.0)=2.0 |
|
3.500 |
0.233 |
Uvh(3.5)=0.233 |
2.333 |
Uvih(3.5)=2.3333 |
|
4.000 |
0.267 |
Uvh(4.0)=0.267 |
2.667 |
Uvih(4.0)=2.6667 |
|
4.500 |
0.300 |
Uvh(4.5)=0.3 |
3.000 |
Uvih(4.5)=3.0 |
|
5.000 |
0.333 |
Uvh(5.0)=0.333 |
3.333 |
Uvih(5.0)=3.3333 |
|
5.500 |
0.367 |
Uvh(5.5)=0.367 |
3.667 |
Uvih(5.5)=3.6667 |
|
6.000 |
0.400 |
Uvh(6.0)=0.4 |
4.000 |
Uvih(6.0)=4.0 |
|
6.500 |
0.433 |
Uvh(6.5)=0.433 |
4.333 |
Uvih(6.5)=4.3333 |
|
7.000 |
0.467 |
Uvh(7.0)=0.467 |
4.667 |
Uvih(7.0)=4.6667 |
|
7.500 |
0.500 |
Uvh(7.5)=0.5 |
5.000 |
Uvih(7.5)=5.0 |
|
8.000 |
0.533 |
Uvh(8.0)=0.533 |
5.333 |
Uvih(8.0)=5.3333 |
|
8.500 |
0.567 |
Uvh(8.5)=0.567 |
5.667 |
Uvih(8.5)=5.6667 |
|
9.000 |
0.600 |
Uvh(9.0)=0.6 |
6.000 |
Uvih(9.0)=6.0 |
|
9.500 |
0.633 |
Uvh(9.5)=0.633 |
6.333 |
Uvih(9.5)=6.3333 |
|
10.000 |
0.667 |
Uvh(10.0)=0.667 |
6.667 |
Uvih(10.0)=6.6667 |
|
10.500 |
0.700 |
Uvh(10.5)=0.7 |
7.000 |
Uvih(10.5)=7.0 |
|
11.000 |
0.733 |
Uvh(11.0)=0.733 |
7.333 |
Uvih(11.0)=7.3333 |
|
11.500 |
0.767 |
Uvh(11.5)=0.767 |
7.667 |
Uvih(11.5)=7.6667 |
|
12.000 |
0.800 |
Uvh(12.0)=0.8 |
8.000 |
Uvih(12.0)=8.0 |
|
12.500 |
0.833 |
Uvh(12.5)=0.833 |
8.333 |
Uvih(12.5)=8.3333 |
|
13.000 |
0.867 |
Uvh(13.0)=0.867 |
8.667 |
Uvih(13.0)=8.6667 |
|
13.500 |
0.900 |
Uvh(13.5)=0.9 |
9.000 |
Uvih(13.5)=9.0 |
|
14.000 |
0.933 |
Uvh(14.0)=0.933 |
9.333 |
Uvih(14.0)=9.3333 |
|
14.500 |
0.967 |
Uvh(14.5)=0.967 |
9.667 |
Uvih(14.5)=9.6667 |
|
15.000 |
1.000 |
Uvh(15.0)=1.0 |
10.000 |
Uvih(15.0)=10.0 |
|
15.500 |
0.950 |
Uvh(15.5)=0.95 |
9.500 |
Uvih(15.5)=9.5 |
|
16.000 |
0.900 |
Uvh(16.0)=0.9 |
9.000 |
Uvih(16.0)=9.0 |
|
16.500 |
0.850 |
Uvh(16.5)=0.85 |
8.500 |
Uvih(16.5)=8.5 |
|
17.000 |
0.800 |
Uvh(17.0)=0.8 |
8.000 |
Uvih(17.0)=8.0 |
|
17.500 |
0.750 |
Uvh(17.5)=0.75 |
7.500 |
Uvih(17.5)=7.5 |
|
18.000 |
0.700 |
Uvh(18.0)=0.7 |
7.000 |
Uvih(18.0)=7.0 |
|
18.500 |
0.650 |
Uvh(18.5)=0.65 |
6.500 |
Uvih(18.5)=6.5 |
|
19.000 |
0.600 |
Uvh(19.0)=0.6 |
6.000 |
Uvih(19.0)=6.0 |
|
19.500 |
0.550 |
Uvh(19.5)=0.55 |
5.500 |
Uvih(19.5)=5.5 |
|
20.000 |
Uvh(20.0)=0.5 |
5.000 |
Uvih(20.0)=5.0 |
|
|
20.500 |
0.450 |
Uvh(20.5)=0.45 |
4.500 |
Uvih(20.5)=4.5 |
|
21.000 |
0.400 |
Uvh(21.0)=0.4 |
4.000 |
Uvih(21.0)=4.0 |
|
21.500 |
0.350 |
Uvh(21.5)=0.35 |
3.500 |
Uvih(21.5)=3.5 |
|
22.000 |
0.300 |
Uvh(22.0)=0.3 |
3.000 |
Uvih(22.0)=3.0 |
|
22.500 |
0.250 |
Uvh(22.5)=0.25 |
2.500 |
Uvih(22.5)=2.5 |
|
23.000 |
0.200 |
Uvh(23.0)=0.2 |
2.000 |
Uvih(23.0)=2.0 |
|
23.500 |
0.150 |
Uvh(23.5)=0.15 |
1.500 |
Uvih(23.5)=1.5 |
|
24.000 |
0.100 |
Uvh(24.0)=0.1 |
1.000 |
Uvih(24.0)=1.0 |
|
24.500 |
0.050 |
Uvh(24.5)=0.05 |
0.500 |
Uvih(24.5)=0.5 |
|
25.000 |
0.000 |
Uvh(25.0)=0.0 |
0.000 |
Uvih(25.0)=0 |
Тест большого сигнала= 20= 10= 100_n = 0_m =
15_k =25= 51
|
Time |
Uin |
Uin Maxima |
Uout |
Uout Maxima |
|
0.000 |
0.000 |
Uvh(0)=0 |
0.000 |
Uvih(0)=0 |
|
0.500 |
0.667 |
Uvh(0.5)=0.667 |
6.667 |
Uvih(0.5)=6.6667 |
|
1.000 |
1.333 |
Uvh(1.0)=1.3333 |
13.333 |
Uvih(1.0)=13.333 |
|
1.500 |
2.000 |
Uvh(1.5)=2.0 |
20.000 |
Uvih(1.5)=20.0 |
|
2.000 |
2.667 |
Uvh(2.0)=2.6667 |
26.667 |
Uvih(2.0)=26.667 |
|
2.500 |
3.333 |
Uvh(2.5)=3.3333 |
33.333 |
Uvih(2.5)=33.333 |
|
3.000 |
4.000 |
Uvh(3.0)=4.0 |
40.000 |
Uvih(3.0)=40.0 |
|
3.500 |
4.667 |
Uvh(3.5)=4.6667 |
46.667 |
Uvih(3.5)=46.667 |
|
4.000 |
5.333 |
Uvh(4.0)=5.3333 |
53.333 |
Uvih(4.0)=53.333 |
|
4.500 |
6.000 |
Uvh(4.5)=6.0 |
60.000 |
Uvih(4.5)=60.0 |
|
5.000 |
6.667 |
Uvh(5.0)=6.6667 |
66.667 |
Uvih(5.0)=66.667 |
|
5.500 |
7.333 |
Uvh(5.5)=7.3333 |
73.333 |
Uvih(5.5)=73.333 |
|
6.000 |
8.000 |
Uvh(6.0)=8.0 |
80.000 |
Uvih(6.0)=80.0 |
|
6.500 |
8.667 |
Uvh(6.5)=8.6667 |
86.667 |
Uvih(6.5)=86.667 |
|
7.000 |
9.333 |
Uvh(7.0)=9.3333 |
93.333 |
Uvih(7.0)=93.333 |
|
7.500 |
10.000 |
Uvh(7.5)=10.0 |
100.000 |
Uvih(7.5)=100.0 |
|
8.000 |
10.667 |
Uvh(8.0)=10.667 |
100.000 |
Uvih(8.0)=100 |
|
8.500 |
11.333 |
Uvh(8.5)=11.333 |
100.000 |
Uvih(8.5)=100 |
|
9.000 |
12.000 |
Uvh(9.0)=12.0 |
100.000 |
Uvih(9.0)=100 |
|
9.500 |
12.667 |
Uvh(9.5)=12.667 |
100.000 |
Uvih(9.5)=100 |
|
10.000 |
13.333 |
Uvh(10.0)=13.333 |
100.000 |
Uvih(10.0)=100 |
|
10.500 |
14.000 |
Uvh(10.5)=14.0 |
100.000 |
Uvih(10.5)=100 |
|
11.000 |
14.667 |
Uvh(11.0)=14.667 |
100.000 |
Uvih(11.0)=100 |
|
11.500 |
15.333 |
Uvh(11.5)=15.333 |
100.000 |
Uvih(11.5)=100 |
|
12.000 |
16.000 |
Uvh(12.0)=16.0 |
100.000 |
Uvih(12.0)=100 |
|
12.500 |
16.667 |
Uvh(12.5)=16.667 |
100.000 |
Uvih(12.5)=100 |
|
13.000 |
17.333 |
Uvh(13.0)=17.333 |
100.000 |
Uvih(13.0)=100 |
|
13.500 |
18.000 |
Uvh(13.5)=18.0 |
100.000 |
Uvih(13.5)=100 |
|
14.000 |
18.667 |
Uvh(14.0)=18.667 |
100.000 |
Uvih(14.0)=100 |
|
14.500 |
19.333 |
Uvh(14.5)=19.333 |
100.000 |
Uvih(14.5)=100 |
|
15.000 |
20.000 |
Uvh(15.0)=20.0 |
100.000 |
Uvih(15.0)=100 |
|
15.500 |
19.000 |
Uvh(15.5)=19.0 |
100.000 |
Uvih(15.5)=100 |
|
16.000 |
18.000 |
Uvh(16.0)=18.0 |
100.000 |
Uvih(16.0)=100 |
|
16.500 |
17.000 |
Uvh(16.5)=17.0 |
100.000 |
Uvih(16.5)=100 |
|
17.000 |
16.000 |
Uvh(17.0)=16.0 |
100.000 |
Uvih(17.0)=100 |
|
17.500 |
15.000 |
Uvh(17.5)=15.0 |
100.000 |
Uvih(17.5)=100 |
|
18.000 |
14.000 |
Uvh(18.0)=14.0 |
100.000 |
Uvih(18.0)=100 |
|
18.500 |
13.000 |
Uvh(18.5)=13.0 |
100.000 |
Uvih(18.5)=100 |
|
19.000 |
12.000 |
Uvh(19.0)=12.0 |
100.000 |
Uvih(19.0)=100 |
|
19.500 |
11.000 |
Uvh(19.5)=11.0 |
100.000 |
Uvih(19.5)=100 |
|
20.000 |
10.000 |
Uvh(20.0)=10.0 |
100.000 |
Uvih(20.0)=100.0 |
|
20.500 |
9.000 |
Uvh(20.5)=9.0 |
90.000 |
Uvih(20.5)=90.0 |
|
21.000 |
8.000 |
Uvh(21.0)=8.0 |
80.000 |
Uvih(21.0)=80.0 |
|
21.500 |
7.000 |
Uvh(21.5)=7.0 |
70.000 |
Uvih(21.5)=70.0 |
|
22.000 |
6.000 |
Uvh(22.0)=6.0 |
60.000 |
Uvih(22.0)=60.0 |
|
22.500 |
5.000 |
Uvh(22.5)=5.0 |
50.000 |
Uvih(22.5)=50.0 |
|
23.000 |
4.000 |
Uvh(23.0)=4.0 |
40.000 |
Uvih(23.0)=40.0 |
|
23.500 |
3.000 |
Uvh(23.5)=3.0 |
30.000 |
Uvih(23.5)=30.0 |
|
24.000 |
2.000 |
Uvh(24.0)=2.0 |
20.000 |
Uvih(24.0)=20.0 |
|
24.500 |
1.000 |
Uvh(24.5)=1.0 |
10.000 |
Uvih(24.5)=10.0 |
|
25.000 |
0.000 |
Uvh(25.0)=0.0 |
0.000 |
Uvih(25.0)=0 |
Контрольный расчёт= 50= 10= 50_n = 2_m = 15_k =25= 24
|
Time |
Uin |
Uin Maxima |
Uout |
Uout Maxima |
||||
|
2.000 |
0.000 |
Uvh(2)=0 |
0.000 |
Uvih(2)=0 |
||||
|
3.000 |
3.846 |
Uvh(3)=3.8462 |
19.231 |
Uvih(3)=19.231 |
||||
|
4.000 |
7.692 |
Uvh(4)=7.6923 |
38.462 |
Uvih(4)=38.462 |
||||
|
5.000 |
11.538 |
Uvh(5)=11.538 |
50.000 |
Uvih(5)=50 |
||||
|
6.000 |
15.385 |
Uvh(6)=15.385 |
50.000 |
Uvih(6)=50 |
||||
|
7.000 |
19.231 |
Uvh(7)=19.231 |
50.000 |
Uvih(7)=50 |
23.077 |
Uvh(8)=23.077 |
50.000 |
Uvih(8)=50 |
|
9.000 |
26.923 |
Uvh(9)=26.923 |
50.000 |
Uvih(9)=50 |
||||
|
10.000 |
30.769 |
Uvh(10)=30.769 |
50.000 |
Uvih(10)=50 |
||||
|
11.000 |
34.615 |
Uvh(11)=34.615 |
50.000 |
Uvih(11)=50 |
||||
|
12.000 |
38.462 |
Uvh(12)=38.462 |
50.000 |
Uvih(12)=50 |
||||
|
13.000 |
42.308 |
Uvh(13)=42.308 |
50.000 |
Uvih(13)=50 |
||||
|
14.000 |
46.154 |
Uvh(14)=46.154 |
50.000 |
Uvih(14)=50 |
||||
|
15.000 |
50.000 |
Uvh(15)=50 |
50.000 |
Uvih(15)=50 |
||||
|
16.000 |
45.000 |
Uvh(16)=45 |
50.000 |
Uvih(16)=50 |
||||
|
17.000 |
40.000 |
Uvh(17)=40 |
50.000 |
Uvih(17)=50 |
||||
|
18.000 |
35.000 |
Uvh(18)=35 |
50.000 |
Uvih(18)=50 |
||||
|
19.000 |
30.000 |
Uvh(19)=30 |
50.000 |
Uvih(19)=50 |
||||
|
20.000 |
25.000 |
Uvh(20)=25 |
50.000 |
Uvih(20)=50 |
||||
|
21.000 |
20.000 |
Uvh(21)=20 |
50.000 |
Uvih(21)=50 |
||||
|
22.000 |
15.000 |
Uvh(22)=15 |
50.000 |
Uvih(22)=50 |
||||
|
23.000 |
10.000 |
Uvh(23)=10 |
50.000 |
Uvih(23)=50 |
||||
|
24.000 |
5.000 |
Uvh(24)=5 |
25.000 |
Uvih(24)=25 |
||||
|
25.000 |
0.000 |
Uvh(25)=0 |
0.000 |
Uvih(25)=0 |
||||
|
2.000 |
0.000 |
Uvh(2)=0 |
0.000 |
Uvih(2)=0 |
7. Графики
контрольный расчет
контрольный расчет
малого сигнала
малого сигнала
большого сигнала
большего сигнала
Выводы
Поставленная задача успешно проанализирована и
решена, получены навыки разработки программного обеспечения на языке Си, а
также навыки отладки и тестирования программы. Так как программа имеет модульную
структуру, легко осуществить её возможное расширение. Например, возможно
добавить графический интерфейс, переписав меню, не затрагивая остального кода;
также программа может быть адаптирована под решение более сложной задачи путём
расширения соответствующих функций вычислений.
Инструкция пользователю
Пользователю предлагается запустить программу по вычислению входного и выходного сигналов, а также длительностей импульса этих сигналов.
Ввести число 1 для ввода данных с клавиатуры.
Нажмите 2 для вывода вычислений на консоль (функция доступна только после ввода данных с клавиатуры или из файла)
Нажмите 3 для осуществления ввода данных из файла. Если файла не существует или текст в файле в некорректном формате, программа выдаст соответствующее сообщение. Ввод происходит из записанного программой ранее текстового файла, в который сохраняется вся таблица данных с помощью функции сохранения. Неосторожное изменение формата данных в этом файла может повлечь за собой некорректную работу программы или вывод сообщения о некорректности данных в файле.
Нажмите 4 для сохранения данных в текстовый файл. Если не проводилось никаких вычислений, но данная опция была выбрана, файлы будут пустыми. Программа сохраняет данные в 4 файла. Три из них находятся в специальной папке TableAndDataForPlot и служат для построения графика с помощью программы WxMaxima. Последний файл с именем, указанным клиентом находится в общей папки проекта и может быть считан программой после выбора соответствующей команды. Не забудьте после имени через точку указать формат файла (например all_data.txt)
Если необходимо вывести длительности импульса без вывода всей таблицы, нажмите 5.
Для построения графиков используйте специальный файл программы WxMaxima Plot_2d.wxm , который прилагается в качестве бонуса к данной программе. Данный файл находится в общей папке проекта вместе с файлами .с . Для построения графика запустите запустите Plot_2d.wxm и нажмите ctrl+r.
Для выхода из программы при выборе команды нажмите 0.
Исходный код
Ниже приведен исходный код программы, написанный в среде разработки Visual studio express 2010
10.1. файлы .c.c
#include"input.h"