Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ срСда программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 67

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

 0,       0

};


static struct { /* Built-ins */

 char *name;

 double (*func)();

} builtins[] = {

 "sin",   sin,

 "cos",   cos,

 "atan",  atan,

 "log",   Log, /* checks argument */

 "log10", Log10, /* checks argument */

 "exp",   Exp, /* checks argument */

 "sqrt",  Sqrt, /* checks argument */

 "int",   integer,

 "abs",   fabs,

 0,       0

};


init() /* install constants and built-ins in table */

{

 int i;

 Symbol *s;


 for (i = 0; consts[i].name; i++)

  install(consts[i].name, VAR, consts[i].cval);

 for (i = 0; builtins[i].name; i++) {

  s = install(builtins[i].name, BLTIN, 0.0);

  s->u.ptr = builtins[i].func;

 }

}

Π”Π°Π½Π½Ρ‹Π΅ хранятся Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…, Π° Π½Π΅ вводятся Π² тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»Π΅Π³Ρ‡Π΅ Π±Ρ‹Π»ΠΎ ΠΈΡ… Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ. Π’Π°Π±Π»ΠΈΡ†Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ статичСскиС, Ρ‡Ρ‚ΠΎ обСспСчиваСт ΠΈΡ… Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅. ΠœΡ‹ вскорС вСрнСмся ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ стандартных матСматичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚ΠΈΠΏΠ° Log ΠΈ Sqrt.

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΠ² Ρ‚Π°ΠΊΠΎΠΉ базис, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ измСнСниям Π² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ΡΡ Π½Π° Π΅Π³ΠΎ основС.

$ cat hoc.y

%{

#include "hoc.h"

extern double Pow();

%}

%union {

 double val;  /* actual value */

 Symbol *sym; /* symbol table pointer */

}

%token <val> NUMBER

%token <sym> VAR BLTIN UNDEF

%type  <val> expr asgn

%right '='

%left  '+'

%left  '*' '/'

%left  UNARYMINUS

%right '^' /* exponentiation */

%%

list: /* nothing */

 | list '\n'

 | list asgn '\n'

 | list expr '\n' { printf("\t%.8g\n", $2); }

 | list error '\n' { yyerrok; }

 ;

asgn: VAR '=' expr { $$=$1->u.val=$3; $1->type = VAR; }

 ;

expr: NUMBER

 | VAR {

  if ($1->type == UNDEF)

  execerror("undefined variable", $1->name);

  $$ = $1->u.val;

 }

 | asgn

 | BLTIN '(' expr ')' { $$ = (*($1->u.ptr))($3); }

 | expr '+' expr { $$ = $1 + $3; }

 | expr '-' expr { $$ = $1 - $3; }

 | expr '*' expr { $$ = $1 * $3; }

 | expr '/' expr {

  if ($3 == 0.0)

   execerror("division by zero", ""); $$ = $1 / $3;

  }

 | expr '^' expr { $$ = Pow($1, $3); }

 | '(' expr ')' { $$ = $2; }

 | '-' expr %prec UNARYMINUS { $$ = -$2; }

 ;

%%

/* end of grammar */

...

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ присутствуСт asgn для присваивания, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ expr для выраТСния. Входная строка, состоящая Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·

VAR = expr

являСтся присваиваниСм, ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π΅ пСчатаСтся. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, кстати, ΠΊΠ°ΠΊ ΠΌΡ‹ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΊ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ возвСдСния Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ, ΡΠ²Π»ΡΡŽΡ‰ΡƒΡŽΡΡ правоассоциативной.

Для стСка yacc ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ %union: вмСсто прСдставлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΠ°ΠΊ индСкса Π² массивС ΠΈΠ· 26 элСмСнтов Π²Π²Π΅Π΄Π΅Π½ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Symbol. Π€Π°ΠΉΠ» ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ hoc.h содСрТит ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ этого Ρ‚ΠΈΠΏΠ°.

ЛСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ распознаСт ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΡ… Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΈΠΌΠ΅Π½ ΠΈ опрСдСляСт, относятся Π»ΠΈ ΠΎΠ½ΠΈ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ (VAR) ΠΈΠ»ΠΈ ΠΊ встроСнным функциям (BLTIN). Ѐункция yylex Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° PI относятся ΠΊ VAR.

Одно ΠΈΠ· свойств ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ присвоСно Π»ΠΈΠ±ΠΎ Π½Π΅ присвоСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, поэтому ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π΄ΠΈΠ°Π³Π½ΠΎΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ yyparse ΠΊΠ°ΠΊ ошибка. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΎΠ½Π° ΠΈΠ»ΠΈ Π½Π΅Ρ‚) Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ прСдусмотрСна Π² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅, Π° Π½Π΅ Π² лСксичСском Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅. Когда VAR распознаСтся Π½Π° лСксичСском ΡƒΡ€ΠΎΠ²Π½Π΅, контСкст ΠΏΠΎΠΊΠ° Π΅Ρ‰Π΅ Π½Π΅ извСстСн, Π½ΠΎ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ сообщСния ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ x Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, хотя контСкст ΠΈ Π²ΠΏΠΎΠ»Π½Π΅ допустимый, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, x Π² присваивании Ρ‚ΠΈΠΏΠ° x = 1.

НиТС приводится измСнСнная Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ yylex:

yylex() /* hoc3 */

{

 ...

 if (isalpha(c)) {

  Symbol *s;

  char sbuf[100], *p = sbuf;

  do {

   *p++ = c;

  } while ((c=getchar()) != EOF && isalnum(c));

  ungetc(c, stdin);

  *p = '\0';

  if ((s=lookup(sbuf)) == 0)

   s = install(sbuf, UNDEF, 0.0);

  yylval.sym = s;

  return s->type == UNDEF ? VAR : s->type;

 }

 ...

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° строка, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ вызываСтся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ†ΠΈΠΈ init для занСсСния Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈΠΌΠ΅Π½ встроСнных ΠΈ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ Ρ‚ΠΈΠΏΠ° PI:

main(argc, argv) /* hoc3 */

 char *argv[];

{

 int fpecatch();


 progname = argv[0];

 init();

 setjmp(begin);

 signal(SIGFPE, fpecatch);

 yyparse();

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ остался Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π°ΠΉΠ» math.с. Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… стандартных матСматичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ трСбуСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок для диагностики ΠΈ восстановлСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, стандартная функция ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0, Ссли Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»Π΅Π½. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° math.с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ошибок, описанный Π² Ρ€Π°Π·Π΄. 2 справочного руководства ΠΏΠΎ UNIX (см. Π³Π». 7). Π­Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ ΠΈ пСрСносимый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Ρ‡Π΅ΠΌ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ своих ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ, вСроятно, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ограничСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠ»Π½Π΅Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² "ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ" ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π€Π°ΠΉΠ» ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ <math.h> содСрТит описания Ρ‚ΠΈΠΏΠΎΠ² для стандартных матСматичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Ρ„Π°ΠΉΠ» <errno.h> β€” опрСдСлСния Ρ„Π°Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ошибок:

$ cat math.с

#include <math.h>

#include <errno.h>


extern int errno;

double errcheck();


double Log(x)

 double x;

{

 return errcheck(log(x), "log");

}


double Log10(x)

 double x;

{

 return errcheck(log10(x), "log10");

}


double Sqrt(x)

 double x;

{

 return errcheck(sqrt(x), "sqrt");

}


double Exp(x)

 double x;

{

 return errcheck(exp(x), "exp");

}


double Pow(x, y)

 double x, y;

{

 return errcheck(pow(x,y), "exponentiation");

}


double integer(x)

 double x;

{

 return (double)(long)x;

}


double errcheck(d, s) /* check result of library call */

 double d;

 char *s;

{

 if (errno == EDOM) {

  errno = 0;

  execerror(s, "argument out of domain");

 } else if (errno == ERANGE) {

  errno = 0;

  execerror(s, "result out of range");

 }

 return d;

}

Π›ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½Π°Ρ, хотя грамматичСски нСясная, диагностики появится ΠΏΡ€ΠΈ запускС yacc с Π½ΠΎΠ²ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ:

$ yacc hoc.y

conflicts: 1 shift/reduce

$

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ shift/reduce ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° hoc3 Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Π°: СдинствСнная входная строка

x=1

ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½Π° двумя способами.

Анализатор ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ присв сводится ΠΊ Π²Ρ‹Ρ€Π°ΠΆ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΊ список, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Π»Π΅Π²ΠΎΠΌ Π΄Π΅Ρ€Π΅Π²Π΅ Ρ€Π°Π·Π±ΠΎΡ€Π°, ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ символ \n сразу (shift β€” пСрСнос) ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ всС Π² список, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ², ΠΊΠ°ΠΊ Π² ΠΏΡ€Π°Π²ΠΎΠΌ Π΄Π΅Ρ€Π΅Π²Π΅ Ρ€Π°Π·Π±ΠΎΡ€Π°. ВстрСтив Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ, yacc Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ пСрСнос, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ сообщСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ yacc сдСлал ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€[16]. Запуск yacc с Ρ„Π»Π°Π³ΠΎΠΌ -v ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΠΎΠ±ΡˆΠΈΡ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ y.output, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ².

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.5

Π’ Π΄Π°Π½Π½ΠΎΠΉ вСрсии hoc3 допустимо присваиваниС:

PI=3

Π₯ΠΎΡ€ΠΎΡˆΠΎ Π»ΠΈ это? Как Π±Ρ‹ Π²Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ hoc3, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ присваиваниС "констант"?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅: 8.6

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ atan2(x, y) для вычислСния Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ ΡƒΠ³Π»Π°, тангСнс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π²Π΅Π½ x/y. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ rand(), Π²Ρ‹Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ случайныС вСщСствСнныС числа, Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ распрСдСлСнныС Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅ [0,1). Как Π±Ρ‹ Π²Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Ρ€Π°Π·Π½Ρ‹ΠΌ числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.7

Как ввСсти Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ срСдство для выполнСния ΠΊΠΎΠΌΠ°Π½Π΄ прямо Π² hoc, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ! Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… UNIX?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.8

ΠŸΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ тСкст math.c Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, Π° Π½Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅ мноТСство ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ make

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° hoc3 размСщаСтся Π½Π΅ Π² ΠΎΠ΄Π½ΠΎΠΌ, Π° Π² пяти Ρ„Π°ΠΉΠ»Π°Ρ…, makefile становится Π±ΠΎΠ»Π΅Π΅ слоТным: