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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1374閲覧

while, do whileのループ処理を使って入力した分、数を増やし表示したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/08/25 07:54

前提・実現したいこと

とあるサイトにコンソールに数値を入力し、その数だけ■を表示するという問題があり、それをwhile文、do while文のループ処理を使って実行できるようにしたいのですが、現状どの数値を入力しても■が1つしか表示されません。
for文は作ることが出来ましたがそこから数値等を揃え並べてみたのですが、一向に望む結果を得ることが出来ませんでした。

該当のソースコード

C#

1static void Main(string[] args) 2 { 3 Console.Write("■の数を入力:"); 4 int i = int.Parse(Console.ReadLine()); 5 int a =0 6 while(a < i) 7 { 8 Console.Write("■"); 9 i++; 10 break; 11 } 12 Console.WriteLine() 13 }
static void Main(string[] args) { Console.Write("■の数を入力:"); int i = int.Parse(Console.ReadLine()); int a = 0; do { Console.Write("■"); i++; break; } while (a < i); Console.WriteLine(); }

試したこと

()部分を(true)にしたり(0<i)にしてみましたが結果は変わりませんでした。
i++;の位置変更も結果に変化はありませんでした。
int i = 1だけ書いた場合、int a = 0を書いていない場合も変化はありませんでした
("■")の表記を(i+"■")にしても望む結果は得られませんでした。

補足情報(FW/ツールのバージョンなど)

windows
Visual studio 2019

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

YAmaGNZ

2021/08/25 07:58

aとiの値がいくつでどちらが大きいのか考えましょう。 また、前の質問で教えてもらったようにステップ実行してみてどのように動作しているか確認しましょう
Zuishin

2021/08/25 07:59

これは初心者だからという問題なんだろうか。 もしかして何かハンディキャップ持ってます?
MomenToufu

2021/08/25 08:09

int i が何か? int a が何か?整理してみてはどうですか?何をカウントアップしていくべきなのか見えてくるのではないでしょうか?
退会済みユーザー

退会済みユーザー

2021/08/25 08:19 編集

前にも同じ質問のスレッド https://teratail.com/questions/355887 があったけど、その時は解決できたのに今回何故だめなのですかね?
fana

2021/08/25 09:00

> 試したこと が全体的に意味不明. 何故それを試せば良いと考えたのか? という根本の部分が存在しているように見えない. プールの中に部品を投げ込んだら偶然時計が組みあがる確率はゼロではないかもしれないけども 一般に(?),プログラミングという行為は そのような奇跡を期待して無計画にコードをいじくり回すことではないよ.
dodox86

2021/08/25 09:01

前のご質問中のコードはご自身で考えて書いたのですよね。 > ()部分を(true)にしたり(0<i)にしてみましたが結果は変わりませんでした。 コードを考えなくあれこれいじくりまわしてもダメなのですが。自分の考えをコードに書き出すようにしないと。
退会済みユーザー

退会済みユーザー

2021/08/25 09:10

テンプレートや前回のコードを参照しつつ組み立てましたが、まず基礎自体がしっかり理解できておらず、どこがおかしいのか分からずじまいのまま模索したり調べたりしていたので最終的におかしなことになっていました。
退会済みユーザー

退会済みユーザー

2021/08/26 02:32 編集

基礎もそうですが、前回の質問でブレークポイントという機能を教わったのに、使っていないからどこがおかしいか判らないのでは?ブレークポイントで要所要所で止めたり、一行づつ実行して条件式や変数の値を確認したりすれば、普通の人ならどこでおかしい挙動しているか判るでしょう。 まずきちんとデバッガの使い方を覚えましょう。
guest

回答2

0

ベストアンサー

まず、プログラミングっていうのは「こう書けばいい」っていうものじゃありません。

「プログラムは魔法でもなんでもなく、人間が現実世界でやっている手順を、独自の書き方で書き下したもの」です。
つまり、料理でいうレシピのようなものです。

簡単に言えば『現実世界のシミュレーション』です。

まずはコードを読んでみましょう。

コードを読むコツは『一行レベルで、その行が何をしているかを考えながら読む』です。
たとえばソースコードをコピーして、コメントにするとかです。

C#

1static void Main(string[] args) 2 { 3 // 入力を促す文字列を表示 4       Console.Write("■の数を入力:"); 5 6 // ユーザ入力を受け付けて, 変数 i にセット 7 int i = int.Parse(Console.ReadLine()); 8 9 // 変数 a は 0 とする 10 int a =0 11 12 // a が i 未満である間 13 while(a < i) 14 { 15         // ■を表示する 16 Console.Write("■"); 17          18 // iをインクリメントする 19 i++; 20 21 // ループから強制的に抜ける 22 break; 23 } 24        25       // 改行する 26 Console.WriteLine() 27 }

これを日本語でもいいし英語でも中国語でも韓国語でもなんでもいいので、自分が読み書きできる言語で書き下す。(便宜上、これを"疑似コード"とする)

1. 入力を促す文字列を表示 2. ユーザ入力を受け付けて, (int型として)変数 i にセット 3. 変数 a は 0 とする 4. a が i 未満である間以下を繰り返す 4.1. ■を表示する 4.2. iをインクリメントする 4.3. ループから強制的に抜ける( 強制的に (5) へ ) 5. 改行する

この疑似コードをレシピと考えて、シミュレーションしてみてください。

ちなみに、今回の問題の言い換えは、

[依頼] あなたはAさんに数を聞いて、その数だけ"■"をホワイトボードに書いてくれ

のようなものでしょうか。

で、疑似コードを使って、具体的な値を入れて計算してみる。

ユーザ入力が 1 だったらどうでしょうか。

1. (入力を促す文字列を表示) 2. i = 1 3. a = 0 4. a < i (→ 0 < 1 ) かどうか (= true ) 4.1. (■を表示) 4.2. i++ => 1 + 1 = 2 => i = 2 4.3. (強制的に(5)へ) 5. 改行

あれ????????? なんかおかしくないですか?
なんで、(4.3) でbreakしているのでしょうか。

break は『(直近の)ループから強制的に抜ける』です。

これが動いたら、ループなんてなるわけないじゃん。

仮に(4.3) を排除しても、なんで、(4.2)で 「iをインクリメント」しているのでしょうか。

そもそもi とは何でしょうか。

確か、私の記憶が正しければ、今回のコードでは「ユーザ入力によって受け取った整数(= 個数)」だったはずです。

なんで i を +1 しているのでしょうか。

おそらく、(4.3)を除くと、無限ループに陥るでしょうね。
だって、a は変動すらせず、基準の i だけ増加していっている。

たとえば、5つ表示するとしたら、

一個目のものを表示したら本来は「後4つ」になるはずです。
でも i++ しているので、i = 6 となり、「後5つ」となります。

で、二個目を表示しても i++ なので 「後5つ」……となり、
ある意味、賽の河原的な、鬼なことをしています。

まあ、終了条件がないため、無限牢獄(?)となりますね。


[追記1]

ちなみに、for文の構造(?)も考えてみましょう。

for文の構造は

C#

1for( 初期値; 条件式; 増減式 ){ 2 // なんらかの処理 3}

となっているはずです。

言い回しが違うかもしれませんが、大体こんな感じ。

で、初期値は初期化して最初の値として使うもの。
条件式は「この条件を満たす間」の意味です。
増減式は i++ とかです。

ちなみに i++ は i = i + 1 のことです。つまり、「+1していく」です。

C#

1for( int i = 0; i < 10; i++ ){ 2 Console.WriteLine("Hello"); 3}

の場合も考えてみましょう。

上記コードを便宜上、「コードA」とします。

コードA を読むと、

C#

11. iの初期値 0, iが10未満の間, インクリメントしてループ 2 1.1. "Hello" と表示する

ですね。

これで、「10回"Hello"と表示する」となります。

この場合は、数直線を使うとわかりやすいです。

数直線を現実世界のノートかなんかに書いてみてください。

初期値: 0 なので、0を含んだ状態でチェックつけましょう。

そして、i < 10 なので、10 もチェックしましょう。
あ、この場合は「10を含まない」ので注意。

含む場合は 数式?だと i≦10 で, C# では i <= 10 となります。

そして、0から10までを囲いましょう。

そして、次はその個数を数えてみましょう。

i = 0 のとき、 1回目 (0を含むため)
i = 1 のとき、 2回目
i = 2 のとき、 3回目
...
i = 9 のとき、 10回目
i = 10 のとき、 11回目…とやりたいが、

10 は含まないので、無視。

つまり、 i = 9 までしかカウントしない。

よって、10回繰り返すことになります。

だから、コードAは「10回"Hello"と表示する」となるのです。


[追記2]

ご指摘を受けて、気づきましたが、確かに日本語での「○○以上」は○○を含むタイプと含まないタイプがありますね。

上記は「コードを参考にして」と考えてほしいです。
(説明がしづらいので)

投稿2021/08/25 08:23

編集2021/08/25 10:55
BeatStar

総合スコア4962

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

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

退会済みユーザー

退会済みユーザー

2021/08/25 08:42

疑似コードというやり方でやっていることを確認する方法があるんですね。 教えて頂きありがとうございます。 "a<i"と表記すると、"aがi未満だと"となっていたんですね。 iが0以上にとなるようにしょうと思っていたのでそこは盲点でした。 break;は、現在のコードだと無限ループでバグってしまったので止める為につけていましたが、iをインクリメントしていたこと自体が間違っていてそれでおかしくなっていたんですね。 教えて頂きありがとうございます。
BeatStar

2021/08/25 08:49

@ 質問者さん > "a<i"と表記すると、"aがi未満だと"となっていたんですね。 # いや、普通にわかると思うんだけど……(だって数学や算数とかで使うし) 数学とかでも 「○○以上」は 「X>○○」ですよね? breakの件はそりゃあ、(終了の)条件が一致しないからずーーーーっとなるでしょうね。 まずはロジックを追いましょう。 別に疑似コードを使う必要はありません。 フローチャートでもUMLでもいいです。 とにかく使えるものは使う。
退会済みユーザー

退会済みユーザー

2021/08/25 09:02

すみません。思うようにいかないことに焦り基本的なことが抜けていました。 普段は〇〇<Xと表現していたということもあり色々ごちゃごちゃになっていました。 もう一度しっかり確認してみます。
BeatStar

2021/08/25 09:04

確かにわからないとそういう焦りが出てきますよね。 でも、そういうときにこそ、深呼吸。 で、時間に余裕があるのなら、リフレッシュするとか。 そうすると、ひらめくことが多いです。 (私も煮詰まったとき、リフレッシュすると思いつくことが意外と……)
退会済みユーザー

退会済みユーザー

2021/08/25 09:52

追記ありがとうございます。 サイトを読んでいる際、なんとなくでこうすればこうなるのかと詳しい理解までは辿りつけていなかったので、凄くわかりやすかったです。 前回for文で書いた際もそのなんとなくに沿って書いたら出来た。という感じだったので、その感覚だったからこそ今回このように丸1日手を尽くしても出来ない事態が起こっていたんですね。 わざわざ詳しく説明して下さり本当にありがとうございます! 今回の事で少しモチベが下がっていたので凄く助かりました。
fana

2021/08/25 10:20 編集

細かいことですが,回答やコメント内で < や > を「以上」「以下」と述べている間違いが見られます. > 数学とかでも 「○○以上」は 「X>○○」ですよね? > 1. iの初期値 0, i が 10以下の間, インクリメントしてループ 例えば, 「5以下」といったら5を含み,「5未満」なら5を含みません. 同様に 「5以上」は5を含み,「5より大きい(これを示す「未満」みたいな語は何だろう?)」なら5を含みません.
BeatStar

2021/08/25 10:20

あ、本当ですね……修正しますね。
BeatStar

2021/08/25 10:49 編集

訂正(for コメント): [誤]: 数学とかでも 「○○以上」は 「X>○○」ですよね? [正]: 数学とかでも 「○○以上」は 「X≧○○」ですよね? ("<"から"≧"に変更)
fana

2021/08/25 10:24

うーん,ひとつだけ「5より大きい」だの「5をこえる」だのいう言い方になるのが嫌だなぁ. かっこいい(?)語は無いのか?
BeatStar

2021/08/25 10:30

私はあまり数学が得意ではないので、若干混乱中ですが、やっぱり、「(この)コメント内の」やつは 元のやつが合っている気がするのですが…… X と ○○を比較すると、Xの方が大きいので、if( x > 0 ) とかになるのではないでしょうか? (混乱中)
BluOxy

2021/08/25 10:30

5超過 はどうでしょう
dodox86

2021/08/25 10:37

> [正]: 数学とかでも 「○○以上」は 「X<○○」ですよね? いえ、"以上"はその値を含むのですから、「X≦○○」の間違いでは? 演算子の違い。更に言えば、「○○以上」に合わせるなら、「X≧○○」では。(ややこしい)
YAmaGNZ

2021/08/25 10:46

「より大きい」と表現すべきところを「以上」と表現しているという指摘かと 数学ではなく算数の分野化と思いますよ
BeatStar

2021/08/25 10:48

@ dodox68さん, YAmaGNZさん あー、そっちですか……(確かにそうとも考えられますね……)
fana

2021/08/26 01:21

> 5超過 > 「超」 そういうふうに言えるんですね.感謝. うーん,でも普段使ってないとどうしても違和感(?)みたいなのがありますね. 使えば使ったで通じるかどうか不安かも.
YAmaGNZ

2021/08/26 01:35

>ご指摘を受けて、気づきましたが、確かに日本語での「○○以上」は○○を含むタイプと含まないタイプがありますね。 「○○以上」は○○を含むタイプしかありませんよ。
fana

2021/08/26 02:09 編集

まぁ, 「それ以上近づくな」だとか「これ以上は早くならない」だとか「お値段以上の価値がどうの」とか言う場合は 「今の位置よりも近づくな」「現在よりも早くならない」「もっと高額なものくらいの価値が」的な意味合いであり,こういった場合には「含まないタイプ(?)」な感じではありますね. (こういった例は本来は誤用なのかも.わかった上で「お値段以上」って言ってる可能性も??) しかしながら,算数/数学 な話をしている場合は「含む」です.
guest

0

while(a < i)

カッコの中の比較が成立しているときにループが継続されます
それぞれどういう動作になるのか、追いかけていってみてはどうでしょう。

投稿2021/08/25 08:00

y_waiwai

総合スコア88024

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問