一つ下の質問をした後に、いろいろ考えて作ったプログラムなのですが、コンパイルが通りません。
頭がこんがらがってしまったので、教えていただけるとうれしいです。
main(){
int x, y, r, d;
printf("Enter coordinates of radius of circle. R = ");
scanf("%d\n", &r);
x = 0;
y = r;
d = 3 - 2 * r;
while(y > x){
plotcircle(x, y, r);
if(d < 0){ /* select U */
d = d + 4 * x + 6;
}else{ /* select D */
d = d + 4 * (x - y) + 10;
y = y - 1;
}
x = x + 1;
}
if(x == y){
plotcircle(x, y, r);
}
}
plotcircle(int x, int y, int r){
putpixel( x, y, r);
putpixel( y, x, r);
putpixel( y, -x, r);
putpixel( x, -y, r);
putpixel(-x, -y, r);
putpixel(-y, -x, r);
putpixel(-y, x, r);
putpixel(-x, y, r);
}
No.1
- 回答日時:
(Windows環境を前提にした話ですが違ったらごめんなさい。
)mainがあることからコマンドラインベースのグラフィックを使用されようとされていますが、現在graphics.h(graphics.lib)が標準で入っていないため
上記のputpixel関数も定義されていないため利用できません。
下記にたのLibをもちいたサイトがありますのでそちらを参考にしてみてください
「コンピュータ・グラフィックス(CG)の初歩」
http://flow.dse.ibaraki.ac.jp/~lecture/CProg/gra …
また、現在Windows上でグラフィックスを行えるようにライブラリが用意されていますのでWinAPIのプログラムへの変更もいいと思います。
この回答への補足
すみません。環境について触れていませんでした。
Unix上で動かしていました。
また、graphics.hを利用することなしに描画する方法で行くことにしました。
お手数をおかけしました。
No.2
- 回答日時:
No.1253337でも回答しましたが、環境を特定しない限り、適切な回答はできません。
提示されているソースは、こちらで見る限りコンパイルできましたが、putpixelがないのでリンク時にエラーになりました。
結局、グラフィック周りを解決しない限り、動かすことはできません。
この回答への補足
そうですね。環境特定は必要ですね。
現在Unix上で動かしています。
graphic.hを利用して書かせようと思ったのですが、そこまでする必要が無いことに気づき、ファイルに.とXを用いて円描画をするようにしてみました。が、やはりうまく行きません。以下のソースで間違いを指摘していただきたいです。
#include <stdlib.h>
#include <stdio.h>
int main(){
int x, y, r, d;
printf("Enter coordinates of radius of circle. R = ");
scanf("%d\n", &r);
x = 0;
y = r;
d = 3 - 2 * r;
while(y > x){
plotcircle(x, y, r);
if(d < 0){ /* select up */
d = d + 4 * x + 6;
}else{ /* select bottom */
d = d + 4 * (x - y) + 10;
y = y - 1;
}
x = x + 1;
}
if(x == y){
plotcircle(x, y, r);
}
}
int plotcircle(int x, int y, int r){
int xx, yy;
int i, j, k;
char output;
FILE *fp;
xx = -1 * (r + 2);
yy = r + 1;
if((fp = fopen("output.txt", "w")) == NULL){
return(-1);
}
for(i = 0; i <= 2 * r; i++){
for(j = 0; j <= 2 * r; j++){
yy--;
xx++;
if(xx == x && yy == y){
output = 'X';
}else if(xx == y && yy == x){
output = 'X';
}else if(xx == y && yy == -x){
output = 'X';
}else if(xx == x && yy == -y){
output = 'X';
}else if(xx == -x && yy == -y){
output = 'X';
}else if(xx == -y && yy == -x){
output = 'X';
}else if(xx == -y && yy == x){
output = 'X';
}else if(xx == -x && yy == y){
output = 'X';
}else{
output = '.';
}
fputc(output, fp);
putchar(output);
}
output = '\n';
fputc(output, fp);
putchar(output);
}
fclose(fp);
}
No.3
- 回答日時:
> graphic.hを利用して書かせようと思ったのですが、そこまでする必要が無いことに気づき、ファイルに.とXを用いて円描画をするようにしてみました。
が、やはりうまく行きません。以下のソースで間違いを指摘していただきたいです。まともにデバッグする気はありませんが、一つアドバイスさせていただくと、最初のソースにあったputpixelを、二次元配列にプロットする関数として自作し、最後にその配列の内容を出力する方が簡単です。
それから、scanfに渡している文字列の'\n'は不要です。
No.4ベストアンサー
- 回答日時:
計算は間違ってないようですので、描画をなんとかすれば動くと思います。
参考まで。(画面を50*50サイズで、円の中心を25,25に固定しています)
#include <stdlib.h>
#include <stdio.h>
char disp[50][50]; // 画面領域の定義(50*50固定)
void plotini(void); // 画面を消す
void plotcircle(int, int, int, int, int); // 画面に点を打つ
void plotdisp(void); // 画面を表示する
int main(){
int x, y, r, d;
printf("Enter coordinates of radius of circle. R = ");
scanf("%d", &r);
plotini();
x = 0;
y = r;
d = 3 - 2 * r;
while(y > x){
plotcircle(x, y, 25, 25, 'X');
if(d < 0){ /* select up */
d = d + 4 * x + 6;
}else{ /* select bottom */
d = d + 4 * (x - y) + 10;
y = y - 1;
}
x = x + 1;
}
if(x == y){
plotcircle(x, y, 25, 25, 'X');
}
plotdisp();
return 0;
}
void plotini(void) {
int i,j;
for (i=0; i<50; i++) for (j=0; j<50; j++) disp[i][j]=' ';
}
void plotcircle(int x, int y, int xc, int yc, int c) {
int xx,yy;
xx = xc+x; yy = yc+y; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
xx = xc+y; yy = yc+x; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
xx = xc+y; yy = yc-x; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
xx = xc+x; yy = yc-y; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
xx = xc-x; yy = yc-y; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
xx = xc-y; yy = yc-x; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
xx = xc-y; yy = yc+x; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
xx = xc-x; yy = yc+y; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
}
void plotdisp(void) {
int i,j;
for (i=0; i<50; i++) {
for (j=0; j<50; j++) {
printf("%c",disp[i][j]);
}
printf("\n");
}
}
実は、JaritenCatさんの投稿の前に似たようなプログラムができていました。
報告が遅くなってしまってすみません。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
へんな現象
-
研究室志望の提出文書
-
応用情報技術者試験の令和元年...
-
gccを行ってもexeファイルが生...
-
質問失礼します。 プログラム言...
-
Notepad++の関数リスト表示でC...
-
Windows formアプリで データグ...
-
Linux Cプログラミングを学ぶた...
-
トリプトファンってケト原性あ...
-
c言語
-
MACで動く実行ファイルをWindow...
-
C言語 列挙型(enum型)変数について
-
右ビットシフト
-
mallocについて
-
C言語 配列と関数の練習問題
-
Bitcoin、BTCはブロックチェー...
-
C++6.0でのresource.hについて
-
VisualStudio2022でC言語プログ...
-
大量のデータを読み込んで表示...
-
c言語
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体のメンバをfor文で回したい
-
batファイルでtelnetを起動⇒文...
-
mailto:の本文に文字数制限はあ...
-
mailto:の中に&を入れる
-
動的にプロパティ名を変えたい
-
時間の平均値を計算する方法を...
-
Bresenhamのアルゴリズムを用い...
-
携帯の良番を持ってると思いま...
-
UWSCで出目画像カウントしたい
-
「HSP」で左クリック判定がうま...
-
アクセスで有給休暇管理表を作...
-
Windows端末でのsyslog受信につ...
-
MACアドレスで逮捕できる?
-
RTX810でローカルルータとして...
-
ゲームプログラミングのネット...
-
「ナスネ」がPS4と繋がらないの...
-
Oculus Riftが映らない。セット...
-
PINGに応答するメリット,デメリ...
-
TCPとUDPについて
-
Solaris8 ルーティングの設定...
おすすめ情報