- •Курсовая работа
- •1. Введение
- •2. Описание работы
- •3. Анализ задачи и выбор метода решения
- •3.1 Расчетные выражения
- •3.2 Контрольный расчет
- •3.3 Схема обобщенного алгоритма
- •4. Разработка алгоритмов
- •4.1 Таблица идентификаторов
- •5. Разработка программы
- •6. Отладка и тестирование программы
- •Проверка программы на точность следования всем алгоритмам.
- •Пошаговый разбор работы программы.
- •Получение результатов работы программы для рабочего набора.
- •6.1 Заключение
- •7. Список используемой литературы
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====== =============================== |