無題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
blue

無題

#1

投稿記事 by blue » 15年前

立命館の前期の課題を復習してみるとわからなかったのでおしえてください。

重要課題 11..2
3色の縦長長方形がならんでできた国旗は世界に多くある。配列を使って、これらを RitsPenで描こう。CreatePEN()関数の引数はflagとする。

以下のように国番号を決める。

0:ギニア 1:コートジボワール 2:チャド 3:ナイジェリア 4:マリ
5:アイルランド 6:イタリア 7:フランス 8:ベルギー 9:ルーマニア
同じ順序で、それぞれの国旗を図11.1に示す。
図 11.1: 国旗

10行3列のint型2次元配列 flagsを考える。 各行は3つのint型の要素をもつので、それらで国旗の3色を表現する。 これを上記の番号にしたがって10行ならべたものが、 国旗のリストを示す配列である。まずは、flagsを設定する関数を作れ。 色を表す番号は RitsPenのChangeColor()関数での定義と同じとする。
ただし、このChangeColor()関数では白は定義されていないので、 今回は灰色で代用してもよい。

指定された色で縦長の長方形を描画する関数を作る。 ペンを上下に動かせば指定された色で長方形を塗りつぶせる。 国旗の高さを50とすると、
幅1のペンで下向きに50だけ、描線する。
幅1だけ、右に動かす。
幅1のペンで上向きに50だけ、描線する。
幅1だけ、右に動かす。
この動作を12回程度繰り返すと、長方形が描ける。RitsPenでは、 ペンの動作がわかりやすいように、意図的にペンの動きをゆっくりにしている。 これを高速化するには関数 ChangeSpeed()を第2引数を1にして呼べばよい。
もし白色を使うのであれば、ペンを透明にし、上記と同じことをすると RitsPenのキャンバスが白色だから白色を塗った場合と同じ効果が期待で きる。

2次元配列 flags の1つの行が与えられたときに、 その行に指定された3つの色にしたがって、国旗を描画する関数を作る。 指定された色で縦長の長方形を描画する関数を3回呼べばよい。
main関数では、まず、ユーザから国の番号を指定してもらう。 指定された番号に相当する2次元配列 flags の行を引数にして、 国旗を描画する関数をよぶ。
% ./flag
0から9までの整数で国を指定して下さい: 6
イタリア 緑,白,赤
% ./flag
0から9までの整数で国を指定して下さい: 10
間違った国番号です。
%

という問題で、下が自分が作ったソースです。

#include<stdio.h>
#include "RitsPen.h"
# define BUFFER_SIZE (256)
int get_int(void)
{
char buf[BUFFER_SIZE];

fgets(buf, BUFFER_SIZE, stdin);

return atoi(buf);
}

int flags(PEN pen,int color);

int main(void){
PEN pen;
int number;
pen=CreatePEN("flags");
ChangeSpeed(pen,1);
printf("0から9までの整数で国を指定してください");
number = get_int();

switch(number)
{
case 0:
printf(" ギニア 赤、黄、緑");
flags(pen,1);
flags(pen,6);
flags(pen,3);

case 1:
printf("コートジボワール オレンジ、白、緑 ");
flags(pen,4);
flags(pen,7);
flags(pen,3);

case 2:
printf("チャド 青、黄、赤 ");
flags(pen,2);
flags(pen,6);
flags(pen,1);
case 3:
printf("ナイジェリア 緑、白、緑 ");
flags(pen,3);
flags(pen,7);
flags(pen,3);
case 4:
printf("マリ 緑、黄、赤 ");
flags(pen,3);
flags(pen,6);
flags(pen,1);
case 5:
printf("アイルランド 緑、白、オレンジ ");
flags(pen,3);
flags(pen,7);
flags(pen,4);
case 6:
printf("イタリア 緑、白、赤 ");
flags(pen,3);
flags(pen,7);
flags(pen,1);
case 7:
printf("フランス 青、白、赤 ");
flags(pen,2);
flags(pen,7);
flags(pen,1);
case 8:
printf("ベルギー 黒、黄、赤 ");
flags(pen,0);
flags(pen,6);
flags(pen,1);
case 9:
printf("ルーマニア 青、黄、赤 ");
flags(pen,2);
flags(pen,6);
flags(pen,1);

ClosePEN pen;
return 0;
}


int flags(PEN pen,int color){
int i;
ChangeColor(pen,one);
for(i=0;i<12;i++){
UsePEN(pen,50,90);
UsePEN(pen,1,-90);
UsePEN(pen,50,-90);
ChangeWidth(pen,0);
UsePEN(pen,1,-90);
}

return color;
}


19行目がエラーになるのですが何が間違っているのかわかりません
わかる方おしえてください。

たいちう

Re:無題

#2

投稿記事 by たいちう » 15年前

19行目は、これですか?

> ChangeSpeed(pen,1);

行番号やエラーメッセージを教えてくれないと行の特定すらままなりません。
さらに、"RitsPen.h"というのは、多分授業で用意されているヘッダーファイルでしょう。
ここにChangeSpeedの定義があるのでしょうから、授業を知らない人には、
どんなエラーか分かりません。
ヘッダーファイルを添付することで、回答できる人が増えるかもしれません。

その他、switch文にbreakがなかったり、{}(括弧)が対応していなかったりと、
色々ミスが多そうです。

初級者

Re:無題

#3

投稿記事 by 初級者 » 15年前

>10行3列のint型2次元配列 flagsを考える。

この定義はどこにあるんですか?

blue

Re:添付できませんでした

#4

投稿記事 by blue » 15年前

添付できない種類・形式のファイルみたいでてんぷできませんでした。

たいちう

Re:添付できませんでした

#5

投稿記事 by たいちう » 15年前

拡張子をtxtにするとか。

a

Re:

#6

投稿記事 by a » 15年前

上のフロッピーみないなのを押すとファイルがダウンロードできませんか?

a

Re:

#7

投稿記事 by a » 15年前

上のフロッピーの画像を押せば実行するのに必要なフォルダがダウンロードができます。
やり方は、作ったC言語のソースファイルをritspen/workspaceに入れる。
コンパイルは gcc -o (実行ファイル名)(作ったC言語のファイル名) RitsPen.o と入力する。
新しく端末を開いて
cd ritspen
./canvas.sh
と入力してcanvasを立ち上げる。
実行ファイルを実行させる。

何かわかりましたら教えてください。お願いします

fatens

Re:

#8

投稿記事 by fatens » 15年前

ClosePEN pen; → ClosePEN(pen);

ChangeColor(pen,one); → ChangeColor(pen,color);

for(i=0;i<12;i++){
UsePEN(pen,50,90);
UsePEN(pen,1,-90);
UsePEN(pen,50,-90);
ChangeWidth(pen,0); → 不要
UsePEN(pen,1,-90); → UsePEN(pen,1,90);
}

あとはbreakを入れて、{}の対応を正しくすることで、動くと思います。


ただ、初級者さんも指摘されているように、このままでは題意を満たしていないので
さらに修正していく必要があるかと思います。
画像

blue

Re:

#9

投稿記事 by blue » 15年前

書き換えました。
コンパイルすると50行目に警告がでて戻り型がvoidの関数で、'return'に値があります
と表示されます。どう直せばよいでしょうか?
#include<stdio.h>
#include "RitsPen.h"
# define BUFFER_SIZE (256)
int get_int(void)
{
char buf[BUFFER_SIZE];

fgets(buf, BUFFER_SIZE, stdin);

return atoi(buf);
}





void flags(int a[/url]){
PEN pen;
pen = CreatePEN("flags");

int x,y,z;

for(x=0;x<12;x++){
ChangeColor(pen,a[0] );
UsePEN(pen,50,90);
UsePEN(pen,1,-90);
UsePEN(pen,50,-90);
ChangeWidth(pen,0);
UsePEN(pen,1,-90);
}
for(y=0;y<12;y++){
ChangeColor(pen,a[1] );
UsePEN(pen,50,90);
UsePEN(pen,1,-90);
UsePEN(pen,50,-90);

UsePEN(pen,1,90);
}

for(z=0;z<12;z++){
ChangeColor(pen,a[2] );
UsePEN(pen,50,90);
UsePEN(pen,1,-90);
UsePEN(pen,50,-90);
ChangeWidth(pen,0);
UsePEN(pen,1,-90);
}

ClosePEN(pen);
return a;
}

int main(void){
PEN pen;
int number;


printf("0から9までの整数で国を指定してください");
number = get_int();
int a[10][3]={
{1,6,3},
{6,7,3},
{2,6,1},
{3,7,3},
{3,6,1},
{3,7,6},
{3,7,1},
{2,7,1},
{0,6,1},
{2,6,1},
};

switch(number)
{

case 0:
printf(" ギニア 赤、黄、緑\n");
/* flags(pen,1);
flags(pen,6);
flags(pen,3);*/
break;
case 1:
printf("コートジボワール オレンジ、白、緑 \n");
/*flags(pen,4);
flags(pen,7);
flags(pen,3);*/
break;
case 2:
printf("チャド 青、黄、赤 \n");
/*flags(pen,2);
flags(pen,6);
flags(pen,1);*/
break;
case 3:
printf("ナイジェリア 緑、白、緑\n ");
/*flags(pen,3);
flags(pen,7);
flags(pen,3);*/
break;
case 4:
printf("マリ 緑、黄、赤\n ");
/*flags(pen,3);
flags(pen,6);
flags(pen,1);*/
break;
case 5:
printf("アイルランド 緑、白、オレンジ\n ");
/*flags(pen,3);
flags(pen,7);
flags(pen,4);*/
break;
case 6:
printf("イタリア 緑、白、赤 \n");
/* flags(pen,3);
flags(pen,7);
flags(pen,1);*/
break;
case 7:
printf("フランス 青、白、赤 \n");
/* flags(pen,2);
flags(pen,7);
flags(pen,1);*/
break;
case 8:
printf("ベルギー 黒、黄、赤 \n");
/*flags(pen,0);
flags(pen,6);
flags(pen,1);*/
break;
case 9:
printf("ルーマニア 青、黄、赤 \n");
/*flags(pen,2);
flags(pen,6);
flags(pen,1);*/
break;
default:
printf("間違った入力");
break;
}
flags( a[numbe[/url]);
return 0;
}

シエル

Re:

#10

投稿記事 by シエル » 15年前

戻り値がvoidなら、returnで値を返す必要はないですよ。

blue

Re:

#11

投稿記事 by blue » 15年前

できましたが、10以上の数字を入力すると描写はやめてほしいのに国旗が描写されてしまいます。
どこを直せばよいと思いますか?

fatens

Re:

#12

投稿記事 by fatens » 15年前

defaultのときbreakせずにreturnすれば良いと思います。

blue

Re:

#13

投稿記事 by blue » 15年前

できました
ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る