効率のよいプログラムの書き方

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

効率のよいプログラムの書き方

#1

投稿記事 by sign » 17年前

ファイルから2つの値の組を読み込む。
その2つの値の組について処理を行う。
ファイルには2つの値の組が何組か書かれている。
読み込んだ2つの値が共に負であったときにプログラムを終了する。

という流れのプログラムを書くとき、
読み込む方法(ループの使い方)と、2つの値が負であるかを判定する方法
の効率のよい書き方が自分では判断できません。


例えば、テキストファイルに次のように書かれているとします。
==================================================
10,10
20,-20
-30,-30
40,40
==================================================

プログラム内でファイルから値を読み込み、処理をするプログラムをこのように書いています。
#include <stdio.h>
int main(void){
	FILE *fp;
	int x, y;
	fp = fopen("text.txt", "r");
	while( fscanf(fp, "%d,%d", &x, &y) != EOF ){
		if(x<0 && y<0) break;
		/* 処理 */
	}
	fclose(fp);
	return 0;
}
質問のために簡素化させていますが、
「xとyが共に負」という条件以外の問題(値が読み取れないなど)があった場合にループを外れるには、
while文の制御式のところを「!= EOF」ではなく「== 2」と書いた方がよいのでしょうか?

「xとyが共に負」を判断するためには、if(x<0 && y<0)よりも、
if(x<0) if(y<0) と書いた方がよいのでしょうか?
(xが負じゃなかったらyについては判断しないような書き方)
xとyが対象的でなくなるので少し気になるのですが、普通はこのように判断回数を少なくするように書くのでしょうか。

また、fscanfの時点で読み込んだ値を評価することはできるのでしょうか?
while( (fp から "%d,%d" を読み込んで、その両方が負ではなければループに入る) )
というような書き方はできるのでしょうか?


拙い文章ですみません。

管理人

Re:効率のよいプログラムの書き方

#2

投稿記事 by 管理人 » 17年前

while条件内で全て判定してしまいたいのでしたらこのようにかけるのではないでしょうか?
#include <stdio.h>
int main(void){
	FILE *fp;
	int x, y;
	fp = fopen("text.txt", "r");
	while( fscanf(fp, "%d,%d", &x, &y) == 2 && x>=0 && y>=0 );
	fclose(fp);
	return 0;
}
ここまで小さな処理でしたらどこでどう書いてもほとんど処理スピードは同じだと思いますから、

こんな場合でしたら「よりみやすい書き方」を重視した方がいいように思います。

確かにプログラムはスマートに書くようにしていくものですけど、

コマコマ小さくして後でみにくくてもいけませんしね。

スマートに書く方法というのも知ってて損は無いはずですから色んな書き方をしてみると良いと思います。

sign

Re:効率のよいプログラムの書き方

#3

投稿記事 by sign » 17年前

> こんな場合でしたら「よりみやすい書き方」を重視した方がいいように思います。

実際には、この程度の判断(if文の処理)回数は気にしなくてよいのですね。
仰られるとおり、処理を優先させてしまうとソースの可読性が悪くなってしまいがちです。


> while( fscanf(fp, "%d,%d", &x, &y) == 2 && x>=0 && y>=0 )

同じ文内でも、読み込む処理以降であれば参照しても問題ないのですね。
プログラミングは初歩なのでこんな程度の理解で恐れ入ります…。


参考になりました。ありがとうございます。

管理人

Re:効率のよいプログラムの書き方

#4

投稿記事 by 管理人 » 17年前

おはようございます^^

よくswap関数を作る時なんかは1行に3つ処理を書いたりしますね。
void swap(int a, int b){
int t;
t=a , a=b , b=t;
return;
}
こんな感じでコンマで区切れば左から順に処理を行ってくれます。
t=a , a=b , b=t;
と
t=a ; a=b ; b=t;
がどう違うのかはよく知りません^^;

sign

Re:効率のよいプログラムの書き方

#5

投稿記事 by sign » 17年前

おはようございます。。
変数宣言みたいですね。

t=a , a=b , b=t;

t=a ; a=b ; b=t;


これだけだと同じように使うことができるのですかね。

int x, y, z;
とは書けますが、

int x; y; z;
とは書けませんよね。


レスありがとうございます。

mas

Re:効率のよいプログラムの書き方

#6

投稿記事 by mas » 17年前

> t=a , a=b , b=t;
> と
> t=a ; a=b ; b=t;
>
> がどう違うのかはよく知りません^^;

厳密なことはわかりませんが、
式の評価という観点で見ると違うのだと思います。

t=a , a=b , b=t;
は全体で一つの値を持ちます。
c = (t=a , a=b , b=t);
なので、上のような書き方もできます。
コンマ演算子は左→右の順に処理していって右側の値を全体の評価値とします。
最終的にはcにはb=t, つまりbの値がcに代入されると思います。
(ちなみにコンマ演算子は代入の'='よりも優先順位が低いです)

より単純に比較するなら、
int c = (0, 1, 2);
int d = 0; 1; 2;
printf("%d %d\n", c, d);
これを実行すると違いがわかりやすいかもしれません。

C言語の用語の使い方が間違っていたらすみません。

閉鎖

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