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

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

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

for (…)

 for (…) {

  …

 if (disaster) /* Ссли бСдствиС */

  goto error; /* ΡƒΠΉΡ‚ΠΈ Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ */

error: /* ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибки */

 Π»ΠΈΠΊΠ²ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ бСспорядок

Вакая организация ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡƒΠ΄ΠΎΠ±Π½Π°, Ссли ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠΉ ситуации Π½Π΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π° ΠΈ ошибка ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… мСстах.

ΠœΠ΅Ρ‚ΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅. На ΠΌΠ΅Ρ‚ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ goto ΠΈΠ· любого мСста Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚. Π΅. ΠΌΠ΅Ρ‚ΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌΠ° Π½Π° протяТСнии всСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ качСствС Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Ρ‚Π°ΠΊΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ: ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π² массивах a ΠΈ b ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠ΅ элСмСнты. Один ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

for (i = 0; i β€Ή n; i++)

 for (j = 0; j β€Ή m; j++)

  if (a[i] == b[i])

   goto found;

/* Π½Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… элСмСнтов */

 β€¦

found:

/* ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ совпадСниС: a[i] - b[i] */

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ нахоТдСния ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΡ… элСмСнтов ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ Π±Π΅Π· goto, ΠΏΡ€Π°Π²Π΄Π°, Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΠ² Π·Π° это Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌΠΈ ΠΈ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:

found = 0;

for (i = 0; i β€Ή n && !found; i++)

 for (j = 0; j β€Ή m && !found; j++)

  if (a[i] == b[j])

   found = 1;

if (found) /* ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ совпадСниС: a[i-1] - b[j-1] */

 β€¦

else

 /* Π½Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… элСмСнтов */

 β€¦

Π—Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π΅Π΄ΠΊΠΈΡ… случаСв, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ goto, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π΅ для понимания ΠΈ сопровоТдСния, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅ ΠΆΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π±Π΅Π· goto. Π₯отя ΠΌΡ‹ ΠΈ Π½Π΅ Π΄ΠΎΠ³ΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ вопросС, всС ΠΆΠ΅ думаСтся, Ρ‡Ρ‚ΠΎ ΠΊ goto слСдуСт ΠΏΡ€ΠΈΠ±Π΅Π³Π°Ρ‚ΡŒ ΠΊΡ€Π°ΠΉΠ½Π΅ Ρ€Π΅Π΄ΠΊΠΎ, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π²ΠΎΠΎΠ±Ρ‰Π΅.

Π“Π»Π°Π²Π° 4. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ структура ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π·Π±ΠΈΠ²Π°ΡŽΡ‚ большиС Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ сдСлано Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ, Π° Π½Π΅ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ созданиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· "с нуля". Π’ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ функциях "упрятаны" нСсущСствСнныС для Π΄Ρ€ΡƒΠ³ΠΈΡ… частСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΈΡ… функционирования, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Ρ†Π΅Π»ΠΎΠΌ Π±ΠΎΠ»Π΅Π΅ ясной ΠΈ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ внСсСниС Π² Π½Π΅Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

Π―Π·Ρ‹ΠΊ проСктировался Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Ρ‹Π»ΠΈ эффСктивными ΠΈ простыми Π² использовании. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π‘ΠΈ состоят ΠΈΠ· большого числа Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Π½Π΅ ΠΈΠ· Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΡ… Π±ΠΎΠ»ΡŒΡˆΠΈΡ…. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… исходных Ρ„Π°ΠΉΠ»Π°Ρ…. Π­Ρ‚ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, Π° Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ вмСстС, Π² Ρ‚ΠΎΠΌ числС ΠΈ с Ρ€Π°Π½Π΅Π΅ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹ΠΌΠΈ функциями. ΠŸΡ€ΠΎΡ†Π΅ΡΡ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ здСсь Π½Π΅ рассматриваСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ Π² Ρ€Π°Π·Π½Ρ‹Ρ… систСмах.

ОбъявлСниС ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ - это Ρ‚Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Π³Π΄Π΅ стандартом ANSI Π² язык внСсСны самыС сущСствСнныС измСнСния. Как ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² Π³Π»Π°Π²Π΅ 1, Π² описании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Бинтаксис опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ объявлСния ΠΈ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ. Π­Ρ‚ΠΎ позволяСт компилятору ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большС ошибок, Ρ‡Π΅ΠΌ Ρ€Π°Π½ΡŒΡˆΠ΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ. Ссли Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ прСобразования Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ автоматичСски.

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

4.1 ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ свСдСния ΠΎ функциях

НачнСм с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ сконструируСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‰ΡƒΡŽ Ρ‚Π΅ строки Π²Π²ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ тСкста, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТится Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ "ΠΎΠ±Ρ€Π°Π·Π΅Ρ†", Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π² Π²ΠΈΠ΄Π΅ строки символов. (Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСдставляСт собой частный случай Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ grep систСмы UNIX.) Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ поиска ΠΎΠ±Ρ€Π°Π·Ρ†Π° "ould" Π² строках тСкста

Ah Love! could you and I with Fate conspire

To grasp this sorry Scheme of Things entire,

Would not we shatter it to bits - and then

Re-mould it nearer to The Heart's Desire!

ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ

Ah Love! could you and I with Fate conspire

Would not we shatter it to bits - and then

Re-mould it nearer to the Heart's Desire!

Π Π°Π±ΠΎΡ‚Π° ΠΏΠΎ поиску ΠΎΠ±Ρ€Π°Π·Ρ†Π° Ρ‡Π΅Ρ‚ΠΊΠΎ распадаСтся Π½Π° Ρ‚Ρ€ΠΈ этапа:

while (сущСствуСт Π΅Ρ‰Π΅ строка)

if (строка содСрТит ΠΎΠ±Ρ€Π°Π·Π΅Ρ†)

Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Π΅Π΅

Π₯отя всС Ρ‚Ρ€ΠΈ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ процСсса поиска ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main, всС ΠΆΠ΅ Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ структуру ΠΈ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π΅Π΅ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π›Π΅Π³Ρ‡Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с трСмя нСбольшими частями, Ρ‡Π΅ΠΌ с ΠΎΠ΄Π½ΠΎΠΉ большой, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ, Ссли нСсущСствСнныС особСнности Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ скрыты Π² функциях, Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈΡ… Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ воздСйствия Π΄Ρ€ΡƒΠ³ Π½Π° Π΄Ρ€ΡƒΠ³Π° минимальна. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ части ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ….

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ "while (сущСствуСт Π΅Ρ‰Π΅ строка)" Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² getline (см. Π³Π»Π°Π²Ρƒ 1), Π° Ρ„Ρ€Π°Π·Ρƒ "Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Π΅Π΅" ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π°ΠΌ остаСтся пСрСвСсти Π½Π° Π‘ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ опрСдСляСт, Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π»ΠΈ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† Π² строку.

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту Π·Π°Π΄Π°Ρ‡Ρƒ, ΠΌΡ‹ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ strindex(s,t), которая ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ мСсто (индСкс) Π² строкС s, Π³Π΄Π΅ начинаСтся строка t, ΠΈΠ»ΠΈ -1, Ссли s Π½Π΅ содСрТит t. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² Π‘ΠΈ нумСрация элСмСнтов Π² массивах начинаСтся с нуля, ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число -1 ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Π² качСствС ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ° Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ поиска. Если Π΄Π°Π»Π΅Π΅ Π½Π°ΠΌ потрСбуСтся Π±ΠΎΠ»Π΅Π΅ слоТноС отоТдСствлСниС ΠΏΠΎ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ, ΠΌΡ‹ просто Π·Π°ΠΌΠ΅Π½ΠΈΠΌ strindex Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, оставив ΠΏΡ€ΠΈ этом ΠΎΡΡ‚Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. (БиблиотСчная функция strstr Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strindex ΠΈ отличаСтся ΠΎΡ‚ послСднСй Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ индСкс, Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ.)

ПослС Ρ‚Π°ΠΊΠΎΠ³ΠΎ проСктирования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΅Π΅ "Π΄Π΅Ρ‚Π°Π»ΠΈΡ€ΠΎΠ²ΠΊΠ°" оказываСтся ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠΉ. ΠœΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ прСдставлСниС ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π² Ρ†Π΅Π»ΠΎΠΌ ΠΈ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π΅Π΅ части. Π’ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† для поиска задаСтся строкой-Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сниТаСт Π΅Π΅ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π’ Π³Π»Π°Π²Π΅ 5 ΠΌΡ‹ Π΅Ρ‰Π΅ вСрнСмся ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… массивов ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ, устанавливаСмым ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π—Π΄Π΅ΡΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° нСсколько измСнСнная вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getline, ΠΈ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΅Π΅ с вСрсиСй, рассмотрСнной Π² Π³Π»Π°Π²Π΅ 1.

#include β€Ήstdio.hβ€Ί

#define MAXLINE 1000 /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄ΠΈΠΌΠΎΠΉ строки */


int getline(char line[], int max);

int strindex(char source[], char searchfor[]);


char pattern[] ="ould"; /* ΠΎΠ±Ρ€Π°Π·Π΅Ρ† для поиска */


/* Π½Π°ΠΉΡ‚ΠΈ всС строки, содСрТащиС ΠΎΠ±Ρ€Π°Π·Π΅Ρ† */


main()

{

 char line[MAXLINE];

 int found = 0;

 while (getline(line, MAXLINE) β€Ί 0)

  if (strindex(line, pattern) β€Ί= 0) {

   printf ("%s", line);

   found++;

  }

 return found;

}


/* getline: Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ строку Π² s, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ */

int getline(char s[], int lim)

{

 int c, i;

 i = 0;

 while (--lim β€Ί 0 && (c=getchar()) != EOF && с != '\n') /* I.B.: misprint was here -lim instead of --lim */

  s[i++] = c;

 if (c == '\n')

  s[i++] = c;

 s[i] = '\0';

 return i;

}


/* strindex: вычисляСт мСсто t Π² s ΠΈΠ»ΠΈ Π²Ρ‹Π΄Π°Π΅Ρ‚ -1, Ссли t Π½Π΅Ρ‚ Π² s */

int strindex (char s[], char t[])

{

 int i, j, k;

 for (i = 0; s[i] != '\0'; i++) {

  for (j = i, k = 0; t[k] !=  '\0' && s[j] == t[k]; j++, k++)

   ;

  if (k β€Ί 0 && t[k] == '\0')

   return i;

 }

 return -1;

}

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ любой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

Ρ‚ΠΈΠΏ-Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° имя-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (объявлСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²)

{

 ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡ ΠΈ инструкции

}

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ части опрСдСлСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ "минимальной" Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

dummy() {}

которая Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ вычисляСт ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚. Вакая Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°ΡŽΡ‰Π°Ρ функция Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½Π° Π² качСствС "хранитСля мСста". Если Ρ‚ΠΈΠΏ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΎΠΏΡƒΡ‰Π΅Π½, Ρ‚ΠΎ прСдполагаСтся, Ρ‡Ρ‚ΠΎ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° int.

Π›ΡŽΠ±Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° - это просто ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Бвязи ΠΌΠ΅ΠΆΠ΄Ρƒ функциями ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния ΠΈ внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Π’ исходном Ρ„Π°ΠΉΠ»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π² любом порядкС; ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° любоС число Ρ„Π°ΠΉΠ»ΠΎΠ², Π½ΠΎ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ оказалась Ρ€Π°Π·Ρ€Π΅Π·Π°Π½Π½ΠΎΠΉ.