• 締切済み

プログラムの内容理解

私は仕事で現在コボルを使用しています。 コボルどころかこういった専門的なものは初めての初心者です。 最初のうちは短い行のプログラムを読んで理解して修正して・・・と、苦しいながらも先輩方に聞きながら進んでいきました。 しかし段々と量が増え、さらにプログラムが複雑になり(色々なところに飛ぶ)ついていけなくなりました。 先輩方に部分部分聞いても自分自身が    「ここがこうなるからこっちはこうなる。そして次でこれが・・・」 という理解をできていないのですぐ分からなくなります。 そこで皆様に聞いてみたいのですが、長いプログラムを読むコツみたいなものはありますでしょうか? 「IF」などで分岐していくともう頭がこんがらがり余計に理解ができなくなってしまいます。 1をAに、さらにそれをBへ。そしてCに入れ最後にD・・・などもよくあるのですが「何故そんなに遠回りを?」と思い追いかける気力が無くなってしまいます。 どうかよろしくお願いします。 簡単ではないでしょうが頑張ってコツみたいなのをつかんで壁をこえたいです。

みんなの回答

  • Passeio
  • ベストアンサー率23% (10/43)
回答No.9

自分は、もう15年以上COBOLにどっぷりつかっています。 造る側の視点で自分が心がけていることを挙げていきますね。 ・解りやすいように造ること。 ・GOTO文の乱立は行わないこと。 ・セクション分割すること。 ・階層を深くしすぎないこと。 ・フラグコントロールを少なくすること。 ・階層化の開始文字位置をあわせること。 ・状態分岐は全パターンを想定すること。 ・コメントを利用し読みやすいプログラムにすること。 ・無限ループにならないように気をつけること。 ・再帰的呼び出しはなるべく使用しないこと。 ・処理のトリガーとなる条件を把握しておくこと。 ひょっとしたら、読んだプログラムが このいずれかを守っていなくて 読みにくくなっているのかもしれませんね。 だから、「何故そんなに」と お考えになるのは非常にいいことだと思います。

全文を見る
すると、全ての回答が全文表示されます。
回答No.8

質問への回答は他の方がされているようなので、 経験上からひとこと。 (質問への回答ではないので、これは参考になりません^^;) >私は仕事で現在コボルを使用しています。 >コボルどころかこういった専門的なものは初めての初心者です COBOLは言語仕様上分りにくいと思います。 以前、COBOLを使用していましたが、 Windows主流の言語などを憶えてしまうと、使用したくないですね。 「PERFORM」は必要ですが、 「GO TO」をロジック上の基本適なところで使用しているのはかんべんしてほしいです。 また、変数のスコープが無いというか、 故意に全体的に使用するところがどうも・・・。 ツールの話になりますけど、 Windows主流の言語の開発環境にあるデバッガのようなものがあれば、 そこまで苦労しないんだろうな・・・。 >1をAに、さらにそれをBへ。そしてCに入れ最後にD・・・などもよくあるのですが >「何故そんなに遠回りを?」と思い追いかける気力が無くなってしまいます。 (実際はどうなのかは分りません) 必要なことで処理を行っているのは当然ありますが、 無駄に処理を行っている場合も絶対無いといえません。 「意味無いだろ」とか「もっとスマートに出来るだろ」というようなソース^^; しかし、仕様上、ロジックがどうしても複雑になる、 作りこんでいったら結果そうなったという経験も自分にはあります^^; おおまかな仕様およびロジックを理解してからプログラムを細かく追ったほうがいいですね。 しかしながら、人のプログラムは分りにくいです。 個人の考え方が入っていますから。 すんません。個人的な話でした^^;

全文を見る
すると、全ての回答が全文表示されます。
回答No.7

コンピューターってバカなんですよ(笑)。なのでなにか動かそうと思ったら、赤ん坊に物を教えるようなつもりで取り組まないといけません。プログラムってそういう作業です。例えば中学生に箸を持たせようと思ったら「箸を右手で持て」って言えば通じますが、赤ん坊(まあ言葉は理解するとしましょう)には「はーい、これは『箸』って言いま~、わかりまちゅか~?は~い、いい子ですね~、じゃあこっちの手の人差し指と親指で・・・」とまあこの位の手間が掛かりますよね。コンピューターを相手にするっていう事は実はこういう事なんですよ。 プログラムコードを読むって実はものすごい大変な作業です。特に人の書いたプログラムはベテランでも読むのが大変です。ただ、1行づつ命令を読みながら自分がコンピューターになったつもりで追って行くんです。今、ここが何なのか、なぜこういう事をしているのか、ああ、だからここでこっちに行くんだ・・・プログラムは1行1行意味があるもので、その意味を考えながら追っていけば、多少は理解が深まります。 ちなみに僕が最初に取り組んだのはファミコンのアセンブラという言語(っていうのかな?)でした。アセンブラって足し算と引き算しかないんですよ。掛け算も割り算も足し算引き算を組み合わせて自分で作るんです。それからすると、始めてC言語っつーものを見た時は感動しました。2*2って書くだけで4になってくれるんだもん(笑)。

kitagasuki
質問者

お礼

確かに他人が書いたプログラムを理解するのは難しいですね。 質問の時にも書いたのですが「何故こんな?」ということも製作者には当然考えがあってのことで・・・。 落ち着いて一行ずつ読んでいったりしてるのですが段々焦りだしてやけになって「分からん!」となってしまっています。 とにかく一度理解できる段階までいければ何か見方が変わるかなとは思うのですが。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • 530529
  • ベストアンサー率16% (86/521)
回答No.6

プログラムって、何かをするために作る物ですよね! ここでは、同意をいただいたとして、今はやりたい事がとても複雑になってきており一つのプログラムでは出来ませんので、複数のプログラムが集まって実現しています。 そうなると、一つのプロクラムの1行では本当に小さな事しかしてないのでそこだけを見ても 質問者が書かれているようになんでこんな事を考えてもしかたがないのでと思います。 もちろん個々の動きが分からなければ全体は分からないとも思いますが、全体からと言うかトップダウンで考えて、何々をするために、このプログラムで何々をしている、さらにこの部分ではXXをしているとしておっかけていけばよいので無いでしょうか ? > 「IF」などで分岐していくとか、「何故そんなに遠回りを?」 と書かれていますが普通のプログラムでは一度に一つしか出来ませんので、やりたい事別にやりたい事を書いて(処理、対応)して行くしか方法が無いのでは無いでしょうか ?

kitagasuki
質問者

お礼

そうなんですよね。 複数のプログラム・・・これが正直現状でとてもキツイんです。 メモをとっていても別のプログラムに飛んで戻ってきたらもう頭が混乱していて。 頭ではおっしゃっているように仕方が無いと分かっているのですが実際追いかけるとなるとまだまだ私にはデカイ壁です。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • poncheke
  • ベストアンサー率20% (2/10)
回答No.5

フローチャートにしてみればなんとなくわかってきますよ。1つ1つの処理を作っていくって感じですかね・・・ いくつもこなしていくうちにわかるようになってきましたよ☆あたしもはっきり言ってキライです・・・見たとたんに「終わってる」ってやる気なくしてました・・・

kitagasuki
質問者

お礼

「見たとたんに終わってる」・・・まさに私がそれですw 数をこなしていけば慣れるか、というのも考えていたのですが先に参ってしまいそうです。 確かに始めのうちはプログラムよりもフローを追いかけたほうがとっつきやすい感じはしますね。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

多分、機能毎の固まりになっていると思うので、 1行1行を追いかけていく前に、 固まりとして理解してから、 その固まりの中を理解するというようにしていったらどうでしょう

kitagasuki
質問者

お礼

確かにそれもいいかもですね。 全体どころか各ブロックでなにをしているのか、そこまで考えていませんでした。 ただひたすらに「正確に読まないと」と焦っていたところも正直あります。 初心者特有の焦りですかね・・・。周りができている分余計に。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.3

最初のうちは、1命令単位で何をやっているのか。 どんな命令で何をやっているのかを把握してくだ さい。 その次のステップとして、条件分岐など、数ステップ 単位で何をやっているのかがわかるはずです。 それらを頭の中で組み立てようとすると、頭がパンク してしまいますので、絵とか図に書いて、整理します。 これをフローとか、流れ図といいます。 また、ソースレベルで分からない命令などは、朱書き など、チェックしておくのも、いいでしょう。

kitagasuki
質問者

お礼

たしかに頭の中で考えていました。 「さっきこれをやったから今は値が変わってて・・・あれ?」 パンクしっぱなしでしたね。 メモはとっているのですがメモを見返すのもまた一苦労・・・という現状です。 慣れない間は本当に大変です。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Pesuko
  • ベストアンサー率30% (2017/6702)
回答No.2

>何故そんなに遠回りを 必要だから・・・ 会社の入金伝票処理を考えてください 顧客から入金されます 「入金されたら領収書」だけなら簡単ですが 通常は 元帳を引っ張り出して 顧客名から現在の売掛金の集計をして売り掛け合計から入金を差し引いて・・・ 「なんで売り掛け金を集計するの」とは思わないですよね 必要だから・・・・ 全体の処理の流れが解っていないから「飛ぶ」必要性がわからないのだと思います。

kitagasuki
質問者

お礼

全体の流れを分かる前にこっちが先に参ってしまうんですよね・・・。 まぁ私が情けないだけなんですが。 今まではでたらめに追いかけるだけだったんですが流れを意識してみようと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • exepieco
  • ベストアンサー率27% (25/91)
回答No.1

まずは仕様書でしょうね。 そのプログラム全体が何をしようとしているのか、そして 全体の中で今見ている部分は何をしようとしているのかをつかんだ上で、このIF文の目的は、と見てみるとよいのではないでしょうか。 #元のソースの品質にもよるのですが・・・ 私が解析的なことをする場合、長かったり分岐が多いものはプリントアウトしてまず流れを追うようにしてます。 紙ベースの作業は賛否両論ですが(^^;

kitagasuki
質問者

お礼

私もプリントして追っているのですが、見るだけで「やる気」を奪われるのが一番大きいですね。 先輩曰く「非常にクセのあるプログラム」だそうですw くじけそうですが、頑張ってみます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • コボルのプログラム教えてください!

    コボルのPERFORM構文がわかりません。教えてください。 どのサイトの解説を見ても、本を見てもさっぱり言ってる内容が理解できません。この構文だけは・・・。 手続き1とか何のことかわかりません。 ifとgotoを使った繰り返しのプログラムをPERFORMで書き直すことを目標としています。例題などをまじえてわかりやすく解説をしてくれませんか?パターンが5個くらいありましたが、すべてにおいての解説をよろしくお願いします!

  • 【プログラム】条件分岐について

    プログラム初心者です. (言語: C shell (csh)) 『Aというファイルの中の行数をカウントし,3行以上ならdecodeし, 3行以下ならdecodeしない.』 というプログラムを組みたいと思っております. カウントするのに while文を使い,その後 if文で条件分岐するのかなぁと考えております. ですが,なにせ初心者でして,調べる努力はしましたが,カウント方法やdecodeの実行・非実行コマンドなど,ピンときません. 初歩的な問題でお恥ずかしいのですが,どなたか教えてください.>< よろしくお願いいたします.

  • プログラム内容

    { // リストボックスのポインタを取得する CListBox* listbox1 = (CListBox*)GetDlgItem(IDC_LIST1); CListBox* listbox2 = (CListBox*)GetDlgItem(IDC_LIST2); // リストボックスのアイテムを全て消去する listbox1->ResetContent(); listbox2->ResetContent(); // ファイルを読み込んでリストボックスへ割り当てる CFileDialog dlg(TRUE); if (dlg.DoModal() == IDOK) { CHAR buf = '\0'; BOOL isnum = FALSE; CString data = ""; CFile file(dlg.GetPathName(), CFile::modeRead); while (file.Read(&buf, 1) != FALSE) { // 0~9かドット(小数点?)の場合は数字として扱い、それ以外はアルファベットとする if (isdigit((int)buf) != 0 || buf == '.') { if (data.GetLength() == 0) { data += buf; isnum = TRUE; } else if (isnum == FALSE) { istbox2->AddString(data); data = buf; isnum = TRUE; } else { data += buf; } } if (isalpha((int)buf) != 0) { if (data.GetLength() == 0) { data += buf; isnum = FALSE; } else if (isnum == TRUE) { listbox1->AddString(data); data = buf; isnum = FALSE; } else { data += buf; } } } // 最後に読み込んだ文字列をリストボックスへ追加する if (data.GetLength() != 0) { if (isnum == TRUE) { listbox1->AddString(data); } else { listbox2->AddString(data); } } // ファイルを閉じる file.Close(); } } のプログラムなんですが大筋はコメントで書いてある通りなんですが きっちり理解したい為、一行一行のプログラムが何を示すのか 教えてください。最初のポインタ取得とリストボックス内削除と 最後のファイル閉じるは明白なので省いてもらって結構です

  • 良いプログラムを書くためには

    今回、プログラミングの上達方法に関してアドバイス頂きたく質問しました。 現在、ソフトウェア開発の仕事に就いていてCやJavaなどでプログラムを書いたりしています。主にCで書くことが多いです。与えられた課題に対して動くプログラムは作れるのですが、先輩などからプログラムが汚いとよく指摘されます。 指摘される事柄は色々ありますが、何点か挙げるとまずモジュール分割が上手く出来ていない。1000行位の動くプログラムを書き始められた頃は、共通の処理などの関数が分割されておらず、同じ処理がやたら多いなど、余計な処理が多くコードに無駄が多いと指摘されました。それを改善したところ、今度は無駄に関数の分割が多くなり、読みにくいなどの指摘を受けました。 その他にも、例えば関数の中で、for(条件式)の条件式を上手く工夫すれば、for()の中で、余計な条件分岐などが減るなどの、細かい記述に関しても指摘を受けます。 質問はプログラムを作成する上で、大きな観点からだと、どのようにすれば綺麗にモジュール化などが出来るのか、モジュール化だけではなく、ソフトウェアの設計全般に関してです。また細かいことで、いえば先ほどのfor()の様に、文法を上手く使いこなすためにはどうすればよいか。本などのサンプルコードでは、forならfor、ifならifの説明など、主に単独の説明が多いように思えます。関数の中で、各文法同士を上手く使いこなし、他人が見ても読みやすいコードなどを書きたいです。 先輩からは、他人のソースコードを見ることなどと言われますが、何か他人のソースコードを見る上でも、上で挙げた指摘を改善するための見方とか、他にも自分でプログラムを作る場合に、こういう事に注意しながら作るといいなど何か改善するアドバイスがあれば宜しくお願いします。また参考になる書籍やサイトなどもあったら教えて頂くと助かります。 長くなりましたが宜しくお願いします。

  • 会社のプログラムがわからず毎日つらいです。

    visual basicのactiveReportで帳票を作成しています メインの帳票データ作成部分が1200行位あります。 プログラム全体では3200行位になります 部分部分でこの辺はこんなことやっているんだろうな位しか わからない状態です。 一連のプログラムの流れとかプログラムの細かい詳細がわかるように なるにはどうすればいいでしょうか。 自分でできることといったら帳票のデータ項目変更位しか対応できていません コメントも少なくプログラムを読んでもさっぱり全体像が見えてこない のでモチベーションがあがらずコードを見るのすら嫌になり ニュースを読んだりしている毎日です。 こんな事が3ヶ月位続いています。 自分ひとりの力で早くプログラム作成ができるようになりたいと思っては いるのですがプログラムの細かい部分がさっぱり理解できません こんなときはどうすればいいでしょうか何からはじめればいいでしょうか ちなみに仕様書は忙しくて作ってないとの事です 教えてください。

  • プログラム勉強法を教えてください!

    プログラム勉強法を教えてください! 既に過去の質問にあったらすみません! 現在ちょいちょいhtml、CSS、phpなどをDW8を使用しつつ触ってます。 とは言っても、そういう学校を出たわけでもなく、触ってるの程度もちょっとした画像の差し替えや、内容修正程度です。 そこで最近どうせやるならしっかり色々把握してやりたいと思いまして、今は必要な事だけを説明されて修正している状態ですが、基礎からしっかり理解して全体の概要を把握しつつ覚えていきたいです! 手始めに最近よく触るwordpressをやろうと思ってますが、物凄く基本的な事から独学で全体を把握しつつ学ぶには、どのような方法を取ると良いでしょうか? ちなみに壁にぶつかった時に一緒に考えてくれる人はいますが、その人も専門ではないので壁によっては一緒に考えてる状況です。 web系プログラムの初級から高率良く学ぶ段取りを大まかに教えてください!!

  • 原子同士の結合をプログラムで実現したい

    化学の知識も必要とされるので、自分も質問自体が曖昧になっちゃうんですが、 なるべくイメージできるように書いていきたいと思います。宜しくお願いします。 そもそもなんでこのようなことをしたいのかというと、 原子ひとつひとつに自身を処理するプログラムを持たせて、それを結合させて、 3Dの物体や空間を作りたいと思ったからです。 今よくある3Dゲーム(というよりゲーム)は、例えばある物体が壁まで到達したら そこでif分岐などを使って当たり判定などして、描画自体を制御していますが、 もしこの原子(自身のプログラムを持ってる)を結合させてある物体を作り出すことが できたなら、そういう制御プログラムも新たに付け加える必要もないし、 現実に近い環境をゲームに作り出すことができそうな気がするんです。 現実では1センチぐらいの物体でも、その中には何億何兆(もっと?)の原子が 詰まってると思うんですけど、それだとその時点でプログラムではどうしようもできないで、 プログラムの場合だと1センチに100個ぐらい原子で構成されるように簡略化したいです(できるものなら・・・) もちろんそれでも計算処理が膨大で実現は不可能だとは思いますけど、 とりあえずどんな感じのプログラムになるのかということが知りたいのです。

  • ファイル名変更プログラム

    Perlを学んでいます。 他人の作ったプログラムに、下記のようなものがあります。 それを読解しようと試みていて、大筋は理解できたと思うのですが、 細かいところで、『これは何?』とつまづいてしまいました。 もしどなたか分かる方がいらっしゃいましたら、暇な時で結構です。 未熟者の私に教えて頂けないでしょうか。どうかよろしくお願いします。 ??な個所  ・9~15行目の意味:おそらくファイル名の”やスペース等を外しているの             かなと思うのですが・・・  ・17~20行目:ここに記述した部分の前後どこにも$ctypeの定義はないので          すが、$ctypeにはなにが入っているのですか?  ・28~36行目:いきなり出てきた($fname,$ext2) = split(/\./,$fname);          の$ext2はなんなのでしょうか?拡張子らしい感じはするの          ですが、この35行目でどうして$ext2が拡張子として定義で          きるのでしょうか。 非常に量の多い質問でごめんなさい。答えられるときに答えられる部分のみで結構です。よろしくお願いします!! http://www.geocities.co.jp/HeartLand-Cosmos/4223/index.txt

    • ベストアンサー
    • CGI
  • プログラムが始まりません

    以下のプログラムを書いたところ、コンパイルは出来たのですが 正しく動作するか動かしたところ、7行目のprintfも実行されませんでした。それより上の部分に不備があるのでしょうか。 何か基本的なことをなにか基本的なことを理解できてないのかもしれませんが、教えていただけませんでしょうか #include<stdio.h> int main(void) { FILE *fi; char fname[100], ss[255], *a, t, ch; int count, b, n, err, c[1000]; printf("file name?"); gets(fname); fi = fopen(fname,"r"); fgets(ss,255,fi); if(ss[0]!='P') err = 1; if(ss[1]!='3') err = 1; if(err ==1){ printf("file type is wrong\n"); exit(1); } while(count < 3){ *a = fgetc(fi); if(*a == 20){ count++; } } while(1){ *a = fgetc(fi); if(*a == EOF){ break; } if(*a == 20){ b++; } if(b == 3){ b = 0; t = *(a-1); if(t == '1'|| t == '3' ||t == '5' || t == '7'|| t == '9'){ c[n] = 1; } else{ c[n] = 2; } n++; } ++a; } n == 0; while(c[n] !=0){ count == 0; while(count < 8){ if(c[n] == 1){ ch++; } ch == ch + ch; count++; } printf("%c",ch); } fclose(fi); }

  • VBAのプログラムでうまく動かなくて困っています。

    VBA初心者です。 エクセルのVBAのプログラムでうまく動かなくて困っています。教えていただける方がいらしたら、ぜひ教えて下さい!よろしくお願いします。エクセルの内容は以下のとおりです。 (内容) セル    E H J L N P R・・・ 8行目100 200 50 40 30 80 9行目130 350 10 50 60 120 110 ・ ・ (1)列Hの値が列Eの値より大きい場合その下に行を追加します。 (2)セルJ+セルL+セルN+・・をしてセルEの値を超えたセル以降の値を追加した行のセルJ列から順にコピペする処理です。 上のセルの1行目の内容でいいますと、 (1)列Hの値「200」が列Eの値「100」より大きいのでその下に行追加 (2)セルJ、L、N「50」+「40」+「30」でセルEの値「100」より大きいので、追加した行のセルJ列にセルN、Pの値をコピペするです。 以下が私が書いたプログラムです。 Sub test() Dim x As Integer Dim s As Integer Dim t As Integer x = Range("B8").End(xlDown).Row r = Range("J8").End(xlToRight).Column '8行目から最終行までループ For i = x To 9 Step -1 If Cells(i, 5) < Cells(i, 8) Then ☆【For r = y To 11 Step -2 Cells(s, t).Value = Cells(i, r) + Cells(i, r + 2) If Cells(i, 5).Value < Cells(s, t).Value            Then Exit For Next】 Rows(i + 1).Insert Shift:=xlDown '超えたセルをコピーして、1行下の"J列以降"に代入 ★ x = x + 1 End If Next i End Sub 上記プログラムで★の部分がうまく書けません。☆の部分も間違っているような気がします。よろしくお願いします。