Programski jezik C

Nina Kercmar

17.11.1997

Obseg n-kotnika

Imamo krog in vanj včrtamo n-kotnik. Izdelati moramo program, ki nam bo izračunal obseg n-kotnika.

Potek dela

Ugotoviti moramo splošno formulo za izračun obsega n-kotnika. Vemo, da je obseg n-kotnika malo manjši od obsega 2n-kotnika. n-kotnik včrtamo v enotski krog (torej, krog s polmerom 1) in ga razrežemo na n enakostraničnih trikotnikov. Ti trikotniki so sestavljeni iz dveh enako dolgih stranic (polmerov) in iz stranice a. Naj bo kot med polmeroma 2α in naj bo obsek n-kotnika S_{n}. Podobno lahko razrežemo 2n-kotnik, le da imamo tukaj v trikotnikih polmera in stranico b, kot med polmeroma α ter obseg S_{2n}.

Recimo, da poznamo obseg S_{n}. Potem lahko izračunamo S_{2n} na sledeč način:

a = 2·(1·sin α) → sin α = \frac{a}{2} = \frac{S_{n}}{2n}b = 2·(1·sin \frac{α}{2}) → S_{2n} = 2n·b = 4n·sin \frac{α}{2}

Ker velja cos α = 1 − 2 sin^{2} \frac{α}{2} in cos α = \sqrt{1 − sin^{2} α} izpeljemo

sin \frac{α}{2} = \sqrt{\frac{1 − \sqrt{1 − sin^{2} α}}{2}} = \sqrt{\frac{1 − \sqrt{1 − (\frac{S_{n}}{2n})^{2}}}{2}}

iz česar sledi

S_{2n} = 4n · sin \frac{α}{2}

= 4n · \sqrt{\frac{1 − \sqrt{1 − (\frac{S_{n}}{2n})^{2}}}{2}}

= 2n · \sqrt{4\frac{1 − \sqrt{1 − (\frac{S_{n}}{2n})^{2}}}{2}}

= 2n · \sqrt{2 (1 − \sqrt{1 − (\frac{S_{n}}{2n})^{2}})}

= 2n · \sqrt{2 − 2\sqrt{1 − (\frac{S_{n}}{2n})^{2}}}

= 2n · \sqrt{2 − \sqrt{4(1 − (\frac{S_{n}}{2n})^{2}}}

= 2n · \sqrt{2 − \sqrt{4 − 4(\frac{S_{n}}{2n})^{2}}}

= 2n · \sqrt{2 − \sqrt{4 − (2\frac{S_{n}}{2n})^{2}}}

= 2n · \sqrt{2 − \sqrt{4 − (\frac{S_{n}}{n})^{2}}}

Zatorej, če poznamo S_{n} poznamo tudi S_{2n}. Preden bomo napisali program preverimo našo formulo na nekaj primerih:

• V krog včrtamo enakostranični trikotnik in dobimo:

a = \sqrt{3}, S_{3} = 3 · \sqrt{3}

• Izračunajmo še obseg kvadrata, ki smo ga včrtali v enotski krog:

a = \sqrt{2}, S_{2} = 4\sqrt{2}

Napišimo program!:

#include <stdio.h>
#include <conio.h>
#include <math.h>
#define sqr(x) x*x
#define DVA_PI 6.2831854

void main() {
float s;
int n;
clrscr();
n= 3;            /* zacetni priblizek je pravilni 3-kotnik */
s= 3*sqrt(3);
do {
  s= sqrt(2-sqrt(4-sqr(s/n)));
  n= 2*n;                      /* n=2n */
  s*= n;
  printf("Obseg %d-kotnik je %f, resnicni PI=%f\n", n, s, DVA_PI);
} while(getch()==`d`);
} /* main */

Začetni približek lahko dobimo tudi na drugačen način. Vzamemo pravilni 2-kotnik, ki je premer kroga in dobimo:

a = 2, S_{2} = 2 · 2 = 4

Torej

S_{4} = 2 · 2\sqrt{2 − \sqrt{4 − (\frac{4}{2})^{2}}}
= 2 · 2\sqrt{2 − \sqrt{4 − 4}}
= 4\sqrt{2}

Kar je pravilno.

Približek 2π

Od tu dalje bomo naloge reševali na naslednji način:

1. Kaj bomo delali?

2. Kako bomo delali?

3. Ali deluje?

4. Celoten program.

0.0.1 Kaj?

Napisali bomo funkcijo, ki bo izračunala približek 2π:

  float Pribl_dva_pi();

0.0.2 Kako?

#define sqr(x) x*x
float Pribl_dva_pi() {
  int Sn;
  n= 2;     /* zacetni priblizek Si je 2-kotnik*/
  Sn = 4 ;
  do {
    s = sqrt(2 - sqrt(4 - sqr(Sn)(n)));
    n = 2*n ;
    Sn = 2*Sn;
  } while (getch()==´ d´ );
  return Sn;
} /* Pribl_dva_pi */

0.0.3 Ali?

#include <stdio.h>
#include <math.h>
#define sqr(x) ((x)*(x))
void main(void) { /* funkcija, ki ne vrne nicesar */
  float s;
  clrscr();
  s= Pribl_dva_pi();
  printf("Priblizek je %f \n", s);
} /* main */

0.0.4 Celoten program

#include<stdio.h>
#include<conio.h>
/*--------------------------------------------------------------*/

#include<stdio.h>
#include<math.h>
#include<conio.h>
#define sqr(x) ((x)*(x))
float Pribl_dva_pi() {
  int n;         /* n-kotnik */
  float Sn;      /* obseg le-tega */
  n= 2;          /* zacetni priblizek je 2-kotnik */
  Sn= 4;
  do {
    s= sqrt (2 - sqrt ( 4 - sqr (s/n) ) );
    n= 2*n ;
    Sn= n*S_n;
    printf("n=%d, Sn=%f \n", n, Sn);
  } while(getch()==`d`);
  return Sn;
} /* Pribl_dva_pi */
/*------------------------------------------------------------*/
void main() {
   float s;
   clrscr();
   s = Pribl_dva_pi();
   printf("Priblizek je %f \n",s);
} /* main */