質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

4回答

1380閲覧

図形出力ソースのどこが間違っているのかがわかりません。

aranpapa

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/07/04 00:14

下の図を出力したくて自分でプログラムを組みました。

が、エラーが出てしまいます。

自分的には、
if (i == n / 2 || j == n / 2 || i == j || i + j == n - 1)
↑の部分をもう少し見やすくして完成させたいのですが、エラーを起こさず出力するやり方がしりたいです。

質問1.ソースの間違っているところを教えてほしい
質問2.上で言った一文ソースを見やすくするためにほかの書き方を知りたい

以上の2点です。

ソースは下にあります。

*__*__*
_*_*_*
__***
*******
__***
_*_*_*
*__*__*

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main(void)
{
int i, j, n;
while{
scanf("%d", &n);
if (n % 2 == 1);
else printf("奇数を入力してください。");
}

for (i = 0; i<n; i++){ for (j = 0; j<n; j++){ if (i == n / 2 || j == n / 2 || i == j || i + j == n - 1) printf("o"); else printf(" "); } printf("\n"); } return 0; getchar();

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KoichiSugiyama

2016/07/04 00:23

まず、どんなエラーが出るのか省略せず正確に書いてください。 分からないことは恥ずかしいことではないですが、手を抜くことはとても恥ずかしいことです。短時間で効率よく目的の回答を得るためにもご自身が出せる情報は出し惜しみせずに全て出されることをお勧めします。
kei344

2016/07/04 14:56

コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「</>」ボタンを押すとコードブロックになります。
guest

回答4

0

エラーの箇所は、whileの構文、scanfのあとのif文ですね。
ざっくり直すとこんな感じでしょうか(未検証)

c

1while(1){ 2 scanf("%d", &n); 3 if (n % 2 == 1) break; 4 printf("奇数を入力してください。"); 5}

あと複雑な条件ですが、とりあえずはいいんじゃないでしょうか(と個人的には思います)

投稿2016/07/04 00:24

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aranpapa

2016/07/04 00:33

ご回答ありがとうございます。 学校ではwhileだけしか習っておらず。 whileの後に(1)がつくのは習っていないんです。 whileの後に何もつけないでソースを組むことはできますか(・・?
ttyp03

2016/07/04 00:35

whileの構文は、 while(ループ条件) ですから、省略することはできません。 1は無限ループさせるときに良く使います。
episteme

2016/07/04 00:44

> 学校ではwhileだけしか習っておらず。 while ( 条件式 ) { ... } と習ったのかな? 実はコレ、間違いではないが正しくは while ( 値 ) であり、値が0でない間繰り返す。
PineMatsu

2016/07/04 08:58

while ( 式 ) { ... } と習っているはず。 後は「応用しなさい」ということです。 なお (1) も式です。(定数式)
guest

0

プログラム全体の制御の流れをすこしだけ変更してみました。
さらに 'o' を書く場合の条件判定文の変更をしてみました。
( if ... が 2行 コメントになっています。
最初のコメントにしてある条件文は質問文にあったものです。
2番目のコメントにしてある条件文は 斜め線の2本の描画を 1 つの式にまとめたものです。
3番目の有効にしてある条件文は、 すべての条件を 1 つの式にまとめたものです。)
x.c

c

1#include<stdio.h> 2#include <stdlib.h> // for abs() 3 4int main(void) { 5 int n = 0; 6 do { 7 printf("奇数を入力してください。"); 8 scanf("%d", &n); 9 } while (n % 2 == 0 || n <= 0); 10 11 for (int i = 0; i < n; i++) { 12 for (int j = 0; j < n; j++) { 13 char c = ' '; 14 int h = n / 2; 15 int dx = i - h; 16 int dy = j - h; 17 // if (i == n / 2 || j == n / 2 || i == j || i + j == n - 1) { 18 // if ((i == n / 2) || (j == n / 2) || (abs(n / 2 - i) == abs(n / 2 - j))) { 19 if ((abs(dx) - abs(dy)) * dx * dy == 0) { 20 c = 'o'; 21 } 22 putchar(c); 23 } 24 putchar('\n'); 25 } 26 27 return 0; 28}

実行結果

$ gcc x.c $ ./a.out 奇数を入力してください。7 o o o o o o ooo ooooooo ooo o o o o o o

条件文の変形の過程が理解できますでしょうか?

投稿2016/07/04 13:46

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

構文ミスは他の方が指摘されていますので、私ならですが・・・デバッグが楽になると思うので

c

1if (i == n / 2 || j == n / 2 || i == j || i + j == n - 1)は別関数にして 2int f( int i, int j, int n ){ 3 return (i == n / 2 || j == n / 2 || i == j || i + j == n - 1) ; 4} 5

とします。
あと、if文はたとえ1行でもブロック{}で囲みましょう。

投稿2016/07/04 03:14

編集2016/07/04 03:23
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラーの原因は ttyp03 さんのおっしゃる通り while(1) と break ですね。
あと、課題と記号の種類が違ってるのは、私なら不正解にします。
"*" と "_" で出題されているのなら、それを使うべきでしょう。

投稿2016/07/04 00:35

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aranpapa

2016/07/04 00:36

whileの後に(1)をつけないでプログラムを組むことはできるのでしょうか?
Zuishin

2016/07/04 00:39

while の後に (1) がついているのが正しい構文です。 それで覚えてください。 ついていない構文を習ったのなら、それは先生が間違えているか、C 言語ではありません。 あと、後ろの方にも指定されていないスペースが出ていますので、これも削除する必要があると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問