C言語 学習ノート


ここでは、C言語の基礎について説明します。</p>
<h2 style="border-bottom: 2px solid #44004E; border-left: 10px solid#44004E; padding: 7px;"><span style="color: #44004e;">C言語の雛形</span></h2>
<p>C言語は大枠としては以下のように記述します。</p>
<pre class="language-c"><code>#include&lt;stdio.h&gt;

int main(void){

ここに処理内容を記述する

return 0;
}</code></pre>

<p>この雛壇を元にして、説明をします。</p>

<h2 style="border-bottom: 2px solid #44004E; border-left: 10px solid#44004E; padding: 7px;"><span style="color: #44004e;">変数と配列</span></h2>
<p><strong><span style="font-size: 18pt;">変数について</span></strong></p>
<p>変数とはいわゆる、値を入れるための箱のようなものです。<br />その変数はどのようなタイプ(型)であるのかを宣言する必要があります。</p>
<p>ここでは、まず2つの変数型を知ればいいです。<br />int型&rarr; 整数型(1,2,3といった整数を入れる時に使う)</p>
<p>char型 &rarr; 文字型(a,b,cといった文字を入れる時に使う)</p>
<pre class="language-markup"><code>int a;
char b;</code></pre>
<p>ここで、文章の最後には、必ずセミコロン;を付けます。</p>
<p>これらの変数に数字や文字を代入する時は「=」を使います。</p>
<pre class="language-c"><code>int x = 1;
char y = essan;
char z = 'K';</code></pre>
<p>ここで、1文字のみを代入する時は、引用符「'」で囲みます。</p>

<p><strong><span style="font-size: 18pt;">配列について</span></strong></p>
<p>変数をいくつか定義する時、それをまとめるものが配列といいます。<br />まとめた時、データの値を要素といい、データの数を要素数(サイズ)といいます。サイズは0番目から始まり、1番目、2番目、3番目と続きます。</p>
<pre class="language-markup"><code>int x[配列数]= {データ};</code></pre>
<p>以下のようにして書いた場合</p>
<p>また、配列には<strong>インデックス番号</strong>が割り振られていて、先頭より0、1、2と割り振られています。その定義した配列より、値を表示したい場合は、以下のように記述します。</p>
<pre class="language-c"><code>配列名[インデックス番号];</code></pre>

<p>例えば、配列をこのように定義した場合、</p>
<pre class="language-c"><code>int x[5] = {1,2,3,4,5}</code></pre>
<p>定義した配列にある値を表示させたい時は、以下のようになります。</p>
<p>x[0]=1、x[1]=2 、x[2]=3、x[3]=4 、x[4]=5&nbsp;</p>
<p>&nbsp;</p>
<h2 style="border-bottom: 2px solid #44004E; border-left: 10px solid#44004E; padding: 7px;"><span style="color: #44004e;">関数について</span></h2>

<p><strong><span style="font-size: 18pt;">メイン関数とサブルーチンについて</span></strong></p>
<p>関数とは入力した値x(引値)を入れると出力された値y(戻り値)が出て来る機能をいいます。</p>
<p>C言語における関数の雛壇は以下のようになります。</p>
<pre class="language-c"><code>関数の型 関数名(引数1, 引数2,&hellip;, 引数n)
{
　変数の定義;
　処理内容;

 return 戻り値;
}
</code></pre>
<p>C言語ではmain関数を本体にしてプログラムを実行しますので、必ず</p>
<pre class="language-c"><code>int main(void){

 変数の定義;
 処理内容;

 return 0;
}</code></pre>
<p>と書きます。また、プログラムを終了するときは0を返すことになっているので、戻り値は0にします。</p>
<p>メイン関数とは別に関数を書く時は、必ず関数の前に宣言しておく必要があり、それを<strong>プロトタイプ宣言</strong>といいます。なので、全体的な雛壇は以下のようになります。</p>
<pre class="language-c"><code>#include&lt;stdio.h&gt;

関数の型 関数名(引数1, 引数2,&hellip;,引数n)


int main(void){

 変数の定義;
 処理内容;

 return 0;
}


関数の型 関数名(引数1, 引数2,&hellip;, 引数n)
{
　変数の定義;
　処理内容;

 return 戻り値;
}
</code></pre>

<p>変数の型 関数名(引数1, 引数2,&hellip;,引数n) がプロトタイプ宣言になります。</p>
<p>ここで、main関数を<strong>メインプログラム(メインルーチン</strong>)といい、それ以外の関数を<strong>サブプログラム(サブルーチン</strong>)といいます。<br />サブルーチンを実行する際は、プロトタイプ宣言を書いた上でメインルーチンの中で以下のような事を書きます。</p>
<pre class="language-markup"><code>関数名(引数1, 引数2,&hellip;,引数n);</code></pre>
<p>ここで、引数の変数型とサブルーチンの変数型は一致しておく必要があります。</p>
<p>ここで例文を示します。</p>
<pre class="language-c"><code>#include&lt;stdio.h&gt;

int sum(int x,int y);

int main(void)
{
 int a,b;
 sum(a,b);
}

int sum(int x , int y)
{
 int z;
 z = x+y;

 return z;

}</code></pre>
<p>まず、サブルーチンを使うので、プロトタイプ宣言「int sum(int x,int y);」を書きます。<br />次にメイン関数の中に変数aとbを用意します。<br />次に実行したい関数を書いています。ここではsum関数を使いたいので「sum(a,b);」と書きます。</p>
<p>最後にサブルーチン「int sum(int x, int y){ }」について書きます。<br />ここでは、メイン関数にある変数aとbの値がサブルーチンでの入力値であるxとyの値となります。<br />次に、xとyに値を入れるとzという値が出力され、zの値がメイン関数の中にある「sum(a,b);」の値となります。</p>

<p><strong><span style="font-size: 18pt;">ヘッダーファイルについて</span></strong></p>
<p>最後に、この一文の意味について説明します。</p>
<p><em>#include &lt;stdio.h&gt;</em></p>
<p>main関数の前には本来使いたい関数をプロトタイプ宣言する必要があります。<br />C言語には出力関数としてprintf、入力関数としてscanfが用意されています。その入出力する関数の内容はファイルstdio.h内にて記述されます。また、そのファイルはヘッダーファイルとなっているので、&rdquo;.h&rdquo; と拡張子を書きます。</p>
<p>　ここで &ldquo;stdio&rdquo; の意味は，&rdquo;standard I/O&rdquo; (standard input/output) です。studioではありません。日本語に訳せば「標準入出力」であり、&rdquo;.h&rdquo; は，ヘッダファイルの拡張子です。<br />つまり、</p>
<p><em>#include&lt;ファイル名&gt;</em><br />と冒頭で書く事で指定されたファイルが読み込まれ、記述されたプログラムにファイルの内容が展開されて、関数を使えるようになります。また、入出力したい時、サブルーチンを書く必要もなくなります。<br />つまり、<strong>プロトタイプ宣言した関数をひとまとめにしたのがinclude文</strong>であると言えます。これを書く事で、<strong>サブルーチンなしで関数を使えるようになる</strong>といえるでしょう。</p>

<p><strong><span style="font-size: 18pt;">関数printfについて</span></strong></p>
<p>関数printfは以下のようにして記述します。</p>
<pre class="language-markup"><code>printf("書式文字列",変数);</code></pre>
<p>ここで変数は省略できます。なので、</p>
<pre class="language-c"><code>printf("この値は%dです",a);</code></pre>
<p>とすると、変数aを10進数の整数で表示されます。ここで%dとは10進数の整数で表示せよという意味を持ち、これを変数仕様といいます。</p>

<p>以上を読むと、以下の例文の意味がわかると思います。</p>
<pre class="language-c"><code>#include&lt;stdio.h&gt;

int sum(int x,int y);

int main(void)
{
 int a = 1;
 int b = 2;
 int c = sum(a,b);

 printf("値は%dになります",c);

 return 0;
}

int sum(int x, int y)
{
 int z;
 z = x+y;

 return z;
}
</code></pre>

<h2 style="border-bottom: 2px solid #44004E; border-left: 10px solid#44004E; padding: 7px;"><span style="color: #44004e;">制御文について</span></h2>

<p><strong><span style="font-size: 18pt;">if文について</span></strong></p>
<p>if文は条件分岐をする際の構文であり、条件に応じて実行する処理を変更します。<br />この文は、以下のように記述します。</p>
<pre class="language-c"><code>if(条件式)
{
 条件式が真の時の処理内容
}
else
{
 条件式が偽の時の処理内容
}</code></pre>
<p>例文</p>
<pre class="language-markup"><code>#include&lt;stdio.h&gt;

int main(void)
{
 int a = 3;

 if(x&gt;0)
{
 printf("これは自然数です");
}
 else
{
 printf("これは自然数ではありません");
}

 return 0;

}</code></pre>
<p>この場合はaに代入された値が自然数だと「これは自然数です」と表示され、そうでない場合は「これは自然数ではありません」と表示されます。</p>

<p><span style="font-size: 18pt;"><strong>for文について</strong></span></p>
<p>for文は繰り返し処理をする際に用いられる構文であり、以下のようにして記述されます。</p>
<pre class="language-c"><code>for(初期値;繰り返し処理をする条件;処理した後の処理)
{
繰り返し処理をする内容
}</code></pre>

<p>説明すると、まず初期値の所で変数と繰り返し処理をする際の一番最初の値を設定します。<br />　それから「繰り返し処理をする条件」に当てはめ、条件式を満たした場合に「繰り返し処理をする内容」を実行し、その次に「処理した後の処理」に入ります。<br />　それから「繰り返し処理する条件」にあてはめ、その条件を満たしたら、また「繰り返し処理をする内容」を実行し、その次に「処理した後の処理」に入ります。<br />　それを繰り返し条件をする条件を満たさなくなるまで継続します。<br />　つまり、<br />初期値&rarr;繰り返し処理をする条件&rarr;繰り返し処理をする内容&rarr;処理した後の処理&rarr;繰り返し処理をする条件&rarr;繰り返し処理をする内容&rarr;処理した後の処理・・・<br />とループをしていくということです。</p>
<pre class="language-c"><code>#include&lt;stdio.h&gt;

int main(void)
{
 int i ;
 int sum = 0 ;

 for( i=1 ; i&lt;=10 ;i++)
{
 sum = sum + i ;
}

 printf("1から10までの値は%dです" , sum);

 return 0;

}</code></pre>
<p>この場合は55と表示されます。</p>



<h2 style="border-bottom: 2px solid #44004E; border-left: 10px solid#44004E; padding: 7px;"><span style="color: #44004e;">ポインタについて</span></h2>
<p>ポインタとは、ポインタ変数と呼ばれる変数を用いて他の変数の場所を指し示すものです。ここで、ポインタ変数とはメモリ上のアドレスを値をして代入できる変数です。このことについてこれから説明します。</p>

<p><span style="font-size: 16pt;"><strong>ポインタ変数について</strong></span></p>
<p>ポインタ変数は、以下のようにして宣言します。</p>
<pre class="language-c"><code>変数の型 *変数名;</code></pre>
<p>つまり、変数にアスタリスクを付けることでポインタ変数であることを宣言しています。このアスタリスクを間接演算子といい、ポインタ変数が示す内容を間接的に表示できます。<br />もし変数xについて</p>
<pre class="language-c"><code>int *x;</code></pre>
<p>と宣言した場合、xにはアドレスが代入されます。<br />ここで、宣言以外でアスタリスクを使う場合は、アドレスが示す変数の値を示すことになります。</p>

<p><span style="font-size: 16pt;"><strong>アドレスの参照</strong></span><br />ある変数xを宣言すると、変数xが配置されるアドレスはコンパイラが勝手に決めます。そのアドレスは何かを尋ねる時は、以下のようにして宣言します。</p>
<pre class="language-c"><code>&amp;変数名;</code></pre>
<p>つまり&amp;に変数名につける事で、例えば変数xについて、<strong>&amp;xはxのアドレスそのもの</strong>を表していると言えるでしょう。</p>

<p><strong><span style="font-size: 16pt;">例文</span></strong></p>
<pre class="language-c"><code>#include&lt;stdio.h&gt;

int main(void){

 double x = 2.71; /*変数xの定義 */
 double *y;  /*ポインタ変数yの定義 */
 y = &amp;x; /*ポインタ変数yへ変数xのアドレスを代入 */

 printf("変数xのアドレスは%pです",y);/*ポインタ変数yを表示 */
 printf("変数xの中身は%fです",*p); /*ポインタ変数yが示す中身を表示 */

 return 0;

}</code></pre>

<p><strong><span style="font-size: 16pt;">ポインタと配列<br /></span></strong></p>
<p>配列名は、配列の先頭要素があるアドレスを表ます。<br />つまり、</p>
<pre class="language-c"><code>int a[];</code></pre>

<p>としたとき、a[0]の要素のアドレスを表すことになります。<br />ここで、配列の先頭要素以降のアドレスを表すには、ポインタを加算していきます。</p>
<pre class="language-c"><code>int a[] ;
int *p = a+1 ;
</code></pre>
<p>このとき、2番目の要素のアドレスを表す事になります。<br />また、以下のように書く事もできます。</p>
<pre class="language-c"><code>int a[] ;
a[1] = *(a+1);</code></pre>

<h2 style="border-bottom: 2px solid #44004E; border-left: 10px solid#44004E; padding: 7px;"><span style="color: #44004e;">構造体について</span></h2>
<p><span style="font-size: 16pt;"><strong>構造体とは何か</strong></span></p>
<p>構造体とは、複数の型のデータを一つにまとめたものであり、構造体を構成する要素を<strong>メンバ</strong>といいます。<br />構造体の書式は以下のようにして表します。</p>
<pre class="language-c"><code>struct 構造体タグ{
型 メンバ名;
型 メンバ名;
&hellip;
};</code></pre>
<p>ここで、この構造体に付けられる名前を<strong>構造体タグ</strong>といいます。構造体はメイン関数の前で定義をします。<br />関数の中で構造体を利用する際は、以下のようにして変数を用意します。</p>
<pre class="language-c"><code>struct 構造体タグ 変数名;</code></pre>
<p>&nbsp;</p>
<p>例文をここに表ます。</p>
<pre class="language-c"><code>struct seiseki{
 int number; /*学籍番号*/
 char name[20]; /*氏名*/ 
 char subject[20]; /*科目名*/
 int score; /*点数*/
};</code></pre>
<p>ここでは、seisekiが構造体タグであり、numberやnameなどがメンバです。この構造体を使った変数を用意する場合は以下のようになります。</p>
<pre class="language-c"><code>struct seiseki essan;</code></pre>
<p>ここで、構造体のデータが入った変数がessanとなります。</p>

<p><strong><span style="font-size: 16pt;">typedefを用いた構造体について</span></strong></p>
<p>先ほどの例文ではseisekiと名付けた構造体タグを使いましたが、この別名を用意する場合は、以下のような書式にします。</p>
<pre class="language-markup"><code>typedef struct 構造体タグ{
 型 メンバ名;
 型 メンバ名;
&hellip;
}別名;</code></pre>
<p>つまり、先ほどの例文の場合は以下のようになります。</p>
<pre class="language-c"><code>typedef struct seiseki{
 int number; /*学籍番号*/
 char name[20]; /*氏名*/ 
 char subject[20]; /*科目名*/
 int score; /*点数*/
}NEMber;</code></pre>
<p>こうすると、構造体のデータが入った変数を用意するとき、essanを変数名として</p>
<pre class="language-c"><code>NEMber essan</code></pre>
<p>とでき、typedefを使わなかった時と比べて使う文字数を減らすことができます。</p>

<p><span style="font-size: 16pt;"><strong>構造体の参照について</strong></span></p>
<p>構造体にあるメンバを呼び出したいときは、以下のようにします。</p>
<pre class="language-c"><code>構造体の変数名.メンバ名</code></pre>
<p>ここで、「.」は<strong>ドット演算子</strong>といいます。<br />例文において、構造体のデータが入った変数essanの場合、学籍番号を呼び出したい時は以下のようにします。</p>
<pre class="language-c"><code>essan.number;</code></pre>
<p>このような事を生かした例文が以下のようになります。</p>
<pre class="language-markup"><code>#include &lt;stdio.h&gt;

typedef struct {
	int no;		/* 学生番号 */
	char name[20];	/* 氏名 */
	double average;	/* 平均値 */
} SEISEKI;

int main(void)
{
	int i;
	SEISEKI student1 = { 5, "SHU", 83.5 }; 
	SEISEKI student2[20] = {
		{ 1, "ESSAN", 78.6 },
		{ 2, "ZEMZEM", 57.3 },
		{ 3, "MATSUNOKI", 66.4 },
	};
	
	printf("%d %s %5.1f\n\n", student1.no, student1.name, student1.average); 
	for (i = 0; i &lt; 3; i++) {
		printf("%d %s %5.1f\n",
			student2[i].no, student2[i].name, student2[i].average);
	}
	
	return 0;
}</code></pre>

<h2 style="border-bottom: 2px solid #44004E; border-left: 10px solid#44004E; padding: 7px;"><span style="color: #44004e;">参考文献</span></h2>
<p>やさしく学べるC言語入門［第２版］ 皆本晃也 サイエンス社</p>
<p>Cの絵本　株式会社アンク<span class="a-text-bold">&nbsp;</span>翔泳社</p>
<p><a href="http://www9.plala.or.jp/sgwr-t/c/sec16.html">http://www9.plala.or.jp/sgwr-t/c/sec16.html</a></p>
<p>&nbsp;</p>