入門書でわからないところが…

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

入門書でわからないところが…

#1

投稿記事 by きょろ » 15年前

はじめまして。
C言語の入門書で勉強しているものです。
もっと頑張ってゲームを作っていこうと思うのですが最近勉強し始めた初心者です。

タイトル通りわからないところが出てきて自分でも2時間ほど頑張ったのですがわかりません。

------------------演習---------------------

ピラミッドを作ります。
何段ですか。3
*
***
*****
-------------------------------------------
このような表示にしたいんです。   何段ですか→数字はキーボードからの入力です。
空白の数を上手にあらわせれなくて困っています。
for文を使うのは何となくわかるんですが…。

説明わかりずらくてすみません。
-------------------------------------

#include <stdio.h>

int main(void){

int i, j, no1;

printf("何段ですか:"); scanf("%d", &no1);

/*自分でもfor文を試行錯誤してみましたがわからないです;;*/



return 0;

}

たいちう

Re:入門書でわからないところが…

#2

投稿記事 by たいちう » 15年前

> 空白の数を上手にあらわせれなくて困っています。

まずは空白を無視して作ることはできますか?
↓こんな風に。

*
***
*****

バグ

Re:入門書でわからないところが…

#3

投稿記事 by バグ » 15年前

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:入門書でわからないところが…

#4

投稿記事 by きょろ » 15年前

>>たいちうさん    コメントありがとうございます
#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:入門書でわからないところが…

#5

投稿記事 by バグ » 15年前

私の書いたソースでは、ループカウンターであるiとjが1からではなく0から始まっている事に注意してみてください。

たいちう

Re:入門書でわからないところが…

#6

投稿記事 by たいちう » 15年前

> こんな感じでいいですか?
> 試してみると出来てはいるんですが、少し納得いかない書き方です。
> 出来れば綺麗な書き方教えてください。

jとno1の使い方がトリッキーですね。
int len;を導入して、次の形にしてください。
no1を固定して、jのみをループ変数にします。
for (j = 1; j <= no1; j++) {
    len = ???; // jを元に計算
    for (i = 1; i <= len; i++)
        printf("*");
    putchar('\n');
}

きょろ

Re:入門書でわからないところが…

#7

投稿記事 by きょろ » 15年前

>>バグさん
見落としていました。
次からは気をつけて小さなミスをなくしてこうと思います。
手取り足取りありがとうございます。
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:入門書でわからないところが…

#8

投稿記事 by たいちう » 15年前

> これでいいのかな??

OKです。
今朝のプログラムと見比べて下さい。
ずっと良くなってます。

で、次の段階。
for (j = 1; j <= no1; j++) {
    (a)
    spaces = ???; // jを元に計算
    必要な個数スペースを表示

    (b)
    len = ???; // jを元に計算
    必要な個数*を表示
    
    (c)
    改行
}
既に(b)と(c)は出来ています。
後は完成させられるんじゃないですか?

バグ

Re:入門書でわからないところが…

#9

投稿記事 by バグ » 15年前

こうしてみると、人それぞれに思いつくアルゴリズムがあって面白いですよね。
私の考え方は不要な部分まで描画して、座標によって描画する文字を変化させる方法ですが、
たいちうさんの考え方は必要な部分だけを描画するという方法なんですよね。
図で書くと、私の方法が…

***o***
**ooo**
*ooooo*
ooooooo

こうで、たいちうさんの方法が…

***o
**ooo
*ooooo
ooooooo

こうなんですよね。

たいちう

Re:入門書でわからないところが…

#10

投稿記事 by たいちう » 15年前

> こうしてみると、人それぞれに思いつくアルゴリズムがあって面白いですよね。

バグさんのは図形の描画ですが、私のはテキストの整形って感じですね。

きょろ

Re:入門書でわからないところが…

#11

投稿記事 by きょろ » 15年前

>>たいちうさん

#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:入門書でわからないところが…

#12

投稿記事 by たいちう » 15年前

> 出来ました!!
> これでいいと思うんですが。

出来たことを確認したならば、それでいいのでしょう。
正解はいくらでもあります。

先のプログラムのトリッキーなループのように、
絶対避けた方が良い書き方もありません。

お疲れ様でした。
余力があるならば、バグさんの書き方も理解してください。

きょろ

Re:入門書でわからないところが…

#13

投稿記事 by きょろ » 15年前

>>たいちうさん
本当にありがとうございました。

バグさんもありがとうございました。

>>余力があるならば、バグさんの書き方も理解してください。、
今からチャレンジします。
バグさんの考え方は自分には分かりやすそうなので出来ると思います。

今回はバグさん、たいちうさんありがとうございました。
これからもお世話になると思います。
その時はよろしくお願いします。

きょろ

Re:入門書でわからないところが…

#14

投稿記事 by きょろ » 15年前

解決付けるの忘れました。 すみません。

閉鎖

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