1.1 手始めに, 1.2 変数と算術式, 1.3 For文, 1.4 記号定数, 1.5 文字入出力, 1.5.1 ファイルの複写, 演習1-2, 演習1-3, 演習1-4, 演習1-5, 演習1-6, 演習1-7 K&R プログラミング言語C

1.1 手始めに

プログラムには main 関数が必要。

演習1-2

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("hello,\x\n");
    return 0;
}
$ gcc -o ex1-2 ex1-2.c
ex1-2.c:13:12: error: \x used with no following hex digits

\x に続けて16進数値を記述しなければいけない。

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("hello,\x61\n");
    return 0;
}

16進数の 61 は10進数の 97 に相当する。
ASCIIコードの 97 は小文字の a に該当する。

$ ./ex1-2b
hello,a

1.2 変数と算術式

while (<test>) {
    <do something>;
}

while ループは () 内のテストを評価して成功した場合(真の場合)に {} 内の本体を実行する。

5 / 9 /* => 0 */

整数の演算では小数部が切り捨てられる。

intfloat による演算では、処理の前に intfloat に変換される。

数値の文字幅の調節は、各 %d に幅数を記述する。

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i = 65;
    float f = 54.321;

    printf("%d\n", i);
    printf("%3d\n", i);
    printf("%f\n", f);
    printf("%10f\n", f);
    printf("%10.1f\n", f);
    printf("%.2f\n", f);

    return 0;
}
$ ./pdigit
65
 65
54.320999
 54.320999
      54.3
54.32

演習1-3

#include <stdio.h>

/* fahr = 0, 20, ... 300 に対して、華氏-摂氏対応表
 * を印字する; 浮動小数点版 */

int main(int argc, char *argv[])
{
    float fahr, celsius;
    int lower, upper, step;

    lower = 0;      /* 温度差の下限 */
    upper = 300;    /* 上限 */
    step = 20;      /* きざみ */

    printf("fahr\tcelsius\n");

    fahr = lower;
    while (fahr <= upper) {
        celsius = (5.0 / 9.0) * (fahr - 32.0);
        /* %3.0f : 浮動小数点を3文字幅に、小数点も小数部も無し
         * %6.1f : 浮動小数点を6文字幅に、小数部は1桁とする
         */
        printf("%3.0f %6.1f\n", fahr, celsius);
        fahr = fahr + step;
    }
    return 0;
}

実行結果

$ ./ex1-3
fahr    celsius
  0  -17.8
 20   -6.7
 40    4.4
 60   15.6
 80   26.7
100   37.8
120   48.9
140   60.0
160   71.1
180   82.2
200   93.3
220  104.4
240  115.6
260  126.7
280  137.8
300  148.9

演習1-4

#include <stdio.h>

int main(int argc, char *argv[])
{
    float fahr, celsius;
    int lower, upper, step;

    lower = 0;      /* 温度表の下限 */
    upper = 300;    /* 上限 */
    step = 20;      /* きざみ */

    printf("celsius\tfahr\n");

    celsius = lower;
    while (celsius <= upper) {
        fahr = (9.0 / 5.0) * celsius + 32.0;
        printf("%5.0f %6.1f\n", celsius, fahr);
        celsius = celsius + step;
    }

    return 0;
}

実行結果

$ ./ex1-4
celsius fahr
    0   32.0
   20   68.0
   40  104.0
   60  140.0
   80  176.0
  100  212.0
  120  248.0
  140  284.0
  160  320.0
  180  356.0
  200  392.0
  220  428.0
  240  464.0
  260  500.0
  280  536.0
  300  572.0

1.3 For文

演習1-5

#include <stdio.h>

int main(int argc, char *argv[])
{
    int fahr;
    for (fahr = 300; fahr >= 0; fahr = fahr - 20) {
        printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));
    }
    return 0;
}

実行結果

$ ./ex1-5
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.8
 80   26.7
 60   15.6
 40    4.4
 20   -6.7
  0  -17.8

1.4 記号定数

#define 行の後にはセミコロン(;)を付けない。

#define	名前	置換テキスト

1.5 文字入出力

getchar()
一度に1文字をテキスト・ストリームから持ってきて、その値の文字を返す。ストリームの終了時に EOF を返す。
putchar(c)
一度に1文字を出力する。

1.5.1 ファイルの複写

代入文 c = getchar() は式であり、この場合、代入結果である左辺の c の値を返す。

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

int main(int argc, char *argv[])
{
    int c; /* EOF を保持するためには char 型では不適当、int 型を使用する */

    while((c = getchar()) != EOF) {
        if (putchar(c) < 0) {
            exit(1);
        }
    }

    return 0;
}

演習1-6

#include <stdio.h>

int main(int argc, char *argv[])
{
    while(printf("getchar() != EOF : %d\n", getchar() != EOF));
    return 0;
}

実行結果

CTRL+DEOF を入力する。
プログラムを終了するには CTRL+C を入力する。

$ ./ex1-6
hello
getchar() != EOF : 1
getchar() != EOF : 1
getchar() != EOF : 1
getchar() != EOF : 1
getchar() != EOF : 1
getchar() != EOF : 1
getchar() != EOF : 0
getchar() !=^C

演習1-7

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("EOF IS : %d\n", EOF);
    return 0;
}

実行結果

$ ./ex1-7
EOF IS : -1
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»