C++ 九九

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
がく
記事: 12
登録日時: 11年前

C++ 九九

#1

投稿記事 by がく » 11年前

すみません(/_;)
私は今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をしようしています。

ながながしい質問で申し訳ありません。

Priest
記事: 123
登録日時: 11年前
住所: 愛知

Re: C++ 九九

#2

投稿記事 by Priest » 11年前

がく さんが書きました:

コード:

	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に入る式を考えるだけです。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

がく
記事: 12
登録日時: 11年前

Re: C++ 九九

#3

投稿記事 by がく » 11年前

回答ありがとうございます(*´▽`*)

文字を三つに区切って出力するプログラム
何度やってもできません。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: C++ 九九

#4

投稿記事 by ISLe » 11年前

いまは
1 2 3 4 5 6 7 8 9(改行)
と出力しているのを
1 2 3(改行) 4 5 6(改行) 7 8 9(改行)
にする
というヒントでは分かりますか?

がく
記事: 12
登録日時: 11年前

Re: C++ 九九

#5

投稿記事 by がく » 11年前

度々ありがとうございます(/_;)
やっぱりできません。
そのように出力しようとすると、
1 2 3
1 2 3 4 5 6
1 2 3 4 5 6 7 8 9
このようになります。

Priest
記事: 123
登録日時: 11年前
住所: 愛知

Re: C++ 九九

#6

投稿記事 by Priest » 11年前

そのようになるソースコードをここに張り付けてくれませんか?

追記:
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文字の数字列の後に改行を入れて出力するプログラムを書いてここに張り付けてください。
最後に編集したユーザー Priest on 2013年6月09日(日) 18:42 [ 編集 2 回目 ]

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

がく
記事: 12
登録日時: 11年前

Re: C++ 九九

#7

投稿記事 by がく » 11年前

#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+)

Priest
記事: 123
登録日時: 11年前
住所: 愛知

Re: C++ 九九

#8

投稿記事 by Priest » 11年前

じゃあfor文の動作の理解を深めるために,for文で遊んでみましょう。

for文のかっこの中身をこうすると、どう出力されると思いますか?
for(i = 1; i<=9; i++)

123456789ですよね。

では、こうだとどうですか?
for(i = 1; i<=6; i++)

さらにはこれはどうですか?
for(i = 4; i<=6; i++)

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

box
記事: 2002
登録日時: 13年前

Re: C++ 九九

#9

投稿記事 by box » 11年前

がく さんが書きました: 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」に、
何か共通項はないでしょうか。

【ヒント】何かで割ったときのあまりが…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

がく
記事: 12
登録日時: 11年前

Re: C++ 九九

#10

投稿記事 by がく » 11年前

少し理解できました!

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');

と入力したらその通りになりました。

Priest
記事: 123
登録日時: 11年前
住所: 愛知

Re: C++ 九九

#11

投稿記事 by Priest » 11年前

エクセレントです.

では,それと同じ動作をする,だけどもうちょっとコンパクトなコードを目指してみましょう.
あなたがつくってくれたコードの一部分をピックアップして,
for(i = 1;i <= 3; i++){
  printf("%3d",i*1);
}
putchar('\n');

をさらにもう一個for文を使って,3回繰り返して,

1 2 3
1 2 3
1 2 3

と出力するプログラムを書いてみてください.

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

がく
記事: 12
登録日時: 11年前

Re: C++ 九九

#12

投稿記事 by がく » 11年前

3で割ったときの余りが0
ですか?

Priest
記事: 123
登録日時: 11年前
住所: 愛知

Re: C++ 九九

#13

投稿記事 by Priest » 11年前

そうです.
というわけで,

for( i = 1 ; i<=9 ; i++ ){
  printf("%3d", i);
  if(その条件) 改行;
}

という形でも

1 2 3
4 5 6
7 8 9

は作れますね。

for文を2回使う方法、こちらの方法、どちらでもおkだと思います!

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

がく
記事: 12
登録日時: 11年前

Re: C++ 九九

#14

投稿記事 by がく » 11年前

for(i = 1;i <= 9; i++){
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
return(0);
こんな感じでよいですか?
これを2の段3の段ずつ作って
いけばよいのですか?

box
記事: 2002
登録日時: 13年前

Re: C++ 九九

#15

投稿記事 by box » 11年前

がく さんが書きました: こんな感じでよいですか?
これを2の段3の段ずつ作って
いけばよいのですか?
思いついたら、コードを書いて実験してみましょう。
仮に一度でうまくいかないとしても、何も問題ありません。
うまくいかないことから学べることが必ずあるはずです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Priest
記事: 123
登録日時: 11年前
住所: 愛知

Re: C++ 九九

#16

投稿記事 by Priest » 11年前

がく さんが書きました:

コード:

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になるまで繰り返す"です!

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

がく
記事: 12
登録日時: 11年前

Re: C++ 九九

#17

投稿記事 by がく » 11年前

for(i = n1 ; i <= n2 ; i++){


for(i = 1;i <= 9; i++){
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
}
これで良いのでしょうか?
これより先がどうすればよいか
わかりません(/_;)

Priest
記事: 123
登録日時: 11年前
住所: 愛知

Re: C++ 九九

#18

投稿記事 by Priest » 11年前

がく さんが書きました:

コード:

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');を追加しないと表示がおかしくなりますね。

あと、コードを書いたら実行してみてくださいね?
さっきのは動かしてみたらおかしいのは分かるはずですよ。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

がく
記事: 12
登録日時: 11年前

Re: C++ 九九

#19

投稿記事 by がく » 11年前

ありがとうございます!
繰り返しの部分がやっとできました。

さっきの場合は無限ループに
なってしまう場合がありました(+o+)

Priest
記事: 123
登録日時: 11年前
住所: 愛知

Re: C++ 九九

#20

投稿記事 by Priest » 11年前

コード:

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",○○);を改変してみてください。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

がく
記事: 12
登録日時: 11年前

Re: C++ 九九

#21

投稿記事 by がく » 11年前

何の段から?: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  
となってしまいます(-"-)

超絶右留斗羅天才プログラマー
記事: 44
登録日時: 11年前

Re: C++ 九九

#22

投稿記事 by 超絶右留斗羅天才プログラマー » 11年前

他の方が丁寧に説明されているので、邪魔するのも悪いと思ったのですが…(ノ_・;)
正解のプログラムを作ってみました。
自力で解けず、どうしても分からなくなった場合は、こちらのスポイラーを表示で、プログラムを確認してみてください(^^♪
► スポイラーを表示
最後に編集したユーザー 超絶右留斗羅天才プログラマー on 2013年6月09日(日) 23:27 [ 編集 4 回目 ]
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%

Priest
記事: 123
登録日時: 11年前
住所: 愛知

Re: C++ 九九

#23

投稿記事 by Priest » 11年前

作ったコードを全部見せてください。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

がく
記事: 12
登録日時: 11年前

Re: C++ 九九

#24

投稿記事 by がく » 11年前

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');
}
}

}

ここまで作ってみて試したんですけど
うまくいきません。

Priest
記事: 123
登録日時: 11年前
住所: 愛知

Re: C++ 九九

#25

投稿記事 by Priest » 11年前

コード:

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",○○)の○○の正体です!

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

がく
記事: 12
登録日時: 11年前

Re: C++ 九九

#26

投稿記事 by がく » 11年前

やっとわかりました!

この説明でやっとわかりました。
とても迷惑をおけかけしました( 一一)

丁寧に説明してくれてありがとう
ございます。
もしよければまたわからないことを
質問させてください(*´▽`*)

Priest
記事: 123
登録日時: 11年前
住所: 愛知

Re: C++ 九九

#27

投稿記事 by Priest » 11年前

はい、お疲れさまでした(*´ω`*)

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: C++ 九九

#28

投稿記事 by みけCAT » 11年前

解決したら、完成したコードを貼っていただくのがルールです。
コードはcodeタグで囲んでいただかるとありがたいです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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