1 Востаннє редагувалося Ярослав (07.03.2013 09:54:12)

Тема: Керніган і Рітчі, вправа 5.11

Доброго дня форумчанам!
Умова задачі наступна:

Вдоскональте програми entab і detab таким чином щоб через аргументи командного рядку можна було вказати список стопів табуляції.

Вправу я скоріш за все зможу виконати сам, але перш за все потрібно зрозуміти умову, в цьому і полягає проблема.
По-перше, я уже створив декілька тем по вправам entab і detab, найзмістовнішою із яких виявилась ця.
Дійсно, прочитавши статтю стає зрозуміло, що табуляція - це перш за все символ. Він надає терміналу інструкцію перемістити каретку на певну кількість знаків. Місце, в якому опиниться каретка після опрацювання терміналом інструкції, називається стоп табуляції.
Тепер приводжу код програми entab

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
  unsigned long tab=8, pos=1;
  int c;

  if (argc>1)
    tab = strtoul(argv[1],NULL,10);
  if (tab==0)
    tab=8;

  while ((c=getchar()) != EOF) {
    switch (c) {
      case '\t': c=' ';
                 while (pos++ < tab){
                  putchar(' ');
                }
      case '\n': pos=0;
    }
    putchar(c);
    if (pos==tab) pos=1;
    else pos++;
  }
  return (ferror(stdin) || ferror(stdout))?EXIT_FAILURE:EXIT_SUCCESS;
}

Автором цього коду є Flash Gordon.

А тепер повернімося до умови задачі. Все було б ясно якби потрібно було просто призначити змінній tab значення відповідне до аргументу командного рядку, проте в умові сказано задати список стопів табуляції, як це зрозуміти?

2

Re: Керніган і Рітчі, вправа 5.11

Наскільки я розумію, "стоп табуляції" позначає деяку позицію у рядку, на яку пересувається курсор (та'як у Word зроблено). Якщо програма консольна, стоп можна задати, наприклад, як значення позиції курсора по горизонталі.
Шляхи нашвидкуруч:
1. Вести облік введених символів у рядку (велосипед);
2. Використати щось на зразок віндової GetCursorPos() та для пересування по рядку - SetConsoleCursorPosition().

Задати стопи: масив позицій, наприклад (по горизонталі).

3 Востаннє редагувалося Ярослав (08.03.2013 05:09:13)

Re: Керніган і Рітчі, вправа 5.11

Пане Bartash, в тому то і справа. Навіщо нам цілий масив цих позицій? Може мається на увазі щось інше? В коді вище і так реалізоване задання стопу із аргументу командного рядка.

4

Re: Керніган і Рітчі, вправа 5.11

keithfay написав:

Пане Bartash, в тому то і справа. Навіщо нам цілий масив цих позицій? Може мається на увазі щось інше? В коді вище і так реалізоване задання стопу із аргументу командного рядка.

У коді вище наведений варіант для одного стопа, а вдосконалення просять, щоб дозволялося N стопів. Задати можна по-різному: текстовим параметром із розділителями, або ж окремими параметрами.
Так чи інакше, стопи - це просто певні позиції, тому саме масив значень фактично пояснює задачу, imho.

5

Re: Керніган і Рітчі, вправа 5.11

Тобто, щоб можна було використовувати за один раз декілька різних стопів чи додати в масив всі значення із аргументів, а використовувати лише одне?