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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

6回答

2108閲覧

おそらく簡単つまづいてるのは自分だけ? while文をfor文に

xxx

総合スコア21

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/06/28 07:16

c

1 2 3 int money = 1, month = 1; 4 5 while (money < 1000000) { 6 printf("%02d 月目 : %7d 円\n",month,money); 7 money *= 2; 8 month++; 9 } 10 printf("%02d 月目 に %d 円となり、100万円を超える。\n",month,money); 11

苦しんで覚えるc言語というサイトでわからないなりに進めていってるんですが
回数が決まっている繰り返しでfor文
回数がわからない繰り返しでwhile文の説明がありました
while文はfor文にも直せるみたいなんですが
このwhile文の例をfor文に直そうと色々やってみたんですが
わからなくて(エラー出たり明らかに間違ってそうだった) これは問題じゃないから答えもないからわからなくてなので教えてください

答え見たら公式?みたいになんとなくわかって似たような問題解けるかもだし
for文にするには初期化と更新の文を省略するだけです。って書いてたけどわからない

言い訳をいっぱいしたのは問題丸投げ批判されるのが怖かったからです

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

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

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

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

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

guest

回答6

0

ベストアンサー

答えを書いてしまいますと、こうなります。

c

1int money, month = 1; 2for(money = 1; money < 1000000; money*=2) { 3 printf("%02d 月目 : %7d 円\n",month,money); 4 month++; 5}

while文からfor文に直す問題をやるより前に、for文とはこう書くんだ、ということを学習していないんですか?
問題を解く以前に基礎がわかっていないと、「苦しんで覚える」という苦しむ意味が違ってしまうと思いますよ。

投稿2016/06/28 07:24

ttyp03

総合スコア16998

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

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

xxx

2016/06/28 09:42

回答ありがとうございます答えがなかったらできなかったです助かりましたありがとうございます month=1;とmonth++はfor()の中に入れてはいけないのですね  int i; for (i = 1;i <= 繰り返し回数;i++) { 繰り返す文; } 頑張ってを10回繰り返してくださいとか こういうのはこの型を見ながらですができます 基礎全然なので 基礎も引き続きします ありがとうございます 
ttyp03

2016/06/28 12:06

> month=1;とmonth++はfor()の中に入れてはいけないのですね いえ、そんなことはありませんよ。 カンマで区切れば複数かけます。 for(money = 1, month = 1; money < 1000000; money*=2, month++) { 書けるけどなんでも詰め込むとわかりづらくなるので私は書きません。 このループで主体となる(条件となる)変数のみを書くようにしています。 沢山プログラムを書いていけば自分のスタイルが出来上がっていくと思います。 色々なコードを参考にしてみてください。
xxx

2016/06/29 16:33

while文の時 int money,month=1は表示がおかしかったです int money=1,month=1じゃないとダメなんですね forの場合はint money,の部分はもうmoney=1にforの中で初期化されてるから書かなくて大丈夫なんですね  複数書いてみました 確かにかけました ありがとうございます
guest

0

質問者さまのいう「for文にするには初期化と更新の文を省略するだけです」というのは、以下のような形を指します。

Java

1while(money < 1000000) { 2} 3 4for(;money < 1000000;){ 5}

このwhileとforは全くの同じ意味です。初期化文、更新文を省略というのは、これら2つの文は「書かなくても構文エラーではない」ので、省略することが可能です。極論を言うとforは「条件文」すら省略できます。while文とfor文の構成は以下のようになっていることはすでに学習済みですか?

Java

1while(/*条件文*/) { // ←構文エラー。whileの条件文は必ず書かなければならない 2} 3 4for( /*初期化文*/ ; /*条件文*/ ; /*更新分*/ ) { // ←構文エラーではない。forはそれぞれ省略可 5 // breakしないかぎり無限にループする、全てを省略したfor文「for(;;){}」 6}

投稿2016/06/28 07:32

masaya_ohashi

総合スコア9206

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

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

xxx

2016/06/29 16:32

初期化; while (条件式) {   繰り返す文;   更新; } for (初期化;条件式;更新) { 繰り返す文; } 無限ループの時だけ初期化と更新を省略できるんですね 他はエラー出ました これとか for (i = 1;i <= 10;i++)
guest

0

C言語の場合、forwhileは、書き方の違いでしかありません。

C

1/* forでの書き方 */ 2for(1;2;3){ 3 ループの文; 4} 5 6/* whileでの書き方 */ 71; 8while(2){ 9 ループの文; 103; 11}

ここで、forの場合の式1、式2、式3はいずれも省略できますので、for(; 式2; )のようにすれば、whileのときと一致することがわかると思います。

なお、forで式2を省略した場合、条件は真であるとみなされます。そのため、for(;;)while(1)はどちらも無限ループになります。

投稿2016/06/28 07:27

maisumakun

総合スコア145184

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

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

xxx

2016/06/28 09:42

回答ありがとうございます 式1式2 式3なんだろうと思ったのですがサイトも見ていると 気づくことができました 初期化 条件式 更新 きっかけありがとうございます わかりやすかったです
guest

0

forとwhileは本質的には同じもので、少しforの方が一度に書けることが多い、というだけです。
forの方が書けることが多いと言っても、forの中に書く式は省略できますので、

C/C++

1while(1){ 2 ~~~ 3}

C/C++

1for(;;){ 2 ~~~ 3}

は全く同じ意味になります(実際全く同じようにコンパイルされます)。
ループなのでどちらも条件式を書けますが、条件式のみ書けるのがwhile、条件式に加え初期処理と更新処理も一度に書けるのがforというだけです。
まあ、もし分かりにくければ、とりあえずwhile(1)やfor(;;)というように無限ループにしてしまって、if文で条件式を中に書いてbreak;するというのもアリかもしれません(効率は悪いですが、理解はしやすいと思います)。
以下のような感じで。

C/C++

1int i=0; 2while(1){ 3 if(i<100){ 4 break; 5 } 6 i++; 7}

C/C++

1int i=0; 2for(;;){ 3 if(i<100){ 4 break; 5 } 6 i++; 7}

とりあえずこういうやり方でループに慣れたら、forやwhileのありがたみが分かると思うので、そうなったらもう大丈夫でしょう。

投稿2016/06/28 08:39

sk_sat

総合スコア20

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

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

xxx

2016/06/29 16:34

コメントありがとうございます
guest

0

for 文の基本形は次のようなものです。

C

1int i; 2for (i = 0; i < 100; i++) 3{ 4 //ループする内容 5}

最初のi=0は初期化です。
ループが始まる前に変数 i に 0 を代入しています。

次のi < 100は継続条件です。
ループの先頭で評価して、これが真でない場合、ループを終了します。

最後のi++はループ毎に行う処理です。

以上を while で表すと、次のようになります。

C

1int i = 0; 2while (i < 100) 3{ 4 //ループする内容 5 i++; 6}

投稿2016/06/28 07:31

編集2016/06/28 07:33
Zuishin

総合スコア28660

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

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

xxx

2016/06/29 16:34

コメントありがとうございます
guest

0

whileはbool型引数がtrueである場合、内部に指定された処理を実行する特性があります。
今回、質問者さんの投稿だと「moneyが1000000未満である場合」が真の条件で、それ以外が偽の条件となります。
一方、forに関しては「初期値を定義し、条件を満たすまでループする」という特性があります。
そのため、記述としては今回moneyは1からスタートなので、初期値1からスタートとし、特定の変数に演算処理を加え、条件を満たしていれば終了する、といった内容になります。

for(初期;条件;更新){ ここに処理 }

whileの場合だと

while( 条件 ){ ここに処理 }

あとは質問者さんの本文に答えはありますので、その点は考えてみてください。

###余談

めちゃくちゃ細かいことですが、

while (money < 1000000) {

printf("%02d 月目 に %d 円となり、100万円を超える。\n",month,money);

ここで少し内容が食い違っていると思います。
必要なことではないと思いますが、気になりました。

投稿2016/06/28 07:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

xxx

2016/06/28 09:42

回答ありがとうございます 例が ある小学生が、親に頼みました。 「今月は1円、来月は2円、再来月は4円と、 先月の倍額のおこずかいをちょうだい」 さて、親が払う金額が100万円を超えるのは何ヶ月目でしょうか? なので必要なんです なんで1000000超えてるのに最後のprint文は表示できるのでしょう print文もう一つ追加してみたけどそれは月もお金も増えないし
退会済みユーザー

退会済みユーザー

2016/06/28 10:00

いえ、揚げ足をとるわけではないのですが、 「1000000を超える」というのはプログラムとしては「1000000<n」となります。 今回の場合だと「1000000」を含む内容になっていたので、 その点の条件式の違いが気になった、といったかんじです。 質問者さんの場合、n<1000000の場合ループとしているので、 この場合だと1000000以上、ということになる、ということです。 (超える、の場合だとn<=1000000が正しいのでは、という指摘です)
xxx

2016/06/29 16:32

http://9cguide.appspot.com/10-01.html この例を使ったのですが間違ってるのですか あと最後のprintf("%02d 月目 に %7d 円となり、100万円を超える。\n",month,money); の部分はmoney<1000000なのに1048576円になって月も増えているのはmoney=money*2だからmoney*2のmoneyが1000000より小さかったらいいということ?そう考えた時その前の printf("%02d 月目 : %7d 円\n",month,money); money *= 2; month++; では20日524288で止まってて最後のprint文を付け加えないとmoney=money*2のmoney*2のところのmoneyが1000000寄り小さい時のmoney(1048576)=money(524288)*2 21日 1048576が表示されないのは何でだろうと思うし money=money*2の money= のmoneyが1000000より小さい時の場合 20日 524288で繰り返しが終わるのは理解できるのですが 最後のprint文が何で日付もお金も更新されるのかがわかりません print文を書いた回数だけ更新されるのかなと思って最後のprint文プラスもう一つprint文を書いてみたけど更新されないし何でだろうと思いました ぐちゃぐちゃのまとまってない汚い文ですが わからないことを言葉にして頑張って書いてみました このわからないはほうっておいていいんでしょうか わかってないと後々困る 重大な基礎的な考え?なのでしょうか
退会済みユーザー

退会済みユーザー

2016/06/30 01:22 編集

例題確認しました。 ------------------------------------------------------------------------ ある小学生が、親に頼みました。 「今月は1円、来月は2円、再来月は4円と、 先月の倍額のおこずかいをちょうだい」 さて、親が払う金額が100万円を超えるのは何ヶ月目でしょうか? ------------------------------------------------------------------------ 上記の文章だと、組まれたプログラムは誤りです。 今回のケースだと絶対にありえない(100万ジャストになることはない)ので、 気にする必要性はこの場合はありませんが、 正しく組むのであれば、提示されましたURLのサンプルは間違っています。 ※このあたりはプログラマとして凄い気になる些細な問題です。 ※100万ジャストの場合、「x月目 に 1000000円となり、100万円を超える。」という文章になるのがおかしい、という指摘です。今回のケースでは絶対的にありえませんが、言葉としておかしいし、実装内容とそぐわないね、というかんじです(大学のプログラミング講習だと、こういった部分をたまに見る教授もいます) >20日524288で止まってて はい、後ろにも表示のprintをおかないと表示されません。 これは while内ではprint表示したのちに演算処理を行っているからです。 >最後のprint文が何で日付もお金も更新されるのかがわかりません print後に計算しているからです。 今回のソースを日本語に直しますと 1. moneyとmonthを初期値1として定義 2. 1月目に1円 ←ここからwhile 3. moneyを2倍する 4. monthを+1する。 5. moneyが1000000を超える場合6へ、そうでない場合は2へ 6. n月目にm円となり、1000000を超える 上記のようになります。 print文はただの文字の出力です。 >printf("%02d 月目 に %7.0f 円となり、100万円を超える。\n",month,money); この後ろに >money *=2; >month++; を追加し、その後ろにさらに >printf("%02d 月目 に %7.0f 円。\n",month,money); と記載すれば、からくりはわかると思います。
xxx

2016/07/25 08:48 編集

moneyはmoney*2のmoneyではなくてmoney=のmoneyで 100万を超えても 最後のprint文は更新できて 更新の後(下)に書かれたprint文は上の更新をできる 1. moneyとmonthを初期値1として定義 2. 1月目に1円 ←ここからwhile 3. moneyを2倍する 4. monthを+1する。 5. moneyが1000000を超える場合6へ、そうでない場合は2へ print文1はmoney=のmoneyが1000000以下の最大の数値となった時まで繰り返される print文1はwhile文なので更新が下にあってもmoney monthの値が変わることができる? 6. n月目にm円となり、1000000を超える  print文2は直前(真上)の更新を実行する これが普通print文は上に更新がないと変わらない 上から順番に実行 下から上はできない ? であってるでしょうか こんなことでつまづいてるとこれだけに何時間使ってるんだと先が思いやられます 向いてないですよね 次々にわからないことが出てきて 7割くらい理解できたらいいのかな ここのサイトに質問してないわからないことっていっぱいあってでも いざ質問するのと回答に返信するのと考えるのとですごく時間経って結局なんにもほとんど進まないという プログラミングに限らず普通の学習でもこうなんですがわからないことを放っておいて先に進んだほうがいいとは思うんですが わからないことを許してもいいですよね だいぶ話が逸れました 愚痴部分はスルーしてください 独り言のように余計なことが書き出したら止まらなくて ありがとうございます  
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問