
アスタリスクでダイヤ型の形を出力するプログラムを作ったのですが
実行例と比較して形が変になってしまいます。また、関数を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;
}

No.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;
}
No.2
- 回答日時:
実行例を見た感じだと、こんなのとか:
#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
No.1
- 回答日時:
・n/2にしたのはなぜ?
・int daiya~ でifが不成立の時には、そのまま関数の終りになってしまっています。
ちゃんとreturn 0等と明示的に値を返すようにしましょう。
今はたまたま1以外が返っていて正常に動いているように見えますが、思わぬ不具合の元です。
・>関数をif文で作ったのですがそれをfor文while文で実行できる形にする
の意味がわかりません。
まずは、daiya関数の仕様を決めることです。
「大きさNumのダイヤ型を書く際に、i列j行に*を描画するなら1を返す」という仕様なら、今のままです。(returnが足りない点を除いて)
そうでないなら、daiya関数が具体的に「何を受けとって」「何をするのか」「何を返すのか」を決めてください
実際にどうするか考えるのはその後です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
std::set<int> で、ある値が何...
-
未解決の外部シンボル _printf...
-
アスタリスクでダイヤ型を作る
-
C言語で分からないところがあり...
-
複数桁10進数の*桁目だけを抽出...
-
エラー 添字が付けられた値が、...
-
「指定されたキャストは有効で...
-
C言語 エラーの原因がわからな...
-
C言語での引数の省略方法
-
double型の値を、一桁ずつint型...
-
最早開始時間と最遅完了時刻を...
-
剰余演算を論理演算と加減算に...
-
【C言語】このプログラム各行の...
-
ポストの対応問題
-
C言語のポインタのプログラムに...
-
return 1L
-
単方向リストに適当な値を入れ...
-
リッチテキストへの行ごとの背...
-
【C++】関数ポインタの使い方
-
c言語 文字化けします
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
(int *)の意味
-
ColorをRGBで指定する方法
-
未解決の外部シンボル _printf...
-
構造体の勉強中です 合計点の高...
-
商と剰余を同時に求める(C言語)
-
C言語で分からないところがあり...
-
式は定数値が必要です」という...
-
C言語での奇数の和
-
std::set<int> で、ある値が何...
-
課題でつまってます・・・
-
int16_t の _t は何?
-
比較回数と交換回数表示について
おすすめ情報