これで良いはずです。都合上、◯ではなく*にさせてもらいました。
なお、Cプロ ではなく Cプラ(C++) だとおもいますが、以下のコードはC言語です。Cプラでも動きます。
C
1#include <stdio.h>
2int main(void){
3 // Here your code !
4 int size = 0;
5 scanf("%d", &size);
6
7 if (size < 7) {
8 printf("input too small.(must be >7).\n");
9 return -1;
10 } else if (size %2 == 0) {
11 printf("input must be odd number.\n");
12 return -1;
13 }
14
15 for (int i = 1; i <= size; i++) {
16 for (int j = 1; j <= size; j++) {
17 int th1, th2;
18 if (i < (size/2) + 1) {
19 th1 = ((size/2) + 1) - i;
20 th2 = ((size/2) + 1) + i;
21 } else {
22 th1 = ((size/2) + 1) - (size+1-i);
23 th2 = ((size/2) + 1) + (size+1-i);
24 }
25 if (j < th1 || j > th2) {
26 printf(" ");
27 } else
28 {
29 printf("*");
30 }
31 }
32 printf("\n");
33 }
34}
35
二重for文の問題です。
まずは問題の要求仕様、入力の制限を正しく把握するのがスタートです。
今回の場合「7以外だとどうしたら良いの」というのを把握するのが1つめです。
仕様に対して疑問がなくなったら、処理方法を考えましょう。
出力図形の構造を見て、数値に落とす方法を考えます。
まず1行目、2箇所の境界で空白と◯を分けるので、2つの境界値を計算します。
中央から左に1つ、右に1つ。これを数式にすると、以下のようになります。
左側=(7/2)+1-1=3 (※7/2=3)
右側=(7/2)+1+1=4
これを2行目でも使えるように一般化すると、こうなります。
左=(与えられた数/2)+1-行数
左=(与えられた数/2)+1+行数
さらに、5行目以降は、3行目以前と鏡写しにしたい。
数字にすると5行目は3行目と同じ閾値、6行目は2行目と同じ閾値を得たい。
可変値は行数だけなので、行数の式をiから何かに変えることで実現することにして…
5…3
6…2
7…1
並べてみると、合計が8(つまり与えられた数+1)になるようにすると良い、とわかります。
なので、i < (size/2) + 1
を境として、閾値のiを、size+1+i, size+1-i
にかえます。
大体、こんな感じに考えてプログラムというのは作ります。頑張ってください。