当日の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\>