入門書でわからないところが…
入門書でわからないところが…
はじめまして。
C言語の入門書で勉強しているものです。
もっと頑張ってゲームを作っていこうと思うのですが最近勉強し始めた初心者です。
タイトル通りわからないところが出てきて自分でも2時間ほど頑張ったのですがわかりません。
------------------演習---------------------
ピラミッドを作ります。
何段ですか。3
*
***
*****
-------------------------------------------
このような表示にしたいんです。 何段ですか→数字はキーボードからの入力です。
空白の数を上手にあらわせれなくて困っています。
for文を使うのは何となくわかるんですが…。
説明わかりずらくてすみません。
-------------------------------------
#include <stdio.h>
int main(void){
int i, j, no1;
printf("何段ですか:"); scanf("%d", &no1);
/*自分でもfor文を試行錯誤してみましたがわからないです;;*/
return 0;
}
C言語の入門書で勉強しているものです。
もっと頑張ってゲームを作っていこうと思うのですが最近勉強し始めた初心者です。
タイトル通りわからないところが出てきて自分でも2時間ほど頑張ったのですがわかりません。
------------------演習---------------------
ピラミッドを作ります。
何段ですか。3
*
***
*****
-------------------------------------------
このような表示にしたいんです。 何段ですか→数字はキーボードからの入力です。
空白の数を上手にあらわせれなくて困っています。
for文を使うのは何となくわかるんですが…。
説明わかりずらくてすみません。
-------------------------------------
#include <stdio.h>
int main(void){
int i, j, no1;
printf("何段ですか:"); scanf("%d", &no1);
/*自分でもfor文を試行錯誤してみましたがわからないです;;*/
return 0;
}
Re:入門書でわからないところが…
1234567 1 ***o*** 2 **ooo** 3 *ooooo* 4 ooooooo 上記のような図を書いてみて、座標と表示されてある文字との関連を考えてみてください。
#include <stdio.h>
int main(void)
{
int i, j, no1;
printf("何段ですか:");
scanf("%d", &no1);
for (j = 0; j < no1; ++j)
{
for (i = 0; i < no1 * 2 - 1; ++i)
{
if (i < no1 - j - 1 || i > no1 + j - 1)
{
printf(" ");
}
else
{
printf("o");
}
}
printf("\n");
}
return 0;
}
Re:入門書でわからないところが…
>>たいちうさん コメントありがとうございます
#include <stdio.h>
int main(void){
int i, j, no1;
printf("何段ですか"); scanf("%d", &no1);
for(j = 1; j <= no1; no1++){
for(i = 1; i <= j; i++)
printf("*");
j += 2;
putchar('\n');
}
return 0;
}
こんな感じでいいですか?
試してみると出来てはいるんですが、少し納得いかない書き方です。
出来れば綺麗な書き方教えてください。
>>バグさん コメントありがとうございます
if (i < no1 - j - 1 || i > no1 + j - 1)
ここの部分の計算で
i > no1 + j - 1 では真ん中から右側の空白を作っているのは分かるんですが、
i < no1 - j - 1 こちらの場合 no1が4の時に
1 < 4 - 1 - 1 で 1 < 2 で1になるのは分かりますが
二順目で
2 < 4 - 1 - 1 で 2 < 2 になると0になるのではと疑問に思っています。
コンパイルして実行してみるとしっかりとピラミッド作れているのに…
なぜこうなるのか分かりません。
できれば、回答いただきたいです。
#include <stdio.h>
int main(void){
int i, j, no1;
printf("何段ですか"); scanf("%d", &no1);
for(j = 1; j <= no1; no1++){
for(i = 1; i <= j; i++)
printf("*");
j += 2;
putchar('\n');
}
return 0;
}
こんな感じでいいですか?
試してみると出来てはいるんですが、少し納得いかない書き方です。
出来れば綺麗な書き方教えてください。
>>バグさん コメントありがとうございます
if (i < no1 - j - 1 || i > no1 + j - 1)
ここの部分の計算で
i > no1 + j - 1 では真ん中から右側の空白を作っているのは分かるんですが、
i < no1 - j - 1 こちらの場合 no1が4の時に
1 < 4 - 1 - 1 で 1 < 2 で1になるのは分かりますが
二順目で
2 < 4 - 1 - 1 で 2 < 2 になると0になるのではと疑問に思っています。
コンパイルして実行してみるとしっかりとピラミッド作れているのに…
なぜこうなるのか分かりません。
できれば、回答いただきたいです。
Re:入門書でわからないところが…
> こんな感じでいいですか?
> 試してみると出来てはいるんですが、少し納得いかない書き方です。
> 出来れば綺麗な書き方教えてください。
jとno1の使い方がトリッキーですね。
int len;を導入して、次の形にしてください。
no1を固定して、jのみをループ変数にします。
> 試してみると出来てはいるんですが、少し納得いかない書き方です。
> 出来れば綺麗な書き方教えてください。
jとno1の使い方がトリッキーですね。
int len;を導入して、次の形にしてください。
no1を固定して、jのみをループ変数にします。
for (j = 1; j <= no1; j++) { len = ???; // jを元に計算 for (i = 1; i <= len; i++) printf("*"); putchar('\n'); }
Re:入門書でわからないところが…
>>バグさん
見落としていました。
次からは気をつけて小さなミスをなくしてこうと思います。
手取り足取りありがとうございます。
for (i < no1 - j - 1 || i > no1 + j - 1)
これ思いつかなかったです。 悔しかった。;;
>>たいちうさん
#include <stdio.h>
int main(void){
int i, j, no1, len = 1;
printf("何段ですか"); scanf("%d", &no1);
for (j = 1; j <= no1; j++) {
len = j * 2 - 1;
for (i = 1; i <= len; i++)
printf("*");
putchar('\n');
}
return 0;
}
これでいいのかな??
ありがとうございます。
ここから発展(空白)させようと頑張ってるのですが……。
len = j * 2 - 1;
バグさんの if(i <= no1 - j - 1 || i >= no1 + j - 1) をお借りして,
#include <stdio.h>
int main(void){
int i, j, no1, len = 0;
printf("何段ですか"); scanf("%d", &no1);
for (j = 0; j <= no1; j++) {
len = j * 2 - 1;
for (i = 0; i <= len; i++) {
if(i <= no1 - j - 1 || i >= no1 + j - 1) {
putchar(' ');
}else{
putchar('*');
}
}
putchar('\n');
}
return 0;
}
これだとぼこぼこになってしまいます。さらに、
len = j * 2 - 1; これがあるせいでそれぞれ右に寄った分が、足りなくなってしまいます。(一行の長さがそれぞれ違ってしまって…。)
自分の言っていること分からなかったらすいません。
やっぱりバグさんのようにするしか方法ないのですか?(バグさんの考え方すごかったですがせっかく↑作ったので使えないかなと。)
勘違いとか読みにくいと思いますが、よろしくお願いします。
見落としていました。
次からは気をつけて小さなミスをなくしてこうと思います。
手取り足取りありがとうございます。
for (i < no1 - j - 1 || i > no1 + j - 1)
これ思いつかなかったです。 悔しかった。;;
>>たいちうさん
#include <stdio.h>
int main(void){
int i, j, no1, len = 1;
printf("何段ですか"); scanf("%d", &no1);
for (j = 1; j <= no1; j++) {
len = j * 2 - 1;
for (i = 1; i <= len; i++)
printf("*");
putchar('\n');
}
return 0;
}
これでいいのかな??
ありがとうございます。
ここから発展(空白)させようと頑張ってるのですが……。
len = j * 2 - 1;
バグさんの if(i <= no1 - j - 1 || i >= no1 + j - 1) をお借りして,
#include <stdio.h>
int main(void){
int i, j, no1, len = 0;
printf("何段ですか"); scanf("%d", &no1);
for (j = 0; j <= no1; j++) {
len = j * 2 - 1;
for (i = 0; i <= len; i++) {
if(i <= no1 - j - 1 || i >= no1 + j - 1) {
putchar(' ');
}else{
putchar('*');
}
}
putchar('\n');
}
return 0;
}
これだとぼこぼこになってしまいます。さらに、
len = j * 2 - 1; これがあるせいでそれぞれ右に寄った分が、足りなくなってしまいます。(一行の長さがそれぞれ違ってしまって…。)
自分の言っていること分からなかったらすいません。
やっぱりバグさんのようにするしか方法ないのですか?(バグさんの考え方すごかったですがせっかく↑作ったので使えないかなと。)
勘違いとか読みにくいと思いますが、よろしくお願いします。
Re:入門書でわからないところが…
> これでいいのかな??
OKです。
今朝のプログラムと見比べて下さい。
ずっと良くなってます。
で、次の段階。
後は完成させられるんじゃないですか?
OKです。
今朝のプログラムと見比べて下さい。
ずっと良くなってます。
で、次の段階。
for (j = 1; j <= no1; j++) { (a) spaces = ???; // jを元に計算 必要な個数スペースを表示 (b) len = ???; // jを元に計算 必要な個数*を表示 (c) 改行 }既に(b)と(c)は出来ています。
後は完成させられるんじゃないですか?
Re:入門書でわからないところが…
こうしてみると、人それぞれに思いつくアルゴリズムがあって面白いですよね。
私の考え方は不要な部分まで描画して、座標によって描画する文字を変化させる方法ですが、
たいちうさんの考え方は必要な部分だけを描画するという方法なんですよね。
私の考え方は不要な部分まで描画して、座標によって描画する文字を変化させる方法ですが、
たいちうさんの考え方は必要な部分だけを描画するという方法なんですよね。
図で書くと、私の方法が… ***o*** **ooo** *ooooo* ooooooo こうで、たいちうさんの方法が… ***o **ooo *ooooo ooooooo こうなんですよね。
Re:入門書でわからないところが…
> こうしてみると、人それぞれに思いつくアルゴリズムがあって面白いですよね。
バグさんのは図形の描画ですが、私のはテキストの整形って感じですね。
バグさんのは図形の描画ですが、私のはテキストの整形って感じですね。
Re:入門書でわからないところが…
>>たいちうさん
#include <stdio.h>
int main(void){
int i, j, no1, len = 1, spaces;
printf("何段ですか"); scanf("%d", &no1);
for (j = 1; j <= no1; j++) {
spaces = no1 - j;
for(i = 1; i <= spaces; i++)
putchar(' ');
len = j * 2 - 1;
for (i = 1; i <= len; i++)
printf("*");
putchar('\n');
}
return 0;
}
出来ました!!
これでいいと思うんですが。
#include <stdio.h>
int main(void){
int i, j, no1, len = 1, spaces;
printf("何段ですか"); scanf("%d", &no1);
for (j = 1; j <= no1; j++) {
spaces = no1 - j;
for(i = 1; i <= spaces; i++)
putchar(' ');
len = j * 2 - 1;
for (i = 1; i <= len; i++)
printf("*");
putchar('\n');
}
return 0;
}
出来ました!!
これでいいと思うんですが。
Re:入門書でわからないところが…
> 出来ました!!
> これでいいと思うんですが。
出来たことを確認したならば、それでいいのでしょう。
正解はいくらでもあります。
先のプログラムのトリッキーなループのように、
絶対避けた方が良い書き方もありません。
お疲れ様でした。
余力があるならば、バグさんの書き方も理解してください。
> これでいいと思うんですが。
出来たことを確認したならば、それでいいのでしょう。
正解はいくらでもあります。
先のプログラムのトリッキーなループのように、
絶対避けた方が良い書き方もありません。
お疲れ様でした。
余力があるならば、バグさんの書き方も理解してください。
Re:入門書でわからないところが…
>>たいちうさん
本当にありがとうございました。
バグさんもありがとうございました。
>>余力があるならば、バグさんの書き方も理解してください。、
今からチャレンジします。
バグさんの考え方は自分には分かりやすそうなので出来ると思います。
今回はバグさん、たいちうさんありがとうございました。
これからもお世話になると思います。
その時はよろしくお願いします。
本当にありがとうございました。
バグさんもありがとうございました。
>>余力があるならば、バグさんの書き方も理解してください。、
今からチャレンジします。
バグさんの考え方は自分には分かりやすそうなので出来ると思います。
今回はバグさん、たいちうさんありがとうございました。
これからもお世話になると思います。
その時はよろしくお願いします。