アプリ版:「スタンプのみでお礼する」機能のリリースについて

アスタリスクでダイヤ型の形を出力するプログラムを作ったのですが
実行例と比較して形が変になってしまいます。また、関数をif文で作ったのですがそれをfor文while文で実行できる形にするにはどのようにしたらいいのでしょうか?
実行例と私が作ったプログラムの実行データを画像に添付しました。

#include <stdio.h>

int daiya( int i, int j, int Num ){
if( j<= i+Num && j<=-i+Num &&
j>= i-Num && j>=-i-Num ){
return 1;
}

}

int main(){
int i, j, n;

do{
puts("数字を入力:");
scanf( "%d", &n );

if(n<2||n>9){
printf("入力エラーです。もう一度入力して下さい\n");
}
}while(n<2||n>9);

for( j=-n/2; j<=n/2; j++ ){
for( i=-n/2; i<=n/2; i++ ){
if( daiya( i, j, n/2 ) == 1 ){
putchar('*');
}
else {
putchar(' ');
}
}
putchar('\n');
}

return 0;
}

「アスタリスクでダイヤ型を作る」の質問画像

A 回答 (3件)

#include <stdio.h>



int daiya(int x, int y, int n)
{
return y <= x + n - 1 && y <= -x + n - 1 &&
y >= x - n + 1 && y >= -x - n + 1;
}

int main(void)
{
int n, x, y;

printf("段数:"); scanf("%d", &n);
for (x = -n + 1; x <= n - 1; x++) {
for (y = -n + 1; y <= n - 1; y++) {
putchar(daiya(x, y, n) ? '*' : ' ');
}
putchar('\n');
}
return 0;
}
    • good
    • 0

実行例を見た感じだと、こんなのとか:



#include <stdio.h>
#include <string.h>

#define NMAX 9
#define BUFMAX (NMAX*2)
#define SPC ' '
#define STAR '*'

char Buf[ BUFMAX + 1 ];

void dia( int n ){ int i, k, l;
for ( i = -n + 1; i < n; i++ ){
k = n + (i > 0 ? - i : i ); l = k * 2 - 1;
memset( Buf + NMAX - k, STAR, l ); puts( Buf ); memset( Buf + NMAX - k, SPC, l );
}
}
int main( int argc, char *argv[] ){ int n;
memset( Buf, SPC, BUFMAX ); Buf[ BUFMAX ] = '\0';
for ( n = 1; n <= NMAX; n++ ){ printf( "N=%d\n", n ); dia( n ); }
}

参考URL:http://www.ideone.com/l2asA
    • good
    • 1

・n/2にしたのはなぜ?


・int daiya~ でifが不成立の時には、そのまま関数の終りになってしまっています。
ちゃんとreturn 0等と明示的に値を返すようにしましょう。
今はたまたま1以外が返っていて正常に動いているように見えますが、思わぬ不具合の元です。
・>関数をif文で作ったのですがそれをfor文while文で実行できる形にする
の意味がわかりません。

まずは、daiya関数の仕様を決めることです。
「大きさNumのダイヤ型を書く際に、i列j行に*を描画するなら1を返す」という仕様なら、今のままです。(returnが足りない点を除いて)
そうでないなら、daiya関数が具体的に「何を受けとって」「何をするのか」「何を返すのか」を決めてください
実際にどうするか考えるのはその後です。
    • good
    • 0

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