ページ 11

三角形アート part2

Posted: 2011年10月27日(木) 20:19
by アドミラル・ヒッパー
早くも行き詰まりましたwwww

三角形アートの関数化の所で困りました。

他サイトでピラミッドアートのプログラムがあったので、それをベースにプログラムを組んだのですが

四角形は問題ないのですが、
入力4
****
****
****
****
三角形が一行少ない、
入力4


**
***
逆三角はなぜか、三角形と一緒
入力4


**
***
三角旗は何が何やら。
入力4
 *



(↑は実行画面です)
とにかく、なぜこういうことになるのか、解りません。
どこがおかしいのか、どうすればいいのか、
ご教授おねがいします。

ソースコードです

コード:

#define SIZE 12
#include <stdio.h>
int m[SIZE][SIZE];

void clearMatrix(void) // 配列要素の0クリアー
{
	int i, j;

	for(i=0; i<SIZE; i++)
	for(j=0; j<SIZE; j++)
	m[i][j]=0;
}

void disp(int n)		// *  か   を表示する
{
	int i, j;

	for(i=0; i<n; i++){

		for(j=0; j<n; j++)
			m[i][j] ? printf("* "):printf("  ");
			printf("\n");
	}
}

void square(int n)		// 四角形
{
	int i, j;

	for(i=0; i<n; i++){

		for(j=0; j<n; j++){
		m[i][j]=1;
		}
	}
}

void sankaku(int n)		//三角形
{
	int i, j;

	for(i=0; i<n+1; i++){

		for(j=0; j<i; j++){

			m[i][j]=1;
		}
	}
}

		

void gyakusankaku(int n) //逆三角形
{
	int i, j;

	for(i=n; i>0; i--){
		for(j=0; j<i; j++){
			m[i][j]=1;
		}
	}
}

void hata(int n)		//三角旗
{
	int i, j;

	for(i=0; i<n; i++)		
	{

		for(j=0; j<i; j++)
		{
			//printf("* ");
		}
		//printf("\n");
	}
	m[i][j]=1;


	for(i=n; i>0; i--)		
	{

		for(j=0; j<i; j++)
		{
		//	printf("* ");
		}
		//printf("\n");
	}
	//printf("\n");


	m[i][j]=1;
}

int main(void)
{
	int n, type;

while(1){

		do{
			printf("やめたいときは数字以外の文字を入力してください\n");
			printf("数字 (2~9)を入力してください:");
			if(scanf("%d", &n) != 1)
			return 0;
			}while( ! (2 <= n && n <= 9));

clearMatrix();

switch(n){
	case 2: printf("1: 四角形 、2:三角形、3:逆三角形、4:三角旗:");scanf("%d", &type);break;
	case 3: printf("1: 四角形 、2:三角形、3:逆三角形、4:三角旗:");scanf("%d", &type);break;
	case 4: printf("1: 四角形 、2:三角形、3:逆三角形、4:三角旗:");scanf("%d", &type);break;
	case 5: printf("1: 四角形 、2:三角形、3:逆三角形、4:三角旗:");scanf("%d", &type);break;
	case 6: printf("1: 四角形 、2:三角形、3:逆三角形、4:三角旗:");scanf("%d", &type);break;
	case 7: printf("1: 四角形 、2:三角形、3:逆三角形、4:三角旗:");scanf("%d", &type);break;
	case 8: printf("1: 四角形 、2:三角形、3:逆三角形、4:三角旗:");scanf("%d", &type);break;
	case 9: printf("1: 四角形 、2:三角形、3:逆三角形、4:三角旗:");scanf("%d", &type);break;
	}

switch(type){
		case 1: square(n); 
		case 2: sankaku(n); break;
		case 3: gyakusankaku(n); break;
		case 4: hata(n); break;
		}
	disp(n);
	}
}

Re: 三角形アート part2

Posted: 2011年10月27日(木) 20:55
by box
何よりもまず、インデントをちゃんとして、見やすいコードにすることをおすすめします。
本題に入るのはその後でもいいのではないか、と思います。

どこでそういうインデントが正しいと教わったのか、私には全然わかりません。

Re: 三角形アート part2

Posted: 2011年10月27日(木) 22:32
by 初級者

コード:

#include <stdio.h>

enum {
    SQU = 1, TRI, REV, FLAG,
};

void draw(int type, int size)
{
    int x, y, n;

    n = (type == FLAG) ? -size + 1 : 0;
    for (y = size - 1; y >= n; y--) {
        for (x = 0; x <= size - 1; x++) {
            switch (type) {
            case SQU:
                printf("* ");
                break;
            case TRI:
                printf((y >= x) ? "* " : "  ");
                break;
            case REV:
                printf((y <= -x + size - 1) ? "* " : "  ");
                break;
            case FLAG:
                printf((y <= -x + size - 1 && y >= x - size + 1) ? "* " : "  ");
                break;
            default:
                break;
            }
        }
        putchar('\n');
    }
    putchar('\n');
}

int main(void)
{
    int type, size;

    while (1) {
        do {
            printf("種類(1:四角,2:三角,3:逆三角,4:旗,0:終了)? "), scanf("%d", &type);
        } while (type < 0 || 4 < type);
        if (type == 0) break;
        do {
            printf("大きさ(2~9)? "), scanf("%d", &size);
        } while (size < 2 || 9 < size);
        draw(type, size);
    }
    return 0;
}

Re: 三角形アート part2

Posted: 2011年10月31日(月) 13:42
by アドミラル・ヒッパー
返信ありがとうございます。

初心者さん、ソースコードは大変助かるのですが、
やはり、ちゃんと理解したいのでこれで終わりにはしたくないです。

初心者さんから頂いたソースコードで質問なんのですが、

コード:

#include <stdio.h>
 
enum {
    SQU = 1, TRI, REV, FLAG,
};
 
void draw(int type, int size)
{
    int x, y, n;
 
    n = (type == FLAG) ? -size + 1 : 0;   //ここです
    for (y = size - 1; y >= n; y--) {
        for (x = 0; x <= size - 1; x++) {
            switch (type) {
            case SQU:
                printf("* ");
                break;
            case TRI:
				printf((y <= -x + size - 1) ? "* " : "  ");
               
                break;
            case REV:
				printf((y >= x) ? "* " : "  ");
                
                break;
            case FLAG:
                printf((y <= -x + size - 1 && y >= x - size + 1) ? "* " : "  ");
                break;
            default:
                break;
            }
        }
        putchar('\n');
    }
    putchar('\n');
}
 
int main(void)
{
    int type, size;
 
    while (1) {
        do {
            printf("種類(1:四角,2:三角,3:逆三角,4:旗,0:終了)? "), scanf("%d", &type);
        } while (type < 0 || 4 < type);
        if (type == 0) break;
        do {
            printf("大きさ(2~9)? "), scanf("%d", &size);
        } while (size < 2 || 9 < size);
        draw(type, size);
    }
    return 0;
}
 
「ここです」のところの文が、どういう働きをしているのか解らないので、
どなたか、教えてください。よろしくお願いします。

Re: 三角形アート part2

Posted: 2011年10月31日(月) 13:47
by naohiro19

コード:

n = (type == FLAG) ? -size + 1 : 0;

コード:

if( type == FLAG){
 n = -size + 1;
}else{
 n = 0;
}
の動作をする演算子です。

Re: 三角形アート part2

Posted: 2011年10月31日(月) 19:56
by 初級者
他に何か理解できないところがありましたら、おっしゃってください。

なお、私は初級者です。初心者ではありませんので、よろしくお願いいたします。

Re: 三角形アート part2

Posted: 2011年10月31日(月) 20:47
by アドミラル・ヒッパー
返信ありがとうございます。

初級者さん、すいませんでした><


皆さんのおかげで無事、出来ました。

ソースコードはちゃんと理解できました。
初級者さん本当にありがとうございました。

また、part1から、付き合ってくださった皆さんもありがとうございました。

これからも、困ったときは、よろしくお願いします。