- ベストアンサー
関数がどうしても分かりません
こんにちは。 情報処理の専門学校に通っている1年です。 最近C言語の関数を習い始めたのですが、学校の授業が理解できず、 参考書などを読んでもいまいち理解できません。 頭が少し硬いようで、アルゴリズムがうまく考えれないようです。 この前の授業で Visual Basic で関数のプログラムを作る授業をしました。 n=辺 i=行 j=数で、 *(アスタリスク)を入力した数を辺として、三角形を出力するという関数を作りました。 たとえば * * * * * * * * * * のような三角形や、これの逆の∠の形の三角形です。 *(アスタリスク)はfor(i=1;i<=n;i++)で繰り返しました 関数は1つだけ作ればいいと言われたのですが、1つだけでどうしてできるのかが分かりません。 関数を使って*で三角や逆三角形や四角形や台形などの形を作るにはどのようなプログラムにしたらつくれるのでしょうか? 私自身、理解できていないので、質問の意味が分かりずらくてごめんなさい。 また、プログラムを作る際の考え方やアドバイスなどあればお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>Visual Basic で関数のプログラムを作る授業をしました。 このカテでよろしいのですか?。 ---------------------------------- >三角や逆三角形や四角形や台形などの形を作る 下の全体を台形、*を三角、%を逆三角形、@+*を四角形、ということ(◆)ですね。 (「投稿」がプロポーショナルなので歪んでます) @@@@ %*@@@ %%**@@ %%%***@ %%%%**** >関数は1つだけ作ればいいと言われたのですが、 反ってその方が「楽」かも・・、だってダラダラと書けばいいだけだから。 てか、生産性?のないプログラムになるなぁ・・。 ---------------------------------- ◆として「ダラダラと」(borlandC++5.6.4) c4 をいじくれば、あと2種類の台形が・・( B + C, A + B + C )。 >頭が少し硬いようで、アルゴリズムがうまく考えれないようです。 「アルゴリズム」って、もしや的をはずしたかな?。 ---------------------------------- #include <stdio.h> void OnlyKansu( int iTate ) { int iY, k, m; char c1[ 16 ], c2[ 16 ], c3[ 16 ], c4[ 32 ]; for( iY = 0; iY < iTate; iY++ ){ // 上段から下段へ for( k = 0; k < 16; k++ ) c1[ k ] = 0x20; for( k = 0; k < 16; k++ ) c2[ k ] = 0x20; for( k = 0; k < 16; k++ ) c3[ k ] = 0x20; for( k = 0; k < 32; k++ ) c4[ k ] = 0x20; for( k = 0; k < iTate; k++ ){ // 三角( C ) if( k <= iY ) c1[ k ] = '*'; } for( k = 0; k < iTate; k++ ){ // 逆三角形( A ) if( k >= ( iTate - iY - 1 ) ) c2[ k ] = '*'; } for( k = 0; k < iTate; k++ ){ // 四角形( B ) c3[ k ] = '*'; } for( k = 0; k < iTate; k++ ){ // 台形その1( A ) if( k >= ( iTate - iY - 1 ) ) c4[ k ] = '*'; } for( m = k; m < ( k + iTate ); m++ ){ // 台形その2( B ) c4[ m ] = '*'; } c1[ k ] = 0x00; // 文字列終端処理 c2[ k ] = 0x00; c3[ k ] = 0x00; c4[ m ] = 0x00; printf( "%s | %s | %s | %s\n", c1, c2, c3, c4 ); // 1行ずつ出力 } printf( "\n" ); } void main() { int iTate; for( iTate = 5; iTate < 9; iTate++ ){ OnlyKansu( iTate ); } } 注:インデントに全角空白を用いています。タブに一括変換して下さい。
その他の回答 (2)
- redfox63
- ベストアンサー率71% (1325/1856)
三角形の場合 引数が辺の長さ だけだと 2種類必要でしょう 向きを決定するフラグがあれば1つの関数で右上がり、右下がり両方に対応可能です 出力する際に 縦軸のループ 横軸のループ といった具合に組みます この横軸のループの中で 実際に出力するのが スペースなのか『*』なのかを判定して 出力させればいいでしょう 下記は一例です // nLenが辺の長さ for( y = 0; y < nLen; y++ ) { for( x = 0; x < nLen; x++ ) { if ( flag == TRUE ) { // 右下がりモード if ( x <= y ) { printf( "*" ); } else { printf( " " ); } } else { // 右上がりモード if ( x <= y ) { printf( " " ); } else { printf( "*" ); } } } printf( "\n" ); } 四角形と台形もフラグで斜辺の描画を制御してやればいいでしょう 台形でもいろいろあるので フラグが一種でよいか出力しだいでしょう 1) 三辺が直行して一辺だけが斜辺 ... 斜辺を右にするか左にするか 2) 上底/下底以外が斜辺である などありますので これを応用すれば 平行四辺形なども1つの関数で描画可能です
お礼
回答ありがとうございました。 flagを使うのですね。 参考にさせていただきます。
- anmochi
- ベストアンサー率65% (1332/2045)
ん~・・・・ん~・・・・。 関数一つで、三角形、逆三角形、四角形、台形を全部作りたいっていう意味なのかな?<「関数は一つだけ作ればいい」 「三角形、逆三角形、四角形、台形を全部作れる関数を作りたい」と表現した方が良いかな。もしそうであれば、三角形と逆三角形と、四角形と台形、この4つの図形の「同じところ」と「違うところ」を考えてみましょう。 同じところ、が基本アルゴリズム、違うところがパラメータ(関数の引数)になる訳です。 ではここでは引数を「高さ」と「天辺の列数」、「底辺の列数」の3つにしてみましょう。関数の中の概要は以下のようになります。 Public Sub DrawFigure(ByVal takasa As Integer, ByVal ten As Integer, ByVal tei As Integer) 高さ分だけループ(始まり) 現在の行の列数を計算する(tenとteiとtakasaから計算できるよね?) 列数だけ*を横に伸ばす 高さ分だけループ(終わり) End Sub 本来アルゴリズムとはC言語かVBかにかかわらず同じもので、そもそも言語がなくてもアルゴリズムは存在する。君は「A4の紙に鉛筆でy行分、x列分アスタリスクを書いていき、アスタリスクで三角形の図形を描く事」ができる。その時に頭で考えている内容がアルゴリズムだ(それがコンピュータにとって効率の良いアルゴリズムであるかどうかはともかくとして)。アルゴリズムの難しさは、人間が分かりやすいアルゴリズムと、機械が分かりやすいアルゴリズムが違うって所にあるんだと思うね。 また、将来プログラマーを目指しているのであれば、国語と数学を勉強すべし。国語は普通に日常会話ができれば良い(なんだこのクソあんもち馬鹿にしやがってと思うかも知れないが、正直これができないプログラマは君が想像しているその数百倍は居る)が、自分の伝えたい事を筋道立てて話す事ができればグッド。最初に結論を述べてその後結論の詳細を説明できるようになったら完璧だ。数学は、代数学、幾何学、確率、微積分について全部分かってる事が望ましい。同じ時間プログラマとして雇われても他の人から何歩も差をつける事ができるぞ。一時期プログラマは文系の方が鍛えたら伸びると言われてたけど、それは嘘(バブルの幻想)。プログラム(アルゴリズム)は数学なんだ。それらの基本数学が終わったらその後に情報数学(オートマトン理論など)、応用数学(フーリエ変換、ラプラス変換など)が続くので道は長いよ。
お礼
回答ありがとうございました。 基礎数学から応用数学まで必要なんですね。 勉強になりました。
お礼
回答ありがとうございました。 とても参考になりました。