p align="left">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 E N U \n»<<endl <<» [1] - VVOD PARAMETROV»<<endl <<» [2] - RASCHET»<<endl <<» [0] - VIHOD» <<endl; cin>>menu; switch(menu) { case 1: cout<<»\nKolichestvo Resistirov N=»; cin>>NResist; // Выделение динамической памяти под массивы R и P alloc1 (); for (j=0; j<NResist; j++) { cout<<»\nResistor»<<setw(2)<<j+1<<»:»; ArrR[j]=getdata («\nR(kOm) (0.05-10000)», Rdown, Rup); ArrP[j]=getdata («P(mW) (5-50)», Pdown, Pup); } cout <<»\nMetod zadaniya Diapozona Rho\n\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); // Ввод элементов массива значений 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. «<<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); } // Вычисление коэффициента формы // Аргументы: 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<z? y:z)? x:z;} // Вычисление геометрических размеров пленки void ParamR() { kf=KForm (R, rho); if (kf<0.1) type=0; // недопустимое значение Kf else if (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) parval>parup) cout<< «non corect DIAPASON»<<endl; else break; return parval; } // Сортировка индекса массива по возрастанию методом пузырька // Результат сортировки сохраняется в индексном массиве, // элементы которого по порядку, начиная с младшего, содержат номера // элементов исходного массива в порядке их возрастания, т.е. // первый(нулевой) элемент индексного массива содержит номер // минимального элемента исходного массива, а последний элемент индексного // массива содержит номер максимального элемента исходного массива // На выход подается номер максимального элемента исходного массива int sort() { int j, jtmp; int flag; double btmp; double *buf; buf=new double[NRho]; for (j=0; j<NRho; j++) { index[j]=j; buf[j]=ArrBuf[j]; } do { flag=0; for (j=1; j<NRho; 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<<endl; for (i=0; i<NResist; i++) { cout <<» R»<<i+1<< "="<<ArrR[i]<< «kOm» <<» P="<<ArrP[i]<< «mW» <<» Po="<<Po<< «mW/mm2»; if (modein==1) { cout<<» rho={»; for (j=0; j<NRho_1; j++) cout<<ArrRho[j]<<»;»; cout<<ArrRho [NRho_1]<<») kOm»<<endl; } if((modein==2)|(modein==3)) cout <<» rho=(«<<RhoBeg <<»; «<<RhoBeg+RhoStp <<». «<<RhoEnd<<») kOm/mm2»<<endl; } cout<<endl; } // Вывод результатов расчета пленочного резистора void OutResult() { switch(type) { case 0: // Ошибка Kf<0.1 cout<<«ERROR «<< «Kform=»<<kf<<endl; break; case 1: case 2: // прямоугольная пленка 0.1<=Kf<=10 cout<<setw(9) <<» Rectangle» <<setprecision(3) <<» b="<<setw(4)<<b<< «mm» <<» l="<<setw(4)<<l<< «mm» <<» S="<<setw(4)<<b*l<< «mm2» <<» Kf="<<setw(4)<<kf <<»\tRho="<<setw(6)<<rho<< «kOm/mm2» //rho <<endl; break; case 3:// пленка типа меандр Kf>10 cout<<setw(6) <<» Meandr» <<setprecision(3) <<» b="<<setw(4)<<b<< «mm» <<» a="<<setw(4)<<a<< «mm» <<» t="<<setw(4)<<t<< «mm» <<» x="<<setw(4)<<x<< «mm» <<» y="<<setw(4)<<y<< «mm» <<» n="<<setw(2)<<n <<» Kf="<<setw(4)<<kf <<» Rho="<<setw(5)<<rho <<endl; break; case 4: cout<<«ERROR «<< «nc=»<<nc<<endl; 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<NRho; j++) ArrS[j]=0; } Результаты тестирования программы
Блок-схема программы контроля вводимых данных
Страницы: 1, 2
|