追記

…atoi()についても書いておいたほうがいいか。

"a"scii "to" "i"ntegerの名のとおり、0〜9に対応するasciiコードを0〜9に変換する関数。で宣言されていて、-の付いた負の数にも対応できる。

なんでわざわざ変換が必要なのかも実は最初よくわかってなかった。
たぶん、コマンドラインで打ち込む文字はコンピュータの内部で文字コードに対応する数字として認識されてる、って所が。

102日目 これは遅延評価勉強法なのか

僕は理解が遅い。


というか、理解しようと思い立つまでが遅い。
専門分野の勉強でも、わからないことはわからないままに放置プレイ。
一ヶ月二ヶ月たってふと思い出したように調べ始める。だから試験では悲惨な点を取ることがままある。そうやって寝かせておいてから調べたことはめったに忘れないのがせめてもの救い。

ループの回数だけアスタリスクを表示 - yaottiの日記 - ハチロク世代
これは4/19のエントリだから二ヶ月前なのだけれど、Cで書かれたソースをやっと理解した。

参考:K&R日本語版 p.139 5.10 コマンド行の引数

int main(int argc, char *argv[])

これがなんだかわからなくて放置してた。

それがやっとわかった。
コマンドラインでプログラムを呼び出すとき、プログラム名(***.exeの***の部分)の後にスペースを空けて文字列を打ち込む。すると文字列はスペースを区切りにargv[1]から順に格納される。*** hoge fugaと打ち込めばargv[1]はhoge、argv[2]はfugaだ。
そしてargv[0]には呼び出されたプログラム名が入る。

argcってのはargv[]配列の要素の個数だから、この場合はargc == 3。

id:yaottiのプログラムの実行結果はこんなかんじ。

ありがと、ひとつかしこくなったよ。

98日目 文字コードを表示

#include <stdio.h>               // ASCIIコードの表示

int main()
{
    int i;
    int str[128];

    for(i=0; i<128; i++) {     // 普通の文字だけ出力させたいなら(i=32; i<128; i++)
        if(i%16 == 0)
            printf("\n");

        str[i] = i;
        
        if(i >= 8 && i <= 13)    // 8〜13に対応する文字を用いると表示が崩れる
            printf(" ");
        else
            printf("%c", str[i]);  // %cで文字に変換して出力
        printf(" ");
    }
    return 0;
}

実行結果

第四章冒頭の例文

「文学」のブログ記事一覧-Takahiko Shirai Blog
K&R第四章の冒頭に出てくる入力用の例文(四行詩)は、オマル・ハイヤームの『ルバイヤート』第73歌。だから何だって感じですがww

97日目 K&R 1.9 文字配列 をふたたび

日本語版p.37、getline()のサンプルプログラムが奇妙に思えてずっと手を出しかねてた。
その違和感を少しだけ解消できたのでメモっとく。


どういうことかっていうと、

for(初期化式;条件式;式1実行後に行う事)
    式1;

これがわかってなかった。
あとs[i]=c; ++i;が二回出てくるのもきもちわるかった。

いきなりcopyとか二つ以上の関数を扱うと思考がついていけないので、行あたりの改行を含めた文字数を表示するプログラムを書いた。それがこれ。

#include <stdio.h>
#define MAXLINE 1000

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

main()
{
    int len;
    char line[MAXLINE];

    while((len = getline(line, MAXLINE)) >0)
        printf("%d\n", len);        // 各行の文字数を表示
}

int getline(char s[], int lim)
{
    int c, i;

    i = 0; // 1000文字目(i==999)か\nかEOFが来る手前まで
    while (i<lim-1 && (c=getchar())!='\n' && c!=EOF) {
        s[i] = c;
        ++i;        // for文の第三引数i+1がs[i]=cの後に評価されることを明示
    }
    if (c == '\n') {    // 改行は改行で新たに格納 (全部読み込んでから区切りたいが…)
        s[i] = c;
        ++i;            // ちなみに一つ上の行でs[i++] = c;とやればこの行はいらない
    }
    s[i] = '\0';

    return i;
}

そんで最終的にはサンプルプログラムはこうなった。好みの問題でしょうが。
でもまだ変えたいところはあって、上のソースのコメントにも書いたように全部読み込んでから改行で区切る方式にしたい。

#include <stdio.h>
#define MAXLINE 1000

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

main()
{
    int len;
    int max;

    char line[MAXLINE];
    char longest[MAXLINE];

    max = 0;
    while ((len = getline(line, MAXLINE)) >0)  //getline()で文字数をカウントする
        if (len > max) {
            max = len;
            copy(longest, line);    //copy()でlineをlongestに格納する
        }
    if (max > 0)
        printf("%s", longest);
        printf("%d", max);
    return 0;
}

int getline(char s[], int lim)
{
    int c, i;

    i = 0;
    while (i<lim-1 && (c=getchar())!=EOF && c!='\n')
        s[i++] = c;
    if (c == '\n')
        s[i++] = c;
    s[i] = '\0';

    return i;
}

void copy(char to[], char from[])
{
    int i;

    i = 0;
    while((to[i] = from[i]) != '\0')
        ++i;
}

89日目 標準偏差のプログラム書いてました

もうすぐ医療統計学のテストなもんで。

#include <stdio.h>
#include <math.h>
#define MAXDATA 25        // ここが直打ちなのでなんとかしたいですね

main()
{
    int i;
    double data[MAXDATA], sum, average, deviate[MAXDATA], us;

    sum = 0;
    for (i = 0; i < MAXDATA; i++) {
        scanf_s("%lf", &data[i]);
        printf("%.1lf ", data[i]);
        sum += data[i];
    }
    average =  sum/MAXDATA;

    printf("\n");
    printf("sum: %.1f\n", sum);
    printf("ave: %.1f\n", average);

    sum = 0;
    for (i = 0; i < MAXDATA; i++) {
        deviate[i] = average - data[i]; // deviate 偏差
        printf("%.2f ", deviate[i]);
        sum += (deviate[i]*deviate[i]);
    }
    us = sum/(MAXDATA-1);
    printf("\n");
    printf("sum: %.2f\n", sum);        // 偏差平方和
    printf("u.s: %.5f\n", us);        // unbisased estimate 不偏分散
    printf("s.d: %.6f\n", sqrt(us));
}

test.txt

63 46 46 55 57 40 51 52 63 60 65 70 57 48 52 60 67 52 53 59 46 40 43 59 44


なんかね、Rでテストしたら授業の配布プリント(Excel)と結果が違ってたんです。
たぶんセルの入力値を指数にしてなかったんじゃないかな先生。