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

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

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

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° подсчСта символов Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Π΅Ρ‚ сумму Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° long. Π¦Π΅Π»Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° long ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 32 Π±ΠΈΡ‚ΠΎΠ². Π₯отя Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… Ρ‚ΠΈΠΏΡ‹ int ΠΈ long ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… int Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 16 Π±ΠΈΡ‚ с максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 32767, Π° это - ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ малСнькоС число, ΠΈ счСтчик Ρ‚ΠΈΠΏΠ° int ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ. БпСцификация %ld Π² printf ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ long.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ больший Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ double (Ρ‚. Π΅. float с Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ). ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ for вмСсто while, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ написания Ρ†ΠΈΠΊΠ»Π°.

#include β€Ήstdio.hβ€Ί


/* подсчСт Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… символов; 2-ΠΉ вСрсия */

main()

{

 double nc;

 for (nc = 0; getchar() != EOF; ++nc)

  ;

 printf("%.0f\n", nc);

}

Π’ printf спСцификатор %f примСняСтся ΠΊΠ°ΠΊ для float, Ρ‚Π°ΠΊ ΠΈ для double; спСцификатор %.0f ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ Π±Π΅Π· дСсятичной Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈ Π΄Ρ€ΠΎΠ±Π½ΠΎΠΉ части (послСдняя Π² нашСм случаС отсутствуСт).

Π’Π΅Π»ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ for-Ρ†ΠΈΠΊΠ»Π° пусто, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΠΈ ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠΉ счСтчика Π΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Но ΠΏΡ€Π°Π²ΠΈΠ»Π° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π‘ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ for- Ρ†ΠΈΠΊΠ» ΠΈΠΌΠ΅Π» Ρ‚Π΅Π»ΠΎ. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого трСбования обСспСчиваСт изолированная Ρ‚ΠΎΡ‡ΠΊΠ° с запятой, называСмая пустой инструкциСй. ΠœΡ‹ поставили Ρ‚ΠΎΡ‡ΠΊΡƒ с запятой Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ строкС для большСй наглядности.

НаконСц, Π·Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ссли Π²Π²ΠΎΠ΄ Π½Π΅ содСрТит Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ символа, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ getchar условиС Π² while ΠΈΠ»ΠΈ for Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выдаст Π½ΡƒΠ»ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ. Одно ΠΈΠ· ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… свойств Ρ†ΠΈΠΊΠ»ΠΎΠ² while ΠΈ for состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ условиС провСряСтся Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ выполняСтся Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°. Если Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Π½Π°Π΄ΠΎ, Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒΡΡ ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, ΠΏΡƒΡΡ‚ΡŒ Π΄Π°ΠΆΠ΅ Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π° Π½Π΅ выполнится Π½ΠΈ Ρ€Π°Π·Ρƒ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° вСсти сСбя ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈ ΠΏΡ€ΠΈ Π½ΡƒΠ»Π΅Π²ΠΎΠΌ количСствС Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… символов. Π‘Π°ΠΌΠΎ устройство Ρ†ΠΈΠΊΠ»ΠΎΠ² while ΠΈ for Π΄Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² случаС Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹Ρ… условий.

1.5.3 ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ строк

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° подсчитываСт строки. Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° обСспСчиваСт Ρ‚Π°ΠΊΡƒΡŽ модСль Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ тСкстовый ΠΏΠΎΡ‚ΠΎΠΊ состоит ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ строк, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… заканчиваСтся символом Π½ΠΎΠ²ΠΎΠΉ строки. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, подсчСт строк сводится ΠΊ подсчСту числа символов Π½ΠΎΠ²ΠΎΠΉ строки.

#include β€Ήstdio.hβ€Ί

/* подсчСт строк Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° */

main()

{

 int c, nl;

 nl = 0;

 while ((с = getchar()) != EOF)

  if (c == '\n')

   ++nl;

 printf("%d\n", nl);

}

Π’Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ инструкция if, ΠΏΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ счСтчика nl Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ if провСряСт условиС Π² скобках ΠΈ, Ссли ΠΎΠ½ΠΎ истинно, выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π·Π° Π½ΠΈΠΌ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ (ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΡƒ инструкций, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΡƒΡŽ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки). ΠœΡ‹ ΠΎΠΏΡΡ‚ΡŒ Π΄Π΅Π»Π°Π΅ΠΌ отступы Π² тСкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‡Π΅ΠΌ управляСтся.

Π”Π²ΠΎΠΉΠ½ΠΎΠΉ Π·Π½Π°ΠΊ равСнства Π² языкС Π‘ΠΈ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ "Ρ€Π°Π²Π½ΠΎ" (ΠΎΠ½ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ = Π² ПаскалС ΠΈ .EQ. Π² Π€ΠΎΡ€Ρ‚Ρ€Π°Π½Π΅). Π£Π΄Π²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°ΠΊΠ° = Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° равСнство сдСлано для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‚ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠ³ΠΎ =, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² Π‘ΠΈ для обозначСния присваивания. ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅ΠΌ: Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π‘ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΠΈΡˆΡƒΡ‚ =, Π° ΠΈΠΌΠ΅ΡŽΡ‚ Π² Π²ΠΈΠ΄Ρƒ ==. Как ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π² Π³Π»Π°Π²Π΅ 2, Π² этом случаС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ допустимоС ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ компилятор Π½Π΅ выдаст Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ… сообщСний (Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ компиляторы, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π²Ρ‹Π΄Π°ΡŽΡ‚ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ ошибкС. - ΠŸΡ€ΠΈΠΌΠ΅Ρ‡. Ρ€Π΅Π΄.).

Π‘ΠΈΠΌΠ²ΠΎΠ», Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ Π² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ, прСдставляСт собой Ρ†Π΅Π»ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ€Π°Π²Π½ΠΎΠ΅ ΠΊΠΎΠ΄Ρƒ этого символа (Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅, принятой Π½Π° Π΄Π°Π½Π½ΠΎΠΉ машинС). Π­Ρ‚ΠΎ Ρ‚Π°ΠΊ называСмая символьная константа. БущСствуСт ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ для написания ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… Ρ†Π΅Π»Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. НапримСр, 'A' Π΅ΡΡ‚ΡŒ символьная константа, Π² Π½Π°Π±ΠΎΡ€Π΅ символов ASCII Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ равняСтся 65 - Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌΡƒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ символа A. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, 'A' Π² Ρ€ΠΎΠ»ΠΈ константы ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅, Ρ‡Π΅ΠΌ 65, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ смысл ΠΏΠ΅Ρ€Π²ΠΎΠΉ записи Π±ΠΎΠ»Π΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½, ΠΈ ΠΎΠ½Π° Π½Π΅ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ способа ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ символов.

ЭскСйп-ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² строковых константах, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Π² ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… константах. Π’Π°ΠΊ, '\n' ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ΄ символа Π½ΠΎΠ²ΠΎΠΉ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² ASCII Ρ€Π°Π²Π΅Π½ 10. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ '\n' ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ символ (ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ рассматриваСтся ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅), Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ "\n" - строковая константа, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ чисто случайно ΡƒΠΊΠ°Π·Π°Π½ ΠΎΠ΄ΠΈΠ½ символ. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ строковыми константами разбираСтся Π² Π³Π»Π°Π²Π΅ 2.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 1.8. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для подсчСта ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ², табуляций ΠΈ Π½ΠΎΠ²Ρ‹Ρ… строк.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 1.9. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ символы Π²Π²ΠΎΠ΄Π° Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‰ΡƒΡŽ стоящиС подряд ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ±Π΅Π».

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 1.10. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ символы Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ с Π·Π°ΠΌΠ΅Π½ΠΎΠΉ символа табуляции Π½Π° \t, символа забоя Π½Π° \b ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ Π½Π°ΠΊΠ»ΠΎΠ½Π½ΠΎΠΉ Ρ‡Π΅Ρ€Ρ‚Ρ‹ Π½Π° \\. Π­Ρ‚ΠΎ сдСлаСт Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ всС символы табуляции ΠΈ забоя.

1.5.4 ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ слов

ЧСтвСртая ΠΈΠ· нашСй сСрии ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ подсчитываСт строки, слова ΠΈ символы, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΠΎΠ΄ словом здСсь имССтся Π² Π²ΠΈΠ΄Ρƒ любая строка символов, Π½Π΅ содСрТащая Π² сСбС ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ², табуляций ΠΈ символов Π½ΠΎΠ²ΠΎΠΉ строки. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° являСтся ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠΉ вСрсиСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ wc систСмы UNIX.

#include β€Ήstdio.hβ€Ί


#define IN 1 /* Π²Π½ΡƒΡ‚Ρ€ΠΈ слова */

#define OUT 0 /* внС слова */


/* подсчСт строк, слов ΠΈ символов */

main()

{

 int с, nl, nw, nc, state;

 state = OUT;

 nl = nw = nc = 0;

 while ((с = getchar()) != EOF) {

  ++nc;

  if (c == '\n')

   ++nl;

  if (c == ' ' || c == '\n' || c == '\t')

   state = OUT;

  else if (state == OUT) {

   state = IN;

   ++nw;

  }

 }

 printf("%d %d %d\n", nl, nw, nc);

}

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, встрСчая ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ слова, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° измСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика слов Π½Π° 1. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ state фиксируСт Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС - находимся ΠΌΡ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈΠ»ΠΈ Π²Π½Π΅ слова. Π’Π½Π°Ρ‡Π°Π»Π΅ Π΅ΠΉ присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ OUT, Ρ‡Ρ‚ΠΎ соотвСтствуСт ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ "Π²Π½Π΅ слова". ΠœΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ константами IN ΠΈ OUT, Π° Π½Π΅ собствСнно значСниями 1 ΠΈ 0, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±ΠΎΠ»Π΅Π΅ понятной. Π’ Ρ‚Π°ΠΊΠΎΠΉ малСнькой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ этот ΠΏΡ€ΠΈΠ΅ΠΌ ΠΌΠ°Π»ΠΎ Ρ‡Ρ‚ΠΎ Π΄Π°Π΅Ρ‚, Π½ΠΎ Π² большой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π΅Π΅ ясности ΠΎΠΊΡƒΠΏΠ°Π΅Ρ‚ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ усилия, ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Ρ‚Π°ΠΊΠΎΠΌ стилС с самого Π½Π°Ρ‡Π°Π»Π°. Π’Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ большиС измСнСния Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»Π΅Π³Ρ‡Π΅ Π²Π½ΠΎΡΠΈΡ‚ΡŒ Π² Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… магичСскиС числа Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π²ΠΈΠ΄Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… констант.

Π‘Ρ‚Ρ€ΠΎΠΊΠ°

nl = nw = nc = 0;

устанавливаСт всС Ρ‚Ρ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² Π½ΡƒΠ»ΡŒ. Вакая запись Π½Π΅ являСтся ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ особой конструкциСй ΠΈ допустима ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ присваиваниС Π΅ΡΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ со своим собствСнным Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ присваивания Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ справа Π½Π°Π»Π΅Π²ΠΎ. Указанная строка эквивалСнтна

nl = (nw = (nc = 0));

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ || ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π˜Π›Π˜, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ строка

if (c == ' ' || c == '\n' || c == '\t')

читаСтся ΠΊΠ°ΠΊ "Ссли c Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π», ΠΈΠ»ΠΈ c Π΅ΡΡ‚ΡŒ новая строка, ΠΈΠ»ΠΈ c Π΅ΡΡ‚ΡŒ табуляция". (Напомним, Ρ‡Ρ‚ΠΎ видимая эскСйп-ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ \t ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ символ табуляции.) БущСствуСт Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ &&, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ И. Π•Π³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π²Ρ‹ΡˆΠ΅, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ||. ВыраТСния, связанныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ && ΠΈΠ»ΠΈ ||, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ; ΠΏΡ€ΠΈ этом гарантируСтся, Ρ‡Ρ‚ΠΎ вычислСния сразу прСрвутся, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΡƒΠ΄Π΅Ρ‚ установлСна ΠΈΡΡ‚ΠΈΠ½Π½ΠΎΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ условия. Если c Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π», Ρ‚ΠΎ дальшС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, являСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ c символом Π½ΠΎΠ²ΠΎΠΉ строки ΠΈΠ»ΠΈ ΠΆΠ΅ табуляции, Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Π’ этом частном случаС Π΄Π°Π½Π½Ρ‹ΠΉ способ вычислСний Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ Π²Π°ΠΆΠ΅Π½, Π½ΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π±ΠΎΠ»Π΅Π΅ слоТных ситуациях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ вскорС рассмотрим.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚Π°ΠΊΠΆΠ΅ встрСчаСтся слово else, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ дСйствия, выполняСмыС Π² случаС, ΠΊΠΎΠ³Π΄Π° условиС, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² if, Π½Π΅ являСтся истинным. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅ условная инструкция записываСтся Ρ‚Π°ΠΊ: