任意の自然数を入力して
2回連続同じ数値をうてば
「繰り返されました」
と表示され、それ以外の場合では終了せずに、入力した値の2倍の数を表示するというプログラムなのですが、どのようにwhile文を利用すれば良いかわかりません。初心者で理解力もすくなく、戸惑っております。よろしくお願いいたします。
追記
scanfというものなのですが、まだ学校のほうで扱っていないので、試験等で使いにくい状況です…。
せっかく回答してくださったのに、大変申し訳ございません。
皆様本当にありがとうございます。ヒントを参考にしたのですが
#include <iostream>
using namespace std;
void main() {
int a=0;
int b=0;
while(true){cin>>a;
cin>>b;
if (a!=b){
cout << b * 2 << endl;}
else
{ cout<<"繰り返されました"<<endl; break;
}
}
}
と入力してみたところ
Practice.cp:4: error: ‘::main’ must return ‘int’ というエラー文がでました。
これはどういった意味なのでしょうか。
初歩的なこともわかってなくて迷惑をおかけして、申し訳ございません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
コードを書いてしまうと答えになってしまうので、構成だけ
c
1 2入力された数値を保存する変数を今回分と前回分で2こ用意 3 4while(1) 5{ 6 ここでscanfなどで入力した文字・数値を受け取る 7 8 if(初めての入力もしくは前回分と今回分の数値が異なる) 9 { 10 今回分の数値の2倍の数値を表示し、 11 前回分の変数=今回分の変数 12 } 13 else 14 { 15 「繰り返されました」 と表示してreturn; 16 } 17}
こんな使い方ででいけます。
・追記
追加で学校の課題の穴埋めてきなコードが補足されたのでその部分ように考え直すのは
while(1)の条件部分をflgを使って
while(!flg)
などにして同じ値が入力されたらflgが立つようにしたいんでしょうね学校は
投稿2016/11/03 09:39
編集2016/11/03 09:46総合スコア1689
0
大変難しい課題です。まず、任意の自然数という所が難しいです。
- 自然数がいくつから始まるかについて1派と0派の二大派閥が存在します。私は1派です。
- 任意の数となると
unsigned long long
でもほとんどの実装が最大18,446,744,073,709,551,615ですので、全く足りません。uintmax_t
もunsigned long long
である実装がほとんどであり、やはり18,446,744,073,709,551,615までしか扱えません。
1.については仕方がないので私の好みで1派にします。また、自然数以外が入力されたときの動作について定義がありません。「自然数ではありません」とメッセージを出すことにします。
問題の2.ですが、さすがにコンピュータの計算能力、つまりメモリ容量を越えてでも計算しろというのはないと思います。そこで、メモリを許す限りにします。しかし、C++には多倍長整数が標準ライブラリ(STL)に含まれていません。仕方がないのでboostを使うことにします。
while文を利用すれば良いかわかりません。
いいえ、while文もfor文もいりません。ということで、次のようになります。
C++
1#include <boost/multiprecision/cpp_int.hpp> 2#include <iostream> 3 4static const char *message_repeat = u8"繰り返されました"; 5static const char *message_no_natural = u8"自然数ではありません"; 6 7int main() 8{ 9 auto numberToDouble = [](auto num) { 10 auto numberToDoubleInner = [](auto &f, auto pre) { 11 auto i = pre; 12 i = 0; 13 std::cin >> i; 14 if (i <= 0) { 15 std::cout << message_no_natural << std::endl; 16 return; 17 } 18 if (pre == i) { 19 std::cout << message_repeat << std::endl; 20 return; 21 } 22 std::cout << i * 2 << std::endl; 23 f(f, i); 24 }; 25 numberToDoubleInner(numberToDoubleInner, num); 26 }; 27 numberToDouble(boost::multiprecision::cpp_int(-1)); 28 return 0; 29}
改良すべき点
- ラムダ式の型がautoだとキャプチャできないため、入れ子で引数で渡しています。末尾呼び出し最適化はしてくれるのだろうか…。
- iの型がpreを一回入れないと推論できなんですけど、なぜかわかりません。
投稿2016/11/03 11:08
総合スコア21735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/03 13:32
2016/11/06 08:07
2016/11/06 13:16
0
質問は質問の中に、説明も説明の中でなければ既に誰かが回答したのかと思った。
恐らく学校の課題だと思いますが、それであれば答えより思考過程が重要かと。
思考過程で説明すると、まず例題の中のポイントを整理。
①任意の自然数が入力される(標準入力から)
②同じ数が2度繰り返された場合の処理がある。(同じ数とは前回と今回で、前回の値を保持する必要がある)
③同じ数でなければ2倍して出力。(標準出力でよいの?)
④ ②の同じ数だった場合は”繰り返されましたと”出力”(おそらく標準出力へ)、そして終了。(while文からbreak)
と読解してコーディング。
投稿2016/11/03 09:42
総合スコア3747
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/03 09:45
2016/11/07 00:20
0
google翻訳でエラー文を翻訳してみたら「int型 ''を返さなければなりませんメイン」となりましたので、int型をreturnしろって言ってるんじゃないんですかね?
投稿2016/11/06 07:36
総合スコア10
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/06 13:22
2016/11/08 09:10
2016/11/08 09:12
0
学校のほうから配られたサンプルコードです。
void main(){
int a, b, flag = 0; b = -1; while(/**********/){ cin >> a; if (/**********/){ /**********/ }else{ /**********/ } }
}
投稿2016/11/03 09:32
総合スコア7
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/03 09:53
2016/11/03 10:00