質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.03%

  • Java

    12102questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • C

    3065questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • アルゴリズム

    342questions

    アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

サブルーチン導入課題

解決済

回答 8

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 355

rubato6809

score 376

前提

未経験者を含む若者にプログラミングを指導する機会があります。使う言語はJava、Cが多いですが、フローチャートを用いてアルゴリズムを考えてもらう時間もあります。皆様にご教示いただきたいのは、彼らに考えてもらうプログラミング或いはアルゴリズムの課題です。

質問

初学者にサブルーチン(関数)のありがたみを実感してもらえる、それでいて手頃なサイズの課題はないでしょうか。

条件

サブルーチンを使わなくても作れるけど、そのなかのある機能をサブルーチンとして独立させると、全体の見通しがよくなるような課題。ただし課題として提示する際に「ここをサブルーチンにすると良い」などとは示さずに考えてもらい、試行錯誤もしてもらいたい。

ある程度コード量の大きな課題を扱える段階になれば自然に関数を使いますが、なるべく早い段階で・できるだけ小さな規模で体験させたい、初学者でも食いつきがよさそうな課題はないか、という虫のいい質問です。

Java、Cの入門レベルの文法、関数を含んだ文法で作ることが可能な課題という事になります。ボリューム的に100行を超えるような課題では、初学者にキツイと思います。
もっと言えば、1〜3枚程度のフローチャート課題にできると、なお良いです。

2進数、16進数、基数変換、コンピュータの基本構造(CPUとメモリ、入出力装置といった程度)、文字コードとしてのASCIIコード、単純変数、配列はもちろん、スタックやキューが何か・どんなものか、という程度の知識は前提にできます。
その代り構造体やクラスなどは、この段階で使いたくありません。ポインタも無しです。

「最古のアルゴリズム」ユークリッドの互除法を取り上げることはあります。互除法は一回ごとに変数の値を置き換えながら繰り返すところが、アルゴリズムらしさを感じさせて良い教材だと思います。でも、ループを教えることはできますが、サブルーチンの課題ではないですね、残念ながら。

お礼

KSWordOfHasteさんが挙げてくださった3つの特徴で私も整理ができました。漠然とこんな形を想像していましたので。

     ループ {
        値 = やや複雑な処理(引数);
        値を使って処理;
   }


「やや複雑な処理」関数は、条件が複数あるため、出口が複数あるようなものです。これをループの中に展開すると見通しが悪くなりがちです。

割引計算は割引の条件が複数あるというだけでなく、往々にして条件が増えていくものです。条件の部分をサブルーチンとして独立させることで、コードの保守性にも目を向けさせることができそうです。

白状しますと、私が質問を投稿した時点で、料金割引計算というジャンル?は何となくダサい感じ(失礼!)がしていて、最初から除外していたような所がありました。今となっては自分の思い込みを恥じるばかりです。

よって、ベストアンサーはmomon-gaさんです。もちろん、ETCの例を挙げてくださったTaroToyotomiさんにもお礼いたします。
皆様方のお答えはそれぞれ、私の中で考えを検証するのに役立ちました。ありがとうございます。また、Chironianさんが「意外に難問」とコメントしてくださったので、質問した甲斐があったと意を強くした次第です(笑)。

P.S.
実は、ここで質問してみたかった隠れた理由は、

include <stdio.h>

みたいな質問を多く目にして、どうしてこうなるのか実地検証してみたかった、というのがあります。その疑問は質問を投稿するまでもなく解決しましたが、プレビュー画面の表示があるのに、投稿後に修正ができるのに、注意力が足りないのか、対策を見つける力が弱いのか、それとも質問者は何とも思わないのか、、、やや心配しますね。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 8

checkベストアンサー

+4

「煩雑な判定処理が複数回」でるような課題(割引つき料金計算とか)なんてどうでしょう。

andが複数でるような判定処理がifの中にでてくると、見づらいのが関数を作成/利用すると、
コードの見通しがよくなる

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/28 16:34

    よいかもしれないと思えてきました。
    割引きの例として参考にできるものは、ありますでしょうか。どなたでも結構です。

    キャンセル

  • 2017/10/30 01:35

    ETC割引の例はどうでしょうか?
    プログラム内で定義するICをある程度絞ればコード量的にもリーズナブルになりそうですし。
    あとは、似たような例で、JRの料金計算とかもいいかもしれませんね。

    キャンセル

  • 2017/10/30 07:57

    そうか、ETCは割引の条件がいくつかあり参考にできますね。おもしろうそうです。ありがとうございます。

    キャンセル

+2

私が「うん十年前(笑)」に入社してきた新入社員に出した課題は「万年カレンダー」でした。

うるう年の判定と、曜日をどうやって求めるかですが、何も知らないと考えても思いつかないので、そこは求め方だけは与えるようにします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

単純に三角形の面積を求める処理とかはいかがでしょうか。

以下のそれぞれの三角形の面積を求めよ、的な。
底辺が10、高さが5
底辺が20、高さが10
底辺が30、高さが20

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

コンソール入力を使った簡単なログインプログラムを作ると勉強になりそうですね。
色々なバリデーションをサブルーチンとして実装してもらうと良さそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

「配列の中の特定の値を探す」というのはどうでしょう。
メイン処理の中でもループを使って書くことができるものの、ループ前に変数を設定しておく必要が生じ、また特定の値がなかった時との処理の区別がわかりにくくなるところ、
サブルーチンに置けば見つかった時点でその位置の値をreturnすれば済みますし、見つからなかったケースはサブルーチン内のループを抜けたときに特殊な値を返すという処理にさせられるのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは。

ごくごく簡単にint n;までの和を求める関数を作る方向に誘導するのは如何でしょう。

課題としては、10までの和、85までの和、124までの和などを10個くらい(?)並べて、これらを計算して表示するプログラムを作れです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/27 13:04

    単純な繰り返しだと {10, 85, 124, ...} などの配列を用意してループ回せば出来ちゃいますね。

    キャンセル

  • 2017/10/27 14:10

    ああ、確かにそうですね。
    単純な処理を対象に配列+ループを避けるのは意外に難しそうですね。構造体を使うなと制約すればパラメータを複数必要とすれば避けることができそうですが、「構造体を使うな」は明示したくはなさそうな印象を受けます。意外に難問です。

    キャンセル

0

古典的ですが、フィボナッチ数列、なんてのはどうでしょうか。

前2つの値が必要になるため、ループで回そうとするとけっこう面倒になってきてしまいます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

課題に望まれる特徴は以下のようなものと思います。

  • 処理自体は難しくない
    入力は2つとか3つぐらいで、あまり数学的な素養を必要としないもの。
    ループなどは本当の初心者にとっては難しく感じるかも知れません。

  • しかし判定文など複数のステップが必要
    あまりに単純だと同じパターンを複数書いてもプログラム自体が長くならない。
    例えば複数のif文があればそれなりに長くなると思います。

  • 同じパターンで解かなければならないものをそこそこ多くする。
    ttyp03さんのような感じで、同じパターンの問題を一つのプログラムでそれなりのセット数解かなければならないようにし、かつパラメーターは固定的に与えておくとよいと思います。
    ループと配列がわかってしまっているとループでやられてしまう恐れがあるので問題文に「for文を使ってはいけません(ループ使用禁止)としばりを入れるとよいのでは?

例えば

aとbが与えられたとき、次を出力してください。
・ a+bが10以上なら...と表示
・ 2以下なら...と表示
・ それ以外なら...と表示

上記を次について全て出力する一つのプログラムを考えてみましょう(ループは使っちゃダメ)

5 5
1 1
2 2
4 6
1 0


(意味がない課題だとやる気がそがれるかもですが・・・)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    [java]バブルソートに関する質問です

    こんにちは。 現在独学でjavaを勉強しています。 バブルソートについての問題を行っているのですが、 ソートがうまくいきません・・・ 下記にソースを記載させていただきま

  • 受付中

    java なぜその答えになるのかを分かりやすく理解する方法って何ですか

    意図 今まで上司の方に覚えが悪いのでどうしたらいいですかと聞いてみたら、お前が理解できていないものはこっちにはさらにわからない、知らねーよの一点張りでしたが、なぜその答えになるの

  • 解決済

    for文の繰り返しの構造

    前提・実現したいこと for文を使って、指定した回数、指定した個数ずつ表示を減らしていく文の構造を理解したい 該当のソースコード for(int i=h-1;i>

  • 受付中

    ランダムで重複しない配列

    前提・実現したいこと Java初心者です。 javaでヒットアンドブローを作る過程で ランダムで重複しない配列を作る必要があり、 以前こちらで見たコードを使おうと思ったので

  • 受付中

    階乗計算によるスタックオーバーフローについて

    public static void main(String[] args) { System.out.println(factional(10)); }

  • 解決済

    Java初心者・複数行の標準入力と配列について

    問題点・テーマ マークテストの正解の番号の列を入力させ、其の後に受験者数を入力する。 そしてそれぞれの回答番号を入力する。 そのときのそれぞれの点数(=正解数)を求めるプログラムを

  • 解決済

    キー入力がされてない

    キーを入力したら左右に移動したりジャンプしたり させたいのですがキー入力がされていなかったのですが 原因がわかりません どうしたらいいでしょうか ご回答お願い致します impo

  • 解決済

    c言語、図式化 array

    int i; int j; for (i = 0, j = len -1; i < j; i = i + 1, j = j - 1) { c = array[i]; array

同じタグがついた質問を見る

  • Java

    12102questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • C

    3065questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • アルゴリズム

    342questions

    アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。