i Уведомление от модератора Bizdelnick С чего всё началось: Посоветуйте книгу по С/С++
Категорически не согласен.
Не припоминаю такого. Это где?
Модератор: Модераторы разделов
i Уведомление от модератора Bizdelnick С чего всё началось: Посоветуйте книгу по С/С++
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Вы можете быть не согласны, но я, например, до конца её не осилил. Пока.
Ну, напрмер. Вот.
Код: Выделить всё
#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.
Переделайте ведущую часть программы поиска самой длинной строки таким образом, чтобы она правильно печатала длины сколь угодно длинных вводимых строк и возможно больший текст.
fflatx писал(а): ↑21.01.2014 09:52Переделайте ведущую часть программы поиска самой длинной строки таким образом, чтобы она правильно печатала длины сколь угодно длинных вводимых строк и возможно больший текст.
В коде программы задано ограничение на длину строки в 1000 символов.
В упражнении предлагается преодолеть ограничения по длине.
То есть подразумевается динамическое выделение памяти
fflatx писал(а): ↑21.01.2014 09:52Допускаю, что переводчик неверно перевёл текст, а я неправильно понял смысл упражнения, но такая проблема возникла не только у меня, это обсуждалось в Сети.
Согласитесь, если в книге допущено неоднозначное восприятие текста, то это проблема книги (автора, переводчика, издателя), но не читателя.
Нет, не подразумевается.
Если убрать maxline, надо переделать getline, потому что она принимает параметр - ограничение длины.
Это я сейчас знаю, а тогда не знал. Я тогда вообще Си не знал.
Я буду знать не его выводы, а выводы автора книги, которую прочитал до Кнута.
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Вот в том-то и дело. По тем временам. То есть сегодня это из области домыслов.
Не достаточно. Если ориентироваться только на конец строки, можно получить переполнение long int.
Наше обсуждение - свидетельство того, что упражнение в книге сформулировано неоднозначно.Bizdelnick писал(а): ↑21.01.2014 10:49Кем подразумевается? Вас же не просят строку сколь угодно большой длины, просят только её длину и "возможно больший текст". То есть, если я правильно понял условие, достаточно длины строки и её первых 1000 символов.
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Переполнение возникнет сегодня, а не в 1988 году.Bizdelnick писал(а): ↑21.01.2014 11:08Книга была написана в 1988 году. Разве тогда были компьютеры с >2G памяти?
Не-не. Вы сказали: "достаточно первых 1000 символов".
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Не совсем.Bizdelnick писал(а): ↑21.01.2014 11:16Длину - в пределах long int (для 1988 года - вполне себе "произвольная длина), строку - в пределах 1000 символов. Читайте внимательнее, мы оба имели в виду одно и то же.
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Вы меня прямо заинтриговали. Не поленился, посмотрел на Флибусте.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.
Поняли неправильно.
Но всё же не 1000 символов, как говорил Bizdelnick.
Две. Не суть важно, чему именно равен maxline, важно, что мы 1) можем его увеличить насколько будет позволено, 2) продолжать считать количество символов, не сохраняя их при превышении maxline.
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Bizdelnick писал(а): ↑21.01.2014 14:44Какая разница, 1000 или не 1000? Можно и больше, конечно, но всё равно это будет некое фиксированное значение. Я не стал этого уточнять, потому что важно не это, а то, что обязательно выводить всю строку целиком условия задачи не требуют.
Позвольте уж мне решать, что соответствует моей трактовке, а что - нет. :-)
Bizdelnick писал(а): ↑21.01.2014 10:49То есть, если я правильно понял условие, достаточно длины строки и её первых 1000 символов.
Вот пожалуйста, ещё одна трактовка условия.
fflatx писал(а): ↑21.01.2014 15:01ИМХО, формулировка этой задачи допускает слишком много вариантов трактовки.
Поэтому, неудивительно, что кто-то с ней не справился. В таких случаях всегда остаётся сомнение: "А действительно ли я всё правильно понял?".
Новичку это совсем ни к чему. У него и без этого хватит, над чем подумать. Поэтому я и сказал, что для новичка книга не очень подходит. Это всё-таки не учебник.
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Bizdelnick писал(а): ↑21.01.2014 15:08Знания новичка ограничиваются уже прочитанным, так что до трактовки, предложенной drBatty, он в принципе не может дойти. Собственно, у меня тоже не получается её понять. Доктор, можно пример решения, который соответствовал бы такому условию?
Хорошо, пользуюсь случаем и спрашиваю:Bizdelnick писал(а): ↑21.01.2014 15:08Ещё раз: я не считаю в контексте этой задачи важным, сколько именно выведется символов. 1000 написал условно (думал ещё уточнить, что можно больше, но решил, что это и так понятно). Зачем пытаться трактовать мои слова за меня, когда можно просто спросить, что я имел в виду?
что Вы в своем решении задачи остаётесь в пределах константы maxline? Которая действительно задана равной 1000 символов.Bizdelnick писал(а): ↑21.01.2014 10:49То есть, если я правильно понял условие, достаточно длины строки и её первых 1000 символов.
Отчего же? Новичок в языке Си - не обязательно новичок во всём остальном.Bizdelnick писал(а): ↑21.01.2014 15:08Знания новичка ограничиваются уже прочитанным, так что до трактовки, предложенной drBatty, он в принципе не может дойти.
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Ну вот, видите.Bizdelnick писал(а): ↑21.01.2014 15:44Да, я остаюсь в пределах maxline. Не важно, 1000 она или сколько.
такой вывод сделать не получается.
Так и есть.Bizdelnick писал(а): ↑21.01.2014 11:16предлагаю считать, что изначально Вы читали другой перевод (тот, который лежит на Флибусте) - там это упражнение действительно переведено неправильно.
Код: Выделить всё
#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;
}
}