Постановка задачи и ее математическая модель

Содержание.

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.

- сортировку и отображение результатов.

Исходными данными являются:

  1. Эскиз чертежа прямой (А) и многоугольника (В).
  2. Ограничение R на расстояние между точками массива D и прямой A.
  3. Массив координат точек 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. Постановка задачи и ее математическая модель - student2.ru Блок – схема алгоритма
Постановка задачи и ее математическая модель - student2.ru
Постановка задачи и ее математическая модель - student2.ru
Постановка задачи и ее математическая модель - student2.ru
Постановка задачи и ее математическая модель - student2.ru
Постановка задачи и ее математическая модель - student2.ru
Постановка задачи и ее математическая модель - student2.ru
Постановка задачи и ее математическая модель - student2.ru
Постановка задачи и ее математическая модель - student2.ru
Постановка задачи и ее математическая модель - student2.ru
Постановка задачи и ее математическая модель - student2.ru
Постановка задачи и ее математическая модель - student2.ru
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');

}

Наши рекомендации