LINUX.ORG.RU

[K&R]Не могу понять


0

1

Есть код с книги:

#include <stdio.h>

#define IN  1
#define OUT 0

main ()
{
  int c, nl, nw, nc, state;
  
  state = OUT;
  nl = nw = nc = 0;
  while ((c = getchar()) != EOF) {
    ++nc;
    if (c == '\n')
      ++nl;
    if (c == ' ' || c == '\n' || c == '\t')
      state = OUT;
    else if (state == OUT) {
      state = IN;
      ++nw;
    }
  }
  printf("\n%d %d %d\n", nl, nw, nc);  
}
Но не могу понять этот кусок кода, в книге ничего внятного не написано:
if (c == ' ' || c == '\n' || c == '\t')
      state = OUT;
    else if (state == OUT) {
      state = IN;
      ++nw;
    }

Я так понял этот код считает количество символов, строк и слов. В приведенном тобой куске кода проверяется является ли текущий символ одним из символов разрыва слова, если да, то запоминаем этот факт, если нет и до этого мы уже установили факт конца прошлого слова, то количество слов увеличиваем на один, и меняем состояние на то что мы сейчас «находимся» внутри слова.

Daeloce
()
Ответ на: комментарий от anonymous

Когда я отвечал твоего сообщения не было! :):):)

Daeloce
()
Ответ на: комментарий от anonymous

А что «чего непонятного?» Он же задал вопрос, в котором ясно видно, чего непонятного. Что непонятно чего непонятного?

cdshines ★★★★★
()

nw считает слова. представь что у тебя слова разделены двумя пробелами например и попробуй подумать ещё.

anonymous
()
Ответ на: комментарий от unC0Rr

Ничего удивительного, императивщина такая императивщина

Бгг, функциональщики слетаются на хеллоуворлды словно мухи на мёд :D

Manhunt ★★★★★
()

Не могу понять
[K&R]

Значит, надо закрыть Development и пойти в толкс, в песочницу или в детский сад.

anonymous
()
Ответ на: комментарий от Eddy_Em

Точно - не говорилось.

Пример из первой главы - раздел 1.5.4. Подсчёт слов.

Здесь главная задача - не применение библиотечных функций, а обработка вводимых/выводимых символов.

Первое упоминание функции isspace - в Главе 7.

И кстати: ТС нагло врёт - после примера, приведённого им в ОП, в K&R следуют три абзаца, в которых разъясняется вся программа. NoNameNoNumber, ты - {читай свою аву}. :)

OldFatMan
()
Ответ на: комментарий от OldFatMan

Насчет разъяснений согласен: я что-то не припомню ничего сложного в книге, что не было бы разложено по полочкам. Это вам не «Все про ТеХ» Кнутовский читать (его книжку я прочитал раза 4, и то не все понял: многие конструкции совершенно нетривиальны).

Eddy_Em ☆☆☆☆☆
()

программа, как я понимаю считает кол-во введенных символов (nc), строк (nl) и слов (nw).

Твой кусок надо читать так: если символ равен либо пробелу, либо переносу строки, либо табуляции, то значит у нас закончилось слово (state = OUT). Иначе, если флаг нового слова еще не поднят (state == OUT), поднимаем флаг нового слова (state = IN) и инкрементируем счетчик слов (++nw).

Turbid ★★★★★
()
Ответ на: комментарий от Turbid

пипец, как вредно открывать несколько вкладок и потом пытаться на них отвечать

Turbid ★★★★★
()
Ответ на: комментарий от Eddy_Em

Это вам не «Все про ТеХ» Кнутовский читать (его книжку я прочитал раза 4, и то не все понял: многие конструкции совершенно нетривиальны).

Вот это точно. Я так до сих пор больше двух глав и не осилил. :) Но я тех пользую на самом-самом примитивном уровне, поэтому мне в своё время для освоения на этом уровне хватило Тоботраса, Львовского и публикаций Балдина (Evgueni) и ещё некоторых материалов.

OldFatMan
()

ТС гугли конечные автоматы а то потом и не такое увидишь и не поймешь.

exception13 ★★★★★
()
Ответ на: комментарий от Eddy_Em

Ну это само собой. «Полное (почти) собрание сочинений» Кнута всегда под рукой. «Искусство программирования» и «Всё про ТеХ» в бумажном виде, остальное - в электронном.

OldFatMan
()
Ответ на: комментарий от OldFatMan

«Искусство программирования» я не осилил. Признаюсь честно. Уж больно нудный стиль изложения у Кнута. Я и над «Все про ТеХ» засыпал в сортире, а уж «Искусство программирования» вызывало приступы сна чуть ли не после прочтения одной страницы :)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Я скорей так, к слову сказал. Понятно что не изучение стандартной библиотеки есть целью упомянутой книги.

urxvt ★★★★★
()
Ответ на: комментарий от Eddy_Em

«Искусство программирования» я не осилил. Признаюсь честно.

Целиком - так и я не осилил. Но я и намеревался читать «ИП» от корки до корки, как художественную литературу. Первую главу первого тома - это, да, это «линейно» читал, т.к. основы излагаются. А остальное - по необходимости, в зависимости от стоящей задачи.

PS: Наверное, поэтому я до сих пор программист среднего уровня, звёзд с неба не хватающий, а не супер-пупер-гуру из забугорья. ;)))

OldFatMan
()
Ответ на: комментарий от OldFatMan

Этот кусок-то там не очень понятно было расписано. Учитывая, что там же не было написано, чтобы выполнить примеры из getchar надо было Ctrl+D нажимать.

NoNameNoNumber
() автор топика
Ответ на: комментарий от OldFatMan

s/я и намеревался/я и не намеревался/

Ептынть, когда же эти опечатки закончатся...

OldFatMan
()
Ответ на: комментарий от NoNameNoNumber

Этот кусок-то там не очень понятно было расписано.

Ну не зна-аю... Специально посмотрел - в следующем же абзаце всё ясно сказано и про state, и про IN, и про OUT. Вообще вся K&R написана - проще некуда. Никогда затруднений не было.

OldFatMan
()

state = IN и state = OUT - два состояния конечного автомата, в которых находится программа.
Первое - «в слове», второе «вне слоа».
При каждом считанном символе проверяем, если пробел, новая строка или табуляция - остаёмся в OUT, Иначе (любой другой символ) переходим в IN.

invy ★★★★★
()
Ответ на: комментарий от NoNameNoNumber

Возможно это мне немного непонятно, потому что я в программировании первые шаги делаю.

Да всё нормально, я сам когда-то так же начинал.

Просто в треде уже несколько комментов есть, в которых рассказывают практически то же самое, что и K&R, только немного другими словами.

А впрочем, как раз «пересказ другими словами» часто способствует пониманию, так что «всё правильно сделал», не обижайся за «наезд». ;)

OldFatMan
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.