Читайте также:
|
|
void read_data() – читает набор данных из файла data.txt
void write_data() – записывает в файл data.txt рабочие данные и массивы времени, входного и выходного напряжения в виде таблицы.
void output_arrays() – выводит массивы времени, входного и выходного напряжения в виде таблицы.в файлы array_time.txt, array_Uvx.txt и array_Uvix.txt в формате, удобном для чтения в программе Maxima.
Тестирование программы
Тесты, подтверждающие правильность работы программы.
Рассчёты сделаны в wxMaxima.
Большой сигнал (а = 50)
time | Uvx | Uvx Maxima | Uvix | Uvix Maxima |
0.00000 | 0.00000 | |||
38.84349 | 38.843 | 100.00000 | ||
47.51065 | 47.511 | 100.00000 | ||
49.44455 | 49.445 | 100.00000 | ||
49.87606 | 49.876 | 100.00000 | ||
49.97235 | 49.972 | 100.00000 | ||
0.00227 | 0.00227 | 0.01135 | 0.0113 | |
0.00000 | 1.03055*10^-7 | 0.00000 | 5.15274*10^-7 | |
0.00000 | 4.67878*10^-12 | 0.00000 | 2.33939*10^-11 | |
0.00000 | 2.12417*10^-16 | 0.00000 | 1.06209*10^-15 | |
0.00000 | 9.64375*10^-21 | 0.00000 | 4.82187*10^-20 |
Малый сигнал (а = 0.75)
Time | Uvx | UvxMaxima | Uvix | UvixMaxima |
0.5826524 | 0.583 | 2.9132619 | 2.9133 | |
0.7126597 | 0.713 | 3.5632985 | 3.5633 | |
0.7416683 | 0.742 | 3.7083413 | 3.7083 | |
0.7481409 | 0.748 | 3.7407047 | 3.7407 | |
0.7495852 | 0.75 | 3.7479259 | 3.7479 | |
0.0000340 | 3.40457*10^-5 | 0.0001702 | 1.70229*10^-4 | |
0.0000000 | 1.54582*10^-9 | 0.0000000 | 7.72911*10^-9 | |
0.0000000 | 7.01817*10^-14 | 0.0000000 | 3.50909*10^-13 | |
0.0000000 | 3.18626*10^-18 | 0.0000000 | 1.59313*10^-17 | |
0.0000000 | 1.44656*10^-22 | 0.0000000 | 7.23281*10^-22 |
Заключение
Поставленная задача успешно проанализированна и решена, получены навыки разработки программного обеспечения на языке C, а также навыки отладки и тестирования программы. Так как программа имеет модульную структуру, легко осуществить ее возможное расширение. Например, возможно добавить графический интерфейс переписав меню, но не затрагивая остального кода; также программа может быть адаптирована под решение более сложной задачи путем расширения соответсвующих функций вычислений.
Использованная литература:
Б. Керниган, Д. Ритчи – «Язык программирования С»
Герберт Шилдт – «Полный справочник по С»
Исходный код
Mainheader.h
#pragma once
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define N 11
enum front
{
DECREASING = 0,
INCREASING = 1,
NOFRONT
};
enum frontside
{
LEFT = 0, //передний фронт
RIGHT //задний
};
extern double time[N];
extern double Uvx[N];
extern double Uvix[N];
extern double t_begin, t_end, t_1;
extern double a, b, c;
extern double U1, U2;
extern double timedelta;
void read_data();
void write_data();
void output_arrays();
void form_time();
void form_Uvx();
void form_Uvix();
void getfront(double arr[N], frontside side);
Main.cpp
#include "mainheader.h"
double time[N];
double Uvx[N];
double Uvix[N];
double t_begin = 0, t_end = 20, t_1 = 10;
double a = 50, b = 0.75, c = 5;
double U1 = 20, U2 = 100;
double timedelta=0;
void display_data()
{
printf("%25s%20s%20s\n\n", "time", "Uvx", "Uvix");
for (int i = 0; i < N; i++)
{
printf("%5d%20.3lf%20.7lf%20.7lf\n", i+1, time[i], Uvx[i], Uvix[i]);
}
}
void input_data()
{
printf("1) T_begin: %10.3lf\n", t_begin);
printf("2) T_end: %10.3lf\n", t_end);
printf("3) T_1: %10.3lf\n", t_1);
printf("4) a: %10.3lf\n", a);
printf("5) b: %10.3lf\n", b);
printf("6) c: %10.3lf\n", c);
printf("7) U1: %10.3lf\n", U1);
printf("8) U2: %10.3lf\n", U2);
printf("\nEnter variable number and value. 0 to exit menu.\n");
char op = '1';
while (op!= '0')
{
scanf("%c", &op);
switch (op)
{
case '1':
{
scanf("%lf", &t_begin);
printf("OK\n");
break;
}
case '2':
{
scanf("%lf", &t_end);
printf("OK\n");
break;
}
case '3':
{
scanf("%lf", &t_1);
printf("OK\n");
break;
}
case '4':
{
scanf("%lf", &a);
printf("OK\n");
break;
}
case '5':
{
scanf("%lf", &b);
printf("OK\n");
break;
}
case '6':
{
scanf("%lf", &c);
printf("OK\n");
break;
}
case '7':
{
scanf("%lf", &U1);
printf("OK\n");
break;
}
case '8':
{
scanf("%lf", &U2);
printf("OK\n");
break;
}
default:
//printf("Unrecognised");
break;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char op;
while(true)
{
printf("\n\nEnter charachter:\n\n1) Form arrays\n2) Determine fronts\n3) Output arrays to files\n4) Read data from file\n5) Input variables manually\n6) Write data to file\n7) Display data\n8) Exit\n\n");
scanf(" %c", &op);
switch (op)
{
case '1':
{
form_time();
form_Uvx();
form_Uvix();
display_data();
break;
}
case '2':
{
printf("Uvx:\n");
getfront(Uvx, LEFT);
getfront(Uvx, RIGHT);
printf("\nUvix:\n");
getfront(Uvix, LEFT);
getfront(Uvix, RIGHT);
break;
}
case '3':
{
output_arrays();
printf("\nDone.\n");
break;
}
case '4':
{
read_data();
printf("\nDone.\n");
break;
}
case '5':
{
input_data();
break;
}
case '6':
{
write_data();
printf("\nDone.\n");
break;
}
case '7':
{
display_data();
break;
}
case '8':
{
exit(0);
break;
}
default:
{
printf("\nUnrecognised command\n");
break;
}
}
}
return 0;
}
Calc.cpp
#include "mainheader.h"
void form_time()
{
timedelta = (t_end - t_begin) / double(N - 1);
for (int i = 0; i < N; i++) // Формирование массива времени t
{
time[i] = t_begin + i * timedelta;
}
}
void form_Uvx()
{
for (int i = 0; i < N; i++) // Формирование массива Uvx
{
if (time[i] <= t_1)
{
Uvx[i] = a * (1.0 - exp(-b * time[i]));
}
else
{
Uvx[i] = a * (1.0 - exp(-b * time[i])) * exp(-c * (time[i] - t_1));
}
}
}
void form_Uvix()
{
for (int i = 0; i < N; i++) // Формирование массива Uvix
{
if (Uvx[i] < U1)
{
Uvix[i] = U2 / U1 * Uvx[i];
}
else
{
Uvix[i] = U2;
}
}
}
void getfront(double arr[N], frontside side)
{
front front = NOFRONT;
int frontlength = 0; //длина в шагах
int first = 0, second = 0; //индексы элементов для определения типа фронта
double Umax, Umin, UH, UL;
if (side == LEFT)
{
first = 0; second = 1;
}
else if (side == RIGHT)
{
first = N-2; second = N-1;
}
if (arr[first] < arr[second])
{
front = INCREASING;
}
else if (arr[first] > arr[second])
{
front = DECREASING;
}
if (side == LEFT)
{
for (int i = 1; i < N; i++)
{
if ((front == INCREASING && arr[i-1] < arr[i]) || (front == DECREASING && arr[i-1] > arr[i]))
{
frontlength++;
}
else
{
break;
}
}
}
if (side == RIGHT)
{
for (int i = N-1; i > 0; i--)
{
if ((front == INCREASING && arr[i-1] < arr[i]) || (front == DECREASING && arr[i-1] > arr[i]))
{
frontlength++;
}
else
{
break;
}
}
}
if (side == LEFT)
{
if (front == INCREASING) { Umin = arr[0]; Umax = arr[frontlength]; }
else if (front == DECREASING) { Umin = arr[frontlength]; Umax = arr[0]; }
}
else if (side == RIGHT)
{
if (front == INCREASING) { Umin = arr[N-frontlength-1]; Umax = arr[N-1]; }
else if (front == DECREASING) { Umin = arr[N-1]; Umax = arr[N-frontlength-1]; }
}
UH = Umin + 0.9*(Umax-Umin);
UL = Umin + 0.1*(Umax-Umin);
double fronttime = 0;
if (side == LEFT)
{
for (int i = 0; i < frontlength; i++)
{
if (arr[i] >= UL && arr[i] <= UH) fronttime += timedelta;
}
}
else if (side == RIGHT)
{
for (int i = N-1; i > N-frontlength; i--)
{
if (arr[i] >= UL && arr[i] <= UH) fronttime += timedelta;
}
}
char *frontside = (side == LEFT? "Forward": "Back");
char *fronttype = (front == DECREASING? "decreasing": "increasing");
if (front == NOFRONT)
{
printf("There is no %s front.\n", frontside);
return;
}
else
{
printf ("%s front is %s, duration is %20.15lf steps %d \n", frontside, fronttype, fronttime, frontlength);
}
}
File_io.cpp
#include "mainheader.h"
using namespace std;
void skipchars(FILE* f, int number)
{
for(int i = 0; i <= number; i++)
{
fgetc(f);
}
}
void read_data()
{
FILE *f;
char dummy[70];
fopen_s(&f, "data.txt", "r");
fscanf(f, "%s %lf", &dummy, &t_begin);
fscanf(f, "%s %lf", &dummy, &t_end);
fscanf(f, "%s %lf", &dummy, &t_1);
fscanf(f, "%s %lf", &dummy, &a);
fscanf(f, "%s %lf", &dummy, &b);
fscanf(f, "%s %lf", &dummy, &c);
fscanf(f, "%s %lf", &dummy, &U1);
fscanf(f, "%s %lf", &dummy, &U2);
char temp[255];
fgets(temp, 255, f);
fgets(temp, 255, f);
//fgets(temp, 255, f);
for(int i=0; i<N; i++)
{
skipchars(f, 16);
fscanf_s(f, "%lf", &(time[i]));
fscanf_s(f, "%*c%lf", &(Uvx[i]));
fscanf_s(f, "%*c%lf%*c", &(Uvix[i]));
fgets(temp, 255, f);
}
fclose(f);
}
void write_data()
{
FILE *f;
fopen_s(&f, "data.txt", "w");
fprintf(f, "tbegin %14.5lf\n", t_begin);
fprintf(f, "tend %14.5lf\n", t_end);
fprintf(f, "t1 %14.5lf\n", t_1);
fprintf(f, "a %14.5lf\n", a);
fprintf(f, "b %14.5lf\n", b);
fprintf(f, "c %14.5lf\n", c);
fprintf(f, "U1 %14.5lf\n", U1);
fprintf(f, "U28 %14.5lf\n", U2);
fprintf(f, "-------------------------------------------------------------");
fprintf(f, "| # | time | Uvx | Uvix |\n");
fprintf(f, "-------------------------------------------------------------");
for(int i = 0; i < N; i++)
{
fprintf(f, "|%14d|",i+1);
fprintf(f, "%14.2lf|",time[i]);
fprintf(f, "%14.5lf|",Uvx[i]);
fprintf(f, "%14.5lf|",Uvix[i]);
fprintf(f, "\n");
}
fclose(f);
}
void output_arrays()
{
FILE *f1,*f2,*f3;
fopen_s(&f1,"array_time.txt","w");
fopen_s(&f2,"array_Uvx.txt", "w");
fopen_s(&f3,"array_Uvix.txt", "w");
for (int i=0;i<N;i++)
{
fprintf(f1,"%20.7f\n",time[i]);
fprintf(f2,"%20.7f\n", Uvx[i]);
fprintf(f3,"%20.7f\n", Uvix[i]);
}
fclose(f1);
fclose(f2);
fclose(f3);
}
Дата добавления: 2015-11-14; просмотров: 54 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Анализ поставленной задачи | | | 1 страница |