Download : sample-001.c ( SJIS 版 )
/* * 2014/09/26 sample-001.c */ /* * printf の書式付き出力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe sample-001.c * 実行 * BASENAME */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { printf ( "書式は、混在させても出せる\n" ); printf ( "%d, %f, %c, %s\n", 10, 2.3, 'x', "abc" ); /* 文字と整数値の関係 */ printf ( "「文字」は「小さな整数値(文字コード)」に対応\n" ); printf ( "%c -> %d\n", 'x', 'x' ); printf ( "「小さな整数値(文字コード)」は「文字」に対応\n" ); printf ( "%d -> %c\n", 97, 97 ); /* * ASCII Code 表を参照 (http://e-words.jp/p/r-ascii.html) */ return 0; }
C:\usr\c>sample-001 書式は、混在させても出せる 10, 2.300000, x, abc 「文字」は「小さな整数値(文字コード)」に対応 x -> 120 「小さな整数値(文字コード)」は「文字」に対応 97 -> a C:\usr\c>
Download : sample-002.c ( SJIS 版 )
/* * 2014/09/26 sample-002.c */ /* * printf の書式付き出力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe sample-002.c * 実行 * BASENAME */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int i; printf ( "同じ値でも、書式が異れば、別の形で出力\n" ); i = 0; printf ( "十進\t八進\t十六進\n" ); while ( i < 20 ) { printf ( "%d\t\%o\t%x\n", i, i, i ); /* 同じ数値をそれぞれ、十進(%d), 八進(%o), 十六進(%x)数の形で出力 */ i++; } return 0; }
C:\usr\c>sample-002 同じ値でも、書式が異れば、別の形で出力 十進 八進 十六進 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 10 8 9 11 9 10 12 a 11 13 b 12 14 c 13 15 d 14 16 e 15 17 f 16 20 10 17 21 11 18 22 12 19 23 13 C:\usr\c>
Download : sample-003.c ( SJIS 版 )
/* * 2014/09/26 sample-003.c */ /* * scanf の書式付き入力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe sample-003.c * 実行 * BASENAME */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int d; /* 10 進数の 12 を代入する */ int o; /* 8 進数の 12 を代入する */ int x; /* 16 進数の 12 を代入する */ /* * 整数値 */ printf ( "12 を三回入力してください : " ); scanf ( "%d", &d ); scanf ( "%o", &o ); scanf ( "%x", &x ); /* キーボードからは三つの「12」を入力 */ /* これを、それぞれ別の形式(%d,%o,%x)で解釈する */ printf ( "一つ目は、10 進で %d, 8 進で %o, 16 進で %x です\n", d, d, d ); printf ( "二つ目は、10 進で %d, 8 進で %o, 16 進で %x です\n", o, o, o ); printf ( "三つ目は、10 進で %d, 8 進で %o, 16 進で %x です\n", x, x, x ); return 0; }
12 12 12
C:\usr\c>sample-003< sample-003.in 12 を三回入力してください : 12 12 一つ目は、10 進で 12, 8 進で 14, 16 進で c です 二つ目は、10 進で 10, 8 進で 12, 16 進で a です 三つ目は、10 進で 18, 8 進で 22, 16 進で 12 です C:\usr\c>
Download : sample-004.c ( SJIS 版 )
/* * 2014/09/26 sample-004.c */ /* * printf で書式を間違えると何がおきるのか * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe sample-004.c * 実行 * BASENAME */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int i = 123; /* 整数値 */ double d = 456.789; /* 浮動小数点数 */ /* * 整数値を浮動小数点数値として出力 */ printf ( "整数値 %d を浮動小数点数値として出力すると %lf になります。\n", i, i ); /* * 浮動小数点数を整数値として出力 */ printf ( "浮動小数点数値 %lf を整数値として出力すると %d になります。\n", d, d ); return 0; }
C:\usr\c>sample-004 整数値 123 を浮動小数点数値として出力すると 0.000000 になります。 浮動小数点数値 456.789000 を整数値として出力すると -1099511628 になります。 C:\usr\c>
Download : sample-005.c ( SJIS 版 )
/* * 2014/09/26 sample-005.c */ /* * scanf の書式付き入力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe sample-005.c * 実行 * BASENAME */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int i; double d; /* * 整数値 */ printf ( "整数値を入力してください : " ); scanf ( "%d", &i ); /* 整数型なので「%d」の書式を付ける */ /* 変数 i の前に「&」を付ける(今回は「お呪い」考えてください)*/ printf ( "整数値 %d が入力されました。\n", i ); /* * 浮動小数点数 */ printf ( "浮動小数点値を入力してください : " ); scanf ( "%lf", &d ); /* 浮動小数点型なので「%lf」の書式を付ける */ /* 変数 d の前に「&」を付ける(今回は「お呪い」考えてください)*/ printf ( "浮動小数点値 %f が入力されました。\n", d ); return 0; }
789 123.456
C:\usr\c>sample-005< sample-005.in 整数値を入力してください : 789 整数値 789 が入力されました。 浮動小数点値を入力してください : 123.456000 浮動小数点値 123.456000 が入力されました。 C:\usr\c>
Download : sample-006.c ( SJIS 版 )
/* * 2014/09/26 sample-006.c */ /* * scanf で対応を間違えると.. * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe sample-006.c * 実行 * BASENAME */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int i; double d; /* * 整数値 */ printf ( "整数値を入力してください : " ); scanf ( "%d", &i ); /* 整数型なので「%d」の書式を付ける */ /* 変数 i の前に「&」を付ける(今回は「お呪い」考えてください)*/ printf ( "整数値 %d が入力されました。\n", i ); /* * 浮動小数点数 */ printf ( "浮動小数点値を入力してください : " ); scanf ( "%lf", &d ); /* 浮動小数点型なので「%lf」の書式を付ける */ /* 変数 d の前に「&」を付ける(今回は「お呪い」考えてください)*/ printf ( "浮動小数点値 %f が入力されました。\n", d ); return 0; }
123.456 789
C:\usr\c> sample-002 整数値を入力してください : 123.456 整数値 123 が入力されました。 浮動小数点値を入力してください : 浮動小数点値 0.456000 が入力されました。 C:\usr\c>
Download : sample-007.c ( SJIS 版 )
/* * 2014/09/26 sample-007.c */ /* * sscanf の書式付き入力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe sample-007.c * 実行 * BASENAME */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int i; i = 9999; /* 確かに、文字列内からとりだせる事を確認するために最初に 0 で初期化 */ sscanf ( "123", "%d", &i ); /* 最初の引数の文字列の中から整数値 「123」が取り出せる */ printf ( "整数値 %d が文字列の中から取り出せました。\n", i ); /* 数字でない文字が含まれていると.. */ i = 9999; sscanf ( "a123", "%d", &i ); printf ( "整数値 %d が文字列の中から取り出せました。\n", i ); /* 期待した形にならない.. */ /* 書式で、不要な情報はスキップできる */ i = 9999; sscanf ( "a123", "a%d", &i ); /* ^ ^ 注目 */ printf ( "整数値 %d が文字列の中から取り出せました。\n", i ); /* 書式にマッチしないと上手くゆかない */ i = 9999; sscanf ( "b123", "a%d", &i ); /* ^ ^ 注目 */ printf ( "整数値 %d が文字列の中から取り出せました。\n", i ); return 0; }
123
C:\usr\c>sample-007< sample-007.in 整数値 123 が文字列の中から取り出せました。 整数値 9999 が文字列の中から取り出せました。 整数値 123 が文字列の中から取り出せました。 整数値 9999 が文字列の中から取り出せました。 C:\usr\c>
Download : sample-008.c ( SJIS 版 )
/* * 2014/09/26 sample-008.c */ /* * ファイルへの I/O (入力 : fscanf) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe sample-008.c * 実行 * BASENAME * * あらかじめ、整数値が一つ入った "input.txt" を作成してから実行する */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { FILE *fp; /* ファイルポインターを收める */ /* 「FILE *」型なのだが、この詳細は今回は説明しない */ int v; /* ファイルから整数値を取り出し、この変数にいれる */ fp = fopen ( "input.txt", "r" ); /* ファイル "input.txt" を、読込みの為 ("r") に開く */ if ( fp != NULL ) { /* fp が NULL でなければ、open 成功 */ fscanf ( fp, "%d", &v ); /* fscanf で fp から整数値を取り出す */ printf ( "ファイル中の整数値は %d でした。\n", v ); fclose ( fp ); /* open に成功した場合は最後に必ず close */ } else { /* fp が NULL なら open は失敗 */ printf ( "ファイル(input.txt)の open に失敗しました。\n" ); /* 失敗した場合は、それが解るように報告する */ } return 0; }
123 456.789
C:\usr\c>sample-008< sample-008.in ファイル(input.txt)の open に失敗しました。 C:\usr\c>
Download : sample-009.c ( SJIS 版 )
/* * 2014/09/26 sample-009.c */ /* * ファイルへの I/O (入力 : fprintf ) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe sample-009.c * 実行 * BASENAME * */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { FILE *fp; /* ファイルポインターを收める */ /* 「FILE *」型なのだが、この詳細は今回は説明しない */ int v = 123; /* ファイルに保存する整数値 */ fp = fopen ( "output.txt", "w" ); /* ファイル "output.txt" を、書出しの為 ("w") に開く */ if ( fp != NULL ) { /* fp が NULL でなければ、open 成功 */ fprintf ( fp, "%d\n", v ); /* fprintf で fp から整数値を書き出す */ fclose ( fp ); /* open に成功した場合は最後に必ず close */ } else { /* fp が NULL なら open は失敗 */ printf ( "ファイル(output.txt)の open に失敗しました。\n" ); /* 失敗した場合は、それが解るように報告する */ } return 0; }
C:\usr\c>sample-009 C:\usr\c>
Download : sample-010.c ( SJIS 版 )
/* * 2014/09/26 sample-010.c */ /* * 平面上の点を扱う * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe sample-010.c -lm * 実行 * BASENAME * */ #include <stdio.h> #include <math.h> /* sqrt を利用するので必要 (-lm も忘れずに ) */ /* * void print_point ( double px, double py ) * 「点」を表示する * double px -- 「点」の x 座標 * double py -- 「点」の y 座標 */ void print_point ( double px, double py ) { printf ( "( %f, %f )", px, py ); } /* * double point_distance ( double p1x, double p1y, double p2x, double p2y ) * ニ「点」間の距離を返す * double p1x -- 「始点」の x 座標 * double p1y -- 「始点」の y 座標 * double p2x -- 「終点」の x 座標 * double p2y -- 「終点」の y 座標 */ double point_distance ( double p1x, double p1y, double p2x, double p2y ) { double dx = p2x - p1x; /* x 座標の差 */ double dy = p2y - p1y; /* y 座標の差 */ return sqrt ( dx*dx + dy*dy ); } /* * main */ int main( int argc, char *argv[] ) { double p1x = 1.0; /* p1 = ( 1.0, 2.0 ) */ double p1y = 2.0; double p2x = 4.0; /* p2 = ( 4.0, 6.0 ) */ double p2y = 6.0; printf ( "始点 " ); print_point ( p1x, p1y ); printf ( " と終点 " ); print_point ( p2x, p2y ); printf ( " との距離は %f です。\n", point_distance ( p1x, p1y, p2x, p2y ) ); return 0; }
C:\usr\c>sample-010 始点 ( 1.000000, 2.000000 ) と終点 ( 4.000000, 6.000000 ) との距離は \ 5.000000 です。 C:\usr\c>
Download : sample-011.c ( SJIS 版 )
/* * 2014/09/26 sample-011.c */ /* * 平面上の点の操作 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe sample-011.c * 実行 * BASENAME * */ #include <stdio.h> #include <math.h> /* sqrt を利用するので必要 (-lm も忘れずに ) */ /* * void print_point ( double px, double py ) * 「点」を表示する * double px -- 「点」の x 座標 * double py -- 「点」の y 座標 */ void print_point ( double px, double py ) { printf ( "( %f, %f )", px, py ); } /* * void mirror_x_point ( double py ) * x 軸に対し線対称の「点」の y 座標を求める * double py -- 「点」の y 座標 */ double mirror_x_point ( double py ) { return - py; } /* * void mirror_y_point ( double px ) * y 軸に対し線対称の「点」の x 座標を求める * double px -- 「点」の x 座標 */ double mirror_y_point ( double px ) { return - px; } /* * main */ int main( int argc, char *argv[] ) { double p1x = 1.0; /* p1 = ( 1.0, 2.0 ) */ double p1y = 2.0; double p2x; double p2y; /* x 軸に対して線対象 */ printf ( "点 " ); print_point ( p1x, p1y ); printf ( " と x 軸に対して線対称な点は " ); p2x = p1x; /* x 座標は変らない */ p2y = mirror_x_point ( p1y ); /* y 座標のみ計算 */ print_point ( p2x, p2y ); printf ( " となります。\n" ); /* y 軸に線対象 */ printf ( "点 " ); print_point ( p1x, p1y ); printf ( " と y 軸に対して線対称な点は " ); p2x = mirror_x_point ( p1x ); /* x 座標のみ計算 */ p2y = p1y; /* y 座標は変らない */ print_point ( p2x, p2y ); printf ( " となります。\n" ); return 0; }
C:\usr\c>sample-011 点 ( 1.000000, 2.000000 ) と x 軸に対して線対称な点は ( 1.000000, -2.000000 ) \ となります。 点 ( 1.000000, 2.000000 ) と y 軸に対して線対称な点は ( -1.000000, 2.000000 ) \ となります。 C:\usr\c>
Download : sample-012.c ( SJIS 版 )
/* * 2014/09/26 sample-012.c */ /* * 平面上の点の操作 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe sample-012.c * 実行 * BASENAME * */ #include <stdio.h> /* * void print_point ( double px, double py ) * 「点」を表示する * double px -- 「点」の x 座標 * double py -- 「点」の y 座標 */ void print_point ( double px, double py ) { printf ( "( %lf, %lf )", px, py ); } /* * void mirror_o_point_x ( double px ) * 原点に対し点対称の「点」の x 座標を求める * double px -- 「点」の x 座標 */ double mirror_o_point_x ( double px ) { return - px; } /* * void mirror_o_point_y ( double py ) * 原点に対し点対称の「点」の y 座標を求める * double py -- 「点」の y 座標 */ double mirror_o_point_y ( double py ) { return - py; } /* * main */ int main( int argc, char *argv[] ) { double p1x = 1.0; /* p1 = ( 1.0, 2.0 ) */ double p1y = 2.0; double p2x; double p2y; /* 原点に点対象 */ printf ( "点 " ); print_point ( p1x, p1y ); printf ( " と原点に対して点線対称な点は " ); /* x と y の処理を別々に行う.. */ p2x = mirror_o_point_x ( p1x ); p2y = mirror_o_point_y ( p1y ); print_point ( p2x, p2y ); printf ( " となります。\n" ); return 0; }
C:\usr\c>sample-012 点 ( 1.000000, 2.000000 ) と原点に対して点線対称な点は ( -1.000000, -2.000000 ) \ となります。 C:\usr\c>
Download : sample-013.c ( SJIS 版 )
/* * 2014/09/26 sample-013.c */ /* * 平面上の点の操作 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe sample-013.c * 実行 * BASENAME * */ #include <stdio.h> #include <math.h> /* sqrt を利用するので必要 (-lm も忘れずに ) */ /* * void print_point ( double px, double py ) * 「点」を表示する * double px -- 「点」の x 座標 * double py -- 「点」の y 座標 */ void print_point ( double px, double py ) { printf ( "( %f, %f )", px, py ); } /* * void mirror_x_point ( double py ) * x 軸に対し線対称の「点」の y 座標を求める * double py -- 「点」の y 座標 */ double mirror_x_point ( double py ) { return - py; } /* * void mirror_y_point ( double px ) * y 軸に対し線対称の「点」の x 座標を求める * double px -- 「点」の x 座標 */ double mirror_y_point ( double px ) { return - px; } /* * main */ int main( int argc, char *argv[] ) { double p1x = 1.0; /* p1 = ( 1.0, 2.0 ) */ double p1y = 2.0; double p2x; double p2y; /* x 軸に対して線対象 */ printf ( "点 " ); print_point ( p1x, p1y ); printf ( " と x 軸に対して線対称な点は " ); p2x = p1x; /* x 座標は変らない */ p2y = mirror_x_point ( p1y ); /* y 座標のみ計算 */ print_point ( p2x, p2y ); printf ( " となります。\n" ); /* y 軸に線対象 */ printf ( "点 " ); print_point ( p1x, p1y ); printf ( " と y 軸に対して線対称な点は " ); p2x = mirror_x_point ( p1x ); /* x 座標のみ計算 */ p2y = p1y; /* y 座標は変らない */ print_point ( p2x, p2y ); printf ( " となります。\n" ); return 0; }
C:\usr\c>sample-013 点 ( 1.000000, 2.000000 ) と x 軸に対して線対称な点は ( 1.000000, -2.000000 ) \ となります。 点 ( 1.000000, 2.000000 ) と y 軸に対して線対称な点は ( -1.000000, 2.000000 ) \ となります。 C:\usr\c>
Download : sample-014.c ( SJIS 版 )
/* * 2014/09/26 sample-014.c */ /* * 平面上の点を扱う * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe sample-014.c -lm * 実行 * BASENAME * */ #include <stdio.h> #include <math.h> /* sqrt を利用するので必要 (-lm も忘れずに ) */ /* * 新しい「型」 Point を作成する */ typedef struct { /* 「型」を作る = typedef */ double x; /* 新しい型は「構造体」= struct */ double y; /* 中身は double が二つで個々の名前は x と y */ } Point; /* 新しい型の名前は Point */ /* * void print_point ( Point pt ) * 「点」を表示する * Point pt;「点」 */ void print_point ( Point pt ) { /* * Point 型の pt は x 成分と y 成分の二つからなる * pt の x 成分は pt.x で表現できる(double 型変数と同じように扱える) */ printf ( "( %f, %f )", pt.x, pt.y ); } /* * double point_distance ( Point p1, Point p2 ) * ニ「点」間の距離を返す * Point p1; 始点 * Point p2; 終点 */ double point_distance ( Point p1, Point p2 ) { double dx = p2.x - p1.x; /* x 座標の差 */ double dy = p2.y - p1.y; /* y 座標の差 */ return sqrt ( dx*dx + dy*dy ); } /* * main */ int main( int argc, char *argv[] ) { Point p1 = { 1.0, 2.0 }; /* 「点」 p1 の宣言 */ Point p2 = { 4.0, 6.0 }; /* 「点」 p2 の宣言 */ printf ( "始点 " ); print_point ( p1 ); printf ( " と終点 " ); print_point ( p2 ); printf ( " との距離は %f です。\n", point_distance ( p1, p2 ) ); return 0; }
C:\usr\c>sample-014 始点 ( 1.000000, 2.000000 ) と終点 ( 4.000000, 6.000000 ) との距離は \ 5.000000 です。 C:\usr\c>
#include <stdio.h> /* * 一行の文字列をシーザー暗号化する * ABCD..XYZ * DEFG..ABC */ int main(void) { int ch; ch = getchar(); /* 最初の一文字 */ while ( ch != '\n' ) { /* 改行がくるまで */ if ( ch < 'X' ) { ch = ch + 3; /* A〜W の時は 3 つずらす */ } else { ch = ch - 'X' + 'A'; /* X〜Z の時は A〜C にする */ } putchar ( ch ); /* 暗号化した文字を出力 */ ch = getchar(); /* 次の文字を入力 */ } putchar ( '\n' ); /* 改行もわすれずに.. */ return 0; }
#include <stdio.h> /* * 標準出力と標準エラー出力 */ int main(void) { printf ( "標準出力(1) : abc\n" ); /* printf は、中で stdout を無条件に利用しているだけ */ fprintf ( stdout, "標準出力(2) : abc\n" ); /* stdout : 標準出力を表すファイルポインター */ fprintf ( stderr, "標準エラー出力(1) : abc\n" ); /* stderr : 標準エラー出力を表すファイルポインター */ return 0; }
#include <stdio.h> /* * ファイルの open/close と ファイルポインター */ int main(void) { FILE *fp; /* fp はファイルポインターを保存する変数 */ /* 詳しくは後回し */ fp = fopen ( "p-003-out.txt", "w" ); /* ファイル「p-003-out.txt」を書出し(「w」rite)モードでオープン */ /* [ポイント] ファイルを操作(read/write)する場合は、 必ず、オープンして、「ファイルポインター」を入手する そして、その「ファイルポインター」を利用して I/O を行う */ if ( fp != NULL ) { /* オープンに成功した */ /* オープンが失敗すると fopen は NULL を返す */ fprintf ( fp, "abc\n" ); fclose ( fp ); /* ファイルは利用し終ったらクローズする */ } return 0; }
#include <stdio.h> /* * ファイルの open/close と ファイルポインター */ int main(void) { FILE *fp; /* fp はファイルポインターを保存する変数 */ /* 詳しくは後回し */ int i; fp = fopen ( "p-004-in.txt", "r" ); /* ファイル「p-004-in.txt」を読込み(「r」ead)モードでオープン */ /* [ポイント] ファイルを操作(read/write)する場合は、 必ず、オープンして、「ファイルポインター」を入手する そして、その「ファイルポインター」を利用して I/O を行う */ if ( fp != NULL ) { /* オープンに成功した */ /* オープンが失敗すると fopen は NULL を返す */ fscanf ( fp, "%d", &i ); printf ( "i=%d\n", i ); fclose ( fp ); /* ファイルは利用し終ったらクローズする */ } return 0; }
#include <stdio.h> /* * ファイルの open/close と ファイルポインター */ void fprint_abc ( FILE *fp ) { fprintf ( fp, "abc\n" ); /* ファイルポインター型変数 fp で 指定された「ファイルポインター値」が示す「出力先」に 「abc」 を出力する */ } int main(void) { FILE *fp; /* fp はファイルポインターを保存する変数 */ /* 詳しくは後回し */ fprint_abc ( stdout ); /* 標準出力に "abc" を出力 */ /* 変数 stdout には「標準出力」を意味するファイルポインター値が入っている */ fprint_abc ( stderr ); /* 標準エラー出力に "abc" を出力 */ fp = fopen ( "p-005-out.txt", "w" ); /* ファイル「p-005-out.txt」を書出し(「w」rite)モードでオープン */ /* [ポイント] ファイルを操作(read/write)する場合は、 必ず、オープンして、「ファイルポインター」を入手する そして、その「ファイルポインター」を利用して I/O を行う */ if ( fp != NULL ) { /* オープンに成功した */ /* オープンが失敗すると fopen は NULL を返す */ fprint_abc ( fp ); /* ファイルに "abc" を出力 */ fclose ( fp ); /* ファイルは利用し終ったらクローズする */ } return 0; }
#include <stdio.h> /* * 標準出力と標準エラー出力 */ int main(void) { printf ( "標準出力(1) : abc\n" ); /* printf は、中で stdout を無条件に利用しているだけ */ fprintf ( stdout, "標準出力(2) : abc\n" ); /* stdout : 標準出力を表すファイルポインター */ fclose ( stdout ); printf ( "標準出力(3) : abc\n" ); /* printf は、中で stdout を無条件に利用しているだけ */ fprintf ( stdout, "標準出力(4) : abc\n" ); /* stdout : 標準出力を表すファイルポインター */ return 0; }
/* * 課題 CNAME-01 * * 20140926 CNAME-01-QQQQ.c * * sscanf による文字列から情報の取出し */ #include <stdio.h> /* * void parse ( char *text ) * sscanf で文字列から数値を取り出す * * char *text : 数を含む文字列 * text は "int 整数値, double 浮動小数点数" の形式になっている必要がある * 例 "int 123, double 123.456" */ void parse ( char *text ) { int iv; double dv; /* "int 123, double 123.456" */ sscanf ( text, "int %d, double %lf", &iv, &dv ); /* "double 123.456, int 123" は NG */ printf ( "int value = %d, double value = %f\n", iv, dv ); } /* * main */ int main( int argc, char *argv[] ) { parse ( "int 123, double 123.456" ); parse ( "int -987, double 0.00789" ); return 0; }
printf 書式指定で、データの内容を表示させる事ができる 10 (整数値) -> %d 12.34 (浮動小数点数) -> %f 書式で、型を指定するだけでなく、出力形式も指定できる 97 (整数値) -> %d => 97 97 (整数値) -> %c => 'a' : 整数値を文字として出力 10 (十進整数値) -> %d => 10 (十進数) 10 (十進整数値) -> %o => 12 (八進数) 10 (十進整数値) -> %x => a (十六進数) <注意点> 整数値を浮動小数点で出すと意味不明な表示になる 逆も真 基本は、型と書式を揃える必要がある scanf printf の逆で標準入力から数値を変数に取り込む事ができる 入力を人間がやると、間違える可能性がある -> scanf の指定した形式と異る入力が来る可能性がある 思った通りには動かない事が多い sscanf (sprintf) sscanf ( 文字列, 書式指定, &変数.. ) scanf が、書式指定に従って、標準入力から入力された文字列から、値を取出し、変数に代入するのに対し、 sscanf は、最初に指定された文字列から値を取り出す sscanf ( "123", "%d", &i ) ⇔ scanf ( "%d", &i ) + キーボードから 123[Enter] == sscanf ( "a123", "%d", &i ); -> i には 0 が入る why ? sscanf は "a123" から整数値を取り出そうとする ( %d という書式指定があるから.. ) ところが、"a123" の先頭の "a" は、10 進数を表す文字ではない => "" が指定されたと解釈する 中身が空っぽなので 0 とした sscanf ( "12a34", "%d", &i ); -> i には 12 が入る sscanf ( "a123", "a%d", &i ); -> i に 123 が入る 入力 : "a123" |^^^ | | |vv 書式 : "a%d" %d <-> 123 => i に代入 sscanf ( "b123", "a%d", &i ); -> i に 0 (つまり、上手く読み出せない) !! i=123; !! printf ( "(%d)", i ) => (123) => scanf ( "(%d)", &j ) !! j <- 123
ABCDEWXYZ
ZABCDEFG
標準出力(1) : abc 標準出力(2) : abc
abc
987
abc
課題プログラム内の「/*名前:ここ*/」の部分を書き換えたり、「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
なお「名前(P,Q,R,..)」の部分が同じ所には同じものが入ります。
Download : 20140926-01.c ( SJIS 版 )
/* * 課題 CNAME-01 * * 20140926 CNAME-01-QQQQ.c * * sscanf による文字列から情報の取出し */ #include <stdio.h> /* * void parse ( char *text ) * sscanf で文字列から数値を取り出す * * char *text : 数を含む文字列 * text は "int 整数値, double 浮動小数点数" の形式になっている必要がある * 例 "int 123, double 123.456" */ void parse ( char *text ) { int iv; double dv; /* ** この部分を完成させなさい */ printf ( "int value = %d, double value = %f\n", iv, dv ); } /* * main */ int main( int argc, char *argv[] ) { parse ( "int 123, double 123.456" ); parse ( "int -987, double 0.00789" ); return 0; }
C:\usr\c\> 20140926-01-QQQQ int value = 123, double value = 123.456000 int value = -987, double value = 0.007890 C:\usr\c\>
Download : 20140926-02.c ( SJIS 版 )
/* * 課題 CNAME-02 * * 20140926 20140926-02-QQQQ.c * * fopen/fclose/fprintf によるファイルの書出し * */ #include <stdio.h> /* * */ /* * main */ int main( int argc, char *argv[] ) { FILE *fp; /* ファイルポインター */ int input; /* 入力される整数値 */ int number; /* 何番目のデータか */ /* ** この部分を完成させなさい */ /* ファイル "outfile-02.txt" を出力モードでオープン */ /* 元々なければ新規に作成されるが元々あると上書きされ、元の内容は失われる */ if ( fp != NULL ) { /* オープンに成功 (失敗すると NULL になる) したら */ number = 1; printf ( "No. %d : 正の整数を入力してください : ", number ); scanf ( "%d", &input ); /* 整数値の入力 */ while ( input > 0 ) { /* 入力される整数値が正の間 */ /* ** この部分を完成させなさい */ /* 入力データをファイルに書き出す */ number++; /* number を一増やす */ printf ( "No. %d : 正の整数を入力してください : ", number ); scanf ( "%d", &input ); /* 整数値の入力 */ } /* 負の数が入力された */ /* ** この部分を完成させなさい */ /* ファイルをクローズ */ /* オープンしたら必ず閉じる !! */ } else { /* ファイルのオープンに失敗した */ printf ( "ファイルのオープンに失敗しました\n" ); /* エラーメッセージに出力 */ } return 0; }
10 123 999 -1
C:\usr\c\> 20140926-02-QQQQ No. 1 : 正の整数を入力してください : 10 No. 2 : 正の整数を入力してください : 123 No. 3 : 正の整数を入力してください : 999 No. 4 : 正の整数を入力してください : -1 C:\usr\c\>
1, 10 2, 123 3, 999
Download : 20140926-03.c ( SJIS 版 )
/* * 課題 CNAME-03 * * 20140926 20140926-03-QQQQ.c * * 3 次元ベクトル * */ #include <stdio.h> /* * 3 次元ベクトル */ typedef struct { /* 3 次元ベクトル */ double x; /* x 要素 */ double y; /* y 要素 */ double z; /* z 要素 */ } Vector3D; /* 新しい型 : Vector3D */ /* * void print_Vector3D ( Vector3D v ) * ベクトルの内容を書き出す * Vector3D v; 書き出すベクトル */ void print_Vector3D ( Vector3D v ) { printf ( " %f\n", v.x ); /* v の x 要素の出力 */ printf ( "( %f )\n", v.y ); /* v の y 要素の出力 */ printf ( " %f\n", v.z ); /* v の z 要素の出力 */ /* TeX で表現するならば、 printf ( "\\left(\\begin{array}{c} %f \\\\ %f \\\ %f \ \\end{array}\\right)\n", v.x, v.y, v.z ); などととすればよい。 */ } /* * Vector3D sub_Vector3D ( Vector3D dst, Vector3D src ) * 二つのベクトルの差を計算する * Vector3D dst; 引かれるベクトル * Vector3D src; 引くベクトル * 帰り値 二つのベクトルの差となるベクトル */ Vector3D sub_Vector3D ( Vector3D dst, Vector3D src ) { Vector3D result; /* 計算結果(差)を收める変数 */ /* ** この部分を完成させなさい */ /* x 成分の計算 */ result.y = dst.y - src.y; /* y 成分の計算 */ /* ** この部分を完成させなさい */ /* z 成分の計算 */ return result; /* 計算した結果を値として返す */ } /* * main */ int main( int argc, char *argv[] ) { Vector3D dst; Vector3D src; dst.x = 1.2; /* 1.2 */ dst.y = 2.3; /* dst = ( 2.3 ) */ dst.z = 3.4; /* 3.4 */ src.x = -9.8; /* -9.8 */ src.y = 8.7; /* dst = ( 8.7 ) */ src.z = 0.0; /* 0.0 */ print_Vector3D ( dst ); /* dst の出力 */ printf ( "と\n" ); print_Vector3D ( src ); /* src の出力 */ printf ( "の差は\n" ); print_Vector3D ( sub_Vector3D ( dst, src ) ); printf ( "となります。\n" ); return 0; }
123 456.789
C:\usr\c\> 20140926-03-QQQQ 1.200000 ( 2.300000 ) 3.400000 と -9.800000 ( 8.700000 ) 0.000000 の差は 11.000000 ( -6.400000 ) 3.400000 となります。 C:\usr\c\>