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\>