Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бичков - Основи сучасного програмування.doc
Скачиваний:
76
Добавлен:
07.03.2016
Размер:
2.67 Mб
Скачать

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

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  x1 y2  x2 y3  x3 y1 – x1 y3 – x2 y1 – x3 y2 ,

де вершини трикутника задано координатами (x1, y1), (x2, y2) та (x3, y3).

#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); } }