5教科の合計を求めるプログラム(関数、ポインタを用いて)

kerotan0820
記事: 91
登録日時: 14年前

5教科の合計を求めるプログラム(関数、ポインタを用いて)

投稿記事 by kerotan0820 » 14年前

つい先日、チャットで皆様からのご教示を頂いたりしたおかげで、ついに関数、ポインタの単元の基礎が終了しました。
復習を含め、5教科の合計を求めるプログラムを作成してみました。

拘ったのは無駄をなくすことです。
皆様の高度な技術を用いたらもっともっと短く綺麗に仕上がるのでしょうけど、私の技術ではコレが限界です…。
なるべく配列とfor文を使って、省略したのが一番拘った点です。

CODE:

#include
void goukei(int *);
int tensu[5];
char kyouka[5][20]={"国語","数学","英語","理科","社会"};
main()
{
	int a=0,i=0;
	
	for(i=0;i<=4;i++)
	{
		printf("%s",kyouka[i]);scanf("%d",&tensu[i]);
	}

	goukei(&a);
	printf("合計点=%d",a);

	return 0;
}

void goukei(int *x)          //合計値を求める関数
{
	int a,b=0;
	for(a=0;a<=4;a++)
	{
		b=b+tensu[a];
	}
	*x=b;
}

この次の単元はファイルへの書き込みと読み取りです。
頑張っていきたいとおもいます
最後に編集したユーザー kerotan0820 on 2010年12月25日(土) 22:21 [ 編集 3 回目 ]

xxx
記事: 26
登録日時: 14年前

Re: 5教科の合計を求めるプログラム(関数、ポインタを用いて)

投稿記事 by xxx » 14年前

ポインタお疲れ様です
ポインタは大量のデータを関数に渡すときなどに活躍しますよ
速さがえらく違いますからね
ちなみに添字より*でアクセスしたほうが少しだけ速いです

グローバル変数をなくすと・・・

CODE:

#include

void goukei(int*, int*);

main()
{
  int a=0,i=0;
  int tensu[5];
  char kyouka[5][20]={"国語","数学","英語","理科","社会"};
    
  for(i=0;i<=4;i++){
    printf("%s",kyouka[i]);scanf("%d",&tensu[i]);
  }
 
  goukei(&a,&tensu[0]);
  printf("合計点=%d\n",a);
 
  return 0;
}
 
void goukei(int* x, int* tensu)          //合計値を求める関数
{
  int a,b=0;
  for(a=0;a<=4;a++){
    b = b + tensu[a];
  }
  *x=b;
}
グローバル変数をなくせば他のソースにそのまま使えるということが増えてきますよ

あとint* a;みたいに*をintにくっつけて宣言しちゃうのは私だけ?

kerotan0820
記事: 91
登録日時: 14年前

Re: 5教科の合計を求めるプログラム(関数、ポインタを用いて)

投稿記事 by kerotan0820 » 14年前

>>roxion1377 さん
main関数内で入力した点数をどう関数と受け渡しすればよいか考えた末面倒になってグローバル変数で宣言したのをまんまと指摘されてしまいました(笑)
おかげさまで方法が分かりました^^  添字より*のほうが早いのですね… なるほど。
勉強になりました  わざわざお忙しい中コメント有難う御座いました^^

□追記
int* a; の件ですが、私の教本もこのような記述がなされてます…
私はaにくっつけちゃうタイプの人ですがw
最後に編集したユーザー kerotan0820 on 2010年12月25日(土) 23:49 [ 編集 1 回目 ]

ISLe
記事: 2650
登録日時: 14年前

Re: 5教科の合計を求めるプログラム(関数、ポインタを用いて)

投稿記事 by ISLe » 14年前

char kyouka[5][20]={"国語","数学","英語","理科","社会"};
は文字列データのコピーが発生するので
const char * const kyouka[]={"国語","数学","英語","理科","社会"};
を外部宣言するほうが良いと思います。
#メモリの消費量も違います。

添字で回すなら[]と*の差は最適化で無くなりますので見やすい[]を使ったほうが良いと思います。

アバター
sizuma
記事: 8
登録日時: 14年前

Re: 5教科の合計を求めるプログラム(関数、ポインタを用いて)

投稿記事 by sizuma » 14年前

http://www1.cts.ne.jp/~clab/hsample/Point/Point05.html
確かに色んなサイト、本でポインタを使った方が早くなるって書いてますけど、実際にコンパイルして計測したわけじゃないから、真偽のほどは分からないですよ。
実際コンパイラの最適化で同じコードを吐いてるっていう情報もあります。

ちなみに、
//添え字
hoge;
//ポインタ
*(hoge + i)
は同じらしいです。

配列つかってアクセスできるのに、わざわざポインタを使う必要があるのか?
って意見に僕は賛成です。
いまどきポインタを操作する言語自体少ないですし。

(追記)
ISLeさんとかぶりましたね^^;
実行速度とか最適化の話は、文法勉強中の方には難しい話だと思います。
あんまり気にしないでください。

*をどっちにくっつけて宣言するかは、別にどちらでもいいと思いますよ。
どちらにしても読み難い場面は出てきますし。
型に寄せておくと、2つ同時に宣言したい場合に混乱しますね。

ちょっとしたことですが
for(i=0;i<=4;i++)
こういうときは、
for(i=0;i<5;i++)
ってすれば、4っていう初めてでてくる数字がなくなるんでいいですよ。
配列にアクセスするときは宣言で使った添字をそのままもってくるのが定石だと思います。

まだやってないかも知れませんが、
b = b + tensu[a];
こういう記述は
b += tensu[a];
とします。
最後に編集したユーザー sizuma on 2010年12月26日(日) 01:58 [ 編集 1 回目 ]

ISLe
記事: 2650
登録日時: 14年前

RE: 5教科の合計を求めるプログラム(関数、ポインタを用いて)

投稿記事 by ISLe » 14年前

CODE:

void goukei(int *x)          //合計値を求める関数
{
    int sum=0;
    int *endp = &tensu[5];
    int *p = &tensu[0];
    while (p < endp) {
        sum += *(p++);
    }
    *x=sum;
}
こんなふうにポインタ(アドレス)を比較すると添字を使うより高速になります。
#コンパイラによっては同程度まで最適化するものがあるかもしれません。

C言語何でも質問掲示板で以前あったスレッドですが、
[画像処理]レイヤー合成の高速化について
こんな感じにゴリゴリに高速化したいときは役に立ちますが、できるだけ読みやすさを優先したほうが良いと思います。
最後に編集したユーザー ISLe on 2010年12月26日(日) 01:59 [ 編集 1 回目 ]