ページ 1 / 1
Cのアルゴリズムで煮詰まっています
Posted: 2009年1月08日(木) 21:48
by ぽにょ
課題を解いているのですが考えが煮詰まってしまいました、助言の方、おろしくお願いします
環境 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を入れようかなと考えています。
Re:Cのアルゴリズムで煮詰まっています
Posted: 2009年1月08日(木) 22:01
by toyo
while(flag==0) /*flagが0の間ループ
{
/* 数値を入力 */
/* 入力値が負の場合もう一度入力 */
/* 入力値が0以上の場合2倍して表示 */
/* そうでない場合flag = 1 */
}
こんな感じでしょうか
Re:Cのアルゴリズムで煮詰まっています
Posted: 2009年1月08日(木) 22:21
by 初級者
>toyoさん
負の整数を入力したとき、それが1回目なのか2回目なのかを
どこで判断していますか?
また、負の整数を1回入力した直後にゼロ以上の整数を入力したとき、
負の整数の入力回数をゼロにもどす必要はありませんか?
Re:Cのアルゴリズムで煮詰まっています
Posted: 2009年1月08日(木) 22:28
by s-rush
</*ループを抜けるフラグとマイナスの値が入力された場合のフラグを
立てたいと思っています*/
この考えでいいと思いますよ。
あとは負の数かどうかを判定してあげればいいです。
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のアルゴリズムで煮詰まっています
Posted: 2009年1月08日(木) 22:30
by 初級者
別の人に質問することにより、あなたにヒントを出していることに気づいてくださいね。>ぽにょさん
Re:Cのアルゴリズムで煮詰まっています
Posted: 2009年1月08日(木) 22:34
by s-rush
ダッシュで作ったのにもう回答なさっている方がいる^^;
初級者さんのおっしゃる通り、ポイントはタイミングですかね。
負の数が1度入力されたときにどういった処理をしてあげればよいか、
もう一度よく考えてみてくださいね。
もうサンプルは提示してしまいましたが^^;
Re:Cのアルゴリズムで煮詰まっています
Posted: 2009年1月08日(木) 22:46
by 初級者
ところで、「煮詰まる」の本来の意味は
「議論や検討などを重ねて、結論に近づく」です。
どうにもならなくなる(行き詰まる)の意味で
煮詰まるというのは、
本来は正しくありません。
俗語のような形で認めている場合はあるみたいですけれど。
Re:Cのアルゴリズムで煮詰まっています
Posted: 2009年1月09日(金) 09:04
by バグ
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のアルゴリズムで煮詰まっています
Posted: 2009年1月12日(月) 00:00
by ぽにょ
みなさんありがとうございました
おかげさまでなんとか完成しました
サンプルやタイミング、「煮詰まる」の意味など貴重なご意見参考になりました
今回は一つの関数の中でwhile forを一緒に使いたいと思ったので
whileを使ったあと変数を初期化してfor文を使うこうとにしました。
一つ気になったのが
printf("入力して下さい\n");
scanf("%d",&n);
if(n<0)
{
printf("入力して下さい\n")
scanf("%d",&n);
if(n<0)
で、これを効率化できないのかなと思いまして・・・
考えてはみましたが思いつきませんでした
もし、何かあれば教えて下さい。そんな重要な事でもないので・・・。
Re:Cのアルゴリズムで煮詰まっています
Posted: 2009年1月12日(月) 00:50
by バグ
こんな感じかな?
負の数が入力された際にフラグの値を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のアルゴリズムで煮詰まっています
Posted: 2009年1月12日(月) 21:16
by ぽにょ
フラグの使い方でそのようなやり方があったとは・・・・
全然気づかなかった・・・・orz
バグさん、ありがとうございました、とてもわかりやすかったです
参考にさせてもらいますね。