编程语言基础 C语言 函数调用 递归算法

〔1〕以下の用語又はプログラムの一部について説明しなさい。

  1. プロトタイプ宣言
  2. #include<stdio.h>
  3. アドレス渡しと値渡し

〔2〕次のプログラムは main()関数と maxvec()関数からなる。このうち、maxvec()関数は、配列変数 array(倍精度実数型で最大サイズは 16)とその大きさ n(整数型)を main()関数から受け取り、配列変数 array の成分のうちの最大値を求めて、その演算結果を main()関数に返す。main()関数は、配列変数の大きさ n と配列変数 array の成分をキーボードから入力し、それを maxvec()関数に渡す。そして、演算結果を画面に表示する。以下のプログラムの空欄を埋めなさい。

#include<stdio.h>
double maxvec(double array[], int n);
  ______(1)______
  int i, n;
  double array[16];
  scanf("%d", &n);
  for(i=0; i<n; i++) scanf("%lf", &array[i]);
  printf("Max = %f\n",______(2)______);
}
 
double maxvec(double array[], int n){
  int i;
  double max;
  max = array[0];
  for(______(3)______){
    if(______(4)______) max = array[i];
  }
    ______(5)______
}
 

〔3〕整数 n(n>1)を main()関数から受け取り、1 から n までの総和を計算する関数 sum を作成しなさい。ただし、関数 sum は再帰的プログラミングによって実現しなさい。sum を用いる main()関数の例を以下に示す。

#include<stdio.h>
int sum(int n);
main(){
  int i, n;
  scanf("%d", &n);
  printf("Sum = %d\n",sum(n));
}

解答:

〔1〕
コンパイル時の型検査のために関数の仕様を事前に定義する。

標準入出力機能を提供するライブラリの取り込みを指示する。

関数の引数評価における変数情報の渡し方の違いである。

〔2〕
関数宣言と変数定義の構造より、主関数の開始部分である。

関数 への入力配列 と要素数 の引き渡しを行う。

最大値の初期値を としているため、探索範囲は となる。

現在保持する最大値よりも着目要素が大きい場合に更新処理を実行する。

最終的に得られた最大値を関数の呼び出し元へ返却する。

〔3〕
から までの総和を と定義すると、漸化式 および初期条件 が成立する。これを再帰関数として記述する。


这道题目主要考察程序设计语言的基础概念与逻辑实现能力涉及函数原型声明的作用以及宏指令的意义和参数在内存间传递的两种核心机制的区别也就是值传递和引用传递的不同特性。在数组极值求解的填空环节中需要根据程序的上下文准确推断主函数的入口以及参数如何被传递到子函数中利用局部变量设定极值初始状态后通过正确的循环条件和分支判断逻辑遍历数组并在函数末尾通过返回语句输出最终结果。在手写递归函数时关键在于将数列求和问题抽象为后项与前项关系的递推公式并设置明确的递归终止基准条件从而保证程序在有限次堆栈调用后能够正确返回累加和的值。