Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
98
Добавлен:
01.10.2019
Размер:
1.48 Mб
Скачать

5. Разработка программы

Таблица 5.1

Файл "main.c"

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <math.h>

#include "funcLib.h"

#define LINES 12

#define CHARS_IN_LINES 40

#define S_CHARS_IN_LINES "39"

int main()

{

int i;

int N = 0, N0, Nmax = 20000;

int menu = 0;

short int bParam = 0, file_flag = 0;

double epsilon;

double uMax, alpha, dAlpha, prev_alpha, c;

double *TArray = NULL, *Uin = NULL, *Uout = NULL;

char **About = NULL;

uInStruct inParam;

uOutStruct outParam;

FILE *fin = fopen("about.txt", "r");

if (fin != NULL) {

About = (char **) calloc(LINES, sizeof(char *));

if (About == NULL) {

printf("!> Memory allocation error.\n");

return 1;

}

for (i = 0; i < LINES; i++) {

About[i] = (char *) calloc(CHARS_IN_LINES, sizeof(char));

if (About[i] == NULL) {

printf("!> Memory allocation error.\n");

return 1;

}

}

for (i = 0; i < LINES; i++) {

fscanf(fin, "%" S_CHARS_IN_LINES "[^\n]s", About[i]);

while (!feof(fin) && fgetc(fin) != '\n') {

continue;

}

}

file_flag = 1;

fclose(fin);

}

while (1)

{

system("cls");

if (file_flag == 1) {

for (i = 0; i < LINES; i++) {

printf("%s\n", About[i]);

}

}

printf("\n=============MENU==============\n");

printf("1: Input data from console (inParameters, outParameters)\n");

printf("2: Input data from file (inParameters, outParametersh)\n");

printf("3: Check data\n");

if (bParam > 0) {

printf("4: Form T, Uin and Uout arrays\n");

}

if (bParam > 1) {

printf("5: Print table [N, Uin, Uout]\n");

printf("6: Save results to file\n");

printf("7: Show graph\n");

printf("8: Calculate alpha (part of the time when inequality holds: U > C*Umax)\n");

}

printf("9: Exit\n");

printf("\n-------------------------------\n#> ");

scanf("%d", &menu);

switch(menu)

{

case 1: AddDataFromConsole(&inParam, &outParam); bParam = 1; break;

case 2: if (AddDataFromFile(&inParam, &outParam)) bParam = 1; break;

case 3: CheckData(&inParam, &outParam); break;

case 4:

if (bParam <= 0) break;

printf("N: ");

while (scanf("%d", &N) == 0 || N < 5 || N > Nmax) {

CinRecovery();

printf("!> Incorrect input (N). Try again: ");

}

TArray = (double *)realloc(TArray, N * sizeof(double));

Uin = (double *)realloc(Uin, N * sizeof(double));

Uout = (double *)realloc(Uout, N * sizeof(double));

if (TArray == NULL || Uin == NULL || Uout == NULL) {

printf("!> Memory allocation error.\n");

return 1;

}

T_Array(TArray, &inParam, N);

uIn_Array(Uin, TArray, &inParam, N);

uOut_Array(Uout, Uin, &outParam, N);

bParam = 2;

break;

case 5:

if (bParam <= 1) break;

PrintTable(TArray, Uin, Uout, N);

break;

case 6:

if (bParam <= 1) break;

SaveResultToFile(TArray, Uin, Uout, N);

break;

case 7:

if (bParam <= 1) break;

ShowGraph(TArray, Uin, Uout, N);

system("graph.wxm");

break;

case 8:

if (bParam <= 1) break;

printf("C = ");

while (scanf("%lf", &c) == 0) {

CinRecovery();

printf("!> Incorrect input (C). Try again: ");

}

printf("Epsilon: ");

while (scanf("%lf", &epsilon) == 0) {

CinRecovery();

printf("!> Incorrect input (Epsilon). Try again: ");

}

printf("N0: ");

while (scanf("%d", &N0) == 0) {

CinRecovery();

printf("!> Incorrect input (N0). Try again: ");

}

alpha = 0;

prev_alpha = alpha;

N = N0;

dAlpha = epsilon + 1;

while (dAlpha >= epsilon && N <= Nmax) {

TArray = (double *)realloc(TArray, N * sizeof(double));

Uin = (double *)realloc(Uin, N * sizeof(double));

Uout = (double *)realloc(Uout, N * sizeof(double));

if (TArray == NULL || Uin == NULL || Uout == NULL) {

printf("!> Memory allocation error.\n");

return 1;

}

T_Array(TArray, &inParam, N);

uIn_Array(Uin, TArray, &inParam, N);

uOut_Array(Uout, Uin, &outParam, N);

uMax = calcUMax(Uout, N);

alpha = calcAlpha(TArray, Uout, uMax, c, N);

if (N != N0) {

dAlpha = fabs((prev_alpha - alpha) / alpha);

}

prev_alpha = alpha;

N *= 2;

}

if (N > Nmax) {

printf("The specified accuracy is not achieved.\n");

printf("Actual error: %lf\n", dAlpha);

}

else {

N /= 2;

printf("Alpha: %lf\n", alpha);

printf("The specified accuracy is reached when N = %d\n", N);

printf("Actual error = %lf\n", dAlpha);

}

break;

case 9: return 0;

default: printf("\nIncorrect."); break;

}

printf("\nDone. Press <ENTER>\n");

CinRecovery();

getch();

}

free(TArray);

free(Uin);

free(Uout);

for (i = 0; i < LINES; i++) {

free(About[i]);

}

free(About);

return 0;

}

Таблица 5.2

Файл "funcLib.h"

#ifndef _FUNC_LIB_

#define _FUNC_LIB_

typedef struct uInStruct

{

double u1;

double u2;

double tStart;

double t1;

double t2;

double tFinish;

} uInStruct;

typedef struct uOutStruct

{

double u0;

double u1;

double u2;

double u3;

double uIn1;

double uIn2;

double uIn3;

} uOutStruct;

void CinRecovery();

void AddDataFromConsole(uInStruct *inStruct, uOutStruct *outStruct);

short AddDataFromFile(uInStruct *inStruct, uOutStruct *outStruct);

void CheckData(uInStruct *inStruct, uOutStruct *outStruct);

void CinRecovery();

double uIn_get(uInStruct *uStruct, double t);

double uOut_get(uOutStruct *uStruct, double u);

void T_Array(double *TArray, uInStruct *uStruct, int n);

void uIn_Array(double *uInArray, double *TArray, uInStruct *inStruct, int n);

void uOut_Array(double *uOutArray, double *uInArray, uOutStruct *outStruct, int n);

void PrintTable(double *TArray, double *uInArray, double *uOutArray, int n);

void SaveResultToFile(double *TArray, double *uInArray, double *uOutArray, int n);

void ShowGraph(double *TArray, double *uInArray, double *uOutArray, int n);

double calcUMax(double *uOutArray, int n);

double calcAlpha(double *TArray, double *uOutArray, double uMax, double c, int n);

#endif

Таблица 5.3

Файл "funcLib.c"

#include <stdio.h>

#include <stdlib.h>

typedef struct uInStruct

{

double u1;

double u2;

double tStart;

double t1;

double t2;

double tFinish;

} uInStruct;

typedef struct uOutStruct

{

double u0;

double u1;

double u2;

double u3;

double uIn1;

double uIn2;

double uIn3;

} uOutStruct;

void CinRecovery()

{

while(getchar() != '\n') {

continue;

}

}

void AddDataFromConsole(uInStruct *inStruct, uOutStruct *outStruct)

{

CinRecovery();

printf("--- Signal input parameters ---\n");

printf("U1: ");

while (scanf("%lf", &inStruct->u1) == 0) {

CinRecovery();

printf("!> Incorrect input (U1). Try again: ");

}

printf("U2: ");

while (scanf("%lf", &inStruct->u2) == 0) {

CinRecovery();

printf("!> Incorrect input (U2). Try again: ");

}

printf("TStart: ");

while (scanf("%lf", &inStruct->tStart) == 0) {

CinRecovery();

printf("!> Incorrect input (TStart). Try again: ");

}

printf("T1: ");

while (scanf("%lf", &inStruct->t1) == 0

|| inStruct->t1 <= inStruct->tStart)

{

CinRecovery();

if (inStruct->t1 <= inStruct->tStart) {

printf("[NOTE] T1 must be greater than TStart.\n");

}

printf("!> Incorrect input (T1). Try again: ");

}

printf("T2: ");

while (scanf("%lf", &inStruct->t2) == 0

|| inStruct->t2 <= inStruct->t1)

{

CinRecovery();

if (inStruct->t2 <= inStruct->t1) {

printf("[NOTE] T2 must be greater than T1.\n");

}

printf("!> Incorrect input (T2). Try again: ");

}

printf("TFinish: ");

while (scanf("%lf", &inStruct->tFinish) == 0

|| inStruct->tFinish <= inStruct->t2)

{

CinRecovery();

if (inStruct->tFinish <= inStruct->t2) {

printf("[NOTE] TFinish must be greater than T2.\n");

}

printf("!> Incorrect input (TFinish). Try again: ");

}

printf("--- Transfer characteristic ---\n");

printf("U0: ");

while (scanf("%lf", &outStruct->u0) == 0) {

CinRecovery();

printf("!> Incorrect input (U0). Try again: ");

}

printf("U1: ");

while (scanf("%lf", &outStruct->u1) == 0) {

CinRecovery();

printf("!> Incorrect input (U1). Try again: ");

}

printf("U2: ");

while (scanf("%lf", &outStruct->u2) == 0) {

CinRecovery();

printf("!> Incorrect input (U2). Try again: ");

}

printf("U3: ");

while (scanf("%lf", &outStruct->u3) == 0) {

CinRecovery();

printf("!> Incorrect input (U3). Try again: ");

}

printf("Uin1: ");

while (scanf("%lf", &outStruct->uIn1) == 0) {

CinRecovery();

printf("!> Incorrect input (Uin1). Try again: ");

}

printf("Uin2: ");

while (scanf("%lf", &outStruct->uIn2) == 0

|| outStruct->uIn2 <= outStruct->uIn1)

{

CinRecovery();

if (outStruct->uIn2 <= outStruct->uIn1) {

printf("[NOTE] Uin2 must be greater than Uin1.\n");

}

printf("!> Incorrect input (Uin2). Try again: ");

}

printf("Uin3: ");

while (scanf("%lf", &outStruct->uIn3) == 0

|| outStruct->uIn3 <= outStruct->uIn2)

{

CinRecovery();

if (outStruct->uIn3 <= outStruct->uIn2) {

printf("[NOTE] Uin3 must be greater than Uin2.\n");

}

printf("!> Incorrect input (Uin3). Try again: ");

}

}

short goToNextLine(FILE *fin)

{

char ch;

while (!feof(fin) && ((ch = fgetc(fin)) != '\n')) continue;

return (!feof(fin));

}

short AddDataFromFile(uInStruct *inStruct, uOutStruct *outStruct)

{

FILE *fin = NULL;

char FileName[256];

CinRecovery();

printf("[NOTE] In the file each number should be placed line by line.\n");

printf("#> Enter filename (255 characters): ");

scanf("%255[^\n]s", &FileName[0]);

fin = fopen((char *)&FileName[0], "rt");

printf("--- Signal input parameters ---\n");

if (fin == NULL) {

printf("!> Incorrect filename. Try again later.");

return 0;

}

if (feof(fin) || fscanf(fin, "%100[^\n]s", FileName) == 0

|| sscanf(FileName, "%lf", &inStruct->u1) == 0)

{

printf("!> Incorrect input (U1). Try again later.");

fclose(fin);

return 0;

}

goToNextLine(fin);

if (feof(fin) || fscanf(fin, "%100[^\n]s", FileName) == 0

|| sscanf(FileName, "%lf", &inStruct->u2) == 0)

{

printf("!> Incorrect input (U2). Try again later.");

fclose(fin);

return 0;

}

goToNextLine(fin);

if (feof(fin) || fscanf(fin, "%100[^\n]s", FileName) == 0

|| sscanf(FileName, "%lf", &inStruct->tStart) == 0)

{

printf("!> Incorrect input (TStart). Try again later.");

fclose(fin);

return 0;

}

goToNextLine(fin);

if (feof(fin) || fscanf(fin, "%100[^\n]s", FileName) == 0

|| sscanf(FileName, "%lf", &inStruct->t1) == 0

|| inStruct->t1 <= inStruct->tStart)

{

if (inStruct->t1 <= inStruct->tStart) {

printf("[NOTE] T1 must be greater than TStart.\n");

}

printf("!> Incorrect input (T1). Try again later.");

fclose(fin);

return 0;

}

goToNextLine(fin);

if (feof(fin) || fscanf(fin, "%100[^\n]s", FileName) == 0

|| sscanf(FileName, "%lf", &inStruct->t2) == 0

|| inStruct->t2 <= inStruct->t1)

{

if (inStruct->t2 <= inStruct->t1) {

printf("[NOTE] T2 must be greater than T1.\n");

}

printf("!> Incorrect input (T2). Try again later.");

fclose(fin);

return 0;

}

goToNextLine(fin);

if (feof(fin) || fscanf(fin, "%100[^\n]s", FileName) == 0

|| sscanf(FileName, "%lf", &inStruct->tFinish) == 0

|| inStruct->tFinish <= inStruct->t2)

{

if (inStruct->tFinish <= inStruct->t2) {

printf("[NOTE] TFinish must be greater than T2.\n");

}

printf("!> Incorrect input (TFinish). Try again later.");

fclose(fin);

return 0;

}

goToNextLine(fin);

printf("--- Transfer characteristic ---\n");

if (feof(fin) || fscanf(fin, "%100[^\n]s", FileName) == 0

|| sscanf(FileName, "%lf", &outStruct->u0) == 0)

{

printf("!> Incorrect input (U0). Try again later.");

fclose(fin);

return 0;

}

goToNextLine(fin);

if (feof(fin) || fscanf(fin, "%100[^\n]s", FileName) == 0

|| sscanf(FileName, "%lf", &outStruct->u1) == 0)

{

printf("!> Incorrect input (U1). Try again later.");

fclose(fin);

return 0;

}

goToNextLine(fin);

if (feof(fin) || fscanf(fin, "%100[^\n]s", FileName) == 0

|| sscanf(FileName, "%lf", &outStruct->u2) == 0)

{

printf("!> Incorrect input (U2). Try again later.");

fclose(fin);

return 0;

}

goToNextLine(fin);

if (feof(fin) || fscanf(fin, "%100[^\n]s", FileName) == 0

|| sscanf(FileName, "%lf", &outStruct->u3) == 0)

{

printf("!> Incorrect input (U3). Try again later.");

fclose(fin);

return 0;

}

goToNextLine(fin);

if (feof(fin) || fscanf(fin, "%100[^\n]s", FileName) == 0

|| sscanf(FileName, "%lf", &outStruct->uIn1) == 0)

{

printf("!> Incorrect input (Uin1). Try again later.");

fclose(fin);

return 0;

}

goToNextLine(fin);

if (feof(fin) || fscanf(fin, "%100[^\n]s", FileName) == 0

|| sscanf(FileName, "%lf", &outStruct->uIn2) == 0

|| outStruct->uIn2 <= outStruct->uIn1)

{

if (outStruct->uIn2 <= outStruct->uIn1) {

printf("[NOTE] Uin2 must be greater than Uin1.\n");

}

printf("!> Incorrect input (Uin2). Try again later.");

fclose(fin);

return 0;

}

goToNextLine(fin);

if (feof(fin) || fscanf(fin, "%100[^\n]s", FileName) == 0

|| sscanf(FileName, "%lf", &outStruct->uIn3) == 0

|| outStruct->uIn3 <= outStruct->uIn2)

{

if (outStruct->uIn3 <= outStruct->uIn2) {

printf("[NOTE] Uin3 must be greater than Uin2.\n");

}

printf("!> Incorrect input (Uin3). Try again later.");

fclose(fin);

return 0;

}

fclose(fin);

return 1;

}

void CheckData(uInStruct *inStruct, uOutStruct *outStruct)

{

printf("----------------\n");

printf("Input signal (parameters):\n");

printf("U1\t\t%lf\n", inStruct->u1);

printf("U2\t\t%lf\n", inStruct->u2);

printf("TStart\t\t%lf\n", inStruct->tStart);

printf("T1\t\t%lf\n", inStruct->t1);

printf("T2\t\t%lf\n", inStruct->t2);

printf("TFinish\t\t%lf\n", inStruct->tFinish);

printf("----------------\n");

printf("Transfer characteristic (parameters):\n");

printf("U0\t\t%lf\n", outStruct->u0);

printf("U1\t\t%lf\n", outStruct->u1);

printf("U2\t\t%lf\n", outStruct->u2);

printf("U3\t\t%lf\n", outStruct->u3);

printf("Uin1\t\t%lf\n", outStruct->uIn1);

printf("Uin2\t\t%lf\n", outStruct->uIn2);

printf("Uin3\t\t%lf\n", outStruct->uIn3);

printf("----------------\n");

}

double uIn_get(uInStruct *uStruct, double t)

{

double u1 = uStruct->u1;

double u2 = uStruct->u2;

double tStart = uStruct->tStart;

double t1 = uStruct->t1;

double t2 = uStruct->t2;

double tFinish = uStruct->tFinish;

if (t <= t1) {

return (t - tStart) * u1 / (t1 - tStart);

}

else if (t <= t2) {

return (t - t1) * (u2 - u1) / (t2 - t1) + u1;

}

else {

return (t - t2) * (-u2) / (tFinish - t2) + u2;

}

}

double uOut_get(uOutStruct *uStruct, double u)

{

double u0 = uStruct->u0, u1 = uStruct->u1;

double u2 = uStruct->u2, u3 = uStruct->u3;

double uIn1 = uStruct->uIn1, uIn2 = uStruct->uIn2;

double uIn3 = uStruct->uIn3;

if (u <= uIn1) {

return u * (u1 - u0) / uIn1 + u0;

}

else if (u <= uIn2) {

return (u - uIn1) * (u2 - u1) / (uIn2 - uIn1) + u1;

}

else {

return (u - uIn2) * (u3 - u2) / (uIn3 - uIn2) + u2;

}

}

void T_Array(double *TArray, uInStruct *uStruct, int n)

{

int i;

double t = uStruct->tStart;

double dT = (uStruct->tFinish - uStruct->tStart) / (n - 1);

for (i = 0; i < n; i++) {

TArray[i] = t;

t += dT;

}

}

void uIn_Array(double *uInArray, double *TArray, uInStruct *inStruct, int n)

{

int i;

for (i = 0; i < n; i++) {

uInArray[i] = uIn_get(inStruct, TArray[i]);

}

}

void uOut_Array(double *uOutArray, double *uInArray, uOutStruct *outStruct, int n)

{

int i;

for (i = 0; i < n; i++) {

uOutArray[i] = uOut_get(outStruct, uInArray[i]);

}

}

void PrintTable(double *TArray, double *uInArray, double *uOutArray, int n)

{

int i;

printf("TIME\t\t\tUin\t\t\tUout\n");

for (i = 0; i < n; i++) {

printf("%lf\t\t%lf\t\t%lf\n", TArray[i], uInArray[i], uOutArray[i]);

}

}

void SaveResultToFile(double *TArray, double *uInArray, double *uOutArray, int n)

{

int i;

FILE *fin = NULL;

char FileName[256];

CinRecovery();

printf("#> Enter filename (255 characters): ");

scanf("%255[^\n]s", &FileName[0]);

fin = fopen((char *)&FileName[0], "wt");

if (fin == NULL) {

printf("!> Incorrect filename. Try again later.");

return;

}

for (i = 0; i < n; i++) {

fprintf(fin, "%lf\t\t%lf\t\t%lf\n", TArray[i], uInArray[i], uOutArray[i]);

}

fclose(fin);

}

void ShowGraph(double *TArray, double *uInArray, double *uOutArray, int n)

{

int i;

FILE *fin = NULL;

fin = fopen("time.txt", "wt");

if (fin == NULL) {

printf("!> Error open file \"time.txt\".");

return;

}

for (i = 0; i < n; i++) {

fprintf(fin, "%lf\n", TArray[i]);

}

fclose(fin);

fin = fopen("Uin.txt", "wt");

if (fin == NULL) {

printf("!> Error open file \"Uin.txt\".");

return;

}

for (i = 0; i < n; i++) {

fprintf(fin, "%lf\n", uInArray[i]);

}

fclose(fin);

fin = fopen("Uout.txt", "wt");

if (fin == NULL) {

printf("!> Error open file \"Uout.txt\".");

return;

}

for (i = 0; i < n; i++) {

fprintf(fin, "%lf\n", uOutArray[i]);

}

fclose(fin);

}

double calcUMax(double *uOutArray, int n)

{

int i;

double uTemp;

double uMax = uOutArray[0];

for (i = 1; i < n; i++) {

uTemp = uOutArray[i];

if (uMax < uTemp) {

uMax = uTemp;

}

}

return uMax;

}

double calcAlpha(double *TArray, double *uOutArray, double uMax, double c, int n)

{

int i;

double uTemp;

double alpha = 0;

double dT = TArray[1] - TArray[0];

for (i = 0; i < n; i++) {

uTemp = uOutArray[i];

if ((c * uMax) < uTemp) {

alpha += dT;

}

}

return alpha;

}

Таблица 5.4

Файл "graph.wxm"

t:read_list("time.txt");

Uin:read_list("Uin.txt");

Uout:read_list("Uout.txt");

wxplot2d([['discrete, t, Uin]],[gnuplot_preamble, "set grid;"]);

wxplot2d([['discrete, t, Uout]],[gnuplot_preamble, "set grid;"]);

Таблица 5.5

Файл "about.txt"

===============================

==Program by Kovalenko Leonid==

===============================

========Group: IKPI-81=========

===============================

==========University:==========

St. Petersburg State University

=====of Telecommunications=====

====prof. M.A.Bonch-Bruevich===

===============================

=====St. Petersburg, 2019======

===============================

Соседние файлы в папке Примеры отчетов