Download : sample-001.c
/*
* 2017/11/10 sample-001.c
*/
/*
* 多次元配列
*
* 利用方法
* コンパイル
* cc -c sample-001.c
* リンク
* cc -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 (= 12) 個の変数を宣言 */
/* 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; /* 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
/*
* 2017/11/10 sample-002.c
*/
/*
* 集合の操作は操作の集合
*
* 利用方法
* コンパイル
* cc -c sample-002.c
* リンク
* cc -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; /* 一桁の偶数の表を作る */
/* a = { 0, 2, 4, 6, 8 } */
}
/* 偶数を出力 */
for ( i = 0; i < ARRAY_SIZE; i++ ) {
printf ( "%d ", a[i] );
}
printf ( "\n" );
/* 全ての要素に 1 を加えれば奇数の表になる */
/* { 0, 2, 4, 6, 8 } -> { 1, 3, 5, 7, 9 } */
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
/*
* 2017/11/10 sample-003.c
*/
/*
* 文字配列と文字列 (1)
*
* 利用方法
* コンパイル
* cc -c sample-003.c
* リンク
* cc -o sample-003.exe sample-003.c
* 実行
* ./sample-003.exe
*/
#include <stdio.h>
/*
* main
*
*/
#define CSIZE 10
#define EOS '\0' /* End Of String */
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
/*
* 2017/11/10 sample-004.c
*/
/*
* 文字配列と文字列 (2)
*
* 利用方法
* コンパイル
* cc -c sample-004.c
* リンク
* cc -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と、なります。 文字列 -1248775824 の長さは 7 です。 文字列の途中の文字を削除すると cary = abAeYZ $
Download : sample-005.c
/*
* 2017/11/10 sample-005.c
*/
/*
* 配列の要素の参照
*
* 利用方法
* コンパイル
* cc -c sample-005.c
* リンク
* cc -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 と同じ振舞いをする
*/
/*
配列参照 : 普通の「添字参照」の場合
*/
for ( i = 0; i < ARRAY_SIZE; i++ ) {
printf ( "iary[%d]=%d\n", i, iary[i] );
}
/*
配列参照 : 「間接参照("*" の利用)」の場合
*(iary + i) == iary[i]
*/
for ( i = 0; i < ARRAY_SIZE; i++ ) {
printf ( "*(iary + %d)=%d\n", i, *(iary + i) );
}
/*
配列参照 : 配列名を使った計算 ( 添字を 1 からスタート )
(iary-1)[i] = *((iary - 1) + i) == *(iary + (i-1)) = iary[i-1]
*/
for ( i = 1; i <= ARRAY_SIZE; i++ ) {
printf ( "(iary-1)[i]=%d, iary[i-1]=%d\n", i, (iary-1)[i], i, iary[i-1] );
}
return 0;
}
$ ./sample-005.exe iary[0]=0 iary[1]=1 iary[2]=4 iary[3]=9 iary[4]=16 iary[5]=25 iary[6]=36 iary[7]=49 iary[8]=64 iary[9]=81 *(iary + 0)=0 *(iary + 1)=1 *(iary + 2)=4 *(iary + 3)=9 *(iary + 4)=16 *(iary + 5)=25 *(iary + 6)=36 *(iary + 7)=49 *(iary + 8)=64 *(iary + 9)=81 (iary-1)[i]=1, iary[i-1]=0 (iary-1)[i]=2, iary[i-1]=1 (iary-1)[i]=3, iary[i-1]=4 (iary-1)[i]=4, iary[i-1]=9 (iary-1)[i]=5, iary[i-1]=16 (iary-1)[i]=6, iary[i-1]=25 (iary-1)[i]=7, iary[i-1]=36 (iary-1)[i]=8, iary[i-1]=49 (iary-1)[i]=9, iary[i-1]=64 (iary-1)[i]=10, iary[i-1]=81 $
Download : sample-006.c
/*
* 2017/11/10 sample-006.c
*/
/*
* 配列名の関数への引渡し
*
* 利用方法
* コンパイル
* cc -c sample-006.c
* リンク
* cc -o sample-006.exe sample-006.c
* 実行
* ./sample-006.exe
*/
#include <stdio.h>
/*
* 配列サイズ
*/
#define ARRAY_SIZE 10
/*
* 引数に配列を持つ関数
*/
void print_array ( int a[ARRAY_SIZE] ) {
int i;
for ( i = 0; i < ARRAY_SIZE; i++ ) {
printf ( "a[%d]=%d, %d*%d = %d\n", i, a[i], i, i, i*i );
}
}
/*
* main
*
*/
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 と同じ振舞いをする
*/
print_array ( iary ); /* 関数の引数に「配列名」を指定できる */
return 0;
}
$ ./sample-006.exe a[0]=0, 0*0 = 0 a[1]=1, 1*1 = 1 a[2]=4, 2*2 = 4 a[3]=9, 3*3 = 9 a[4]=16, 4*4 = 16 a[5]=25, 5*5 = 25 a[6]=36, 6*6 = 36 a[7]=49, 7*7 = 49 a[8]=64, 8*8 = 64 a[9]=81, 9*9 = 81 $
Download : sample-007.c
/*
* 2017/11/10 sample-007.c
*/
/*
* 配列名の関数への引渡し(2)
*
* 利用方法
* コンパイル
* cc -c sample-007.c
* リンク
* cc -o sample-007.exe sample-007.c
* 実行
* ./sample-007.exe
*/
#include <stdio.h>
/*
* 配列サイズ
*/
#define I_ARRAY_SIZE 10
#define J_ARRAY_SIZE 5
/*
* 配列のサイズは、省略可能
* サイズの異る配列に対しても同じ関数が利用できる !!
*/
void print_n_array ( int a[], int size ) {
int i;
for ( i = 0; i < size; i++ ) {
printf ( "a[%d]=%d\n", i, a[i] );
}
}
/*
* main
*
*/
int main( int argc, char *argv[] )
{
int iary[I_ARRAY_SIZE];
int jary[J_ARRAY_SIZE];
int i;
/* 配列の初期化 */
/* iary[i] = i*i */
for ( i = 0; i < I_ARRAY_SIZE; i++ ) {
iary[i] = i*i;
}
/* jary[i] = i*i*i */
for ( i = 0; i < J_ARRAY_SIZE; i++ ) {
jary[i] = i*i*i;
}
printf ( "iary: 0 〜 %d\n", I_ARRAY_SIZE - 1 );
print_n_array ( iary, I_ARRAY_SIZE ); /* iary の内容を出力 */
printf ( "jary: 0 〜 %d\n", J_ARRAY_SIZE - 1 );
print_n_array ( jary, J_ARRAY_SIZE ); /* jary の内容を出力 */
/* 配列の一部の表示も可能 */
printf ( "iary: 0 〜 %d\n", J_ARRAY_SIZE - 1 );
print_n_array ( iary, J_ARRAY_SIZE );
/* 配列の途中からの表示も可能 */
printf ( "iary: %d 〜 %d\n", J_ARRAY_SIZE, I_ARRAY_SIZE - 1 );
print_n_array ( iary + J_ARRAY_SIZE, I_ARRAY_SIZE - J_ARRAY_SIZE );
return 0;
}
$ ./sample-007.exe iary: 0 〜 9 a[0]=0 a[1]=1 a[2]=4 a[3]=9 a[4]=16 a[5]=25 a[6]=36 a[7]=49 a[8]=64 a[9]=81 jary: 0 〜 4 a[0]=0 a[1]=1 a[2]=8 a[3]=27 a[4]=64 iary: 0 〜 4 a[0]=0 a[1]=1 a[2]=4 a[3]=9 a[4]=16 iary: 5 〜 9 a[0]=25 a[1]=36 a[2]=49 a[3]=64 a[4]=81 $
Download : sample-008.c
/*
* 2017/11/10 sample-008.c
*/
/*
* 配列名の関数への引渡し(3)
*
* 利用方法
* コンパイル
* cc -c sample-008.c
* リンク
* cc -o sample-008.exe sample-008.c
* 実行
* ./sample-008.exe
*/
#include <stdio.h>
/*
* 配列サイズ
*/
#define I_ARRAY_SIZE 10
/*
* 1 次元配列 (a[]) の仮引数変数宣言は、「*a」形の宣言でも良い
*/
void print_n_array ( int *a, int size ) {
int i;
for ( i = 0; i < size; i++ ) {
printf ( "a[%d]=%d\n", i, a[i] );
}
}
/*
* main
*
*/
int main( int argc, char *argv[] )
{
int iary[I_ARRAY_SIZE];
int i;
/* 配列の初期化 */
/* iary[i] = i*i */
for ( i = 0; i < I_ARRAY_SIZE; i++ ) {
iary[i] = i*i;
}
printf ( "iary: 0 〜 %d\n", I_ARRAY_SIZE - 1 );
print_n_array ( iary, I_ARRAY_SIZE ); /* iary の内容を出力 */
return 0;
}
$ ./sample-008.exe iary: 0 〜 9 a[0]=0 a[1]=1 a[2]=4 a[3]=9 a[4]=16 a[5]=25 a[6]=36 a[7]=49 a[8]=64 a[9]=81 $
Download : sample-009.c
/*
* 2017/11/10 sample-009.c
*/
/*
* 配列名の関数への引渡し(4)
*
* 利用方法
* コンパイル
* cc -c sample-009.c
* リンク
* cc -o sample-009.exe sample-009.c
* 実行
* ./sample-009.exe
*/
#include <stdio.h>
/*
* 配列サイズ
*/
#define I_ARRAY_SIZE 10
/*
* 1 次元配列 (a[]) の仮引数変数宣言は、「*a」形の宣言でも良い
*/
void print_n_array ( int *a, int size ) {
int i;
for ( i = 0; i < size; i++ ) {
printf ( "a[%d]=%d\n", i, a[i] );
}
}
/*
* 配列引数の要素の値を書き換える
*/
void change_at ( int *a, int pos, int value ) {
a[pos] = value;
}
/*
* main
*
*/
int main( int argc, char *argv[] )
{
int iary[I_ARRAY_SIZE];
int i;
/* 配列の初期化 */
/* iary[i] = i*i */
for ( i = 0; i < I_ARRAY_SIZE; i++ ) {
iary[i] = i*i;
}
printf ( "iary: 0 〜 %d\n", I_ARRAY_SIZE - 1 );
print_n_array ( iary, I_ARRAY_SIZE ); /* iary の内容を出力 */
printf ( "%d 番目の要素を %d に書き換える\n", 5, 100 );
change_at ( iary, 5, 100 );
printf ( "iary: 0 〜 %d\n", I_ARRAY_SIZE - 1 );
print_n_array ( iary, I_ARRAY_SIZE ); /* iary の内容を出力 */
return 0;
}
$ ./sample-009.exe iary: 0 〜 9 a[0]=0 a[1]=1 a[2]=4 a[3]=9 a[4]=16 a[5]=25 a[6]=36 a[7]=49 a[8]=64 a[9]=81 5 番目の要素を 100 に書き換える iary: 0 〜 9 a[0]=0 a[1]=1 a[2]=4 a[3]=9 a[4]=16 a[5]=100 a[6]=36 a[7]=49 a[8]=64 a[9]=81 $
Download : 20171110-01.c
/*
* 課題 20171110-01
*
* 20171110 20171110-01-QQQQ.c
*
* 浮動小数点数の配列の要素内の数値の総和を求める。
*/
#include <stdio.h>
/*
* 浮動小数点数の配列の要素内の数値の総和を求める。
*
* 利用方法
* コンパイル
* cc -o BASENAME.exe 20171110-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
$ ./20171110-01-QQQQ.exe 5 個のデータを入力します。 1 番目の数値を入力してください : 2.300000 2 番目の数値を入力してください : 9.100000 3 番目の数値を入力してください : 5.900000 4 番目の数値を入力してください : 2.700000 5 番目の数値を入力してください : 3.200000 入力されたデータの総和は 23.200000 です。 $
Download : 20171110-02.c
/*
* 課題 20171110-02
*
* 20171110 20171110-02-QQQQ.c
*
* 文字列の途中に文字を挿入する
*
* 利用方法
* コンパイル
* cc -o BASENAME.exe 20171110-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
$ ./20171110-02-QQQQ.exe 最初の cary = abcde 'X' を挿入した結果 : abcXde $