1 Цель работы
1) Изучение функции ввода данных scanf() языка С.
2) Закрепление знаний по использованию ввода данных scanf().
3) Создание сложных программ с использованием большого количества функций определенных пользователем.
-
Домашнее задание
Разработать блок-схему и написать программу расчета амплитудно-частотной характеристики (АЧХ) и фазо-частотной характеристики (ФЧХ) по формулам, полученным в первом этапе (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)));
}