繰り返し処理の書き方について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
OverKuro
記事: 4
登録日時: 1週間前

繰り返し処理の書き方について

#1

投稿記事 by OverKuro » 1週間前

この掲示板で初めて質問させていただきます。
もう少しきれいな書き方があれば教えていただけないでしょうか

 やりたいこと:Startに設定した値から、Endに設定した値までStepの値ずつ繰り返し値を表示したい。

 条件:
 ・StartとEndはかならず表示したい。
  ->Start = 5, End = 0, Step = 2の場合 : 5, 3, 1 ではなく 5, 3, 1, 0と表示したい
 ・実際にはdouble型の値を使うので、for文を使いたくない。
 
現在やりたいことは実質達成できているのですが、個人的に無理やり感があるため、もう少しきれいな書き方があるかどうかを模索している最中です。

コード:

#include <stdio.h>
#include <iostream>
using namespace std;

void main(){
	//設定値
	double start = 5;
	double end = 0;
	double step = 2;
	
	//Startの値を代入
	double count = start;

	do
	{
		//countの値を表示
		cout << count << endl;
		//値がendと一致した場合ループを抜ける
		if(count == end){
			break;
		}
		//countをStepの値だけ減らす
		count -= step;
		
		//countの値がend未満の場合、countの値をendに変更してコンティニュー
		if(count < end){
			count = end;
			continue;
		}
	} while (count >= end);	//結果:5, 3, 1, 0 と表示されます

//他に試した文
	//do
	//{
	//	cout<< count << endl;
	//	count -= step;
	//	if(count < end){
	//		count = end;			//結果:5, 3, 1, 0, 0, 0 ・・・
	//	}
	//	
	//} while (count >= end);

	//do
	//{
	//	cout<< count << endl;
	//	
	//	if(count < end){
	//		count = end;			//結果:5, 3, 1
	//	}
	//	count -= step;
	//} while (count >= end);
}
他に良い書き方がある、もしくはこうすればもっときれいに書けるなど
アドバイスがいただければ幸いです。

環境 :Windows10上でVisualStudio2012を使用しています。

かずま

Re: 繰り返し処理の書き方について

#2

投稿記事 by かずま » 1週間前

End は Start より必ず小さいのですか?

コード:

#include <iostream>
using namespace std;

int main()
{
	double start = 5, end = 0, step = 2;

	double count = start;
	do {
		cout << count << endl;
		count -= step;
	} while (count > end);
	cout << end << endl;
}

OverKuro
記事: 4
登録日時: 1週間前

Re: 繰り返し処理の書き方について

#3

投稿記事 by OverKuro » 1週間前

OverKuro さんが書きました:
1週間前
この掲示板で初めて質問させていただきます。
もう少しきれいな書き方があれば教えていただけないでしょうか

 やりたいこと:Startに設定した値から、Endに設定した値までStepの値ずつ繰り返し値を表示したい。

 条件:
 ・StartとEndはかならず表示したい。
  ->Start = 5, End = 0, Step = 2の場合 : 5, 3, 1 ではなく 5, 3, 1, 0と表示したい
 ・実際にはdouble型の値を使うので、for文を使いたくない。
 
現在やりたいことは実質達成できているのですが、個人的に無理やり感があるため、もう少しきれいな書き方があるかどうかを模索している最中です。

コード:

#include <stdio.h>
#include <iostream>
using namespace std;

void main(){
	//設定値
	double start = 5;
	double end = 0;
	double step = 2;
	
	//Startの値を代入
	double count = start;

	do
	{
		//countの値を表示
		cout << count << endl;
		//値がendと一致した場合ループを抜ける
		if(count == end){
			break;
		}
		//countをStepの値だけ減らす
		count -= step;
		
		//countの値がend未満の場合、countの値をendに変更してコンティニュー
		if(count < end){
			count = end;
			continue;
		}
	} while (count >= end);	//結果:5, 3, 1, 0 と表示されます

//他に試した文
	//do
	//{
	//	cout<< count << endl;
	//	count -= step;
	//	if(count < end){
	//		count = end;			//結果:5, 3, 1, 0, 0, 0 ・・・
	//	}
	//	
	//} while (count >= end);

	//do
	//{
	//	cout<< count << endl;
	//	
	//	if(count < end){
	//		count = end;			//結果:5, 3, 1
	//	}
	//	count -= step;
	//} while (count >= end);
}
他に良い書き方がある、もしくはこうすればもっときれいに書けるなど
アドバイスがいただければ幸いです。

環境 :Windows10上でVisualStudio2012を使用しています。
追記:
返信いただいたあとで大変申し訳ありませんが、条件に不備がありました。
実は、この繰り返し文の中でcountにあたる値を、実際には書いていない(仕事に関わるので記述できません)処理を行うために使用しています。

そのため本内容で記述している値の表示処理は、その書いていない処理と見るため、すべて繰り返し文のなかで行う必要があります。

大事な要素をお伝え忘れ、本当に申し訳ございません。

OverKuro
記事: 4
登録日時: 1週間前

Re: 繰り返し処理の書き方について

#4

投稿記事 by OverKuro » 1週間前

はい、必ず Start > End の関係になるように設定します。
かずま さんが書きました:
1週間前
End は Start より必ず小さいのですか?

コード:

#include <iostream>
using namespace std;

int main()
{
	double start = 5, end = 0, step = 2;

	double count = start;
	do {
		cout << count << endl;
		count -= step;
	} while (count > end);
	cout << end << endl;
}

tanu_kichi
記事: 8
登録日時: 1ヶ月前

Re: 繰り返し処理の書き方について

#5

投稿記事 by tanu_kichi » 1週間前

プログラムの条件を拝見する限り、私も似たようなコーディングをすると思います。

重箱の隅を突っつくようで申し訳ありませんが、気になった点を述べますと、
1. void main ( ) はC++の仕様上許されていないかと思います。
  こちらの環境 OS:Ubuntu 18.04.3 LTS コンパイラ:g++ 7.4.0 でエラーがでます。

コード:

  int main() {
         ...
         return 0;
      }
  と書く方がいいかと思います。

2.英語の場合、慣用的に start , stop あるいは begin , end が対になります。
  start , end は、英語を母国語とされる方は通常は使いません。
  begin , end は start , stop より少しフォーマルな(堅い)ニュアンスがあります。

3.これは無視できることですが、当ケースでは

コード:

  do {
     ...
  } while ( ... );

コード:

  while ( ... ) {
     ...
  }
は同等です。
do { } while ( ) ; は while 条件式が偽であっても、1回は処理される。
while ( ) { } はwhile 条件式が偽である場合、1回も処理されない。

OverKuro
記事: 4
登録日時: 1週間前

Re: 繰り返し処理の書き方について

#6

投稿記事 by OverKuro » 1週間前

詳細なご返信、ありがとうございます。
仕事でC++を扱っておきながら、このような場で他のコンパイラを無視したコーディングや
変数名のニュアンスを考えず、早計な投稿をしてしまったと深く反省しております。
ご指摘のほど、ありがとうございます。


試行錯誤した結果、行数を抑えつつ理想の動きをするプログラムを書くことができました。

コード:

#include <stdio.h>
#include <iostream>
using namespace std;

int main(){
	//設定値
	double Begin = 5;
	double End = 0;
	double Step = 2;
	//表示用カウント
	double Count = Begin;

	do
	{
		//値を表示
		cout << Count << endl;

		//カウントがEndより大きい場合
		if(Count > End){
			//Stepの値だけ減らす
			Count -= Step;
			//CountがEnd未満なら値をEndに合わせる
			if(Count < End) Count = End;
		//Down未満ならループを抜ける
		}else break;

	} while (Count >= End);	//End以上ならループ

	return 0;
}
こちらはサンプル用に記述したものですが、本来書くプログラムに組み込んでも問題なく動きました。
返信してくださった皆様、ありがとうございます。
tanu_kichi さんが書きました:
1週間前
プログラムの条件を拝見する限り、私も似たようなコーディングをすると思います。

重箱の隅を突っつくようで申し訳ありませんが、気になった点を述べますと、
1. void main ( ) はC++の仕様上許されていないかと思います。
  こちらの環境 OS:Ubuntu 18.04.3 LTS コンパイラ:g++ 7.4.0 でエラーがでます。

コード:

  int main() {
         ...
         return 0;
      }
  と書く方がいいかと思います。

2.英語の場合、慣用的に start , stop あるいは begin , end が対になります。
  start , end は、英語を母国語とされる方は通常は使いません。
  begin , end は start , stop より少しフォーマルな(堅い)ニュアンスがあります。

3.これは無視できることですが、当ケースでは

コード:

  do {
     ...
  } while ( ... );

コード:

  while ( ... ) {
     ...
  }
は同等です。
do { } while ( ) ; は while 条件式が偽であっても、1回は処理される。
while ( ) { } はwhile 条件式が偽である場合、1回も処理されない。

かずま

Re: 繰り返し処理の書き方について

#7

投稿記事 by かずま » 1週間前

ループで、Count と End の比較は 2回で済みます。

コード:

#include <cstdio>     // <stdio.h> でもよいけれど
#include <iostream>
using namespace std;

int main()
{
	double Begin = 5, End = 0, Step = 2;

	for (double Count = Begin; ; ) {
		cout << Count << endl;
		if (Count == End) break;  // Count <= End でもよいけれど
		Count -= Step;
		if (Count < End) Count = End;
	}
}

返信

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