網絡学習管理 速習C言語入門3 C exercises(9) Basics of Function

C exercises(9) Basics of Function

関数の基本

C言語において関数を使うことには、以下のような利点があります。

関数化しておくとそれを1つのブラックボックスとして扱うことができます。 つまり、使用する側が知っておくべきことは、以下の通りです。

  • 入力として、どのような引数を与えるか
  • 出力として、関数がどんな値を返すのか
  • 関数を使ったことによって、どんな副作用があるか
  • 一度、関数として作成しておけば、後で何度でも再利用することができる
  • 関数として各機能をまとめていくと、一般にプログラムが見やすく、デバッグの作業もしやすい

関数の呼び出し

#include <stdio.h>

void func();   //関数のプロトタイプ宣言

int main()
{
 func();    //関数呼び出し
 printf(" ここがメイン関数内\n");
 return 0;
}

void func()    //自作関数
{
 printf("ここは自作関数内\n");
 return;    //「return;」は省略可
}

 

関数定義

関数の定義

戻り値の型 関数名(パラメータリスト) {
  文
  ...
}

関数プロトタイプ宣言

戻り値型 関数名(パラメータリスト);

戻り値の型、関数名、引数のルールは関数を作る際とほとんど同じです。但し、プロトタイプ宣言する行の最後には「;」が必要。

Void Type関数

void型は、今までの数値型や文字型とは異なり、戻り値が無い関数のデータ型のことです。処理の結果を戻す必要が無い場合は、わざわざint型にして「return 0;」としなくても、void型で関数を定義すれば、最後にreturn文を書く必要はありません。

 

  1. 値を返さない return型に用いる
  2. 引数が無い場合に用いる

関数へ値を渡す

C言語では、関数へ情報を渡す場合、必ず元の変数の値のコピーを渡します。
この様な方法を値渡しと呼び、元の変数の値が変更されないことが特徴です。

「値渡し」, ex : printf()

#include <stdio.h>
 
void plus1(int x)
{
    x = x + 1;
}
 
int main(int argc, const char * argv[])
{
     
    // insert code here...
    int a;
     
    a = 1;
    plus1(a);
     
    printf("a = %d\n", a);
     
    return 0;
}

 

アドレス

「参照渡し」, ex : scanf()

ポインタ型の引数であっても、値のコピーが渡される原則に違いはありません。

それでもポインタ型を使うのは、ポインタ型はアドレスを受け取ることが出来るからです。

#include <stdio.h>
 
void plus1(int *x)
{
    *x = *x + 1;
}
 
int main(int argc, const char * argv[])
{
     
    // insert code here...
    int a;
     
    a = 1;
    plus1(&a);
     
    printf("a = %d\n", a);
     
    return 0;
}

配列

関数に配列を丸ごと渡すことができません。あたかも配列を丸ごと渡すように書くことができます。

#include <stdio.h>

void func(int [10]);

int main(void){
  
  int figure[10]={1,2,3,4,5,6,7,8,9,10};

  func(figure);

  return 0;

}

void func(int temp[10]){

  for(int i=0;i<10;++i){
    printf("%d\n",temp[i]);
  }
}

void func2(int temp[]){

  for(int i=0;i<10;++i){
    printf("%d\n",temp[i]);
  }
}

void func3(int *temp){

  for(int i=0;i<10;++i){
    printf("%d\n",*(temp+i));
  }
}

func, func2, func3は全く同じ機能する。

配列を丸ごと渡すように書くだが、実質参照渡しなので、下記のおかしな現象が発生する。

  1. 配列の要素数は無視される
  2. 関数内で配列の値を変えると呼び出し側まで変化する

演習

ABクラス

a-8-1-2 (p266)

曜日を求まる関数を作成してください。

CDクラス

a-8-3-2-1 (p276)

平均値を求まる関数を作成してください。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


Related Post

C exercises(6) Pointers and VariablesC exercises(6) Pointers and Variables

ポインタの仕組み:ポインタで変数を指す ポインタとは ポインタ (pointer)とは、あるオブジェクトがなんらかの論理的位置情報でアクセスできるとき、それを参照するものである。有名な例としてはC/C++でのメモリアドレスを表すポインタが挙げられる。(ja.wikipedia.org) ポインタ=メモリアドレス 間接演算子 * と アドレス演算子 & ポインタの使用手順 宣言 アドレスの設定 使用 ポインタで変数 間接演算子を使って、ポインタが指すメモリの値を取得することを間接参照するといいます。 間接演算子を用いれば、アドレスを間接参照するだけではなく、ポインタが表すアドレスに値を間接代入することもできます。 #include <stdio.h> int main() { […]

C exercises (1) guidanceC exercises (1) guidance

C言語プログラミングⅡの試験解説 #2015年度解答付後期C言語2プロ試験問題 C言語検定試験について 主催・認定 サーティファイ情報処理能力認定委員会 試験名 C言語プログラミング能力認定試験 (C-Language Programming Skills Qualification Test) 試験目的 C言語を駆使して応用プログラム(言語処理系、ユーティリティなど)を作成する能力を認定します。 認定基準 一級 C言語を駆使し、応用プログラム(言語処理系、ユーティリティなど)が作成できる能力を有する。 また使用しているOSについて理解をしている。 二級 小規模のプログラム(500行程度)が適切に(理路整然、簡潔、正しく、速く)書ける。 […]

C exercises(a) Return ValuesC exercises(a) Return Values

ある関数が別の関数を呼び出して、呼び出した関数に制御が戻って来た時に、関数によっては値が返ってくるものがあります。 関数から値を返すには、関数の戻り値の他に、ポインタを使って、関数から呼び出し側の領域を書き換えるも可能です。 値を関数戻り値で返す 関数の定義 戻り値の型 関数名(パラメータリスト) { 文 ... } 関数の戻り値で返す。 この方法では、常に1つの情報しか返すことが出来ません。 2つ以上の情報を返したい時などは不便です。 値を引数の配列に返す 配列の先頭要素のアドレスを引数にして、上位関数側と下位関数側で配列を共有し、見かけ上、複数のデータを返したようにします。 #include <stdio.h> void waru2(int *p); […]