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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования Π‘ΠΈ. ИзданиС 3-Π΅, исправлСнноС». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 34

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

(*comp)(v[i], v[left])

- ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Π½Π΅ΠΉ. Π‘ΠΊΠΎΠ±ΠΊΠΈ здСсь Π½ΡƒΠΆΠ½Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²ΠΊΡƒ объявлСния; Π±Π΅Π· Π½ΠΈΡ… объявлСниС

int *comp(void *, void *) /* ΠΠ•Π’Π•Π ΠΠž */

Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎ Π±Ρ‹, Ρ‡Ρ‚ΠΎ comp - это функция, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° int, Π° это совсСм Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ трСбуСтся.

ΠœΡ‹ ΡƒΠΆΠ΅ рассматривали Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ strcmp, ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽ Π΄Π²Π΅ строки. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° функция numcmp, которая сравниваСт Π΄Π²Π΅ строки, рассматривая ΠΈΡ… ΠΊΠ°ΠΊ числа; ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ½ΠΈ пСрСводятся Π² числовыС значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ atof.

#include β€Ήstdlib.hβ€Ί


/* numcmp: сравниваСт s1 ΠΈ s2 ΠΊΠ°ΠΊ числа */

int numcmp(char *s1, char *s2)

{

 double v1, v2;


 v1 = atof(s1);

 v2 = atof(s2);

 if (v1 β€Ή v2)

  return -1;

 else if (v1 β€Ί v2)

  return 1;

 else

  return 0;

}

Ѐункция swap, ΠΌΠ΅Π½ΡΡŽΡ‰Π°Ρ мСстами Π΄Π²Π° указатСля, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° Ρ‚ΠΎΠΉ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ Ρ€Π°Π½Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅ Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ объявлСния ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ Π½Π° void*.

void swap(void *v[], int i, int j)

{

 void *temp;

 temp = v[i];

 v[i] = v[j];

 v[j] = temp;

}

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ сортировки ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈ мноТСством Π΄Ρ€ΡƒΠ³ΠΈΡ… возмоТностСй; Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… прСдлагаСтся Π² качСствС ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΉ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.14. ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ сортировки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Π»Π° Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -r, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС, Ρ‚. Π΅. Π² порядкС убывания. ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ -r Ρ€Π°Π±ΠΎΡ‚Π°Π» ΠΈ вмСстС с -n.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.15. Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -f, Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄Π΅Π»Π°Π»ΠΎ Π±Ρ‹ Π½Π΅Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΌΡ‹ΠΌΠΈ символы Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ рСгистров (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, a ΠΈ A Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ сравнСнии Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ).

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.16. ΠŸΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -d, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ заставит ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΡ€ΠΈ сравнСнии ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΡƒΠΊΠ²Ρ‹, Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹. ΠžΡ€Π³Π°Π½ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠΎΠ³ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ вмСстС с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ -f.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.17. Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с полями: Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сортировки ΠΏΠΎ полям Π²Π½ΡƒΡ‚Ρ€ΠΈ строк. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ поля прСдусмотритС свой Π½Π°Π±ΠΎΡ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ΠŸΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ этой ΠΊΠ½ΠΈΠ³ΠΈ (Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Π² Π²ΠΈΠ΄Ρƒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π» ΠΊΠ½ΠΈΠ³ΠΈ Π½Π° английским языкС. - ΠŸΡ€ΠΈΠΌΠ΅Ρ‡. ΠΏΠ΅Ρ€.) упорядочивался с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ: -df для Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ² ΠΈ -n для Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² страниц.

5.12 Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ объявлСния

Иногда Π‘ΠΈ Ρ€ΡƒΠ³Π°ΡŽΡ‚ Π·Π° синтаксис объявлСний, особСнно Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат Π² сСбС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π°ΠΊΠΈΠΌ синтаксис получился Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ нашСй ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌΠΈ объявлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΈΡ… использованиС. Π’ простых случаях этот синтаксис Ρ…ΠΎΡ€ΠΎΡˆ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² слоТных ситуациях ΠΎΠ½ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ затруднСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ объявлСния пСрСнасыщСны скобками ΠΈ ΠΈΡ… Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Π²ΡƒΡ… объявлСний:

int *f(); /* f: функция, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ ΡƒΠΊ-ль Π½Π° int */

int (*pf)(); /* pf: ΡƒΠΊ-ль Π½Π° Ρ„-Ρ†ΠΈΡŽ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ int */

ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ прСфиксного ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° * Π½ΠΈΠΆΠ΅, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ (), поэтому Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС скобки Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹.

Π₯отя Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΏΠΎ-настоящСму слоТныС объявлСния Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Ρ€Π΅Π΄ΠΊΠΎ, всС ΠΆΠ΅ Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈΡ… ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Π° Ссли потрСбуСтся, ΠΈ ΠΊΠ°ΠΊ ΠΈΡ… ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π£ΠΊΠ°ΠΆΠ΅ΠΌ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ способ: объявлСния ΠΌΠΎΠΆΠ½ΠΎ ΡΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, двигаясь нСбольшими шагами с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ typedef, этот способ рассмотрСн Π² ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ 6.7. Π’ настоящСм ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄Π²ΡƒΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΠΈΡ… прСобразования ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Π‘ΠΈ-объявлСний Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌ словСсныС описания ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, ΠΌΡ‹ дСмонстрируСм ΠΈΠ½ΠΎΠΉ способ конструирования объявлСний. БловСсноС описаниС читаСтся слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ.

ΠŸΠ΅Ρ€Π²Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, dcl, - Π±ΠΎΠ»Π΅Π΅ слоТная. Она ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π‘ΠΈ-объявлСния Π² словСсныС описания Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…:

char **argv

argv: ΡƒΠΊΠ°Π·. Π½Π° ΡƒΠΊΠ°Π·. Π½Π° char

int (*daytab)[13]

daytab: ΡƒΠΊΠ°Π·. Π½Π° массив[13] ΠΈΠ· int

int (*daytab)[13]

daytab: массив[13] ΠΈΠ· ΡƒΠΊΠ°Π·. Π½Π° int

void *comp()

comp: Ρ„ΡƒΠ½ΠΊΡ†. Π²ΠΎΠ·Π²Ρ€. ΡƒΠΊΠ°Π·. Π½Π° void

void (*comp)()

comp: ΡƒΠΊΠ°Π·. Π½Π° Ρ„ΡƒΠ½ΠΊΡ†. Π²ΠΎΠ·Π²Ρ€. void

char (*(*x())[])()

x: Ρ„ΡƒΠ½ΠΊΡ†. Π²ΠΎΠ·Π²Ρ€. ΡƒΠΊΠ°Π·. Π½Π° массив[] ΠΈΠ· ΡƒΠΊΠ°Π·. Π½Π° Ρ„ΡƒΠ½ΠΊΡ†. Π²ΠΎΠ·Π²Ρ€. char

char(*(*x[3])())[5]

x: массив[3] ΠΈΠ· ΡƒΠΊΠ°Π·. Π½Π° Ρ„ΡƒΠ½ΠΊΡ†. Π²ΠΎΠ·Π²Ρ€. ΡƒΠΊΠ°Π·. Π½Π° массив[5] ΠΈΠ· char

Ѐункция dcl Π² своСй Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ, ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ. Π­Ρ‚Π° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° строго ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π° Π² ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ 8.5 прилоТСния A, Π° Π² ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ записываСтся Ρ‚Π°ΠΊ:

ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ:              Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ * собствСнно-ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ

собствСнно-ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ:   имя

                         (ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ)

                         собствСнно-ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ()

                         собствСнно-ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ [Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€]

Говоря простым языком, ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ Π΅ΡΡ‚ΡŒ собствСнно-ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ, ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚ΠΎΡΡ‚ΡŒ * (Ρ‚. Π΅. ΠΎΠ΄Π½Π° ΠΈΠ»ΠΈ нСсколько Π·Π²Π΅Π·Π΄ΠΎΡ‡Π΅ΠΊ), Π³Π΄Π΅ собствСнно- ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ Π΅ΡΡ‚ΡŒ имя, ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ Π² скобках, ΠΈΠ»ΠΈ собствСнно-ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ°Ρ€ΠΎΠΉ скобок, ΠΈΠ»ΠΈ собствСнно-ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ°Ρ€ΠΎΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобок, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ Ρ€Π°Π·ΠΌΠ΅Ρ€.

Π­Ρ‚Ρƒ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для грамматичСского Ρ€Π°Π·Π±ΠΎΡ€Π° объявлСний. Рассмотрим, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ:

(*pfa[])()

Имя pfa Π±ΡƒΠ΄Π΅Ρ‚ классифицировано ΠΊΠ°ΠΊ имя ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠ°ΠΊ собствСнно- ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ. Π—Π°Ρ‚Π΅ΠΌ pfa[] Π±ΡƒΠ΄Π΅Ρ‚ распознано ΠΊΠ°ΠΊ собствСнно-ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ, Π° *pfa[] - ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, (*pfa[]) Π΅ΡΡ‚ΡŒ собствСнно-ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ. Π”Π°Π»Π΅Π΅, (*pfa[])() Π΅ΡΡ‚ΡŒ собствСнно-ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ. Π­Ρ‚ΠΎΡ‚ грамматичСский Ρ€Π°Π·Π±ΠΎΡ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ Ρ€Π°Π·Π±ΠΎΡ€Π°, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ страницС (Π³Π΄Π΅ собствСнно-ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»ΡŒ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ собств.-объяв.).

Π‘Π΅Ρ€Π΄Ρ†Π΅Π²ΠΈΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»Ρ являСтся ΠΏΠ°Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ dcl ΠΈ dirdcl, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΠΈΡ… грамматичСский Ρ€Π°Π·Π±ΠΎΡ€ объявлСния согласно ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° рСкурсивно, эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΊ Π΄Ρ€ΡƒΠ³Ρƒ рСкурсивно, ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ распознавания ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… частСй объявлСния. ΠœΠ΅Ρ‚ΠΎΠ΄, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ Π² обсуТдаСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ для грамматичСского Ρ€Π°Π·Π±ΠΎΡ€Π°, называСтся рСкурсивным спуском.

/* dcl: Ρ€Π°Π·Π±ΠΎΡ€ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»Ρ */

void dcl(void)

{

 int ns;


 for (ns = 0, gettoken() == '*';) /* подсчСт Π·Π²Π΅Π·Π΄ΠΎΡ‡Π΅ΠΊ */

  ns++;


 dirdcl();

 while(ns- β€Ί 0)

 strcat(out, "ΡƒΠΊΠ°Π·. Π½Π°");

}


/* dirdcl: Ρ€Π°Π·Π±ΠΎΡ€ собствСнно ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅Π»Ρ */

void dirdcl(void)

{

 int type;


 if (tokentype == '(') {

  dcl();

  if (tokentype != ')')

   printf("oшибкa: ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π°)\n");

 } else if (tokentype == NAME) /* имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ */

  strcpy(name, token);

 else

  printf("ошибка: Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ name ΠΈΠ»ΠΈ (dcl)\n");


 while((type = gettoken()) == PARENS || type == BRACKETS)

  if (type == PARENS)

   strcat(out, "Ρ„ΡƒΠ½ΠΊΡ†. Π²ΠΎΠ·Π²Ρ€.");

  else {

   strcat(out, " массив");

   strcat(out, token);

   strcat(out, " ΠΈΠ·");

  }

}

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ слуТат Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ цСлям ΠΈ Π½Π΅ Π²ΠΏΠΎΠ»Π½Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹. Π§Ρ‚ΠΎ касаСтся dcl, Ρ‚ΠΎ Π΅Π΅ возмоТности сущСствСнно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹. Она ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с простыми Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π²Ρ€ΠΎΠ΄Π΅ char ΠΈ int ΠΈ Π½Π΅ справляСтся с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² функциях ΠΈ с ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Π²Ρ€ΠΎΠ΄Π΅ const. Π›ΠΈΡˆΠ½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ для Π½Π΅Π΅ опасны. Она Π½Π΅ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΌΠ΅Ρ€ ΠΏΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Ρƒ ΠΈΠ· ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠΉ ситуации, ΠΈ поэтому Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ описания Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΠΉ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹. УстранСниС этих нСдостатков ΠΌΡ‹ оставляСм для ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΉ. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ главная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° main.

#include β€Ήstdio.hβ€Ί

#include β€Ήstring.hβ€Ί

#include β€Ήctype.hβ€Ί


#define MAXTOKEN 100


enum {NAME, PARENS, BRACKETS};


void dcl(void);

void dirdcl(void);


int gettoken(void);

int tokentype; /* Ρ‚ΠΈΠΏ послСднСй лСксСмы */

char token[MAXTOKEN]; /* тСкст послСднСй лСксСмы */

char name[MAXTOKEN]; /* имя */

char datatype[MAXTOKEN]; /* Ρ‚ΠΈΠΏ = char, int ΠΈ Ρ‚.Π΄. */

char out[1000]; /* Π²Ρ‹Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ тСкст */