Download : sample-001.c ( utf8 版 )
/*
* 2016/10/28 sample-001.c
*/
/*
* 多次元配列
*
* 利用方法
* コンパイル
* cc -I../include -o sample-001.exe sample-001.c
* 実行
* ./sample-001.exe
*/
#include <stdio.h>
/*
* main
*
*/
int main( int argc, char *argv[] )
{
int a[3][4]; /* 二次元配列の宣言 3 x 4 個の変数を宣言 */
/* int a00, a01, .., a03, a10, .., a13, .., a23; と同様 */
int i;
int j;
a[0][0] = 0; /* 添字は、二つ必要 ( 二次なので.. ) で、0 から始まる */
a[2][3] = 6; /* 添字の大きさは、配列の大きさ - 1 まで */
/* 0 〜 2 と 0 〜 3 のかけ算表をつくってみる */
for ( i = 0; i < 3; i++ ) {
for ( j = 0; j < 4; j++ ) {
a[i][j] = i * j;
}
}
printf ( "2 * 1 = %d\n", a[2][1] ); /* 2 と表示される筈 */
if ( a[1][2] == a[2][1] ) { /* 1 * 2 = 2 * 1 か ? */
printf ( "1 * 2 = 2 * 1 が成立\n" );
} else {
printf ( "1 * 2 = 2 * 1 が成立しない.. 何か変だ..\n" );
}
/* 0 〜 2 と 0 〜 3 のかけ算表を画面に表示 */
printf ( " * |" );
for ( j = 0; j < 4; j++ ) {
printf ( "%2d", j );
}
printf ( "\n" );
printf ( "---+---------\n" );
for ( i = 0; i < 3; i++ ) {
printf ( " %1d |", i );
for ( j = 0; j < 4; j++ ) {
printf ( "%2d", a[i][j] );
}
printf ( "\n" );
}
return 0;
}
$ ./sample-001.exe 2 * 1 = 2 1 * 2 = 2 * 1 が成立 * | 0 1 2 3 ---+--------- 0 | 0 0 0 0 1 | 0 1 2 3 2 | 0 2 4 6 $
Download : sample-002.c ( utf8 版 )
/*
* 2016/10/28 sample-002.c
*/
/*
* 集合の操作は操作の集合
*
* 利用方法
* コンパイル
* cc -I../include -o sample-002.exe sample-002.c
* 実行
* ./sample-002.exe
*/
#include <stdio.h>
/*
* main
*
*/
#define ARRAY_SIZE 5 /* 配列のサイズを 5 とする */
int main( int argc, char *argv[] )
{
int a[ARRAY_SIZE]; /* ARRAY_SIZE の配列の宣言 */
int i;
for ( i = 0; i < ARRAY_SIZE; i++ ) {
a[i] = 2 * i; /* 一桁の偶数の表を作る */
}
/* 偶数を出力 */
for ( i = 0; i < ARRAY_SIZE; i++ ) {
printf ( "%d ", a[i] );
}
printf ( "\n" );
/* 全ての要素に 1 を加えれば奇数の表になる */
for ( i = 0; i < ARRAY_SIZE; i++ ) {
a[i] = a[i] + 1;
}
/* 奇数を出力 */
for ( i = 0; i < ARRAY_SIZE; i++ ) {
printf ( "%d ", a[i] );
}
printf ( "\n" );
return 0;
}
$ ./sample-002.exe 0 2 4 6 8 1 3 5 7 9 $
Download : sample-003.c ( utf8 版 )
/*
* 2016/10/28 sample-003.c
*/
/*
* 文字配列と文字列 (1)
*
* 利用方法
* コンパイル
* cc -I../include -o sample-003.exe sample-003.c
* 実行
* ./sample-003.exe
*/
#include <stdio.h>
/*
* main
*
*/
#define CSIZE 10
#define EOS '\0'
int main( int argc, char *argv[] )
{
char cary[CSIZE];
cary[0] = 'a';
cary[1] = 'b';
cary[2] = 'c';
cary[3] = EOS;
/*
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
cary|'a'|'b'|'c'|EOS| ? | ? | ? | ? | ? | ? |
*/
printf ( "普通に文字列 \"abc\" を出力してみる : %s\n", "abc" );
/* 文字列を出力する場合の書式は「%s」を利用する */
printf ( "文字列の代りに文字配列を出力してみる : %s\n", cary );
/* 文字列の代りに文字配列名が使える */
return 0;
}
$ ./sample-003.exe 普通に文字列 "abc" を出力してみる : abc 文字列の代りに文字配列を出力してみる : abc $
Download : sample-004.c ( utf8 版 )
/*
* 2016/10/28 sample-004.c
*/
/*
* 文字配列と文字列 (2)
*
* 利用方法
* コンパイル
* cc -I../include -o sample-004.exe sample-004.c
* 実行
* ./sample-004.exe
*/
#include <stdio.h>
/*
* main
*
*/
#define CSIZE 10
#define EOS '\0'
int main( int argc, char *argv[] )
{
char cary[CSIZE] = { 'a', 'b', 'c', 'd', 'e', EOS };
/*
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? |
*/
int i;
int l;
/*
* 文字列と文字配列
*/
printf ( "最初の cary = %s\n", cary );
/*
* 文字の変更
*/
cary[2] = 'A'; /* 文字列の途中の文字を差し替える */
/*
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
cary|'a'|'b'|'A'|'d'|'e'|EOS| ? | ? | ? | ? |
*/
printf ( "文字列の途中の文字を変更すると cary = %s\n", cary );
/*
* 文字の尻尾を切断
*/
cary[3] = EOS; /* 文字列の後ろを切断 */
/*
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
cary|'a'|'b'|'A'|EOS|'e'|EOS| ? | ? | ? | ? |
*/
printf ( "文字列を途中で切ると cary = %s\n", cary );
/*
* 文字を尻尾に追加
*/
cary[3] = 'X';
cary[5] = 'Y';
cary[6] = 'Z';
cary[7] = EOS; /* 文字列の最後に EOS を忘れずに !! */
/*
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
cary|'a'|'b'|'A'|'X'|'e'|'Y'|'Z'|EOS| ? | ? |
*/
printf ( "文字列の後ろに文字を追加すると cary = %s\n", cary );
/*
* 文字配列の出力
*/
printf ( "printf を使わず、文字配列を文字列のように出力すると : " );
for ( i = 0; cary[i] != EOS; i++ ) {
putchar ( cary[i] );
}
printf ( "と、なります。\n" );
/* 文字列の長さを求める */
for ( l = 0; cary[l] != EOS; l++ ) {
/* やる事は何もない (l を増やす事が目的) */
}
/* cary の中の文字列の長さは、変数 l に入る */
printf ( "文字列 %d の長さは %d です。\n", cary, l );
/*
* 途中の文字を削除
*/
for ( i = 3; cary[i] != EOS; i++ ) {
cary[i] = cary[i+1];
}
/* 文字列の途中(4 文字目)の文字('X')を削除 */
/*
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
cary|'a'|'b'|'A'|'X'|'e'|'Y'|'Z'|EOS| ? | ? |
| | | / / / /
|'a'|'b'|'A'|'e'|'Y'|'Z'|EOS|EOS| ? | ? |
*/
printf ( "文字列の途中の文字を削除すると cary = %s\n", cary );
return 0;
}
$ ./sample-004.exe 最初の cary = abcde 文字列の途中の文字を変更すると cary = abAde 文字列を途中で切ると cary = abA 文字列の後ろに文字を追加すると cary = abAXeYZ printf を使わず、文字配列を文字列のように出力すると : abAXeYZと、なります。 文字列 -2075021440 の長さは 7 です。 文字列の途中の文字を削除すると cary = abAeYZ $
Download : sample-005.c ( utf8 版 )
/*
* 2016/10/28 sample-005.c
*/
/*
* 配列の要素の参照
*
* 利用方法
* コンパイル
* cc -I../include -o sample-005.exe sample-005.c
* 実行
* ./sample-005.exe
*/
#include <stdio.h>
/*
* main
*
*/
#define ARRAY_SIZE 10
int main( int argc, char *argv[] )
{
int iary[ARRAY_SIZE];
int i;
/* 配列の初期化 */
/* iary[i] = i*i */
for ( i = 0; i < ARRAY_SIZE; i++ ) {
iary[i] = i*i;
}
/*
これで、iary は i=0〜9 なら、関数 f(x)=x^2 と同じ振舞いをする
*/
return 0;
}
$ ./sample-005.exe $
Download : sample-010.c ( utf8 版 )
/*
* 2016/10/28 sample-010.c
*/
/*
* 様々な配列の要素の参照方法
*
* 利用方法
* コンパイル
* cc -I../include -o sample-010.exe sample-010.c
* 実行
* ./sample-010.exe
*/
#include <stdio.h>
/*
* main
*
*/
int main( int argc, char *argv[] )
{
int a[3][4]; /* 二次元配列の宣言 3 x 4 個の変数を宣言 */
/* int a00, a01, .., a03, a10, .., a13, .., a23; と同様 */
int i;
int j;
a[0][0] = 0; /* 添字は、二つ必要 ( 二次なので.. ) で、0 から始まる */
a[2][3] = 6; /* 添字の大きさは、配列の大きさ - 1 まで */
/* 0 〜 2 と 0 〜 3 のかけ算表をつくってみる */
for ( i = 0; i < 3; i++ ) {
for ( j = 0; j < 4; j++ ) {
a[i][j] = i * j;
}
}
printf ( "2 * 1 = %d\n", a[2][1] ); /* 2 と表示される筈 */
if ( a[1][2] == a[2][1] ) { /* 1 * 2 = 2 * 1 か ? */
printf ( "1 * 2 = 2 * 1 が成立\n" );
} else {
printf ( "1 * 2 = 2 * 1 が成立しない.. 何か変だ..\n" );
}
/* 0 〜 2 と 0 〜 3 のかけ算表を画面に表示 */
printf ( " * |" );
for ( j = 0; j < 4; j++ ) {
printf ( "%2d", j );
}
printf ( "\n" );
printf ( "---+---------\n" );
for ( i = 0; i < 3; i++ ) {
printf ( " %1d |", i );
for ( j = 0; j < 4; j++ ) {
printf ( "%2d", a[i][j] );
}
printf ( "\n" );
}
return 0;
}
$ ./sample-010.exe 2 * 1 = 2 1 * 2 = 2 * 1 が成立 * | 0 1 2 3 ---+--------- 0 | 0 0 0 0 1 | 0 1 2 3 2 | 0 2 4 6 $
/*
* 課題 20161021-02
*
* 20161021 20161021-02-QQQQ.c
*
* 二次元行列型の定義と計算
*/
#include <stdio.h>
/*
* #define A B -> 以後、A が現れると B に置き換えられる
*/
#define DIMENSION 2 /* 二次元 */
/*
* 行列 A は、2 x 2 = 4 の要素をもっている
*
* A = ( 1 2 ) = ( a[0][0] a[0][1] )
* 3 4 a[1][0] a[1][1]
*
* A = ( a_11 a_12 ) = ( a b ) => typedef struct {
* a_21 a_22 c d double a; double b; double c; double d; }
*/
typedef struct {
double a[DIMENSION][DIMENSION]; /* 二次元の行列の要素は 2 x 2 */
} Matrix2D; /* Matrix2D 型の宣言 */
/*
* Matrix2D make_Matrix2D ( double a, double b, double c, double d )
* 「行列」を作成する
*
* A = ( a b ) = ( a[0][0], a[0][1] )
* ( c d ) ( a[1][0], a[1][1] )
*/
Matrix2D make_Matrix2D ( double a, double b, double c, double d ) {
Matrix2D newMatrix2D; /* 新しい行列 */
newMatrix2D.a[0][0] = a;
newMatrix2D.a[0][1] = b;
newMatrix2D.a[1][0] = c;
newMatrix2D.a[1][1] = d;
return newMatrix2D;
}
/*
* void print_Matrix2D ( Matrix2D ary );
* 「行列」を表示する (表示の都合上、常に独立した行に出力する)
* Matrix2D ary; 二次元行列
*/
void print_Matrix2D ( Matrix2D ary ) {
int r; /* 行 ( row ) */
int c; /* 列 ( colomun ) */
for ( r = 0; r < DIMENSION; r++ ) {
printf ( "(" );
for ( c = 0; c < DIMENSION; c++ ) {
printf ( " %10.5f", ary.a[r][c] );
/*
* [注意] %10.5f は %f と同じく浮動小数点数を出力するが
* 「全体の桁数は 10 桁、小数点数以下は 5 桁にする」
* という「表示上の指定」も加わっている
* 詳しくは google で「printf 書式」で検索
*/
}
printf ( " )\n" );
}
}
/*
* Matrix2D add_Matrix2D ( Matrix2D a1, Matrix2D a2 );
* 「行列」の和
*
* ( a b ) + ( e f ) = ( a + e b + f )
* ( c d ) ( g h ) ( c + g g + h )
*/
Matrix2D add_Matrix2D ( Matrix2D a1, Matrix2D a2 ) {
Matrix2D result; /* 計算結果 */
int r; /* 行 ( row ) */
int c; /* 列 ( colomun ) */
for ( r = 0; r < DIMENSION; r++ ) {
for ( c = 0; c < DIMENSION; c++ ) {
result.a[r][c] = a1.a[r][c] + a2.a[r][c];
}
}
/*
typedef struct {
double a;
double b;
double c;
double d;
}Matrix2D;
としていたら、この部分は
result.a = a1.a + a2.a;
result.b = a1.b + a2.b;
result.c = a1.c + a2.c;
result.d = a1.d + a2.d;
二次だと大した量ではない
これが三次だと、9個になり、四次だと16個になるのだ大変
*/
return result;
}
/*
* Matrix2D sub_Matrix2D ( Matrix2D a1, Matrix2D a2 );
* 「行列」の差
*
* ( a b ) - ( e f ) = ( a - e b - f )
* ( c d ) ( g h ) ( c - g g - h )
*/
Matrix2D sub_Matrix2D ( Matrix2D a1, Matrix2D a2 ) {
Matrix2D result; /* 計算結果 */
int r; /* 行 ( row ) */
int c; /* 列 ( colomun ) */
for ( r = 0; r < DIMENSION; r++ ) {
for ( c = 0; c < DIMENSION; c++ ) {
result.a[r][c] = a1.a[r][c] - a2.a[r][c];
}
}
return result;
}
/*
* Matrix2D mul_Matrix2D ( Matrix2D a1, Matrix2D a2 );
* 「行列」の積
*
* ( a b ) ( e f ) = ( a * e + b * g a * f + b * h )
* ( c d ) ( g h ) ( c * e + d * g c * f + d * h )
*/
Matrix2D mul_Matrix2D ( Matrix2D a1, Matrix2D a2 ) {
Matrix2D result; /* 計算結果 */
int r; /* 行 ( row ) */
int c; /* 列 ( colomun ) */
int i;
for ( r = 0; r < DIMENSION; r++ ) {
for ( c = 0; c < DIMENSION; c++ ) {
double products = 0.0; /* a1 の r 行と a2 の c 列の内積の結果 */
/* a1 の r 行と a2 の c 列の内積を計算する */
/*
result.a[r][c]
= (a1[r][0] a1[r][1]) ( a2[0][c] )
a2[1][c]
= a1[r][0]*a2[0][c]+a1[r][1]*a2[1][c]
products = a1[r][0]*a2[0][c]+a1[r][1]*a2[1][c];
products = 0.0
+a1[r][0]*a2[0][c]
+a1[r][1]*a2[1][c];
products = 0.0
prdoucts = prdoucts + a1[r][0]*a2[0][c]
prdoucts = prdoucts + a1[r][1]*a2[1][c]
products = 0.0
i=0;
prdoucts = prdoucts + a1[r][i]*a2[i][c]
i=1;
prdoucts = prdoucts + a1[r][i]*a2[i][c]
products = 0.0
i=0;
prdoucts = prdoucts + a1[r][i]*a2[i][c]
i=i+1;
prdoucts = prdoucts + a1[r][i]*a2[i][c]
i=i+1;
*/
for ( i = 0; i < DIMENSION; i++ ) {
prdoucts = prdoucts + a1[r][i]*a2[i][c]
}
/*
** この部分を完成させなさい
*/
result.a[r][c] = products;
}
}
return result;
}
/*
* print_result 演算結果を出力する
*/
void print_result ( Matrix2D a1, Matrix2D a2, char *operator, Matrix2D a ) {
printf ( "%s の計算\n", operator );
print_Matrix2D ( a1 );
printf ( " と、 \n" );
print_Matrix2D ( a2 );
printf ( " との、%s は \n", operator );
print_Matrix2D ( a );
printf ( " です。\n\n" );
}
/*
* main
*/
int main( int argc, char *argv[] )
{
/*
a1 = ( 1 2 )
( 3 -1 )
a2 = ( -3 1 )
( 1 -2 )
*/
Matrix2D a1 = make_Matrix2D ( 1.0, 2.0, 3.0, -1.0 );
Matrix2D a2 = make_Matrix2D ( -3.0, 1.0, 1.0, -2.0 );
/* 和の出力 */
print_result ( a1, a2, "和", add_Matrix2D ( a1, a2 ) );
/* 差の出力 */
/*
** この部分を完成させなさい
*/
/* 積の出力 */
/*
** この部分を完成させなさい
*/
return 0;
}
/*
* 課題 20161021-03
*
* 20161021 20161021-03-QQQQ.c
*
* 整数型の配列を作り、それに 5 個のデータを入力し
* その値を 5 倍にしたものと 2 分の 1 にした値を
* それぞれ、画面に出力するプログラムを作りなさい
*
*/
#include <stdio.h>
int main(int ac, char *av[]) {
int a[5]; /* サイズ 5 の整数型の配列 */
int i; /* 添字変数 i を宣言 */
/* i++ <-> i=i+1 */
for ( i = 0; i < 5; i++ ) { /* 配列 a に数値を読み込む */
printf ( "%d 番目の整数値を入力してください : ", i+1 );
scanf ( "%d", &a[i] );
}
/* 入力された個々の値を 5 倍した物を出力 */
for ( i = 0; i < 5; i++ ) {
printf ( "%d\n", a[i] * 5 ); /* 5 倍 */
}
/* 入力された個々の値を 1/2 した物を出力 */
for ( i = 0; i < 5; i++ ) {
printf ( "%d\n", /* q:ここ */ ); /* 2 分の 1 */
}
return 0;
}
#include <stdio.h>
int main(int ac, char *av[]) {
int a; /* 三つの変数を宣言 */
int b;
int c;
printf ( "1 つ目の整数 : " );
scanf ( "%d", &a );
printf ( "2 つ目の整数 : " );
scanf ( "%d", &b );
printf ( "3 つ目の整数 : " );
scanf ( "%d", &c );
if ( a < b ) {
if ( b < c ) {
printf ( "一番大きいのは %d です\n", c );
} else {
printf ( "一番大きいのは %d です\n", b );
}
} else {
if ( a < c ) {
printf ( "一番大きいのは %d です\n", c );
} else {
printf ( "一番大きいのは %d です\n", a );
}
}
return 0;
}
#include <stdio.h>
int main(int ac, char *av[]) {
int v[3]; /* 三つの要素を持つ配列を宣言 */
/* v[0], v[1], v[2] という三つの変数が宣言されたのと同じ */
/* v[i] => 繰り返しと組み合わせで、プログラムが短くなる */
printf ( "1 つ目の整数 : " );
scanf ( "%d", &v[0] );
printf ( "2 つ目の整数 : " );
scanf ( "%d", &v[1] );
printf ( "3 つ目の整数 : " );
scanf ( "%d", &v[2] );
if ( v[0] < v[1] ) {
if ( v[1] < v[2] ) {
printf ( "一番大きいのは %d です\n", v[2] );
} else {
printf ( "一番大きいのは %d です\n", v[1] );
}
} else {
if ( v[0] < v[2] ) {
printf ( "一番大きいのは %d です\n", v[2] );
} else {
printf ( "一番大きいのは %d です\n", v[0] );
}
}
return 0;
}
#include <stdio.h>
int main(int ac, char *av[]) {
int v[3]; /* 三つの要素を持つ配列を宣言 */
/* v[0], v[1], v[2] という三つの変数が宣言されたのと同じ */
/* 配列 v の要素 ( v[0], v[1], v[2] ) を参照する場合は
v[整数式] と書けばよい
v[1+1] => v[2]
v[3-3] => v[0]
さらに
i=2
v[i-1] => v[2-1] => v[1]
「v[i]」が、「v[0]」になるか、それとも「v[1]」
になるかは、i の値に決まる
a=1; 変数 a に必ず 1 が入る
v[0]=1 配列 v の最初の要素に 1 が入る
v[i]=1 配列 v のどの要素に 1 が入るかは、i 次第
悪し : 判りにくい(どの要素にはいるのかわからない)
良し : どの要素にいれるかを後から決められる
間接参照の利点
*/
int i; /* 配列参照するための変数(インデックス[添え字]変数) */
i=0;
while ( i < 3 ) {
printf ( "%d つ目の整数 : ", i + 1 );
scanf ( "%d", &v[i] );
i=i+1; /* i=1 */
}
/* 配列は、同じ型(同じ処理の対象なる物を表現する)変数の並び */
/* 繰り返しと組みあわせて、利用すると良い */
/* 構造体が、順接と組みあせる */
if ( v[0] < v[1] ) {
if ( v[1] < v[2] ) {
printf ( "一番大きいのは %d です\n", v[2] );
} else {
printf ( "一番大きいのは %d です\n", v[1] );
}
} else {
if ( v[0] < v[2] ) {
printf ( "一番大きいのは %d です\n", v[2] );
} else {
printf ( "一番大きいのは %d です\n", v[0] );
}
}
return 0;
}
#include <stdio.h>
int main(int ac, char *av[]) {
int v[3]; /* 三つの要素を持つ配列を宣言 */
/* v[0], v[1], v[2] という三つの変数が宣言されたのと同じ */
/* 配列 v の要素 ( v[0], v[1], v[2] ) を参照する場合は
v[整数式] と書けばよい
v[1+1] => v[2]
v[3-3] => v[0]
さらに
i=2
v[i-1] => v[2-1] => v[1]
「v[i]」が、「v[0]」になるか、それとも「v[1]」
になるかは、i の値に決まる
a=1; 変数 a に必ず 1 が入る
v[0]=1 配列 v の最初の要素に 1 が入る
v[i]=1 配列 v のどの要素に 1 が入るかは、i 次第
悪し : 判りにくい(どの要素にはいるのかわからない)
良し : どの要素にいれるかを後から決められる
間接参照の利点
*/
int i; /* 配列参照するための変数(インデックス[添え字]変数) */
int mi; /* max number index (最大の数が入っている要素の添え字) */
i=0;
while ( i < 3 ) {
printf ( "%d つ目の整数 : ", i + 1 );
scanf ( "%d", &v[i] );
i=i+1; /* i=1 */
}
/* 配列は、同じ型(同じ処理の対象なる物を表現する)変数の並び */
/* 繰り返しと組みあわせて、利用すると良い */
/* 構造体が、順接と組みあせる */
/* 以下は、一番大きい数値を出力する */
/* 配列の場合、一番大きい数値を持つ要素の添え字を考える */
mi=0; /* 最初は、v[0] が一番大きい数をもっていると仮定 */
if ( v[mi] < v[1] ) {
/* v[mi] ( = v[0] ) と v[i] を比較 */
mi=1; /* v[0] より v[1] の方が大きいので、mi=0は誤りで、
より正しいのは mi=1 である */
} /* else { mi=0; } は、もともとも mi=0 なので不要 */
if ( v[mi] < v[2] ) {
mi=2;
}
printf ( "一番大きいのは %d です\n", v[mi] );
return 0;
}
#include <stdio.h>
#define NUMBERS 10 /* 10 個の数の中から最大値を求める */
int main(int ac, char *av[]) {
int v[NUMBERS];
int i; /* 配列参照するための変数(インデックス[添え字]変数) */
int mi; /* max number index (最大の数が入っている要素の添え字) */
i=0;
while ( i < NUMBERS ) {
printf ( "%d つ目の整数 : ", i + 1 );
scanf ( "%d", &v[i] );
i=i+1; /* i=1 */
}
/* 配列は、同じ型(同じ処理の対象なる物を表現する)変数の並び */
/* 繰り返しと組みあわせて、利用すると良い */
/* 構造体が、順接と組みあせる */
/* 以下は、一番大きい数値を出力する */
/* 配列の場合、一番大きい数値を持つ要素の添え字を考える */
mi=0; /* 最初は、v[0] が一番大きい数をもっていると仮定 */
i=1;
while ( i < NUMBERS ) {
if ( v[mi] < v[i] ) {
mi=i;
}
i=i+1;
}
printf ( "一番大きいのは %d です\n", v[mi] );
return 0;
}
#include <stdio.h>
/*
構造体では、メンバーとして、基本型(C 言語で予め用意されている
型:例えば、int, char, double, etc..等)の他に、ユーザーが作った
型(例えば、構造体型)も許される。
例
typedef struct {
int x;
int y;
} Point; 点型
typedef struct {
Point pt;
char name;
} NamedPoint; 名前つきの点
!! もちろん、配列もメンバーに含めることができる
typedef struct {
int x[3];
} Point3D;
=>
配列も、基本型の配列だけでなく、ユーザ定義の型が使える
Point points[10]; Point 型の配列
配列の配列も作れる
*/
int main(int ac, char *av[]) {
int a[3]; /* a[0], a[1], a[2] の三つの要素[変数]を持つ配列 */
int b[3] = { 1,2,3 }; /* 配列の要素の値をまとめて所期化できる */
/*
b[0] = 1;
b[1] = 2:
b[2] = 3:
と同じ
*/
int c[3][2]; /* 配列の配列 */
/* => { c[0], c[1], c[2] }
=> c[0]={c[0][0], c[0][1]}
c[0] はサイズ 2 の整数型の配列
*/
/* => {
{ c[0][0], c[0][1] }.
{ c[1][0], c[1][1] }.
{ c[2][0], c[2][1] } } */
/* サイズ 2 の配列を要素とする、 サイズ 3 の配列 */
/* 「実質」、二次元配列 = 行列
c[0][0], c[0][1],
c[1][0], c[1][1],
c[2][0], c[2][1]
の 6 = 2 x 3 の要素を持つ */
*/
/* さらに、配列の配列の配列(3 次元の配列)も作れるし、
一般い k 次元の配列が利用できる */
return 0;
}
#include <stdio.h>
int main(int ac, char *av[]) {
int a[5] = { 0, 1, 4, 9, 16 };
/* a[i] = i^2 = i * i */
/* 配列を関数表と利用する : 定義域 0 ... の非負の整数だけ */
int i;
for ( i = 0; i < 5; i++ ) {
printf ( "a[%d]=%d, %d*%d = %d\n", i, a[i], i, i, i*i );
}
return 0;
}
#include <stdio.h>
/* あたかも、「a = array」となっているかのように見える */
void print5array ( int a[5] ) {
int i;
for ( i = 0; i < 5; i++ ) {
printf ( "a[%d]=%d, %d*%d = %d\n", i, a[i], i, i, i*i );
}
}
int main(int ac, char *av[]) {
int array[5] = { 0, 1, 4, 9, 16 };
/* array[i] = i^2 = i * i */
/* 配列を関数表と利用する : 定義域 0 ... の非負の整数だけ */
print5array ( array ); /* 配列名は、引数に与えることができる */
return 0;
}
#include <stdio.h>
typedef struct {
int array[5];
} Array5;
/*
構造体を利用した型では、代入ができる
では、配列は ?
見かけは、代入できているように見えるが、実は、違う
*/
void print5array ( Array5 a ) {
int i;
for ( i = 0; i < 5; i++ ) {
printf ( "a[%d]=%d, %d*%d = %d\n", i, a.array[i], i, i, i*i );
}
}
int main(int ac, char *av[]) {
Array5 a = {{ 0, 1, 4, 9, 16 }};
/* Array5.array[i] = i^2 = i * i */
/* 配列を関数表と利用する : 定義域 0 ... の非負の整数だけ */
print5array ( a ); /* 配列名は、引数に与えることができる */
return 0;
}
#include<stdio.h>
#define SIZE 100000
int add_2_elements ( int a[SIZE] ) {
return a[0] + a[1];
}
int main(int ac, char *av[]) {
int a[SIZE] = { 1, 2, }; /* 3 っ目以後は省略 */
int i;
for ( i = 0; i < 10000; i++ ) {
add_2_elements ( a ); /* 無意味に関数を繰り返し呼ぶ */
}
return 0;
}
#include<stdio.h>
#define SIZE 100000
typedef struct {
int body[SIZE];
} StructA;
int add_2_elements ( StructA a ) {
return a.body[0] + a.body[1];
}
int main(int ac, char *av[]) {
StructA a = {{ 1, 2, }}; /* 3 っ目以後は省略 */
int i;
for ( i = 0; i < 10000; i++ ) {
add_2_elements ( a ); /* 無意味に関数を繰り返し呼ぶ */
}
return 0;
}
#include <stdio.h>
void sub(int array[3]) {
printf ( "array[0] = %d\n", array[0] );
array[0] = 999;
printf ( "array[0] = %d\n", array[0] );
}
int main(int ac, char *av[]) {
int a[3];
a[0] = 10;
sub ( a );
printf ( "a[0] = %d\n", a[0] );
return 0;
}
#include <stdio.h>
typedef struct {
int body[3];
} Array3;
void sub(Array3 array) {
printf ( "array.body[0] = %d\n", array.body[0] );
array.body[0] = 999;
printf ( "array.body[0] = %d\n", array.body[0] );
}
int main(int ac, char *av[]) {
Array3 b;
b.body[0] = 10;
sub ( b );
printf ( "b.body[0] = %d\n", b.body[0] );
return 0;
}
Download : 20161028-01.c ( utf8 版 )
/*
* 課題 20161028-01
*
* 2016/10/28 20161028-01-QQQQ.c
*
* 浮動小数点数の配列の要素内の数値の総和を求める。
*/
#include <stdio.h>
/*
* 浮動小数点数の配列の要素内の数値の総和を求める。
*
* 利用方法
* コンパイル
* cc -o BASENAME.exe 20161028-01-QQQQ.c
* 実行
* ./BASENAME.exe
*/
#include <stdio.h>
/*
* double dsum ( double ary[], int size )
* 浮動小数点数の配列の要素内の数値の総和を求める関数
* double ary[]; 総和を求める要素を含む配列
* int size; 配列のサイズ
*/
double dsum ( double ary[], int size ) {
double sum = 0.0; /* 総和は最初は 0 */
int i; /* 配列の要素を参照する添字変数 */
for ( i = 0; i < size; i++ ) { /* i = 0 〜 sum - 1 の間.. */
/*
** この部分を完成させなさい
*/
/* 「sum += ary[i]」とも書きける */
}
return sum; /* 結果を返す */
}
/*
* main
*/
#define ARY_SIZE 5
int main( int argc, char *argv[] )
{
double data[ARY_SIZE]; /* 大きさ ARY_SIZE の配列の宣言 */
int i; /* 配列の要素を参照する添字変数 */
double sum; /* 総和の計算結果を保持する */
printf ( "%d 個のデータを入力します。\n", ARY_SIZE );
for ( i = 0; i < ARY_SIZE; i++ ) {
printf ( "%d 番目の数値を入力してください : ", i + 1 );
/*
** この部分を完成させなさい
*/
}
sum = dsum ( data, ARY_SIZE );
printf ( "入力されたデータの総和は %f です。\n", sum );
return 0;
}
2.3 9.1 5.9 2.7 3.2
$ ./20161028-01-QQQQ.exe 5 個のデータを入力します。 1 番目の数値を入力してください : 2.300000 2 番目の数値を入力してください : 9.100000 3 番目の数値を入力してください : 5.900000 4 番目の数値を入力してください : 2.700000 5 番目の数値を入力してください : 3.200000 入力されたデータの総和は 23.200000 です。 $
Download : 20161028-02.c ( utf8 版 )
/*
* 課題 20161028-02
*
* 20161028 20161028-02-QQQQ.c
*
* 文字列の途中に文字を挿入する
*
* 利用方法
* コンパイル
* cc -o BASENAME.exe 20161028-02-QQQQ.c
* 実行
* ./BASENAME.exe
*/
#include <stdio.h>
/*
*
*/
/*
* main
*
*/
#define CSIZE 10
#define EOS '\0'
int main( int argc, char *argv[] )
{
char cary[CSIZE] = { 'a', 'b', 'c', 'd', 'e', EOS };
/*
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? |
*/
int i;
int l;
printf ( "最初の cary = %s\n", cary );
/*
文字列 "abcde" の入った文字配列 cary の
3 文字目 ('c') と 4 文字目 'd' の間に、一文字 'X' を入れる
*/
/* 文字列の長さを求める */
/*
** この部分を完成させなさい
*/
/* cary の中の文字列の長さは、変数 l に入る */
for ( i = l; 3 <= i; i-- ) { /* 後ろからコピーする必要がある */
/*
** この部分を完成させなさい
*/
}
cary[3] = 'X'; /* 空けた場所に 'X' を入れる */
/*
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? |
| | | \ \ \
cary|'a'|'b'|'c'|'X'|'d'|'e'|EOS| ? | ? | ? | ? |
*/
printf ( "'X' を挿入した結果 : %s\n", cary );
return 0;
}
123 987 456
$ ./20161028-02-QQQQ.exe 最初の cary = abcde 'X' を挿入した結果 : abcXde $