ダイヤ作成

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

ダイヤ作成

#1

投稿記事 by あくあ » 15年前

はじめまして。
初投稿になります。
早速ですが、先日学校の課題で*を使って三角形・逆三角形・三角旗・ダイヤ・六角形・星型を表示させなさいというのが出ました。
三角旗までは自力で出来たのですが、ダイヤで詰んでいます。
最初に入力をさせてその数を辺にして表示するという感じです。
おそらくダイヤだと入力5で
*
***
*****
***
*
こんな感じに出ればOKだと思います。
コンバイラ?とかよく分からないのですが、とりあえずOSは7で、Visual Studio2008のcppファイルを使ってます。
自分で書いてみたのですがエラーコードが出て、どこが間違っているのか分からないのでご教授頂けると嬉しいです。以下自分で書いたもの

#include <stdio.h>
void daiya(int);
void main(void)
{
int cnt1, cnt2, n;
scanf("%d",&n);
for(cnt1 = 1; cnt1 <= n; cnt1++)
{
for(cnt2 = 1; cnt2 <= n*2; cnt2++)
{
if(cnt2 <= n-cnt1 || cnt2 >= n+cnt1)
{
printf(" ");
}else{
printf("*");
}
}
printf("\n");
daiya(n);
}
void daiya(int a)
{
int cnt3, cnt4;
for(cnt3 = a-1; cnt3 > 0; cnt3--)
{
for(cnt4 = 1; cnt4 <= a*2; cnt4++)
{
if(cnt4 <= a-cnt3 || cnt4 >= a+cnt3)
{
printf(" ");
}else{
printf("*");
}
}
pritnf("\n");
}
return;
}

以下エラーコード
error C3872: '0x3000': この文字を識別子で使用することは出来ません
error C4430: 型指定子がありません - int と仮定しました。 メモ: C++ は int を既定値としてサポートしていません
error C3861: 'daiya': 識別子が見つかりませんでした

の3つです。
入力ミスもしくは掻き方が違っていたらご指摘下さい。
ちなみに自分は関数に関してはまだ何となくしか分かっておらず、そのため関数名は適当に付けました。
今まで見た事の無いエラーコードなのでどうしたらいいのか分かりません。
誰か教えて頂けると助かります。
課題の期限は7/9です。

長文失礼しましたm(_ _)m

パコネコ

Re:ダイヤ作成

#2

投稿記事 by パコネコ » 15年前

前まったく(ほとんどかな?)同じ課題持ってきた人いたよ!
☆せっかく作ったのに無駄にならなくてよかった。
と思ったけど、めんどくさい書き方してる…指定があったのかな?
ワイ、サブ苦手だからお手上げだね。
スタディCで起動してみたら宣言に誤りがあるらしい…よく見たら「}」が足りない
エラーの場所は
> void daiya(int a)
ここ、この前から数えてみてね。
>pritnf("\n");
パソコンに怒られた…
==================
ごめん、頼みたいことあったんだ…三角旗ってどんな形?
1辺の大きさが同じとした場合です(ぴらみっとあーととかで困ってたんだ♪) 画像

パコネコ

Re:ダイヤ作成

#3

投稿記事 by パコネコ » 15年前

直して起動したらすごいことになった…なんでわざわざサブルーチンで作ろうとしたんですか?
(あ、またポイント落してる…最近よく落しちゃうんですよね)
出力結果が1行づつしかコピーできないから張らないあけど…おしいとこまでできてるのに…
==================
と、「}」の位置を勝手に解釈してました
メインで最後の出力のすぐ後に「}」ですね。
すいません、上のは勘違いです。 画像

あくあ

Re:ダイヤ作成

#4

投稿記事 by あくあ » 15年前

入力ミスすいません(汗)
「}」付けるの忘れてました;

三角旗は
*
**
***
****
*****
****
***
**
*
こんな感じです。(入力5の場合)

サブルーチン…?
すいませんそういう用語まだ分からないです><

パコネコ

Re:ダイヤ作成

#5

投稿記事 by パコネコ » 15年前

/*
ピラミットアートの数値を一つ入力し、その個数分の'*'を1辺とする
正方形、三角形、逆三角形、三角旗、ダイヤ型、六角形、星形、などの描画どう作るかわからないので教えてくれませんか。
*/
前(先月)こういう書き込みがありまして…やっぱりそういう形になりますよね。
でもそれだと1辺のあたりでだめになるんですよね…
>サブルーチン
ワイはそういう名前だって習っていたので…ワイが間違っていたらすいません(;一_一)
/*
void daiya(int a)
{
*/
これのことだと思って言っていました。
間違っていたらごめんなさい
残りの課題もがんばってください

あくあ

Re:ダイヤ作成

#6

投稿記事 by あくあ » 15年前

>ピラミットアートの数値を一つ入力し、その個数分の'*'を1辺とする
要するに、入力が5なら三角旗は
*
**
***
**
*
こうなるべきだってことですか?
逆三角までは入力した個数分の'*'=1辺なんですが、三角旗からは入力した個数=横の行の最大出力数(?)になるんです。(説明下手ですいません;)
入力した個数をnとすると、三角旗の1辺は2n-1になります。
六角形と星型は…どうなるんですかね?
とりあえず先生に説明されたのが三角旗までだったので…
六角形はおそらくnが1辺になって、
*****
*******
*********
*********
*********
*********
*********
*******
*****
ななめのところの1辺が3しかありませんが、多分コレでいいんだと思います。
星はダイヤと同じで、横の出力の数がnになればいいのかと…(曖昧ですいません)

>void daiya(int a)
どうしてこれを使ったのかってことですか?
この形を教わったからとしか言いようが無いです。
'daiya'と'a'の所は何でもいいと言われたので適当にしましたが、基本的な形は習った通りに書きました。
コレがエラーの原因なんですか?

Dixq (管理人)

Re:ダイヤ作成

#7

投稿記事 by Dixq (管理人) » 15年前

> あくあさん

こんにちは。
以前似たような投稿がありました。
http://www.play21.jp/board/formz.cgi?ac ... &rln=55766

学校の課題ならひょっとしたら同じクラスの人だったりするかもしれませんね。

ところで、この課題について、
一つならばエイヤと無理やりプログラムを書いて済ますのもありかもしれませんが、
似たようなものが沢山あるようですので、どの課題にも対応できるようなプログラムを考えてみます。

既に以下の事はおわかりかと思いますが、改めて説明しますね。

画像

今、この図形の第一象限の青い部分はどう表されるでしょうか?
y切片がNumで、傾きが-1ですから

y<=-x+Num ... (1)

となりますよね。
第四象限まで考えるとひし形の範囲はどうなるでしょう。

画像

y<=-x+Num ... (1)
y<= x+Num ... (2)
y>=-x-Num ... (3)
y>= x-Num ... (4)

で囲まれた範囲になりますよね。

(1)かつ(2)かつ(3)かつ(4) の条件を満たす座標が真・・つまり*を表示すべき座標です。
それ以外は空白を表示すべき座標です。 ★1

今、大きさ10のひし形を考える時、
-5<=x<=5
-5<=y<=5
の格子点を全て調べて★1の条件を満たすかどうか判定させてみましょう。
重ねて言いますが、満たせば*を、満たさなければ空白を表示します。

まず私の書いたプログラムをご覧ください

★1を判定する機能を果たす関数をJudge関数として作りました。
実行してみて好きな数値を入力してみて下さい。
#include <stdio.h> 

// 現在の座標が大きさNumのひし形の中かどうか判定する
int Judge( int x, int y, int Num ){
    if( y<= x+Num && y<=-x+Num && 
        y>= x-Num && y>=-x-Num ){//中ならば
        return 1;//1を返す
    }
    else{//外ならば
        return 0;//0を返す
    }
}

int main(){
    int x, y, n;

    scanf( "%d", &n );//大きさを取得

    for( y=-n/2; y<=n/2; y++ ){//y方向ループ
        for( x=-n/2; x<=n/2; x++ ){//x方向ループ
            if( Judge( x, y, n/2 ) == 1 ){//現在の座標が大きさn/2のひし形の中かどうか判定する
                printf("*");//中ならば*を表示
            } 
            else {
                printf(" ");//外ならば空白を表示
            }
        }
        printf("\n");//一行ずつ改行
    }

    return 0;
} 

実行結果
9
    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *
※(0,0)を中心としている為、偶数は考慮していません。
 

課題が変わった時は、青字部分の条件式のみ(必要ならば赤字部も)変更してあげればいい事になります。
こうするとどの課題にも対応できて楽なのではないかと思います。

このプログラムを三角旗に適用する事が出来れば順次課題も解けるのではないでしょうか。

あくあ

Re:ダイヤ作成

#8

投稿記事 by あくあ » 15年前

>管理人様
詳しい解説、回答ありがとうこざいますm(_ _)m

その方の投稿は読みました。
ググった時に、このサイトのトップで出てきたので。
自分が言うのも何ですが、あまりに丸投げですよね^^;

>一つならばエイヤと無理やりプログラムを書いて済ますのもありかもしれませんが
'daiya'をエイヤにするってことですか?
してみたところ同じエラーが…

プログラムまで書いて頂きありがとうございます。
実行したみたらちゃんとひし形が出てきました。
ですが、習ったプログラムの形とは違うのでOKが出るかどうか…

そのプログラムで三角旗を作ろうとしたら上の2行が出力されませんでした。
関数自体いまいち理解出来てないので無理も無いですよね。

Dixq (管理人)

Re:ダイヤ作成

#9

投稿記事 by Dixq (管理人) » 15年前

> 習ったプログラムの形とは違うのでOKが出るかどうか…

あ、読み飛ばしていました。

> 入力した個数をnとすると、三角旗の1辺は2n-1になります。

ということは、ダイヤ型で言うと
4
   *
  ***
 *****
*******
 *****
  ***
   *
こうならないといけないということでしょうか?
でもscanfの後に一行足せば修正可能ですね。

scanf( "%d", &n );//大きさを取得

n = ○○○;

ここで、nの値を変えればOKです。

> >一つならばエイヤと無理やりプログラムを書いて済ますのもありかもしれませんが
> 'daiya'をエイヤにするってことですか?

どういうことでしょう?
すみません、私の表現がおかしかったですね。
私は、
「効率的だの汎用的だの考えるのめんどくさい!え~い、無理やりこれで実装してしまえ!」
という、エィヤッ!と作ってしまうという意味で言っただけなのでプログラム的な意味は全くありません。

> してみたところ同じエラーが…

エラーが出た時はそのエラーメッセージを一緒に書いて頂ければ何が悪いのか回答者が解りやすいと思います。
どのようなエラーが出ました?

> 関数自体いまいち理解出来てないので無理も無いですよね。

どの辺りが解りにくいですか?
また、書き換えてうまくいかなかったプログラムはどんなプログラムですか?

・エラーが発生した場合はエラーメッセージを。
・プログラムが期待通りに動かなかった場合はプログラムソースを。

一緒に添付することで、回答がスムーズになると思います。

では、私が描いた図の上の図のような図形なら描画出来ますか?
第一象限のみの三角形です。

Dixq (管理人)

Re:ダイヤ作成

#10

投稿記事 by Dixq (管理人) » 15年前

自作関数についての理解がまだあやふやだと言う事ですので、勉強してみましょう。

http://www5c.biglobe.ne.jp/~ecb/c/c00.html

の7章あたりを読んで頂ければと思います。

他入門サイトもみてみてください。

11章
http://www9.plala.or.jp/sgwr-t/

読んだら以下をご覧ください。
#include <stdio.h> 

int GetValue(){
    return 5;
}

int main(){
    int x;
    x = GetValue();
    
    printf("返ってきた値は %d です", x);

    return 0;
}

何故5が表示されるか解りますよね。ならば

#include <stdio.h> 

int GetValue( int z ){
    if( z>=10 )
        return 1;
    else
        return 0;
}


int main(){
    int x;

    scanf("%d", &x );

    if( GetValue(x) == 1 )
        printf("入力された値は10以上です");
    else
        printf("入力された値は10未満です");

    return 0;
} 

これもおわかりいただけるかと思いますがいかがでしょう?
 

あくあ

Re:ダイヤ作成

#11

投稿記事 by あくあ » 15年前

>「効率的だの汎用的だの考えるのめんどくさい!え~い、無理やりこれで実装してしまえ!」

そういう意味だったのですね^^;
私はてっきりエイヤ=eiyaだと…
だから'daiya'を'eiya'に変えてみたら最初と同じエラーが出たってことです。

以下エラーコード
error C3872: '0x3000': この文字を識別子で使用することは出来ません
error C4430: 型指定子がありません - int と仮定しました。 メモ: C++ は int を既定値としてサポートしていません
error C3861: 'daiya': 識別子が見つかりませんでした

まぁ関数名変えただけなので当たり前ですよね。

>では、私が描いた図の上の図のような図形なら描画出来ますか?
>第一象限のみの三角形です。

えと、三角形を'*'で表示させるってことですか?
それでしたら自力で出来ました。
ご希望ならプログラム書きますが…

URLありがとうございます。

>読んだら以下をご覧ください。
このプログラムであればURL読まなくても何が起こっているのかは分かりました。
ですが、最初に書いて頂いたプログラムはちょっと複雑でよく分からないって感じです。

fatens

Re:ダイヤ作成

#12

投稿記事 by fatens » 15年前

>error C3872: '0x3000': この文字を識別子で使用することは出来ません

おそらくソースコードのどこかに全角スペースが入っていますので削除してください。

Dixq (管理人)

Re:ダイヤ作成

#13

投稿記事 by Dixq (管理人) » 15年前

エラーの原因はfatensさんが仰る通りだと思います。

> えと、三角形を'*'で表示させるってことですか?
> それでしたら自力で出来ました。
> ご希望ならプログラム書きますが…

これはご自分のプログラムでということでしょうか?
私が書いたプログラムを変更して、上の事が出来ますか?という意味だったのですが、いかがでしょう?
私のプログラムを今後の課題でお使いにならないのでしたら良いと思いますが、
もし使われるのでしたら意味を理解して頂く為に質問させて頂きました。

> 最初に書いて頂いたプログラムはちょっと複雑でよく分からないって感じです。

どの辺が解らないでしょうか?

int GetValue( int z ){
if( [color=#FF0000>★[/color] )
return 1;
else
return 0;
}

プログラムとしては赤の部分が変わっただけです。
赤の部分の判定式は図に書いた式のまんまです。

それとも関数よりfor文の回り方が解らないのでしょうか?

パコネコ

Re:ダイヤ作成

#14

投稿記事 by パコネコ » 15年前

/*
どうしてこれを使ったのかってことですか?
この形を教わったからとしか言いようが無いです。
'daiya'と'a'の所は何でもいいと言われたので適当にしましたが、基本的な形は習った通りに書きました。
コレがエラーの原因なんですか?
*/
私(注意されたので以後私にします)がただ苦手なだけです。
使わなくていいなら基本的に使わないので…使う利点がありませんし
たとえば2か所以上で同じ(値は別でも)ことをしないといけないとき以外に使うと、見づらく感じてしまって・・・あくまでも私の個人的な意見ですが
勉強のために使うなら問題ありませんが、一か所ならお勧めしません。
===================
一か所でもif文などの条件式として書き込むんでしたら必要です。
条件式に複雑な式が入ったらいやですから。
応用すれば階乗(自分で自分を呼ぶ)などを使っていろいろなこともできます。
(名前間違ってたらすいません) 画像

fatens

Re:ダイヤ作成

#15

投稿記事 by fatens » 15年前

>応用すれば階乗(自分で自分を呼ぶ)などを使っていろいろなこともできます。

再帰ですね。
そのもっともよくある例が階乗を求める計算だと思います。
int factorial(int n)
{
if (n <= 1)
return 1;

return n * factorial(n - 1);
}

あくあ

Re:ダイヤ作成

#16

投稿記事 by あくあ » 15年前

>fatensさん、管理人様

仰る通り、スペースで全角使っているところがありました。
直してみたところ、エラーが無くなって無事にひし形が出来ました。

それと、ひし形の形なんですが、自分が勘違いしていたみたいで、入力が5の場合
*
***
*****
*******
*********
*******
*****
***
*

となるのが正解だということです。
管理人様が仰っていた形で合っていました。すいません。

>私が書いたプログラムを変更して、上の事が出来ますか?

あのプログラムで三角形はやってないです。
三角旗にはチャレンジしたんですが、

***
****
*****
****
***
**
*

しか表示されず、どうしても上の2行が出力されなかったです。
そのプログラムコードに関しては、今はちょっと時間が取れないのでまた後で書きますね。

>それとも関数よりfor文の回り方が解らないのでしょうか?

そうかもしれないです。
二重ループからさらにifで分岐してるので尚更ややこしくて…

Dixq (管理人)

Re:ダイヤ作成

#17

投稿記事 by Dixq (管理人) » 15年前

> あくあさん

> また後で書きますね。

ということだったので、続きは書いていないのですが、その後どうでしょうか?
過去ログに落ちそうだったので、書き込みしました。

閉鎖

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