Міністерство освіти та науки України
Національний університет «Львівська політехніка»
Кафедра ПЗ
КУРСОВА РОБОТА
з курсу «Проблемно-орієнтовані мови програмування»
Варіант 6
Завдання
1. Сформувати з елементів даної матриці, що лежать під головною діагоналлю, кососиметричну матрицю (матриця А кососиметрична, якщо aij=aji для довільних i,j).
2. Обчислити суми елементів рядків, номери яких задаються цілочисельним вектором.
3. З множини М точок на площині, заданих декартовими координатами на площині, сформувати підмножину P≤M, що містить точки, які знаходяться всередині замкненої області D. Область D обмежена лініями (K – змінний коефіцієнт):
4. З множини прямих М, заданих коефіцієнтами рівняння Ax+By+C=0, сформувати множину прямих P≤M, відстань від яких до точки A(xa; ya) не належить заданому інтервалу, і впорядкувати цю множину в порядку зростання відстаней.
5. З множини М точок на площині, сформувати множину точок P≤M, відстань від яких до прямої Ax+By+C=0 належить заданому інтервалу, і впорядкувати цю множину за спаданням відстаней.
6. З множини прямих М, заданих коефіцієнтами рівняння, визначити дві паралельні прямі, між якими найбільша відстань.
7. Визначити довжини ламаних ліній, які починаються в точці A(xa; ya), проходять через одну з точок множини M {(x1; y1), (x2; y2), (x3; y3), ... ,(xn; yn)}. Сформувати множину точок P≤M, що належить ламаним, довжина яких найбільша. Впорядкувати цю множину в порядку спадання довжин ламаних.
8. Обчислити методом прямокутників інтеграл
, a = 0,0; b = 2,0 ... 3,0
9. Обчислити методом січних наближений корінь рівняння:
, αпоч.=0,5; αкінц.=1,5; Δα=0,1; a0=0,1; b0=1,8
Текст програми
Модуль KURS.CPP
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include "task46.h"
#include "task79.h"
int SelectTask();
void Task1();
void Task2();
void Task3();
void main()
{
int nTask;
do
{
nTask=SelectTask(); // Вибiр номера завдання користувачем
switch(nTask)
{
case 1: Task1(); break; // 1 - викликаємо функцiю для завд.1
case 2: Task2(); break; // 2 - викликаємо функцiю для завд.2
case 3: Task3(); break; // ...
case 4: Task4(); break;
case 5: Task5(); break;
case 6: Task6(); break;
case 7: Task7(); break;
case 8: Task8(); break;
case 9: Task9(); break; // 9 - викликаємо функцiю для завд.9
}
}
while (nTask); // Якщо 0 - завершуємо роботу програми
}
int SelectTask()
{
int task=0;
clrscr();
printf("Nomer zavdannya (1-9, 0-zavershyty): ");
// Читаємо номер завдання з клавiатури...
scanf("%d",&task);
// ...i повертаємо його як результат роботи функцiї
return task;
}
void Task1()
{
int i,j, n, rezhym, a[50][50], b[50][50];
FILE *f;
clrscr();
printf("Rezhym roboty programy [0-zvychajnyj, 1-demonstracijnyj]: ");
// Задаємо режим роботи програми
scanf("%d",&rezhym);
printf("\n");
if (rezhym!=1) // Якщо "Звичайний" - читаємо данi з клавiатури
{
printf ("Poryadok matryci: "); scanf("%d",&n);
printf ("Vvedit elementy matryci (po ryadkah)\n");
for (i=0; i<n; i++)
for (j=0; j<n; j++)
scanf("%d",&a[i][j]);
}
else // iнакше - читаємо данi з файлу i виводимо їх на екран
{
f=fopen("z1demo.dat","rt");
printf("Poryadok matryci: ");
fscanf(f,"%d",&n); printf("%d\n",n);
printf ("Vvedit elementy matryci (po ryadkah)\n");
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
fscanf(f,"%d",&a[i][j]);
printf("%d ",a[i][j]);
}
printf("\n");
}
fclose(f);
}
// Формуємо кососиметричну матрицю
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
if (i<j)
b[i][j]=-a[j][i];
else b[i][j]=a[i][j];
}
// Виводимо результати
printf("\nKososymetry4na matrycya:\n");
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
printf("%d ",b[i][j]);
printf("\n");
}
printf("\n");
printf("<Enter> - vyhid\n");
// Чекаємо натиснення клавiшi i повертаємося до головного меню
getch();
}
void Task2()
{
int i,j, n,m, rezhym, s, **b, *v, l;
FILE *f;
clrscr();
printf("Rezhym roboty programy [0-zvychajnyj, 1-demonstracijnyj]: ");
// Задаємо режим роботи програми
scanf("%d",&rezhym);
printf("\n");
// Видiляємо пам'ять пiд двовимiрний масив
b=(int**)calloc(50,sizeof(int*)); // Видiляємо пам'ять пiд рядки
for (i=0; i<50; i++)
b[i]=(int*)calloc(50,sizeof(int)); // Видiляємо пам'ять пiд стовпцi кожного рядка
// Видiляємо пам'ять пiд вектор v
v=(int*)calloc(50,sizeof(int));
if (rezhym!=1) // Якщо "Звичайний" - читаємо данi з клавiатури
{
printf ("Kilkist ryadkiv (M): "); scanf("%d",&m);
printf ("Kilkist stovpciv (N): "); scanf("%d",&n);
printf ("Vvedit elementy matryci (po ryadkah)\n");
for (i=0; i<m; i++)
for (j=0; j<n; j++)
scanf("%d",*(b+i)+j);
printf ("\nVvedit vektor z %d elementiv: ",m);
for (i=0; i<m; i++)
scanf("%d",v+i);
}
else // iнакше - читаємо данi з клавiатури i виводимо їх на екран
{
f=fopen("z2demo.dat","rt");
printf ("Kilkist ryadkiv (M): ");
fscanf(f,"%d",&m); printf("%d\n",m);
printf ("Kilkist stovpciv (N): ");
fscanf(f,"%d",&n); printf("%d\n",n);
printf ("Vvedit elementy matryci (po ryadkah)\n");
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
fscanf(f,"%d",*(b+i)+j);
printf("%d ",*(*(b+i)+j));
}
printf("\n");
}
printf ("\nVvedit vektor z %d elementiv: ",m);
for (i=0; i<m; i++)
{
fscanf(f,"%d",v+i);
printf("%d ",*(v+i));
}
printf("\n");
fclose(f);
}
printf("\n");
for (i=0; i<m; i++)
{
// Обчислюємо суму елементiв рядка, номер якого задається
// вiдповiдним елементом вектора v
s=0;
for (j=0; j<n; j++)
s=s+*(*(b+*(v+i)-1)+j);
// Виводимо суму
printf ("Suma elementiv ryadka %d: %d\n",*(v+i),s);
}
printf("\n");
printf("<Enter> - vyhid\n");
// Чекаємо натиснення клавiшi i повертаємося до головного меню
getch();
}
void Task3()
{
int i,n;
float m[50][2], k, y1,y2,y3;
clrscr();
// Вводимо данi (кiлькiсть точок множини та їх координати)
printf("Kilkist elementiv mnozhyny M: "); scanf("%d",&n);
printf("Vvedit %d par koordynat [X Y]\n",n);
for (i=0; i<n; i++)
{
scanf("%f %f",&m[i][0],&m[i][1]);
}
// Виконуємо для кожного значення К окремi обчислення...
for (k=1.0; k<=2.2; k+=0.4)
{
printf("\n");
printf("K=%.1f: ",k);
for (i=0; i<n; i++)
{
y1=k*cos(m[i][0]+0.25);
y2=log(0.25-m[i][0]);
y3=m[i][0]*m[i][0]*fabs(0.25-m[i][1])*1.21-1;
// Якщо точка лежить в областi D - виводимо її координати
if ((m[i][1]<=y1) && (m[i][1]>=y2) && (y3>=0))
printf("(%.3f;%.3f),",m[i][0],m[i][1]);
}
}
printf("\n");
printf("<Enter> - vyhid\n");
// Чекаємо натиснення клавiшi i повертаємося до головного меню
getch();
}
Модуль TASK46.CPP
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include "task46.h"
// Вiдстань вiд точки до прямої
float Vidstan1(TPryama p, float x, float y)
{
return (fabs((p.A*x + p.B*y + p.C)/sqrt(p.A*p.A + p.B*p.B)));
}
// Вiдстань мiж двома точками
float Vidstan2(float x1, float y1, float x2, float y2)
{
return (sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)));
}
void Task4()
{
int i,n, b;
TPryama m[50], tmp;
float xa,ya, d1,d2;
clrscr();
// Вводимо данi (кiлькiсть прямих множини М та їх коефiцiєнти)
printf("Kilkist elementiv mnozhyny M: ");
scanf("%d",&n);
printf("Vvedit koeficienty %d pryamyh [A B C]\n",n);
for (i=0; i<n; i++)
scanf("%f %f %f",&m[i].A,&m[i].B,&m[i].C);
// Читаємо координати точки А та значення вiдстаней d1,d2
printf("xA="); scanf("%f",&xa);
printf("yA="); scanf("%f",&ya);
printf("d1="); scanf("%f",&d1);
printf("d2="); scanf("%f",&d2);
printf("\n");
// Впорядковуємо множину М за зростанням вiдстаней до точки А
do
{
b=0;
for (i=0; i<n-1; i++)
{
if (Vidstan1(m[i],xa,ya)>Vidstan1(m[i+1],xa,ya))
{
tmp=m[i];
m[i]=m[i+1];
m[i+1]=tmp;
b=1;
}
}
}
while (b);
for (i=0; i<n; i++)
{
// Якщо вiдстань не лежить в iнтервалi [d1;d2] - виводимо рiвняння прямої
if (!((Vidstan1(m[i],xa,ya)>=d1) && (Vidstan1(m[i],xa,ya)<=d2)))
printf("%.2fx + %.2fy + %.2f = 0, d=%.3f\n",m[i].A,m[i].B,m[i].C,Vidstan1(m[i],xa,ya));
}
printf("\n");
printf("<Enter> - vyhid\n");
// Чекаємо натиснення клавiшi i повертаємося до головного меню
getch();
}
void Task5()
{
int i,n, b;
TTochka m[50], tmp;
TPryama p1;
float d1,d2;
clrscr();
// Вводимо данi (кiлькiсть точок множини М та їх координати)
printf("Kilkist elementiv mnozhyny M: "); scanf("%d",&n);
printf("Vvedit %d par koordynat [X Y]\n",n);
for (i=0; i<n; i++)
scanf("%f %f",&m[i].x,&m[i].y);
// Читаємо коефiцiєнти прямої p1 та значення вiдстаней d1,d2
printf("A="); scanf("%f",&p1.A);
printf("B="); scanf("%f",&p1.B);
printf("C="); scanf("%f",&p1.C);
printf("d1="); scanf("%f",&d1);
printf("d2="); scanf("%f",&d2);
printf("\n");
// Впорядковуємо множину М за спаданням вiдстаней до прямої p1
do
{
b=0;
for (i=0; i<n-1; i++)
if (Vidstan1(p1,m[i].x,m[i].y)<Vidstan1(p1,m[i+1].x,m[i+1].y))
{
tmp=m[i];
m[i]=m[i+1];
m[i+1]=tmp;
b=1;
}
}
while (b);
for (i=0; i<n; i++)
{
// Якщо вiдстань лежить в iнтервалi [d1;d2] - виводимо рiвняння прямої
if ((Vidstan1(p1,m[i].x,m[i].y)>=d1) && (Vidstan1(p1,m[i].x,m[i].y)<=d2))
printf("(%.2f;%.2f), d=%.3f\n",m[i].x,m[i].y,Vidstan1(p1,m[i].x,m[i].y));
}
printf("\n");
printf("<Enter> - vyhid\n");
// Чекаємо натиснення клавiшi i повертаємося до головного меню
getch();
}
void Task6()
{
int i,j,n,p1,p2;
TPryama m[50];
float d0;
clrscr();
// Вводимо данi (кiлькiсть прямих множини М та їх коефiцiєнти)
printf("Kilkist elementiv mnozhyny M: "); scanf("%d",&n);
printf("Vvedit koeficienty %d pryamyh [A B C]\n",n);
for (i=0; i<n; i++)
scanf("%f %f %f",&m[i].A,&m[i].B,&m[i].C);
printf("\n");
d0=0; p1=1; p2=1;
// Перебираємо всi можливi пари прямих
for (i=0; i<n; i++)
for (j=i+1; j<n; j++)
{
// Якщо прямi паралельнi i вiдстань мiж ними бiльша за максимальну...
if ((((m[i].A/m[i].B)==(m[j].A/m[j].B)) &&
(Vidstan1(m[i],0,-m[j].C/m[j].A)>d0)))
{
// ... то приймаємо за максимум вiдстань мiж ними
p1=i; p2=j;
d0=Vidstan1(m[i],0,-m[j].C/m[j].A);
}
}
// Виводимо результати - рiвняння паралельних прямих з максимальною вiдстанню
printf("%.2fx + %.2fy + %.2f = 0\n",m[p1].A,m[p1].B,m[p1].C);
printf("%.2fx + %.2fy + %.2f = 0\n",m[p2].A,m[p2].B,m[p2].C);
printf("d=%.3f\n",d0);
printf("\n");
printf("\n");
printf("<Enter> - vyhid\n");
// Чекаємо натиснення клавiшi i повертаємося до головного меню
getch();
}
Модуль TASK79.CPP
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include "task46.h"
#include "task79.h"
// Пiдiнтегральна функцiя для завдання 8
float f8(float x)
{
return (1/sqrt(2*pow(x,4)+1.7));
}
// Функцiя для завдання 9
float f9(float _alpha,float _x)
{
return (_alpha*log(_x)-1/_x);
}
// Iнтегрування методом прямокутникiв
// (параметри - крайнi точки iнтервалу (a,b) та кiлькiсть елементарних вiдрiзкiв nj)
float IntPryam(float a, float b, int nj)
{
int i=0;
float fSum=0, h,xi;
h=(b-a)/nj; // Обчислюємо крок h
for (i=1; i<nj; i++)
{
xi=a+i*h;
fSum+=f8(xi);
}
fSum=(h/2)*(f8(a)+f8(b)+2*fSum);
// Повертаємо наближене значення визначеного iнтеграла
return fSum;
}
void Task7()
{
int i,n, b;
TTochka m[50], tmp;
float xa,ya, xb,yb, d,d0;
clrscr();
printf("Kilkist elementiv mnozhyny M: "); scanf("%d",&n);
printf("Vvedit %d par koordynat [X Y]\n",n);
// Вводимо елементи множини М
for (i=0; i<n; i++)
scanf("%f %f",&m[i].x,&m[i].y);
// Вводимо координати точок А i В та значення вiдстанi d0
printf("xA="); scanf("%f",&xa);
printf("yA="); scanf("%f",&ya);
printf("xB="); scanf("%f",&xb);
printf("yB="); scanf("%f",&yb);
printf("\n");
// Впорядковуємо множину М за спаданням довжин ламаних
do
{
b=0;
for (i=0; i<n-1; i++)
{
d=Vidstan2(xa,ya,m[i].x,m[i].y)+Vidstan2(xb,yb,m[i].x,m[i].y);
if (d<Vidstan2(xa,ya,m[i+1].x,m[i+1].y)+Vidstan2(xb,yb,m[i+1].x,m[i+1].y))
{
tmp=m[i];
m[i]=m[i+1];
m[i+1]=tmp;
b=1;
}
}
}
while (b);
for (i=0; i<n; i++)
{
d=Vidstan2(xa,ya,m[i].x,m[i].y)+Vidstan2(xb,yb,m[i].x,m[i].y);
printf("Cherez tochku (%.2f;%.2f): %.3f\n",m[i].x,m[i].y,d);
}
printf("\n");
printf("<Enter> - vyhid\n");
// Чекаємо натиснення клавiшi i повертаємося до головного меню
getch();
}
void Task8()
{
int n, nmax;
float a=0.0, b, r1,r2, di;
float EPS=1e-4;
clrscr();
printf("Maksymalna kilkist elementarnyh vidrizkiv (jmax): ");
scanf("%d",&nmax);
printf("Tochist (napr., 0.001): ");
scanf("%f",&EPS);
// Виконуємо обчислення для бiжучого значення b вiд 2.0 до 3.0
for (b=2.0; b<=3.01; b=b+0.2)
{
n=2;
do
{
// Обчислюємо iнтеграл для кiлькостi вiдрiзкiв nj i 2nj
di=fabs((r1=IntPryam(a,b,n*2))-(r2=IntPryam(a,b,n)));
n=n*2;
}
// Якщо кiлькiсть вiдрiзкiв бiльша за максимальну,
// або досягнута необхiдна точнiсть - завершуємо обчислення iнтеграла
while (!((n>nmax) || (di<EPS)));
// Виводимо результати
printf("b=%.2f\tInj=%f\tnj=%d\te=%f\t",b,fabs(r1),n,di);
if (n>nmax) printf("Umova vyhody: j>jmax\n");
else printf("Umova vyhody: |Inj-I(nj-1)|<e\n");
}
printf("\n");
printf("<Enter> - vyhid");
// Чекаємо натиснення клавiшi i повертаємося до головного меню
getch();
}
void Task9()
{
const float alpha0=1.5, alpha1=2.5, dalpha=0.1;
int n=0, N;
float a0=1.1, b0=1.7, alpha;
float x2,x1,x, hn, EPS=0.001;
clrscr();
printf("Maksymalna pohybka ob4yslen' (napr., 0.0001): "); scanf("%f",&EPS);
printf("Maksymalne 4yslo iteracij: "); scanf("%d",&N);
printf("\n");
// Виконуємо обчислення для бiжучого значення alpha вiд 1.5 до 2.5
for (alpha=alpha0; alpha<=alpha1+0.001; alpha+=dalpha)
{
x1=a0; x2=b0;
do
{
n++;
if (x1!=x2)
{
hn=f9(alpha,x1)*(x1-x2)/(f9(alpha,x2)-f9(alpha,x1));
// Обчислюємо наближення Xn
x=x1+hn;
// Якщо досягнута точнiсть - завершуємо обчислення
if (fabs(x1-x)<EPS) break;
x2=x1; x1=x;
}
}
// Якщо досягнута максимальна кiлькiсть iтерацiй або Xn = Xn-1 - завершуємо обчислення
while ((x1!=x2) && (n<=N));
// Виводимо результати
printf("alpha=%.2f\tx=%f\n",alpha,x);
}
printf("\n");
printf("<Enter> - vyhid");
// Чекаємо натиснення клавiшi i повертаємося до головного меню
getch();
}
Протокол роботи програми
Завдання 1
Rezhym roboty programy [0-zvychajnyj, 1-demonstracijnyj]: 1
Poryadok matryci: 5
Vvedit elementy matryci (po ryadkah)
5 2 -2 1 5
7 4 2 1 7
3 8 -3 0 1
-3 7 -5 2 0
3 -2 5 7 1
Kososymetry4na matrycya:
5 -7 -3 3 -3
7 4 -8 -7 2
3 8 -3 5 -5
-3 7 -5 2 -7
3 -2 5 7 1
<Enter> - vyhid
Завдання 2
Rezhym roboty programy [0-zvychajnyj, 1-demonstracijnyj]: 1
Kilkist ryadkiv (M): 5
Kilkist stovpciv (N): 4
Vvedit elementy matryci (po ryadkah)
6 8 2 3
1 -4 6 4
3 5 6 32
3 4 7 -6
3 5 7 8
Vvedit vektor z 5 elementiv: 1 2 3 4 5
Suma elementiv ryadka 1: 19
Suma elementiv ryadka 2: 7
Suma elementiv ryadka 3: 46
Suma elementiv ryadka 4: 8
Suma elementiv ryadka 5: 23
<Enter> - vyhid
Завдання 3
Kilkist elementiv mnozhyny M: 4
Vvedit 4 par koordynat [X Y]
0.33 0.4
0.3 0.2
0.3 0.5
1 1
K=1.00: (0.3;0.2),
K=1.50: (0.3;0.2),
K=2.00:
K=2.50:
<Enter> - vyhid
Завдання 4
Kilkist elementiv mnozhyny M: 4
Vvedit koeficienty 4 pryamyh [A B C]
3 4 -5
6 2 1
4 8 4
2 4 6
xA=5
yA=3
d1=5
d2=8
3.00x + 4.00y + -5.00 = 0, d=4.400
<Enter> - vyhid
Завдання 5
Kilkist elementiv mnozhyny M: 4
Vvedit 4 par koordynat [X Y]
3 5
-5 6
2 1
7 3
A=2
B=5
C=-4
d1=3
d2=7
(3.00;5.00), d=5.014
(7.00;3.00), d=4.642
<Enter> - vyhid
Завдання 6
Kilkist elementiv mnozhyny M: 5
Vvedit koeficienty 5 pryamyh [A B C]
1 2 6
2 4 -6
3 8 10
3 9 21
2 4 10
2.00x + 4.00y + -6.00 = 0
2.00x + 4.00y + 10.00 = 0
d=5.814
<Enter> - vyhid
Завдання 7
Kilkist elementiv mnozhyny M: 4
Vvedit 4 par koordynat [X Y]
5 6
-4 2
1 5
7 3
xA=2
yA=4
xB=-6
yB=2
Cherez tochku (7.00;3.00): 18.137
Cherez tochku (5.00;6.00): 15.310
Cherez tochku (1.00;5.00): 9.030
Cherez tochku (-4.00;2.00): 8.325
<Enter> - vyhid
Завдання 8
Maksymalna kilkist elementarnyh vidrizkiv (jmax): 100
Tochist (napr., 0.001): 0.0001
b=2.00 Inj=1.013664 nj=64 e=0.000040 Umova vyhody: |Inj-I(nj-1)|<e
b=2.20 Inj=1.045117 nj=64 e=0.000037 Umova vyhody: |Inj-I(nj-1)|<e
b=2.40 Inj=1.071500 nj=64 e=0.000034 Umova vyhody: |Inj-I(nj-1)|<e
b=2.60 Inj=1.093919 nj=64 e=0.000032 Umova vyhody: |Inj-I(nj-1)|<e
b=2.80 Inj=1.113192 nj=64 e=0.000030 Umova vyhody: |Inj-I(nj-1)|<e
b=3.00 Inj=1.129927 nj=64 e=0.000028 Umova vyhody: |Inj-I(nj-1)|<e
<Enter> - vyhid
Завдання 9
Maksymalna pohybka ob4yslen' (napr., 0.0001): 0.0001
Maksymalne 4yslo iteracij: 10000
alpha=1.50 x=1.541202
alpha=1.60 x=1.511922
alpha=1.70 x=1.485748
alpha=1.80 x=1.462203
alpha=1.90 x=1.440901
alpha=2.00 x=1.421530
alpha=2.10 x=1.403834
alpha=2.20 x=1.387601
alpha=2.30 x=1.372654
alpha=2.40 x=1.358843
alpha=2.50 x=1.346041
<Enter> - vyhid