22_10
.docxЗадание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 – Результат работы программы