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

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

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

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

Q&A

解決済

2回答

647閲覧

C言語 図形の作成について

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2021/06/28 00:54

編集2021/08/30 20:38

前提・実現したいこと

こんにちは
C言語初学者です。
プログラミングの表示が上手くできなくて困っています。どなたかご親切な方、お忙しいとは思いますが、詳しく教えて頂けると幸いです。よろしくお願い致します。

【やりたいこと】
10×10の格子状の領域を考える。
x軸で線対称が起きるようにする。
この時3つの文字を使って、ランダムに表示する。
その結果をコンソールに表示する。

発生している問題・エラーメッセージ

【解決したいこと】
x軸で必ず線対称が起きるようにしたい。

補足情報(FW/ツールのバージョンなど)

【環境】
Visual Studio for Mac 2019

(環境について間違った表現、もしくは何か不足している情報があればご指摘お願い致します。)

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

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

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

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

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

y_waiwai

2021/06/28 00:57

このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
dodox86

2021/06/28 02:03

質問を読ませていただいて全体的にやりたいことが分かりづらいというのが正直な感想なのですが、「こんな出力を得たい」とのような具体例を図示すると良いと思います。(まぁ、分かりづらいと思っているのは私だけかもしれませんが) あと、 > そもそも、c言語には反転という考え方は無いのでしょうか。 ここで言う「反転」も良く分かりませんが、C言語ではない別のプログラミング言語で質問者さんが言う「反転」という操作があるのでしょうか。
neconekocat

2021/06/28 03:16

そこそこの難易度の内容ですが、一気にやるには初心者には少し厳しいと思いますね。 まず、反転位置に同じコマを置く方法(縦、横、右斜め上、左斜め上)をコードに起こせるか? コマの条件(3種のコマが最低1、合計50以上)を満たすまでどう処理するのか?(毎回0から配置するのか、何らかの処理をループさせたりするのか) などなど、切り分けて考えないといけないものが沢山あります。 無理せず複数の質問に分けた方がいいとでは?
ozwk

2021/06/28 05:02

なにかの課題であれば問題文を省略せずにそのまま引用してください
退会済みユーザー

退会済みユーザー

2021/06/28 05:14

ozwk様 こんにちは 課題等の提出物ではありません。 勉強の一環で質問しています。
thkana

2021/06/28 11:54

課題かどうかはどうでもいいですが、何が欲しいのかわからないので、設問を正確に知りたいです。 > x軸、y軸、斜め、のどれか これを決める条件はなんですか? > 起きるようにしたい 線対称になることを意図して描くのではなく、なにかの法則性を持たせた結果がなぜか線対称になるのを狙う、ということなのでしょうか?
退会済みユーザー

退会済みユーザー

2021/06/28 14:24 編集

thkana様 こんばんは ご指摘ありがとうございます。 当方、自分でルールを作成してコーディングしているため設問等はありません。 先ほどまで、詳しい説明を記載していましたが、わかりづらいとのご指摘があったため簡素化いたしました。 > x軸、y軸、斜め、のどれか これを決める条件はなんですか? 質問の仕方が悪かったようですね。 サイコロ(乱数)とif文で選択することを考えていました。 > 起きるようにしたい 線対称になることを意図して書くように設定したいという意味です。
kazuma-s

2021/06/29 03:54

斜めというのは y = x の線と y = -x の線の 2通りあるのでしょうか?
guest

回答2

0

とりあえず作ってみちゃったから載せておこう。

C

1#include <stdio.h> 2#include <stdlib.h> 3char *chars[] = {"A", "☆", "■"}; 4#define SIZE 10 5enum AXIS { 6 AXIS_X = 0, 7 AXIS_Y = 1, 8 AXIS_DIAGONAL1 = 2, 9 AXIS_DIAGONAL2 = 3 10}; 11 12void rotate(int fld[][SIZE]) { 13 int tmp[SIZE][SIZE]; 14 for (int x = 0; x < SIZE; x++) { 15 for (int y = 0; y < SIZE; y++) { 16 tmp[x][SIZE - y - 1] = fld[y][x]; 17 } 18 } 19 memcpy(fld, tmp, sizeof(int) * SIZE * SIZE); 20} 21 22void makeAXIS_X(int fld[][SIZE]) { 23 for (int x = 0; x < SIZE; x++) { 24 for (int y = 0; y <= SIZE / 2; y++) { 25 fld[y][x] = rand() % (sizeof(chars) / sizeof(chars[0])); 26 fld[SIZE - y - 1][x] = fld[y][x]; 27 } 28 } 29} 30 31void makeAXIS_DIAG1(int fld[][SIZE]) { 32 for (int x = 0; x < SIZE; x++) { 33 for (int y = 0; y <= x; y++) { 34 fld[y][x] = rand() % (sizeof(chars) / sizeof(chars[0])); 35 fld[x][y] = fld[y][x]; 36 } 37 } 38} 39 40void makeField(int fld[][SIZE], enum AXIS ax) { 41 int i = 0; 42 if (ax == AXIS_X) { 43 makeAXIS_X(fld); 44 } else if (ax == AXIS_Y) { 45 makeAXIS_X(fld); 46 rotate(fld); 47 } else if (ax == AXIS_DIAGONAL1) { 48 makeAXIS_DIAG1(fld); 49 } else { // ax==AXIS_DIAGONAL2 50 makeAXIS_DIAG1(fld); 51 rotate(fld); 52 } 53} 54 55void showField(int fld[][SIZE]) { 56 for (int y = 0; y < SIZE; y++) { 57 for (int x = 0; x < SIZE; x++) { 58 printf("%s", chars[fld[y][x]]); 59 } 60 printf("\n"); 61 } 62} 63 64int main(void) { 65 int field[SIZE][SIZE]; 66 makeField(field, AXIS_X); 67 showField(field); 68 printf("\n"); 69 makeField(field, AXIS_Y); 70 showField(field); 71 printf("\n"); 72 makeField(field, AXIS_DIAGONAL1); 73 showField(field); 74 printf("\n"); 75 makeField(field, AXIS_DIAGONAL2); 76 showField(field); 77 printf("\n"); 78 return 0; 79}

投稿2021/06/29 12:35

thkana

総合スコア7703

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

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

thkana

2021/07/03 08:19

編集履歴見ないで書いてたけど、「簡易」というレベルじゃなくお題が変わっていたのね... まぁ、とりあえず「反転」はしていないこともない(配置と反転をいっぺんにやっている)のでプログラムを読んでみてください。
guest

0

ベストアンサー

いまいち話がわからないけども,

乱数で「(x,y) にコマを置く」と決めたならば,
「(x,y)と"対象"な位置(x',y')にも同時にコマを置く」とすれば良いのでは.

"対象"な位置(x',y') ってのは計算で求められるよね(算数だ).


とりあえず

x軸、y軸、斜め線

のどれか1つについてのプログラムを作ってみるところから始めてはどうか.
例えば x軸で対象 ならば,
(x',y') = ( 9-x, y )
だよね.

C

1//x軸対象だと,こんな話かな? 2int main(void) 3{ 4 const int N = 8; //コマを置く作業を行う回数 5 char Field[10][10]; 6 char Nums[100]; 7 int x,y,i,r; 8 9 srand((unsigned int)time(NULL)); 10 11 //Fieldの内容初期化 12 for( y=0; y<10; ++y ) 13 { 14 for( x=0; x<10; ++x ) 15 { Field[y][x] = '.'; } 16 } 17 18 //乱数で座標テーブルNumsの内容をつくる 19 for( i=0; i<100; ++i )Nums[i] = i; 20 for( i=0; i<N; ++i ) 21 { 22 r = i + ( rand() % (100-i) ); 23 int t = Nums[r]; 24 Nums[r] = Nums[i]; 25 Nums[i] = t; 26 } 27 28 //コマ({A,B,C} のいずれか)を置く作業 29 for( i=0; i<N; ++i ) //N回やる 30 { 31 x = Nums[i] % 10; 32 y = Nums[i] / 10; 33 34 //(x,y), (x',y') にコマを置く 35 Field[y][x] = Field[y][9-x] = 'A' + (rand()%3); 36 } 37 38 //表示 39 for( y=0; y<10; ++y ) 40 { 41 for( x=0; x<10; ++x ) 42 { printf( "%c ", Field[y][x] ); } 43 44 printf( "\n" ); 45 } 46 47 return 0; 48}

投稿2021/06/28 03:01

fana

総合スコア11996

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

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

退会済みユーザー

退会済みユーザー

2021/06/28 05:41

fana様 こんにちは ご回答有難うございます。 まず質問内容ですが、ご指摘が多かったため簡略化致しました。質問内容がわかりづらく、申し訳ございませんでした。 上記のコーディングについての質問です。 const int N = 8; //コマを置く作業を行う回数が8回となっていますが、これには何か理由があるでしょうか?仮に、Fieldの大きさを[100][100]にした場合、どのように変更すればいいのでしょうか? また、//コマ({A,B,C} のいずれか)を置く作業      x = Nums[i] % 10;    y = Nums[i] / 10; の部分がよく理解できませんでした。 お手数おかけしますが、もう少し詳しいご説明をいただきたいです。 宜しくお願い致します。
fana

2021/06/28 05:56

> const int N = 8; 元々の質問を読んで, 「何個のコマを置けばいいのか? というのがどうやって定められるのか?」というのが不明であったため,ここでは定数で与える形としているだけです. このコードは「答え」ではなくて単なる「例」なので.
fana

2021/06/28 06:02

> x = Nums[i] % 10; > y = Nums[i] / 10; 10*10 = 100個のマス目に,0~99までの通し番号を振った形です. 通し番号からマス目の(x,y)に戻す(?)計算をここではこのようにしました. 通し番号0番であれば,(x,y) = (0,0) であり, 通し番号99番であれば,(x,y) = (9,9) です. 配列Nums[]は,100個の通し番号を格納しており,その順序は適当に最初に乱数でシャッフルされています. だから,Nums[]の先頭から1個ずつ通し番号を取り出して使うことは,ランダムにマスを選ぶことと同じです. (この方法だと同じマスを2回以上選んでしまうことが無いので楽かな,と)
退会済みユーザー

退会済みユーザー

2021/06/29 23:03 編集

こんばんは わかりやすいご説明有難うございます。 先ほど、y軸対称も作成することができました。 有難うございます。 今度は、数字を変更し多ところ、ビルドが正しく通りませんでした。
fana

2021/06/29 01:22

「変えてみたらビルドが通らん.これがコードだ」とか言われても… コレ最後までいちいち面倒を見ろと? という感想を抱かれかねない姿勢に感じます. 本当にビルドが通らないならば,何かしらのエラーメッセージが出ているでしょうから,それを足掛かりにデバッグすべきですし, ビルドして実行はできるけどもおかしなことになる,という話ならば,プログラムの各所で何が起こっているのかを調査すべきです. ご自身で自発的に考えた問題に取り組んでいる(という建て前である)ならば, デバッグ作業(:プログラミングにおける主たる作業のひとつである)も自発的に取り組むべきでしょう. --- とりあえず char Nums[900]; なので,Nums[]の各要素の型はcharです. char 型が 0~899 の全ての値を保持できるものではない場合,どんなことになるのか? という観点で見ると良いでしょう.
退会済みユーザー

退会済みユーザー

2021/06/29 01:48

こんにちは char型ではなくint型にすべきでした。 fana様には大変お世話になりました。 コーディングの勉強だけでなく、質問の仕方なども改善できるよう頑張りたいと思います。 有難うございました。
fana

2021/06/29 02:14

対象軸がx軸でもy軸でも対角線でも,変わるのは (x',y') の計算式だけですから, 適当に対象軸をどれにするのかを決める処理くらいを付け加えたら終わりですね.
fana

2021/06/29 02:21

"勉強の一環" ということであれば,例えばあなたが考えていた > 配置しようとする場所にコマが置かれていないかどうかを確認し、もし置こうとしている位置にコマがあれば,コマを置く位置を変更する …といった方式でもやってみると良いかもしれません.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問