зміст
Вступ
1. Завдання на курсову роботу
2. Розробка алгоритму розв'язання задачі
3. Розробка програми
4. Тестування та налагодження програми
5. Документування програми
висновок
література
додаток
Вступ
Метою даної курсової роботи є отримання навичок розробки, налагодження, тестування і документування програм на мові високого рівня при вирішенні на ЕОМ прикладної інженерної задачі.
В ході виконання курсової роботи вирішені такі завдання:
Розроблено алгоритм синтезу плівкового резистора по заданих параметрах вихідного резистора.
Розроблено програму реалізації даного алгоритму на мові С ++.
Виконана налагодження і тестування програми.
Складена документація на програму і інструкція користувача програмою.
Програма оттранслировать і скомпонована в середовищі MVS-6 у вигляді консольного застосування.
Програма призначена для роботи під управлінням операційної системи WINDOWS XP або її більш ранніх версій.
При роботі програми використовується стандартне обладнання комп'ютера: процесор типу PENTIUM, жорсткий диск, монітор, клавіатура і миша.
1. Завдання на курсову роботу
Прикладний інженерним завданням в цій роботі є синтез інтегральних резисторів мікросхем. Резистори мікросхеми є смужки тонкої плівки в формі прямокутника або меандру, як показано на рис. 1.
Мал. 1 Форма плівкового резистора
Розрахунок резистора полягає у визначенні його розмірів - довжини і ширини в разі прямокутних плівок і ширини, відстані між смужками, розмірів і, а також числа ланок у разі плівок у формі меандру.
Вихідні дані представлені в вигляді двох груп - дані зі змінними і постійними значеннями.
Таблиця 1. Вихідні дані зі змінними значеннями
|
Позначення і од
|
, кому
|
, Кому / кв
|
, мВт
|
, МВт / мм 2
|
|
Найменування
|
Номінальний опір
|
Опір квадрата резистивної плівки
|
Потужність розсіювання резистора
|
Максимальна питома потужність розсіювання резистивной плівки
|
|
діапазон значення
|
0.05..10000
|
0.01..50
|
5..50
|
10..30
|
|
|
Таблиця 2. Вихідні дані з постійними значеннями
|
Позначення і одиниці
|
, мм
|
, мм
|
, мм
|
, мм
|
|
, мм
|
, мм
|
|
Найменування
|
Мінімально допустима ширина і довжина резистора
|
Похибка відтворення ширини і довжини резистора
|
Допустима похибка коефіцієнта форми
|
Мінімальна відстань між смужками резистора складної форми
|
Крок координатної сітки
|
|
діапазон значення
|
0.1
|
0.3
|
0.01
|
0.03
|
0.1
|
0.3
|
0.01
|
|
|
Розрахунок резисторів виконується в наступній послідовності.
Визначається значення коефіцієнта форми
(1)
Вибирається форма резистора
1. При - резистор прямокутної форми,
2. При - резистор прямокутної форми, у якого,
3. При - резистор складної форми типу меандр,
4. При - резистор не може бути сконструйований.
Зв'язок між розмірами резистора прямокутної форми визначається співвідношенням
(2)
У разі 1
, (3)
де
, (4)
. (5)
Після визначення довжина обчислюється за формулою (2). Отримані значення ширини і довжини округлюються з урахуванням кроку координатної сітки за формулою
, (6)
де, - ціла частина числа.
У разі 2
Визначається довжина з виразу
, (7)
де
, (8)
. (9)
Ширина визначається за формулою (2) і значення ширини і довжини округлюються за формулою (6).
У разі 3
Визначається ширина резистора за формулами (3) - (5). Визначається довжина середньої лінії меандру з виразу
. (10)
Здається відстань. Якщо то .
Визначається крок однієї ланки меандру
. (11)
Визначається за наближеною формулою число ланок меандру
. (12)
Обчислюється довжина і ширина меандру
, (13)
(14)
перевіряється умова
. (15)
Якщо ця умова виконується, то розрахунок завершується. Інакше, збільшується відстань на величину і повторюються обчислення за формулами (11) - (14). Якщо при 10-ти кратному повторенні співвідношення (15) не виконується, то розрахунок завершується з фіксуванням факту неможливості синтезу резистора.
Розглянута методика розрахунку застосовується до заданій кількості резисторів. Діапазон значень і значення для всіх резисторів приймається однаковими.
2. Розробка алгоритму розв'язання задачі
Блок-схема головного програми
.
Блок-схема програми розрахунку параметрів резистора
Блок-схема програми розрахунку коефіцієнта форми
Блок-схема програми розрахунку максимального з 3-х чисел
3. Розробка програми
При програмуванні використаний апарат функцій, що реалізують відносно самостійні ділянки алгоритму розв'язання задачі. При складанні програми застосовувалися як функції з аргументами і повертаються значеннями, так і функції, що мають форму процедур без аргументів, в яких використовувалися глобальні дані програми.
При резервуванні пам'яті використовувалися динамічні масиви, вказівниками яких присвоювалися адреси пам'яті в ході виконання програми за кількістю введеної інформації. Для цієї мети в мові С ++ найбільш зручно використовувати оператор
<�Покажчик> = new <�тип масиву> [<�кількість елементів масиву>];
При програмуванні меню зручніше за все використовувати оператор switch (<�умова>) {case <�значення умови>: <�виконуваний код> break; ....}
При організації циклів використані три види операторів:
for (i = <�поч. знач>; i << кін. знач>; i ++) {<�виконуваний код>};
do {<�виконуваний код>} while (<�умова повторення>);
while (<�умова повторення>) {<�виконуваний код>}.
4. Тестування та налагодження програми
При тестуванні програми були розраховані всі варіанти синтезу плівкового резистора для декількох вихідних значень опору, потужності розсіювання резистора і питомої потужності розсіювання плівки. Результати тестування, наведені в додатку, показали коректність синтезу плівкового резистора.
5. Документування програми
При запуску програми в середовищі WINDOWS XP в консольному додатку у вікні програми з'являється меню, що складається з 3_х пунктів:
1. введення даних з контролем їх значень як візуально, так і за заданим допустимому діапазону,
2. виконання розрахунків з відображенням результатів,
3. виходу з програми.
Якщо введення даних не було оглянуто, то розрахункова частина програми автоматично блокується і пропонується або ввести дані, або вийти з програми.
При введенні даних пропонується ввести кількість резисторів. Після цього послідовно надходить на екран пропозиції ввести опір резистора і його рассеиваемую потужність. Кількість пропозицій формується автоматично.
Потім пропонується вказати тип введення: за списком або по діапазону з заданим кроком. У першому випадку пропонується ввести кількість елементів списку, а потім надходять пропозиції введення значень. Кількість пропозицій контролюється автоматично. У другому випадку пропонується ввести початкове, кінцеве значення і крок його зміни.
Після введення пропонується ввести значення. Всі значення і є однаковими для всіх вихідних резисторів.
На цьому етап введення закінчується і виводиться введена інформація для візуального контролю. При введенні даних автоматично контролюється їх допустимий діапазон.
При розрахунку пропонується ввести номер резистора, для якого необхідно провести синтез плівки. Якщо номер резистора виходить за межі їх кількості, то пропонується ввести новий коректний номер.
Після введення номера резистора здійснюється розрахунок параметрів плівки з автоматичним вибором її геометрії. Результати розрахунку виводяться на екран у вигляді записів, відсортованих по зростаючій величині. Крім того виводиться максимальне значення.
Далі виводиться вихідне меню і робота з програмою може бути повторена.
висновок
1. Використання програмування на мові С ++ дозволяє реалізувати складні, різноманітні алгоритми синтезу плівкових резисторів з автоматичним вибором геометрії плівки.
2. Дана мова програмування дозволяє побудувати діалогові програми з автоматичним управлінням діалогу і стеженням за коректністю значень що вводяться вихідних даних.
3. Компілятор мови С ++ будує ефективну за швидкодією програму і дозволяє використовувати динамічний розподіл пам'яті, що дає можливість створити компактні за розмірами програми.
література
1.С ++ за 21 день.
2. Програмування на С ++. Учеб. посібник / За ред. А.Д. Хомоненко. - С-Пб .: 1999.
3. Освоєння BORLAND C ++ 4.5. Т1,2. К. Діалектика, 1996..
додаток
// підключення готових бібліотек
#define WIN32_LEAN_AND_MEAN
#include
#include
#include
#include
#include
#include
using namespace std; // використання стандартного простору імен
// Чи не змінювані розрахункові параметри
double bt = 0.1; // Техн. значення ширини плівки
double lt = 0.3; // Техн. значення довжини плівки
double Db = 0.01; // Похибка відтворення ширини
double Dl = 0.03; // Похибка відтворення довжини
double gamma = 0.1; // Допустима похибка коеф. форми
double amin = 0.3; // Макс. відстань між смужками плівки складної форми (змінено)
double h = 0.05; // Крок сітки
// Обмеження значень вихідних даних
double Rdown = 0.05; // Мін. значення опору резистора
double Rup = 10000; // Макс. значення опору резистора
double rhodown = 0.001; // Мін. значення питомої опору плівки
double rhoup = 1000; // Макс. значення питомої опору плівки
double Pdown = 5; // Мін. зсначеніе розсіюється резистора
double Pup = 50; // Макс. значення розсіюваною потужності резистора
double Podown = 10; // Мін. зсначеніе питомої потужності, що розсіюється плівки
double Poup = 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);
// для знаходження максимального з трьох чисел double Max3 (double x, double y, double z);
// для знаходження мініімального з трьох чисел double Min3 (double x, double y, double z);
// для розрахунок параметрів плівки void ParamR (void);
// Введення розрахункових параметрів з контролем їх діапазону double getdata (const char * partype, double pardown, double parup);
// для сортування масивів по зростанню int sort (void);
// Висновок результатів розрахунку плівки void OutResult (void);
// Висновок розрахункових параметрів плівки void OutParam (void);
// Звільнення пам'яті для масивів ArrB і ArrP void alloc1 (void);
// Виділення і звільнення пам'яті для інших динамічних масивів void alloc2 (void);
int main ()
{
int j;
cntrl = 0;
double nbmax;
do
{
cout
<< »tM ENU n» <
<< »[1] - VVOD PARAMETROV» <
<< »[2] - RASCHET» <
<< »[0] - VIHOD»
<
cin >> menu;
switch (menu)
{
case 1:
cout << "nKolichestvo Resistirov N =»;
cin >> NResist;
// Виділення динамічної пам'яті під масиви R і P
alloc1 ();
for (j = 0; j
{
cout << "nResistor» < <<<�»:»;
ArrR [j] = getdata ( «nR (kOm) (0.05-10000)», Rdown, Rup);
ArrP [j] = getdata ( «P (mW) (5-50)», Pdown, Pup);
}
cout
<< »nMetod zadaniya Diapozona Rhonn»
<< »[1] - SPISOK Rho (rho1, rho2, ...)« <
<< »[2] - DIAPAZON Rho (rho_begin, rho_end, rho_step)« <
<
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
{
// Введення елементів масиву значень rho з заданим кроком в діапазоні
if (modein == 1) ArrRho [j] = getdata ( «rho», rhodown, rhoup);
// Введення елементів масиву значень rho за списком
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 << "nNomer Resistora (1.« < <�») k=»;
cin >> k; k -;
if (k> = 0 && k
}
R = ArrR [k];
P = ArrP [k];
for (j = 0; 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
nbmax = sort ();
cout << "MIN b =" <
cout << "MAX b =" <
for (j = 0; 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 <
}
else
cout << "VVEDITE PARAMETRI» <
break;
case 0:
cout < < «Press ENTER to EXIT…»;
getch ();
return 0;
}
}
while (1 == 1);
}
// Обчислення коефіцієнта форми
// Аргументи: R_сопротівленіе резистора, rho_сопротівленіе плівки
// Висновок: коефіцієнт форми double KForm (double R, double rho) {return R / rho;}
// Визначення максимального з 3_чісел x, y, z
// Аргументи: числа 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
// Обчислення геометричних розмірів плівки void ParamR ()
{
kf = KForm (R, rho);
if (kf <0.1) type = 0; // неприпустиме значення Kf
else if (kf <1)
{// прямоуголіная плівка при kf <1 (l
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
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 = (la * n) / n;
}
while (y / a> 10);
}
}
}
// Введення вихідних даних з перевіркою допустимого їх діапазону значень
// Аргументи:
// рядок для назви параметра,
// нижня межа допустимого значення,
// верхня межа допустимого значення
// Вихід: значення параметра double getdata (const char * partype, double pardown, double parup)
{
double parval;
while (1 == 1)
{
cout < < "=»; cin> > Parval;
if (parval parup)
cout << «non corect DIAPASON» <
else break;
}
return parval;
}
// Сортування індексу масиву по зростанню методом бульбашки
// Результат сортування зберігається в індексному масиві,
// елементи якого по порядку, починаючи з молодшого, містять номера
// елементів вихідного масиву в порядку їх зростання, т.е.
// перший (нульовий) елемент індексного масиву містить номер
// мінімального елемента вихідного масиву, а останній елемент індексного
// масиву містить номер максимального елемента вихідного масиву
// На вихід подається номер максимального елемента вихідного масиву
int sort ()
{
int j, jtmp;
int flag;
double btmp;
double * buf;
buf = new double [NRho];
for (j = 0; j
{
index [j] = j;
buf [j] = ArrBuf [j];
}
do
{
flag = 0;
for (j = 1; j
if (buf [j_1]> buf [j])
{
jtmp = index [j];
index [j] = index [j_1];
index [j_1] = jtmp;
btmp = buf [j];
buf [j] = buf [j_1];
buf [j_1] = btmp;
flag = 1;
}
}
while (flag);
return index [NRho];
}
// Висновок введених вихідних даних для візуального контролю
void OutParam ()
{
int i, j;
cout <
for (i = 0; i
{
cout
<< »R» < << "="<
<< »P =" <
<< »Po =" < < «mW/mm2»;
if (modein == 1)
{
cout << "rho = {»;
for (j = 0; j
cout <
cout <
}
if ((modein == 2) | (modein == 3))
cout
<< »rho = (« <
<< »; «<
<< ». «< <�») kOm/mm2»<
}
cout <
}
// Висновок результатів розрахунку плівкового резистора void OutResult ()
{
switch (type)
{
case 0: // Помилка Kf <0.1
cout << "ERROR" << «Kform =" <
break;
case 1:
case 2: // прямокутна плівка 0.1 <= Kf <= 10
cout <
<< »Rectangle»
<
<< »b =" < << «mm»
<< »l =" < << «mm»
<< »S =" < <<< «mm2»
<< »Kf =" < <
<< »tRho =" < << «kOm/mm2» //rho
<
break;
case 3: // плівка типу меандр Kf> 10
cout <
<< »Meandr»
<
<< »b =" < << «mm»
<< »a =" < <
<< »t =" < << «mm»
<< »x =" < << «mm»
<< »y =" < << «mm»
<< »n =" < <
<< »Kf =" < <
<< »Rho =" < <
<
break;
case 4:
cout << "ERROR" << «nc =" <
break;
}
}
// Виділення пам'яті для динамічних масивів значень
// опору R і розсіюється P void alloc1 ()
{
if (ArrR! = NULL) delete ArrR;
if (ArrP! = NULL) delete ArrP;
ArrR = new double [NResist];
ArrP = new double [NResist];
}
// Виділення пам'яті для динамічних масивів значень
// опору плівки, коефіцієнтів форми і
// розрахованих геометрічес параметрів плівкового резистора void alloc2 ()
{
if (ArrRho! = NULL) delete ArrRho;
if (ArrKf! = NULL) delete ArrKf;
if (ArrB! = NULL) delete ArrB;
if (ArrL! = NULL) delete ArrL;
if (ArrA! = NULL) delete ArrA;
if (ArrX! = NULL) delete ArrX;
if (ArrY! = NULL) delete ArrY;
if (ArrT! = NULL) delete ArrT;
if (ArrN! = NULL) delete ArrN;
if (index! = NULL) delete index;
if (ArrBuf! = NULL) delete ArrBuf;
if (ArrType! = NULL) delete ArrType;
ArrRho = new double [NRho];
ArrKf = new double [NRho];
ArrB = new double [NRho];
ArrL = new double [NRho];
ArrA = new double [NRho];
ArrX = new double [NRho];
ArrY = new double [NRho];
ArrT = new double [NRho];
ArrN = new int [NRho];
ArrS = new double [NRho];
ArrType = new int [NRho];
index = new int [NRho];
ArrBuf = new double [NRho];
for (int j = 0; j
}
Результати тестування програми
Блок-схема програми контролю даних, що вводяться
1>
|