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; }
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; }
今年の夏は
javascriptと7年ぶりにたわむれることにしますた(^^)ノシ
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)と結果が違ってたんです。
たぶんセルの入力値を指数にしてなかったんじゃないかな先生。