Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Протокол лаб8 информатика.doc
Скачиваний:
3
Добавлен:
03.12.2018
Размер:
397.82 Кб
Скачать

1 Цель работы

1) Изучение функции ввода данных scanf() языка С.

2) Закрепление знаний по использованию ввода данных scanf().

3) Создание сложных программ с использованием большого количества функций определенных пользователем.

  1. Домашнее задание

Разработать блок-схему и написать программу расчета амплитудно-частотной характеристики (АЧХ) и фазо-частотной характеристики (ФЧХ) по формулам, полученным в первом этапе (2 формулы) и втором этапе (4 формулы) расчетно-графической работы (РГР), выполненной по курсу «алгоритмические языки и программирование». Исходные данные для расчета в зависимости от варианта задания, а также значение и количество значений точек расчета АЧХ и ФЧХ, вводятся с клавиатуры. Ввод каждого значения данных оформить в виде отдельной функции и оконного интерфейса используя при этом функции из программы, которая использовалась в лабораторной работе № 1. Расчеты АЧХ и ФЧХ произвести в цикле, организованном с помощью оператора for. Результаты расчета оформить в виде таблицы. Подготовить исходные данные для проверки работоспособности программы и ожидаемый отклик программы на эти исходные данные.

3 Ответы на домашние задание

Блок схема программы для расчета АЧХ и ФЧХ

На рисунке 1 изображена блок-схема алгоритма работы программы для расчета АЧХ и ФЧХ, по формулам, полученным в первом этапе (2 формулы) и втором этапе (4 формулы) расчетно-графической работы (РГР)

Рисунок 1 - Блок схема программы.

Рисунок 1 - Блок схема программы (продолжение)

Вычисления значений АЧХ и ФЧХ производиться в соответствии с блок-схемами изображеными на рисунках 2,3.

Рисунок 2 - Вычисление АЧХ

Рисунок 3 - Вычисление ФЧХ

4 Исходный текст программы для расчета амплитудно-частотной характеристики (АЧХ) и фазо-частотной характеристики (ФЧХ) по формулам, полученным на первом и втором этапе расчетно-графической работы (РГР).

/* АЧХ-ФЧХ _ 8 */

#include <stdio.h>

#include <conio.h>

#include <math.h>

#include <string.h>

/***************** Объявление используемых функций *****************/

void menu(void);

void activ(int);

void func0(void);

void func1(void);

void func2(void);

void func3(void);

void func4(float L, float C, float M, float R);

void clear(int, int, int, int, int);

float edit(int x, int y, int kol, char *txt);

void win(int, int, int, int);

float ACH(float X, float k);

float FCH(float X, float k);

/*********************** Определение констант **********************/

#define BG BLUE /* TextBackground */

#define TC WHITE /* TextColor */

#define TA LIGHTRED /* TextActiv */

#define NumPos 5 /* Љ®«-ў® Їг­Єв®ў ¬Ґ­о */

/********************** Глобальные переменные **********************/

char *TextMenu[NumPos]={ "C", "L", "R", "M", "Расчеты"};

int xMenu[NumPos]=

{ 27,

34,

41,

48,

55};

float C=10e-6;

float L=400e-6;

float M=55e-6;

float R=16;

/*******************************************************************/

/* Главная функция */

/*******************************************************************/

void main(void)

{

int ch;

int pos=0;

clrscr();

clear(1,1,80,25,BLACK);

_setcursortype(_NOCURSOR);

do

{

menu();

activ(pos);

if((ch=getch()) == 0) ch=getch();

if(ch == 77)

if(++pos >= NumPos) pos = 0;

if(ch == 75)

if(--pos < 0) pos = NumPos-1;

if(ch == 13)

{

switch(pos)

{

case 0:

func0(); break;

case 1:

func1(); break;

case 2:

func2(); break;

case 3:

func3(); break;

case 4:

func4(L, C, M, R); break;

}

}

}

while(ch != 27);

clear(80,80,80,80, BLACK);

_setcursortype(_NORMALCURSOR);

}

/*******************************************************************/

/* Вывод не активных всех пунктов меню */

/*******************************************************************/

void menu(void)

{

int i;

win(20,4,65,8);

textcolor(TC);

for(i=0; i<NumPos; i++)

{

gotoxy(xMenu[i],6);

cputs(TextMenu[i]);

}

}

/*******************************************************************/

/* Активизация соответствующего пункта меню */

/*******************************************************************/

void activ(int pos)

{

gotoxy(xMenu[pos],6);

textcolor(TA);

cputs(TextMenu[pos]);

}

/*******************************************************************/

/* Функция первого пункта меню */

/*******************************************************************/

void func0(void)

{

char text_str[256];

win(23,15,56,18);

gotoxy(25,15);

textcolor(TC);

cputs("Редактирование исходных данных ");

gotoxy(26,17);

cputs("Введите C, мФ” =");

sprintf(text_str,"%0.6f",C);

C=edit(47,17,8,text_str);

clear(23,15,56,18,BLACK);

}

/*******************************************************************/

/* Очистка экрана */

/*******************************************************************/

void clear(int left, int top, int right, int bottom, int BgColor)

{

window(left, top, right, bottom);

textbackground(BgColor);

clrscr();

window(1,1,80,25);

textbackground(BG);

}

/*******************************************************************/

/* Функция второго пункта меню */

/*******************************************************************/

void func1(void)

{

char text_str[256];

win(23,15,56,18);

gotoxy(25,15);

textcolor(TC);

cputs("Редактирование исходных данных ");

gotoxy(26,17);

cputs("Введите L, Гн =");

sprintf(text_str,"%0.5f",L);

L=edit(47,17,8,text_str);

clear(23,15,56,18,BLACK);

}

/*******************************************************************/

/* Функция третьего пункта меню */

/*******************************************************************/

void func2(void)

{

char text_str[256];

win(23,15,56,18);

gotoxy(25,15);

textcolor(TC);

cputs("Редактирование исходных данных ");

gotoxy(26,17);

cputs("Введите R, Ом =");

sprintf(text_str,"%2.1f", R);

R=edit(47,17,8,text_str);

clear(23,15,56,18,BLACK);

}

/*******************************************************************/

/* Функция четвертого пункта меню */

/*******************************************************************/

void func3(void)

{

char text_str[256];

win(23,15,56,18);

gotoxy(25,15);

textcolor(TC);

cputs("Редактирование исходных данных ");

gotoxy(26,17);

cputs("Введите M, Гн =");

sprintf(text_str,"%f", M);

M=edit(47,17,8,text_str);

clear(23,15,56,18,BLACK);

}

/*******************************************************************/

/* Ввод значения */

/*******************************************************************/

float edit(int x, int y, int kol, char *txt)

{

float f;

char str[30];

char ch;

int kom=0;

int x1;

int j;

_setcursortype(_NORMALCURSOR);

strcpy(str,txt);

x1 = x+strlen(str);

do

{

if(strchr(str,'.') != 0) kom=1; else kom=0;

gotoxy(x,y);

for(j=x; j<x+kol;j++) putch(' ');

gotoxy(x,y); cputs(str); gotoxy(x1,y);

if((ch=getch()) == 0) ch = getch();

if(ch >= '0' && ch <= '9' || ch == '.')

{

if(ch == '.') if(++kom > 1) continue;

if(strlen(str) < kol)

{

for(j=strlen(str)+1;j >= x1-x;--j)

str[j] = str[j-1];

str[x1-x] = ch; str[strlen(str)] = 0;

x1++;

}

}

if(ch == 8 && x1 != x)

{

for(j=x1-x-1; j <= strlen(str); j++)

str[j] = str[j+1];

if(--x1 < x) x1=x;

}

if(ch == 83)

{

for(j=x1-x; j <= strlen(str); j++)

str[j] = str[j+1];

}

if(ch == 75)

if(--x1 < x) x1=x;

if(ch == 77)

if(++x1 > x+strlen(str)) x1 = x+strlen(str);

}

while(ch != 13 && ch != 27);

_setcursortype(_NOCURSOR);

return(atof(str));

}

/*******************************************************************/

/* Прорисовка бордюра окна по координатам */

/*******************************************************************/

void win(int left, int top, int right, int bottom)

{

int i;

textcolor(TC);

textbackground(BG);

gotoxy(left,top);

putch(201);

for(i=left+1; i<right; i++)

putch(205);

putch(187);

for(i=top+1; i<bottom; i++)

{

gotoxy(right,i);

putch(186);

}

gotoxy(right,bottom);

putch(188);

for(i=right-1; i>left; i--)

{

gotoxy(i,bottom);

putch(205);

}

gotoxy(left,bottom);

putch(200);

for(i=bottom-1; i>top; i--)

{

gotoxy(left,i);

putch(186);

}

clear(left+1,top+1,right-1,bottom-1,BG);

}

/*******************************************************************/

/* Функция пятого пункта меню */

/*******************************************************************/

void func4(float L, float C, float M, float R)

{

clrscr();

textcolor(TC);

textbackground(BLACK);

float p, Q, w0, Kzv, X, k, A, F;

printf("┌──────────────────────────────────────────────────────┐\n");

printf("│ Вы ввели такие параметры контура │\n");

printf("└──────────────────────────────────────────────────────┘\n\n");

printf("Индуктивность контура: %f Гн\n", L);

printf("Емкость контура: %f мФ\n", С);

printf("Активное сопротивление контура: %f Ом\n", R);

printf("Индуктивность связи: %f Гн\n", M);

printf(" Для продолжения нажмите любую клавишу");

getch();

clrscr();

C= C*0.001;

p = sqrt(L / C);

Q = p / R;

w0 = 1 / sqrt(L * C);

Kzv = M / sqrt(L * L);

X = Kzv * Q;

printf("┌──────────────────────────────────────────────────────┐\n");

printf("│ Розсчитанные параметры контура │\n");

printf("└──────────────────────────────────────────────────────┘\n\n");

printf("Характеристическое сопротивление = %f Ом\n", p);

printf("Добротность = %f\n", p);

printf("Резонансная частота = %f рад\сек\n", w0);

printf("Коэфициент связи = %f\n", Kzv);

printf("Фактор связи = %f \n", X);

printf(" Для продолжения нажмите любую клавишу");

getch();

clrscr();

printf(" Таблица значений АЧХ и ФЧХ при Х=1\n");

printf(" ╔═════════╤═════════╤═════════╗\n");

printf(" ║ Кси │ АЧХ(w) │ ФЧХ(w) ║\n");

printf(" ╠═════════╪═════════╪═════════╣\n");

for (k = -4;k <= 4;k = k+0.5)

{

A = ACH(X, k);

F = FCH(X ,k);

printf(" ║ %4.1f │ %1.3f │ %1.3f ║\n", k, A, F);

}

printf(" ╚═════════╧════════╧═════════╝\n");

printf(" Для продолжения нажмите любую клавишу");

getch();

clrscr();

X=1;

printf(" Таблица значений АЧХ и ФЧХ при Х=1\n");

printf(" ╔═════════╤═════════╤═════════╗\n");

printf(" ║ Кси │ АЧХ(w) │ ФЧХ(w) ║\n");

printf(" ╠═════════╪═════════╪═════════╣\n");

for (k = -4;k <= 4;k = k+0.5)

{

A = ACH(X, k);

F = FCH(X ,k);

printf(" ║ %4.1f │ %1.3f │ %1.3f ║\n", k, A, F);

}

printf(" ╚═════════╧════════╧═════════╝\n");

printf(" Для продолжения нажмите любую клавишу");

getch();

clrscr();

X=2.41;

printf(" Таблица значений АЧХ и ФЧХ при Х=2.41\n");

printf(" ╔═════════╤═════════╤═════════╗\n");

printf(" ║ Кси │ АЧХ(w) │ ФЧХ(w) ║\n");

printf(" ╠═════════╪═════════╪═════════╣\n");

for (k = -4;k <= 4;k = k+0.5)

{

A = ACH(X, k);

F = FCH(X ,k);

printf(" ║ %4.1f │ %1.3f │ %1.3f ║\n", k, A, F);

}

printf(" ╚═════════╧════════╧═════════╝\n");

printf(" Для продолжения нажмите любую клавишу");

getch();

clrscr();

}

/*******************************************************************/

/* Функции пользоватея */

/*******************************************************************/

float ACH(float X, float k)

{

return 2*X/(sqrt(pow(1+pow(X,2)-pow(k,2),2)+4*pow(k,2)));

}

float FCH(float X, float k)

{

return (M_PI/2)-atan(2*k/(1+pow(X,2)-pow(k,2)));

}