ピラミッドアートwhile文→for文へ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
リク

ピラミッドアートwhile文→for文へ

#1

投稿記事 by リク » 15年前

プログラムを作ることに意味がある・・・作り続け約6時間。自分の理解力のなさに絶望しました。
友達が参考にしてくれたプログラムや教科書を比べ合わせ、wordで文章作成までして作ったのですが、
まったく自分は理解できていないようです。なんとかできると思ったのですが、
皆さん。本当に申し訳ありません。もう一度お願いいたします。

私は、visual stdio2008を使っています。

友達が教えてくれた四角形のwhile文のピラミッドアートがあります。

#include<stdio.h>
void main(void)
{
 int gyou,retu,atai;
 printf("数字を入力してください");
 scanf("%d",&atai);
 gyou=0;①カウンタの初期化 
 while(gyou<atai)②条件式
{
 retu=0;①カウンタの初期化
 while(retu<atai){②条件式
 printf("*");④条件満たした場合の処理
 retu++;③→②カウンタの増減式+1,-1
}
 printf("\n");④条件満たした場合の処理
 gyou++;③→②カウンタの増減式+1,-1
}
}
これは、友達が教えてくれたものなので、きちんと四角形が表示されました。
そして、これをfor文に作り変えたいと思い、自分で作り変えたところ・・・{や、;のエラーが大量発生と
悲惨なことになってしまいました。

恐らくまったく、理解できてないと思いながらも、自分でwhile文を参考にfor文を作ってみました。
(①などの説明は私が書いたものなので、友達が間違えているわけではありません。)
けれど、どこが違うのか全くわからないんです。

for文
#include<stdio.h>
void main(void)
{
int gyou,retu,atai,;

for(gyou=0;gyou <atai;gyou ++)
{
for(retu=0;retu<=3;retu++)
printf(“*”);
}
printf("\n");
}

とりあえず、while文からにた箇所を抜粋して、そのままfor文に張り付けるという、自分でなんて考え方なんだと思うのですが、これ以上考え方が分からないのです。
本当に、全く理解力の乏しい物で申し訳ありません。
今日ずっと作っているのですが、、やはり自分で作ることができませんでした。

dic

Re:ピラミッドアートwhile文→for文へ

#2

投稿記事 by dic » 15年前

6時間ぶっつけでやっているなら一息休憩することをお勧めします

休憩後、やりたいことを紙にいったん書いてから
自分で自分に説明できてから
プログラムにするのがいいです

シエル

Re:ピラミッドアートwhile文→for文へ

#3

投稿記事 by シエル » 15年前

ataiに値が入ってないです。

ぜらーちん

Re:ピラミッドアートwhile文→for文へ

#4

投稿記事 by ぜらーちん » 15年前

{}が閉じられていない~

#include<stdio.h>
void main(void)
{
int gyou,retu,atai,;

for(gyou=0;gyou <atai;gyou ++)
{
for(retu=0;retu<=3;retu++) {
printf(“*”);
}
printf("\n");
}
}

前からある奴:黒、黄、ライム
付けくわえた奴:アクア、赤、青

対応する{}からーは↑の順番通り
色付けたほうが分かりやすいかな?と思ってつけて、
付けくわえた奴と前の奴分けたほうがいいかな?とか思ったら逆に見づらくなったかもしれない…

QERA

Re:ピラミッドアートwhile文→for文へ

#5

投稿記事 by QERA » 15年前

四角系のピラミッドアートですと
3と入力したら、縦横3で*が
***
***
***

と表示されます。(当たり前ですが)

もう一つのスレッドも少し見ましたが、リクさんがどこまで理解できているのか私には分かりません。

なので、whileからforに書き直すのが困難なのであれば、それぞれの意味や条件式を順を追って考えてみるといいと思います。

while文ですと

while(条件式){
  処理内容
  gyou++;
}
となります。

リクさんのコードでは
while(gyou<atai){
  処理内容
  gyou=gyou+1;
}

・ataiはユーザーに入力させる
・gyouを0に初期化する
・gyou++(gyou=gyou + 1と同じ意味)でgyouを1ずつ増やしていく

となっています。

ここで例えばユーザーが3と入力した場合、ataiに3が入ります。
また、gyouを初期化しているのでgyouに0が入ります。

これをwhile文の条件式にに数値で表してみると

while(0<3){
  処理内容
  gyou=gyou+1;
}

となります。

条件式が成り立っているのでまず1回目の処理が行われます。
処理内容にgyou=gyou+1とありますのでgyouが1になります。

すると次のwhile文は

while(1<3){
  処理内容
  gyou=gyou+1;
}

となります。

このように1つずつ増えていくといずれ・・・

while(4<3){
  処理内容
  gyou=gyou+1;
}

となると思います。
こうなると条件式が合っていないので、while文が抜けることになります。

これくらい分かるよ!と感じたのなら、余計なお節介だと思って下さい^^

長文失礼しました。頑張ってください。

リク

Re:ピラミッドアートwhile文→for文へ

#6

投稿記事 by リク » 15年前

ぴよぴよさん>while文についてとても分かりやすい説明、ありがとうございます。
      どこまで、わからないか・・・ですか、本当に恥ずかしいのですが、
ただ単に教科書のプログラムを打っているという感じで、このように、課題でピラミッドアートを作れと出題されても、先生や友達がヒントを下さらなければ、whileやforも思い浮かびませんでした。最初はループなのでは?と全く見当違いな方向に進んでいました。
いえいえ、本当に余計なお節介なんてとんでもないです。

もし、よろしければ、for文について教えていただけると助かります。友達が教えてくれた(記載しているwhile文は実行するときちんと四角形が表示されるのですが)これを元に自分で考えたfor文がエラーが大量表示されてしまい、全くもって手がつきません。ほかの皆様の回答をもとに作りなおしてみたのですが、エラー表示のままですし、自分の作ったfor文が見当違いと予測はつくのですが、どこが違うのか・・・
while文をfor文に作り直す方法を教えてくださると助かります。

ちょっと通りますよ

Re:ピラミッドアートwhile文→for文へ

#7

投稿記事 by ちょっと通りますよ » 15年前

考え方も悪くないし、イージーミスが非常に惜しいですね。
例えば↓これですが
while(retu<atai)
for文に直すのは簡単です
for(;retu<atai;) //whileとまったく同じ意味です、これで動きます

後は想像された通り、retu(カウンタ変数)をfor文に取り込みます
for(retu=0;retu<atai;)//この形でも動きます

次にretu(カウンタ変数)の更新文を取り込みます
for(retu=0;retu<atai; retu++) //見なれた形になりました

リク

Re:ピラミッドアートwhile文→for文へ

#8

投稿記事 by リク » 15年前

ぴよぴよさん>

もう一度、やってみました。

#include<stdio.h>
void main(void)

{
int gyou,retu,atai,;

printf("数字を入力してください");
scanf("%d",&atai);

for(gyou=0;gyou <atai;gyou ++)
{
for(retu=0;retu<atai;retu++)
{
printf(“*”);
}
printf("\n");
}
}

------ すべてのリビルド開始: プロジェクト: pp, 構成: Debug Win32 ------
プロジェクト 'pp'、構成 'Debug|Win32' の中間出力ファイルを削除しています。
コンパイルしています...
po.cpp
c:\users\documents\cl11\pp\pp\po.cpp(7) : error C2146: 構文エラー : ';' が、識別子 'printf' の前に必要です。
c:\users\documents\cl11\pp\pp\po.cpp(8) : error C2065: 'atai' : 定義されていない識別子です。
c:\users\documents\cl11\pp\pp\po.cpp(10) : error C2065: 'gyou' : 定義されていない識別子です。
c:\users\documents\cl11\pp\pp\po.cpp(10) : error C2146: 構文エラー : ';' が、識別子 ';gyou' の前に必要です。
c:\users\documents\cl11\pp\pp\po.cpp(10) : error C2065: ';gyou' : 定義されていない識別子です。
c:\users\documents\cl11\pp\pp\po.cpp(10) : error C2065: 'atai;gyou' : 定義されていない識別子です。
c:\users\documents\cl11\pp\pp\po.cpp(10) : error C2143: 構文エラー : ';' が ')' の前にありません。
c:\users\documents\cl11\pp\pp\po.cpp(12) : error C2065: 'retu' : 定義されていない識別子です。
c:\usersdocuments\cl11\pp\pp\po.cpp(12) : error C2146: 構文エラー : ';' が、識別子 ';retu' の前に必要です。
c:\users\documents\cl11\pp\pp\po.cpp(12) : error C2065: ';retu' : 定義されていない識別子です。
c:\users\documents\cl11\pp\pp\po.cpp(12) : error C2065: 'atai;retu' : 定義されていない識別子です。
c:\users\documents\cl11\pp\pp\po.cpp(12) : error C2143: 構文エラー : ';' が ')' の前にありません。
c:\users\documents\cl11\pp\pp\po.cpp(14) : error C2065: '“*”' : 定義されていない識別子です。
c:\users\documents\cl11\pp\pp\po.cpp(15) : error C2146: 構文エラー : ';' が、識別子 ';' の前に必要です。
c:\users\documents\cl11\pp\pp\po.cpp(15) : error C2065: ';' : 定義されていない識別子です。
c:\users\documents\cl11\pp\pp\po.cpp(15) : error C2143: 構文エラー : ';' が '}' の前にありません。
ビルドログは "file://c:\Users\Documents\CL11\pp\pp\Debug\BuildLog.htm" に保存されました。
pp - エラー 16、警告 0
========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========





作ってみたところ、エラーが17個中、16個になりました。

シエル

Re:ピラミッドアートwhile文→for文へ

#9

投稿記事 by シエル » 15年前

ataiの後ろにいらんカンマがある。

DVDM

Re:ピラミッドアートwhile文→for文へ

#10

投稿記事 by DVDM » 15年前

>>リクさん
全角のセミコロン(;)や、ダブルクォーテーション(””)が使われてる見たいですので
半角に直してみましょう。

[color=gray>> int gyou,retu,atai,; [/color]
atai の後の , も要らないので消してみて下さい。

ぜらーちん

Re:ピラミッドアートwhile文→for文へ

#11

投稿記事 by ぜらーちん » 15年前

テスト用変数
int lcnt = 0; //ループ用のカウンター
int max = 10; //ループする回数の上限

whileとforの違い

whileの場合

while( lcnt < max ){ //(lcntがmax以上になるまでループ)
lcnt = lcnt + 1; //カウンターを1増やします(lcnt++と同じ)
}

forの場合

for(lcnt = 0; lcnt < max; lcnt++){

}

簡単に書くと
forの場合はループ用のカウンターをループ内に書かなくてOKだし
ループ用の変数の初期値を決められる(lcnt = 0でも1でもok;)

別に入れなくておkならそこは省いて ; でOK

だからwhile→forにするのであれば、while内で回しているカウンターを消して
for文の中に入れてしまえばいい

リク

Re:ピラミッドアートwhile文→for文へ

#12

投稿記事 by リク » 15年前

シエルさん>教えてくださりありがとうございます。確かにありました。助かりました!

DVDMさん>本当にありがとうございます。朝からずっとやっているせいなのか、
     全角など全く考えもしませんでした。
    DVDMさんのおかげで、エラーがなくなりました。

シエルさんや、DVDMさんに教えていただきやった結果。

#include<stdio.h>
void main(void)
{
int gyou,retu,atai;

for(gyou=0;gyou <atai;gyou ++)
{
for(retu=0;retu<atai; retu++) {
printf("*");
}
printf("\n");
}
}


------ すべてのリビルド開始: プロジェクト: nnn, 構成: Debug Win32 ------
プロジェクト 'nnn'、構成 'Debug|Win32' の中間出力ファイルを削除しています。
コンパイルしています...
ppp.cpp
c:\users\documents\nnn\nnn\ppp.cpp(6) : warning C4700: 初期化されていないローカル変数 'atai' が使用されます
マニフェストをリソースにコンパイルしています...
Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
Copyright (C) Microsoft Corporation. All rights reserved.
リンクしています...
LINK : 前回のインクリメンタル リンクで C:\Users\Documents\\nnn\Debug\nnn.exe が見つからなかったか、ビルドされませんでした。フル リンクを行います。
マニフェストを埋め込んでいます...
Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
Copyright (C) Microsoft Corporation. All rights reserved.
ビルドログは "file://c:\Users\Documents\\nnn\nnn\Debug\BuildLog.htm" に保存されました。
nnn - エラー 0、警告 1
========== すべてリビルド: 1 正常終了、0 失敗、0 スキップ ==========

と表示され、エラーはなくなったのですが、デバックエラーが発生してしまいます。

シエル

Re:ピラミッドアートwhile文→for文へ

#13

投稿記事 by シエル » 15年前

あれ?scanfが消えてる?

リク

Re:ピラミッドアートwhile文→for文へ

#14

投稿記事 by リク » 15年前

ででで・・・できました!!シエルさん指摘ありがとうございました!

今日、ずっとプログラムを作り続けて、9時間・・・
皆様のおかげでなんとか報われました。
本当に、ありがとうございます。

私は、本当にC言語が苦手で、他の質問サイト様にも質問などさせていただいていたのですが、
馬鹿じゃないの?そんなこともできないなんて、学校辞めたほうがいいんじゃない?など、
言われ、かなり凹んでいました。

けれど、皆様はこんな私のために、最後までアドバイスしてくださいました。
本当にありがとうございます。全くC言語を理解していない私に付き合ってくださり、
言葉で言い尽くせないほど、感謝の気持ちでいっぱいです。
また、質問に来た時には、教えていただけると嬉しいです。


閉鎖

“C言語何でも質問掲示板” へ戻る