1989年開業 技術士 佐伯英子(情報工学部門) 文部科学省登録番号 第22082号 日本技術士会会員 東大阪商工会議所会員

≫サンプルプログラム一覧 

オープンソース/C言語サンプルプログラム 円を表示する(アスキーアート)

●コマンドプロンプトに円を表示するプログラムです。
 キャラクタ画面に対応する2次元配列(ビットマップ)を使い、円周上の要素
 に * を格納します。
●円を発生する式は、中心角θのパラメータ表示です。
 キャラクタ画面は縦横比が約2:1なので、横方向(x方向)を2倍します。
●1点計算したら、点の座標(y,x)に該当する配列の要素に * を格納します。
●パラメータθの増分Δθは、半径に反比例するように適当に設定します。
●各辺の計算が終了したら、最後に配列の内容を1行ずつ表示します。
 キャラクタ画面の原点は左上隅なので、最後の行から表示します。

        ≫ソースファイルのダウンロード: zukei01.c

【練習問題】
●中心、半径を変更していろいろな円を
 表示してみよう。
●半径に0や負の値を入力するとどうなる
 か、プログラムを見て考察しなさい。
●実際に0や負の値を入力してみて、考察が
 正しいか確認してみよう。

【発展問題】
●増分Δθの式を調整し、表示結果を比較
 してみよう。
●中心に+を表示するように改造して
 みよう。

//  円を表示する(アスキーアート)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

void  main( )
{
    char    buf[25][80];                   // 25x48文字分の配列
    int     yc,xc,r;                       // 中心,半径
    int     y,x;                           // 画面の位置 縦,横
    double  th,dth;                        // 角度θ,増分
    char    c[128];

    printf("*** 円を表示(AA)***\n");

    printf("中心(縦):"); gets(c);         // 中心y 入力
    yc=atoi(c);

    printf("中心(横):"); gets(c);         // 中心x 入力
    xc=atoi(c);

    printf("半径:"); gets(c);             // 半径 入力
    r=atoi(c);

    if ( r>0 ) dth=2.0/r; else dth=6.28;   // 増分計算

    memset(&buf[0][0],' ',24*80);          // 配列を空白で初期化

    for( th=0.0; th<6.28; th+=dth )        // θ=0.0〜2πまで
      {
        x=r*2*cos(th)+xc;                  // 横方向は2倍
        y=r*sin(th)+yc;

        if ( x<0 || x>79 ) continue;       // 画面の範囲外
        if ( y<0 || y>23 ) continue;       // 画面の範囲外

        buf[y][x]='*';
      }

    for( y=23; y>=0; y-- )
      { printf("%.80s",&buf[y][0]); }      // 画面1行表示(自動改行)
    fflush(stdout);
}
   

※SSL暗号化通信対応

佐伯英子技術士事務所 〒542-0073 大阪市中央区日本橋 1-14-13 サンオフィス日本橋601  E-mail: yfb22332@nifty.com