プログラミング言語の課題の質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Y.T

プログラミング言語の課題の質問

#1

投稿記事 by Y.T » 5年前

こんにちは、学校のプログラミングの課題で提出期限が迫っていて色々と考えたのですがどうしても答えが出せれないので教えて頂けませんか?どこが分からないかも分かりません。よろしくお願い致します。

コード:

#include <stdio.h>

#define LENGTH 7

/* 要素数がnのintの配列vを表示する(nが1未満の場合は{},1の場合は{v[0]},2の場合は{v[0], v[1]},…と表示する) */
void print_a(const int v[], int n)
{

}

/* 要素数がnのintの配列vに含まれるintの積(nが1未満の場合は1)を返す */
int product(const int v[], int n)
{

}

/* 要素数がnのintの配列を全て0に初期化する */
void clear(int v[], int n)
{

}

int main(void)
{
    int i;
    int x[LENGTH];

    for (i = 0; i < LENGTH; i++) {
        printf("x[%d] : ", i);
        scanf("%d", &x[i]);
    }
    printf("x = ");
    print_a(x, LENGTH);
    printf("\n");
    printf("product(x, %d) = %d\n", LENGTH, product(x, LENGTH));
    printf("clear(x, %d)\n", LENGTH);
    clear(x, LENGTH);
    printf("x = ");
    print_a(x, LENGTH);
    printf("\n");
    return 0;
}
上記のプログラムを下の結果になるように答えを教えて頂けませんか?

$ ./a.out
x[0] : 1
x[1] : 2
x[2] : 3
x[3] : 4
x[4] : 5
x[5] : 6
x[6] : 7
x = {1, 2, 3, 4, 5, 6, 7}
product(x, 7) = 5040
clear(x, 7)
x = {0, 0, 0, 0, 0, 0, 0}

かずま

Re: プログラミング言語の課題の質問

#2

投稿記事 by かずま » 5年前

上のほうに「フォーラム(掲示板)ルールはこちら」とありますよね。
それに従った質問の仕方をしないと、回答を得るのは難しいと思います。

さて、clear の実現方法は次のようにいろいろあります。

コード:

void clear(int v[], int n)
{
	while (n) v[--n] = 0;                         // 1
	std::fill(v, v+n, 0);                         // 2
	memset(v, 0, n * sizeof *v);                  // 3
	n && (clear(v+1, n-1), *v = 0);               // 4
	for (int i = 0; i < n; i++) v[i] = 0;         // 5
	std::generate(v, v+n, [] { return 0; });      // 6
	std::for_each(v, v+n, [](int& x) { x = 0; }); // 7
}
1~7 のどれか一つを選んでください、ということです。
どれなら分かりますか?
出題者はどれを期待していると思いますか?
これらの質問に答えてもらうと、
print_a や product の実現方法も紹介するかもしれません。

Y.T

Re: プログラミング言語の課題の質問

#3

投稿記事 by Y.T » 5年前

返信ありがとうございます。

4だと思います。

Y.T

Re: プログラミング言語の課題の質問

#4

投稿記事 by Y.T » 5年前

返信ありがとうございます。

5だと思います。

かずま

Re: プログラミング言語の課題の質問

#5

投稿記事 by かずま » 5年前

何が 4 で、何が 5 か分かりませんが、答えて
もらったので、print_a の例を示します。

コード:

void print_a(const int v[], int n)
{
	printf("{");
	for (int i = 0; i < n; i++) printf(i ? ", %d" : "%d", v[i]);
	printf("}");
}
次の質問にすべて答えてもらうと、product の例を示すかもしれません。
1. 提出期限はいつですか?
2. フォーラムルールは読みましたか?
3. プログラミング言語は C ですか? それとも、C++ ですか?
4. clear の 7つの例のうち、どれとどれが理解できますか?
5. 出題者が期待する clear の解答は、どれだと思いますか?

Y.T

Re: プログラミング言語の課題の質問

#6

投稿記事 by Y.T » 5年前

返信ありがとうございます。
質問の回答を記入します。

1.期限は過ぎてしまいました。

2.読みました。

3.プログラミング言語はCです。

4. 5です。

5. 6だと思います。

かずま

Re: プログラミング言語の課題の質問

#7

投稿記事 by かずま » 5年前

最初からフォーラムルールに従って質問していたら、
提出期限に間に合っていたでしょう。

理解できるのは 5 だけですか?
1 も分かりそうなものですが。

std:: が付いている 2、6、7 は C++ なので、
C の解答としては不適切でしょう。

出題者が期待するものは、5 だと思われます。

4 は、再帰呼出しを使う方法で、ちょっと特殊なものです。

で、product は次の通り。

コード:

int product(const int v[], int n)
{
	int p = 1;
	for (int i = 0; i < n; i++) p *= v[i];
	return p;
}

コード:

変数 i の宣言は、for の中に書かず、別に書くこともできます。

	int i;
	for (i = 0; i < n; i++) p *= v[i];
}

コード:

p *= v[i]; の位置も、様々な書き方があります。

	for (i = 0; i < n; i++)
		p *= v[i];

	for (i = 0; i < n; i++) {
		p *= v[i];
	}

	for (i = 0; i < n; i++)
	{
		p *= v[i];
	}
product の実現方法もいろいろあります。

コード:

int product(const int v[], int n)
{
	int p = 1; while (n) p *= v[--n]; return p;       // while ループ

	return n ? *v * product(v+1, n-1) : 1;            // 再帰呼出し

	// C++ の <algorithm> の for_each を使う
	int p = 1; std::for_each(v, v+n, [&p](int x) { p *= x; }); return p;

	// C++ の <numeric> の accumulate を使う
	return std::accumulate(v, v+n, 1, [](int p, int x) { return p * x; });
}
結局、この問題は、配列の要素を for 文で処理することを
理解するためのものだったのでしょう。

コード:

    for (i = 0; i < 7; i++) scanf("%d", &v[i]);    // 入力

    for (i = 0; i < 7; i++) printf("%d\n", v[i]);  // 出力

    for (i = 0; i < 7; i++) v[i] = 0;              // ゼロクリア

    int p = 1;                                         // p は積(product)
    for (i = 0; i < 7; i++) p *= v[i];             // 全部の積

返信

“C言語何でも質問掲示板” へ戻る