Cのアルゴリズムで煮詰まっています

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

Cのアルゴリズムで煮詰まっています

#1

投稿記事 by ぽにょ » 16年前

課題を解いているのですが考えが煮詰まってしまいました、助言の方、おろしくお願いします
環境 OS:WindowsXP
コンパイラ名とバージョン: visualc++2005

入力した0以上の整数値の2倍を計算して表示することを繰り返し行う。
負の整数値が2回連続入力されたらプログラムが終了する
ただし、無限ループ、breakを使用せずに、for文 while文で実現せよ
(数字以外は入力されないものとする)
(for文とwhile文をわけて実現と、一つの関数(main関数)にfor文とwhile文で実現せよ
#include <stdio.h>      /*まずはwhile文から*/
int main()
{
int i;
int n;
int flag=0;

scanf("%d",&n) /*入力*/
while(flag==0) /*flagが0の間ループ
{
/*ループを抜けるフラグとマイナスの値が入力された場合のフラグを
立てたいと思っています*/
printf("%d",2*n) /*2倍を計算して表示*/
}
まだ全然なのでここまでしか考えれませんでした、他にどのような処理が
必要なのか教えて頂ければ嬉しいです。(文章変でスイマセン)
自分の中ではwhileのループを抜けるために
ループの中でflagに1を入れようかなと考えています。

toyo

Re:Cのアルゴリズムで煮詰まっています

#2

投稿記事 by toyo » 16年前

while(flag==0) /*flagが0の間ループ
{
    /* 数値を入力 */
    /* 入力値が負の場合もう一度入力 */
    /* 入力値が0以上の場合2倍して表示 */
    /* そうでない場合flag = 1 */
}
こんな感じでしょうか

初級者

Re:Cのアルゴリズムで煮詰まっています

#3

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

>toyoさん

負の整数を入力したとき、それが1回目なのか2回目なのかを
どこで判断していますか?
また、負の整数を1回入力した直後にゼロ以上の整数を入力したとき、
負の整数の入力回数をゼロにもどす必要はありませんか?

s-rush

Re:Cのアルゴリズムで煮詰まっています

#4

投稿記事 by s-rush » 16年前

</*ループを抜けるフラグとマイナスの値が入力された場合のフラグを
立てたいと思っています*/

この考えでいいと思いますよ。
あとは負の数かどうかを判定してあげればいいです。
if文を使いましょう。

できるだけ簡単に、基本に即してサンプルを作ってみたので、よければ参考にしてください。
#include <stdio.h>

int main() 
{ 
	int i=0; 
	int number; 
	int flag=0; 
 
	while(flag==0) 
	{ 
		printf("Enter the number:");
		scanf("%d", &number);
		
		if(number < 0)
		{
			printf("Enter the number:");       //1度負の整数が入力された時の処理
			scanf("%d", &number);
			if(number < 0)
				flag = 1;      //2回連続で負の整数が入力されたのでフラグを立てる

		}

		printf("%d\n",2*number);
	}
	printf("Exit\n");
	
}
あとプログラムはプレタブで囲むと見やすくなりますよ^^

初級者

Re:Cのアルゴリズムで煮詰まっています

#5

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

別の人に質問することにより、あなたにヒントを出していることに気づいてくださいね。>ぽにょさん

s-rush

Re:Cのアルゴリズムで煮詰まっています

#6

投稿記事 by s-rush » 16年前

ダッシュで作ったのにもう回答なさっている方がいる^^;
初級者さんのおっしゃる通り、ポイントはタイミングですかね。

負の数が1度入力されたときにどういった処理をしてあげればよいか、
もう一度よく考えてみてくださいね。

もうサンプルは提示してしまいましたが^^;

初級者

Re:Cのアルゴリズムで煮詰まっています

#7

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

ところで、「煮詰まる」の本来の意味は
「議論や検討などを重ねて、結論に近づく」です。

どうにもならなくなる(行き詰まる)の意味で
煮詰まるというのは、
本来は正しくありません。
俗語のような形で認めている場合はあるみたいですけれど。

バグ

Re:Cのアルゴリズムで煮詰まっています

#8

投稿記事 by バグ » 16年前

whileとforを使用した両バージョンのサンプルです。
そんなに大きな違いはありませんが…(^_^;)

int main(void)
{
	int flag = 0, number = 0;

	while (flag < 2)
	{
		/* 値の入力 */
		scanf("%d", &number);

		if (number < 0)
		{
			/* 負数の場合はflagをインクリメントする */
			++flag;
		}
		else
		{
			/* 正数の場合はflagをゼロクリアする */
			flag = 0;

			/* 入力値の2倍の値を表示する */
			printf("%d * 2 = %d\n", number, number * 2);
		}

	}

	/* プログラムの終了を表示する */
	printf("Program End\n");
	return 0;
}




int main(void)
{
	int flag, number = 0;

	for (flag = 0; flag < 2; )
	{
		/* 値の入力 */
		scanf("%d", &number);

		if (number < 0)
		{
			/* 負数の場合はflagをインクリメントする */
			++flag;
		}
		else
		{
			/* 正数の場合はflagをゼロクリアする */
			flag = 0;

			/* 入力値の2倍の値を表示する */
			printf("%d * 2 = %d\n", number, number * 2);
		}

	}

	/* プログラムの終了を表示する */
	printf("Program End\n");
	return 0;
}

ぽにょ

Re:Cのアルゴリズムで煮詰まっています

#9

投稿記事 by ぽにょ » 16年前

みなさんありがとうございました
おかげさまでなんとか完成しました
サンプルやタイミング、「煮詰まる」の意味など貴重なご意見参考になりました
今回は一つの関数の中でwhile forを一緒に使いたいと思ったので
whileを使ったあと変数を初期化してfor文を使うこうとにしました。

一つ気になったのが
printf("入力して下さい\n");
	scanf("%d",&n);
	if(n<0)
	{
		printf("入力して下さい\n")	
		scanf("%d",&n);
		if(n<0)
で、これを効率化できないのかなと思いまして・・・
考えてはみましたが思いつきませんでした
もし、何かあれば教えて下さい。そんな重要な事でもないので・・・。

バグ

Re:Cのアルゴリズムで煮詰まっています

#10

投稿記事 by バグ » 16年前

こんな感じかな?
負の数が入力された際にフラグの値を1増やして、2になった時点でループを抜けるようになっています。
正の数が入力された場合にはフラグを0にリセットしてやることで、負の数が連続で入力場合の判定を行っています。
#include <stdio.h>

void inputNumber(int* flag, int* number)
{
	printf("入力してください\n");
	scanf("%d", number);

	if (*number < 0)
	{
		/* 負数が入力されたので、flagの値を1増やす */
		++(*flag);
	}
	else
	{
		/* 正数が入力されたので、flagの値をリセットする */
		*flag = 0;

		/* 入力値の2倍の値を表示する */
		printf("%d * 2 = %d\n", *number, *number * 2);
	}
}

int main(void)
{
	int flag = 0, number = 0;

	/* whileループバージョン */
	while (flag < 2)
	{
		/* 数値の入力 */
		inputNumber(&flag, &number);
	}

	/* whileループの終了を表示する */
	printf("while loop end\n");


	/* 変数の初期化 */
	flag = 0;
	number = 0;

	/* forループバージョン */
	for ( ; flag < 2 ; )
	{
		/* 数値の入力 */
		inputNumber(&flag, &number);
	}

	/* forループの終了を表示する */
	printf("for loop end\n");
	return 0;
}

ぽにょ

Re:Cのアルゴリズムで煮詰まっています

#11

投稿記事 by ぽにょ » 16年前

フラグの使い方でそのようなやり方があったとは・・・・
全然気づかなかった・・・・orz
バグさん、ありがとうございました、とてもわかりやすかったです
参考にさせてもらいますね。

閉鎖

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