C++ 九九
C++ 九九
すみません(/_;)
私は今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をしようしています。
ながながしい質問で申し訳ありません。
私は今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++ 九九
# なんか表示が変になる
つまり、あなたは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文は のように、n1~n2の間繰り返すようにしましょう。
あとは、Printf("%3d", xxxxx); のxxxxxに入る式を考えるだけです。
Re: C++ 九九
いまは
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(改行)
と出力しているのを
1 2 3(改行) 4 5 6(改行) 7 8 9(改行)
にする
というヒントでは分かりますか?
Re: C++ 九九
度々ありがとうございます(/_;)
やっぱりできません。
そのように出力しようとすると、
1 2 3
1 2 3 4 5 6
1 2 3 4 5 6 7 8 9
このようになります。
やっぱりできません。
そのように出力しようとすると、
1 2 3
1 2 3 4 5 6
1 2 3 4 5 6 7 8 9
このようになります。
Re: C++ 九九
そのようになるソースコードをここに張り付けてくれませんか?
追記:
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文字の数字列の後に改行を入れて出力するプログラムを書いてここに張り付けてください。
追記:
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 回目 ]
Re: C++ 九九
#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+)
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++ 九九
じゃあfor文の動作の理解を深めるために,for文で遊んでみましょう。
for文のかっこの中身をこうすると、どう出力されると思いますか?
for(i = 1; i<=9; i++)
123456789ですよね。
では、こうだとどうですか?
for(i = 1; i<=6; i++)
さらにはこれはどうですか?
for(i = 4; i<=6; i++)
for文のかっこの中身をこうすると、どう出力されると思いますか?
for(i = 1; i<=9; i++)
123456789ですよね。
では、こうだとどうですか?
for(i = 1; i<=6; i++)
さらにはこれはどうですか?
for(i = 4; i<=6; i++)
Re: C++ 九九
ここでは、がく さんが書きました: 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++ 九九
少し理解できました!
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');
と入力したらその通りになりました。
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++ 九九
エクセレントです.
では,それと同じ動作をする,だけどもうちょっとコンパクトなコードを目指してみましょう.
あなたがつくってくれたコードの一部分をピックアップして,
for(i = 1;i <= 3; i++){
printf("%3d",i*1);
}
putchar('\n');
をさらにもう一個for文を使って,3回繰り返して,
1 2 3
1 2 3
1 2 3
と出力するプログラムを書いてみてください.
では,それと同じ動作をする,だけどもうちょっとコンパクトなコードを目指してみましょう.
あなたがつくってくれたコードの一部分をピックアップして,
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++ 九九
そうです.
というわけで,
for( i = 1 ; i<=9 ; i++ ){
printf("%3d", i);
if(その条件) 改行;
}
という形でも
1 2 3
4 5 6
7 8 9
は作れますね。
for文を2回使う方法、こちらの方法、どちらでもおkだと思います!
というわけで,
for( i = 1 ; i<=9 ; i++ ){
printf("%3d", i);
if(その条件) 改行;
}
という形でも
1 2 3
4 5 6
7 8 9
は作れますね。
for文を2回使う方法、こちらの方法、どちらでもおkだと思います!
Re: C++ 九九
for(i = 1;i <= 9; i++){
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
return(0);
こんな感じでよいですか?
これを2の段3の段ずつ作って
いけばよいのですか?
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
return(0);
こんな感じでよいですか?
これを2の段3の段ずつ作って
いけばよいのですか?
Re: C++ 九九
思いついたら、コードを書いて実験してみましょう。がく さんが書きました: こんな感じでよいですか?
これを2の段3の段ずつ作って
いけばよいのですか?
仮に一度でうまくいかないとしても、何も問題ありません。
うまくいかないことから学べることが必ずあるはずです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: C++ 九九
はい、これで、
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文は を使用してくださいね。
"iについて、n1からn2になるまで繰り返す"です!
Re: C++ 九九
for(i = n1 ; i <= n2 ; i++){
for(i = 1;i <= 9; i++){
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
}
これで良いのでしょうか?
これより先がどうすればよいか
わかりません(/_;)
for(i = 1;i <= 9; i++){
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
}
これで良いのでしょうか?
これより先がどうすればよいか
わかりません(/_;)
Re: C++ 九九
ああ、ごめんなさい。
変数iが両for文に使われてしまっていますね。
for(j = n1 ; j <= n2 ; j++){
for(i = 1;i <= 9; i++){
printf("%3d",i);
if(i%3==0){
putchar('\n');
}
}
}
あと、適切なところにputchar('\n');を追加しないと表示がおかしくなりますね。
あと、コードを書いたら実行してみてくださいね?
さっきのは動かしてみたらおかしいのは分かるはずですよ。
Re: C++ 九九
ありがとうございます!
繰り返しの部分がやっとできました。
さっきの場合は無限ループに
なってしまう場合がありました(+o+)
繰り返しの部分がやっとできました。
さっきの場合は無限ループに
なってしまう場合がありました(+o+)
Re: C++ 九九
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++ 九九
何の段から?: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
となってしまいます(-"-)
何の段まで?: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++ 九九
他の方が丁寧に説明されているので、邪魔するのも悪いと思ったのですが…(ノ_・;)
正解のプログラムを作ってみました。
自力で解けず、どうしても分からなくなった場合は、こちらのスポイラーを表示で、プログラムを確認してみてください(^^♪
正解のプログラムを作ってみました。
自力で解けず、どうしても分からなくなった場合は、こちらのスポイラーを表示で、プログラムを確認してみてください(^^♪
► スポイラーを表示
最後に編集したユーザー 超絶右留斗羅天才プログラマー on 2013年6月09日(日) 23:27 [ 編集 4 回目 ]
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%
Re: C++ 九九
作ったコードを全部見せてください。
Re: C++ 九九
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');
}
}
}
ここまで作ってみて試したんですけど
うまくいきません。
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++ 九九
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",○○)の○○の正体です!
Re: C++ 九九
やっとわかりました!
この説明でやっとわかりました。
とても迷惑をおけかけしました( 一一)
丁寧に説明してくれてありがとう
ございます。
もしよければまたわからないことを
質問させてください(*´▽`*)
この説明でやっとわかりました。
とても迷惑をおけかけしました( 一一)
丁寧に説明してくれてありがとう
ございます。
もしよければまたわからないことを
質問させてください(*´▽`*)
Re: C++ 九九
はい、お疲れさまでした(*´ω`*)
Re: C++ 九九
解決したら、完成したコードを貼っていただくのがルールです。
コードはcodeタグで囲んでいただかるとありがたいです。
コードはcodeタグで囲んでいただかるとありがたいです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)