Постановка задачи и ее математическая модель
Содержание.
1. Задание на курсовую работу……………………………………………… 3
2. Постановка задачи и ее математическая модель……………….…...4 - 5
3. Блок-схема алгоритма…………………………………………………6 - 17
4. Тестирование алгоритма сортировки………………..………………….18
5. Текст программы……………………………………………………...19 - 25
6. Используемые переменные……………………………………………….26
7. Результаты работы программы……………………………………..27 - 28
8. Пример работы программы………………………………………….29 - 33
9. Выводы…………………………………………………………………..…..34
Задание на курсовую работу.
Вариант № 5
Разработать программу на языке Си, выполняющую следующие действия:
- формирование массива данных;
- расчет расстояний между прямой и заданными точками;
- расчет периметра и площади фигуры, координаты вершин которой определяются координатами четырех произвольных точек;
- расчет координат точки пересечения заданной прямой и произвольной прямой, описываемой уравнением ax+by+c=0.
- сортировку и отображение результатов.
Исходными данными являются:
- Эскиз чертежа прямой (А) и многоугольника (В).
- Ограничение R на расстояние между точками массива D и прямой A.
- Массив координат точек D{(xi,yi)} i=1,n (n>=15), из которых не менее 7-ми точек должны лежать внутри многоугольника B.
В ходе выполнения работы необходимо составить алгоритм и написать программу ,позволяющую:
1. Выбрать из массива точек D все точки, лежащие вне многоугольника В, выше прямой А и поместить полученную информацию (номер точки в массиве D, и ее координаты x,y) в новый массив D1.
2. Вычислить расстояние r от каждой точки, входящей в сформированный массив D1, до прямой А. Информацию обо всех точках, для которых выполняется соотношение r>R (R=2), поместить в новый массив D2, включающий в себя следующие поля: номер точки в исходном массиве D; номер точки в массиве D1; координаты x и y; расстояние от точки до прямой r.
3. Упорядочить полученный массив D2 в порядке убывания r.
4. Вывести результаты расчетов (пп. 1-3) в виде таблиц на экран и в файл с заданным при вводе исходных данных именем.
5. Написать функцию, вычисляющую периметр и площадь фигуры, координаты вершин которой определяются координатами четырех точек вводимых с клавиатуры.
6. Написать функцию, определяющую координаты точки пересечения прямой А и произвольной прямой, описываемой уравнением ax+by+c=0. Коэффициенты прямой a,b,c должны вводиться пользователем с клавиатуры.
Разрабатываемая программа должна удовлетворять следующим требованием:
1) ввод исходных данных (массив координат точек) должен осуществляться как из файла с заданным именем, так и с клавиатуры (по выбору пользователя);
2) результаты расчета должны выводиться как в виде таблиц на экран, так и в файл с заданным именем;
3) процедуры расчета расстояний r , выбора точек из массивов, сортировки массива D2 и вывода результатов следует оформить в программе в форме функций пользователя.
Постановка задачи и ее математическая модель.
Задача | Модель решения |
Получение исходных координат точек из файла с заданным именем или ввод координат точек с клавиатуры (по выбору пользователя) и запись из в массив D. | Построчное считывание при помощи функции fscanf (требует подключения stdio.h) из указанного файла пар чисел написанных через разделитель( пробел); формат считываемых чисел – вещественное с плавающей запятой; считывание продолжается до тех пор пока функция fscanf не возвратит EOF(End Of File); Или запись вводимых чисел с клавиатуры с помощью функции scanf. Числа записываются в массив как вещественные с плавающей запятой. |
Выбор из массива D точек, лежащих внутри многоугольника B: (0;3), (3;13), (13;11),(11;3)) | Искомые точки должны лежать: Выше прямой y=3 Выше прямой y=4x-41 Ниже прямой y=3.33x-3 Ниже прямой y=-0.2x+13.6 |
Выбор из массива D1, полученного на предыдущем этапе, точек, лежащих от прямой на расстоянии меньшем или равном R (уравнение прямой А:y=-0.65x+14, R =3.8 ) Формула расчета r = |a*x0+b*y0+c|/sqrt(a^2 + b^2) | Рассчитываем r и заносим в отдельное поле массива. (r<=R) |
Сортировка массива D2, полученного на предыдущем этапе, по возрастанию r. | Сортировка методом пузырька. (сравниваются значения поля r) |
Сохранение результатов работы программы в файл и вывод на экран (вывод и запись осуществляется в виде таблиц) | Построчное заполнение указанного файла( а также вывод на экран) элементами массивов, полученных на предыдущих этапах (для каждого из массивов заполняются все необходимые поля: D координаты x и y, для D1 – x, y и номер элемента в массиве D, для D2 x, y, номер элемента в D и D1 и расстояние r до прямой А). Для записи в файл используется функция fprintf, для вывода на экран printf (требуется подключение stdio.h) |
Функция, вычисляющая периметр и площадь фигуры, координаты вершин которой вводятся пользователем с клавиатуры. | При вводе точек есть одна оговорка: координаты точек вводить по часовой и фигура должна быть правильной (выпуклой). После ввода точек, определяем расстояния между этими точками (длины граней фигуры) по формуле r = sqrt((x1-x2)^2 + (y1-y2)^2) Периметр находим, сложив все длины Р = r1 + r2 + r3 +r4; Площадь находим как сумму площадей треугольников, образующих фигуру. S = s1 + s2; s1 и s2 ищем по формуле Герона: s = p*(p-a)*(p-b)(p-c), где p = (a+b+c)/2 – полупериметр данного треугольника. (a, b – расстояние от одной вершины фигуры до другой, с – длина диагонали фигуры, которая находится по той же формуле что и r) |
Функция, рассчитывающая координаты пересечения исходной прямой А с прямой, координаты которой вводятся пользователем с клавиатуры. | Параметрическое уравнение прямой А -0.65 *x +14 – y = 0 (a = -0.65, b = 1, с = 14) Возможны два случая (случаи, которые требуется рассмотреть в задании на курсовую работу): 1.Если угловые коэффициенты a/b равны, то прямые параллельны (или совпадают) и не имеют точку пересечения. При выпадении этого случая, на кран выводится сообщение сообщающее, что прямые параллельны. 2.Точка пересечения находится из решения уравнений: a*x + b*y + c = 0 a1*x + b1*y + с = 0 Точка пересечения: x=(c+14*b)/(0.65*b-a); y=-0.65*x+14;. |
3. Блок – схема алгоритма
4. Тестирование алгоритма сортировки
№ Шага | № Блока | flag | i | Массив | D2[i][4]<D2[i-1][4] | flag!=1 |
- | - | - | - | |||
1.45 4.68 6.52 | Да, меняем | - | ||||
- | - | - | - | |||
1.45 6.52 4.68 | Да, меняем | - | ||||
- | - | - | - | |||
6.52 1.45 4.68 | Нет, не меняем | - | ||||
- | - | - | Нет | |||
- | - | - | - | |||
6.52 4.68 1.45 | Да, меняем | - | ||||
- | - | - | - | |||
6.52 4.68 1.45 | Нет, не меняем | - | ||||
- | - | - | - | |||
6.52 4.68 1.45 | Нет, не меняем | - | ||||
- | - | - | Нет | |||
- | - | - | - | |||
6.52 4.68 1.45 | Нет, не меняем | - | ||||
6.52 4.68 1.45 | Нет, не меняем | - | ||||
6.52 4.68 1.45 | Нет, не меняем | - | ||||
- | - | - | Да |
#include<stdio.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>
float D[16][2],D1[15][3],D2[15][5];
int num1=0,num2=0;
void vvod()
{
int flag,i;
float x,y;
FILE *in;
printf("1 - Vvod massiva c klaviatury, 2 - schityvanie massiva iz faila\n");
flag=getch();
if(flag=='1')
{
for(i=0;i<15;i++)
{
printf("x%d= ",i+1);
scanf("%f",&D[i][0]);
printf("y%d= ",i+1);
scanf("%f",&D[i][1]);
printf("\n");
}
printf("Massiv vveden! Dlya prodolzeniya nazat' lubuyu klavishu...");
}
else if(flag=='2')
{
fflush(stdin);
if((in=fopen("ishodni.txt","r"))!=NULL);
i=0;
{
while(fscanf(in,"%f %f",&x,&y)!=EOF)
{
D[i][0]=x;
D[i][1]=y;
i++;
}
}
printf("\nMassiv vveden! Dlya prodolzeniya nazat' lubuju klavishu...");
fclose(in);
}
}
void preobrD()
{
int i;
int temp[4],flag;
float r;
for(i=0;i<15;i++)
{
if(((D[i][1]-3.33*D[i][0]-3<=0)&&(D[i][1]+0.2*D[i][0]-13.6<=0)&&(D[i][1]-4*D[i][0]+41>=0)&&(D[i][1]-3>=0)))
{
D1[num1][0]=D[i][0];
D1[num1][1]=D[i][1];
D1[num1][2]=i+1;
num1++;
}
}
for(i=0;i<num1;i++)
{
r=fabs(0.65*D[i][0]+D[i][1]-14)/sqrt(1.4225);
if(r<=3.8)
{
D2[num2][0]=i+1;
D2[num2][1]=D1[i][0];
D2[num2][2]=D1[i][1];
D2[num2][3]=D1[i][2];
D2[num2][4]=r;
num2++;
}
}
do
{
flag=0;
for(i=0;i<num2;i++)
{
if(D2[i][4]>D2[i-1][4])
{
temp[0]=D2[i][0];
temp[1]=D2[i][1];
temp[2]=D2[i][2];
temp[3]=D2[i][3];
temp[4]=D2[i][4];
D2[i][0]=D2[i-1][0];
D2[i][1]=D2[i-1][1];
D2[i][2]=D2[i-1][2];
D2[i][3]=D2[i-1][3];
D2[i][4]=D2[i-1][4];
D2[i-1][0]=temp[0];
D2[i-1][1]=temp[1];
D2[i-1][2]=temp[2];
D2[i-1][3]=temp[3];
D2[i-1][4]=temp[4];
flag=1;
}
}
}while(flag==1);
printf("Preobrazovanie massiva zakoncheno uspeshno!\n\n");
printf("Dlya prodolzeniya nazat' lubuyu klavishu...");
}
void SandP()
{
float S[4][2];
float rst1,rst2,rst3,rst4;
float pP=0,pS=0,p1,p2,pt1,pt2,diag;
int i,j;
char q;
do
{
clrscr();
printf("Ploshad' i perimetr chetyrehugol'nika.\n\n");
printf("Vnimanie! Tochki vvodit' po chasovoy!\n");
printf("Vvedite koordinaty 4 tochek.\n\n");
for(i=0;i<4;i++)
{
printf("x%d= ",i+1);
scanf("%f",&S[i][0]);
printf("y%d= ",i+1);
scanf("%f",&S[i][1]);
printf("\n");
}
rst1=sqrt(pow(S[1][0]-S[0][0],2)+pow(S[1][1]-S[0][1],2));
rst2=sqrt(pow(S[2][0]-S[1][0],2)+pow(S[2][1]-S[1][1],2));
rst3=sqrt(pow(S[3][0]-S[2][0],2)+pow(S[3][1]-S[2][1],2));
rst4=sqrt(pow(S[0][0]-S[3][0],2)+pow(S[0][1]-S[3][1],2));
diag=sqrt(pow(S[2][0]-S[0][0],2)+pow(S[2][1]-S[0][1],2));
pP=rst1+rst2+rst3+rst4;
p1=(rst1+rst2+diag)/2;
p2=(rst3+rst4+diag)/2;
pt1=sqrt(fabs(p1*(p1-rst1)*(p1-rst2)*(p1-diag)));
pt2=sqrt(fabs(p2*(p2-rst3)*(p2-rst4)*(p2-diag)));
pS=pt1+pt2;
printf("Perimetr chetyrehugol'nika P= %.2f\n",pP);
printf("Ploshad' chetyrehugol'nika S= %.2f\n",pS);
printf("\nVyhod v glavnoe menu(Y/N)?\n");
fflush(stdin);
q=getch();
}while(q!='y'&&q!='Y');
}
void peres()
{
float a,b,c,k,x,y;
char q;
do
{
clrscr();
printf("Opredelenie tochki perezecheniya pryamyh.\n\n");
printf("Vvedite koeffcienty:\n");
printf("\nKoefficient a= ");
scanf("%f",&a);
printf("\nKoefficient b= ");
scanf("%f",&b);
printf("\nKoefficient c= ");
scanf("%f",&c);
k=-a/b;
if(k==-0.65)
{
printf("\nPryamye parallel'ny!\n");
}
else
{
x=(c+14*b)/(0.65*b-a);
y=-0.65*x+14;
printf("\nTochka peresecheniya x= %.2f y= %.2f\n",x,y);
}
printf("\nVyhod v glavnoe menu(Y/N)?");
q=getch();
}while(q!='y'&&q!='Y');
}
void vyvod()
{
FILE *out;
int i;
printf("MASSIV D\n\n");
printf("#\tX\tY\n");
for (i=0;i<15;i++)
{
printf("%d\t%2.2f\t%2.2f\n",(i+1),D[i][0],D[i][1]);
}
printf("\nDlya prodolzeniya nazat' lubuju klavishu...\n");
getch();
clrscr();
printf("MASSIV D1\n\n");
printf("#\t#D\tX\tY\n");
for(i=0;i<num1;i++)
{
printf("%d\t%2.2f\t%2.2f\t%2.2f\n",(i+1),D1[i][2],D1[i][0],D1[i][1]);
}
printf("\nDlya prodolzeniya nazat' lubuju klavishu...\n");
getch();
clrscr();
printf("MASSIV D2\n\n");
printf("#\t#D\t#D1\tr\tX\tY\n");
for(i=0;i<num2;i++)
{
if(D2[i][4]!=0)
{
printf("%d\t%2.2f\t%2.2f\t%2.2f\t%2.2f\t%2.2f\n",(i+1),D2[i][3],D2[i][0],D2[i][4],D2[i][1],D2[i][2]);
}
}
printf("\nDlya prodolzeniya nazat' lubuju klavishu...\n");
out=fopen("rezpoints.txt","w");
fprintf(out,"MASSIV D\n\n");
fprintf(out,"#\tX\tY\n");
for (i=0;i<15;i++)
{
fprintf(out,"%d\t%2.2f\t%2.2f\n",(i+1),D[i][0],D[i][1]);
}
fprintf(out,"\n\n");
fprintf(out,"MASSIV D1\n\n");
fprintf(out,"#\t#D\tX\tY\n");
for(i=0;i<num1;i++)
{
fprintf(out,"%d\t%2.2f\t%2.2f\t%2.2f\n",(i+1),D1[i][2],D1[i][0],D1[i][1]);
}
fprintf(out,"\n\n");
fprintf(out,"MASSIV D2\n\n");
fprintf(out,"#\t#D\t#D1\tr\tX\tY\n");
for(i=0;i<num2;i++)
{
fprintf(out,"%d\t%2.2f\t%2.2f\t%2.2f\t%2.2f\t%2.2f\n",(i+1),D2[i][3],D2[i][0],D2[i][4],D2[i][1],D2[i][2]);
}
fclose(out);
}
void massiv()
{
clrscr();
char key;
char zn;
do
{
clrscr();
printf("Rabota s massivami. Vyberete odin iz punktov menu:\n\n");
printf("1 Vvod massiva.\n");
printf("2 Preobrazovanie massiva.\n");
printf("3 Prosmotr rezul'tata.\n");
printf("4 Vozvrat v glavnoe menu.\n");
switch(key=getch())
{
case '1':
{
clrscr();
vvod();
zn='*';
getch();
break;
}
case '2':
{
if(zn=='*')
{
clrscr();
preobrD();
zn='*';
}
else
{
printf("\n\nSnachala vvedite massiv!\n");
}
getch();
break;
}
case '3':
{
if(zn=='*')
{
clrscr();
vyvod();
}
else
{
printf("\n\nSnachala vvedite massiv!\n");
}
getch();
break;
}
case '4':
{
fflush(stdin);
break;
}
default:
{
printf("\nPozaluysta, vvedite cifru ot 1 do 4\n");
printf("Dlya prodolzeniya nazat' lubuyu klavishu");
getch();
}
}
}while(key!='4');
}
void main()
{
clrscr();
char exit='n';
do
{
clrscr();
printf("Glavnoe menu. Vyberite zadanie: \n\n");
printf("1 Rabota s massivami.\n");
printf("2 Ploshad i perimetr.\n");
printf("3 Peresechenie pryamyh.\n");
printf("4 Vuhod.\n");
switch(getch())
{
case '1':
{
clrscr();
massiv();
break;
}
case '2':
{
clrscr();
SandP();
break;
}
case '3':
{
clrscr();
peres();
break;
}
case '4':
{
printf("\nVyhod(Y/N)?\n");
fflush(stdin);
exit=getch();
break;
}
default:
{
printf("\nPozaluysta, vvedite cifru ot 1 do 4\n");
printf("Dlya prodolzeniya nazat' lubuyu klavishu");
getch();
break;
}
}
}while(exit!='y'&&exit!='Y');
}