アスタリスクでダイヤ型の形を出力するプログラムを作ったのですが
実行例と比較して形が変になってしまいます。また、関数を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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語 3 2022/10/04 15:07
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
(int *)の意味
-
数字列を3桁ごとにカンマで区切...
-
比較回数と交換回数表示について
-
if と配列の組み合わせ
-
C言語で三目並べをするプログラ...
-
実数の整数部,小数部の取得
-
卒業研究でよく分からないとこ...
-
C言語で分からないところがあり...
-
C言語での奇数の和
-
アスタリスクで正方形
-
警告 W8065について。
-
入力された2つの整数の差を絶対...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
C言語
-
C言語初心者です、、、お助けく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
std::set<int> で、ある値が何...
-
C言語 エラーの原因がわからな...
-
c言語
-
system関数がうまくいかない
-
C++でvectorにテキストファイル...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
return 1L
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
このプログラミング誰か教えて...
おすすめ情報