表計算ソフト/C言語のその他有用知識
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
&size(24){C言語のその他有用知識};
*C言語のその他有用知識 [#geefc7f8]
**このページについて [#y86da8ff]
ここまでのところで使用しなかった、C言語のその他の有用な...
**関数 [#a7825320]
***関数をつくる [#n004ef55]
C言語のプログラムの特徴の一つに、 関数 があります。 関数...
「なにか値を渡すと、何か結果が帰ってくる」
というものになっています。
一般には、特定の順番で特定の型(int や double など)の値を...
※有名な例外はprintfで、これは最初の文字列以外は不特定の引...
この関数は自分で作ることもできます。
一般に関数は「特定の処理をまとめる」ために作ります。 たと...
もう一つは、あまりに手順が長くなりすぎてうっとうしくなっ...
C言語でプログラムを作る、ということは、大抵は自分の望む...
普段、プログラムをつくる際の「int main(void) { ... }」も...
返値はint=整数で、プログラムの実行結果などをプログラム終...
一方、引数は「void」ですが、これは「なにもなし」を意味し...
つまり、このmain関数は、「引数ゼロ個、返値int」という関数...
※mainには引数として、実行時のオプションをもらう形式もある。
ちなみに、乱数のところでつかった rand()関数、srand()関数...
int rand(void) =引数ゼロ、返値int
void srand(unsigned int seed)
=引数1個(unsigned=正の数だけの int)、返値なし
です。rand(10)のように引数voidな関数に値を渡すことはでき...
なお、引数はいくらでも増やせますが(システム上の制限はある...
実際に、プログラムを作って動かしてみます。
// func1.c
#include <stdio.h>
double func(double a)
{
return a*a;
}
int main(void)
{
int i;
double x,y;
for(i=0;i<10;i++)
{
x=i;
y=func(x);
printf("%d %f %f\n",i,x,y);
}
return 0;
}
$ gcc -o func1 func1.c
$ func1
0 0.000000 0.000000
1 1.000000 1.000000
2 2.000000 4.000000
3 3.000000 9.000000
4 4.000000 16.000000
5 5.000000 25.000000
6 6.000000 36.000000
7 7.000000 49.000000
8 8.000000 64.000000
9 9.000000 81.000000
$
ここでは、数学的な関数 double func(double) 、引数がdouble...
まず、関数は呼び出す前に、その形式が分からないと使えませ...
※ここでは仕様と中身をまとめて書いているが、仕様だけ先に決...
関数は、
返値の型 関数名(引数1の型 引数1の名前, 引数2の型 引数...
{
関数の中身
}
という記述で作ります。もし、引数がなければ、voidと、一つ...
関数から値を返すときは、
return 値;
とします。その値が関数を使った側に返値として戻ります。
なお、returnのあとはいくら関数に内容が書いてあっても実行...
※処理の内容に応じて、returnは複数あってもかまわない
※returnせずに関数を最後まで実行すると、そこで自動でreturn...
※ただし、返値が変になるのvoid以外の場合は必ずreturnする
関数を使うときは、
r=関数名(引数1, 引数2, ...);
とします。rには返値が入ります。また、式の中で直接「関数名...
上のプログラム例では、main()のなかで y=func(x); という形...
funcに入ったら、渡された値(mainではxだった)がaで使えます。
注意点としては、渡された値である、aをfuncの中で別の値にし...
やってみよう
上のプログラムで、funcのreturnにある計算式をa*a*aなど、他...
***自分自身をつかう関数 [#w7783326]
上で説明したように、関数に渡された値は、その関数の中だけ...
同じように、関数のなかで作った変数は、その関数のなかだけ...
もうすこし厳密には、関数は自分が呼び出されると、真っ先に...
関数の処理が終わると、そのメモリを捨てて終わります。
「呼び出されたときに」確保するため、「自分で自分を呼ぶ」...
これを「再帰呼び出し」といい、ときどき使い道があります。
ここでは、階乗
&ref(clang.bhtml.eqn1.gif);
を求めてみます。
まず、n!を計算する関数を fact(n)とします。
ここで、
&ref(clang.bhtml.eqn2.gif);
なので、
fact(n)=fact(n-1)*n
です。加えて、
1!=1 (そのまま)、0!=1 (期待される性質的に規定)
なので、fact(n)のすべき処理は、
nが負ならエラーである(使うときに気をつけるなら処理は...
nが0か1なら、1を返値とする
nが2以上なら、n*fact(n-1)を返値とする
となります。これをプログラムにすると、以下のようになりま...
//func2.c
#include <stdio.h>
int fact(int n)
{
if(n<0) // 往々にして、エラーへの対応に手間がかかる
{
printf("fact error\n");
return 0;
}
if((n==0)||(n==1)) return 1; // 0!=1, 1!=1, "||"は「...
else return fact(n-1)*n; // n!=(n-1)!*n
}
int main(void)
{
int i;
for(i=0;i<10;i++)
{
printf("%d!=%d\n",i,fact(i));
}
return 0;
}
$ gcc -o func2 func2.c
$ func2
0!=1
1!=1
2!=2
3!=6
4!=24
5!=120
6!=720
7!=5040
8!=40320
9!=362880
$
この中の、
return n*fact(n-1);
は、実際には、
自分自身を使って、(n-1)!=fact(n-1)を計算する。→一時的...
n* の計算をする
その結果をreturnする
という処理になります。
試してみよう
main()のなかの、for(i=0;i<10;i++) は「0?9」のループ。よ...
単に、1*2*..*nを計算するだけなら、再帰呼び出しの必要性は...
***組合せの数 [#l1e88214]
「人が5人います。そこから3人を選び出す組合せは何通りあ...
(1,2,3)(1,2,4)(1,2,5)(1,3,4)(1,3,5)(1,4,5)
(2,3,4)(2,3,5)(2,4,5) (3,4,5)
の10通り
このような組合せの計算は、主に受験数学の「問題のための問...
ここでは、「複数の関数をつくる題材」として、計算してみま...
一般に、n個のものから、m個を選び出す組合せの数は、
&ref(clang.bhtml.eqn3.gif);
で計算されます。それを計算する関数 combi(n,m)を作ってみま...
//func3.c (factは同じ)
#include <stdio.h>
int fact(int n)
{
if(n<0)
{
printf("fact error\n");
return 0;
}
if((n==0)||(n==1)) return 1; // 0!=1, 1!=1
else return fact(n-1)*n; // n!=(n-1)!*n
}
int combi(int n,int m)
{
if((m>n)||(m<1)||(n<1))
{
printf("combi error\n");
return 0;
}
return fact(n)/(fact(m)*fact(n-m));
}
int main(void)
{
int i;
for(i=1;i<6;i++)
{
printf("C(5,%d)=%d\n",i,combi(5,i));
}
return 0;
}
$ gcc -o func3 func3.c
$ func3
C(5,1)=5
C(5,2)=10
C(5,3)=10
C(5,4)=5
C(5,5)=1
$
ここまで来れば、説明するまでもありません。
複数の引数を持った関数をつくれますし、そこから別の関数を...
このプログラムまで無事に動作したら、このプログラムを課題...
この際、自分なりの改造(改造と言えそうな改造)がしてあれば...
**配列・構造体 [#iedd6d0b]
実際にいろいろな処理をしていくと、データの扱い方が重要に...
たとえば、30個の値をまとめて扱いたいという場合に、いち...
以下では、そういうデータの扱い方を2種類示します。
***配列 [#bf0be4c8]
たとえば、同じ意味を持ったデータ、50個の部品の長さを測...
といっても、特殊なことはなく、
int/double 変数名[個数];
のように、変数をつくるときに、直後に"[個数]"をつけます。...
変数名[番号]
のように、"[番号]"をつけます。
この番号は0?「最初に指定した個数?1」です(ゼロから始ま...
負の値も、指定した個数以上の値もNGです。
それらを使うと、たいていの場合プログラムの誤動作の原因に...
いまはメモリが潤沢なので、とりあえず使いそうな上限よりも...
(ただし、それを越えたら危険なので、厳密には各種チェック...
負の値、たとえば、「?100?100」が欲しいという場合は...
//elm.c
#include <stdio.h>
int main(void)
{
int x[10]={5,6,7,8,9,10,1,2,3,4};
int i;
x[7]=77;
for(i=0;i<10;i++)
{
printf("x[%d]=%d\n",i,x[i]);
}
return 0;
}
$ gcc -o elm elm.c
$ elm
x[0]=5
x[1]=6
x[2]=7
x[3]=8
x[4]=9
x[5]=10
x[6]=1
x[7]=77
x[8]=3
x[9]=4
$
この例では、最初に変数xを10個の配列としてつくります。
さらに、最初に一括で値を代入してしまいます(注:一括代入...
その後、x[7]だけ、別に値を代入して値を変えてしまっていま...
余裕があれば、forの値の範囲を変えて、「扱いが悪かったとき...
なお、このように配列として作った変数x[]は、単にxとして値...
***構造体 [#u2c79f92]
「同じ性質のもの」を複数束ねるのが配列であるのに対して、...
構造体は、多少やっかいです。
構造体の形式を決める(プログラムで冒頭で1回あればよい):
struct 構造体の形式名
{
int なんたら;
double かんたら;
等、セットにする変数をならべる
};
構造体の実体をつくる(必要な数だけ変数の実体をつくる):
struct 形式名 変数の実体の名前;
構造体を使う
変数の実体の名前.構造体内部の変数の名前
実際のプログラムを触ってみた方が、具体的に分かると思いま...
//struct.c
#include <stdio.h>
struct point
{
double x,y,z;
};
int main(void)
{
struct point p[3]=
{
{ 1,2,3 }, // p[0]のx,y,z
{ 4,5,6 },
{ 7,8,9 },
};
int i;
for(i=0;i<3;i++)
{
printf("p%d = (%f,%f,%f)\n", i, p[i].x , p[i].y, p[...
}
return 0;
}
$ gcc -o struct struct.c
$ struct
p0 = (1.000000,2.000000,3.000000)
p1 = (4.000000,5.000000,6.000000)
p2 = (7.000000,8.000000,9.000000)
$
この例では、「座標を表すための変数」として point という形...
point には、double で、x,y,z という変数を含みます。
main()では、このpoint形式の変数 p を、3個セットの配列と...
つまり、変数pは、p[0], p[1], p[2]各々にx,y,zが入った状態...
このプログラムでは、ただ値を表示しているだけですが、もち...
実際に実用的なプログラムを作る場合には、構造体を構造体に...
たとえば、構造体「三角形」{頂点1,頂点2,頂点3}のよ...
*より深く学ぶには [#g3ccb0f5]
この講義では、敢えて、「基本的な文法」「基本的な事項」を...
細かな文法は、言語が変われば変わりますし、実際に使うとき...
表計算については、この上で学ぶべきは「どんな関数があるか...
C言語については、
計算をするための「演算子」を知る。
四則演算などが基本。演算の優先順位などもまじめに見て...
プログラムの考え方を知る。
この講義では「打ち込んで動かす」だけで、ほとんど済ん...
ポインタを知る。
C言語における「アドレス、番地」を表現するためのもの...
標準的な関数を知る。
算術関数、printfなどの他、データをファイルに出し入れ...
あたりが重要かと考えます。
このページで、「コンピュータに計算させること」に興味を持...
終了行:
&size(24){C言語のその他有用知識};
*C言語のその他有用知識 [#geefc7f8]
**このページについて [#y86da8ff]
ここまでのところで使用しなかった、C言語のその他の有用な...
**関数 [#a7825320]
***関数をつくる [#n004ef55]
C言語のプログラムの特徴の一つに、 関数 があります。 関数...
「なにか値を渡すと、何か結果が帰ってくる」
というものになっています。
一般には、特定の順番で特定の型(int や double など)の値を...
※有名な例外はprintfで、これは最初の文字列以外は不特定の引...
この関数は自分で作ることもできます。
一般に関数は「特定の処理をまとめる」ために作ります。 たと...
もう一つは、あまりに手順が長くなりすぎてうっとうしくなっ...
C言語でプログラムを作る、ということは、大抵は自分の望む...
普段、プログラムをつくる際の「int main(void) { ... }」も...
返値はint=整数で、プログラムの実行結果などをプログラム終...
一方、引数は「void」ですが、これは「なにもなし」を意味し...
つまり、このmain関数は、「引数ゼロ個、返値int」という関数...
※mainには引数として、実行時のオプションをもらう形式もある。
ちなみに、乱数のところでつかった rand()関数、srand()関数...
int rand(void) =引数ゼロ、返値int
void srand(unsigned int seed)
=引数1個(unsigned=正の数だけの int)、返値なし
です。rand(10)のように引数voidな関数に値を渡すことはでき...
なお、引数はいくらでも増やせますが(システム上の制限はある...
実際に、プログラムを作って動かしてみます。
// func1.c
#include <stdio.h>
double func(double a)
{
return a*a;
}
int main(void)
{
int i;
double x,y;
for(i=0;i<10;i++)
{
x=i;
y=func(x);
printf("%d %f %f\n",i,x,y);
}
return 0;
}
$ gcc -o func1 func1.c
$ func1
0 0.000000 0.000000
1 1.000000 1.000000
2 2.000000 4.000000
3 3.000000 9.000000
4 4.000000 16.000000
5 5.000000 25.000000
6 6.000000 36.000000
7 7.000000 49.000000
8 8.000000 64.000000
9 9.000000 81.000000
$
ここでは、数学的な関数 double func(double) 、引数がdouble...
まず、関数は呼び出す前に、その形式が分からないと使えませ...
※ここでは仕様と中身をまとめて書いているが、仕様だけ先に決...
関数は、
返値の型 関数名(引数1の型 引数1の名前, 引数2の型 引数...
{
関数の中身
}
という記述で作ります。もし、引数がなければ、voidと、一つ...
関数から値を返すときは、
return 値;
とします。その値が関数を使った側に返値として戻ります。
なお、returnのあとはいくら関数に内容が書いてあっても実行...
※処理の内容に応じて、returnは複数あってもかまわない
※returnせずに関数を最後まで実行すると、そこで自動でreturn...
※ただし、返値が変になるのvoid以外の場合は必ずreturnする
関数を使うときは、
r=関数名(引数1, 引数2, ...);
とします。rには返値が入ります。また、式の中で直接「関数名...
上のプログラム例では、main()のなかで y=func(x); という形...
funcに入ったら、渡された値(mainではxだった)がaで使えます。
注意点としては、渡された値である、aをfuncの中で別の値にし...
やってみよう
上のプログラムで、funcのreturnにある計算式をa*a*aなど、他...
***自分自身をつかう関数 [#w7783326]
上で説明したように、関数に渡された値は、その関数の中だけ...
同じように、関数のなかで作った変数は、その関数のなかだけ...
もうすこし厳密には、関数は自分が呼び出されると、真っ先に...
関数の処理が終わると、そのメモリを捨てて終わります。
「呼び出されたときに」確保するため、「自分で自分を呼ぶ」...
これを「再帰呼び出し」といい、ときどき使い道があります。
ここでは、階乗
&ref(clang.bhtml.eqn1.gif);
を求めてみます。
まず、n!を計算する関数を fact(n)とします。
ここで、
&ref(clang.bhtml.eqn2.gif);
なので、
fact(n)=fact(n-1)*n
です。加えて、
1!=1 (そのまま)、0!=1 (期待される性質的に規定)
なので、fact(n)のすべき処理は、
nが負ならエラーである(使うときに気をつけるなら処理は...
nが0か1なら、1を返値とする
nが2以上なら、n*fact(n-1)を返値とする
となります。これをプログラムにすると、以下のようになりま...
//func2.c
#include <stdio.h>
int fact(int n)
{
if(n<0) // 往々にして、エラーへの対応に手間がかかる
{
printf("fact error\n");
return 0;
}
if((n==0)||(n==1)) return 1; // 0!=1, 1!=1, "||"は「...
else return fact(n-1)*n; // n!=(n-1)!*n
}
int main(void)
{
int i;
for(i=0;i<10;i++)
{
printf("%d!=%d\n",i,fact(i));
}
return 0;
}
$ gcc -o func2 func2.c
$ func2
0!=1
1!=1
2!=2
3!=6
4!=24
5!=120
6!=720
7!=5040
8!=40320
9!=362880
$
この中の、
return n*fact(n-1);
は、実際には、
自分自身を使って、(n-1)!=fact(n-1)を計算する。→一時的...
n* の計算をする
その結果をreturnする
という処理になります。
試してみよう
main()のなかの、for(i=0;i<10;i++) は「0?9」のループ。よ...
単に、1*2*..*nを計算するだけなら、再帰呼び出しの必要性は...
***組合せの数 [#l1e88214]
「人が5人います。そこから3人を選び出す組合せは何通りあ...
(1,2,3)(1,2,4)(1,2,5)(1,3,4)(1,3,5)(1,4,5)
(2,3,4)(2,3,5)(2,4,5) (3,4,5)
の10通り
このような組合せの計算は、主に受験数学の「問題のための問...
ここでは、「複数の関数をつくる題材」として、計算してみま...
一般に、n個のものから、m個を選び出す組合せの数は、
&ref(clang.bhtml.eqn3.gif);
で計算されます。それを計算する関数 combi(n,m)を作ってみま...
//func3.c (factは同じ)
#include <stdio.h>
int fact(int n)
{
if(n<0)
{
printf("fact error\n");
return 0;
}
if((n==0)||(n==1)) return 1; // 0!=1, 1!=1
else return fact(n-1)*n; // n!=(n-1)!*n
}
int combi(int n,int m)
{
if((m>n)||(m<1)||(n<1))
{
printf("combi error\n");
return 0;
}
return fact(n)/(fact(m)*fact(n-m));
}
int main(void)
{
int i;
for(i=1;i<6;i++)
{
printf("C(5,%d)=%d\n",i,combi(5,i));
}
return 0;
}
$ gcc -o func3 func3.c
$ func3
C(5,1)=5
C(5,2)=10
C(5,3)=10
C(5,4)=5
C(5,5)=1
$
ここまで来れば、説明するまでもありません。
複数の引数を持った関数をつくれますし、そこから別の関数を...
このプログラムまで無事に動作したら、このプログラムを課題...
この際、自分なりの改造(改造と言えそうな改造)がしてあれば...
**配列・構造体 [#iedd6d0b]
実際にいろいろな処理をしていくと、データの扱い方が重要に...
たとえば、30個の値をまとめて扱いたいという場合に、いち...
以下では、そういうデータの扱い方を2種類示します。
***配列 [#bf0be4c8]
たとえば、同じ意味を持ったデータ、50個の部品の長さを測...
といっても、特殊なことはなく、
int/double 変数名[個数];
のように、変数をつくるときに、直後に"[個数]"をつけます。...
変数名[番号]
のように、"[番号]"をつけます。
この番号は0?「最初に指定した個数?1」です(ゼロから始ま...
負の値も、指定した個数以上の値もNGです。
それらを使うと、たいていの場合プログラムの誤動作の原因に...
いまはメモリが潤沢なので、とりあえず使いそうな上限よりも...
(ただし、それを越えたら危険なので、厳密には各種チェック...
負の値、たとえば、「?100?100」が欲しいという場合は...
//elm.c
#include <stdio.h>
int main(void)
{
int x[10]={5,6,7,8,9,10,1,2,3,4};
int i;
x[7]=77;
for(i=0;i<10;i++)
{
printf("x[%d]=%d\n",i,x[i]);
}
return 0;
}
$ gcc -o elm elm.c
$ elm
x[0]=5
x[1]=6
x[2]=7
x[3]=8
x[4]=9
x[5]=10
x[6]=1
x[7]=77
x[8]=3
x[9]=4
$
この例では、最初に変数xを10個の配列としてつくります。
さらに、最初に一括で値を代入してしまいます(注:一括代入...
その後、x[7]だけ、別に値を代入して値を変えてしまっていま...
余裕があれば、forの値の範囲を変えて、「扱いが悪かったとき...
なお、このように配列として作った変数x[]は、単にxとして値...
***構造体 [#u2c79f92]
「同じ性質のもの」を複数束ねるのが配列であるのに対して、...
構造体は、多少やっかいです。
構造体の形式を決める(プログラムで冒頭で1回あればよい):
struct 構造体の形式名
{
int なんたら;
double かんたら;
等、セットにする変数をならべる
};
構造体の実体をつくる(必要な数だけ変数の実体をつくる):
struct 形式名 変数の実体の名前;
構造体を使う
変数の実体の名前.構造体内部の変数の名前
実際のプログラムを触ってみた方が、具体的に分かると思いま...
//struct.c
#include <stdio.h>
struct point
{
double x,y,z;
};
int main(void)
{
struct point p[3]=
{
{ 1,2,3 }, // p[0]のx,y,z
{ 4,5,6 },
{ 7,8,9 },
};
int i;
for(i=0;i<3;i++)
{
printf("p%d = (%f,%f,%f)\n", i, p[i].x , p[i].y, p[...
}
return 0;
}
$ gcc -o struct struct.c
$ struct
p0 = (1.000000,2.000000,3.000000)
p1 = (4.000000,5.000000,6.000000)
p2 = (7.000000,8.000000,9.000000)
$
この例では、「座標を表すための変数」として point という形...
point には、double で、x,y,z という変数を含みます。
main()では、このpoint形式の変数 p を、3個セットの配列と...
つまり、変数pは、p[0], p[1], p[2]各々にx,y,zが入った状態...
このプログラムでは、ただ値を表示しているだけですが、もち...
実際に実用的なプログラムを作る場合には、構造体を構造体に...
たとえば、構造体「三角形」{頂点1,頂点2,頂点3}のよ...
*より深く学ぶには [#g3ccb0f5]
この講義では、敢えて、「基本的な文法」「基本的な事項」を...
細かな文法は、言語が変われば変わりますし、実際に使うとき...
表計算については、この上で学ぶべきは「どんな関数があるか...
C言語については、
計算をするための「演算子」を知る。
四則演算などが基本。演算の優先順位などもまじめに見て...
プログラムの考え方を知る。
この講義では「打ち込んで動かす」だけで、ほとんど済ん...
ポインタを知る。
C言語における「アドレス、番地」を表現するためのもの...
標準的な関数を知る。
算術関数、printfなどの他、データをファイルに出し入れ...
あたりが重要かと考えます。
このページで、「コンピュータに計算させること」に興味を持...
ページ名: