Программа обработки массивов координат точек на языке Си

 

Задание на курсовую работу


Разработать программу на языке Си, выполняющую следующие действия:

формирование массива данных;

расчет расстояний между прямой и заданными точками;

расчет периметра и площади фигуры, координаты вершин которой определяются координатами четырех произвольных точек;

расчет координат точки пересечения заданной прямой и произвольной прямой, описываемой уравнением ax+by+c=0.

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

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

1.Эскиз чертежа прямой (А) и многоугольника (В).

2.Ограничение R на расстояние между точками массива D и прямой A.

.Массив координат точек D{(xi,yi)} i=1,n (n>=15), из которых не менее 7-ми точек должны лежать внутри многоугольника B.

В ходе выполнения работы необходимо составить алгоритм и написать программу, позволяющую:

. Выбрать из массива точек D все точки, лежащие вне многоугольника В, выше прямой А и поместить полученную информацию (номер точки в массиве D, и ее координаты x,y) в новый массив D1.

. Вычислить расстояние r от каждой точки, входящей в сформированный массив D1, до прямой А. Информацию обо всех точках, для которых выполняется соотношение r>R (R=2), поместить в новый массив D2, включающий в себя следующие поля: номер точки в исходном массиве D; номер точки в массиве D1; координаты x и y; расстояние от точки до прямой r.

. Упорядочить полученный массив D2 в порядке убывания r.

. Вывести результаты расчетов (пп. 1-3) в виде таблиц на экран и в файл с заданным при вводе исходных данных именем.

. Написать функцию, вычисляющую периметр и площадь фигуры, координаты вершин которой определяются координатами четырех точек вводимых с клавиатуры.

. Написать функцию, определяющую координаты точки пересечения прямой А и произвольной прямой, описываемой уравнением ax+by+c=0. Коэффициенты прямой a,b,c должны вводиться пользователем с клавиатуры.

Разрабатываемая программа должна удовлетворять следующим требованием:

1)ввод исходных данных (массив координат точек) должен осуществляться как из файла с заданным именем, так и с клавиатуры (по выбору пользователя);

2)результаты расчета должны выводиться как в виде таблиц на экран, так и в файл с заданным именем;

)процедуры расчета расстояний r , выбора точек из массивов, сортировки массива D2 и вывода результатов следует оформить в программе в форме функций пользователя.

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


ЗадачаМодель решенияПолучение исходных координат точек из файла с заданным именем или ввод координат точек с клавиатуры (по выбору пользователя) и запись из в массив 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;.2. Блок - схема алгоритма


массив координата точка программа

3. Тестирование алгоритма сортировки


№ Шага№ БлокаflagiМассивD2[i][4]<D2[i-1][4]flag!=12031.45 4.68 6.52Да, меняем-31----4121.45 6.52 4.68Да, меняем-51----6116.52 1.45 4.68Нет, не меняем-71---Нет80----9036.52 4.68 1.45Да, меняем-101----11126.52 4.68 1.45Нет, не меняем-121----13116.52 4.68 1.45Нет, не меняем-141---Нет150----16036.52 4.68 1.45Нет, не меняем-17026.52 4.68 1.45Нет, не меняем-18016.52 4.68 1.45Нет, не меняем-190---Да#include<stdio.h>

#include<stdio.h>

#include<conio.h>

#include<math.h>D[16][2],D1[15][3],D2[15][5];num1=0,num2=0;vvod()

{flag,i;x,y;*in;("1 - Vvod massiva c klaviatury, 2 - schityvanie massiva iz faila\n");=getch();(flag=='1')

{(i=0;i<15;i++)

{("x%d= ",i+1);("%f",&D[i][0]);("y%d= ",i+1);("%f",&D[i][1]);("\n");

}("Massiv vveden! Dlya prodolzeniya nazat' lubuyu klavishu...");

}if(flag=='2')

{(stdin);((in=fopen("ishodni.txt","r"))!=NULL);=0;

{(fscanf(in,"%f %f",&x,&y)!=EOF)

{[i][0]=x;[i][1]=y;++;

}

}("\nMassiv vveden! Dlya prodolzeniya nazat' lubuju klavishu...");(in);

}

}preobrD()

{i;temp[4],flag;r;(i=0;i<15;i++)

{(((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)))

{[num1][0]=D[i][0];[num1][1]=D[i][1];[num1][2]=i+1;++;

}

}(i=0;i<num1;i++)

{=fabs(0.65*D[i][0]+D[i][1]-14)/sqrt(1.4225);(r<=3.8)

{[num2][0]=i+1;[num2][1]=D1[i][0];[num2][2]=D1[i][1];[num2][3]=D1[i][2];[num2][4]=r;++;

}

}

{=0;(i=0;i<num2;i++)

{(D2[i][4]>D2[i-1][4])

{[0]=D2[i][0];[1]=D2[i][1];[2]=D2[i][2];[3]=D2[i][3];[4]=D2[i][4];[i][0]=D2[i-1][0];[i][1]=D2[i-1][1];[i][2]=D2[i-1][2];[i][3]=D2[i-1][3];[i][4]=D2[i-1][4];[i-1][0]=temp[0];[i-1][1]=temp[1];[i-1][2]=temp[2];[i-1][3]=temp[3];[i-1][4]=temp[4];=1;

}

}

}while(flag==1);("Preobrazovanie massiva zakoncheno uspeshno!\n\n");("Dlya prodolzeniya nazat' lubuyu klavishu...");

}SandP()

{S[4][2];rst1,rst2,rst3,rst4;pP=0,pS=0,p1,p2,pt1,pt2,diag;i,j;q;

{();("Ploshad' i perimetr chetyrehugol'nika.\n\n");("Vnimanie! Tochki vvodit' po chasovoy!\n");("Vvedite koordinaty 4 tochek.\n\n");(i=0;i<4;i++)

{("x%d= ",i+1);("%f",&S[i][0]);("y%d= ",i+1);("%f",&S[i][1]);("\n");

}=sqrt(pow(S[1][0]-S[0][0],2)+pow(S[1][1]-S[0][1],2));=sqrt(pow(S[2][0]-S[1][0],2)+pow(S[2][1]-S[1][1],2));=sqrt(pow(S[3][0]-S[2][0],2)+pow(S[3][1]-S[2][1],2));=sqrt(pow(S[0][0]-S[3][0],2)+pow(S[0][1]-S[3][1],2));=sqrt(pow(S[2][0]-S[0][0],2)+pow(S[2][1]-S[0][1],2));=rst1+rst2+rst3+rst4;=(rst1+rst2+diag)/2;=(rst3+rst4+diag)/2;=sqrt(fabs(p1*(p1-rst1)*(p1-rst2)*(p1-diag)));=sqrt(fabs(p2*(p2-rst3)*(p2-rst4)*(p2-diag)));=pt1+pt2;("Perimetr chetyrehugol'nika P= %.2f\n",pP);("Ploshad' chetyrehugol'nika S= %.2f\n",pS);("\nVyhod v glavnoe menu(Y/N)?\n");(stdin);=getch();

}while(q!='y'&&q!='Y');

}peres()

{a,b,c,k,x,y;q;

{();("Opredelenie tochki perezecheniya pryamyh.\n\n");("Vvedite koeffcienty:\n");("\nKoefficient a= ");("%f",&a);("\nKoefficient b= ");("%f",&b);("\nKoefficient c= ");("%f",&c);=-a/b;(k==-0.65)

{("\nPryamye parallel'ny!\n");

}

{=(c+14*b)/(0.65*b-a);=-0.65*x+14;("\nTochka peresecheniya x= %.2f y= %.2f\n",x,y);

}("\nVyhod v glavnoe menu(Y/N)?");=getch();

}while(q!='y'&&q!='Y');

}vyvod()

{*out;i;("MASSIV D\n\n");("#\tX\tY\n");(i=0;i<15;i++)

{("%d\t%2.2f\t%2.2f\n",(i+1),D[i][0],D[i][1]);

}("\nDlya prodolzeniya nazat' lubuju klavishu...\n");();();("MASSIV D1\n\n");("#\t#D\tX\tY\n");(i=0;i<num1;i++)

{("%d\t%2.2f\t%2.2f\t%2.2f\n",(i+1),D1[i][2],D1[i][0],D1[i][1]);

}("\nDlya prodolzeniya nazat' lubuju klavishu...\n");();();("MASSIV D2\n\n");("#\t#D\t#D1\tr\tX\tY\n");(i=0;i<num2;i++)

{(D2[i][4]!=0)

{("%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]);

}

}("\nDlya prodolzeniya nazat' lubuju klavishu...\n");=fopen("rezpoints.txt","w");(out,"MASSIV D\n\n");(out,"#\tX\tY\n");(i=0;i<15;i++)

{(out,"%d\t%2.2f\t%2.2f\n",(i+1),D[i][0],D[i][1]);

}(out,"\n\n");(out,"MASSIV D1\n\n");(out,"#\t#D\tX\tY\n");(i=0;i<num1;i++)

{(out,"%d\t%2.2f\t%2.2f\t%2.2f\n",(i+1),D1[i][2],D1[i][0],D1[i][1]);

}(out,"\n\n");(out,"MASSIV D2\n\n");(out,"#\t#D\t#D1\tr\tX\tY\n");(i=0;i<num2;i++)

{(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]);

}(out);

}massiv()

{();key;zn;

{();("Rabota s massivami. Vyberete odin iz punktov menu:\n\n");("1 Vvod massiva.\n");("2 Preobrazovanie massiva.\n");("3 Prosmotr rezul'tata.\n");("4 Vozvrat v glavnoe menu.\n");(key=getch())

{'1':

{();();='*';();;

}'2':

{

if(zn=='*')

{();();='*';

}

{("\n\nSnachala vvedite massiv!\n");

}

getch();

break;

}'3':

{(zn=='*')

{();();

}

{("\n\nSnachala vvedite massiv!\n");

}();;

}'4':

{(stdin);;

}:

{("\nPozaluysta, vvedite cifru ot 1 do 4\n");("Dlya prodolzeniya nazat' lubuyu klavishu");();

}

}

}while(key!='4');

}main()

{();exit='n';

{();("Glavnoe menu. Vyberite zadanie: \n\n");("1 Rabota s massivami.\n");("2 Ploshad i perimetr.\n");("3 Peresechenie pryamyh.\n");("4 Vuhod.\n");(getch())

{'1':

{();();;

}'2':

{();();;

}'3':

{();();;

}'4':

{("\nVyhod(Y/N)?\n");(stdin);=getch();;

}:

{("\nPozaluysta, vvedite cifru ot 1 do 4\n");("Dlya prodolzeniya nazat' lubuyu klavishu");();;

}

}

}while(exit!='y'&&exit!='Y');

}


4. Используемые переменные


Глобальные переменные:

float D[16][2],D1[15][3],D2[15][5]; - объявление используемых массивов.

int num1=0,num2=0; - номера точек в массиве D и D1 соответственно.

Переменные в функции main()exit='n'; - служит для выхода из программы.

Переменные в функции massiv()key; - служит для выхода из подпрограммы и возврата в главное меню.prov; - служит для правильной работы подпрограммы (проверка, ввел пользователь массив или нет).

Переменные в функции vvod()

int flag,i; - i-счетчик, flag - выбор ввода массива

float x,y; - переменные, координаты точек, заносимые в массив D.*in; - указатель на файл, откуда будут считываться координаты точек.

Переменные в функции preobrD()

int i; - переменная счетчик.

int temp[4],flag; - temp[4] - вспомогательный массив, для перестановки строк в массиве D2, flag - индикатор выхода из цикла преобразования D2r; - расстояние от точки до заданной прямой.

Переменные в функции SandP()

float S[4][2]; - массив, куда заносятся координаты вершин фигуры.

float rst1,rst2,rst3,rst4; - расстояния между точками.

float pP=0,pS=0,p1,p2,pt1,pt2,diag; - периметр фигуры, площадь фигуры, полупериметры двух треугольников, площади двух треугольников, длина диагонали в фигуре и одна из сторон двух треугольников.

int i; - переменная счетчик. q; - служит для выхода из подпрограммы.

Переменные в функции peres()

float a,b,c,k,x,y; - коэффициенты прямой, вводимые пользователем с клавиатуры, угловой коэффициент, точки пересечения прямых.q; - служит для выхода из подпрограммы.

Переменные в функции vyvod()*out; - указатель на файл, куда будут записываться результаты работы программы.i; - переменная счетчик.


5. Результат работы программы


Исходный файл данных3 12 3 11 3 10 4 11 4 10 4 12 5 10 5 11 2 1 6 6 5 9 9 5 8 2 2 8 7 3Файл результатовMASSIV D # X Y 1 3.00 12.00 2 3.00 11.00 3 3.00 10.00 4 4.00 11.00 5 4.00 10.00 6 4.00 12.00 7 5.00 10.00 8 5.00 11.00 9 2.00 1.00 10 6.00 6.00 11 5.00 9.00 12 9.00 5.00 13 8.00 2.00 14 2.00 8.00 15 7.00 3.00 MASSIV D1 # #D X Y 1 1.00 3.00 12.00 2 2.00 3.00 11.00 3 3.00 3.00 10.00 4 4.00 4.00 11.00 5 5.00 4.00 10.00 6 6.00 4.00 12.00 7 7.00 5.00 10.00 8 8.00 5.00 11.00 9 10.00 6.00 6.00 10 11.00 5.00 9.00 11 12.00 9.00 5.00 12 14.00 2.00 8.00 13 15.00 7.00 3.00 MASSIV D2 # #D #D1 r X Y 1 14.00 12.00 2.00 2.00 8.00 2 3.00 3.00 1.00 3.00 10.00 3 5.00 5.00 1.00 4.00 10.00 4 12.00 11.00 1.00 9.00 5.00

6. Пример работы программы


После запуска программы пользователь видит следующее окно (главное меню программы):




В программе предусмотрена защита от нажатия посторонних клавиш, т.е. любых клавиш кроме 1 - 4.

После нажатия клавиши 1, пользователь видит новое меню, меню работы с массивами:


В данном меню предусмотрены две защиты. 1 -я от нажатия посторонних клавиш, 2 - я выводит предупреждение, если пользователь нажмет клавишу 2 или 3 до того как введет массив.




После нажатия клавиши 1, пользователь переходит в меню выбора способа ввода массива.



Нажав 1, производится ввод координат точек с клавиатуры пользователем.


Если нажата клавиша 2, то считывание координат точек из файла.



После ввода массива, пользователь возвращается в меню работы с массивами.

Нажав клавишу 2, происходит преобразование массива и пользователь видит следующее сообщение на экране:


Нажав любую клавишу, пользователь возвращается в меню работы с массивами.

Нажав клавишу 3, происходит вывод результатов работы программы с массивами на экран и в файл.




После этого происходит возврат в меню работы с массивами.

Нажав клавишу 4, пользователь возвращается в главное меню программы.



При нажатии клавиши 2, пользователь попадает в окно работы по поиску площади и периметра фигуры, координаты вершин которой вводит пользователь.


Программа будет считать площадь до тех пор, пока пользователь не нажмет клавишу 'y' или Y. При нажатии этих клавиш, происходит возврат в главное меню программы.

Если в главном меню программы выбрать 3 - ий пункт (нажать клавишу 3), то пользователь попадает в окно работы по поиску точки пресечения исходной прямой и прямой, коэффициенты которой вводятся пользователем с клавиатуры.

Возможен случай, когда прямые будут параллельны, т.е. точки пересечения не будет.

Программа выводит соответствующее сообщение.




Поиск точки пересечения будет производиться до тех пор, пока пользователь не нажмет клавишу 'y' или Y. При нажатии этих клавиш, происходит возврат в главное меню программы.

При выходе из программы (нажатии клавиши 4 в главном меню), пользователь видит следующее окно:


При нажатии клавиши 'y' или Y происходит выход из программы. Если нажата любая другая клавиша, пользователь возвращается к выбору задания в главном меню.

Выводы


В данной работе приходилось пользоваться массивами, функциями и работой с файлами.

Преимущества конструкции, использованной мной присчитывании координат точек из файла, заключается в том, что с помощью нее можно считывать неограниченное количество координат, т.е. считывать координаты до тех пор пока функция fscanf не возвратит EOF. Данную конструкцию можно использовать не только в данной курсовой работе, но и в других программах.

В программе были использованы статические массивы, т.к. у нас заранее известно, сколько элементов будет участвовать в работе с массивами. С точки зрения использования памяти это не рационально, т.к. в массивах D1 и D2 приходится выделять память под элементы этих массивов гораздо больше, чем это надо на самом деле. Для решения этой проблемы можно воспользоваться динамическими массивами (динамическим выделением памяти).

При сортировке массива D2 по убыванию r (расстояние от точки до прямой) был использован алгоритм сортировки методом «пузырька». Этот метод основывается на последовательном сравнении значений двух соседних элементов массива, начиная с последнего. В результате сравнения больший по значению элемент перемещается на место соседнего, достигая через определенное число шагов места первого элемента массива (при перестановке r, переставляются местами строки массива D2, т.е. каждый элемент i- ой строки).

Для облегчения чтения и красивого вывода на экран (записи в файл) результатов работы программы в функции vyvod(), я воспользовался табуляцией \t и форматным выводом элементов массивов %2.2f.

Алгоритм и программа составлены таким образом, что вся работа с массивами осуществляется не в главной функции, а в отдельной функции massiv(). Это сделано для того, чтобы не нагружать главную функцию main() и для удобства работы с программой.

При разработке программы мной была предусмотрена и разработана и реализована защита от нажатия посторонних клавиш при работе с программой. В функции main() защита от нажатия любых клавиш кроме 1 - 4. В функции massiv() 2 защиты: 1 - я от нажатия посторонних клавиш кроме 1 - 4; 2 - я предусматривает проверку, ввел ли пользователь массив, т.е. если выбрать преобразование массива или его просмотр не введя его (из файла или с клавиатуры), то пользователь будет предупрежден об этом. Благодаря этим способам защиты программа функционирует без сбоев и ошибок при случайном (или специальном) нажатии посторонних клавиш.



Задание на курсовую работу Разработать программу на языке Си, выполняющую следующие действия: формирование массива данных; расчет расстояний между

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ