1 Востаннє редагувалося Ярослав (09.11.2012 11:20:11)

Тема: Керніган і Рітчі вправа 1-20

Exercise 1-20. Write a program detab that replaces tabs in the input with the proper number of blanks to space to the next tab stop. Assume a fixed set of tab stops, say every n columns.
Should n be a variable or a symbolic parameter? 

Допоможіть уловити суть завдання. Зрозуміло що необхідно замінити \t на певну кількість пробілів, але що значить Assume a fixed set of tab stops, say every n columns. і як розуміти Should n be a variable or a symbolic parameter? До чого тут взагалі стовпчики?

Білий Лунь

2

Re: Керніган і Рітчі вправа 1-20

Assume a fixed set of tab stops, say every n columns.

Думає це означає що передбачається фіксована кількість символів blank замість одного символу tab. І ця кількість напевне має бути рівна n. Але я не впевнений бо ніколи не вирішував схожі задачки.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }
Подякували: Ярослав1

3 Востаннє редагувалося Ярослав (09.11.2012 19:03:56)

Re: Керніган і Рітчі вправа 1-20

Найпростіший спосіб

#include <stdio.h>

main(){
    int c;

    while((c = getchar()) != EOF)
        if(c == '\t'){
            putchar(' ');
            putchar(' ');
            putchar(' ');
            putchar(' ');
            putchar(' ');
        }else{
        putchar(c);
        }

    return 0;
}
Білий Лунь

4

Re: Керніган і Рітчі вправа 1-20

Із використанням зовнішніх змінних

#include <stdio.h>
#define MAX 100
int ts, i;
char arr[MAX];
int detab(void);

main(){
    extern int ts, i;
    extern char arr[];
    ts = 5;

    while(detab() < MAX){
    printf("%s\n", arr);
    printf("%d\n", i);
    }

    return 0;

}

int detab(void){
    int c, j;
    i = 0;
    extern int ts , i;
    extern char arr[];

    while((c = getchar()) != EOF && i < MAX && c != '\n'){
        if(c == '\t'){
            for(j = i; j < i+ts; j++)
            arr[j] = ' ';
            i = j;
        }else{
        arr[i] = c;
        i++;
        }
    }

    return i;
}
Білий Лунь

5

Re: Керніган і Рітчі вправа 1-20

Табуляція взагалі то специфічний символ і не дорівнює певній кількості пробілів. Погугліть на цю тему. В російській вікіпедії непогано написано.
Мій приклад:

printf("a\tb\tc\n");
printf("12\t4\t23\n");
Подякували: Ярослав1

6

Re: Керніган і Рітчі вправа 1-20

#include <stdio.h>
#define MAXLINE 1024

int getline(char *line, int max);

int main(int argc, char *argv[])
{
char c;
int i = 0, tab = 8;
// i - Поточна позиція (кількість знаків)
// tab - Кількість символів, яка відповідає розміру табуляції
while( (c = getchar()) != EOF){
i++;
if(c == '\t'){
c = ' ';
while(i < tab){
printf(" ");
i++;
}
}
if(i == tab)
i = 0;
putchar(c);
if(c == '\n')
i = 0;
}
return 0;
}
Білий Лунь