Программирование и основы алгоритмизации

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 06.08.2013
Размер файла 16,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Министерство образования и науки Российской Федерации

Санкт-Петербургский государственный электротехнический университет "ЛЭТИ"

Кафедра: КСУ

Курсовая работа

"Программирование и основы алгоритмизации"

Студент: Моисеева О.И.

Группа: 1491

Преподаватель: Ветчинкин А. С.

Санкт-Петербург, 2012 год

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

математический модель программа пользователь

Постановка задачи:

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

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

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

Математическая модель:

Для определения местоположения точки относительно многоугольника проводим вертикальную линию параллельную оси ординат через заданную точку. Определяем точки пересечения со сторонами многоугольника. Если точка пересечения по координате х лежит между двумя соответствующими точками У на многоугольнике, то фиксируем это. Проделываем данную операцию и с остальными точками.

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

Kbc и Bbc - угловой коэффициент и свободный член уравнения прямой, проведенной через вершины многоугольника B и С.

Аналогично этому: Kcd и Bcd, Kad и Bad, Kab и Bab.

Во избежание деления на ноль используется число 0.0001.

На точность вычислений оно не влияет, т.к. очень мало.

При вычислении расстояния от точки до прямой используются координаты желаемой точки и k и b (угловой коэффициент и свободный член уравнения прямой, пересекающей многоугольник), вычисленные по 2 введенным точкам.

Используется формула: Она путем преобразований получена из стандартной математической формулы для вычисления расстояний.

Для сортировки массива по убыванию используется метод простого перебора. Предполагается, что первое значение - максимальное. После чего сравниваются с соседними элементами. После одной итерации мы получаем действительно максимальное значение по всему массиву. Данное значение переносится в первую ячейку массива.

Аналогично максимальные значения из оставшихся значений переносятся в ячейку 2,3...n...

#include "stdafx.h"

#include<stdio.h>

#include<conio.h>

#include<math.h>

#include<string.h>

#include<stdlib.h>

#include<ctype.h>

FILE *file1;

FILE *file2;

int vnutri_ili_snaruji (float Ax, float Bx, float Cx, float Dx, float Ay, float By, float Cy, float Dy, float x, float y)

{

int vnutri=0, z=0;

float y1, y2, y3, y4;

float massiv[4];

float Kbc, Bbc, Kcd, Bcd, Kad, Bad, Kab, Bab;

Kbc=(By-Cy)/(Bx-Cx+0.0001); //коэффициенты в ур-ие прямой

Bbc=By-Kbc*Bx;

Kcd=(Dy-Cy)/(Dx-Cx+0.0001);

Bcd=Cy-Kcd*Cx;

Kad=(Dy-Ay)/(Dx-Ax+0.0001);

Bad=Ay-Kad*Ax;

Kab=(By-Ay)/(Bx-Ax+0.0001);

Bab=Ay-Kab*Ax;

y1=Kab*x+Bab; //Находим точки пересечения со сторонами многогранника

y2=Kbc*x+Bbc;

y3=Kcd*x+Bcd;

y4=Kad*x+Bad;

if ((y1>Ay && y1<By) || (y1<Ay && y1>By)) //Подсчёт точек пересечения параллельной прямой

{

massiv[z]=y1;

z++;

}

if ((y2>Cy && y2<By) || (y2<Cy && y2>By))

{

massiv[z]=y2;

z++;

}

if ((y3>Cy && y3<Dy) || (y3<Cy && y3>Dy))

{

massiv[z]=y3;

z++;

}

if ((y4>Ay && y4<Dy) || (y4<Ay && y4>Dy))

{

massiv[z]=y4;

z++;

}

if (z==2) //Проверка условия внутри многоугольника

{

if (y<massiv[0] && y>massiv[1]) vnutri=1;

if (y>massiv[0] && y<massiv[1]) vnutri=1;

}

return(vnutri);

}

float rasstoyanie (float x, float y, float k, float b)

{

float d;

d=(fabs(k*x-y+b)/sqrt(k*k+1)); //рассчёт расстояния от точки до прямой

return(d);

}

float sortirovka(float Sort[], float D3[250][6], int n)//Использование метода простого перебора

{

int i=0,k=0,nomer, j, j3=0, i3;

float max, perv;

float temp, temp1, temp2, temp3, temp4, temp5;

do //Сортировка значений r

{

max=Sort[i];

nomer=i;

do

{

if (Sort[i+1]>max) nomer=i+1;

if (Sort[i+1]>max) max=Sort[i+1];

i++;

}

while(i<n-1);

perv=Sort[k];

Sort[k]=max;

Sort[nomer]=perv;

k++;

i=k;

}

while(k<n-1);

for(j=0;j<n;j++) //Подстановка строк по значению r

{

for(i3=0;i3<n;i3++)

{

if (Sort[j]==D3[i3][j3+5])

{

temp=D3[j][j3];

temp1=D3[j][j3+1];

temp2=D3[j][j3+2];

temp3=D3[j][j3+3];

temp4=D3[j][j3+4];

temp5=D3[j][j3+5];

D3[j][j3]=D3[i3][j3];

D3[j][j3+1]=D3[i3][j3+1];

D3[j][j3+2]=D3[i3][j3+2];

D3[j][j3+3]=D3[i3][j3+3];

D3[j][j3+4]=D3[i3][j3+4];

D3[j][j3+5]=D3[i3][j3+5];

D3[i3][j3]=temp;

D3[i3][j3+1]=temp1;

D3[i3][j3+2]=temp2;

D3[i3][j3+3]=temp3;

D3[i3][j3+4]=temp4;

D3[i3][j3+5]=temp5;

break;

}

}

}

return(0);

}

void vyvod(float Massiv[250][6], int stroki, int stolbcy)

{

int i,j,k;

if(stolbcy==6)

{

k=1;

}

else

{

k=0;

}

for(i=0; i<stroki; i++)

{

if((i%20)==0)

{

getch();

}

for(j=k; j<stolbcy; j++)

{

switch(stolbcy)

{

case 6:

{

switch(j)

{

case 1:

printf("D2=");

break;

case 2:

printf("D1=");

break;

case 3:

printf("x=");

break;

case 4:

printf("y=");

break;

case 5:

printf("d=");

break;

}

break;

}

case 3:

{

switch(j)

{

case 0:

printf("D1=");

break;

case 1:

printf("x=");

break;

case 2:

printf("y=");

break;

}

break;

}

case 4:

{

switch(j)

{

case 0:

printf("D2=");

break;

case 1:

printf("D1=");

break;

case 2:

printf("x=");

break;

case 3:

printf("y=");

break;

}

break;

}

}

printf("%1.1f ",Massiv[i][j]);

fprintf(file2, "%1.1f ",Massiv[i][j]);

}

printf("\n");

fprintf(file2,"\n");

}

}

int MENU(int flag) //основное меню

{

system("cls"); //очистка экрана

printf("\nMenu:\n"); //вывод меню

if (flag>1) printf("1. Vvod na4al'nyh dannyh - ok!");

else printf("1. Vvod na4al'nyh dannyh");

if (flag>2) printf("\n2. Ras4et - ok!");

else printf("\n2. Ras4et");

if (flag>3) printf("\n3. Vyvod rezul'tatov - ok!");

else printf("\n3. Vyvod rezul'tatov");

printf("\n4. Vyhod");

printf("\n\nVvedite N punkta: ");

return 0;

}

void main() //описание переменных

{

int vyhod=0;

float Ax,Ay,Bx,By,Cx,Cy,Dx,Dy;

float D1[250][6], D2[250][6], D3[250][6];

int i,j,vnutri, n,N1,N2,N3,i1,j1,i2,j2,i3,j3;

float r,R;

float Sort[250];

float x, y;

float k, b, x1, x2, y1, y2;

int stroki, stolbcy;

char str[128], key, key2;

int flag=1;

char w[1];

while(vyhod==0)

{

MENU(flag);

key=getchar();

sprintf (w, "%d", flag);

if (key=='4')

{

vyhod=1;

break;

}

if (key>w[0])

{

key=5;

printf("\nO6ibka! Dlya vyhoda nazhmite 4 ili dla vvoda dannix nazhmite 1");

}

switch(key)

{

case '1': //ввод данных

{

printf("\nVvedem koordinati mnogougol'nika.");

printf("\nVvedite koordinatu A:\n");

scanf("%f %f", &Ax, &Ay);

printf("\nVvedite koordinatu B:\n");

scanf("%f %f", &Bx, &By);

printf("\nVvedite koordinatu C:\n");

scanf("%f %f", &Cx, &Cy);

printf("\nVvedite koordinatu D:\n");

scanf("%f %f", &Dx, &Dy);

printf("\nVvedite R:\n");

scanf("%f", &R);

printf("Vvedem 2 to4ki pryamoj.");

printf("\nPervaya:\n");

scanf("%f %f", &x1, &y1);

printf("\nVtoraya:\n");

scanf("%f %f", &x2, &y2);

flag++;

getch();

break;

}

case '2': //расчет

{

k=(y2-y1)/(x2-x1+0.0001); //составление ур-ий прямой

b=y2-k*x2;

N1=1;

j1=i1=n=0;

}

file1=fopen("C:\\tochki.txt","rt"); // Открываем входной файл для чтения.

if(file1 == NULL) // Если файл не удалось открыть...

{

printf("Fajl ne najden"); // выводим об этом сообщение.

return;

}

else{

while(NULL!=fgets(str,128,file1))

{

n++;

}

if (n>249) (n=250);

rewind(file1);

for (i=0;i<n;i++) //формирование D1

{

fscanf(file1,"%f %f",&x,&y);

if (x>=0 && x<=12 && y>=0 && y<=15)

{

D1[i1][j1]=N1;

D1[i1][j1+1]=x;

D1[i1][j1+2]=y;

N1++;

i1++;

}

}

fclose(file1); //закрытие файла

N2=N3=1;

j=i2=j2=i3=j3=0;

for (i1=0; i1<N1-1; i1++)

{

vnutri=vnutri_ili_snaruji (Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, D1[i1][j1+1], D1[i1][j1+2]);

if (vnutri==0) //формирование D2

{

D2[i2][j2]=N2;

D2[i2][j2+1]=D1[i1][j1];

D2[i2][j2+2]=D1[i1][j1+1];

D2[i2][j2+3]=D1[i1][j1+2];

r=rasstoyanie (D2[i2][j2+2], D2[i2][j2+3], k,b); //формирование D3

if (r<=R)

{

D3[i3][j3]=N3;

D3[i3][j3+1]=D2[i2][j2];

D3[i3][j3+2]=D2[i2][j2+1];

D3[i3][j3+3]=D2[i2][j2+2];

D3[i3][j3+4]=D2[i2][j2+3];

D3[i3][j3+5]=r;

Sort[j]=r;

j++;

i3++;

N3++;

}

N2++;

i2++;

}

}

N3=N3-1;

sortirovka(Sort, D3, N3); //сортировка по значению r

printf("\nPoschitano!\n");

flag++;

getch();

break;

}

case '3': //вывод результата

{

file2=fopen("C:\\rezultat.txt", "at");

printf("\nKakoi massiv vyvesti? D1 - najmite 1, D2 - 2, D3 - 3, vse - 4:\n");

key2=getchar();

key2=getchar();

if (key2=='1')

{

stroki=N1-1;

stolbcy=3;

fprintf(file2, "\nVse to4ki v zadannoj oblasti:\n");

printf("\nVse to4ki v zadannoj oblasti:\n");

vyvod(D1,stroki,stolbcy);

}

if (key2=='2')

{

stroki=N2-1;

stolbcy=4;

fprintf(file2, "\n\nTo4ki VNE mnogougol'nika:\n");

printf("\n\nTo4ki VNE mnogougol'nika:\n");

vyvod(D2,stroki,stolbcy);

}

if (key2=='3')

{

stroki=N3;

stolbcy=6;

fprintf(file2, "\n\nTo4ki VNE mnogougol'nika i r<=R:\n");

printf("\n\nTo4ki VNE mnogougol'nika i r<=R:\n");

vyvod(D3,stroki,stolbcy);

}

if (key2=='4')

{

stroki=N1-1;

stolbcy=3;

fprintf(file2, "\nVse to4ki v zadannoj oblasti:\n");

printf("\nVse to4ki v zadannoj oblasti:\n");

vyvod(D1,stroki,stolbcy);

stroki=N2-1;

stolbcy=4;

fprintf(file2, "\n\nTo4ki VNE mnogougol'nika:\n");

printf("\n\nTo4ki VNE mnogougol'nika:\n");

vyvod(D2,stroki,stolbcy);

stroki=N3;

stolbcy=6;

fprintf(file2, "\n\nTo4ki VNE mnogougol'nika i r<=R:\n");

printf("\n\nTo4ki VNE mnogougol'nika i r<=R:\n");

vyvod(D3,stroki,stolbcy);

}

flag++;

fclose(file2);

getch();

break;

}

case '4': //выход из программы

{

printf("\nProgramma vypolnena. \n");

vyhod=1;

flag++;

getch();

break;

}

default: //любая другая клавиша

{

getch();

break;

}

} } }

Выводы

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

Кроме того, была продемонстрирована работа с файлами данных для ввода и вывода данных.

Так же были написаны функции для решения конкретных задач, что позволило сделать программу более логичной и понятной.

Размещено на Allbest.ru


Подобные документы

  • Функции формирования массива времени. Формирование массива входного напряжения, массива выходного напряжения. Функция вывода таблицы, расчета заданной точности, вывода титульного листа. Запись в файл массива времени. Блок–схема и текст программы.

    курсовая работа [155,6 K], добавлен 22.04.2012

  • Основные преимущества модульного программирования. Выделение процедуры: ввода массива с консоли, вывода на экран массива, информации об авторе и условии решенной задачи до обработки и после обработки. Иерархия процедур, характеристика назначения модулей.

    реферат [2,3 M], добавлен 29.01.2016

  • Изучение определения, описания и вызова функций, указателей и ссылок на них. Написание функции умножения произвольного столбца двумерного массива на const. Умножение 2 столбцов массива на константы. Составление блок-схемы алгоритма и текста программы.

    лабораторная работа [182,3 K], добавлен 09.01.2012

  • Краткое описание языка программирования С++. Алгоритм линейного выбора элемента, методов минимального (максимального) элемента и челночной сортировки. Анализ и разработка приложения, организующего сортировку массива данных пятью методами сортировки.

    реферат [614,8 K], добавлен 12.04.2014

  • Создание программы визуализации методов сортировки массива, особенности и направления ее практического применения. Выбор и обоснование среды программирования. Разработка руководства пользователя. Листинг программы и оценка эффективности ее использования.

    дипломная работа [1,0 M], добавлен 15.06.2014

  • Рассмотрение правил записи, способов ввода и вывода, использования функций обработки символьных данных в Pascal. Описание алгоритмизации и программирования файловых структур данных, проектирования структуры файла. Ознакомление с работой данных массива.

    курсовая работа [336,2 K], добавлен 27.06.2015

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

    курсовая работа [44,0 K], добавлен 09.11.2014

  • Модификация и сравнения двух текстовых файлов. Программа, написанная на языке программирования Cи и работоспособна на IBM совместимых компьютерах. Псевдографический и графический интерфейсы. Анализ программы методом сортировки одномерного массива.

    курсовая работа [116,2 K], добавлен 21.02.2008

  • Общая характеристика организации массива в виде двоичного дерева. Особенности линейного и двоичного поиска заданного элемента массива. Методика упорядочения массива методом сортировки деревом. Инструкции и текст программы для нечисленной обработки данных.

    курсовая работа [242,3 K], добавлен 12.11.2010

  • Анализ основных алгоритмов внутренней сортировки массивов данных, сравнение сложности их реализации и производительности. Сортировка пузырьком, методами вставок, выбора, методом Шелла, быстрая сортировка. Операция разделения массива внутренней сортировки.

    курсовая работа [161,7 K], добавлен 17.12.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.