forとwhile

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

forとwhile

#1

投稿記事 by ますちゃん » 6年前

学校の課題でforとwhileでプログラムを実行するのにどちらが最適か?という問題です。
そのうち4つわからないのがありました。
というか、片方ができればもう片方でも実行できるんだから
答えはどっちでもいいんじゃないんですか?という疑問もあります。
問題は
1.変数xを「100」から「0」まで「1」づつプログラム制御して「OK」と画面表示させる場合
2.「繰り返し」処理をすることは確定であるが、「何回」繰り返すかはキーボードから入力される値しだいである場合
3.変数xの初期値を「1」とし「2」ずつ加算して変数xが値「100」となったら繰り返しを終了する場合
4.変数xの初期値は任意だが「1」づつ減算して変数xが値「0」となれば、確実に繰り返し処理が終了する場合。
このうち特に1.4は自分で見た瞬間に大方の検討はつくと思うのです。
ああ、0になるまでは-1×(回数)だなと、大体の数字はわかるんじゃないか?とおもうのです。
どなたか回答よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: forとwhile

#2

投稿記事 by softya(ソフト屋) » 6年前

こちらの掲示板では、課題の丸投げはご遠慮いただいております。
http://dixq.net/board/board.html
で、1から4までのプログラムをforとwhileで組んでみたらどうしょう。
その上で、それぞれの考察をますちゃんさんなりにお願いします。こちらはソースコードと考察についてコメントしたいと思います。
プログラムを掲示板に貼るときはcodeタグをご利用ください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

naohiro19
記事: 256
登録日時: 10年前
住所: 愛知県

Re: forとwhile

#3

投稿記事 by naohiro19 » 6年前

softya(ソフト屋) さんが書きました:こちらの掲示板では、課題の丸投げはご遠慮いただいております。
http://dixq.net/board/board.html
で、1から4までのプログラムをforとwhileで組んでみたらどうしょう。
その上で、それぞれの考察をますちゃんさんなりにお願いします。こちらはソースコードと考察についてコメントしたいと思います。
プログラムを掲示板に貼るときはcodeタグをご利用ください。
これって「ま」ですよね

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: forとwhile

#4

投稿記事 by softya(ソフト屋) » 6年前

naohiro19 さんが書きました:
softya(ソフト屋) さんが書きました:こちらの掲示板では、課題の丸投げはご遠慮いただいております。
http://dixq.net/board/board.html
で、1から4までのプログラムをforとwhileで組んでみたらどうしょう。
その上で、それぞれの考察をますちゃんさんなりにお願いします。こちらはソースコードと考察についてコメントしたいと思います。
プログラムを掲示板に貼るときはcodeタグをご利用ください。
これって「ま」ですよね
お名前ですので、そのままコピペしただけですが?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ますちゃん

Re: forとwhile

#5

投稿記事 by ますちゃん » 6年前

僕はこの掲示板で始めて投稿しましたますちゃんです。
まずさんは存じ上げませんが、失礼なようでしたら、名前を変えます。
1.プログラム制御の意味がよくわかりませんでしたがデクリメントを使いました。
すべてwhileが上でforが下です。

コード:

#include "stdafx.h"

int main(void)
{
	int x;
	x=100;
	while(x<0){
	x--;
	}
	printf("OK\n");
	return 0;
}

コード:

#include "stdafx.h"

int main(void)
{
	int x;
	for(x=100;x<=0;x--){}
	printf("OK\n");
	return 0;
}
2.繰り返しでaを入力した数だけ表示します。どちらでもできます。

コード:

#include "stdafx.h"
#include "stdlib.h"

int main(void)
{
	int x,y;
	char buffer[2];
	gets(buffer);
	y = atoi(buffer);
	x=1;
	while(y>=x){
	printf("a\n");
	x++;
	}
	printf("OK\n");
	return 0;
}

コード:

#include "stdafx.h"
#include "stdlib.h"

int main(void)
{
	int x,y;
	char buffer[2];
	gets(buffer);
	y = atoi(buffer);
	for(x=1;x<=y;x++){
	printf("a\n");
	}
	printf("OK\n");
	return 0;
}
3.どちらもあまりかわらない印象です。

コード:

#include "stdafx.h"

int main(void)
{
	int x;
	x=1;
	while(x<100){
	x=x+2;
	}
	printf("OK\n");
	return 0;
}

コード:

#include "stdafx.h"

int main(void)
{
	int x;
	x=1;
	for(x=1;x<100;x=x+2){}
	printf("OK\n");
	return 0;
}
4.入力した数字からxを1づつ減らし0に近づけます。どちらでもいい気がします。

コード:

#include "stdafx.h"
#include "stdlib.h"

int main(void)
{
	int y;
	char buffer[2];
	gets(buffer);
	y=atoi(buffer);
	while(y>0){
	y--;
	}
	printf("OK\n");
	return 0;
}

コード:

#include "stdafx.h"
#include "stdlib.h"

int main(void)
{
	int x;
	char buffer[2];
	gets(buffer);
	for(x=atoi(buffer);x>0;x--){}
	printf("OK\n");
	return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: forとwhile

#6

投稿記事 by softya(ソフト屋) » 6年前

出題した先生の性格がよく分かりませんが、「最適か?」と言うことなので、よりコンパクトに表現できる方を選べという意味だと私は解釈します。
とすれば、ますちゃんさんは、1から4までそれぞれどちらを選びますか?

ただ、1から4までwhileの特性が生かされている良い問題がありません。
※ これら以外に問題が有ったのかもしれませんが提示されていません。
ちなみに1のプログラムの答えは間違っていますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ますちゃん

Re: forとwhile

#7

投稿記事 by ますちゃん » 6年前

コンパクトという点からみると初心者の私としてはすべてforを選ぶと思います。
すべて初心者から見たみためのコンパクトですが。
1のまちがいはx<0ではなくx>0ですね。すみません。
ほかの問題は
5.変数xの初期値も最終値も任意であるが、繰り返し処理を「100」回事項することが確実に決まっている場合
6.プログラムの中で「乱数」を発生させ、一定の値になった時点で繰り返し処理を終了する場合
です。
私は5はfor6はwhileだとおもいます。
理由はwhileは回数が決まってないときforは回数が決まっているときつかう。というふうに習ったからです。
これにのっとると5は回数が指定されているのでfor
6は乱数がいつ一定の値になるかわからず回数がわからない
と思ったためです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: forとwhile

#8

投稿記事 by softya(ソフト屋) » 6年前

そうですね。考え方としては私はそれで良いと思います。
一つ言い忘れましたが、コードのコンパクトさと同時にコードが読みやすいも考慮に入れる必要があると思います。
まぁ先生の性格によるので100%正解は他人にはわからないです。

> 理由はwhileは回数が決まってないときforは回数が決まっているときつかう。というふうに習ったからです。

そう先生が言ったのなら、その法則に則っていれば問題無いと思いますよ。
結局実務ではバグの少なくなる書き方をfor/whileなどから、その時に応じて選ぶわけですが回数が決まっているからと言う理由だけで選べない時もあります。
学校の課題だと限定されたルールの中で先生の求める答えを書くのが正解ですからね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ますちゃん

Re: forとwhile

#9

投稿記事 by ますちゃん » 6年前

すべてforであるという回答をいただきましたが、4番もそうでしょうか。
任意の数というのは乱数というふうにも考えられるとしたら、whileが妥当だとおもいます。
ほかの問題も回数なんかいかなと数えなかったらwhileになる気がします。
もはやこれは日本語の問題と捉えたほうがいいのでしょうか…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: forとwhile

#10

投稿記事 by softya(ソフト屋) » 6年前

ループ前にループ条件(開始値、終値、回数)が確定してるのならforで良いと思います。
終了値やループ回数が確定できないのならwhileを選択すべきでしょう。
なので乱数を使ってもループ前に確定するならforですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

初級者
記事: 200
登録日時: 10年前

Re: forとwhile

#11

投稿記事 by 初級者 » 6年前

ループの中に

コード:

    continue;
を含んでいないとき、

コード:

    A;
    while(B) {
        /* 何かの処理 */
        C;
    }

コード:

    for (A; B; C) {
        /* 何かの処理 */
    }
は、同値のはず。

ますちゃん

Re: forとwhile

#12

投稿記事 by ますちゃん » 6年前

ソフト屋さんありがとうございました!
もしかしたらほかでマルチポストするかもしれませんが、とりあえず解決しました!

ますちゃん

Re: forとwhile

#13

投稿記事 by ますちゃん » 6年前


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: forとwhile

#14

投稿記事 by softya(ソフト屋) » 6年前

ここでも他の人に聞いてみれば良いと思います。
> 上の問題文によると2番以外whileに思えてしまうのです。
2. for 1.3.4 while だと思うってことですよね。
そう思う理由を書かないと解決に至らないと思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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