Обсуждение K&R (Отрезано от "Посоветуйте книгу по С/С++")

Любые разговоры которые хоть как-то связаны с тематикой форума

Модератор: Модераторы разделов

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Обсуждение K&R

Сообщение Bizdelnick »

iУведомление от модератора Bizdelnick
С чего всё началось: Посоветуйте книгу по С/С++

fflatx писал(а):
21.01.2014 07:23
ИМХО, K&R тяжеловата для начинающего.

Категорически не согласен.

fflatx писал(а):
21.01.2014 07:23
Там местами есть такое, что для выполнения упражнений текущей главы, нужно знать материал следующих глав. Последовательно выполнять не получится.

Не припоминаю такого. Это где?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Обсуждение K&R

Сообщение Hephaestus »

Bizdelnick писал(а):
21.01.2014 08:47
Категорически не согласен.
Вы можете быть не согласны, но я, например, до конца её не осилил. Пока.
Именно по причине не совсем последовательного изложения.
Это при том, что я вообще-то с программированием знаком не понаслышке, то есть не начинающий.
А уж для начинающего будет ещё сложнее.
Откровенно говоря, когда делаешь упражнения и происходит затык, и ты понимаешь, что в этом месте нужно знание будущего материала, то как-то отпадает охота продолжать.

Bizdelnick писал(а):
21.01.2014 08:47
Не припоминаю такого. Это где?
Ну, напрмер. Вот.
Первая глава
В тексте приведен код программы
Spoiler

Код: Выделить всё

#define maxline 1000            /* maximum input line
                                 * size */
main()
{                               /* find longest line */
        int             len;    /* current line length */
        int             max;    /* maximum length seen
                                 * so far */
        char            line[maxline];  /* current input line */
        char            save[maxline];  /* longest line, saved */

        max = 0;
        while ((len = getline(line, maxline)) > 0)
                if (len > max) {
                        max = len;
                        copy(line, save);
                }
        if (max > 0)         /* there was a line */
                printf("%s", save);
}

getline(s, lim)                 /* get line into
                                 * s,return length */
        char            s[];
        int             lim;
{
        int             c, i;

        for (i = 0;
             i < lim - 1 && (c = getchar()) != EOF
                && c != '\n';
             ++i)
                s[i] = c;
        if (c == '\n') {
                s[i] = c;
                ++i;
        }
        s[i] = '\0';
        return (i);
}

copy(s1, s2)                    /* copy s1 to s2; assume
                                 * s2 big enough */
        char            s1[], s2[];
{
        int             i;
        i = 0;
        while ((s2[i] = s1[i]) != '\0')
                ++i;
}

ниже по тексту предлагаются упражнения.
Упражнение 1.14 (это по данному тексту, в разных изданиях номера упражнений могут не совпадать)
Упражнение 1-14.
Переделайте ведущую часть программы поиска самой длинной строки таким образом, чтобы она правильно печатала длины сколь угодно длинных вводимых строк и возможно больший текст.

В коде программы задано ограничение на длину строки в 1000 символов.
В упражнении предлагается преодолеть ограничения по длине.
То есть подразумевается динамическое выделение памяти, которое не рассматривается в первой главе.
Помнится, я пропустил данное упражнение и двинулся дальше. И где-то дальше по тексту был ещё подобный момент, уже не вспомню.
В результате, я решил ознакомиться с языком по другим книгам, а к K&R вернуться позже.

Допускаю, что переводчик неверно перевёл текст, а я неправильно понял смысл упражнения, но такая проблема возникла не только у меня, это обсуждалось в Сети.
Согласитесь, если в книге допущено неоднозначное восприятие текста, то это проблема книги (автора, переводчика, издателя), но не читателя.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Обсуждение K&R

Сообщение drBatty »

fflatx писал(а):
21.01.2014 09:52
Переделайте ведущую часть программы поиска самой длинной строки таким образом, чтобы она правильно печатала длины сколь угодно длинных вводимых строк и возможно больший текст.


В коде программы задано ограничение на длину строки в 1000 символов.
В упражнении предлагается преодолеть ограничения по длине.
То есть подразумевается динамическое выделение памяти

ты невнимателен. Тут надо только ПРОГРАММУ переделать так, что-бы убрать оттуда "maxlen". Т.е. сделать так, что-бы можно было поставить массив в 9001 байтов, и никаких других изменений не вносить.
fflatx писал(а):
21.01.2014 09:52
И где-то дальше по тексту был ещё подобный момент, уже не вспомню.

тоже наверное невнимательно прочитал. Увы...
fflatx писал(а):
21.01.2014 09:52
Допускаю, что переводчик неверно перевёл текст, а я неправильно понял смысл упражнения, но такая проблема возникла не только у меня, это обсуждалось в Сети.
Согласитесь, если в книге допущено неоднозначное восприятие текста, то это проблема книги (автора, переводчика, издателя), но не читателя.

ИМХО читателя, ибо K&R подразумевали, что читатель не знает про alloc(3). А ты -- знаешь. Вот и видишь потому другое решение. Типа Гаусса, который посчитал 1+2+3+..+100. Тоже учитель виноват, да?

fflatx писал(а):
21.01.2014 10:00
Ну прям. На K&R клин светом не сошёлся.
По одной книге судить о тупости - чересчур. Это во-первых.
А во-вторых, начинающему нужен учебник, а K&R - это НЕ учебник.

K&R это что-то типа Розенталя. Да, не учебник.
fflatx писал(а):
21.01.2014 10:00
Смысл? Сам Кнут рекомендует откладывать его книгу и подтягивать знания по вышке, если где-то ощущается нехватка, а потом возобновлять чтение. Это вполне нормальный процесс.
И также нормально начать с более простой книги, а потом взяться за Кнута.

ну да. А потом, когда ты возьмёшься за Кнута, ты уже будешь наперёд ЗНАТЬ его выводы. Причём в интерпретации "Рабинович напел".
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Обсуждение K&R

Сообщение bormant »

fflatx писал(а):
21.01.2014 09:52
В упражнении предлагается преодолеть ограничения по длине.
То есть подразумевается динамическое выделение памяти, которое не рассматривается в первой главе.
Нет, не подразумевается.
-- длины сколь угодно длинных вводимых строк: на самом деле по тем временам до long int, достаточно читать символ и увеличивать длину, если не конец строки, хранить символ не обязательно;
-- возможно больший текст, заметьте, а не весь: достаточно увеличить массив до максимально возможного значения, символы, выходящие за его пределы, не сохранять.
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Обсуждение K&R

Сообщение Hephaestus »

drBatty писал(а):
21.01.2014 10:23
ты невнимателен. Тут надо только ПРОГРАММУ переделать так, что-бы убрать оттуда "maxlen". Т.е. сделать так, что-бы можно было поставить массив в 9001 байтов, и никаких других изменений не вносить.
Если убрать maxline, надо переделать getline, потому что она принимает параметр - ограничение длины.
На тот момент я не сообразил, как сделать.

drBatty писал(а):
21.01.2014 10:23
ИМХО читателя, ибо K&R подразумевали, что читатель не знает про alloc(3). А ты -- знаешь.
Это я сейчас знаю, а тогда не знал. Я тогда вообще Си не знал.

drBatty писал(а):
21.01.2014 10:23
ну да. А потом, когда ты возьмёшься за Кнута, ты уже будешь наперёд ЗНАТЬ его выводы.
Я буду знать не его выводы, а выводы автора книги, которую прочитал до Кнута.
Выводы Кнута я узнаю, когда прочитаю Кнута. Не раньше.

Порог вхождения у Кнута достаточно высок.
Но это не значит, что его нельзя преодолеть.
И это совсем не повод отправлять в биореактор тех, кто не одолел сразу.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Обсуждение K&R

Сообщение Bizdelnick »

fflatx писал(а):
21.01.2014 09:52
То есть подразумевается динамическое выделение памяти, которое не рассматривается в первой главе.

Кем подразумевается? Вас же не просят строку сколь угодно большой длины, просят только её длину и "возможно больший текст". То есть, если я правильно понял условие, достаточно длины строки и её первых 1000 символов.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Обсуждение K&R

Сообщение Hephaestus »

bormant писал(а):
21.01.2014 10:27
по тем временам до long int
Вот в том-то и дело. По тем временам. То есть сегодня это из области домыслов.
Из текста книги не совсем ясно, что именно имели в виду авторы. Может, так как Вы говорите, а может и нет.
Это и есть то, что я назвал "неоднозначное восприятие текста".

bormant писал(а):
21.01.2014 10:27
достаточно читать символ и увеличивать длину, если не конец строки
Не достаточно. Если ориентироваться только на конец строки, можно получить переполнение long int.
Я прекрасно понимаю, что это переполнение может никого и не интересует, и не надо его отслеживать. И вообще важно уметь вовремя остановиться, решая задачу.
Но это бывает трудно сделать без чёткого и ясного ТЗ. А в условии задачи его нет.


Bizdelnick писал(а):
21.01.2014 10:49
Кем подразумевается? Вас же не просят строку сколь угодно большой длины, просят только её длину и "возможно больший текст". То есть, если я правильно понял условие, достаточно длины строки и её первых 1000 символов.
Наше обсуждение - свидетельство того, что упражнение в книге сформулировано неоднозначно.
Уже имеется три разных мнения по поводу трактовки условия задачи, включая моё.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Обсуждение K&R

Сообщение Bizdelnick »

fflatx писал(а):
21.01.2014 11:01
Если ориентироваться только на конец строки, можно получить переполнение long int.

Книга была написана в 1988 году. Разве тогда были компьютеры с >2G памяти?

fflatx писал(а):
21.01.2014 11:01
Уже имеется три разных мнения по поводу трактовки условия задачи, включая моё.

Вижу только два: Ваше и наше с bormant. Где третье-то?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Обсуждение K&R

Сообщение Hephaestus »

Bizdelnick писал(а):
21.01.2014 11:08
Книга была написана в 1988 году. Разве тогда были компьютеры с >2G памяти?
Переполнение возникнет сегодня, а не в 1988 году.
Задачи-то мы сегодня решаем.

ПыСы: Может, обсуждение задачи стоит отрезать?
А в теме оставить только рекомендации по книгам, а то мы увлеклись, как всегда. :)


Bizdelnick писал(а):
21.01.2014 11:08
Вижу только два: Ваше и наше с bormant. Где третье-то?
Не-не. Вы сказали: "достаточно первых 1000 символов".
bormant сказал: "в пределах long int".
А я понял условие "сколь угодно длинных строк" как "без ограничений вообще".
Вот вам три варианта.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Обсуждение K&R

Сообщение Bizdelnick »

fflatx писал(а):
21.01.2014 11:14
Переполнение возникнет сегодня, а не в 1988 году.

Переполнения не возникнет никогда, потому что никто никогда не будет настолько упорно тестировать решение задачи из учебника. Успокойтесь, предлагаю считать, что изначально Вы читали другой перевод (тот, который лежит на Флибусте) - там это упражнение действительно переведено неправильно.

fflatx писал(а):
21.01.2014 11:14
Не-не. Вы сказали "достаточно первых 1000 символов".
bormant сказал: "в пределах long int".

Длину - в пределах long int (для 1988 года - вполне себе "произвольная длина), строку - в пределах 1000 символов. Читайте внимательнее, мы оба имели в виду одно и то же.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Обсуждение K&R

Сообщение Hephaestus »

Bizdelnick писал(а):
21.01.2014 11:16
Длину - в пределах long int (для 1988 года - вполне себе "произвольная длина), строку - в пределах 1000 символов. Читайте внимательнее, мы оба имели в виду одно и то же.
Не совсем.
bormant про 1000 символов ничего не говорил.
Я его понял так, что максимально возможное значение массива - это в пределах long int.
Впрочем, он сам уточнит, если захочет.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Обсуждение K&R

Сообщение Bizdelnick »

fflatx писал(а):
21.01.2014 11:25
Впрочем, он сам уточнит, если захочет.

Вот именно, пусть он сам скажет, имел ли он в виду то же, что и я.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Обсуждение K&R

Сообщение Hephaestus »

Bizdelnick писал(а):
21.01.2014 11:16
Успокойтесь, предлагаю считать, что изначально Вы читали другой перевод (тот, который лежит на Флибусте) - там это упражнение действительно переведено неправильно.
Вы меня прямо заинтриговали. Не поленился, посмотрел на Флибусте.
Упражнение 1.16. Перепишите main предыдущей программы так, чтобы она могла печатать самую длинную строку без каких-либо ограничений на ее размер.
Действительно, даже мне ясно, что перевод неверный.

На том ресурсе, с которого я цитировал.
Упражнение 1-14.
Переделайте ведущую часть программы поиска самой длинной строки таким образом, чтобы она правильно печатала длины сколь угодно длинных вводимых строк и возможно больший текст.
Это ближе к оригиналу

Exercise 1-16.
Revise the main routine of the longest-line program so it will correctly print the length of arbitrary
long input lines, and as much as possible of the text.


Какой из двух вариантов был у меня - не помню.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Обсуждение K&R

Сообщение drBatty »

fflatx писал(а):
21.01.2014 10:41
Если убрать maxline, надо переделать getline, потому что она принимает параметр - ограничение длины.
На тот момент я не сообразил, как сделать.

угу. У этой проблемы есть много решений, вот это как в коде выше -- самое плохое. Malloc(3) лучше, но не единственное решение.
fflatx писал(а):
21.01.2014 10:41
Это я сейчас знаю, а тогда не знал. Я тогда вообще Си не знал.

ну значит знал какой-нить пхп с динамическими строчками.
fflatx писал(а):
21.01.2014 10:41
Я буду знать не его выводы, а выводы автора книги, которую прочитал до Кнута.

выводы автора другой книги явно или не явно заточены под частный случай. А у Кнута -- общий. Грубо говоря, в других книгах тебя учат складывать яблоки или деньги, а Кнут учит сложению.
fflatx писал(а):
21.01.2014 11:01
Из текста книги не совсем ясно, что именно имели в виду авторы.

AFAIK перевод кривой.
fflatx писал(а):
21.01.2014 11:01
Я прекрасно понимаю, что это переполнение может никого и не интересует, и не надо его отслеживать. И вообще важно уметь вовремя остановиться, решая задачу.

на самом деле -- нет. Вы физически не сможете ввести 2^31 символов.
Вот если-бы на входе был файл...
fflatx писал(а):
21.01.2014 11:01
Но это бывает трудно сделать без чёткого и ясного ТЗ. А в условии задачи его нет.

Вчера решал задачки для первого класса, там тоже нет чёткого ТЗ. Увы. Ничего страшного, мне сын подсказал, в чём там фишка.
fflatx писал(а):
21.01.2014 11:25
Я его понял так, что максимально возможное значение массива - это в пределах long int.

в принципе -- он прав. Ибо максимальный размер массива это size_t. Но во времена K&R size_t ещё не придумали, и оно называлось long int.

Женя Подсыпальни... писал(а):
21.01.2014 12:40
Читал с шариковой ручкой, чиркая по своей вещи,

не жалко? И вообще это с компьютером надо читать.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Обсуждение K&R

Сообщение bormant »

fflatx писал(а):
21.01.2014 11:25
Я его понял так, что максимально возможное значение массива - это в пределах long int.
Поняли неправильно.
-- длина -- до long int,
-- количество хранимых символов -- максимально возможное, с которым соберётся. При текущих знаниях на момент решения задачи -- не более сегмента реальной модели, что существенно меньше long int.
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Обсуждение K&R

Сообщение Hephaestus »

bormant писал(а):
21.01.2014 14:36
количество хранимых символов -- максимально возможное, с которым соберётся.
Но всё же не 1000 символов, как говорил Bizdelnick.
Значит, всё-таки имеем три различных трактовки условия задачи.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Обсуждение K&R

Сообщение bormant »

fflatx писал(а):
21.01.2014 14:39
Но всё же не 1000 символов, как говорил Bizdelnick.
Значит, всё-таки имеем три различных трактовки условия задачи.
Две. Не суть важно, чему именно равен maxline, важно, что мы 1) можем его увеличить насколько будет позволено, 2) продолжать считать количество символов, не сохраняя их при превышении maxline.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Обсуждение K&R

Сообщение Bizdelnick »

fflatx писал(а):
21.01.2014 14:39
Но всё же не 1000 символов, как говорил Bizdelnick.

Какая разница, 1000 или не 1000? Можно и больше, конечно, но всё равно это будет некое фиксированное значение. Я не стал этого уточнять, потому что важно не это, а то, что обязательно выводить всю строку целиком условия задачи не требуют.
Позвольте уж мне решать, что соответствует моей трактовке, а что - нет. :-)
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Обсуждение K&R

Сообщение drBatty »

fflatx писал(а):
21.01.2014 13:57
Я знал Паскаль, в котором - да, используется динамическое выделение памяти

ну вот. А в сишечке динамического выделения памяти строго говоря нет. Есть только стандартная опциональная malloc(3).
fflatx писал(а):
21.01.2014 13:57
Сын подсказал? А сам чего? Не сообразил? wink.gif
Предмет-то хоть какой?

математика. Там тоже условия не очень удачные...
Bish писал(а):
21.01.2014 14:15
в свои 39 лет

ну будь здоров. Получается, я тебя старше аж на 21 день. Ничего, что на ты? (:
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Обсуждение K&R

Сообщение Bizdelnick »

bormant писал(а):
21.01.2014 14:43
Не суть важно, чему именно равен maxline, важно, что мы 1) можем его увеличить насколько будет позволено, 2) продолжать считать количество символов, не сохраняя их при превышении maxline.

Именно так.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Обсуждение K&R

Сообщение Hephaestus »

Bizdelnick писал(а):
21.01.2014 14:44
Какая разница, 1000 или не 1000? Можно и больше, конечно, но всё равно это будет некое фиксированное значение. Я не стал этого уточнять, потому что важно не это, а то, что обязательно выводить всю строку целиком условия задачи не требуют.
Позвольте уж мне решать, что соответствует моей трактовке, а что - нет. :-)

Всё-таки вот это
Bizdelnick писал(а):
21.01.2014 10:49
То есть, если я правильно понял условие, достаточно длины строки и её первых 1000 символов.

И вот это
bormant писал(а):
21.01.2014 14:36
количество хранимых символов -- максимально возможное, с которым соберётся. При текущих знаниях на момент решения задачи -- не более сегмента реальной модели, что существенно меньше long int.

не одно и то же.

Значит оно (условие задачи) сформулировано неоднозначно.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Обсуждение K&R

Сообщение drBatty »

bormant писал(а):
21.01.2014 14:43
Не суть важно, чему именно равен maxline

ИМХО таки важно, потому-что в оригинальном коде это ЧИСЛО. Т.е. просто 1000. Числовая целая константа. А чем больше такого в коде, тем он хуже. Потому условие ИМХО надо понимать так: "уберите числовую константу из кода, и замените её переменной". Для других ЯП это не играет особой роли, а для C -- это важно. Потому-что в C числовые константы играют особую роль, и с разными константами получаются разные программы.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Обсуждение K&R

Сообщение Hephaestus »

drBatty писал(а):
21.01.2014 14:50
Потому условие ИМХО надо понимать так: "уберите числовую константу из кода, и замените её переменной".
Вот пожалуйста, ещё одна трактовка условия.

ИМХО, формулировка этой задачи допускает слишком много вариантов трактовки.
Поэтому, неудивительно, что кто-то с ней не справился. В таких случаях всегда остаётся сомнение: "А действительно ли я всё правильно понял?".
Новичку это совсем ни к чему. У него и без этого хватит, над чем подумать. Поэтому я и сказал, что для новичка книга не очень подходит. Это всё-таки не учебник.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Обсуждение K&R

Сообщение Bizdelnick »

fflatx писал(а):
21.01.2014 14:50
не одно и то же.

Значит оно (условие задачи) сформулировано неоднозначно.

Ещё раз: я не считаю в контексте этой задачи важным, сколько именно выведется символов. 1000 написал условно (думал ещё уточнить, что можно больше, но решил, что это и так понятно). Зачем пытаться трактовать мои слова за меня, когда можно просто спросить, что я имел в виду? Я же не drBatty, в конце концов.

fflatx писал(а):
21.01.2014 15:01
ИМХО, формулировка этой задачи допускает слишком много вариантов трактовки.
Поэтому, неудивительно, что кто-то с ней не справился. В таких случаях всегда остаётся сомнение: "А действительно ли я всё правильно понял?".
Новичку это совсем ни к чему. У него и без этого хватит, над чем подумать. Поэтому я и сказал, что для новичка книга не очень подходит. Это всё-таки не учебник.

Знания новичка ограничиваются уже прочитанным, так что до трактовки, предложенной drBatty, он в принципе не может дойти. Собственно, у меня тоже не получается её понять. Доктор, можно пример решения, который соответствовал бы такому условию?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Обсуждение K&R

Сообщение drBatty »

Bizdelnick писал(а):
21.01.2014 15:08
Знания новичка ограничиваются уже прочитанным, так что до трактовки, предложенной drBatty, он в принципе не может дойти. Собственно, у меня тоже не получается её понять. Доктор, можно пример решения, который соответствовал бы такому условию?

ну надо как-то поменять код так, что-бы он принимал любое число в виде переменной. Дело в том, что на самом деле, в этом коде 1000 намертво приколочено к коду. Ну его хотя-бы на sizof(line)/sizeof(line[0]) надо заменить. Раз уж пока нельзя ничего другого на этом этапе. Потом можно функцию написать, которая снаружи принимает массив с длиной. А потом уже и выделять память внутри этой функции.

Да, ТЗ не очень логичное, но что поделать? Между прочим IRL это скорее правило, когда в ТЗ требуют делить на ноль. Что тут такого?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Обсуждение K&R

Сообщение Hephaestus »

Bizdelnick писал(а):
21.01.2014 15:08
Ещё раз: я не считаю в контексте этой задачи важным, сколько именно выведется символов. 1000 написал условно (думал ещё уточнить, что можно больше, но решил, что это и так понятно). Зачем пытаться трактовать мои слова за меня, когда можно просто спросить, что я имел в виду?
Хорошо, пользуюсь случаем и спрашиваю:
Означает ли 1000 символов здесь
Bizdelnick писал(а):
21.01.2014 10:49
То есть, если я правильно понял условие, достаточно длины строки и её первых 1000 символов.
что Вы в своем решении задачи остаётесь в пределах константы maxline? Которая действительно задана равной 1000 символов.
Или это совпадение?
Если совпадение, тогда пардон, неправильно понял.

Bizdelnick писал(а):
21.01.2014 15:08
Знания новичка ограничиваются уже прочитанным, так что до трактовки, предложенной drBatty, он в принципе не может дойти.
Отчего же? Новичок в языке Си - не обязательно новичок во всём остальном.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Обсуждение K&R

Сообщение Bizdelnick »

fflatx писал(а):
21.01.2014 15:42
что Вы в своем решении остаётесь в пределах константы maxline? Которая действительно задана равной 1000 символов.
Или это совпадение?

Да, я остаюсь в пределах maxline. Не важно, 1000 она или сколько.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Обсуждение K&R

Сообщение drBatty »

fflatx писал(а):
21.01.2014 15:42
Отчего же? Новичок в языке Си - не обязательно новичок во всём остальном.

угу. И вообще, почему ты требуешь логичных задач в учебнике, если в жизни они не логичные? Привыкай, на практике это обычное дело:

повяжи мне бантик на хвост, но так, что-бы насморк больше не беспокоил!
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Обсуждение K&R

Сообщение Hephaestus »

Bizdelnick писал(а):
21.01.2014 15:44
Да, я остаюсь в пределах maxline. Не важно, 1000 она или сколько.
Ну вот, видите.

А bormant тоже остаётся в пределах константы maxline?
Ответьте, уважаемый bormant .

Потому что отсюда
bormant писал(а):
21.01.2014 14:36
количество хранимых символов -- максимально возможное, с которым соберётся. При текущих знаниях на момент решения задачи -- не более сегмента реальной модели, что существенно меньше long int.
такой вывод сделать не получается.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Обсуждение K&R

Сообщение Hephaestus »

Bizdelnick писал(а):
21.01.2014 11:16
предлагаю считать, что изначально Вы читали другой перевод (тот, который лежит на Флибусте) - там это упражнение действительно переведено неправильно.
Так и есть.

В моей книге упражнение выглядит так:
fflatx писал(а):
21.01.2014 11:55
Упражнение 1.16. Перепишите main предыдущей программы так, чтобы она могла печатать самую длинную строку без каких-либо ограничений на ее размер.


А вот как выглядит решение этой задачи, представленное на различных сайтах, а также в "Книге ответов" К.Тондо
Spoiler

Код: Выделить всё

#include <stdio.h>

#define MAXLINE 1000 /* maximum input line size */

int getline(char line[], int maxline);
void copy(char to[], char from[]);

/* print longest input line */
int main(void)
{
  int len;               /* current line length */
  int max;               /* maximum length seen so far */
  char line[MAXLINE];    /* current input line */
  char longest[MAXLINE]; /* longest line saved here */

  max = 0;

  while((len = getline(line, MAXLINE)) > 0)
  {
    printf("%d: %s", len, line);

    if(len > max)
    {
      max = len;
      copy(longest, line);
    }
  }
  if(max > 0)
  {
    printf("Longest is %d characters:\n%s", max, longest);
  }
  printf("\n");
  return 0;
}

/* getline: read a line into s, return length */
int getline(char s[], int lim)
{
  int c, i, j;

  for(i = 0, j = 0; (c = getchar())!=EOF && c != '\n'; ++i)
  {
    if(i < lim - 1)
    {
      s[j++] = c;
    }
  }
  if(c == '\n')
  {
    if(i <= lim - 1)
    {
      s[j++] = c;
    }
    ++i;
  }
  s[j] = '\0';
  return i;
}

/* copy: copy 'from' into 'to'; assume 'to' is big enough */
void copy(char to[], char from[])
{
  int i;

  i = 0;
  while((to[i] = from[i]) != '\0')
  {
    ++i;
  }
}


Стало быть, я понял задачу неправильно, даже с учётом нормального перевода.
Но поскольку я в этом не одинок - вопрос об этой задаче не раз появлялся в сети, значит, задача всё же сформулирована неоднозначно (по крайней мере, в русскоязычных изданиях) и может быть понята неправильно.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали: