当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/* * CDATE sample-001.c */ /* * printf の書式付き出力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-001.exe sample-001.c * 実行 * sample-001 */ #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 版 )
/* * CDATE sample-002.c */ /* * printf の書式付き出力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-002.exe sample-002.c * 実行 * sample-002 */ #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 版 )
/* * CDATE sample-003.c */ /* * scanf の書式付き入力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-003.exe sample-003.c * 実行 * sample-003 */ #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 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 版 )
/* * CDATE sample-004.c */ /* * printf で書式を間違えると何がおきるのか * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-004.exe sample-004.c * 実行 * sample-004 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int i = 123; double d = 456.789; /* * 整数値 */ printf ( "整数値 %d を浮動小数点数値として出力すると %f になります。\n", i, i ); /* * 浮動小数点数 */ printf ( "浮動小数点数値 %f を整数値として出力すると %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 版 )
/* * CDATE sample-001.c */ /* * scanf の書式付き入力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-001.exe sample-001.c * 実行 * sample-001 */ #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-001< sample-001.in 整数値を入力してください : 789 整数値 789 が入力されました。 浮動小数点値を入力してください : 123.456000 浮動小数点値 123.456000 が入力されました。 C:\usr\c>
Download : sample-006.c ( SJIS 版 )
/* * CDATE sample-002.c */ /* * scanf の書式付き入力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-002.exe sample-002.c * 実行 * sample-002 */ #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 版 )
/* * CDATE sample-007.c */ /* * sscanf の書式付き入力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-007.exe sample-007.c * 実行 * sample-007 */ #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 版 )
/* * CDATE sample-008.c */ /* * ファイルへの I/O (入力 : fscanf) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-008.exe sample-008.c * 実行 * sample-008 * * あらかじめ、整数値が一つ入った "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 ファイル中の整数値は 123 でした。 C:\usr\c>
Download : sample-009.c ( SJIS 版 )
/* * CDATE sample-009.c */ /* * ファイルへの I/O (入力 : fprintf ) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-009.exe sample-009.c * 実行 * sample-009 * */ #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> type output.txt 123 C:\usr\c>
Download : sample-010.c ( SJIS 版 )
/* * 2013/09/27 sample-010.c */ /* * 平面上の点を扱う * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-010.exe sample-010.c -lm * 実行 * sample-010 * */ #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 版 )
/* * 2013/09/27 sample-011.c */ /* * 平面上の点の操作 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-011.exe sample-011.c * 実行 * sample-011 * */ #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 版 )
/* * 2013/09/27 sample-012.c */ /* * 平面上の点の操作 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-012.exe sample-012.c * 実行 * sample-012 * */ #include <stdio.h> /* * 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_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 版 )
/* * 2013/09/27 sample-013.c */ /* * 平面上の点の操作 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-013.exe sample-013.c * 実行 * sample-013 * */ #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 版 )
/* * 2013/09/27 sample-014.c */ /* * 平面上の点を扱う * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-014.exe sample-014.c -lm * 実行 * sample-014 * */ #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> /* 標準入力から、整数値を一つ入力し、 それを標準出力に出力する */ int main(int argc, char *argv[] ) { int i; /* 入出力する整数値を保存する変数 */ scanf ( "%d", &i ); /* 標準入力から入力 */ /* 「%d」は、整数値として入力 */ /* 変数 i の前の「&」はお呪い(後で解説) */ printf ( "%d\n", i ); /* 標準出力に整数値を出力 */ return 0; }
/* * CDATE sample-001.c */ /* * printf の書式付き出力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-001.exe sample-001.c * 実行 * sample-001 */ #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' ); /* ^^ ^^ */ /* x 120 'x' に対応する ASCII(文字) Code */ printf ( "「小さな整数値(文字コード)」は「文字」に対応\n" ); printf ( "%d -> %c\n", 97, 97 ); /* ^^ ^^ */ /* 97 a ASCII (文字) Code が 97 である文字 */ /* * ASCII Code 表を参照 (http://e-words.jp/p/r-ascii.html) */ return 0; }
#include <stdio.h> int main ( int argc, char *argv[] ) { putchar ( 'A' ); /* 'A' を画面に表示する */ putchar ( 'A' + 1 ); /* 'A' の次の 'B' がでる */ /* 文字 ASCII Code(整数値) 'A' <-> 65 'A'+1 <-> 65 + 1 || || 'B' <-> 66 */ return 0; }
/* * CDATE sample-002.c */ /* * printf の書式付き出力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-002.exe sample-002.c * 実行 * sample-002 */ #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++; /* i = i + 1; -> i を一増やす */ } return 0; }
/* * CDATE FILENAME */ /* * scanf の書式付き入力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe FILENAME * 実行 * 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 ); /* キーボードから入った「12」を「十進数」として 解釈して、その値を d に代入 */ scanf ( "%o", &o ); /* キーボードから入った「12」を「八進数」として 解釈して、その値を o に代入 */ scanf ( "%x", &x ); /* キーボードから入った「12」を「十六進数」として 解釈して、その値を 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; }
#include <stdio.h> int main(int argc, char *argv[] ) { char c1; char c2; char c3; int i; scanf ( "%c%c%c", &c1, &c2, &c3 ); scanf ( "%d", &i ); printf ( "c1=%c, c2=%c, c3=%c, i = %d\n", c1, c2, c3, i ); return 0; }
/* * CDATE sample-002.c */ /* * scanf の書式付き入力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-002.exe sample-002.c * 実行 * sample-002 */ #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; }
/* * CDATE FILENAME */ /* * sscanf の書式付き入力 * scanf - 標準入力の中からデータを切り出す * それに対して sscanf は文字列の中からデータを切り出す * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe FILENAME * 実行 * BASENAME */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int i; i = 9999; /* 確かに、文字列内からとりだせる事を確認するために最初に 0 で初期化 */ /* scanf ( "%d", &i ); */ sscanf ( "123", "%d", &i ); /* ^^^^^ 最初の引数が scanf に対して増えている */ /* 最初の引数の文字列の中から整数値 「123」が取り出せる */ printf ( "整数値 %d が文字列の中から取り出せました。\n", i ); /* 数字でない文字が含まれていると.. */ i = 9999; sscanf ( "a123", "%d", &i ); printf ( "整数値 %d が文字列の中から取り出せました。\n", i ); /* 期待した形にならない.. */ /* 書式で、不要な情報はスキップできる */ i = 9999; sscanf ( "a123", "a%d", &i ); /* ^ ^ 注目 */ /* "a123" <- printf ( "a%d", i ); */ printf ( "整数値 %d が文字列の中から取り出せました。\n", i ); /* 書式にマッチしないと上手くゆかない */ i = 9999; sscanf ( "b123", "a%d", &i ); /* ^ ^ 注目 */ printf ( "整数値 %d が文字列の中から取り出せました。\n", i ); return 0; } /* 点 (10,20) -> 10 と 20 sscanf ( "(10,20)", "(%d,%d)", &x, &y ); */
#include <stdio.h> #include "s_input.h" int main(int argc, char *argv[] ) { int a; int b; char c; printf ( "四則の計算式を入力 : " ); sscanf ( s_input_string(), "%d%c%d", &a, &c, &b ); /* ^^^^^^^^^^^^^^^^^ キーボードから一行入力 */ /* 例 : "1+2" -> "%d%c%d", &a, &c, &b a <- 1 c <- '+' b <- 2 */ if ( c == '+' ) { /* c が '+' の時なので,足し算をする */ printf ( "%d + %d = %d\n", a, b, a+b ); } else if ( c == '-' ) { /* c が '-' の時なので,引き算をする */ printf ( "%d - %d = %d\n", a, b, a-b ); } return 0; }
#include <stdio.h> int main(int argc, char *argv[] ) { int x; int y; scanf ( "(%d,%d)", &x, &y ); printf ( "Point = (%d, %d)\n", x, y ); }
/* * 課題 20130927-01 * * 2013/09/27 20130927-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; dv = 0.0; sscanf ( text, "int %d", &iv ); /* ここまでで int の値は取り出せるので これを更に考えて、double の値も一度に取り出せるように しよう.. */ 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; }
/* * CDATE sample-008.c */ /* * ファイルへの I/O (入力 : fscanf) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-008.exe sample-008.c * 実行 * sample-008 * * あらかじめ、整数値が一つ入った "input.txt" を作成してから実行する */ #include <stdio.h> /* * main * * ファイル "input.txt" の中に記録されている * 整数値(を表す文字列) を取り出す */ int main( int argc, char *argv[] ) { FILE *fp; /* ファイルポインターを收める */ /* 「FILE *」型なのだが、この詳細は今回は説明しない */ int v; /* ファイルから整数値を取り出し、この変数にいれる */ o 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; }
/* * CDATE sample-009.c */ /* * ファイルへの I/O (入力 : fprintf ) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-009.exe sample-009.c * 実行 * sample-009 * */ #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; }
/* * 課題 20130927-02 * * 2013/09/27 DATE-02-QQQQ.c * * fopen/fclose/fprintf によるファイルの書出し * * キーボードから、沢山の正の整数値を入力し、 * 最後に、負の整数値を入力する。 * そして、その入力された整数値を、 * 何番目かと一緒にファイルに記録する */ #include <stdio.h> /* * */ /* * main */ int main( int argc, char *argv[] ) { FILE *fp; /* ファイルポインター */ int input; /* 入力される整数値 */ int number; /* 何番目のデータか */ /* ** ファイルのオープンを行う */ fp = fopen ( "outfile.txt", "w" ); /* ファイル "outfile.txt" を出力モードでオープン */ /* 元々なければ新規に作成されるが元々あると上書きされ、元の内容は失われる */ if ( fp != NULL ) { /* オープンに成功 (失敗すると NULL になる) したら */ number = 1; /* 最初の入力は一番目 */ printf ( "No. %d : 正の整数を入力してください : ", number ); scanf ( "%d", &input ); /* 整数値の入力 */ while ( input > 0 ) { /* 入力される整数値が正の間 */ /* ** ファイルに情報を書込む ** */ fprintf ( fp, "%d,\t%d\n", ... ); /* 入力データをファイルに書き出す */ number++; /* number を一増やす */ printf ( "No. %d : 正の整数を入力してください : ", number ); scanf ( "%d", &input ); /* 整数値の入力 */ } /* 負の数が入力された */ /* プログラムの機能は、ここまでで終了 */ /* だが、「後始末」が必要 */ /* ** ファイルは open したら、必ず close する !! */ fclose ( .. ); /* ファイルをクローズ */ /* オープンしたら必ず閉じる !! */ } else { /* ファイルのオープンに失敗した */ printf ( "ファイルのオープンに失敗しました\n" ); /* エラーメッセージに出力 */ } return 0; }
課題プログラム内の「/*名前:ここ*/」の部分を書き換えたり、「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
なお「名前(P,Q,R,..)」の部分が同じ所には同じものが入ります。
Download : 20130927-01.c ( SJIS 版 )
/* * 課題 20130927-01 * * 2013/09/27 20130927-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\> 20130927-01-QQQQ int value = 123, double value = 123.456000 int value = -987, double value = 0.007890 C:\usr\c\>
Download : 20130927-02.c ( SJIS 版 )
/* * 課題 20130927-02 * * 2013/09/27 DATE-02-QQQQ.c * * fopen/fclose/fprintf によるファイルの書出し * */ #include <stdio.h> /* * */ /* * main */ int main( int argc, char *argv[] ) { FILE *fp; /* ファイルポインター */ int input; /* 入力される整数値 */ int number; /* 何番目のデータか */ /* ** この部分を完成させなさい */ /* ファイル "outfile.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> 20130927-02-QQQQ No. 1 : 正の整数を入力してください : 10 No. 2 : 正の整数を入力してください : 123 No. 3 : 正の整数を入力してください : 999 No. 4 : 正の整数を入力してください : -1 C:\usr\c> type outfile.txt 1, 10 2, 123 3, 999 C:\usr\c>
Download : 20130927-03.c ( SJIS 版 )
/* * 課題 20130920-03 * * 2013/09/20 DATE-03-QQQQ.c * * 行列のかけ算 * */ #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\> 20130927-03-QQQQ 1.200000 ( 2.300000 ) 3.400000 と -9.800000 ( 8.700000 ) 0.000000 の差は 11.000000 ( -6.400000 ) 3.400000 となります。 C:\usr\c\>