Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

22_10

.docx
Скачиваний:
7
Добавлен:
15.09.2014
Размер:
75.54 Кб
Скачать

Задание1. На плоскости задается выпуклый N-угольник целочисленными координатами своих вершин в порядки обхода по контуру. Вводятся координаты точки (X, Y). Определить: a) является ли точка вершиной N-угольника; б) принадлежит ли она N-угольнику.

Метод вычисления. Чтобы определить: а) является ли точка (X,Y) вершиной N- угольника поочередно сравниваем ее координаты с координатами вершин N-угольника; б) принадлежит ли точка N-угольнику по очереди проверяем принадлежит ли она какой-либо из сторон N-угольника (отрезку, концами которого являются вершины N-угольника). Принадлежность точки отрезку определяется по формуле:

Программа состоит из главной функции main() и функции f(), которая определяет, принадлежит ли точка отрезку с заданными координатами его концов. Входными параметрами функции f() являются координаты точки и координаты концов отрезка.

Блок-схема функции main() представлена на рисунке 1.

Блок-схема функции f() представлена на рисунке 2.

нет

да

нет

да

нет

да

нет

да

да

нет

Рисунок 1 - Блок-схема функции main().

нет

да

нет

да

нет

нет

да

нет

Рисунок 2 – Блок-схема функции f().

#include "stdio.h"

#include "conio.h"

void f(float a1x, float a1y, float b1x, float b1y, float ax, float ay);

void main (){

int n,i,j,v;

float mas[100][2],ax,ay;

printf("\n Enter N\n");

scanf ("%d", &n);

printf ("Vvtdite kokrdinati vershin\n");

for (i=1;i<=n;i++)

{

printf ("\nX Y %d vershini \n", i);

for (j=1;j<=2;j++)

scanf ("%3f",&mas[i][j]) ;

}

printf ("Vvedite koordinati A\n");

scanf ("%f%f", &ax,&ay);

for (i=1;i<=n;i++)

if ((mas[i][1]==ax) && (mas[i][2]==ay))

v=1;

if (v==1) printf ("Tochka A c koord Ax=%4.2f Ay=%4.2f vershina\n", ax,ay);

if (v!=1)

{

for (i=1;i<n;i++)

f(mas[i][1], mas[i][2], mas[i+1][1], mas[i+1][2], ax,ay);

f(mas[1][1], mas[1][2], mas[n][1], mas[n][2], ax,ay);

}

getch();

}

void f (float a1x, float a1y, float b1x, float b1y, float ax, float ay)

{

float p;

if ((a1x-b1x)!=0)

{

p=(ax-b1x)/(a1x-b1x);

if ( (p*a1y+(1-p)*b1y==ay)&&(p>=0)&&(p<=1))

printf ("prinadlezhit mnogoygilniky\nx1=%4.2f y1=%4.2f x2=%4.2f y2=%4.2f\n", a1x,a1y,b1x,b1y);

} else

{

p=(ay-b1y)/(a1y-b1y);

if ( (p*a1x+(1-p)*b1x==ax)&&(p>=0)&&(p<=1))

printf ("prinadlezhit mnogoygilniky\nx1=%4.2f y1=%4.2f x2=%4.2f y2=%4.2f\n", a1x,a1y,b1x,b1y);

}

}

Результаты работы программы представлены на рисунках 3-4.

Рисунок 3 – Результат работа программы

Рисунок 3 – Результат работы программы

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

Метод решения: Программа состоит из двух функций: основной функции main() и функции cmp(), которая определяет, является ли строка симметричной. Функция cmp() работает по следующему алгоритму: входной параметр – массив символов s[] (строка). Сначала определяется длина строки s[] - n. Далее в массив символов s1[] переписывается массив символов s[] начиная с последнего элемента. После чего сравниваются два массива символов s[] и s1[]. Если они равны – строка симметрична, иначе – нет.

Блок схема алгоритма функции main() представлена на рисунке 5.

Блок схема алгоритма функции cmp() представлена на рисунке 6.

Результат работы программы представлен на рисунке 7.

нет

да

Рисунок 5 – Блок схема функции main()

А

i<n

нет

да

нет

да

нет

*(s1+i+1)==*(s+i)

да

p++;

нет

нет

p==n

да

да

printf ("\nsimmetrizhnaia\n%s\n", s);

printf ("\nnesemmetrizhnaia\n");

конец

Рисунок 6 – Блок-схема функции cmp()

#include "stdio.h"

#include "conio.h"

void cmp(char s[1000]);

void main ()

{

int n,i;

char s1[1000];

printf ("\nVvedite n\n");

scanf("%d", &n);

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

{

scanf ("%s", &s1);

cmp(s1);

}

getch();

}

void cmp(char s[1000])

{

char s1[1000]={NULL};

int i=1,k=0,p=0, n;

while (*(s+i)!=NULL)

i++;

n=i;

while (i!=0)

{

*(s1+i)=*(s+k);

k++;

i--;

}

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

if (*(s1+i+1)==*(s+i))p++;

if (p==n) {printf ("\nstroka %s simmetrizhnaia\n", s);} else printf ("\nnesemmetrizhnaia\n");

}

Рисунок 7 – Результат работы программы

Соседние файлы в предмете Основы алгоритмизации и программирования