プログラミングについて

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

プログラミングについて

#1

投稿記事 by アーバレスト » 5年前

コード:

#include <stdio.h>
#define LENGTH 7

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

}

/* 要素数がnのintの配列vにintの値aが含まれる場合はその位置(複数含まれる場合は任意の1つ)を返し,含まれない場合は-1を返す */
int contains(const int v[], int n, int a)
{

}

/* 要素数がnのintの配列vに含まれるintの値aの個数を返す */
int number(const int v[], int n, int a)
{

}

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

 for (i = 0; i < LENGTH; i++) {
 printf("x[%d] : ", i);
 scanf("%d", &x[i]);
 }
 printf("sum(x, %d) = %d\n", LENGTH, sum(x, LENGTH));
 printf("contains(x, %d, 3) = %d\n", LENGTH, contains(x, LENGTH, 3));
 printf("number(x, %d, 3) = %d\n", LENGTH, number(x, LENGTH, 3));
 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
sum(x, 7) = 28
contains(x, 7, 3) = 2
number(x, 7, 3) = 1

上記のプログラムをその下の結果になるように書き換えたいのですが何度やってもうまくいきません。ヒントややり方など教えていただければ幸いです。
下のものは僕の回答です。ご教授よろしくお願いいたします。

コード:

#include <stdio.h> 
#define LENGTH 7

/* 要素数がnのintの配列vに含まれるintの和(nが1未満の場合は0)を返す */
int sum(const int v[], int n)
{
int i;
int sum=0;
for(int i=0;i<=n;i++);
return sum;
}

/* 要素数がnのintの配列vにintの値aが含まれる場合はその位置(複数含まれる場合は任意の1つ)を返し,含まれない場合は-1を返す */
int contains(const int v[], int n, int a)
{
int i;
for(i=-1;i<n && a!=v[i+1];i++);
return i+1;
}

/* 要素数がnのintの配列vに含まれるintの値aの個数を返す */
int number(const int v[], int n, int a)
{
int n=0;
for(int i=0;i<n ;n+=(v[i++]==a));
return n;

}

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

for (i = 0; i < LENGTH; i++) {
printf("x[%d] : ", i);
scanf("%d", &x[i]);
}
printf("sum(x, %d) = %d\n", LENGTH, sum(x, LENGTH));
printf("contains(x, %d, 3) = %d\n", LENGTH, contains(x, LENGTH, 3));
printf("number(x, %d, 3) = %d\n", LENGTH, number(x, LENGTH, 3));
return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: プログラミングについて

#2

投稿記事 by みけCAT » 5年前

number:要素数のnと個数カウントに使うnの名前が被っているので、個数を表す変数の名前を変える
contains:
 ・範囲外へのアクセスを避けるため、無駄にオフセットをつけるのをやめる
  ・iの初期値を-1ではなく0にする
  ・v[i+1]ではなくv[i]と比較する
  ・見つかった場合、i+1ではなくiを返す
 ・「見つからなかった(i<nがループ後に偽になっていた)ら-1を返す」処理を追加する
sum:(変数名を修正した)numberと同様に(iの範囲にも注意)、比較結果の代わりに配列の値そのものを足す

ようにすれば、うまくいくと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アーバレスト

Re: プログラミングについて

#3

投稿記事 by アーバレスト » 5年前

返信ありがとうございます。
やってみます。

アーバレスト

Re: プログラミングについて

#4

投稿記事 by アーバレスト » 5年前

みけCAT さんが書きました:
5年前
number:要素数のnと個数カウントに使うnの名前が被っているので、個数を表す変数の名前を変える
contains:
 ・範囲外へのアクセスを避けるため、無駄にオフセットをつけるのをやめる
  ・iの初期値を-1ではなく0にする
  ・v[i+1]ではなくvと比較する
  ・見つかった場合、i+1ではなくiを返す
 ・「見つからなかった(i<nがループ後に偽になっていた)ら-1を返す」処理を追加する
sum:(変数名を修正した)numberと同様に(iの範囲にも注意)、比較結果の代わりに配列の値そのものを足す

ようにすれば、うまくいくと思います。


返信ありがとうございます。
やってみます。

返信

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