フローチャート

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
カル

フローチャート

#1

投稿記事 by カル » 17年前

今フローチャートについて勉強中なのですが
ソースを作る前にフローチャート(設計書?みたいなもの)
を作っておくと全体の流れがわかるよといわれました
ネットで色々と見てみたのですがよくわかりません
どんな感じで作ればいいのでしょうか?

あきら

Re:フローチャート

#2

投稿記事 by あきら » 17年前

カル様 こんにちは

私もまだ勉強し始めの段階なので,質問に対する答えが一致しているかはわかりませんが。

下記のリンクのようなものを指しているのではないかと思いますが,いかがでしょうか。

http://ja.wikipedia.org/wiki/%E3%83%95% ... C%E3%83%88

http://www2.ee.knct.ac.jp/el/E2/L210/al ... hart1.html

やそ

Re:フローチャート

#3

投稿記事 by やそ » 17年前

要は「やりたいこと」を順に書き出していくこと。です。

それを見た目に分かりやすくするために、図表(チャート)で表したものです。

たとえばとあるゲームの開始の流れ図は・・・

   ゲーム開始
    ↓
 -→↓
 ↑  ↓
 ↑ タイトル画面表示
 ↑  ↓
 ↑ 最初から? ---→オープニング表示 →ゲーム開始画面へ
 ↑  ↓     YES
 ↑  ↓NO
 ↑ つづきから?---→ロード画面表示  →ゲーム開始画面へ
 ↑  ↓     YES
 ↑  ↓NO
 ↑←←


こんな風に表現できるでしょう。コレも流れ図(フローチャート)です。
(※ループ端子を使うともっとスッキリしますが)
段階的に掘り下げていけば、C言語の命令1語に対して1項目の段階まで流れ図を書くことが出来ると思います。

この、流れ図は書かなくてももちろんプログラムを組むことは可能ですが、
書いておくと論理エラー(バグ)の検出やプログラムを追わなくても、処理の流れが把握しやすくなるので
書くクセをつけると良いでしょう^^

カル

Re:フローチャート

#4

投稿記事 by カル » 17年前

>あきらさん
サイトの方見てみました。他のサイトでも似たような事が書いてありましたが
ちょっと掴めそうな感じがしました、ありがとうございます

>やそさん
やりたい事を順に・・・なるほど、そーゆーことだったんですねw

例えば(だいぶ前にお世話になったC言語カレンダー表示とか)でやっても
同じ考えなんでしょうか?今それをやってみようかなと思っているのですが・・・
どう書いたらいいのかわからなくて・・・

あきら

Re:フローチャート

#5

投稿記事 by あきら » 17年前

カル様

見ている方は一人ではないと思いますので,カレンダーを作成した時のスレッドのURLを掲載してみてはいかがでしょうか。
そのほうが,もっと多くの方から意見をもらえるのではないかと思います。
フローチャートが無くてもプログラムは書けるのではないかと思います。
やそ様が仰られているように,やりたい事を書き出す事で後で見直す上で便利ですし,他の人からも様々な意見がもらえるのではないでしょうか。

肝心のフローチャートの書き方ですが,どういった記号を使うかはJIS企画で決まっていた(はず)と思いますので,それを覚える必要があります。
それからまずは最初に“何をどのようにやりたいのか”という事をメモして考えていく必要があると思います。

例えば,自動販売機で150円のジュースを買う場合。
100円で押しボタンにランプがついてしまった日には自動販売機のメーカーさんは大損です。
そこで,
・150円以上でランプがつき,150円未満ではランプがつかないという指示を与える。
・投入した金額から,購入した金額を差し引いた時にプラスであれば,その額をおつりとして出す。
・ただし,1つ購入した後に,150円未満ならお釣りを出し,150円以上ならお釣りは出さずにランプはついたままという指示を与える。
といった事を書き出したら,次は記号に変換しフローチャートを書くという手順になるのではないかと推測しています。


研修が始まり中々忙しいかとは思いますが,時間がある時にCD-ROM付の入門書を手に入れてみてはいかがでしょうか。
私も初心者なのでわからない事だらけですが,google,wikipedia,入門書などを利用するといったツールを用い勉強中です。

やそ

Re:フローチャート

#6

投稿記事 by やそ » 17年前

カルさんへ

以前のカレンダー表示プログラムももちろんフローチャートで表すことが出来ます。
また、フローチャートを先に作っておけばプログラムはもっと楽に作れたのではないかと思います。

もちろんフローチャート自体が間違っている場合もありますが^^;(バグといいます)

あきらさんへ
自販機の購入プログラム。そういえば新入社員の研修の時に作らされました。
お金投入から品物(結果)を出すまでのフローチャートを詳細に書け!
といわれましたね。
お金は1円、5円ははじき、10円、50円、100円、500円、1000円、5000円、1万円を使え、
おつりも最小枚数で出す。
品物は100円、150円と種類がある。
1品購入毎に全て清算。

今となっては懐かしい思い出です(笑)
(自販機で1万円なんて使わないって)
フローチャート用の定規やシートは(製図用品を取り扱っている)大きめの文具屋さんなら置いてあると思います。(使わず、フリーハンドで十分とも言いますが)

カル

Re:フローチャート

#7

投稿記事 by カル » 17年前

>あきら様
スイマセン、作成したスレッドは見つかったのですがURLの表示の仕方がよくわかりませんでした
(過去ログ43のグレゴリウス暦で見つけました)
その時のソースです
#include<stdio.h>

	int main() {

	int iyear,imonths,iday;
	int sum,i;
	int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
	char*cweek[7] = {"日","月","火","水","木","金","土"};

	sum =0;
	printf ("input (e.g. ****/**/**)\n>>");
	scanf ("%d/%d/%d",&iyear,&imonths,&iday);
	/*閏年の判定*/
	if ((imonths >2) && ((iyear % 4 == 0) && ((iyear % 100 !=0) || (iyear % 400 == 0)))) {
	sum++;
	}
	/*前月までの日数*/
	for (i =0; i < imonths-1; i++) {
	sum += m_array;
	}

	iyear--;
	/*前月と前年度と今月の日数の合計*/
	sum = sum + iyear * 365 + (((iyear / 4)-(iyear / 100))+(iyear / 400))+iday;
	printf("%s曜日",cweek[sum%7]);
	return 0;

}



こんな感じです、今日帰りに「猫でもわかるC言語」を買いました。わかりやすいとの評判みたいなので。

カル

Re:フローチャート

#8

投稿記事 by カル » 17年前

連投スイマセン
>やそさん
そうですね、先に作っておいたほうが楽かもしれませんね
ネットでもそんあ感じに書かれてました。
記号はなんとなくわかったんですけど実際に考えて作ってみると・・・
どう分類?して書いていけばいいのかとか・・
言われたのが「細かく書くんじゃなくて、わかりやすく書けばいい」
今の私の考えは  開始→年月日(宣言)→閏年計算→総日数を出す→7で割る→曜日を出す
→出力→終了 かなり雑ですがこんな流れなのかなと思っています。

カル

Re:フローチャート

#9

投稿記事 by カル » 17年前

少し直してみました。
年 月 日の宣言と初期化

月の末日配列の宣言と初期化
曜日の配列宣言と初期化

閏年の判定

前月までの日数

前月と前年度
今月の日数の合計

曜日計算
(総日数から7で割った余り)

出力

終了
これでもまだダメなんでしょうか?
全体的に明確にした方がいいと思うのですが今一ピンときません
アドバイスなどあればよろしくお願いします。

あきら

Re:フローチャート

#10

投稿記事 by あきら » 17年前

カル様

質問に対する答えが遅れがちになっておりますが。

話に出ている過去ログらしきものを発見しました。

こちらでよろしいでしょうか?

http://www.play21.jp/board/nextz.cgi?id ... pnum=13709


フローチャートの内容はまた吟味したいと思います。

ところで,このカレンダープログラムはすでに完成していますか?

カル

Re:フローチャート

#11

投稿記事 by カル » 17年前

あきら様
あ、それですね、ありがとうございます、わざわざスイマセン。
カレンダー表示(1~12までの表示)はまだ完成していません
今は入力された年、月、日が何曜日?と表示されるとこまでできてます。(上の方に私が貼ったソース)
とりあえずこの状態でフローチャートを作成するとどんな感じになるのかなといった状態です

あきら

Re:フローチャート

#12

投稿記事 by あきら » 17年前

カル様

C言語におけるフローチャートとは,プログラムを書くための設計図にあたります。

設計図はより正確,かつ分かりやすいものである必要があります。

そして一番重要なのは,C言語におけるフローチャートの書式にそって作成する必要性があります。

それは,自分が上達した後で見返すときに間違いが発見しやすい。

と同時に,他の人からもアドバイスをもらいやすいという利点があります。

仕事であれ,こういった場であれC言語についてふれる場合は,合っているか間違っているか以前に書式通りに書く必要があります。

そして,プログラムは設計図をもとに作成されるので,設計図があっていればプログラムも正しいものとなります。
ですので,先に示したいただいたフローチャートをC言語向けのフローチャートにアレンジしてみてください。

掲示板でフローチャートを書くというのは紙に書くのと違い難しいものがありますが,やそ様が素晴らしい書き方をされているので,それを参考にするとよいでしょう。

また,Googleなどで検索すれば文字や記号を使っての上手な書き方をしている人が多々おりますので,そういった方の書き方を調べてみるとよいかと思います。

紙に書く場合は,下記のリンク先のような書き方になると思います。

http://ja.wikipedia.org/wiki/%E3%83%95% ... C%E3%83%88

どういった時に,どういった囲みを用いるかはお手元の本に示されているのではないかと思います。

カレンダーを作成するまでの道のりが長いかとは思いますが少しづつ頑張っていきましょう。

やそ

Re:フローチャート

#13

投稿記事 by やそ » 17年前

#include<stdio.h>

	int main() {

	int iyear,imonths,iday;
	int sum,i;
	int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
	char*cweek[7] = {"日","月","火","水","木","金","土"};

	sum =0;
	printf ("input (e.g. ****/**/**)\n>>");
	scanf ("%d/%d/%d",&iyear,&imonths,&iday);
	/*閏年の判定*/
	if ((imonths >2) && ((iyear % 4 == 0) && ((iyear % 100 !=0) || (iyear % 400 == 0)))) {
	sum++;
	}
	/*前月までの日数*/
	for (i =0; i < imonths-1; i++) {
	sum += m_array;
	}

	iyear--;
	/*前月と前年度と今月の日数の合計*/
	sum = sum + iyear * 365 + (((iyear / 4)-(iyear / 100))+(iyear / 400))+iday;
	printf("%s曜日",cweek[sum%7]);
	return 0;

}


-----------------------

フローチャート

開始

使用する変数の宣言&初期化

年月日入力※①

うるう年判定※②

入力年の入力月の前月までの日数計算
(2000/12/25なら2000/1/1から2000/11/30までの日数)

1/1/1からの総日数計算

答え(曜日)の出力

終了

-----------------------

フローチャート①

開始

入力を促すメッセージを出力

入力(年→iyear、月→imonths、日→iday)

終了
-----------------------

フローチャート②

開始

月>2 かつ
(年(iyear)%4(4で割った余り)==0 かつ
↓ (年%100 ==0 または
   年%400 ==0)

↓→→→→→合計日数(sum)にうるう年分の1を足す。→↓
↓  yes                               ↓
↓                                   ↓
↓no                                  ↓
↓                                   ↓
↓←←←←←←←←←←←←←←←←←←←←←←←←


終了

とこんな感じで書いていくことが出来るはず。

実際にはifの端子はひし形なのでもっと見た目がスッキリすると思いますよ。

このつづきはカルさん自身で作ってみるといい勉強になりますよ^^

実際にプログラムするときは、処理の先頭などにこのフローチャートの文言を
コメントで入れておくと後で見返しやすくなります^^

PS.
わたしも

「猫でもわかるC言語プログラミング」
「猫でもわかるゲームプログラミング」
「猫でもわかるWindowsプログラミング」

を持っていますよ^^

カル

Re:フローチャート

#14

投稿記事 by カル » 17年前

>あきら様
はい、そうですね、わかりやすく・・・・まずこれが大事ですね
今日1日ネットで色々と検索をしてみたのですが
なかなか難しいものですね。
でも少しは進歩したと思っています
あきら様が貼ってくださったURLもとても参考になりました
ありがとうございます。

>やそさん
わかりすい説明ありがとうございます
わざわざ作ってくださって・・・めんどくさかったですよね?

ところで合計日数に閏年分の1を足すの「1」ってどーゆー意味んでしょうか?
自分でももう頭の中がグチャグチャになってしまってもう何がなにやら・・・自分でコード書いといて
分からないなんて・・・自分の無力さに凹みます。

一応今の段階でのフローチャートを表示しておきます
http://kansai2channeler.hp.infoseek.co. ... g/6172.txt
あと一歩ってところなんですけどねぇ・・・。

あきら

Re:フローチャート

#15

投稿記事 by あきら » 17年前

カル様

色々な事で頭がいっぱいになる事は,私もよく経験します。

頭がいっぱいになった時は,メモをとり,今何について考えているのか,何について考えないといけないのかを整理して優先順位をつけるとよいかと思います。

メモをとる事で暗記力が落ちるというデメリットもありますが,私の場合最近物忘れが前よりひどくなってきたので,メモをとる習慣はかかせません。

ヒント
閏年で1を足すのがどういう意味かは,閏年とはどういうものかを国語辞典,百科事典で調べるとその答えがのっているので,すぐにわかりますよ。

せっかくご呈示いただいた進行段階のフローチャートですが,閲覧することができませんでした。

私だけでしょうか?

カル

Re:フローチャート

#16

投稿記事 by カル » 17年前

メモって何気に重要なんですね
今何を優先すべきか、仕事をする上で大切なことなんですね
実感しました。

フローチャートの方なんですが私のミスで失敗したようです(初めてなもので・・)

やそ

Re:フローチャート

#17

投稿記事 by やそ » 17年前

(あ、カルさんに先の投稿されてしまった。ま、いいか^^;)
カルさんへ

>わざわざ作ってくださって・・・めんどくさかったですよね?

もちろん、面倒くさいです(笑)
いやあ、ワードあたりで図を使って・・・なら幾分楽なのでしょうけど、
掲示板にテキストで書くのは非常にメンドイです^^;

>ところで合計日数に閏年分の1を足すの「1」ってどーゆー意味んでしょうか?
>自分でももう頭の中がグチャグチャになってしまってもう何がなにやら・・・自分でコード書いといて
>分からないなんて・・・自分の無力さに凹みます。

頭の中がグチャグチャ・・・にならないようにするためのフローチャート作成のはずが・・・
まあ、最初はそんなもんですので、あせらず行きましょう。

カルさんはうるう年と聞いて何を想像されますか?
一般的には
「2月がいつもの28日までじゃなくて1日増えて29日まである年のこと」
という認識なのではないでしょうか?

------------------------------------------

たとえば2000/12/25
を計算するとき、

1.その年に限って、日数を計算する(2000/1/1~2000/12/25)
  (1)各月の日数は基本的に固定(m_array[12]で定義している)ので、
     1月1日から前月末までの日数を計算する(sum)
     (こういうこと)sum=31+28+31+30+31+30+31+31+30+31+30
  (2)日の日数を足す(2000/12/1~200012/25)
     sum=sum+24

2.その年(2000年)がうるう年かどうか判定する
  うるう年の条件
   4の倍数の年はうるう年。
   ただし、100の倍数の年はうるう年じゃない。
   でも、やっぱり400の倍数の年はうるう年。

   結果うるう年であれば2/29が増えるので"1"を足す。
   sum=sum+1
3.(グレゴリウス暦)1/1/1~1999/12/31(前年)までの総日数を計算する。
  1年は基本的に365日なので
  ベースは365×1999で計算される。
  そこにうるう年の回数分"1"を足すことで正確な日数が計算できる。

4.1から3で求めた日数を全て足す
  その結果、(1/1/1~)2000/12/25の日数が算出される。

5.曜日は日曜日から土曜日まで7種類存在する。
  4で求められた結果を7で割った余りを求めることで曜日(0から6)が判定できる。
------------------------------------------

1から3はどの順番で求めても問題ないと思います。
これを図で表せばフローチャートの出来上がりです。


カルさんが作ったフローチャート、多分パーミッションの設定が悪いのかな?
私も見ることが出来ませんでした。
→新たにupしたフロー、見ておきます^^

カル

Re:フローチャート

#18

投稿記事 by カル » 17年前

>やそさん
丁寧に教えてくださってありがとうございます
参考というかもう完全に正解みたいな感じですねw

>カルさんはうるう年と聞いて何を想像されますか?
>一般的には
>「2月がいつもの28日までじゃなくて1日増えて29日まである年のこと」
>という認識なのではないでしょうか?

まさにその通りですw
私の理解不足でした・・・・・・・
やそさんのおかげでとても勉強になりました。
あ、前回のフローを修正しましたのでよかったら見てやってください。

カル

Re:フローチャート

#19

投稿記事 by カル » 17年前

みなさん、アドバイスありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る