Смекни!
smekni.com

Расчет пленочных резисторов в С (стр. 2 из 3)

<указатель>= new<тип массива>[<количество элементов массива>];

При программировании меню удобнее всего использовать оператор switch (<условие>) {case <значение условия>: <исполняемый код> break; ….}

При организации циклов использованы три вида операторов:

for (i=<нач. знач>; i<<кон. знач>; i++) {<исполняемый код>};

do {<исполняемый код>} while (<условие повторения>);

while (<условие повторения>) {<исполняемый код>}.

4. Тестирование и отладка программы

При тестировании программы были рассчитаны все варианты синтеза пленочного резистора для нескольких исходных значений сопротивления, мощности рассеяния резистора и удельной мощности рассеяния пленки. Результаты тестирования, приведенные в приложении, показали корректность синтеза пленочного резистора.

5. Документирование программы

При запуске программы в среде WINDOWSXP в консольном приложении в окне программы появляется меню, состоящее из 3‑х пунктов:

1. ввода данных с контролем их значений как визуально, так и по заданному допустимому диапазону,

2. выполнения расчетов с отображением результатов,

3. выхода из программы.

Если ввод данных не был произведен, то расчетная часть программы автоматически блокируется и предлагается либо ввести данные, либо выйти из программы.

При вводе данных предлагается ввести количество резисторов. После этого последовательно поступает на экран предложения ввести сопротивление резистора и его рассеиваемую мощность. Количество предложений формируется автоматически.

Затем предлагается указать тип ввода

: по списку или по диапазону с заданным шагом. В первом случае предлагается ввести количество элементов списка, а затем поступают предложения ввода значений
. Количество предложений контролируется автоматически. Во втором случае предлагается ввести начальное, конечное значение
и шаг его изменения.

После ввода

предлагается ввести значение
. Все значения
и
являются одинаковыми для всех исходных резисторов.

На этом этап ввода заканчивается и выводится введенная информация для визуального контроля. При вводе данных автоматически контролируется их допустимый диапазон.

При расчете предлагается ввести номер резистора, для которого необходимо провести синтез пленки. Если номер резистора выходит за пределы их количества, то предлагается ввести новый корректный номер.

После ввода номера резистора осуществляется расчет параметров пленки с автоматическим выбором ее геометрии. Результаты расчета выводятся на экран в виде записей, отсортированных по возрастающей величине

. Кроме того выводится максимальное значение
.

Далее выводится исходное меню и работа с программой может быть повторена.

Заключение

1. Использование программирования на языке С++ позволяет реализовать сложные, многовариантные алгоритмы синтеза пленочных резисторов с автоматическим выбором геометрии пленки.

2. Данный язык программирования позволяет построить диалоговые программы с автоматическим управлением диалога и слежением за корректностью значений вводимых исходных данных.

3. Компилятор языка С++ строит эффективную по быстродействию программу и позволяет использовать динамическое распределение памяти, что дает возможность создать компактные по размерам программы.


Литература

1. С++ за 21 день.

2. Программирование на С++. Учеб. пособие / Под ред. А.Д. Хомоненко. – С-Пб.: 1999.

3. Освоение BORLANDC++ 4.5. Т1,2. К. Диалектика, 1996.

Приложение

#defineWIN32_LEAN_AND_MEAN

#include <stdio.h>

#include <tchar.h>

#include <iostream>

#include <conio.h>

#include <iomanip>

#include <math.h>

usingnamespacestd; // использование стандартного пространства имен

// Не изменяемые расчетные параметры

doublebt=0.1; // Техн. значение ширины пленки

doublelt=0.3; // Техн. значение длины пленки

doubleDb=0.01; // Погрешность воспроизведения ширины

doubleDl=0.03; // Погрешность воспроизведения длины

doublegamma=0.1; // Допустимая погрешность коэф. формы

doubleamin=0.3; // Макс. расстояние между полосками пленки сложной формы (изменено)

doubleh=0.05; // Шаг сетки

// Ограничения значений исходных данных

doubleRdown=0.05; // Мин. значение сопротивления резистора

doubleRup=10000; // Макс. значение сопротивления резистора

doublerhodown=0.001; // Мин. значение удельного сопротивления пленки

doublerhoup=1000; // Макс. значение удельного сопротивления пленки

doublePdown=5; // Мин. зсначение рассеиваемой мощности резистора

doublePup=50; // Макс. значение рассеиваемой мощности резистора

doublePodown=10; // Мин. зсначение удельной рассеиваемой мощности пленки

doublePoup=30; // Макс. зсначение удельной рассеиваемой мощности пленки

double R, rho, P, Po, b, l, a, t, x, y, kf, Sglob;

double RhoBeg, RhoEnd, RhoStp, RhoMdl;

int n, NResist, NRho;

int type, nc, menu, cntrl, modein, k;

double *ArrR=0;

double *ArrP=0;

double *ArrRho=0;

double *ArrKf=0;

double *ArrB=0;

double *ArrL=0;

double *ArrA=0;

double *ArrT=0;

double *ArrX=0;

double *ArrY=0;

double *ArrS=0;

int *ArrType=0;

int *ArrN=0;

int *index;

double *ArrBuf;

// длявычислениекоэффициентаформыdouble KForm (double R, double rho);

// Ввод расчетных параметров с контролем их диапазона doublegetdata (constchar *partype, doublepardown, doubleparup);

// Вывод результатов расчета пленки voidOutResult(void);

// Вывод расчетных параметров пленки voidOutParam(void);

// Освобождение памяти для массивов ArrB и ArrPvoidalloc1 (void);

// Выделение и освобождение памяти для остальных динамических массивов voidalloc2 (void);

int main()

{

int j;

cntrl=0;

double nbmax;

do

{

cout

<<»&bsol;tM E N U &bsol;n»<<endl

<<» [1] – VVOD PARAMETROV»<<endl

<<» [2] – RASCHET»<<endl

<<» [0] – VIHOD»

<<endl;

cin>>menu;

switch(menu)

{

case 1:

cout<<»&bsol;nKolichestvo Resistirov N=»;

cin>>NResist;

// Выделение динамической памяти под массивы R и P

alloc1 ();

for (j=0; j<NResist; j++)

{

cout<<»&bsol;nResistor»<<setw(2)<<j+1<<»:»;

ArrR[j]=getdata («&bsol;nR(kOm) (0.05–10000)», Rdown, Rup);

ArrP[j]=getdata («P(mW) (5–50)», Pdown, Pup);

}

cout

<<»&bsol;nMetod zadaniya Diapozona Rho&bsol;n&bsol;n»

<<» [1] – SPISOK Rho (rho1, rho2,…)«<<endl

<<» [2] – DIAPAZON Rho (rho_begin, rho_end, rho_step)«<<endl

<<endl;

cin>>modein;

switch(modein)

{

case 1: // Ввод числа элементов в списке сопротивлений пленки

cout<< «Razmer spiska NRho=»;

cin>>NRho;

break;

case 2: // Ввод диапазона и шага изменения сопротивлений пленки

RhoBeg=getdata («RhoBeg», rhodown, rhoup);

RhoEnd=getdata («RhoEnd», rhodown, rhoup);

RhoStp=getdata («RhoStp», rhodown, rhoup);

NRho=(int) ((RhoEnd-RhoBeg)/RhoStp)+1;

rho=RhoBeg-RhoStp;

break;

}

alloc2 (); // Выделение динам. памяти под массив сопротивления пленки rho

for (j=0; j<NRho; j++)

{

// Ввод элементов массива значений rho с заданным шагом в диапазоне

if (modein==1) ArrRho[j]=getdata («rho», rhodown, rhoup);

if((modein==2) | (modein==3))

{

rho+=RhoStp;

ArrRho[j]=rho;

}

}

Po=getdata («Po (mW/mm2) (10–30)», Podown, Poup); // Вводзначенияудельноймощности Po

cntrl=1;

OutParam(); // Вывод исх. данных для визуального контроля

break;

case 2: // Рассчет геометрических параметров пленки

if(cntrl)

{ // Проверка наличия исх. данных

while (1==1)

{

cout<<»&bsol;nNomer Resistora (1. «<<NResist<<») k=»;

cin>>k; k –;

if (k>=0 && k<NResist) break;

}

R=ArrR[k];

P=ArrP[k];

for (j=0; j<NRho; j++)

{

rho=ArrRho[j];

ParamR();

ArrType[j]=type;

ArrKf[j]=kf;

ArrB[j]=b;

ArrL[j]=l;

ArrA[j]=a;

ArrX[j]=x;

ArrY[j]=y;

ArrT[j]=t;

ArrN[j]=n;

ArrS[j]+=b*l;

}

nbmax=sort();

OutParam();

for (j=0; j<NRho; j++) ArrBuf[j]=ArrB[j];

nbmax=sort();

cout<<» MIN b="<<ArrB [index[0]]<< «mm»<<endl;

cout<<» MAX b="<<ArrB [index[NRho‑1]]<< «mm»<<endl<<endl;

for (j=0; j<NRho; j++) {

type=ArrType [index[j]];

rho=ArrRho [index[j]];

kf=ArrKf [index[j]];

b=ArrB [index[j]];

l=ArrL [index[j]];

a=ArrRho [index[j]];

x=ArrX [index[j]];

y=ArrX [index[j]];

t=ArrT [index[j]];

n=ArrN [index[j]];

OutResult();

}

cout<<endl;

}

else

cout<< «VVEDITE PARAMETRI»<<endl;

break;

case 0:

cout<<endl<<endl<<endl<< «Press ENTER to EXIT…»;

getch();

return 0;

}

}

while (1==1);

}

// Вычислениекоэффициентаформы

// Вывод: коэффициентформыdouble KForm (double R, double rho) {return R/rho;}

// Аргументы: числа x, y, z

// Вывод: макс {x, y, z}

double Max3 (double x, double y, double z) {return x>(z=y>z? y:z)? x:z;}

double Min3 (double x, double y, double z) {return x<(z=y<z? y:z)? x:z;}

{

kf=KForm (R, rho);

if (kf<0.1) type=0; // недопустимое значение Kf

elseif (kf<1)

{ // прямоуголиная пленка при kf<1 (l<b) ф. (7) – (9), (2)

type=1;

double lD=(Dl+Db*kf)/gamma;

double lP=sqrt (R*P/rho/Po);

l=((int) (Max3 (lt, lD, lP)/h)+1)*h;

b=((int) (l/kf/h)+1)*h;

}

else

{ // прямоуголиная пленка при 1<=Kf<=10 (l>b) ф. (2) – (6)

double bD=(Db+Dl)/kf;

double bP=sqrt (rho*P/R/Po);

b=((int) (Max3 (bt, bD, bP)/h)+1)*h;

if (kf<=10)

{

type=2;

l=((int) (kf*b/h)+1)*h;

}

else

{ // пленка типа меандр при Kf>10 ф. (10) – (15)

type=3;

l=kf*b;

if (b<amin) a=0;

else a=b-amin;

nc=0;

do

{

nc++;

if (nc>10)

{

type=4;

break;

}

a+=amin;

t=a+b;

n=(int) sqrt (l/t);

x=n*t;

y=(l-a*n)/n;

}

while (y/a>10);

}

}

}

// Ввод исходных данных с проверкой допустимого их диапазона значений

// Аргументы:

// строка, содержащая название параметра,

// нижняя граница допустимого значения,

// верхняя граница допустимого значения

// Выход: значениепараметраdouble getdata (const char *partype, double pardown, double parup)

{

double parval;

while (1==1)

{

cout<<partype<< "=»; cin>>parval;

if (parval<pardown || parval>parup)

cout<< «non corect DIAPASON»<<endl;

elsebreak;

}

returnparval;

}

// Сортировка индекса массива по возрастанию методом пузырька

// Результат сортировки сохраняется в индексном массиве,

// элементы которого по порядку, начиная с младшего, содержат номера

// элементов исходного массива в порядке их возрастания, т.е.

// первый(нулевой) элемент индексного массива содержит номер