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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Java

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

アルゴリズム

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

Q&A

解決済

8回答

1834閲覧

サブルーチン導入課題

rubato6809

総合スコア1380

C

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

Java

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

アルゴリズム

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

0グッド

1クリップ

投稿2017/10/27 02:36

編集2017/10/30 00:27

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#include <stdio.h>

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答8

0

ベストアンサー

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

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

投稿2017/10/27 03:20

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rubato6809

2017/10/28 07:34

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

2017/10/29 16:35

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

2017/10/29 22:57

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

0

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

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

投稿2017/10/27 07:55

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2017/10/27 08:54

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2017/10/27 04:41

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

  • 処理自体は難しくない

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

  • しかし判定文など複数のステップが必要

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

  • 同じパターンで解かなければならないものをそこそこ多くする。

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

例えば

aとbが与えられたとき、次を出力してください。 ・ a+bが10以上なら...と表示 ・ 2以下なら...と表示 ・ それ以外なら...と表示 上記を次について全て出力する一つのプログラムを考えてみましょう(ループは使っちゃダメ) 5 5 1 1 2 2 4 6 1 0

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

投稿2017/10/27 07:01

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2017/10/27 04:13

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

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

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

投稿2017/10/27 03:39

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/10/27 04:04

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

2017/10/27 05:10

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

0

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

投稿2017/10/27 02:45

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問