LINUX.ORG.RU

Опечатка в учебнике по программированию

 


1

1

Короче, программа:


#define yes 1
#define no 0

main()
{                               /* count lines, words,
                                 * chars in input */
        int             c, nl, nw, inword;

        inword = no;
        nl = nw = nc = 0;
        while ((c = getchar()) != EOF) {
                ++nc;
                if (с== '\n')
                        ++nl;
                if (c == ' ' || c == '\n' || c == '\t')
                        inword = no;
                else if (inword == no) {
                        inword = yes;
                        ++nw;
                }
        }
        printf("%d %d %d\n", nl, nw, nc);
}

Если ее пытаться скомпилировать:

user@devel-server:~/cl$ gcc ./or.c
./or.c: In function ‘main’:
./or.c:11:19: error: ‘nc’ undeclared (first use in this function)
         nl = nw = nc = 0;
                   ^
./or.c:11:19: note: each undeclared identifier is reported only once for each function it appears in
./or.c:12:35: error: ‘EOF’ undeclared (first use in this function)
         while ((c = getchar()) != EOF) {
                                   ^
./or.c:14:17: error: stray ‘\321’ in program
                 if (с== '\n')
                 ^
./or.c:14:17: error: stray ‘\201’ in program
./or.c:14:23: error: expected expression before ‘==’ token
                 if (с== '\n')
                       ^
./or.c:23:9: warning: incompatible implicit declaration of built-in function ‘printf’
         printf("%d %d %d\n", nl, nw, nc);
         ^

А вот прога с исправлениями:

#include <stdio.h>

#define YES 1
#define NO 0

int main() {
                               /* count lines, words,
                                 * chars in input */
        int             c, nl, nw, inword, nc;

        inword = NO;
        nl = NO;
        nw = NO;
        inword = NO;
        c = getchar();
        while (c != EOF) {
                ++nc;
                  if ( c == '\n' ){
                        ++nl;
                        }
                if (c == ' ' || c == '\n' || c == '\t') {
                        inword = NO;
                }
                else {
                if (inword == NO) {
                        inword = YES;
                        ++nw; 
                        }
                }
        c = getchar();
        }
        printf("%d %d %d\n", nl, nw, nc);
}

Вот учебник: http://linux.yaroslavl.ru/docs/prog/c/ch01.html#1.5.3 Короче, вот задание:

Переделайте программу подсчета слов, используя лучшее определение «слова»; считайте, например словом последовательность букв, цифр и апострофов, начинающуюся с буквы.

Вот вам и учебник!!!!! Его автор даже исходник на ошибки проверить не может!!!! P.S. Правильно назвать задание надо было бы:

Проверь программу подсчета строк на ошибки

★★★★★

Последнее исправление: DeadEye (всего исправлений: 3)

#include <stdio.h>

#define YES 1
#define NO 0

int main() {
                               /* count lines, words,
                                 * chars in input */
        int             c, nl, nw, inword, nc;

        inword = NO;
        nl = NO;
        nw = NO;
        inword = NO;
        c = getchar();
        while (c != EOF) {
                ++nc;
                  if ( c == '\n' ){
                        ++nl;
                        }
                if (c == ' ' || c == '\n' || c == '\t') {
                        inword = NO;
                }
                else {
                if (inword == NO) {
                        inword = YES;
                        ++nw; 
                        }
                        else { exit(); }
                }
        c = getchar();
        }
        printf("%d %d %d\n", nl, nw, nc);
}

Это моё исправление должно работать!

mr-proper
()

Продолжай наблюдение.

Stil ★★★★★
()

Че-то ты уже подзадолбал малость.

anonymous
()

Удалено по причине "Тупняк"

Я тут в помойке покопался, а там такое!!!1

Продолжай наблюдения.

Алсо:

ne-vlezay ★★  клоун/неосилятор; Регулярные выражения на C; Блокировать прохождение пакетов с маленьким mtu (комментарий)

Deleted
()
Последнее исправление: romeo250501 (всего исправлений: 1)

Продолжайте вести наблюдение, мы с вами свяжемся. Свободны!

melkor217 ★★★★★
()

За такие теги нужно убивать!

Свяжись с авторами/издательством. ЛОР то тут причем?

mandala ★★★★★
()

Ты бы лучше автору учебника написал, а не сюда.

anonymous
()

man ошибки при распознавании текста.

peregrine ★★★★★
()

Уважаемый! Не тебя ли послали учить более новое издание K&R, а не «Перевод с англ.В.В.Чуклова Москва, 1982 г.»?

K&R «Вильямс» 2009.

#include <stdio.h>
#define IN 1 /* внутри слова */
#define OUT 0 /* снаружи слова */
/* подсчет строк, слов и символов во входном потоке */
main() {
	int c, nl, nw, state, nc;
	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("%d _ %d\n", c, nl, nw, nc);
	}
	printf("%d %d %d\n", nl, nw, nc);
	return 0;
}

Компилим:
user:~$ cc ./a.c
user:~$

Запускаем. Тестируем. Погуглив, по ctrl+D в терминал посылаем EOF.
user:~$ ./a.out
qwe
ree
etr rttr ryyt ghghfgf ghghgf
3 7 37
[20:14]user:~$ 

Сколько раз ещё тебя послать учить по нормальной, относительно современной литературе? Или я что-то делаю не так, что у меня работают примеры из учебника?

Ignatov ★★★
()

Ты несмешной клоун и утомил, без обид.

anonymous
()

Охереть! Не поверите! И в вашем учебнике код примера рабочий;-)

И я хрен его знает, почему у вас не хватило мозгов в int дописать nc и исправить строку «if (c == '\n')». Пропущен пробел. Название «с» была написана в русской раскладке. Это не баг! Это особенности машинного перевода. Нам преподаватели в универе часто такие примеры подкидывали, заменив английские символы на русские. А вы, уважаемый, не копипастой пользуйтесь, в ручками переписывайте программный код. А то это уже превращается не изучение ЯП СИ, а в изучение комбинаций «ctrl+ с» и «ctrl + v»))) А также в размножение мусора на ЛОРе.

И да! Учимся читать сообщения компилятора. Там точно указывается и номер строки с ошибкой, и позиция.

Ignatov ★★★
()
Последнее исправление: Ignatov (всего исправлений: 2)

в учебнике опечатка, караул, да что же это такое творится хватит это терпеть ящитаю коко

Автор темы, ну бывают опечатки, разные компиляторы, не стоит этому удивляться...

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Комментом выше. Во топикстартера давно уже послали на более новое издание, а не 1982 года. Во вторых ТС попался на копипасте. Там символ в русской раскладке. Вместо того, чтобы подумать, ТС переписал пример на костыли, превратив «while do» в «do while» с предварительной проверкой. А инициализацию переписал на Pascal-style. Зачем мы учим СИ по K&R?...

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