質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

6回答

2022閲覧

プログラミング while文

mwyuki4444

総合スコア7

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/11/03 09:29

編集2016/11/03 10:22

任意の自然数を入力して
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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
hiim

総合スコア1689

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasahikoHirata

2016/11/03 09:53

その先生、せっかくwhile(!flag)にするならint でなくてbooleanにして、それも教えればいいのにね。
hiim

2016/11/03 10:00

> MasahikoHirataさん、ほんとですねw最初、c++とはいえ学校の課題とかなので、実はcでscanf使っての課題かなと思えば >> とかで入力させたいようだし、それにしてはフラグintだし、少し中途半端感はありますが、それよりもなによりロジックを考える部分を穴埋めにしてるのがちょっと。。。。ロジックなんてひとそれぞれなので穴埋めはちょっと。。。
guest

0

大変難しい課題です。まず、任意の自然数という所が難しいです。

  1. 自然数がいくつから始まるかについて1派と0派の二大派閥が存在します。私は1派です。
  2. 任意の数となるとunsigned long longでもほとんどの実装が最大18,446,744,073,709,551,615ですので、全く足りません。uintmax_tunsigned 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

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasahikoHirata

2016/11/03 11:11

"自然数がいくつから始まるかについて1派と0派の二大派閥が存在します。私は1派です。" 同じことを考えました。 そこまで学校で教えてくれればバグの発生率が少しは低下するのですが。。
majiponi

2016/11/03 13:32

「任意の」というのを額面通りに受けとれば確かにライブラリが必要となりますが、学校で、しかも初心者を対象とする授業で、そこまで出題者が考えているとは、私は思いません。書かれざる仕様を自ら補って(例えばintで表現できる範囲、とか)、どのような限界があるか理解していればそれで構わないと思います(ちなみに私は0から派です)。
raccy

2016/11/06 08:07

> majiponiさん 学校の課題であろうが、初心者向けであろうが、「書かれざる仕様を自ら補う」ことはプログラミングを行う上で一番やってはいけないことだと思います。初心者向けであってもそうです。なぜなら、初心者は始めに覚えたことをいつまでも守る傾向に有り、最初に「書いてないことは勝手に補っていいよ」と言ったら、その人はいつまでもそうしてもよいと思い込むからですです。仕様書に与えられる整数の上限が書いてなかったからと言って、勝手にintに決め打ちするなど、バグの素にすぎません。初心者だからこそ、そういった視点を持つべきであると、注意すべきであると、今から教えておくべきだと思います。違いますか?
majiponi

2016/11/06 13:16

なるほど。私と真逆の考え方ですね。私は、プログラマに仕事を発注するSEこそが、一点の曖昧さも持たないような正確な仕様書を作成すべきであり、プログラマに裁量を与えた責任はSEにある、と考えています。連絡して仕様の詳細を詰められる状況でなければ、書かれざる仕様の補完はプログラマの仕事であり、義務です。裁量に幅があることに気づかないプログラマは論外として、どのように補完するかが技術者の腕の見せ所であり、その補完にどのようなメリット・デメリットがあるか知っておくのが、プログラマとして最低限の素養であると考えています。持つべきであると言うことはもっともですが、それなら「なぜ」そのように考えたのか書いたほうがいいと思うのです。
guest

0

こんにちは。

せっかくの勉強の機会を邪魔するとよろしくありませんので、ヒントです。
最初のwhile文の中は、scanf()を使えばよいと思います。
scanf()の使い方の補足です。scanf()は読み取れた項目数を整数で返却します。
例えば、scanf("%u", &x)で正の整数を読み出せた場合1が返ってきます。

後は他の方のヒントを参考にしつつ自力で頑張ってみませんか?
でないと「丸投げ」になってしまいかねないですし。

投稿2016/11/03 09:54

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2016/11/03 10:13

ああ、すいません。見落としてました。cin >> a;がありますね。これで整数を読み出せます。 (自然数ではないことに注意。) それとループの終了条件はなんでしょうか? 「 2回連続同じ数値をうてば 「繰り返されました」 と表示され、終了する」でしたら、「繰り返されました」 と表示した直後にbreak;でループを終了すればよいですね。 while()文は()の中身がtrueである限りループします。
guest

0

質問は質問の中に、説明も説明の中でなければ既に誰かが回答したのかと思った。
恐らく学校の課題だと思いますが、それであれば答えより思考過程が重要かと。

思考過程で説明すると、まず例題の中のポイントを整理。
①任意の自然数が入力される(標準入力から)
②同じ数が2度繰り返された場合の処理がある。(同じ数とは前回と今回で、前回の値を保持する必要がある)
③同じ数でなければ2倍して出力。(標準出力でよいの?)
④ ②の同じ数だった場合は”繰り返されましたと”出力”(おそらく標準出力へ)、そして終了。(while文からbreak)

と読解してコーディング。

投稿2016/11/03 09:42

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasahikoHirata

2016/11/03 09:45

それにしても自然数=intとは限らないと思うのは私だけ?20桁くらいの自然数とか。まあintの仕様にもよりますが。
WoodenHamlet

2016/11/07 00:20

少なくとも unsigned int のほうが”自然数”として正しいですね
guest

0

google翻訳でエラー文を翻訳してみたら「int型 ''を返さなければなりませんメイ​​ン」となりましたので、int型をreturnしろって言ってるんじゃないんですかね?

投稿2016/11/06 07:36

izu_siat

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasahikoHirata

2016/11/06 13:22

質問者が後から追加した情報ですね。 void main() を int main(int argc,char * argv[]) にするだけだが。。。
PineMatsu

2016/11/08 09:10

更に、mainの最後に return 0; (戻り値はなんでも良いけど)が必要かと。
WoodenHamlet

2016/11/08 09:12

というかエラーレベルなんだ。せいぜい警告レベルかと思った(て言ったら怒る人いそうだけど)。
guest

0

学校のほうから配られたサンプルコードです。

void main(){

int a, b, flag = 0; b = -1; while(/**********/){ cin >> a; if (/**********/){ /**********/ }else{ /**********/ } }

}

投稿2016/11/03 09:32

mwyuki4444

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PineMatsu

2016/11/08 09:15

サンプルが悪い。void main()ではなくint main()にすればエラーはなくなるはず。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問