C言語で画面に■と空白を使ってBの字を書くプログラムを作りたいのですが、どうしたらいいですか?
大きさは入力によって指定が出来るようにします
■と空白を使って文字を表現する方法
-
Dixq (管理人)
Re:質問です
パッと考えられる方法は円と直線で表現する方法でしょうか。
コンソールにprintfでいいのですよね。
例えばDの字なら以下のように表現出来るのではないでしょうか。
コンソールにprintfでいいのですよね。
例えばDの字なら以下のように表現出来るのではないでしょうか。
#include <stdio.h>
#define XMAX 15
#define XMIN 0
#define YMAX 15
#define YMIN -15
int req(int x, int y){
if( x*x + y*y <= YMAX*YMAX && x*x + y*y > (YMAX-2)*(YMAX-2) ){
return 1;
}
if( x == 0 || x == 1 ){
return 1;
}
return 0;
}
int main(void){
int x, y;
for( y=YMAX ; y>=YMIN ; y-- ){
for( x=XMIN ; x<=XMAX ; x++ ){
if ( req( x , y ) == 1 ){
printf( "■" );
} else {
printf( " " );
}
}
printf( "\n" );
}
}
実行結果
■■
■■■■■■
■■■■■■■■
■■ ■■■■
■■ ■■■■
■■ ■■■
■■ ■■■
■■ ■■
■■ ■■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■
■■ ■■■
■■ ■■
■■ ■■■
■■ ■■■
■■ ■■■■
■■ ■■■■
■■■■■■■■
■■■■■■
■■
少し大きい円の方程式より内側であり、少し小さい円の方程式の外側であれば■
xが0か1ならば■
それ以外なら空白を出力するとこうなります。
方程式の上、下を使えば斜めも表現出来ると思います。
例えば×を書くプログラムは
#include <stdio.h>
#define XMAX 10
#define XMIN -10
#define YMAX 10
#define YMIN -10
int req(int x, int y){
if( y >= -x-1 && y <= -x+1 ){
return 1;
}
if( y >= x-1 && y <= x+1 ){
return 1;
}
return 0;
}
int main(void){
int x, y;
for( y=YMAX ; y>=YMIN ; y-- ){
for( x=XMIN ; x<=XMAX ; x++ ){
if ( req( x , y ) == 1 ){
printf( "■" );
} else {
printf( " " );
}
}
printf( "\n" );
}
}
実行結果
■■ ■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■■■
■■■
■■■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■■ ■■■
■■ ■■
このようにかけると思います。
Bを書くときは、円の中心をずらして、2つ用意し、Dを拡張すると出来ると思います。
変更する箇所はreq内の判定式だけで大丈夫です。
完成したら、大きさをscanfなどで指定出来るように変更すればよいと思います。
もしやりたいことが違ったらごめんなさい。-
non
Re:質問です
目的がよくわからないのですが、このような方法はいかがでしょうか?
ペイントで白黒のサイズを160×160ピクセルにして、文字「B」を描き、保存します。
このビットマップファイルをバイナリで読み出し、適当にサンプリングして、■を書きます。
■■■■■■■■
■■■■■■■■
■■■ ■■■
■■■ ■■
■■■ ■■
■■■ ■■■
■■■■■■■■
■■■■■■■■
■■■ ■■■
■■■ ■■
■■■ ■■
■■■ ■■
■■■ ■■■
■■■■■■■■
■■■■■■■
倍率をいろいろと変えるのはサンプリングの場所を、計算するのが面倒だと思いますが・・・。
ペイントで白黒のサイズを160×160ピクセルにして、文字「B」を描き、保存します。
このビットマップファイルをバイナリで読み出し、適当にサンプリングして、■を書きます。
#include <stdio.h>
int main(void)
{
FILE *fp;
unsigned char data[160*160/8];
size_t size;
int i,j;
fp = fopen( "B.bmp", "rb" );
if( fp == NULL )
{
puts( "File Open ERROR" );
return 1;
}
fseek(fp, 0x3e, SEEK_SET);
size = fread( data, 1, 160*160/8, fp );
if( size != 160*160/8){
puts("File Read ERROR");
return 1;
}
fclose( fp );
for(i=0;i<20;i++){
for(j=0;j<20;j++){
if(data[20*(19-i)*8+j]>0x7f)
printf(" ");
else
printf("■");
}
printf("\n");
}
return 0;
}
実行結果はこのようになります。■■■■■■■■
■■■■■■■■
■■■ ■■■
■■■ ■■
■■■ ■■
■■■ ■■■
■■■■■■■■
■■■■■■■■
■■■ ■■■
■■■ ■■
■■■ ■■
■■■ ■■
■■■ ■■■
■■■■■■■■
■■■■■■■
倍率をいろいろと変えるのはサンプリングの場所を、計算するのが面倒だと思いますが・・・。