• ベストアンサー

関数がどうしても分かりません

こんにちは。 情報処理の専門学校に通っている1年です。 最近C言語の関数を習い始めたのですが、学校の授業が理解できず、 参考書などを読んでもいまいち理解できません。 頭が少し硬いようで、アルゴリズムがうまく考えれないようです。 この前の授業で Visual Basic で関数のプログラムを作る授業をしました。 n=辺 i=行 j=数で、 *(アスタリスク)を入力した数を辺として、三角形を出力するという関数を作りました。 たとえば * * * * * * * * * *      のような三角形や、これの逆の∠の形の三角形です。 *(アスタリスク)はfor(i=1;i<=n;i++)で繰り返しました 関数は1つだけ作ればいいと言われたのですが、1つだけでどうしてできるのかが分かりません。 関数を使って*で三角や逆三角形や四角形や台形などの形を作るにはどのようなプログラムにしたらつくれるのでしょうか? 私自身、理解できていないので、質問の意味が分かりずらくてごめんなさい。 また、プログラムを作る際の考え方やアドバイスなどあればお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.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 );  } } 注:インデントに全角空白を用いています。タブに一括変換して下さい。

okame5131
質問者

お礼

回答ありがとうございました。 とても参考になりました。

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

三角形の場合 引数が辺の長さ だけだと 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つの関数で描画可能です

okame5131
質問者

お礼

回答ありがとうございました。 flagを使うのですね。 参考にさせていただきます。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

 ん~・・・・ん~・・・・。  関数一つで、三角形、逆三角形、四角形、台形を全部作りたいっていう意味なのかな?<「関数は一つだけ作ればいい」 「三角形、逆三角形、四角形、台形を全部作れる関数を作りたい」と表現した方が良いかな。もしそうであれば、三角形と逆三角形と、四角形と台形、この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列分アスタリスクを書いていき、アスタリスクで三角形の図形を描く事」ができる。その時に頭で考えている内容がアルゴリズムだ(それがコンピュータにとって効率の良いアルゴリズムであるかどうかはともかくとして)。アルゴリズムの難しさは、人間が分かりやすいアルゴリズムと、機械が分かりやすいアルゴリズムが違うって所にあるんだと思うね。  また、将来プログラマーを目指しているのであれば、国語と数学を勉強すべし。国語は普通に日常会話ができれば良い(なんだこのクソあんもち馬鹿にしやがってと思うかも知れないが、正直これができないプログラマは君が想像しているその数百倍は居る)が、自分の伝えたい事を筋道立てて話す事ができればグッド。最初に結論を述べてその後結論の詳細を説明できるようになったら完璧だ。数学は、代数学、幾何学、確率、微積分について全部分かってる事が望ましい。同じ時間プログラマとして雇われても他の人から何歩も差をつける事ができるぞ。一時期プログラマは文系の方が鍛えたら伸びると言われてたけど、それは嘘(バブルの幻想)。プログラム(アルゴリズム)は数学なんだ。それらの基本数学が終わったらその後に情報数学(オートマトン理論など)、応用数学(フーリエ変換、ラプラス変換など)が続くので道は長いよ。

okame5131
質問者

お礼

回答ありがとうございました。 基礎数学から応用数学まで必要なんですね。 勉強になりました。

関連するQ&A

  • 関数がうまく作れません。

    okame5131 C言語をやり始めたばかりなのですが、関数がよく理解できず困っています。 関数で*(アスタリスク)とスペースを使って*マークの図形を出力するというプログラムを作ろうと思っているのですが、うまくできません。 visual studio 2005でプラグラムを作り、デバック無しで実行すると http://www.dejavu.jp/~webmaster/upbbs/users/test/img/1215012104.jpgのようなアスタリスクの形を作るにはどうしたらいいでしょうか? 私はこの図形を上の部分、真ん中、したの部分に分けて考えて、 色々な関数を組み合わせて*の形作りたいのですが・・・。 自分で途中まで作ってみたのですが、訳が分からなくなってきました。 自分で作ったやつは(関数部分だけです) void hoshi(int n) { int i1,i2,cnt,j; //n=辺 i=行 j=数     n1=0 n2=n for(cnt=1;cnt<=n;cnt++) { for(j=1;j<=2;j++) { printf("* "); まで作ったのですが、混乱してきました。 どなたか*を作るためのプログラムを教えていただけませんか? また、作る際のアドバイスがあったらお願いします。

  • 関数の容量を知るには?

    MAPファイルで調べるのではなく、プログラム中からある関数の大きさ(コンパイル後のバイナリのバイト数)を調べる方法は無いでしょうか? 例えば、 void abc(void) { printf("dummy\n"); } というabc関数があったとします。 この関数のコンパイル後のバイナリのバイト数を、 int i; i = sizeof( abc ); みたいな形で調べられないでしょうか? 宜しくお願いします。

  • 三角関数について質問です

    ご閲覧ありがとうございます。 個人レベルで3Dプログラムの製作をしているのですが、その中でビルボードを行っていました。 ビルボート自体は行列を用いれば簡単に実現できますが、その際、 arctanを用いて2つのベクトルの迎角を求める必要があります。 このarctanなのですが、逆三角関数ということですので角度xがあるとして、 x = arctan( tan(x) ) が成り立つということだけしか理解していません。 プログラムだけならば調べればサンプル程度はすぐに入手できるのですが、 やはり三角関数の表面だけでも理解できないのは問題だろうと思ったので質問させて頂きました。 いくら三角関数を調べても、直角三角形の比がどうたらとの記述が多いのですが、 それが何?としか思えません。 そもそもsinθは角度なの?辺なの?それとも式?図によって位置が違わない? といった有様です。 冒頭のプログラムの話に戻るのですが、いくらネットで検索しても三角関数の説明は 文章と幾何学的なグラフしか載せられておらず、やはり何も得られるものがありませんでした。 できれば、図を多用したサイトなのがあると希望が持てそうなのですが…。 そもそも高校時代から公式を丸暗記していただけでしたので…今ではそれすら完全に忘れています。 そこで、三角関数・逆三角関数をご教授して頂きたいと思います。 特にお教え頂きたいのは、『そもそも三角関数はどう理解したらいいのか?』です。 同じく、その辺りが非常に分かりやすい書籍やサイト(高校数学や大学生向けの書籍 ではなく、ゲーム関連の実用書です)をご存知でしたらそちらをお教え頂けないでしょうか? 思い切りの初心者ですので質問内容に不備があるかもしれませんが ご回答頂けると助かります。 よろしくお願いします。

  • 逆三角関数について

    今、自分で逆三角関数について調べているのですが逆三角関数について詳しく書いてあるサイトを教えてほしいのですが… 例えば、逆三角関数の定義からそのグラフ、値の求め方など高校数学で理解できるように書いているサイトを教えてください。お願いします。

  • 三角関数について

    三角関数について 三角関数がとても苦手です; 特にグラフに入ってからちんぷんかんぷん で困ってます・・・。 グラフが何を書いているのかもわかりません。 学校の先生に聞いても説明がわかりにくくて どうしようもない状態です; どうすれば理解できるようになるのでしょうか? 三角関数の初歩からやるべきでしょうか?

  • 素数 再帰関数

    メイン #include<stdio.h> extern void count_primes(void); extern void print_primes(void); int max; int count; int primes[1000] int main(void) { printf("Uper limit: "); scanf("%d",&max); count_primes(); print_primes(); } 素数を求める(関数呼び出し) extern int nextprime(int n); extern int max; extern int count; extern int primes[]; void count_primes(void) { int i; count=0; for(i=2;i<=max;i=nextprime(i)){ primes[count++]=i; } リカーバシブ(次の素数) int nextprime[int n] { int i; for(;;){ n++; for(i=2;i*i<=n;i=nextprime(i)){ if(n%i==0) break; } if(i*i>n) break; } return n; } 素数プリント #include<stdio.h> extern int count; extern int primes[]; void print_primes(void) { int i for(i=0;i<count;i++){ if((i>0)&&(i%10==0) printf("\n"); printf(" %6d",primes[i]); } printf("\n素数の数 %d\n",count); } これら4つのモジュールで素数 nが求められますがアルゴリズム理解できません。この2つの関数のアルゴリズムについて、ご教授ください。め

  • 超高次の多項式の原始関数を求めたいのですが

    f(x) = (n-x)(n-1-x)(n-2-x).....(n-m-x) n: 大きな自然数(例えば1000000など) m: n>mの大きな自然数(例えば100000など) という多項式 f(x)の原始関数を高速に求めるアルゴリズムを考えて います. f(x)を具体的に展開してから原始関数を求めれば簡単だと思い,上記 の式を展開するプログラムを書いたのですが,組み合わせの計算を する必要が生じて,mの値が大きな時に高速に計算できませんでした. 原始関数を直接導出しようと,いろいろ場合分けして考えてみたので すが挫折しました. アドバイス頂けませんでしょうか? よろしくお願いします.

  • 再び三角関数

    前に一度質問させていただいたのですが、逆三角関数を使わずに角度を求める方法をもう一度教えていただきたいのです。考え出したら眠れなくなってしまって…。 なので今度は具体的に、三辺が3:4:5の三角形のときの角度を逆三角関数を使わずに求める方法を教えて下さい。こまかい計算も理解してみたいので、暇な方いらっしゃいましたら付き合っていただけませんか。

  • 数学 関数

    教科書1ページも進みませんでした。1学期ならありえなかったんですが、だんだん授業でうるさくなり、声は聞こえず、先生が注意すればますます荒れる こんだけ質問してる割に何も分かってません。 数学Iと数学IIって教科なんですが、 数学IIって方は三角方程式やれば、追いつけそうですが、 数学Iがものすごい進みが早いんです。 ですが自分は遅れてるくせに教科書1ページも進まない。 授業では5ページくらい進む。 三次関数 四次関数 分数関数 偶関数奇関数の判断 無理関数 逆関数 指数関数 対数関数 多分、1回前の授業が指数法則の応用だったので、今日の授業で指数関数即効終らせて、対数関数ら辺まで行くでしょう。 指数関数対数関数はまだやってないからいいとしても、残りは全部やったのにわかりません。線の書き方もですが、グラフに何書けばいいのか?とかも分かりませんし。 三次関数 四次関数 偶関数奇関数の判断なんて、全部あわせて1時間で終りましたよ。 その割にテストで出るから理不尽な気がするんですよ。 まあ分数関数は書けます。反比例の平行移動するやつです 何書くか未だに分からないし、先生に聞けば、何かずれたこと聞いてる的に言われて、最終的に聞いてる意味分からないと言われるんですね。 他の人も当然騒いでるから分からないと嘆いてますが、その状況から抜け出そうとしても抜けれないので、そいつらと一緒なんですけどね。 元々落ちこぼれてれば、悪い点ガッチリ取れるんですが、1学期数学は全部満点だったので、これで0点なんて取ったら本当にやばいんです。 最悪です。

  • C言語プログラム

    C言語プログラム ある数を入力して、入力された数を一辺とする図形を描くプログラムを作りたいんです。 分かりやすくすると、 入力された数が5だった時、画面には ***** ***** ***** ***** ***** ↑こう出力させたいんです。 四角だけじゃなくて、 * ** *** **** ***** ↑こういう三角とか、逆三角とか、 *        * **     *** ***  ***** **     *** *        * こんなかんじでいろんな形を描けるようにしたいんです。 C言語で、for文の二重ループを使うようにとのことなんですが、 どうすればいいでしょうか。 こういうのってズルですけど、何かヒントでも貰えればと思っています...。

専門家に質問してみよう