diary

主にコンピュータ技術関連のことを投稿。 / 投稿は個人の意見であり所属団体の立場を代表するものではありません。

K&R2Exercise

1-20.c

演習 1-20 入力されたタブを、次のタブ・ストップまでのスペースをうめる適当な数のブランク(空白)で置き換えるプログラムdetabを書け。タブ・ストップの位置は、例えばn文字ごとというように固定して考えよ。nは変数にすべきか、記号パラメータにすべきか? …

1-19.c

演習 1-19 文字列sを逆に並べる関数reverse(s)を書け。さらに、この関数を使って、入力を一時に1行ずつ逆転するプログラムを書け。 #include <stdio.h> #define MAXLINE 1000 void reverse(char s[]) { int c, len; char temp; for (len = 0; s[len] != '\0'; ++len)</stdio.h>…

1-18.c

演習 1-18 各入力行から、行の後のブランクやタブを取り除き、かつ空白行は全て削除するようなプログラムを書け。 #include <stdio.h> #define MAXBLANK 1000 #define TRUE 1 #define FALSE 0 main() { int c; int i; /* 空白文字の一時保存 */ int blcount = 0; char</stdio.h>…

1-17.c

演習 1-17 80字より長い行を全て印字するプログラムを書け。 #include <stdio.h> #define LENGTHNOTPRINT 80 main() { int c, i, j; int cache[LENGTHNOTPRINT]; i = 0; while ((c = getchar()) != EOF) { ++i; if (i <= LENGTHNOTPRINT) cache[i-1] = c; if (i == LE</stdio.h>…

1-16追記

1.9,P36のプログラムのままではMAXLINE以上の長さの行が複数現れた場合でも、全部MAXLINE分の長さであるように見てしまうから不正確。1001文字の行の次に1010文字の行が来ても、1001文字の行のほうを表示してしまうということ。 だから演習問題は、どんなに…

1-16つまった

演習 1-16 一番長い行を印字するプログラムのmainルーチンを書き直して、任意の長さの入力行郡の長さ、およびテキストのできるだけ多くの部分を正しく印字できるようにせよ。 日本語がわからないので停滞している…。 原書は以下のようになっているようだがや…

1-15.c

演習 1-15 1.2節の温度換算プログラムを、変換のための関数を使うように書き直せ。 #include <stdio.h> float f2c(float fahr); main() { float fahr, celsius; int lower, upper, step; lower = 0; upper = 300; step = 20; while (fahr <= upper) { celsius = f2c(f</stdio.h>…

1-14.c

演習 1-14 入力中の異なる文字の頻度をヒストグラムにプリントするプログラムを書け。 ひさびさにやってみた。関数はまだ登場しないページだから使わなかった。 大文字小文字を区別しないアルファベット26字と、0〜9の数字ひとまとまり、それ以外で区別して…

1-13.c

演習 1-13 入力した単語の長さをヒストグラム(度数分布図)にしてプリントするプログラムを書け。ヒストグラムは横に書くほうが簡単だが、縦書に挑戦してみるのもよい。 ちょっと難しかったので(度数分布図なんて知らない)、割合の計算はしないでカウントした…

1-12.c

演習 1-12 入力した単語を1行に一つずつ印字するプログラムを書け。 #include <stdio.h> #define IN 1 #define OUT 0 main() { int c, state; state = OUT; while ((c = getchar()) != EOF) { if (c == ' ' || c == '\n' || c == '\t') { if (state == IN) putchar('\</stdio.h>…

1-11

演習 1-11 単語カウントプログラムのテストは、どのようにするか?もしバグがあるとしたら、それをあばき出すにはどんな入力をするのがよいか? ごめんなさい、ギブアップ カンニング用サイトにも解答なし

1-10.c

演習 1-10 各タブを\tに、各バックスペースを\bに、各バックスラッシュを\\に置き換えながら、入力を出力に複写するプログラムを書け。こうすれば、タブとバックスペースははっきり目に見えるようになる。 #include <stdio.h> main () { int c; while ((c = getchar()</stdio.h>…

1-9.c

演習 1-9 二つ以上の空白を一つの空白に置き換えながら、入力を出力に複写するプログラムを書け。 #include <stdio.h> #define SPACE 1 #define CHAR 0 main () { int c, flag = CHAR; while ((c = getchar()) != EOF) { if (c == ' ') { if (flag == CHAR) putchar(c</stdio.h>…

1-8.c

演習 1-8 空白、タブ、改行を数えるプログラムを書け。 #include <stdio.h> main() { int c, sp = 0, tb = 0, nl = 0; while ((c = getchar()) != EOF) { if (c == ' ') ++sp; if (c == '\t') ++tb; if (c == '\n') ++nl; } printf("space: %d, tab: %d:, newline %d\</stdio.h>…

1-7.c

演習 1-7 EOFの値を印字するプログラムを書け #include <stdio.h> main() { printf("%d\n", EOF); } $ ./a.out -1</stdio.h>

1-6.c

演習 1-6 getchar() != EOF という式の値が0か1であることを確認せよ #include <stdio.h> main() { printf("%d\n", (getchar() != EOF)); } $ ./a.out a 1 $ ./a.out (Ctrl-D) 0</stdio.h>

1-5.c

#include <stdio.h> main() { int fahr; for (fahr = 300; fahr >= 0; fahr = fahr - 20) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); } $ ./a.out 300 148.9 280 137.8 260 126.7 240 115.6 220 104.4 200 93.3 180 82.2 160 71.1 140 60.0 120 48.9 100 37.</stdio.h>…

1-4.c

ひきこもってる間暇なのでk&Rの演習を解いていこうと思います。実はとても昔にd.hatenaでやってたんだけどね…難しくて一週間で放棄してました ちなみになにか実用的なモノを作ることはできないし、C言語スキルはK&Rでいうと第一章くらいのところまでしかない…