ページ 1 / 1
C++ 九九
Posted: 2013年6月09日(日) 14:33
by がく
すみません(/_;)
私は今C++でfor文などを使用して九九の表を
作っています。始めのおそらく基礎となる部分はできているの
ですが、「わからないのは指定された段から段までの九九を、
三つずつ表示する」ということです。
何の段から?:2
何の段まで?:4
2 4 6
8 10 12
14 16 18
3 6 9
12 15 18
21 24 27
4 8 12
16 20 24
28 32 36
こんな感じのものを作りたいの
ですが。どういう風に作っていけば
いいかわかりません。
自分で出来ているのは
この位です。
#include<stdio.h>
int main(void)
{
int i,j,n1,n2;
printf("何の段から?:"); scanf("%d",&n1);
printf("何の段まで?:"); scanf("%d",&n2);
for(i = 1;i <= 9; i++){
for(j = 1; j <=9; j++)
printf("%3d",i*j);
putchar('\n');
}
return(0);
}
どうすれは良いのか教示願いいたします。
Microsoft Visual C++ 2010 Expressをしようしています。
ながながしい質問で申し訳ありません。
Re: C++ 九九
Posted: 2013年6月09日(日) 16:05
by Priest
がく さんが書きました:
コード:
for(i = 1;i <= 9; i++){
for(j = 1; j <=9; j++)
printf("%3d",i*j);
putchar('\n');
}
# なんか表示が変になる
つまり、あなたは1の段から9の段まで順番に出力することができているということですね。
では、その中の1の段だけを取り出して、
1 2 3 4 5 6 7 8 9
とだけ出力するプログラムを書いてみてください。
(for文を1回使ってください)
次に、
その文字を3つに区切って出力するプログラムに改良してみてください(for文を2回使ってください)
1 2 3
4 5 6
7 8 9
ここまできたら、それを複数回(=n2 - n1 + 1)繰り返すプログラムに改良してみてください(for文を3回使ってください)
何の段から?:2
何の段まで?:4
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
ここでのポイントは一番外側のfor文は
コード:
for(i = n1 ; i <= n2 ; i++)
のように、n1~n2の間繰り返すようにしましょう。
あとは、Printf("%3d", xxxxx); のxxxxxに入る式を考えるだけです。
Re: C++ 九九
Posted: 2013年6月09日(日) 17:08
by がく
回答ありがとうございます(*´▽`*)
文字を三つに区切って出力するプログラム
何度やってもできません。
Re: C++ 九九
Posted: 2013年6月09日(日) 17:20
by ISLe
いまは
1 2 3 4 5 6 7 8 9(改行)
と出力しているのを
1 2 3(改行) 4 5 6(改行) 7 8 9(改行)
にする
というヒントでは分かりますか?
Re: C++ 九九
Posted: 2013年6月09日(日) 18:16
by がく
度々ありがとうございます(/_;)
やっぱりできません。
そのように出力しようとすると、
1 2 3
1 2 3 4 5 6
1 2 3 4 5 6 7 8 9
このようになります。
Re: C++ 九九
Posted: 2013年6月09日(日) 18:21
by Priest
そのようになるソースコードをここに張り付けてくれませんか?
追記:
1 2 3 4 5 6 7 8 9
と出力するソースコードは,ご存知の通り
for( i = 1 ; i <= 9 ; i++ ){
printf("%3d",i);
}
ですよね。
問題の
1 2 3
4 5 6
7 8 9
ですが,考え方としては,"(3文字の列の後に改行を入れる)を3回繰り返す"ことになりますね
では,前段階として,3文字の数字列の後に改行を入れて出力するプログラムを書いてここに張り付けてください。
Re: C++ 九九
Posted: 2013年6月09日(日) 18:37
by がく
#include<stdio.h>
int main(void)
{
int i,j,n1,n2;
printf("何の段から?:"); scanf("%d",&n1);
printf("何の段まで?:"); scanf("%d",&n2);
for(i = 1;i <= 3; i++){
printf("%3d",i*1);
}
putchar('\n');
for(i = 1;i <=6; i++){
printf("%3d",i*1);
}
putchar('\n');
for(i = 1;i <=9; i++){
printf("%3d",i*1);
}
putchar('\n');
return(0);
}
何とか改行しようと思って考えたんですけど
こんなかたちになってしまいました(+o+)
Re: C++ 九九
Posted: 2013年6月09日(日) 18:48
by Priest
じゃあfor文の動作の理解を深めるために,for文で遊んでみましょう。
for文のかっこの中身をこうすると、どう出力されると思いますか?
for(i = 1; i<=9; i++)
123456789ですよね。
では、こうだとどうですか?
for(i = 1; i<=6; i++)
さらにはこれはどうですか?
for(i = 4; i<=6; i++)
Re: C++ 九九
Posted: 2013年6月09日(日) 18:58
by box
がく さんが書きました:
2 4 6
8 10 12
14 16 18
ここでは、
2 × 1 ~ 2 × 3
2 × 4 ~ 2 × 6
2 × 7 ~ 2 × 9
の順に出力しています。かける数が3, 6, 9のところで改行しています。
3の段、4の段も同じ理屈ですね。
さて、「かける数が3, 6, 9のところで改行する」の「3, 6, 9」に、
何か共通項はないでしょうか。
【ヒント】何かで割ったときのあまりが…。
Re: C++ 九九
Posted: 2013年6月09日(日) 19:00
by がく
少し理解できました!
for文の内容を、
for(i = 1;i <= 3; i++){
printf("%3d",i*1);
}
putchar('\n');
for(i = 4;i <=6; i++){
printf("%3d",i*1);
}
putchar('\n');
for(i = 7;i <=9; i++){
printf("%3d",i*1);
}
putchar('\n');
と入力したらその通りになりました。
Re: C++ 九九
Posted: 2013年6月09日(日) 19:11
by Priest
エクセレントです.
では,それと同じ動作をする,だけどもうちょっとコンパクトなコードを目指してみましょう.
あなたがつくってくれたコードの一部分をピックアップして,
for(i = 1;i <= 3; i++){
printf("%3d",i*1);
}
putchar('\n');
をさらにもう一個for文を使って,3回繰り返して,
1 2 3
1 2 3
1 2 3
と出力するプログラムを書いてみてください.
Re: C++ 九九
Posted: 2013年6月09日(日) 19:16
by がく
3で割ったときの余りが0
ですか?
Re: C++ 九九
Posted: 2013年6月09日(日) 19:24
by Priest
そうです.
というわけで,
for( i = 1 ; i<=9 ; i++ ){
printf("%3d", i);
if(その条件) 改行;
}
という形でも
1 2 3
4 5 6
7 8 9
は作れますね。
for文を2回使う方法、こちらの方法、どちらでもおkだと思います!
Re: C++ 九九
Posted: 2013年6月09日(日) 19:39
by がく
for(i = 1;i <= 9; i++){
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
return(0);
こんな感じでよいですか?
これを2の段3の段ずつ作って
いけばよいのですか?
Re: C++ 九九
Posted: 2013年6月09日(日) 19:45
by box
がく さんが書きました:
こんな感じでよいですか?
これを2の段3の段ずつ作って
いけばよいのですか?
思いついたら、コードを書いて実験してみましょう。
仮に一度でうまくいかないとしても、何も問題ありません。
うまくいかないことから学べることが必ずあるはずです。
Re: C++ 九九
Posted: 2013年6月09日(日) 19:48
by Priest
がく さんが書きました:
コード:
for(i = 1;i <= 9; i++){
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
はい、これで、
1 2 3
4 5 6
7 8 9
は出来ましたね。
次は、これ全体を囲む感じで、for文を追加し、
Priest さんが書きました:
ここまできたら、それを複数回(=n2 - n1 + 1)繰り返すプログラムに改良してみてください(for文を32回使ってください)
何の段から?:2
何の段まで?:4
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
となるコードを書いてください。
今回追加するfor文は
コード:
for(i = n1 ; i <= n2 ; i++)
を使用してくださいね。
"iについて、n1からn2になるまで繰り返す"です!
Re: C++ 九九
Posted: 2013年6月09日(日) 20:59
by がく
for(i = n1 ; i <= n2 ; i++){
for(i = 1;i <= 9; i++){
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
}
これで良いのでしょうか?
これより先がどうすればよいか
わかりません(/_;)
Re: C++ 九九
Posted: 2013年6月09日(日) 21:11
by Priest
がく さんが書きました:
コード:
for(i = n1 ; i <= n2 ; i++){
for(i = 1;i <= 9; i++){
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
}
ああ、ごめんなさい。
変数iが両for文に使われてしまっていますね。
コード:
for(j = n1 ; j <= n2 ; j++){
for(i = 1;i <= 9; i++){
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
}
のように片方をjに変えておきましょう。
あと、適切なところにputchar('\n');を追加しないと表示がおかしくなりますね。
あと、コードを書いたら実行してみてくださいね?
さっきのは動かしてみたらおかしいのは分かるはずですよ。
Re: C++ 九九
Posted: 2013年6月09日(日) 21:19
by がく
ありがとうございます!
繰り返しの部分がやっとできました。
さっきの場合は無限ループに
なってしまう場合がありました(+o+)
Re: C++ 九九
Posted: 2013年6月09日(日) 21:31
by Priest
コード:
for(j = n1 ; j <= n2 ; j++){
for(i = 1;i <= 9; i++){
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
putchar('\n');
}
さて、終盤ですね。
このコードでは、n1に2、n2に4を入れても、
1 2 3
4 5 6
7 8 9
と出てしまうと思います。
何故かというと、printf("%3d",
i);だからです。
for(i = 1;i <= 9; i++) で、iの値が1から9まで増えていくからですね。
このように、iを使って1の段を表現しています。
2の段を表現するにはprintf("%3d",
i*2);とするのはわかりますか?
3の段はprintf("%3d",
i*3);ですね?
では、ここまでを踏まえて、
n1からn2の段を表示するプログラムになるように、printf("%3d",
○○);を改変してみてください。
Re: C++ 九九
Posted: 2013年6月09日(日) 22:46
by がく
何の段から?:1
何の段まで?:2
と入力すると
1 2 3
4 5 6
7 8 9
2 4 6 8 10 12 14 16 18 1 2 3
4 5 6
7 8 9
2 4 6 8 10 12 14 16 18
となってしまいます(-"-)
Re: C++ 九九
Posted: 2013年6月09日(日) 22:49
by 超絶右留斗羅天才プログラマー
他の方が丁寧に説明されているので、邪魔するのも悪いと思ったのですが…(ノ_・;)
正解のプログラムを作ってみました。
自力で解けず、どうしても分からなくなった場合は、こちらのスポイラーを表示で、プログラムを確認してみてください(^^♪
► スポイラーを表示
コード:
#include<stdio.h>
int main(void)
{
int i,j,n1,n2;
printf("何の段から?:");scanf("%d",&n1);
printf("何の段まで?:");scanf("%d",&n2);
for(i=n1;i<=n2;i++){
for(j=1;j<=9;j++){
printf("%3d",i*j);
// 3回毎に改行を挿入します
if(j%3==0)
putchar('\n');//←表示がおかしくなっていた場合、元のブログラムから引用してください
}
putchar('\n');//←表示がおかしくなっていた場合、元のプログラムから引用してください
}
return(0);
}
Re: C++ 九九
Posted: 2013年6月09日(日) 22:49
by Priest
作ったコードを全部見せてください。
Re: C++ 九九
Posted: 2013年6月09日(日) 22:59
by がく
for(j = n1 ; j<= n2 ; j++){
for(i = 1;i <= 9; i++){
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
for(t=1;t<=9;t++){
printf("%3d",t*2);
if(i%3==0){
putchar('\n');
}
}
}
ここまで作ってみて試したんですけど
うまくいきません。
Re: C++ 九九
Posted: 2013年6月09日(日) 23:12
by Priest
コード:
for(j = n1 ; j <= n2 ; j++){
for(i = 1;i <= 9; i++){
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
putchar('\n');
}
実は、このコードのprintf("%3d",i);のiの式だけを適切なものに変えてあげればそれで目的の動作をするようになるのですよ。
コード:
// jは最初はn1(=2とする)で、 j <= n2 (n2=3とする)を満たす間、ループしますよね?
// なので、繰り返しの最初の変数の値は、i=1, j=2ですね。 この時の、出力値として望ましいのは、"2"の段の"1"番目ですから2*1=2ですよね?
// ではそのあとの動きを見てみましょう。
iの値 jの値 出力したい値
1 2 2
2 2 4
… … …
9 2 18
1 3 3
… … …
9 3 27
ここの段階でj=4となり、ループを抜けることになります。
(j<=n2を満たさなくなるので)
さて、この図の"出力したい値"がprintf("%3d",○○)の○○の正体です!
Re: C++ 九九
Posted: 2013年6月09日(日) 23:38
by がく
やっとわかりました!
この説明でやっとわかりました。
とても迷惑をおけかけしました( 一一)
丁寧に説明してくれてありがとう
ございます。
もしよければまたわからないことを
質問させてください(*´▽`*)
Re: C++ 九九
Posted: 2013年6月09日(日) 23:40
by Priest
はい、お疲れさまでした(*´ω`*)
Re: C++ 九九
Posted: 2013年6月10日(月) 21:48
by みけCAT
解決したら、完成したコードを貼っていただくのがルールです。
コードはcodeタグで囲んでいただかるとありがたいです。