Розглянемо деякі приклади розв'язання задач

1. Функція піднесення до степеня.

Розглянемо функцію power і основну програму, що її використовує:

Main()

{ /*test power function*/

int i;

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

printf("%d%d%d\n",

i, power(2,i),power(-3,i));

}

power(x,n) /*raise x n-th power;n

*>0*/

int x,n;

{

int i,p;

p=1;

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

p=p*x;

return (p);

}

Аргументи функції описані в рядку int x,n;

Описи аргументів містяться між списком аргументів і лівою фігурною дужкою, що відкривається; кожен опис закінчується крапкою з комою. Імена, використані для аргументів функції power, локальні й недоступні жодним іншим функціям. Інші процедури можуть використовувати ті самі імена без виникнення конфлікту. Це вірно для змінних "і" та "p"; "і" у функції power ніяк не зв'язане з "і" у функції main.

Значення, обчислене функцією power, передаються в main за допомогою оператора return. Усередині круглих дужок можна написати будь-який вираз.

2. Написати й протестувати функцію I_TO_B(n,s,b), яка переводить ціле число n у рядок s, що зображує число ув системі числення з основою b:

#include <dos.h>
#include <stdio.h>

#include <string.h>
#include <conio.h>
void I_TO_B(long n,char*str)
{
int i,j,g=0,z=0;
long cf;
static int a[10],b[10],c[10];

for(i=0,j=48;i<=9,j<=57;i++,j++)
{
a[i]=i;
b[i]=j;
}
for(j=0;j<=100;j++)
{
if(n==0)break;
cf=n%10;
n/=10;
for(i=0;i<10;i++)
{
if(a[i]==cf)
c[z++]=b[i];
}

}
for(z=9;z>=0;z--)
{
if(c[z]!=0)
str[g++]=c[z];
}
str[g]='\0';
}
void main()
{
static char str[80];
long n;
puts("Введіть ціле число n, яке треба перевести в рядок:\n");
scanf("%ld",&n);
I_TO_B(n,str);
puts("\n Це рядок:\n");
puts(str);
getch();
}

3. Написати програму для гри "Хрестики-нулики" на полі 3 ´ 3 для людини й комп'ютера.

#include <stdio.h>
#include <conio.h>
#define ESC 27
int win[24]={0,1,2,3,4,5,6,7,8,0,3,6,1,4,7,2,5,8,0,4,8,2,4,6};

int prov1(int*a)
{
int i,p=0,w[3];
for(i=0;i<8;i++)
{
w[0]=win[i*3];
w[1]=win[i*3+1];
w[2]=win[i*3+2];
if(a[w[0]]==0&&a[w[1]]==0&&a[w[2]]==-1)
{
a[w[2]]=0;
p++;
break;
}
if(a[w[0]]==0&&a[w[1]]==-1&&a[w[2]]==0)
{
a[w[1]]=0;
p++;
break;
}
if(a[w[0]]==-1&&a[w[1]]==0&&a[w[2]]==0)
{
a[w[0]]=0;
p++;
break;
}
}
return p;
}

int prov2(int*a)
{
int i,p=0,w[3];
for(i=0;i<8;i++)
{
w[0]=win[i*3];
w[1]=win[i*3+1];
w[2]=win[i*3+2];
if(a[w[0]]==1&&a[w[1]]==1&&a[w[2]]==-1)
{
a[w[2]]=0;
p++;
break;
}
if(a[w[0]]==1&&a[w[1]]==-1&&a[w[2]]==1)
{
a[w[1]]=0;
p++;
break;
}
if(a[w[0]]==-1&&a[w[1]]==1&&a[w[2]]==1)
{
a[w[0]]=0;
p++;
break;
}
}
return p;
}

void main()
{
int i,j,p=0,l,a[9],n;
do
{
clrscr();
for(i=0;i<9;i++)a[i]=-1;
if(p==0)
{
puts("Комп’ютер ходить першим");
a[4]=0;
for(l=0;l<4;l++)
{
do
{
scanf("%d",&n);
if(a[n]!=-1)
puts("Клітинка зайнята!");
}while(a[n]!=-1);
a[n]=1;
if(prov1(a)!=0)
{puts("Ви програли!");break;}
if(prov2(a)==0)
{
if(a[0]<0&&a[8]!=1)
a[0]=0;
else if(l==1&&a[1]==1)
a[6]=0;
else if(a[2]<0&&a[6]!=1)
a[2]=0;
else for(i=0;i<9;i++)
if(a[i]<0)
{a[i]=0;break;}
}
for(i=0;i<3;i++,putchar('\n'))
for(j=0;j<3;j++)
printf("%2d",a[i*3+j]);
}
}
else
{
puts("Ви йдете першим");

scanf("%d",&n);
a[n]=1;
for(l=0;l<4;l++)
{
if(prov1(a)!=0)
{puts("Ви програли!");break;}

if(prov2(a)==0)
{
if(a[4]==-1)a[4]=0;
else if(l==1&&a[0]==1&&a[8]==1||l==1&&a[2]==1&&a[6]==1)
a[1]=0;
else if(a[0]<0&&a[8]!=1)
a[0]=0;
else if(a[2]<0&&a[6]!=1)
a[2]=0;
else for(i=0;i<9;i++)
if(a[i]<0)
{a[i]=0;break;}
}
for(i=0;i<3;i++,putchar('\n'))
for(j=0;j<3;j++)
printf("%2d",a[i*3+j]);
do
{
scanf("%d",&n);
if(a[n]!=-1)
puts("Клітинка зайнята!");
}while(a[n]!=-1);
a[n]=1;
}
}
for(i=0;i<3;i++,putchar('\n'))
for(j=0;j<3;j++)
printf("%2d",a[i*3+j]);
p=!p;
puts("Знову?(Так – довільна клавіша, Ні-ESC)");
}while(getch()!=ESC);
}

4. Із даної на площині множини точок вибрати такі чотири точки, які є вершинами опуклого чотирикутника найбільшої площі.

Для розв'язання задачі переглядатимемо всі можливі четвірки точок, перевірятимемо, чи є вони вершинами опуклого чотирикутника та знаходитимемо його площу при позитивній перевірці на опуклість. Тоді з усіх таких площ знайдемо максимальну. Для знаходження площі чотирикутника й перевірки його на опуклість використаємо площі трикутників. Очевидно, що площа опуклого чотирикутника завжди дорівнюватиме сумі площ двох трикутників, що утворюються його сторонами й довільною діагоналлю. Якщо ж чотирикутник не опуклий, то його площа дорівнює сумі площ трикутників лише при певному підборі вершин трикутників. Для знаходження площі трикутника використаємо формулу

S = 1/2 | x 1 y 2 + x 2 y 3 + x 3 y 1 – x 1 y 3 – x 2 y 1 – x 3 y 2 |,

де вершини трикутника задано координатами (x 1, y 1), (x 2, y 2) та (x 3, y 3).

#include <math.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

//Структура точки
typedef struct
{
float x;
float y;
} tochka;

//Структура чотирикутника
typedef struct
{
tochka t1;
tochka t2;
tochka t3;
tochka t4;
} choturukyt;

//Обчислюємо площу трикутника за формулою, записаною вище
float s_tr(tochka t1,tochka t2,tochka t3)
{
return 0.5*fabs(t1.x*t2.y+t2.x*t3.y+t3.x*t1.y-t1.x*t3.y-t2.x*t1.y-t3.x*t2.y);
}

//Обчислюємо площу чотирикутника
//Перевіряємо, чи є він опуклим
float s_ch(tochka t1,tochka t2,tochka t3,tochka t4)
{
float s1,s2;

s1=s_tr(t1,t2,t3)+s_tr(t1,t3,t4);
s2=s_tr(t2,t3,t4)+s_tr(t1,t2,t4);

if(fabs(s1-s2)/s1<1e-4)return s1;
return 0;
}

//Знаходимо найбільшу площу чотирикутника
//Методом перебору всіх точок
float poshyk(tochka*A,int n,choturukyt*B)
{
long i,j,k,m;
float pre=0,tek;

for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
for(k=j+1;k<n;k++)
for(m=k+1;m<n;m++)

if((tek=s_ch(A[i],A[j],A[k],A[m]))!=0)
if(tek>pre)
{
pre=tek;
B->t1=A[i];
B->t2=A[j];
B->t3=A[k];
B->t4=A[m];
}

return pre;
}

//Формуємо множину точок
void zapov(tochka*A,long n,long in)
{
long i;
for(i=0;i<n;i++)
{
A[i].x=in*((float)rand()/(float)32767);
A[i].y=in*((float)rand()/(float)32767);
}
}

void main()
{
choturukyt B;
tochka *A;
float s;
long n,in;
srand(time(NULL));

m1:
clrscr();
printf("Введіть кількість точок (N>4):");
scanf("%ld",&n);
printf("Введіть інтервал (IN>0) від 0 до");
scanf("%ld",&in);

if(n<4||in<=0)
{
highvideo();
cputs("\nУвага! Помилка при введенні даних!");
normvideo();
getch();
goto m1;
}

if((A=(tochka*)malloc(n*sizeof(tochka)))==NULL)
{
highvideo();
cputs("\nПомилка при виділенні пам’яті!");
normvideo();
getch();
return;
}

zapov(A,n,in);
clrscr();
if((s=poshyk(A,n,&B))!=0)
{
puts("Точки чотирикутника:");
printf("Перша: \t\tx %9.3f\ty %9.3f\n",B.t1.x,B.t1.y);
printf("Друга: \t\tx %9.3f\ty %9.3f\n",B.t2.x,B.t2.y);
printf("Третя: \t\tx %9.3f\ty %9.3f\n",B.t3.x,B.t3.y);
printf("Четверта: \tx %9.3f\ty %9.3f\n",B.t4.x,B.t4.y);
printf("\nПлоща цього чотирикутника: %.3f\n\n",s);
}
else puts("Таких чотирикутників немає!\n");

highvideo();
cputs("Для виходу натисніть Esc...");
putchar('\n');
cputs("Для повторення натисніть Enter...");
normvideo();

free(A);

m2:
switch(getch())
{
case 13: goto m1;
case 27: return;
default: goto m2;
}
}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: