プロが教えるわが家の防犯対策術!

こんにちは。

C言語の学習において、二つの問題がわかりません。。;

ご教示お願いしますorz

①「分布グラフの作成」
* *
* * * *
* * * * * *
-------------------------------
0 1 2 3 4 5 6 7 8 9
横に'*'を並べることはできたのですが、縦に並べるやり方がどうしても浮かびません...。

②「ユークリッドの互除法を用いて最大公約数を求める」
ユークリッドの互除法は何であるかは知っているのですが、こちらもどう書けばよいか浮かんできません...。

答えもしくは、答えを導くヒントを教えていただけませんか?

よろしくお願いします!

質問者からの補足コメント

  • ご回答ありがとうございます。

    (1)ですが、その方法の案がなかなか浮かびません...。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/02/10 12:24
  • ご回答ありがとうございます。

    (2)はできましたが、

    (1)の「あらかじめ出力用バッファの char 配列を用意して、計算後に纏めて出力するのをオススメします。バッファは全て空白文字で初期化しておいて、出力すべき箇所だけ '*' に置換でいかがでしょうか。」という部分がわからないです。。;

    「テストの点数の分布を作成する」というテーマの場合
    先に、入力された得点を0から10の倍数ずつに分布図を作る計算をして、
    その後に、一気に'*'を打つということでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/02/10 19:07

A 回答 (4件)

分布を n[10] に計算できたとします。


/* 横に並べられたのだから、ここまではいいですね? */

ここで、元のグラフの縦軸に値を入れます。
3:* *
2:* * * *
1:* * * * * *
 -------------------------------
 0 1 2 3 4 5 6 7 8 9

こうすると
3: 分布数が3以上のものに *
2: 分布数が2以上のものに *
1: 分布数が1以上のものに *
となっていることにお気付きでしょうか?

これに気付けば
・最初の行はn[10]の最大値→最大値を求めるプログラムが必要
・最大値から1まで逆順にループ
・対象行1行分の出力
という構成になることがわかります。


この手の問題では、規則を見付けることがカギです。
    • good
    • 2

(2) の考え方


char buff[行数][20]; の様に文字列出力用バッファを用意
memset 等で buff を初期化
for (n = 0; n < 10; n++) {
_ n番目の分布数を勘定する
_ 積み上げグラフとして '*' を何個表示するか計算
_ for (i = 0; i < 計算した個数; i++) {
_ _ buff[(行数-1) - i][n*2] = '*'; // 最下行から個数分の '*' を上書き
_ }
}
for (y = 0; y < 行数; y++) {
_ buff[y] を一行表示
}
    • good
    • 0

(1).


コンソールで表示するならば、行ごとに出力する必要があります。
ですので、縦に伸びる数値グラフを描画するなら
あらかじめ出力用バッファの char 配列を用意して、計算後に纏めて出力するのをオススメします。
バッファは全て空白文字で初期化しておいて、
出力すべき箇所だけ '*' に置換でいかがでしょうか。

(2).
ユークリッドの互除法のアルゴリズムといえば、以下になります。
1. 入力を m, n (m ≧ n) とする。
2. n = 0 なら、 m を出力してアルゴリズムを終了する。
3. m を n で割った余りを新たに n とし、更に元の n を新たに m とし 2. に戻る。
参考) http://ja.wikipedia.org/wiki/ユークリッドの互除法

素直にこれを実装すればよいでしょう。

使用する構文は
* 関数名(引数, ...) { ... }
* while (条件式) { ... }
* 余り = 被除数 % 除数;
* return 戻り値;
この回答への補足あり
    • good
    • 0

(1) 例えば a[0] = 1, a[1] = 0, a[2] = 1, a[3] = 1, a[4] = 0 のときに


* **
-----
12345
と表示させることはできますか?

(2) 「何であるか」は知っててもしょうがないんだけどね (「最大公約数を求める方法」としか言いようもないし). 具体的にどのような操作をしているかは理解できていますか?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!