Исходный код
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);
}
