2013年4月6日土曜日

開発環境

プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第1章(やさしい入門)、1.9(文字配列)の演習 1-16、1-17、1-18、1-19を解いてみる。

その他参考書籍

演習 1-16.

コード

sample.c

#include <stdio.h>
#define MAXLINE 1000

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

int main()
{
    int len;
    int max;
    char line[MAXLINE];
    char longest[MAXLINE];
    
    max = 0;
    while ((len = my_getline(line, MAXLINE)) > 0) {
        printf("%d, %s", len, line);
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    }
    if (max > 0)
        printf("%s", longest);
    return 0;
}

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

void copy(char to[], char from[])
{
    int i;
    
    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

入出力結果(Terminal)

$ cat sample.c | ./a.out
19, #include <stdio.h>
21, #define MAXLINE 1000
1, 
42, int my_getline(char line[], int maxline);
35, void copy(char to[], char from[]);
1, 
11, int main()
2, {
13,     int len;
13,     int max;
24,     char line[MAXLINE];
27,     char longest[MAXLINE];
5,     
13,     max = 0;
52,     while ((len = my_getline(line, MAXLINE)) > 0) {
37,         printf("%d, %s", len, line);
25,         if (len > max) {
23,             max = len;
33,             copy(longest, line);
10,         }
6,     }
17,     if (max > 0)
31,         printf("%s", longest);
14,     return 0;
2, }
1, 
34, int my_getline(char s[], int lim)
2, {
17,     int c, i, j;
5,     
11,     j = 0;
58,     for (i = 0;  (c = getchar()) != EOF && c !='\n'; ++i)
27,         if (i < lim - 2) {
22,             s[j] = c;
17,             ++j;
10,         }
21,     if (c == '\n') {
18,         s[j] = c;
13,         ++i;
13,         ++j;
6,     }
17,     s[j] = '\0';
14,     return i;
2, }
1, 
34, void copy(char to[], char from[])
2, {
11,     int i;
5,     
11,     i = 0;
38,     while ((to[i] = from[i]) != '\0')
13,         ++i;
2, }
    for (i = 0;  (c = getchar()) != EOF && c !='\n'; ++i)
$ ./a.out
1
2, 1
12345
6, 12345
12 
3, 12
1234
5, 1234
123
4, 123
12345
6, 12345
67890
6, 67890
12345
$ ./a.out
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 
1000, 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
1001, 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678
12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678
$

演習 1-17.

コード

sample.c

#include <stdio.h>
#define MAXLINE 1000
#define MINLENGTH 80

int my_getline(char line[], int maxline);

int main()
{
    int len;
    char line[MAXLINE];
    
    while ((len = my_getline(line, MAXLINE)) > 0)
        if (len > MINLENGTH)
            printf("%s", line);
    return 0;
}

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

入出力結果(Terminal)

$ ./a.out
1234677890
12346778901234677890
123467789012346778901234677890
1234677890123467789012346778901234677890
12346778901234677890123467789012346778901234677890
123467789012346778901234677890123467789012346778901234677890
1234677890123467789012346778901234677890123467789012346778901234677890
12346778901234677890123467789012346778901234677890123467789012346778901234677890
12346778901234677890123467789012346778901234677890123467789012346778901234677890
1234677890123467789012346778901234677890123467789012346778901234677890123467789 
123467789012346778901234677890123467789012346778901234677890123467789012346778901
123467789012346778901234677890123467789012346778901234677890123467789012346778901
123467789012346778901234677890123467789012346778901234677890123467789012346778901234677890
123467789012346778901234677890123467789012346778901234677890123467789012346778901234677890
$ cat sample.c|./a.out

演習 1-18.

コード

sample.c

#include <stdio.h>
#define MAXLINE 1000

int my_getline(char line[], int maxline);
int my_remove(char line[]);

int main()
{
    char line[MAXLINE];
    
    while (my_getline(line, MAXLINE) > 0)
        if (my_remove(line) > 0)
            printf("%s", line);
    return 0;
}

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

int my_remove(char line[])
{
    int c, i;
    i = 0;
    while (line[i] != '\n')
        ++i;
    --i;
    while ( i >= 0 && (line[i] == ' ' || line[i] == '\t'))
        --i;
    if (i >= 0) {
        ++i;
        line[i] = '\n';
        ++i;
        line[i] = '\0';
    }
    return i;
}

入出力結果(Terminal)

$ cat sample.c | ./a.out
#include <stdio.h>
#define MAXLINE 1000
int my_getline(char line[], int maxline);
int my_remove(char line[]);
int main()
{
    char line[MAXLINE];
    while (my_getline(line, MAXLINE) > 0)
        if (my_remove(line) > 0)
            printf("%s", line);
    return 0;
}
int my_getline(char s[], int lim)
{
    int c, i, j;
    j = 0;
    for (i = 0;  (c = getchar()) != EOF && c !='\n'; ++i)
        if (i < lim - 2) {
            s[j] = c;
            ++j;
        }
    if (c == '\n') {
        s[j] = c;
        ++i;
        ++j;
    }
    s[j] = '\0';
    return i;
}
int my_remove(char line[])
{
    int c, i;
    i = 0;
    while (line[i] != '\n')
        ++i;
    --i;
    while ( i >= 0 && (line[i] == ' ' || line[i] == '\t'))
        --i;
    if (i >= 0) {
        ++i;
        line[i] = '\n';
        ++i;
        line[i] = '\0';
    }
    return i;
}
$

演習 1-19.

コード

sample.c

#include <stdio.h>
#define MAXLINE 1000

int my_getline(char line[], int maxline);
void reverse(char line[]);

int main()
{
    char line[MAXLINE];
    
    while (my_getline(line, MAXLINE) > 0) {
        reverse(line);
        printf("%s", line);
    }
    return 0;
}

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

void reverse(char line[])
{
    int c, i, j;
    char tmp_c;
    
    i = 0;
    while (line[i] != '\0')
        ++i;
    --i;
    if (line[i] == '\n')
        --i;
    j = 0;
    while (j < i) {
        tmp_c = line[j];
        line[j] = line[i];
        line[i] = tmp_c;
        ++j;
        --i;
    }
}

入出力結果(Terminal)

$ cat sample.c | ./a.out
>h.oidts< edulcni#
0001 ENILXAM enifed#

;)enilxam tni ,][enil rahc(enilteg_ym tni
;)][enil rahc(esrever diov

)(niam tni
{
;]ENILXAM[enil rahc    
    
{ )0 > )ENILXAM ,enil(enilteg_ym( elihw    
;)enil(esrever        
;)enil ,"s%"(ftnirp        
}    
;0 nruter    
}

)mil tni ,][s rahc(enilteg_ym tni
{
;j ,i ,c tni    
    
;0 = j    
)i++ ;'n\'=! c && FOE =! ))(rahcteg = c(  ;0 = i( rof    
{ )2 - mil < i( fi        
;c = ]j[s            
;j++            
}        
{ )'n\' == c( fi    
;c = ]j[s        
;i++        
;j++        
}    
;'0\' = ]j[s    
;i nruter    
}

)][enil rahc(esrever diov
{
;j ,i ,c tni    
;c_pmt rahc    
    
;0 = i    
)'0\' =! ]i[enil( elihw    
;i++        
;i--    
)'n\' == ]i[enil( fi    
;i--        
;0 = j    
{ )i < j( elihw    
;]j[enil = c_pmt        
;]i[enil = ]j[enil        
;c_pmt = ]i[enil        
;j++        
;i--        
}    
}
$ ./a.out
12345
54321
abcde
edcba
$

0 コメント:

コメントを投稿