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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

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

Q&A

解決済

2回答

1925閲覧

フローチャート書き方について

退会済みユーザー

退会済みユーザー

総合スコア0

アルゴリズム

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

0グッド

0クリップ

投稿2020/07/06 10:48

編集2020/07/08 14:23

三つの整数値を読み込んでA>B>Cのように昇順にソートするフローチャート図の書き方を教えてください。
※JAVAでプログラムは実装できましたが、フローチャート図の書き方がわかりません。

import java.io.*; class test { public static void main(String [] args) throws Exception { System.out.println("三つの整数値を入力してください。"); int a,b,c; String line; int large,medium,small; BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.print("数値 a= :"); line = reader.readLine(); a=Integer.parseInt(line); System.out.print("数値 b= :"); line = reader.readLine(); b=Integer.parseInt(line); System.out.print("数値 c= :"); line = reader.readLine(); c=Integer.parseInt(line); if(a >= b){ if(a >= c){large =a; if(b >= c){medium =b; small =c;} else{medium =c; small =b;} }else{large =c; medium =a; small =b;} }else{if(b >= c){large=b;if(a >= c){medium =a; small =c;} else{medium =c; small =a;} }else{large =c; medium =b; small =a;} } System.out.print(large + ">" + medium + ">" + small); } }

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

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

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

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

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

dodox86

2020/07/06 10:55

正直、どうにでも書けてしまうので、まずは質問者さんがどう書くかです。また恐らく、回答者がそれを書いても、見る人によって評価が異なります。
退会済みユーザー

退会済みユーザー

2020/07/06 11:00

ご回答ありがとうございます。 なるほどちょっと自分なりに図を作ってまとめてみます。
dodox86

2020/07/06 11:03

書き方(粒度)によっては 「開始」端子→箱1:「キーボードから数値を入力」→箱2:「1番大きい値を抽出し、変数Aへセット」→箱3:「2番目に大きい値を抽出し、変数Bへセット」→箱4:「残りの数(一番小さい数)を変数Cへセット」→「終了」端子  で終わっちゃいますね。(特に分岐無し) どこまで細かく書くか、です。
dodox86

2020/07/06 11:48

追記を読んでのコメントですが、書き方の前に、処理が抜けていて、フローチャート上のプログラムが未完成のようです。お書きになったフローチャートは、「変数A、B、Cの3つの領域にキーボードから整数値を入力して、一番大きな数を変数Aに真ん中の値を変数Bに1番小さな値を変数Cに格納する」の仕様を満たしていません。最終的には一番大きな数を変数Aに収めていなくてはならないのではないでしょうか。少なくともA<BかつA<Cでは、Aが最初から1番小さい数だったとき、Aの値を"出力"しているだけです。(一番大きい数としてAに収められていません) 細かく言えば、「出力する」と言う要件はそもそも存在しません。
hentaiman

2020/07/06 12:13

質問者自身はそのフローチャート見て初見で理解出来ますか?書き方が分からないという問題ではないです。 それと3分岐4分岐は無くても書けます。ifのネストで考えてみてください。
dodox86

2020/07/06 12:42

まぁ、意図が全て含まれてて他者に通じるようになってしまうと、それ即ちフローチャートは完成してしまって、回答の必要も無くなってしまうのですけれども。コードレベルで言えば、ABC3つの変数しか使わない場合は箱の数も変わってくると思います。フローチャートではなく、質問者さんがお使いのプログラミング言語では完成しているのでしょうか。もしそうであれば、あとはフローチャートへの表現力だけの問題になると思います。
Zuishin

2020/07/06 13:05 編集

この例、私なら配列にすべての入力を入れた後にソートします。そういう問題じゃないでしょうが、数字の数が変わる可能性があるのであればループを使わなければならなくなるので、チャートも変わってきます。(現実には、変わる可能性を考慮してプログラムするので配列を使用してループあるいはライブラリ関数を使います) フローチャートの種類はいくつかありますが、おそらく情報処理技術者試験対策だと思うので、それに対応したものを使わなければいけません。参考書を見て使えるパーツを確認してください。種類によっては switch による多重分岐が使えるものもあります。 ただしこの問題は繰り返し比較して最大のものを選ばなければならないので、多重分岐はどちらにしろ使えません。多重分岐の例にはならないので、別の例に差し替えるのが良いと思います。
退会済みユーザー

退会済みユーザー

2020/07/06 13:17

何分素人で質問の仕方もわかっていなくて申し訳ございません。 おっしゃる通り情報処理技術者試験対策なのですが、、、 書いてある条件としては最初にABCに数値を入力それを比較して、一番大きい値をA、真ん中の値をB、小さい値をC、ということで、入れ替えと分岐のアルゴリズムだそうですが、、、さっぱりです。。
Zuishin

2020/07/06 13:26 編集

では多重分岐は関係ありません。アルゴリズムで引っかかっているなら、フローチャートもとりあえず今は関係ありません。 三つの中から一番大きなものを選ぶには、まず二つを取り出して比較し、大きい方を残ったものと比較し、大きかった方を選んでください。 二番目に大きいものは、残った二つを比較して大きかった方です。 残りが一番小さなものになります。 このように細かな手続きを最初から最後まで日本語で表してみてください。それを最後にフローチャートに変換すればできあがりです。
Zuishin

2020/07/08 12:42 編集

この質問を放置して新しく同じ質問をしたようですが、これだけ書いて何もできない人は受験しても無意味です。これは問題としては簡単な方です。時間と労力の無駄なのであきらめてください。
Zuishin

2020/07/08 13:20

> JAVAでプログラムは実装できましたが、 新しい質問に書いてあったトンチンカンな文章を読む限りできたとは思えません。
退会済みユーザー

退会済みユーザー

2020/07/08 13:27

図でお願いします。
hentaiman

2020/07/08 13:32

javaのコードと未完成のフローチャート併記した方が指摘してもらえると思いますよ
退会済みユーザー

退会済みユーザー

2020/07/08 13:34

Zuishin様は経験者でできるからよいかもしれませんが、私はお金もなく独学で学習期間1カ月も経たない初心者です!わからないから質問しています。それ以外のやり取りは私にとっては無益ですので以降スルーします。 6日の回答のお礼は申し上げます。
gentaro

2020/07/08 14:31

まぁ初心者でわからないから質問したい、というのは良いんですが、この質問って要は「自分にできないからやってくれ(手本を見せろ)」という「丸投げ」に見えるので、厳しい事を言われたくなければ貴方がどれぐらいフローチャートについて学び、どこまでできていて、どこがわからない、という説明ぐらいはまずやるべきじゃないですかね? みんなあなたの知り合いじゃないので、事情までわかりませんし、どの程度努力した上でここに質問しているのかなんて知らないので。 とりあえずガイドラインはちゃんと一読したほうが良いです。 https://teratail.com/help/question-tips https://teratail.com/help/avoid-asking
退会済みユーザー

退会済みユーザー

2020/07/08 14:48

ご指摘ありがとうございます。 ルールを細かく確認せず利用しておりました。 大変申し訳ございません。 次回は考えて質問させていただきます。
hentaiman

2020/07/08 15:09

前のコメントでも書いたifのネストは普通にやってるようだけど、フローチャート上だとネストしたifの書き方が分からないって事?
退会済みユーザー

退会済みユーザー

2020/07/08 15:54 編集

if(a >= b){ if(a >= c){large =a; if(b >= c){medium =b; small =c;} ここまでの処理は書けていると思うのですが、この後の書き方でわからなくなります。 もう少しフローチャートについて学んでみます。
m.ts10806

2020/07/08 19:07

「思う」ではなく動かしてみれば良いのでは。 試験対策とは言え、手元に全く実行環境なしで机上だけというのは無謀です。 プログラムは書いた通りにしか動きません。
Zuishin

2020/07/08 23:47

ABC のはずが large や small になってるし、仕えるフローチャートの部品確認しろと言ってるのにしないし、頑なに答えだけ求めるし。 同じ問題は出ないので、いくら正解を教えてもらって暗記しても無駄なんですけどね。 「この問題だけ」できればいいのなら、過去問と正解と解説の載った参考書を買えばよろしい。
guest

回答2

0

「フローチャート 多重分岐」でぐぐってみましょう。
出てくるのを一通り読んでいただければ理解できるかと。

投稿2020/07/06 10:53

y_waiwai

総合スコア87749

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

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

0

ベストアンサー

ちょっと埒が明かないようでしたので、質問者さんがご提示のソースコードをもとにフローチャートを描いてみました。まず、分岐をうまく描けないのは、元のJavaソースコードのif () {} else {}のネスト、つまり階層の関係が分かりづらい為もあります。インデントを正しく設定してコードを書けば、以下のようになるでしょう。

Java

1import java.io.*; 2 3class Main 4{ 5 public static void main(String [] args) throws Exception 6 { 7 System.out.println("三つの整数値を入力してください。"); 8 9 int a,b,c; 10 String line; 11 int large,medium,small; 12 13 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 14 15 System.out.print("数値 a= :"); 16 line = reader.readLine(); 17 a = Integer.parseInt(line); 18 19 System.out.print("数値 b= :"); 20 line = reader.readLine(); 21 b = Integer.parseInt(line); 22 23 System.out.print("数値 c= :"); 24 line = reader.readLine(); 25 c = Integer.parseInt(line); 26 27 if(a >= b){ 28 if(a >= c){ 29 large = a; 30 if (b >= c){ 31 medium = b; 32 small = c; 33 } else { 34 medium = c; 35 small = b; 36 } 37 } else { 38 large = c; 39 medium = a; 40 small = b; 41 } 42 } else { 43 if (b >= c){ 44 large = b; 45 if (a >= c){ 46 medium = a; 47 small = c; 48 } else { 49 medium = c; 50 small = a; 51 } 52 } else { 53 large = c; 54 medium = b; 55 small = a; 56 } 57 } 58 59 System.out.print(large + ">" + medium + ">" + small); 60 } 61} 62

あとはこの if () {} else {}の関係を単純にフローチャートへ落とし込むだけです。例えば以下のようなものになります。
イメージ説明

フローチャートは一応、日本工業規格 JIS (X0121)で書き方が定められていますが、厳密な描き方を実際の現場で求められることは稀(まれ)です。会社、現場によって描き方に流儀、亜種がたくさんあります。個人的な意見も含みますが、基本情報処理試験対策も含め、与えられたフローチャートを読んでコードに落とし込め、また、その逆を行える程度になれば良いのだと思います。穴埋め問題であれば、全体および前後の処理をみて、記述レベルに合わせて穴を埋められることができれば充分でしょう。

描き方について様々なものがあると述べましたが、例えば私がこれまで経験した中では以下のようなものがありました。

  • 分岐がある場合、なるべくYESが下、NOが横。(なるべく素直に下へ流れていくようにする)
  • 分岐、ループで線をつなげる場合、時計回りになるようにする。
  • 分岐でYESを示す際は、"Y" のみ。 "NO"は"N" のみ表記する。 (YESが分かればもう一方は必然的にNOだろう、と言うことで"NO"/"N"など書かない場合もあります)
  • ループの記号は特に使わない(私は使ったことが無い)
  • 記述レベルが細かすぎると、どれだけ時間と紙が合っても足りない。(コードを直したらフローチャートも直すの?) 

随分些末な話ですよね。こだわっても仕方ありません。

(これも個人的意見を大きく含みますが)フローチャートの決定的な問題は、「明らかな間違いは分かるだろうけれども、本当にそのフローチャートに描かれたロジックが正しいかは、実際にプログラムを動かしてみるまで分からない。」と言うことです。頭の中の設計を人間に示すために図に描くだけです。そういう意味では、プログラミング言語で書いて実機にて動かすことが確認方法として一番、厳密で確実です。フローチャートをいくら描いてもプログラムは動きません。

ですので、「フローチャートで設計を他人に分かるように描けるか」と言うことと「プログラミング言語で実際にロジックを組めるか。」と言うことは分けて考える必要があります。

ロジックの問題ですが、例えば質問者さんがJavaのコードとして挙げたものは、以下のようにも書けます。これは、a, b, cの3つの変数に「バブルソート」と言う簡単なソートの方法を適用して書き直してみたものです。質問さんオリジナルのコードよりはもう少しシンプルなものになっていることが分かると思います。これをフローチャートに改めて描き起こした場合、もっと分岐の記号が減ることでしょう。

Java

1import java.io.*; 2 3class Main2 4{ 5 public static void main(String [] args) throws Exception 6 { 7 System.out.println("三つの整数値を入力してください。"); 8 9 int a,b,c; 10 String line; 11 int large,medium,small; 12 13 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 14 15 System.out.print("数値 a= :"); 16 line = reader.readLine(); 17 a = Integer.parseInt(line); 18 19 System.out.print("数値 b= :"); 20 line = reader.readLine(); 21 b = Integer.parseInt(line); 22 23 System.out.print("数値 c= :"); 24 line = reader.readLine(); 25 c = Integer.parseInt(line); 26 27 // a, b, c, を配列に見たてて降順(大きい順)にバブルソート 28 int tmp; 29 if (a < b){ 30 tmp = a; 31 a = b; 32 b = tmp; 33 } 34 35 // この時点でa > b が確定 36 37 if (a < c){ 38 tmp = a; 39 a = c; 40 c = tmp; 41 } 42 43 // この時点でa > (bおよびc) が確定 44 45 // b と cを対象に並びかえ 46 if (b < c){ 47 tmp = b; 48 b = c; 49 c = tmp; 50 } 51 52 System.out.println(a + ">" + b + ">" + c); 53 } 54}

以上、参考になれば幸いです。

投稿2020/07/09 08:04

dodox86

総合スコア9183

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

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

退会済みユーザー

退会済みユーザー

2020/07/09 09:00

なにが違っていたのか、ようやく理解できました。 こんなにご丁寧にご解説頂き、本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問