C テストの問題
質問3:请编写函数void fun(int x,int pp[],int *n),它的功能是:求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。
ChatGPT は次のように答えます。
以下の知識点が主に調査されました。
- ループ ステートメント:
for
整数 1 ~ をループするために使用しますx
。 - 分岐文:
if
条件判定文を使用して現在の数値が偶数であるかどうかを判定し、スキップします。 - 配列:
x
割り切れるが偶数ではない整数を昇順に並べて格納するために使用されます。 - ポインタ:
pp
整数配列の長さを返すために使用されます。
これらの知識は C 言語の比較的基本的な内容であり、これらを十分に習得することは、高品質な C 言語プログラムを作成するために非常に重要です。
プログラムの問題解決のアイデア:
このプログラムの問題解決の主なアイデアは次のとおりです。
- 最初に
for
を使用して、整数 1 からx
;までをループします。 - 各整数について、
if
条件判定ステートメントを使用して現在の数値が偶数かどうかを判定し、偶数の場合はスキップします。 - 現在の数値が割り切れ
x
ず偶数でない場合は、それをpp
配列に格納します。 - 最後に、
pp
整数配列の長さが返されます。
解決策 1:
#include <stdio.h>
void fun(int x, int pp[], int *n) {
int cnt = 0;
for (int i = 1; i <= x; i++) {
if (i % 2 == 0) continue;
if (x % i == 0) {
pp[cnt++] = i;
}
}
*n = cnt;
}
int main() {
int x = 24;
int pp[100];
int n;
fun(x, pp, &n);
printf("The divisors of %d that are odd are:\n", x);
for (int i = 0; i < n; i++) {
printf("%d ", pp[i]);
}
printf("\n");
return 0;
}
このうち、fun
関数のパラメータは次のように説明されます。
x
: 解くべき数値。pp
x
: 割り切れる偶数ではない整数を降順に並べて格納するために使用されます。n
:pp
整数配列の長さ。
関数の実装アイデアはfun
次のとおりです。
- カウンタを
cnt
0 に初期化します。 - 1 から までトラバースし
x
、現在の数値が偶数かどうかを判断し、偶数であればスキップします。 - 現在の数値が の
x
因数であるかどうかを判断し、そうであればそれをpp
配列に格納し、cnt
カウンターに 1 を追加します。 - 走査後、
cnt
カウンタの値がポインタ変数に割り当てられn
、pp
配列の長さを示します。
上のコードに示すように、関数内でmain
関数を呼び出してfun
結果を出力できます。
はい、この機能を実現するには他にも C 言語コードを記述する方法がありますが、参考までに 2 つの異なる実装方法を以下に示します。
解決策 2:
#include <stdio.h>
int fun(int x, int pp[])
{
int i, j = 0;
for (i = 1; i <= x; i++) {
if (i % 2 == 0) {
continue;
}
if (x % i == 0) {
pp[j++] = i;
}
}
return j;
}
int main()
{
int x = 12, pp[100], n, i;
n = fun(x, pp);
for (i = 0; i < n; i++) {
printf("%d ", pp[i]);
}
printf("\n");
return 0;
}
解決策 3:
#include <stdio.h>
int fun(int x, int pp[])
{
int i, j;
j = 0;
for (i = 1; i <= x; i++) {
if (i % 2 == 0) {
continue;
}
if (x % i == 0) {
*(pp + j) = i;
j++;
}
}
return j;
}
int main()
{
int x = 12, pp[100], n, i;
n = fun(x, pp);
for (i = 0; i < n; i++) {
printf("%d ", *(pp + i));
}
printf("\n");
return 0;
}
これら 2 つの実装の主な違いは、配列要素のアクセス メソッドが異なり、最初のメソッドが使用されpp[i]
、2 番目のメソッドが使用されることです*(pp + i)
。ただし、実装の考え方は同じで、すべて 1 をループしてx
各数値が偶数かどうかを判断し、偶数で割り切れない場合は配列にx
格納し、配列の長さを返します。pp