Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Модуль file_io.cpp

Читайте также:
  1. C) модульдері тең, бір біріне қарсы бағытталған екі параллель күш
  2. Аналіз модульної контрольної роботи
  3. Базовый модуль № 10. ПРЕСТУПЛЕНИЯ ПРОТИВ ЗДОРОВЬЯ НАСЕЛЕНИЯ И ОБЩЕСТВЕННОЙ НРАВСТВЕННОСТИ
  4. Базовый модуль № 10. Экологические преступления.
  5. Базовый модуль № 2. Преступления против свободы, чести и достоинства личности.
  6. Базовый модуль № 3. Преступления против половой неприкосновенности и половой свободы личности.
  7. Базовый модуль № 5. Преступления против семьи и несовершеннолетних.

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 страница

mybiblioteka.su - 2015-2024 год. (0.05 сек.)