目次

環境作り

C言語のコンパイラをインストールする.

$ sudo apt-get install gcc

おまじない

#include<stdio.h>

int main(void){
	
	処理内容
	
	return(0);
}

コンパイル

gcc ファイル名.c -o 実行ファイル名

実行

./実行ファイル

第01回 「変数」

例題01

整数型変数aとbに適当な値を代入し,それらの和を変数cに代入した後,変数cの値を出力せよ.

<プログラム>
#include<stdio.h>
int main(void){
	int a, b, c;				(1)
	a=3;						(2)
	b=4;					(3)
	c=a+b;					(4)
	printf("a+b=%d \n", c);	(5)
	return(0);
}

(1) 変数の型宣言
	int	float		double		char
	整数	実数(単精度)	実数(倍精度)	文字

(2) 代入文
    右辺の値を左辺へ代入

(3) 演算
	+	-	*	/
	足算	引算	掛算	割算
	
	ex. a=a+b; x=2*y+z;

(4) 出力
		int		float	double	char
		%d		%f		%1f,%f	%s(%c)
	書式	%3d	%7.2f	%5s
	
	ex.  printf("a=%d  b=%b \n", a, b);

(5) コメント文(日本語はなるべく使わない方がよい)
    /* と */ で囲まれた部分は,プログラムの実行に影響しない.
    例)/* Calculation */

プログラム作成の注意
    1) 命令は;で区切る.
    2) 用いる変数は必ず前もって宣言する.
    3) 大文字,小文字は区別する(基本的に小文字がよい)
    4) 変数名は,英数字と下線の組み合わせ(但し,先頭は英字)とし,キーワード(テキストP82)は使用できない.
    
    ex.  abc,  a2,  name,  number_x

演習01

整数型変数aとbに適当な値を代入文を用いて代入し,それらの和と積を計算した結果を,整数型変数xとyにそれぞれ代入した後,4つの変数の値を出力せよ.

ダウンロード

演習01

第02回 「キーボードからの入力」

例題02

キーボードから1つの整数地を読み込み,その値の10倍の値を出力せよ.

<プログラム>
#include<stdio.h>
int main(void){
	int a, b;
	printf("a=");		(1)
	scanf("%d", &a);	(2)
	b=a*10;
	printf("10 times of a = %d \n", b);
	return(0);
}

(1) 何を入力すべきかを表示
    ex.  printf("input value of data a = ");

(2) キーボードから入力
	&a:変数aのアドレス(格納されているメモリの場所)を表す.
		int	float	double	char
		%d	%f		%lf		%s

演習02

キーボードから2つの整数値を読み込み,それらの和と積を計算し,結果を出力せよ.

応用01

実数型変数xとyに適当な実数値をキーボードから入力し,それらの積を計算した結果を実数型変数proに代入した後,
xとyとproの値を,それぞれ全体で10桁(小数点を含む),少数以下3桁で出力せよ.但し,1行に1つの値(全部で3行)で出力すること.

応用02

実数型変数xとyに適当な実数値を,代入文を用いて代入し,それらの積を計算した結果を実数型変数pro1と整数型変数pro2に代入した後,4つの変数値を出力せよ.
(結果より,整数型変数と実数型変数の違いを確認すること)

ダウンロード

演習02 応用01 応用02

第03回 「if文(条件文)」

例題03

キーボードから1つの整数値を読み込み,その値が0ならば"a equal 0",そうでなければ"a not equal 0"と表示せよ.

<プログラム>
#include<stdio.h>
int main(void){
	int a;
	printf("a=");
	scanf("%d", &a);
	if(a == 0)[  					(1)
		printf("a equal 0 \n");
	}else{   						(1)
		printf("a not equal 0 \n");
	}
	return(0);
}

(1) 条件文
if(x == y)	xとyが等しいならば
if(x > y)		xがyより大きいならば
if(x < y)		xがyより小さいならば
if(x >= y)	xがy以上ならば
if(x <= y)	xがy以下ならば
if(x != y)		xとyが等しくないならば

※ a,yの部分は,数値や数式でも可,else文がなくても可

演習03

キーボードから1つの整数値xを読み込み,その値が正ならば”plus”,そうでなければ”minus”と表示せよ.
最後に,整数値xの値を出力せよ.ここで,0は正に含むこと.

応用03

キーボードから2つの実数値xとyを読み込み,xがyより大きいか等しい時は,xとyの差(x-y)をAに,積をBに代入し,yがxより大きい時は,xとyの和をAに,商(y/x)をBに代入せよ.
最後に,xとyの計算結果A,Bの値を出力せよ.ここで,0は入力しないこと.

ダウンロード

演習03 応用03

第04回 「for文(繰り返し文)」

例題04

for文を用いて,i=0,i=1,…,i=9を出力せよ(改行を入れること).

<プログラム>
#include<stdio.h>
int main(void){
	int i;
	for(i=0;i<10;i++){			(1)
		printf("i=%d \n", i);
	}
	return(0);
}

(1) for文
	i=0		初期値設定
	i<10	繰り返し条件(各繰り返しの最初に判定)
	i++		各繰り返しの最後に実行(i=i+1)

(2) 演算子
	インクリメント演算子	x++;		x=x+1;
	デクリメント演算子	x--;		x=x-1;
	複合代入演算子		x+=2;	x=x+2;
						x*=y;	x=x*y;

演習04

for文を用いて,1~10の値を出力せよ(改行を入れること).その後,もう一度for文を用いて,100,200,300,...,1000の値を出力せよ(改行を入れること).
但し,for文の繰り返しのための変数iは,0から始め,繰り返す毎に1ずつ増やしながら,それぞれ10回繰り返すこと.

応用04

適当な整数データnをキーボードから入力し,for文を用いて,1からnまでの合計を求め,nの合計値を出力せよ.

ヒント:整数型変数(sum)に,繰り返す毎に,1,2,3 を加えていく.これをn回繰り返す.

ダウンロード

演習04 応用04

第05回 「配列」

例題05

for文を用いて,整数型配列の中に,10,20,…,100の10個の値を順に代入せよ.

<プログラム>
#include<stdio.h>
int main(void){
    int x[10], i;
    for(i=0;i<10;i++){
        x[i]=(i+1)*10;
    }
    for(i=0;i<10;i++){
        printf("%d \n", x[i]);
    }
    return(0);
}

(1) 配列
    宣言:  int x[10];
            x[0],…,x[9]  (添字が0から9まで)
    代入:  x[2]=5;
            x[i+1]=i*100;

演習05

整数配列の中に,11,22,33,...,110の10個の値を順に代入せよ.
次に,配列の要素の値を出力せよ.但し,値の代入,要素の出力には,for文を用いること.

応用05

整数型配列xの中に,-50,-40,-30,...,30,40の10個の値を順に代入し,整数型配列yの中に,40,30,20,..,-40,-50の10個の値を順に代入せよ.
次に,配列xとyの要素の値を出力せよ.但し,値の代入,要素の出力には,for文を用いること.

応用06

for文を用いて,初項5,項比3の等比数列の第1項から第10項までの値と,それらの和を計算し,それらの値を出力せよ.

ダウンロード

演習05 応用05 応用06

第06回 「初期値代入,キャスト演算子,マクロ定義」

例題06

整数型配列xの中に5個の適当な整数値を初期値代入し,それらの合計と平均値を求めて出力せよ.
但し,整数値の個数(5個)にはマクロ定義を用い,平均値は実数値で求めること.

<プログラム>
#include<stdio.h>
int main(void){
	#define N 5  								(1)
	int x[N]={3, 45, 89, 67, 52}, i, sum=0;		(2)
	float ave;
	for(i=0;i<N;i++){
		sum += x[i];
	}
	ave=(float)sum/N;						(3)
	printf("sum=%d  average=%f  \n", sum, ave);
	return(0);
}

(1) マクロ定義
    プログラム中の全てのNを,5に置換する(コンパイル時).
    但し,printf文中の””で囲まれたNは置換しない.

(2) 初期値代入
    コンパイル時に代入する.

(3) キャスト演算子
	直後の変数の値をfloat型にして演算する.
	ex.	ave=(double)sum/5;
		c=(int)(a+b);

     int型とint型の計算結果は,int型となる.
     int型とfloat型の計算結果は,float型となる.
     float型とdouble型の計算結果は,double型となる.

演習06

整数型配列の中に,10人分の得点データ(0点から100点)を初期値代入し,50点以上の点数の人だけの人数,及びそれらの合計と平均点を求めて出力せよ.
但し,全人数(10)はマクロ定義を用い,平均点は実数値で求めること.

ヒント:for文の中で,if文を用いて50点以上か否かを判定し,50点以上だったら,人数をカウントして合計(sum)に加える.最後に,合計の値をカウントした人数で割る.

応用07

演習6と同様な得点データを配列に初期値代入し,最大点と最小点を求めて出力せよ.但し,人数はマクロ定義を用いること.

ヒント:	最大点を格納する変数maxの値と配列データの値を比較し,配列データの値が大きいならば,maxにそのデータを代入する.
		これをfor文で繰り返す.最小点も同様.但し,最初に,maxには最初のデータを代入しておくこと.

ダウンロード

演習06 応用07

第07回 「break文(繰り返しの中断),論理演算子」

例題07

10個の要素を持つ整数型配列に適当な整数値を初期値代入し,その後,配列の要素の値を最初から順に加算していき,合計が20~30の値になった時に加算をやめて,
それまでの合計値と加算した個数を出力せよ.

<プログラム>
#include<stdio.h>
int main(void){
    #define N 10
    int x[N]={8, 5, -10, 12, 7, 16, -4, 12, 2, 5};
    int i, sum=0, kosuu=0;
    for(i=0;i<N;i++){
        sum+=x[i];
        kosuu++;
        if(sum>=20 && sum<=30) break;             (1)
    }
    printf("sum=%d  number=%d  \n", sum, kosuu);
    return(0);
}

(1) 論理演算子
    &&:	かつ(療法の条件が共に成立すれば)
    ||:	または(どちらか一方が成立すれば)
    
    break:for文の繰り返しを中断する.
    ※if文において,条件を満足した時に実行する命令が1つの時は,{}は省略出来る.

演習07

10個の要素を持つ整数型配列に適当な値を初期値代入し,その後,配列の要素の値を最初から順に加算していき,配列の要素の値に負または,100を超える値が現れた時に加算をやめて,
それまでの合計と加算した個数及び平均値を出力せよ.但し,負や100を超える値は加算に加えないこと.(途中で条件を満たすようなデータを初期値代入しておくこと)

ヒント:加算する前に,要素の値が条件を満足する値かどうかを判断して,それから加算する.

応用08

キーボードから入力した10人分の得点データを整数型配列に格納し,優(80以上),良(70~79),可(60~69),それぞれの人数と平均点を求めて出力せよ.
但し,配列の要素の値に負の値が現れた時には,その作業をやめること.
(配列には,優,良,可の点数をそれぞれ1つ以上は入力すること)

ダウンロード

演習07 応用08

第08回 「多重ループ(for文),多次元配列」

例題08

4名分の身長と体重のデータを二次元配列に初期値代入し,その後,それらの身長と体重の値を出力せよ.但し,2重ループのfor文を用いよ.

<プログラム>
#include<stdio.h>
int main(void){
	double x[4][2]={{160.2, 57.5},		(1)
					{152.5, 47.2},
					{185.7, 72.3},
					{171.2, 65.5}};
	int i, j;
	printf("height  weight  \n");
	for(i=0;i<4;i++){					(2)
		for(j=0;j<2;j++){
			printf("%6.1f", x[i][j]);
		}
	}
	return(0);
}

(1) 二次元配列
    4×2の二次元配列(行列):x[0][0], x[0][1], x[1][0], x[1][1], …, x[3][0], x[3][1]
    
    三次元配列:int y[3][5][2];

(2) 2重ループ
    i=0の時に,j=0,1と変化する.i=1の時に,j=0,1と変化する.…
    ex.
    3重ループ
        for(i=0;i<3;i++){
            for(j=0;j<5;j++){
                for(k=0;k<2;k++){
                }
            }
        }
    ※繰り返しの中では,カウンターに使用する変数の値を買えないこと.

演習08

4名分の身長と体重のデータを2次元配列に初期値代入し,その後,身長と体重それぞれの平均値を計算し,出力せよ.
但し,2重ループのfor文(人数に関する繰り返しと身長と体重の項目に関する繰り返し)を用いよ.

ヒント:合計を格納する変数を配列sum[2]とし,sum[0]に身長,sum[1]に体重を加算せよ.

応用09

1次元配列の中に,20人分の得点データ(0点から100点)を初期値代入し,その後,得点を10点幅の10ランクに分け,それぞれのランクに何人いるかをカウントし,それらの人数を出力せよ.
但し,カウントには2重ループを,出力には1重ループのfor文を用いること.また,出力した人数がどのランクか(たとえば,0-9,10-19,...)が分かるように出力せよ.
ここで,100点は10ランクの1つに入れてもいいが,別ランク(11ランク)にしてもよい.

ダウンロード

演習08 応用09

第09回 「演習」

演習09

キーボードから2つの実数値を読み込み,それらの和と積を計算し,和の値が大きいならば”summation”と表示し,積の値が大きいならば”product”と表示せよ.
また,最後に,和と積の値を全体で8桁,少数以下2桁で出力せよ.ここで,等しい場合はどちらに含めてもよい.

演習10

10個の要素(配列の大きさが10)を持つ整数型配列a,b,cがある.最初に,配列aに適当なデータを初期値代入し,その後,そのデータを,配列bには順方向に,配列cには逆方向に代入し,最後に,配列a,b,cの要素を出力せよ.
但し,代入と出力にはfor文を用いること.
順方向とは,a[0]をb[0]に,a[1]をb[1]に,…,a[9]をb[9]に代入することである.
逆方向とは,a[0]をc[9]に,a[1]をc[8]に,…,a[9]をc[0]に代入することである.

ヒント:逆方向では,for文の繰り返しのための変数iが,0,1,2,…と変わる時に,9,8,7,…と変化するような数式を作ればよい.

応用10

整数型配列の中に,10人分の得点データ(0点から100点)を初期値代入し,平均値と分散を求めて出力せよ.但し,人数はマクロ定義を用い,平均と分散は実数値で求めること.
分散:ああああああああああ
平均値:あああああああああああああ

ヒント:最初のfor文で平均値を求め,次のfor文で分散(各データから平均値を引いた値を2乗したものの平均)を計算すること.ここで,aの2乗の計算は,a*aで計算できる.
参考:データが11, 22, 33, ..., 99, 100 の場合の平均値は59.5,分散は908.25である.

応用11

下に示す九九の表を,2重ループのfor文を用いて作成せよ.

ヒント:	最初に,九九の値の部分(9×9の行列部分)を作成するプログラムを作り,その後,タイトル部分(区切りの上と左部分)を出力する命令を追加せよ.
		区切りの上のタイトル部分はfor文を使わなくてよい.

ああああああああああ

ダウンロード

演習09 演習10 応用10 応用11

第10回 「switch文」

例題10

1つの整数値をキーボードから入力し,その値が3で割り切れたら”3で割り切れる”と表示し,余りが1の時は”余りが1”,余りが2の時は”余りが2”と表示せよ.但し,switch文を用いよ.

<プログラム>
#include<stdio.h>
int main(void){
    int x, y;
    printf("input x ");
    scanf("%d", &x);
    y=x%3;
    switch(y){
        case 0 : printf("3で割り切れる \n"); break;
        case 1 : printf("余りが1 \n"); break;
        case 2 : printf("余りが2 \n"); break;
    }
    return(0);
}

(1) switch文
    yの値(整数値)が0,1,2の時に,それぞれのcase文のあとの命令を実行する.
    break文は,switch文を抜け出る役目をする.
    ex.
    switch(y){
        case 1  : a=10; printf("A \n"); break;
        case 2  : a=20; printf("B \n");         ※break文がないと,次のcaseの命令を実行
        case 5  : a=80; printf("C \n"); break;
        default : a=50; printf("D \n"); break;  ※いずれのcaseにも該当しない場合に実行
    }
    
    (1)と等価なif文
    if(y==0){
        printf("3で割り切れる \n");
    }else if(y==1){                  ※最初のif文の条件を満足しなかった場合に対して,さらに別の条件を満足するかを判定
        printf("余りが1 \n");
    }else if(y==2){
        printf("余りが2 \n");
    }

演習11

1つの整数値をキーボードから入力し,その値が1であれば”plus 1”,2であれば”plus 2”,3または4であれば”plus 3 or 4”,それ以外であれば”other”と表示せよ.
但し,switch文を用い,printf文は4回用いること.

ヒント:あるcase文の後のbreak文をなくす

応用12

適当な整数値nをキーボードから入力し,for文を用いて,nの階上(n×(n-1)×(n-2)…2×1)を計算し,nの値と階上の値を出力せよ.
確認のための実行は,n=3,4程度で行うこと.

ヒント:整数型変数に,繰り返す毎に,1,2,3,…を掛けていく.これをn回繰り返す.

ダウンロード

演習11 応用12

第11回 「do文(繰り返し文)」

例題11

整数値をキーボードから入力し続け,それらの合計が100を超えた時に入力をやめ,それまでの合計値と個数を出力せよ.但し,do文を用いること.

<プログラム>
#include<stdio.h>
int main(void){
    int x, y=0, n=0;
    do{
        printf("INPUT x=");
        scanf("%d", &x);
        y+=x;
        n++;
    }while(y<=100);
    printf("sum=%d, kosuu=%d\n", y, n);
    return(0);
}

(1) do文
    whileの中の条件が満たされる間繰り返す.条件を満たしているか否かの判定は,繰り返しの最後に行う.

※繰り返し文の例(1から10までの和)

	for文の場合
		for(i=0;i<10;i++){
			sum=0;
			sum += i+1;
		}
	
	do文の場合
		sum=0;
		i=0;
		do{
			sum += i+1;
			i++;
		}while(i<10);
	
	while文の場合
		sum=0;
		i=0;
		while(i<10){
			sum += i+1;
			i++;
		}

演習12

10個の要素を持つ整数型配列の中に適当な値を初期値代入し,その後,配列の要素の値の合計と平均値を求めて出力せよ.但し,do文を用いること.

応用13

n行m列行列(整数型2次元配列)x,yに適当な値をキーボードから入力し,次にそれらの行列の和を計算して配列zに代入し,最後に行列(配列)x,y,zの要素を出力せよ.
但し,配列の大きさn,mは最初にキーボードから入力し,和の計算と出力には2重ループのfor文を用いよ.
また,変数の宣言においては,配列の大きさを大きめに宣言しておき,キーボードから入力する配列の大きさはその範囲内で入力するようにせよ.
さらに,行列(配列)の要素を出力する場合は,行列の形になるように出力せよ(2×3行列であれば,2行3列で,列が揃うように出力すること).

応用14

1行m列の行列xと,m行1列の行列yに適当な値をキーボードから入力し,次にそれらの積zを計算し,zの値(スカラー)を出力せよ.
但し,x,y,zは,1次元配列,2次元配列のどちらを用いてもよい.また,mの値は,応用13と同様,キーボードからの入力とすること.

ダウンロード

演習12 応用13 応用14

第12回 「演習」

演習13

実数xと正の整数nをキーボードから入力し,for文を用いてべき乗(xのn乗)を計算し出力せよ.

ヒント:
        5.2の3乗は,1×5.2×5.2×5.2であり,for文を用いて,5.2を3回掛けることにによって求めることができる.
        これまでに行っていた足し算の場合,例えば1から3までの和を求める場合は,0+1+2+3のように最初に0を代入していたが,掛け算の場合は最初に1を代入しておく必要がある.

応用15

最初に整数型配列xに10個の適当な値を初期値代入し,その後,大きい順に並び替え,それら(10個の要素)を出力せよ.
但し,並べ替えたデータは,配列xに格納しておくこと(x以外の配列は使わないこと).

ヒント:
        x[0]とx[j](j=1,2,…,9)を比較し,x[j]>x[0]ならば,両者のデータを入れ替える.
        x[1]とx[j](j=2,…,9)を比較し,x[j]>x[1]ならば,両者のデータを入れ替える.
        :
        x[8]とx[j](j=9)を比較し,x[j]>x[8]ならば,両者のデータを入れ替える.
        これら9回の繰り返しをfor文(i=0,1,…,8)で実現する.すなわち,iとjに関する2重ループのfor文を用いること.

応用16

夏季の数値データを2次元配列に初期値代入し,各行の平均値と最大値を求めて,データと共に以下のように出力せよ.
但し,数値データの列や行の数が変わっても簡単に変更できるように,凡庸性を持たせること.
        1.1 2.4 0.9 2.3 1.9 1.0 平均値出力 最大値出力
        2.2 0.7 0.3 1.8 1.7 0.2 平均値出力 最大値出力
        0.8 0.4 2.5 1.5 0.9 2.4 平均値出力 最大値出力
        0.9 1.6 1.7 1.6 0.4 1.4 平均値出力 最大値出力

ダウンロード

演習13 応用15 応用16

第13回 「if文の入れ子」

例題13

<プログラム>
if(a>0){
    k=30;
}else if(b<50){
    k=20;
}else{
    k=10;
}

演習14

数学と英語の点数をキーボードから入力し,両方とも60未満であれば”you are rejected.”と表示し,そうでない場合は,高い点数を表示せよ(例えば,”High score is ***”).但し,if文の入れ子を用いよ.

ヒント:ああああああああああああ

応用17

正の整数値をキーボードから繰り返し入力し,奇数と偶数それぞれの個数と合計値を求め,出力せよ.但し,負の値が入力された時に,処理を終了せよ.

ヒント:繰り返しは,無限とする(繰り返し条件を入れない).奇数か偶数かは,2で割ったあまりで判断せよ(余りは,第10回の例題を参照)
あああああああああああああ例題の書いてない↑

ダウンロード

演習14 応用17

第14回 「復習」

演習15

整数型配列の中に,5科目分の得点データ(0点から100点)を初期値代入し,それらの合計と平均点を求めて出力せよ.
さらに,平均点が60点以上の場合は”success”を,60点未満の場合は”failure”と表示せよ.但し,平均点は,少数以下1桁まで出力すること.

ダウンロード

演習15

第15回 「関数」

例題15

2つの整数値を引数として受け取り,それらの和の値を返す関数を作成し,その関数が正常に動作するかどうかを,実際に実行させて確認せよ.

<プログラム>
#include<stdio.h>
int add(int x, int y){	(1)
	int z;
	z=x+y;
	return(z);
}
int main(void){
    int a=15, b=25, wa;
    wa=add(a, b);
    printf("%d+%d=%d \n", a, b, wa);
    return(0);
}

(1) 関数
    実引数a,bのデータが,仮引数x,yに引き渡されて,実行がadd関数に移行する.add関数からは,zの値を戻り値(返却値)としてmain関数に実行が戻る.
    (両関数における変数は,全く別の変数として取り扱われる)
    注意
        1) 実引数と仮引数の型及び数は一致しておくこと.
        2) 関数の型と戻り値の型は一致しておくこと.
        3) 関数を呼び出すより先に関数を定義しておくこと.
           関数実体より先に呼び出したい時は,プロとタイプ宣言を行うこと.
        4) 関数名は,英数字と下線の組み合わせ(先頭は英字)とし,キーワード(P82)は使用できない.また,標準関数と同じ関数名は使用しないこと.小文字と大文字は区別する.
        ※関数のメリット(プログラムの分割)
            1) 同じ計算を,値を変えて南海も繰り返す場合に有効
            2) プログラム作成を分業する場合に有効
            3) プログラムが見やすくなる

演習16

3つの実数値を引数として受け取り,それらの積の値を返す関数を作成し,その関数が正常に動作するかどうかを,実際に実行させて確認せよ.

応用18

二次方程式ax^2+bx+x=0の係数a,b,cを与え,方程式の解を求めて出力せよ.(関数は使わなくてよい)

ヒント:兵数の値によって,3つの場合分けが必要となる.
        ここで,zの平方根yの計算は,y=sqrt(z);で計算すること.
        また,#include<math.h>を#include<stdio.h>の次の行に加えること.

ダウンロード

演習16 応用18

第16回 「ポインタ」

例題16

(1) アドレス

    #include<stdio.h>
    int main(void){
        int a, b[3];
        a=3;
        b[1]=4;
        return(0);
    }

(2) ポインタ(アドレスを格納する変数)

    最初に整数型変数dに適当な値を代入し,次にポインタxにdのアドレスを指させ,xを用いて変数dの値に3を加算して,その値を出力せよ.
    
    <プログラム>
    #include<stdio.h>
    int main(void){
        int d, *x;
        d=4;
        x=&d;
        *x=*x+3;
        printf("%d \n",d);
        return(0);
    }
    
     x:アドレス(番地)を表す(格納する)
    *x:xが指しているアドレスのデータ(中身)を表す(*:関節演算子)
    
    宣言		int a;	int *b;
    データ		a		*b
    アドレス	&a		b
    
    注意:ポインタを用いて変数のデータを扱う(数値の代入等)は,その前に必ず変数のアドレスを指させておくこと.

演習17

最初に,ポインタxに整数型変数aのアドレスを指させ,次にxを用いてaの中に適当な値を代入し,その後,変数aのデータ(中身)を出力せよ.
但し,出力においては,変数aを用いた場合と,ポインタxを用いた場合の2通りの方法で出力せよ.

応用19

あああああ2次と実根
二次方程式ax^2+bx+c=0の係数a,b,cを受け取り,重根の時はその解を,2つの実根の時は大きい方の解を,複素根の時は解の虚数部を返す関数を作成し,
その関数が正常に動作するかどうかを,実際に実行させて確認せよ.但し,main関数では戻り値の値だけを表示するだけで,どの場合の解であるかは表示しなくてよい.
応用18の注意事項やヒントを参考にすること.

ダウンロード

演習17 応用19

第17回 「ポインタと配列」

例題17

最初に整数型配列xに10個の適当な値を初期値代入し,その後,配列の中のデータをポインタyを用いて出力せよ.

<プログラム>
#include<stdio.h>
int main(void){
    int x[10]={2, 5, 7, 1, 14, 6, 3, 8, 9, 4};
    int *y, i;
    y=x;                               //ポインタyに配列xの先頭アドレスを指させる.
    for(i=0;i<10;i++){
        printf("x[%d]=%d \n", i, *y);  //yが指しているアドレスの中身を出力する.
        y++;                           //配列xの次の要素のアドレスをyに指させる.以下の方法でも可能.
    }                                  //for(i=0;i<10;i++){
    return(0);                         //    printf("x[%d]=%d \n", i, *(y+i));
}                                      //}

(1) 配列名xは,配列の先頭アドレス(x[0]のアドレス)を表している.(&x[0]と同じ)
    (ポインタ)
    printf("%d \n", *x);
    *xは,x[0]の値を出力する.

(2) 配列の要素のアドレスを指しているポインタに値を加えると,加えた値だけ先の要素のアドレスを指す(配列とポインタの型は一致させておくこと).
    y=x;    yはx[0]のアドレスを指す.
    y=y+2;  yはx[2]のアドレスを指す.
    y++;    yはx[3]のアドレスを指す.

(3) 配列名xに値を加えても先の要素のアドレスを表すことができるが,xそのものの値を変更してはならない.
    ○  printf("%d  \n", *(x+3));  x[3]の値を出力する.
    ×  x=x+3;                     xそのものの値を変更してはならない.

演習18

最初に整数型配列xに10個の適当な値を初期代入し,その後,配列の中のデータの合計を,ポインタyを用いて計算し,変数sumに代入せよ.最後に,その結果(合計)を出力せいよ.

応用20

N個の要素を持つ整数型配列aに適当なデータを初期値代入し,その後,そのデータを,配列bには順方向に,配列cには逆方向に,ポインタを用いて代入し,最後に,配列a,b,cの要素を出力せいよ.ここで,配列の要素の個数Nは,マクロ定義で10と与えよ.
順方向とは,a[0]をb[0]に,a[1]をb[1]に,…,a[9]をb[9]に代入することである.
逆方向とは,a[0]をc[9]に,a[1]をc[8]に,…,a[9]をc[0]に代入することである.

ヒント:逆方向では,for文の繰り返しのための変数iが,0,1,2,…と変わる時に,9,8,7,…と変化するような数式を作ればよい.

応用21

3つの整数値を引数として受け取り,最大値を計算して返す関数maximumと,最小値を計算して返す関数minimumを作成し,それらの関数が正常に動作するかどうかを,実際に実行して確認せよ.(main関数では,関数maximumと関数minimumを呼び出し,結果を出力する)

ダウンロード

例題17 演習18 応用20 応用21

第18回 「演習」

演習19

実数xと正の整数nを引数として受け取り,べき乗(xのn乗)を計算して返す関数を作成し,その関数が正常に動作するかどうかを,実際に実行して確認せよ.但し,main関数では,適当なデータをキーボードから入力し,関数を呼び出した後は,xとnの値,及びべき乗の値を出力せよ.

ヒント:5.2の3乗は,1×5.2×5.2×5.2であり,for文を用いて,5.2を3回掛けることにによって求めることができる.これまでに行っていた足し算の場合,例えば1から3までの和を求める場合は,0+1+2+3のように,最初に0を代入していたが,掛け算の場合は最初に1を代入しておく必要がある.

演習20

ああああああああああ#mimetex(y=x^3-3x^2-6x+8)
実数xを引数として受け取り,y=x^3-3x^2-6x+8を計算し,yの値が正の場合は1を,負の場合は-1を,0の場合は0を返す関数(戻り値は整数型)を作成し,その関数が正常に動作するかどうかを,実際に実行して確認せよ.但し,main関数では,xの値をキーボードから入力し,関数を呼び出した後は,戻り値の値を出力せよ.

応用22

正の整数値nを受け取り,nの階乗(n×(n-1)×(n-2)×…×2×1)を計算して返す関数を作成し,その関数が正常に動作するかどうかを,実際に実行して確認せよ.但し,再帰を用いないこと.
ヒント:整数型変数に,繰り返す毎に,1,2,3,…を掛けていく.これをn回繰り返す.

応用23

行列(整数型2次元配列)x,yに適当な値をキーボードから入力し,次にそれらの行列の積を計算して配列zに代入し,最後に行列(配列)x,y,zの要素を出力せよ.但し,配列の大きさは最初にキーボードから入力しておき,要素の入力と出力には2重ループのfor文を,積の計算には3重ループのfor文を用いよ.また,変数の宣言においては,配列の大きさを大きめに宣言しておき,キーボードから入力する配列の大きさはその範囲内で入力するようにせよ(2×3行列であれば,2行3列で出力).ここで,行列xをL×M,行列yをM×Nとすると,行列zはL×Nとなる.行列の大きさL,M,Nの値を入力する時に派、異なる値を用いること.
ヒント:実際に,行列の要素を用いて積を計算(展開)して,その時の規則性を見つけてプログラムせよ.

ダウンロード

演習19 演習20 応用22 応用23

第19回 「関数2(アドレス渡し,または,ポインタ渡し)」

例題19

2つの整数値を受け取り,それらの和の値を返す関数を作成し,その関数が正常に動作するかどうかを,実際に実行させて確認せよ.但し,2つの整数値はアドレス私とし(引数にポインタを使う),和の値は引数を用いて返すこと(ポインタの引数を用いて結果を返し,戻り値(返却値)は0とする).

<プログラム>
#include<stdio.h>
int add(int *a, int *b, int *c){      //アドレスをポインタで受け取る.
    *c=*a+*b;                         //*a,*b,*cは,xとyとwaの中身を表している.
    return(0);                        //*cに値を代入することは,waに代入することを意味する.
}
int main(void){
    int x=15, y=25, wa;
    add(&x, &y, &wa);                 //アドレスを渡す
    printf("%d+%d=%d \n", x, y, wa);
    return(0);
}

(1) 関数とのデータの受け渡し方法
    a) 値渡し
        #include<stdio.h>
        int add(int a, int b){
            int c;
            c=a+b;
            c=a+b;
            return(c);
        }
        int main(void){
            int x=15, y=25, wa;
            wa=add(x, y);
            printf("%d+%d=%d \n", x, y, wa);
            return(0);
        }
    
    b) 外部変数を用いる
        #include<stdio.h>
        int a, b, c;                          //全ての関数で共通
        int add(void){                        //引数なし
            c=a+b;
            return(0);
        }
        int main(void){
            int x=15, y=25, wa;
            a=x;
            b=y;
            add();                            //引数なし
            wa=c;
            printf("%d+%d=%d \n", x, y, wa);
            return(0);
        }
    
    c) アドレス渡し(例題)

演習21

一次方程式ax+b=0の係数a,bの値(実数)を引数として受け取り,方程式の解を返す関数を作り,正常に動作するかどうかを確認せよ.但し,係数a,bはアドレス渡しとし(引数にポインタを使う),解は引数を用いて返すこと(ポインタの引数を使用し,戻り値は0とする).

応用24

あああああああああああ
二次方程式ax^2+bx+c=0の係数a,b,cを受け取り,解を返す関数を作成せよ.但し,係数は値渡しで,解はアドレス渡しで行うこと.また,戻り値は,解が重根の時は1,2つの実数根の時は2,複素根の時は3とし,main関数において,戻り値の値によって(根の種類によって),表示の方法を変えよ.

ヒント:解を戻すための引数のポインタは2つとし,実数根の場合はそれぞれの解を,複素根の場合は実数部と虚数部を返すために用いること.

ダウンロード

例題19 演習21 応用24

第20回 「関数3(配列の受け渡し)」

例題20

整数型配列のデータと,配列の大きさ(要素の数)を受け取り,配列の中のデータの合計を計算し,合計を戻り値(返却値)で返す関数を作成せよ.但し,main関数では,適当なデータを初期値代入し,関数を呼び出した後に合計値を出力せよ.

<プログラム>
#include<stdio.h>
int kansuu(int *x, int n){                                //配列の先頭アドレスをポインタxで,
    int i, sum=0;                                         //個数を変数nで受け取る.
    for(i=0;i<n;i++){                                     //繰り返し回数を変数nで指定する.
        sum+=*x;                                          //以下の方法でも可能.
        x++;                                              //for(i=0;i<n;i++){
    }                                                     //    sum+=*(x+i);
    return(sum);                                          //}
}
int main(void){
    int a[10]={2, 5, 7, 1, 14, 6, 3, 8, 9, 4}, m=10, wa;
    wa=kansuu(a, m);                                      //配列aの先頭アドレスと個数(m=10)を渡す.
    printf("sum%d \n", wa);                               //wa=kansuu(a, 10)でもよい.
    return(0);
}

(1) 配列の受け渡し
    配列の先頭アドレスと配列の大きさを引数で受け取ることによって,配列の大きさが変わっても対応できる凡用性のある関数ができる.例えば,main関数を以下のようにすることによって,大きさが異なる配列に対応出来る.
    int main(void){
        int a[10]={2, 5, 7, 1, 14, 6, 3, 8, 9, 4}, wa_a;
        int b[5]={12, 47, 85, 33, 98}, wa_b;
        wa_a=kansuu(a, 10);
        wa_b=kansuu(b, 5);
        return(0);
     }

(2) 演算の優先順位(テキストP177)ああああああああ
    a=b+c*d;         *(優先4)   →  +(優先5)   →  =(優先15)   a=(b+c)*d;
    if(a>0 && b==3)  >(優先7)   →  ==(優先8)  →  &&(優先12)
    b=3**a;          *a(優先2)  →  *(優先4)   →  =(優先15)
    同順位の場合:  左結合  a=b/c*d;  右結合 a=b=c=2;
                               →                ←
    
(3) 標準関数(ヘッダファイルの取り込み)(テキストあああああああああああ)
    #include<stdio.h>  stdio.h:標準関数(printf, scanf等)が宣言されている.
    #include<math.h>   math.h :数学に関する関数(sin, sqrt等)が宣言されている.

演習22

整数型配列のデータと,配列の大きさ(要素の数)を受け取り,配列の中のデータの最大値を求めて,最大値を戻り値(返却値)で返す関数を作成せよ.但し,main関数では,適当なデータを初期値代入し,関数を呼び出した後は,最大値を出力せよ.

ヒント:最大点を格納する変数maxの値と配列データの値を比較し,配列データの値が大きいならば,maxにそのデータを代入する.これをfor文で繰り返す.但し,最初に,maxには最初のデータを代入しておくこと.

応用25

整数型配列のデータと,配列の大きさ(要素の数)を受け取り,配列のデータを大きい順に並び変える関数を作成せよ.但し,main関数では,適当なデータを初期値代入し,関数を呼び出した後は,配列の中のデータを出力せよ.

ヒント:x[0]とx[j](j=1,2,…,9)を比較し,x[j]>x[0]ならば,両者のデータを入れ替える.
        x[1]とx[j](j=2,…,9)を比較し,x[j]>x[1]ならば,両者のデータを入れ替える.
        :
        x[8]とx[j](j=9)を比較し,x[j]>x[8]ならば,両者のデータを入れ替える.
        これら9回の繰り返しをfor文(i=0,1,…,8)で実現する.すなわち,iとjに関する2重ループのfor文を用いること.但し,配列は添え字を用いずに,例題の※で示した方法で行うこと.
ああああああああああああああ

ダウンロード

例題20 演習22 応用25

第21回 「文字変数(文字配列)」

例題21

文字配列nameにキーボード入力で文字列Fukuokaを入力し,その後,文字配列mojiにnameの文字列をコピーせよ.最後に,nameとmojiの文字列を出力せよ.但し,コピーの時は文字列の長さは事前に分からないものとし,プログラムの中で調べること(先頭から1文字ずつ代入し,null文字が見つかった時点で代入を中止する).

<プログラム>
#include<stdio.h>
int main(void){
    char name[15], moji[15];
    int i;
    printf("input character  ");
    scanf("%s", name);                          //name:配列の先頭アドレス
    for(i=0;;i++){                              //終了条件がないので,無限ループ
        moji[i]=name[i];
        if(name[i]=='\0') break;                //null文字が出たら繰り返しをやめる
    }
    printf("name=%s, moji=%s \n", name, moji);
    return(0);
}

(1) 文字配列(文字列)
    ああああああああ
    char name[15]="Fukuoka";  //初期値代入
    name[0]='F';              //代入文(name="Fukuoka";不可)
    putchar(name[1]);         //一文字出力u(改行なし),改行putchar('\n');
    char *x;                  //ポインタ
    x=name;
    printf("%s \n", x);       //出力 Fukuoka
    putchar(*x);              //出力 F

(2) 文字列の配列(二次元配列)
    char sei[2][5]={"ABC", "XY"};
    printf("%s \n", sei[1]);       //出力 XY

(3) 文字列を扱うライブラリ関数
    #include<string.h>
    char name1[20], moji1[20];
    strcpy(name1, "ABC");                 //文字列のコピー(name1:ABC)
    strcpy(moji1, name1);                 //文字列のコピー(moji1:ABC,name1:ABC)
    char name[20]="ABC", moji[20]="XYZ";
    strcat(moji, name);                   //文字列の連結(moji:XYZABC,name:ABC)
    n=strlen(name);                       //文字列の長さを返す(n:3)

演習23

文字配列nameにキーボード入力で適当な文字列を代入し,その後,1文字ずつ取り出して表示せよ.表示には,putcharを用い,文字列の長さは事前に分からないものとし,プログラムの中で調べること(先頭から1文字ずつ表示し,null文字が見つかった時点で表示を中止する).また,1文字毎に改行を入れて,文字列を縦に表示すること.

応用26

関数strcatと同じ機能を持つ関数moji_renketuを作成し,正常に動作するかを確認せよ.すなわち,2つの文字列a,bの先頭アドレスを受け取り,aの文字列の後にbの文字列を加え,2つの文字列を連結した文字列をaに代入して返す関数を作成せよ.(戻り値は0でよい)

ダウンロード

例題21 演習23 応用26

第22回 「構造体」

例題22

氏名(文字型配列),年齢(整数型),身長(実数型),体重(実数型)のデータをメンバに持つ構造体aにデータを初期値代入し,その後,aに入っているデータを,同じ型を持つ構造体bに代入し,最後に,aとb両方のデータを出力せよ.但し,氏名はローマ字で入力すること.

<プログラム>
#include<stdio.h>
struct meibo{                                     (1)型の宣言
    char name[20];
    int age;
    float height, weight;
};
int main(void){
    struct meibo a={"Aoki", 22, 182.5, 65.2}, b;  (2)変数の定義
    b=a;                                          //全データを一括して代入
    printf("name=%s, age=%d, height=%f, weight=%f \n", a.name, a.age, a.height, a.weight);
    printf("name=%s, age=%d, height=%f, weight=%f \n", b.name, b.age, b.height, b.weight);
    return(0);
}

(1) 構造体の型(枠組み)の宣言:型の指定が可能
    あああああああああ
    meibo:構造体タグ(名),name,age,height,weight:メンバ(名),他の変数名とは区別される

(2) 変数の定義(領域確保)
    ああああああああああ

(3) 構造体配列
    struct meibo x[2];
    あああああああああ

(4) メリット:戻り値(返却値)として使える.データをソートする場合や,複数個のデータを返す場合に便利.

演習24

氏名(文字型配列),年齢(整数型),体重(実数型)のデータをメンバに持つ構造体aにデータをキーボードから入力し,その後,aに入っているデータを,同じ型を持つ構造体bに代入し,最後に,aとb両方のデータを出力せよ.但し,氏名はローマ字で入力すること.

応用27

構造体配列xに5名分の氏名,年齢,身長を初期値代入し,最も身長が高い人の氏名,年齢,身長を構造体aに代入し,aのデータを出力せよ.

ダウンロード

例題22 演習24 応用27

第23回 「ファイルへの入出力」

例題23

5名分の試験の点数を整数型配列にキーボードから入力し,その後,ファイル「tensuu」に出力せよ.

<プログラム>
#include<stdio.h>
int main(void){
    int x[5];
    int i;
    FILE *fp;                                  //ファイルポインタfpの宣言
    for(i=0;i<5;i++){
        printf("input data of No. %d ", i+1);
        scanf("%d", &x[i]);
    }
    fp=fopen("tensuu", "w");                   //ファイル「tensuu」を書き込みの為にオープン
    for(i=0;i<5;i++){
        fprintf(fp, "%d \n", x[i]);            //ファイルへの書き込み(出力)
    }
    fclose(fp);                                //ファイルのクローズ
    return(0);
}

(1) ファイルのオープン
    ”w”:ファイルが既に存在する場合は上書きをし,存在しない場合は新たに作成する.
    ”r”:ファイルからの読み込み(入力).データが入ったファイルが既に存在する必要がある.
    ”a”:ファイルが既に存在する場合は追加し,存在しない場合は新たに作成する.
    ファイル名を文字配列で与えることも出来る.
    char name[20];
    printf("input file name ");
    scanf("%s", name);
    fp=fopen(name);
    fp=fopen(name, "w");         //name:文字配列の先頭アドレス

(2) ファイルへの入出力
    入力:fscanf(fp, "%d", &a);  //但し,”r”でオープンしておく必要がある.
    複数のファイルへ同時に出力する場合(入力も同様)
    FILE *fp1, *fp2;
    fp1=fopen("data1", "w");
    fp2=fopen"data2", "w");
    fprintf(fp1, "%d \n", a);  →  ファイル「data1」へ出力
    fprintf(fp2, "%d \n", b);  →  ファイル「data2」へ出力
    fclose(fp1);
    fclose(fp2);

演習25

ああああああああ
上の例題のプログラムを実行し,ファイルtensuuを作成せよ.次に,作成したファイルtensuuから5名分の点数データを入力し,それらの合計と平均を計算して画面出力するプログラムを作成せよ.2つ目のプログラムを実行する前に,ファイルtensuuを2つ目のプログラムのソースファイルと同じフォルダにコピーしておくこと.

応用28

演習25の2つ目のプログラムを,データの個数が事前に分かっていないものとして作成せよ.但し,fscanfにおいて,読み込むデータが終了して読み込めなかった場合の戻り値(返却値)はEOF(int型の負の値で,事前にマクロ定義されている)である.合計,平均値,及び読み込んだデータの個数を画面出力せよ.

ダウンロード

例題23 演習25 応用28

第24回 「再帰」

例題24

再帰を用いて,nの会場(n×(n-1)×(n-2)…2×1)を計算する関数を作成せよ.

<プログラム>(P195ああああ)
#include<stdio.h>
int factorial(int n){                        //ある事象は,それが自分自身を含んでいたり,それを用いて定義されている時,再帰的であるという.
    if(n>0) return(n*factorial(n-1));        //(a) 0!=1
        else return(1);                      //(b) n>0ならば,n!=n×(n-1)!
}
int main(void){
    int num;
    printf("input integer ");
    scanf("%d", &num);
    printf("answer=%d \n", factorial(num));
    return(0);
}

例)num=3の場合
あああああああああ

演習26

10名分の数学の点数のデータ(整数)が入った一次元配列の先頭アドレスと人数を受け取り,それらの最大点,最小点,平均点を求めて返す関数を作成せよ.但し,main関数では,最初に,点数のデータを初期値代入し,関数を呼び出した後は,最大点,最小点,平均点の値を出力せよ.但し,関数は1つとし,最大点と最小点は整数型,平均点は実数型とせよ.
(演習22参照,再帰は必要ない)
ヒント:3つの結果を戻さなければならないので,結果を戻すための引数をアドレス渡し(ポインタ渡し)とするか(演習21参照),構造体を戻り値(返却値)とするかのどちらかである.

応用29

2つの複素数の積を計算する構造体の関数を作成せよ.すなわち,複素数の実数部と虚数部をメンバーで表現する構造体を宣言し,その構造体の型を持つ変数を引数で受け取り,それらの積(複素数)を戻り値(返却値)で戻すこと.但し,main関数では,最初に,2つの複素数に適当な値を与えておき,関数を呼び出した後は,2つの複素数と積の値を出力せよ.

応用30

3つの一次元整数型配列a,b,cの先頭アドレスと配列の大きさを受け取り,配列aのデータを,配列bには順方向に,配列cには逆方向に代入して返す関数を作成せよ.但し,main関数では,最初に,配列aに適当なデータを初期値代入し,関数を呼び出した後は,配列a,b,cの要素を出力せよ.(応用20参照)

ダウンロード

例題24 演習26 応用29 応用30

第25回 「演算子,整数型変数」

(1) 整数型変数(Pああああああああ)(大きさは処理系によって異なる)
    short in  unsigned short int  (符号無し)  ※intは省略可能
    int       unsigned int        (符号無し)  ※unsigned intのintは省略可能
    long int  unsigned long int   (符号無し)  ※intは省略可能
        ※sizeof(short)<=sizeof(int)<=sizeof(long)

(2) sizeof演算子(Pああああああああ)(charの大きさを1と定義)  1byte
    int a, x[5];
    printf("size=%u \n", (unsigned)sizeof(int));
    printf("size of a=%u, size of x=%u \n", (unsigned)sizeof(a), (unsigned)sizeof(x));

(3) インクリメント演算子(デクリメント演算子も同様)(Pああああああ)
    y=x++;  →  y=x;    x=x+1;  後置インクリメント演算子
    y=++x;  →  x=x+1;  y=x;    前置インクリメント演算子

(4) カンマ(コンマ)演算子(順次演算子)(Pあああああ)
    for(i=0, j=0;i<5;i++,j++)  c=a+2, b=c+x;

(5) 条件演算子(Pあああああ)
    x=(a<b)?3:5;        a<bの時は3が,それ以外の時は5がxに代入される.
    return((a<b)?b:a);  aとbの大きい方の値を返す.

(6) ビット演算子(Pあああああ)
    unsigned int a, b, c;  (符号無し整数型)  シフト演算子
    論理積(AND)           c=a&b;  a=a<<1;  1bit左シフト(2倍)
    論理和(OR)            c=a|b;  a=a>>1;  1bit右シフト(1/2倍)
    排他的論理和(XOR)     c=a^b;
    1の歩数                 c=~a;ああああああああああああ

演習27

実数xと整数nを受け取り,べき乗(xのn乗)を計算して返す関数を作成せよ.但し,main関数では,適当なデータをキーボードから入力し,関数を呼び出した後は,x,n,べき乗の値を出力せよ.
ヒント:演習19において,nが正の場合と負の場合の場合分けをする.x^-2=(1/x)^2

応用31

5名分の国語,数学,英語の点数を二次元配列に初期値代入し,3科目それぞれの最高点,最低点,平均点,標準偏差を2重ループのfor文を用いて出力すること.
ああああああああああああ

ダウンロード

演習27 応用31

第26回 「記憶領域期間,演算子と評価」

(1) 記憶域期間(Pああああ):変数などの記憶域が存在している寿命の期間
    自動記憶域期間(動的記憶期間)
        必要に応じて自動的に領域を確保し,自動的に解放する(関数を呼び出すごとに定義)
        関数内で宣言  int a;  動的変数(自動的変数)
    静的記憶域期間
        プログラムの開始時に定義され,プログラム全体の実行を通して存在する.
        関数内で宣言  static int a;  関数の外で宣言(外部変数)  int a;  静的変数
        
(2) 演算子と評価
    関係演算子(a>0)は,それが成立した場合は,非0(ex.1)と評価され,成立しない場合は,0と評価される.
    if文は,括弧内が非0であれば直後の命令を実行し,0であればelse文を実行する.
    等価演算子(x==10)は,等しい場合は1,そうでない場合は0と評価する.
    論理演算子(a<10 && b>50)は,a<10とb>50のいずれも非0であれば1,そうでなければ0と評価する.

応用32

台形公式による数値積分は,下図に示すように,積分区間[a,b]をn個の微小区間に分割し,各区間の面積を台形近似したものの総和で求められる.
ああああああああああああ

ダウンロード

応用32


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-01-16 (土) 18:03:29 (435d)