i повернення в програму на те саме місце, з якого функцiя викликалася. Якщо цей оператор має вираз, то його значення присвоюється iменi процедури i є результатом її виконання. Якщо фукція не повертає в головну програму ніяких значень (наприклад, видає на екран малюнок), то вона може й не мати цього оператора. Але це не вважається хорошим тоном програмування – при читанні такої програми не видно чітко де закінчується текст функції. У такому випадку наприкінці функції варто вживати оператор return без виразу (просто return;).
Формальнi параметри функцiї, якщо вони є, локалiзованi в її тiлi, пам’ять пiд них дублюється. Локалiзованими є також внутрiшнi змiннi функцiї, їхні значення втрачаються пiсля виходу з неї, якщо вони не мають клас пам’ятi static. Це особливо важливо для програм, процедури-функції яких утворюють динамічні масиви. Якщо не застосовуються засоби звільнення (вищерозглянена в розділі 6 функція free()) такої пам’яті, то вказівник на неї пропадає, тоді використати її повторно буде неможливо. При багаторазовому зверненні до такої функції можна розтранжирити всю пам’ять.
8.8. Графіка.
Перед програмуванням графiчних символiв необхiдно встановити графiчний режим роботи монiтора. Ця та iншi графiчнi роботи виконуються за допомогою графiчних функцiй. Найбiльш вживаними функцiями є:
CLOSEGRAPH(void); - закриває графiчний режим;
INITGRAPH(*grdriver, *grmode, char *pathdriver); - iнiцiалiзо-
вує графiчний режим, параметри: тип графiчного драйвера, модель
екрану (розмiри в пiкселях та палiтра кольорiв), шлях до драйвера.
LINE(int x1, int y1, int x2, int y2); - рисує лiнiю, парамет-
ри: координати початку та кiнця лiнiї;
OUTTEXTXY(int x, int y, char *textstring); - виводить на екран
текст, параметри: координати початку тексту i текстова константа
або адреса початку тексту в пам'ятi (iм'я масиву лiтер);
Додаток А
# include<C:\TEMP\TC\stdio.h>
# include<C:\TEMP\TC\bios.h>
# include<C:\TEMP\TC\graphics.h>
void grafik(char *),Ejler(float),Krok(void);
float Simpson(void);
float yb[101],y[3],z[3],f[3];
float twst=2.0,t1=0.1,t2=0.01,t3=0.2;
float k1=3,k2=5,a0,b0,h,min,in,c0k,c0o,c0,a1,a2,a3;
int i,j,m=3,n=100;
/*Pobudova hrafika*/
void grafik(char *c)
{
int j,i,gmode,gdriver=DETECT;
initgraph(&gdriver,&gmode,"");
printf("\nГрафік %s процесу\n",c);
for(i=0;i<100;i++)line(4*i+100,300-100*yb[i],4*(i+1)+100,300-100*yb[i+1]);
line(100,200,500,200);
line(100,300,500,300);line(100,100,100,500);
outtextxy(80,200,"1");outtextxy(80,300,"0");
bioskey(0);
closegraph();return;
}
/* Metod Ejlera pokr */
void Ejler(float c0)
{void systema(void);
y[0]=y[1]=y[2]=0; b0=c0*k1*k2;a0=1+b0;yb[0]=0;
for(i=1;i<=n;i++)
{for(j=0;j<m;j++)z[j]=y[j];systema();
for(j=0;j<m;j++)y[j]=z[j]+h*f[j]/2;systema();
for(j=0;j<m;j++)y[j]=z[j]+h*f[j];yb[i]=y[2];
}
return;
}
/* Systema difrivnjan */
void systema(void)
{f[0]=(b0-a0*y[2]-a1*y[1]-a2*y[0])/a3;
f[1]=y[0];
f[2]=y[1];
return;}
/* Metod pokrokovyj */
void Krok(void)
{
float Simpson(void);int kil=30,p;
c0o=c0=0;min=Simpson();
for(p=1;p<=kil;p++)
{
c0=c0k*p/kil;in=Simpson();
if(in<min){min=in;c0o=c0;}}
return;
}
/* Metod Simpsona */
float Simpson(void)
{Ejler(c0);
in=(1-yb[0])*(1-yb[0])+(1-yb[n])*(1-yb[n])+(1-yb[n-1])*(1-yb[n-1]);
for(i=1;i<=n-3;i++,i++)in+=4*(1-yb[i])*(1-yb[i])+2*(1-yb[i+1])*(1-yb[i+1]);
return(in*h/3);
}
/* Holovna programa */
main()
{char mas[15],*c=mas;
h=twst/n;a1=t1+t3,a2=t2+t1*t3,a3=t1*t2;
c0k=a1*a2/(k1*k2*a3)-1/(k1*k2);
printf("Результати розрахунків:\n");
printf("Коливне c0=%f\n",c0k);
Ejler(c0k);
printf("Коливний перехідний процес,");
printf(" масив значень вихідної величини\n\n");
for(i=1;i<=n;i+=5)
printf("%f\t%f\t%f\t%f\t%f\n",yb[i],yb[i+1],yb[i+2],yb[i+3],yb[i+4]);
bioskey(0);c="коливного";
grafik(c);
Krok();
printf("Оптимальне c0=%f\n",c0o);
printf("Оптимальний перехідний процес,");
printf(" масив значень вихідної величини\n\n");
Ejler(c0o);
for(i=1;i<=n;i+=5)
printf("%f\t%f\t%f\t%f\t%f\n",yb[i],yb[i+1],yb[i+2],yb[i+3],yb[i+4]);
bioskey(0); c="оптимального";
grafik(c);
}
Додаток Б
Ім’я
змінної | Ідентифікатор у програмі |
Значення
y | yb[101] | Масив значень величини у (для графіка)
y[4] | Масив правих частин системи дифрівнянь
z[4] | Допоміжний масив правих частин системи дифрівнянь
f[4] | Масив правих частин системи дифрівнянь у підпрограмі
k1 | k1 | =3 – заданий коефіцієнт дифрівняння
k2 | k2 | =5 – заданий коефіцієнт дифрівняння
а0 | a0 | = 1+b0
а1 | a1 | =b1+T1T3
а2 | a2 | =T2+T1T3
а3 | a3 | =T1T2
b0 | b0 | =C0k1k2
b1 | b1 | =C1k1k2
h | h | H=tвст/n – крок інтегрування
min | Мінімальне значення інтегралу функці
in | Значення інтегралу функції y=f(t)
Cок | c0k | Коливна межа стійкості рішення
Сопт | c0o | Оптимальне значення C0
С0 | c0 | Коефіцієнт дифрівняння
tвст | twst=0.5 | =0.5 час припинення коливань системи
Т1 | t1= | =0.1 – заданий коефіцієнт дифрівняння
Т2 | t2= | =0.01 – заданий коефіцієнт дифрівняння
Т3 | t3= | =0.2 – заданий коефіцієнт дифрівняння
i,j | Цілі змінні, параметри циклів
m | =3 – кількість дифрівнянь системи
n | =100 – число відрізків при інтегруванні
c | Адреса типу сhar (для графіка)
Mas[15] | Текстове повідомлення
kil= | =30 – число відрізків при оптимізації
Додаток В
Результати розрахунків:
Коливне c0=0.533333
Коливний перехiдний процес, масив значень вихiдної величини
0.000000 0.054400 0.179968 0.374952 0.623338
0.899163 1.171071 1.406969 1.578456 1.664620
1.654802 1.550043 1.363049 1.116696 0.841252
0.570677 0.338444 0.173401 0.096192 0.116680
0.232685 0.430213 0.685144 0.966175 1.238665
1.468904 1.628282 1.696844 1.665790 1.538599
1.330646 1.067343 0.781036 0.507028 0.279232
0.125969 0.066452 0.108373 0.246917 0.465308
0.736839 1.028141 1.303281 1.528192 1.674894
1.724975 1.671896 1.521846 1.293022 1.013424
0.717426 0.441556 0.219983 0.080289 0.040035
0.104555 0.266250 0.505486 0.792971 1.093347
1.369533 1.587306 1.719538 1.749578 1.673346
1.499879 1.250270 0.955096 0.650676 0.374603
0.161102 0.036786 0.017344 0.105554 0.290902
0.550828 0.853475 1.161588 1.437105 1.645854
1.761794 1.770260 1.669819 1.472494 1.202325
0.892442 0.581005 0.306501 0.102992 -0.004113
-0.001228 0.111685 0.321068 0.601387 0.918250
1.232625 1.505646 1.703418 1.801227 1.786623
Оптимальне c0=0.302222
Оптимальний перехiдний процес, масив значень вихiдної величини
0.000000 0.030827 0.102108 0.213934 0.359665
0.528256 0.706269 0.879631 1.035136 1.161657
1.251026 1.298578 1.303340 1.267879 1.197876
1.101449 0.988331 0.868963 0.753590 0.651429
0.569988 0.514561 0.487944 0.490373 0.519682
0.571639 0.640437 0.719280 0.801003 0.878691
0.946231 0.998756 1.032964 1.047285 1.041887
1.018550 0.980410 0.931604 0.876869 0.821107
0.768972 0.724506 0.690845 0.670026 0.662889
0.669094 0.687228 0.714992 0.749449 0.787313
0.825240 0.860107 0.889255 0.910674 0.923126
0.926196 0.920266 0.906435 0.886373 0.862154
0.836051 0.810336 0.787099 0.768083 0.754564
0.747282 0.746413 0.751595 0.761990 0.776392
0.793344 0.811280 0.828658 0.844088 0.856432
0.864885 0.869015 0.868775 0.864482 0.856762
0.846484 0.834664 0.822380 0.810674 0.800468
0.792500 0.787273 0.785033 0.785759 0.789193
0.794868 0.802165 0.810375 0.818760 0.826620
0.833344 0.838455 0.841644 0.842777 0.841901
Список використаної літератури
1.
Данилина Н.И. и др. Вычислительная математика. - М.: Высшая школа, 1985
2.
Калиткин Н.Н. Численные методы. - М.: Наука, 1976.
3.
Бахвалов Н.С., Жидков Н.П., Кобельков Г.М. Численные методы. - М.: Наука, 1987
4.
Гаврилюк І.П., Макаров В.Л. Методи обчислень. — К.:Вища школа, 1995 — т.1,2
5.
Ляшенко М.Я., Головань М.С. Чисельні методи. — К.: Либідь, 1996
6.
Турчак Л.І. Основы численных методов. — М.: Наука, 1987
7.
Бочков С.О., Субботин Д.М. Язык программирования Си для персо---нального компютера. - М.: Радио и связь, 1990
8.
Трой Д. Программирование на языке Си для персонального компютера IBM PC. - М.: Радио и связь, 1991
9.
Лабораторний практикум з програмування мовою Сі для студентів спеціальності 7.091401 – АУ. ІФНТУНГ, ДОП. –Івано-Франківськ, 1996
10.
Культин Н.Б. Программирование в Turbo Pascal 7.0 и Delphi. — СПб: БХВ, 1999
11.
Алексеев В.Е. и др. Вычислительная техника и программирование. Практикум по программированию: Практич. пособие. — М.: