第1週 関数を利用した応用プログラミング
INDEX

目標

  • ユーザ定義関数を定義して、それを利用したプログラムが作成できる。

予習・復習

 以下のスライドを利用して、予習と復習をしよう。復習では、自分の理解度を確認するために、実際にプログラムを作成し、意図する結果が得られるか確認しよう。
  1. 関数

本日の講義・演習予定

  1. 関数を自作する
  2. 戻り値のない関数
  3. 引数も戻り値もない関数
  4. 関数から関数を呼び出す
  5. 関数と配列
  6. 演習問題
  7. 提出課題
内 容
  1. 関数を自作する
  2. 戻り値のない関数
  3. 引数も戻り値もない関数
  4. 関数から関数を呼び出す
  5. 関数と配列

関数を自作する

サブルーチン

 スポーツのテレビ中継で”ルーティン”(routine)という言葉と耳にしたことがありませんか。フィギャアスケートでは技の順番を指すルーティンが、シンクロナイズドスイミングでは規定演技を指すテクニカル・ルーティンが、その他のスポーツでも、またトレーニングの中でも様々なルーティンが登場します。スポーツでのルーティンとは「決まった一連の動作」のことを指していますが、プログラミングでも「決められた一連の手続き」のことをルーチン(routine)と呼んでいます。特に、プログラム中に何度も登場するような一連の手続きを一つのモジュールとしてまとめ、必要に応じて呼び出すことができるようにしたものを「サブルーチン(subroutine)」と呼びます。サブルーチンをプログラムの本体であるメインルーチン(mainroutine)から呼び出すことで、無駄が少なく効率の良いプログラミングを実現することができます。
サブルーチン
 C言語ではサブルーチンを発展させた関数(function)が提供されています。関数の特徴は、メインルーチンから処理対象となる値を受け取りその処理結果を返すという仕組みが備わっている点です。

関数

 ここまでの学習の中でいくつかの関数を利用してきました。画面に表示するためにはprintf関数を、キーボードからの入力を受け付けるためにはscanf関数を、乱数を発生させるためにrand関数を利用しました。これらは高い頻度で利用されることからC言語に標準で備えられている関数です。また、関数自体もC言語で書かれており、printfやscanfなどは入出力に関する関数を集めた標準入出力ライブラリstdio.hで、乱数などの関数は標準ライブラリstdlib.hで、また、sinやcosといった数学関係の関数ならば数学ライブラリmath.hで定義されています。私たちはこれらの関数を呼び出すだけで、プログラムを一から書くことなくプログラムを容易に書くことができるのです。
 それでは関数の仕組みとその使いかたを見ていきましょう。関数は、下図のように値を受け取り(入力)、それを処理して、その処理結果を返す(出力)ものとして定義されます。関数が受け取る値を引数(argument)、返す値を戻り値(return value)または返り値と呼びます。
Function

ユーザ定義関数

 関数は標準ライブラリ関数を呼び出して利用するだけではなく、ユーザ自身によって定義することもできます。これをユーザ定義関数(user-defined function)と言います。例として整数の和を求める関数adderを自作してみましょう。
userFunc.c
#include <stdio.h>

int adder(int a, int b);	//プロトタイプ宣言

/* メイン関数 */
int main(void)
{
	int x, y, f;
	
	printf("整数xとyの和を求めます。(x,y)>> ");
	scanf("%d,%d", &x, &y);
	
	f = adder(x,y);		// 関数の呼び出し、結果がfに代入される
	printf("%d\n", f);
	
	return 0;
}

/* ユーザ定義関数 整数の和を求める */
int adder(int a, int b)		//戻り値の型 関数名(引数)
{
	int ans;
	
	ans = a + b;
	return ans;		//結果を返す:戻り値
}
 関数を定義するためには次のように、処理内容以外に戻り値の型、関数名、引数リスト、戻り値が必要になります。
 ・関数名には変数名と同様に英字、数字あるいは_(アンダースコア)が利用できます。ただし、先頭に数字は使えません。
 ・戻り値は関数の呼び出し側に返す値のことで、return文によって指定されます。関数名の前に書かれた型は、この戻り値と同じ型でなければなりません。上記の例では、戻り値ansの型intになります。
 ・引数は呼び出し側ルーチンから関数に渡したい変数のことです。複数の変数を渡すことができるのでまとめて引数リストと言います。例ではint型の変数のaとbになります。変数宣言のように型毎にまとめて記述することはできません。一つの引数に一つの型を書かなければなりません。また、関数側で定義する引数を仮引数(paramter)、呼び出し側で与えた引数を実引数(argument)と呼びます。aとbが仮引数で、xとyが実引数になります。

関数の形式
戻り値の型 関数名(引数リスト)
{
	処理の記述

	return 戻り値;
}
一つの引数に、一つの型を書く。

関数プロトタイプ宣言

 関数プロタイプとは、ユーザ定義関数の本体を除く、戻り値の型と関数名、引数リストからだけから定義を言います。関数プロトタイプ宣言をすることで、コンパイラに対してユーザ定義関数の戻り値の型、関数名、引数リストの情報を与えることができます。コンパイラはこの情報からプログラムの中での関数が正しく呼び出されているかをチェックすることができます。(ただし、main関数の前にユーザ定義関数を記述することで、プロトタイプ宣言は省略することもできます。)
 次のプログラム例は、同じ和を求める関数ですが実数に対応できるように、仮引数の型、戻り値の型をdouble型に変更しています。合わせて、実引数の型にも変更が及んでいることに注意しましょう。
prototypeFunc.c
#include <stdio.h>

double adderf(double a, double b);	//プロトタイプ宣言

/* メイン関数 */
int main(void)
{
	double x, y;
	
	printf("実数xとyの和を求めます。(x,y)>> ");
	scanf("%lf,%lf", &x, &y);
	
	printf("%f\n", adderf(x,y));
	
	return 0;
}

/* ユーザ定義関数 実数の和を求める*/
double adderf(double a, double b)
{
	return a + b;		//結果を戻す
}
関数を定義したら、あわせてプロトタイプ宣言(prototype declaration)をする。


演習

  1. 実数xのn乗値を求める関数powerを定義して、メイン関数から呼びして実数のべき乗を求めるプログラムです。空欄を埋めて完成させなさい。
  2. p8-1.c
    #include <stdio.h>
    
    [[空欄ア]]	//プロトタイプ宣言
    
    /* メイン関数 */
    int main(void)
    {
    	double x,f;
    	int n;
    	
    	printf("実数xのn乗を求めます。(x,n)>>");
    	scanf("%lf,%d", &x, &n);
    	
    	f = power([[空欄イ]]);		// 関数の呼び出し
    	printf("%fの%d乗は、%fです。\n",x,n,f);
    	
    	return 0;
    }
    
    /* ユーザ定義関数 aのb乗を求める */
    [[空欄ウ]] power(double a, int b)
    {
    	double ans = 1.0;
    	int i;
    	
    	for(i=1; i<=b; i++){
    		ans [[空欄エ]] a;
    	}
    	return [[空欄オ]];			//結果を返す
    }
    


戻り値のない関数

 関数の中には、値を渡したらその処理結果を画面に表示するだけで、戻り値を期待しないものもあります。このような場合はreturn文を記述する必要は無く、戻り値の型にはvoid型を指定します。
 具体例として、得点が60点以上なら「合格」、60点未満なら「不合格」と表示する関数judgeを見てみましょう。得点をキーボードから入力して合否を判定します。
例 noReturnFunc.c
#include <stdio.h>

void judge(int score);			//プロトタイプ宣言

/* メイン関数 */
int main(void)
{
	int n;
	
	printf("得点>> ");	scanf("%d", &n);

	judge(n);			//関数の呼び出し
	
	return 0;
}

/* ユーザ定義関数 */
void judge(int score)			//合否を判定する
{
	if(score>=60){
		printf("合格です。");
	}
	else{
		printf("不合格です。");
	}
}
戻り値のない関数の戻り値の型は、void型
※voidは、空、何もないという意味の英単語です。

関数にはコピーが渡される

 関数に引数で渡された変数は、変数そのものではなくコピーが渡されます。先のプログラムにおいて、関数judge内で得点(引数)に10点下駄を履かせて合否判定するように変更します。さらに、関数judgeを呼び出した後で、得点nの値を表示して、その値が変わっていないことを確認してみましょう。
例 noReturnFunc.c
#include <stdio.h>

void judge(int score);			//プロトタイプ宣言

/* メイン関数 */
int main(void)
{
	int n;
	
	printf("得点>> ");	scanf("%d", &n);

	judge(n);			//関数の呼び出し
	printf(" %d点\n", n);	// <--追加

	return 0;
}

/* ユーザ定義関数 */
void judge(int score)		//合否を判定する
{
	socore += 10;			//	 <--追加  下駄を履かせる
	if(score>=60){
		printf("合格です。");
	}
	else{
		printf("不合格です。");
	}
}


引数も戻り値もない関数

 単にメッセージを表示するだけの戻り値もなければ引数もない関数を定義することもできます。次のプログラムは、画面に「7月22日は何の日? 円周率の日」と表示するだけの関数の例です。
例 voidFunc.c
#include <stdio.h>

void message(void);		//プロトタイプ宣言

/* メイン関数 */
int main(void)
{
	message();		//関数の呼び出し
	
	return 0;
}

/* ユーザ定義関数 */
void message(void)
{
	printf("7月22日は何の日? 「円周率の日」???\n");
	
}
引数がない場合には代わりにvoidを記述しますが、呼び出し側には何も記述しません。
※ 22÷7はいくつ?

関数から関数を呼び出す

 関数から関数を呼び出すこともできます。次の例では、文字*を使って横幅nの線を描く関数drawLineを関数drawRectから段数分呼び出し、文字*を使って正方形を描いています。
例 c8-4.c
#include <stdio.h>

void drawLine(int n);		//プロトタイプ宣言
void drawRect(int n);

/* メイン関数 */
int main(void)
{
	int step;
	
	printf("段数> ");	scanf("%d", &step);
	drawRect(step);		//関数の呼び出し
	
	return 0;
}

/* 文字*で直線を描く関数 */
void drawLine(int n)
{
	int i;

	for(i=0; i<n; i++){
		putchar('*');
	}
}

/* 四角形を描く関数 */
void drawRect(int n)
{
	int i;
	
	for(i=0; i<n; i++){
		drawLine(n);
		putchar('\n');
	}
}

演習

  1. 次は、段数と文字を入力して、その文字を使って段数分の左下直角三角形を描くプログラムです。空欄を埋めて完成させなさい。
  2. p8-2.c
    #include <stdio.h>
    
    void drawLine([[空欄ア]]);		//プロトタイプ宣言
    void drawLowerLeftTriangle([[空欄イ]]);
    
    /* メイン関数 */
    int main(void)
    {
    	int step;
    	
    	printf("段数> ");	scanf("%d", &step);
    	drawLowerLeftTriangle(step);		//関数の呼び出し
    	
    	return 0;
    }
    
    /* 指定の文字で直線を描く関数 */
    void drawLine([[空欄ア]])
    {
    	int i;
    
    	for(i=0; i<n; i++){
    		[[空欄ウ]];
    	}
    }
    
    /* 指定の文字で左下直角三角形を描く関数 */
    void drawLowerLeftTriangle([[空欄イ]])
    {
    	int i;
    	
    	for(i=0; i<n; i++){
    		drawLine([[空欄エ]]);
    		putchar('\n');
    	}
    }
    


関数と配列

関数に配列を渡す

 次のサンプルプログラムは関数への1次元配列の受け渡しの例です。関数の仮引数には配列名の後に角カッコ[]を書き、要素数は省略します。一方、関数を呼び出すときの実引数には配列名だけを書きます。また、関数に変数を引き渡すときにはその変数のコピーが引き渡されますが、配列の場合にはその配列自身が引き渡されることに注意が必要です。
例 arrayFunc.c
#include <stdio.h>
#define N 10

void printArray(int n, int a[]);		//プロトタイプ宣言

/*	メイン関数 */
int main(void)
{
	int i, m[N] = {2, 8, 5, 3, 12, 6, 11, 17, 30, 26};

	printArray(N, m);
	
	return 0;
}

/*
* 配列の各要素を表示する関数
* @引数 n 要素数, a[] 配列
*/
void printArray(int n, int a[])
{
	int i;
	
	for(i=0; i<n; i++){
		printf("%2d: %d\n", i,a[i]);
	}	
	puts("");
}
関数に1次元配列を渡すときの仮引数には配列名[]、実引数には配列名だけを記述する。
関数は引き渡された配列のコピーではなく、その配列を直接参照する。

 関数putsは、文字列リテラルを引数としてその文字列を一行で表示する関数です。

関数から配列を受け取る、共有する

 配列を関数に引き渡しその処理結果を配列で受け取りたい場合があります。しかし、関数は配列を戻り値とすることができません。では、どうしたらよいでしょう。配列が関数に渡されると時にはそのコピーではなく、実引数で指定した配列そのものが渡されるのでした。ならば、その配列を受け渡し用の配列として、関数側ではその配列に処理結果を格納し、呼び出し側はその配列の値を参照すれば良いことになります。配列は、呼び出し側と関数側とで共有できるのです。
 下記は、1次元配列の各要素の値を2乗する関数sqrArrayを定義して、呼び出し側でその関数に渡した配列の各要素の値そのものが2乗されることを確認するプログラムです。
arrayFunc.c
#include <stdio.h>
#define N 10

void printArray(int n, int a[]);		//プロトタイプ宣言
void sqrArray(int n, int a[]);

/*	メイン関数 */
int main(void)
{
	int i, m[N] = {2, 8, 5, 3, 12, 6, 11, 17, 30, 26};

	printArray(N, m);		// 配列の表示
	sqrArray(N, m);		// 配列の2乗値を計算
	printArray(N, m);		// 配列の表示
	
	return 0;
}


/*
* 配列の2乗値を求める関数
* @引数 n: 要素数、a: 配列
*/
void sqrArray(int n, int a[])
{
	int i;
	for(i=0; i<n; i++){
		a[i] *= a[i];
	}
}

/*
* 配列の各要素を表示する関数
* @引数 n 要素数, a[] 配列
*/
void printArray(int n, int a[])
{
	int i;
	
	for(i=0; i<n; i++){
		printf("%2d: %d\n", i,a[i]);
	}	
	putchar('\n');
}

配列の書き換えを避けるconst修飾子

 関数が仮引数で受け取った配列は、呼び出し側で実引数として与えた配列そのものでした。これは受け取り側と呼び出し側で同じ配列を共有することができる反面、関数側の不用意な操作で値の書き換えが行われる可能性もありあます。関数側での書き換えを避けたければ、仮引数の配列名をconst修飾子付で宣言しておきます。そうすることで、もし、関数内でその値を書き換えるような記述があった場合には、コンパイルエラーの対象となります。
 以下は、先のプログラム例において、配列のすべての要素を表示をする関数printArray()の配列引数にconst修飾子を付与して宣言した例です。
constargs.c
#include <stdio.h>
#define N 10

void printArray(int n, int a[]);		//プロトタイプ宣言
void sqrArray(int n, int a[]);

/*	メイン関数 */
int main(void)
{
	int i, m[N] = {2, 8, 5, 3, 12, 6, 11, 17, 30, 26};

	printArray(N, m);		// 配列の表示
	sqrArray(N, m);		// 配列の2乗値を計算
	printArray(N, m);		// 配列の表示
	
	・・・
  中略
	・・・

void printArray(int n, const int a[])
{
	int i;
	
	for(i=0; i<n; i++){
		printf("%2d: %d\n", i,a[i]);
	}	
	putchar('\n');
}

2次元配列を引数とする関数

 関数が引数に2次元配列を指定したい場合、その1つ目の添字の角カッコ[]の中は省略して、2つ目の添字の角カッコ[]にはその要素数を記述します。以下は、関数に3つの2次元配列を渡して、はじめの2つの2次元配列aとbの和を3つ目の2次元配列cで受け取る例です。
array2DFunc.c
#include <stdio.h>
#define N 2

void addArray(int a[][N], int b[][N], int c[][N]);	//プロトタイプ宣言
void printArray(int a[][N]);

/*	メイン関数 */
int main(void)
{
	int ma[N][N] = {{1,1},{2,2}};
	int mb[N][N] = {{1,2},{3,4}};
	int mc[N][N]; 

	add2Array(ma,mb,mc);
	printf("-- ma --\n"); print2Array(ma);	
	printf("-- mb --\n"); print2Array(mb);	
	printf("-- ma+mb --\n"); print2Array(mc);	
	
	return 0;	
}

/*
* 2つの二次元配列aとbの加算結果を別の二次元配列cに格納する関数
* @引数 a[] 配列, b[] 配列, c[] 配列
*/
void add2Array(int a[][N], int b[][N], int c[][N])	//一つ目の添字は空に
{
	int i,j;

	for(i=0; i<N; i++){
		for(j=0; j<N; j++){
			c[i][j] = a[i][j] + b[i][j];
		}
	}
}

void print2Array(int a[][N])
{
	int i,j;

	for(i=0; i<N; i++){
		for(j=0; j<N; j++){
			printf("%3d",a[i][j]);	
		}
		puts("");
	}
}


演習

  1. 次は、10個の整数からなる配列の合計値を求めるプログラムです。空欄を埋めて完成させなさい。
  2. p8-3.c
    #include <stdio.h>
    #define N 10
     
    void printArray(int n, int a[]);		//プロトタイプ宣言
    [[空欄ア]] sumOfArray([[空欄イ]]);
     
    /* メイン関数 */
    int main(void)
    {
    	int i, m[N] = {2, 8, 5, 3, 12, 6, 11, 17, 30, 26};
     
    	printArray(N, m);	// 配列の表示
    	printf("配列の合計 %d\n",sumOfArray([[空欄ウ]]));
    	
    	return 0;
    }
     
    /*
     * 配列の合計値を求める関数
     * @引数 n: 要素数、a: 配列
     */
    [[空欄ア]] sumOfArray([[空欄エ]])
    {
    	int i, [[空欄オ]];
    	for(i=0; i<n; i++){
    		sum += a[i];
    	}
    	return sum;
    }
     
    /*
     * 配列の各要素を表示する関数
     * @引数 n 要素数, a[] 配列
     */
    void printArray(int n, int a[])
    {
    	int i;
    	
    	for(i=0; i<n; i++){
    		printf("%2d: %d\n", i,a[i]);
    	}	
    }
    


expand_lessBack to TOP

演習問題

  1. 次は、学籍番号と氏名、特技を表示する関数myProfileを定義し、この関数を呼び出すことでプロフィールを表示するプログラムex8-1.cです。空欄を埋めて完成させなさい。
  2. ex8-1.c
    #include <stdio.h>
    
    [[空欄ア]];
    
    int main(void)
    {
    	[[空欄イ]];	
    	return 0;
    }
    
    [[空欄ウ]] myProfile([[空欄エ]])
    {
    	printf("\tJX16888\t工学太郎\n");
    	printf("特技は、プログラミングです。\n");
    }
    

  3. 次は、2つの正の整数を表すdividendとdivisorを引数としてdividendをdivisorで割った余りを返す関数remaindを定義して、2つの正の整数を入力して関数remaindを呼び出すことで割った余りを表示するプログラムex8-2.cです。空欄を埋めて完成させなさい。
  4. ex8-2.c
    #include <stdio.h>
    
    [[空欄ア]]		//プロトタイプ宣言
    
    int main(void)
    {
    	int a,b,rem;
    
    	printf("被除数,除数>> ");
    	scanf("%d,%d",&a,&b);
    	
    	rem = [[空欄イ]];
    	printf("余り %d\n", rem);
    
    	return 0;
    }
    
    /** 余りを求める関数(被除数,除数) 、正の整数にのみ対応 */
    [[空欄ウ]] remaind(int dividend, int divisor)
    {
    	while([[空欄エ]]){
    		dividend -= divisor;
    	}
    
    	return dividend;
    }
    

  5. 次は、正の整数nを引数として1からnまでの合計値を戻り値とする関数sumOfを定義して、正の整数を入力して1からの合計値を求めるプログラムex8-3.cです。空欄を埋めて完成させなさい。
  6. ex8-3.c
    #include <stdio.h>
    
    [[空欄ア]]			//プロトタイプ宣言
    
    int main(void)
    {
    	int a;
    
    	printf("正の整数>> ");	
    	scanf("%d", &a);
    	
    	printf("1から%dまでの合計は、%dです。\n",a, [[空欄イ]]);
    
    	return 0;
    }
    
    /** 1からnまでの合計を求める関数 */
    [[空欄ウ]] sumOf(int n)
    {
    	int i,sum=0;
    
    	for(i=1; [[空欄エ]]; i++){
    		[[空欄オ]];
    	}
    	[[空欄カ]];
    }
    

  7. 正の整数sを入力して、1からnまでの合計値がこの整数s以上になるための整数nの最小値を求めるプログラムを作成しなさい。合計値の計算には前出の関数sumOf(int n)を利用するものとする。

  8. 0以上の整数nを引数とし階乗値n!を表示する関数factrialを定義し、整数を入力して関数factrialを呼び出すことで階乗値を表示するプログラムを作成しなさい。0!=1であることに注意すること。

  9. 三角形の段数と文字(半角)を入力して、その文字を使って右下直角三角形を描くプログラムを作成しなさい。ただし、整数型変数nと文字型変数cを引数として文字cを使って段数nの右下直角三角形を描く関数drawLowerRightTriangleを定義して利用すること。関数drawLowerRightTriangleは、先に定義した関数drawLineを利用して文字を表示すること。

演習問題解答

OPEN ANSWER
  1. 回答 ア. void myProfile(void) イ. myProfile() ウ. void エ. void

  2. 回答 ア. int remaind(int dividend, int divisor); イ. remaind(a,b) ウ. int エ. dividend >= divisor

  3. 回答 ア. int sumOf(int n); イ. sumOf(a) ウ. int エ. i<=n; オ. sum += i カ. return sum

  4. 回答例 ex1-4.c
  5. code/1/ex1-4.c

  6. 回答例 ex1-5.c
  7. code/1/ex1-5.c

  8. 回答例 ex1-7.c
  9. code/1/ex1-7.c

expand_lessBack to TOP

今週の確認テスト テスト(PDF)

OPEN ANSWER
1.
(1) ○
(2) × (論理値の戻り値の型はint型とする)
(3) ○
(4) ○
(5) ×
(6) ○

2.
ア. int  イ. a > b
ウ. int  エ. a < b
オ. void  カ.height  キ.width  ク.printf("\n")
ケ. (double)(a+b)/2
コ. char op

以下の各プログラムを作成しなさい。
  • 課題1
  • 3個の整数を入力して、その中で1番大きな値を求めるプログラム。ただし、3個の整数a,b,cを引数としてその中で1番大きな値を戻り値とする関数maxof(int a, int b, int c)を定義して利用すること。

  • 課題2
  • 正の整数nを入力して、その階乗値n!を求めるプログラム。ただし、正の整数nを引数として階乗値n!を戻り値とする関数fact(int n)を定義して利用すること。

  • 課題3
  • 2進数を入力して10進数に変換するプログラム。ただし、2進数nを引数として10進数を戻り値とする関数to_decimal(int n)を定義して利用すること。入力する2進数は正の整数として扱ってよいものとします。

  • 課題4(発展課題)
  • 正の整数nと整数rを入力して組み合わせ総数nCrを求めるプログラム。ただし、整数nと整数rを引数とし組み合わせ総数nCrを戻り値とする関数comb(int n, int r)を定義して利用すること。加えて、関数combでは課題2で作成した関数factと同じ関数を定義して、呼び出すことで組み合わせの数を求めること。

  • 課題5(発展課題)
  • 正の整数nとn個の整数を入力して、入力順と逆順に表示するプログラム。ただし、配列aとbを引数として配列aを逆順に並べ替えた配列bを生成する関数reverse(int a[], int b[], int n)を定義して利用すること。配列の表示はmain関数で行うこと。

本日の提出課題

 次式で示される初項1、公比x、項数nの等比数列の和$S_n$を求める関数を定義して、整数$x$と$n$を与えて結果を求めるプログラムkadai1.c を作成しなさい。 $$S_n = x^0 + x^1 + x^2 + ... + x^{n-1} $$ 但し、以下の要件を満たすこと。
[要件]
    1. 下記に示すソースコードの未完成部分を埋める形で実現すること。
    2. 整数$x$と$n$を引数とし、$S_n$の値を戻り値とする関数の名前はmyfuncとする。
    3. 式$S_n$に含まれる$x^n$項は、次項で示す関数を定義して関数myfuncから呼び出して利用すること。
    4. 整数$x$と$n$を引数とし、$x^n$の値を戻り値とする関数の名前はmypowerとする
    5. 下記ソースコードのmain関数で実施されるテストにおいて、その実行結果がすべてOKとなること。

[ソースコード]
#inlude <stdio.h>

//プロトタイプ宣言
/* ここを埋める */

// xのn乗を求める関数mypower
/* ここを埋める */		

// 初項1、公比x、項数nの等比数列の和の値を求める関数myfunc
/* ここを埋める */		

int main(void)
{
	int ans;

	ans = myfunc(1,10);
	printf("TEST1: myfunc(1,10) -> %d ... ",ans);
	if(ans == 10) printf("OK.\n"); else printf("BAD.\n");

	ans = myfunc(3,1);
	printf("TEST2: myfunc(3,1)  -> %d ... ",ans);
	if(ans == 1) printf("OK.\n"); else printf("BAD.\n");

	ans = myfunc(2,10);
	printf("TEST3: myfunc(2,10) -> %d ... ",ans);
	if(ans == 1023) printf("OK.\n"); else printf("BAD.\n");

	ans = myfunc(-3,3);
	printf("TEST4: myfunc(-3,3) -> %d ... ",ans);
	if(ans == 7) printf("OK.\n"); else printf("BAD.\n");

	ans = myfunc(3,10);
	printf("TEST5: myfunc(3,10) -> %d ... ",ans);
	if(ans == 29524) printf("OK.\n"); else printf("BAD.\n");

	return 0;
}


  • [提出方法]
    1. ideone.comを利用して作成した課題プログラムのURLをCoursePowerへ提出のこと。
    2. 提出するideone.comの課題プログラムには、実行結果が表示されていること。
    3. プログラムの正当性についてどのようにして検証したか簡単に記すこと。
    4. 詳細はスライド「ideoneの使い方」参照のこと。

  • [評価について]
  • プログラムの内容の評価とは別に以下の要件を満たすことを評価の前提とする。
    1. C言語で記述されていること。
    2. ソースコードファイルのコンパイル結果に、ワーニングやエラーが出力されていないこと。
    3. 所定の実行結果が得られるていること。
    4. ソースコードは、インデントや適当な改行が施された見やすい状態であること。

  • [提出期限]
  • 2023年 6月19日(月)までとする。ただし、以降の提出も受け付ける。