ソフトウェア制作論 平成30年10月24日
第5章 モジュール分割1 プログラム構造の明晰化 第5章 モジュール分割1 プログラム構造の明晰化 <本日の学習のねらい> プログラムのモジュール化を、具体例を通じて学習する。 その作成過程を通じて、ある程度の構造を持ったプログラムを作成する 方法を理解する。 モジュールとはひとまとまりの機能を持ったプログラムのこと。 一般にプログラムは、幾つかのモジュールを組み合わせて作成する。 そうすることで、プログラムの構造が明確になる。
原型プログラム private void jButtonCalcActionPerformed(ActionEvent evt) { int year=Integer.parseInt(jTextFieldYear.getText()); int month=Integer.parseInt(jTextFieldMonth.getText()); int day=Integer.parseInt(jTextFieldDay.getText()); }
基礎課題5-1 private void jButtonCalcActionPerformed(ActionEvent evt) { int year=Integer.parseInt(jTextFieldYear.getText()); int month=Integer.parseInt(jTextFieldMonth.getText()); int day=Integer.parseInt(jTextFieldDay.getText()); String weekDay=getWeekDay(year,month,day); jLabelResult.setText(weekDay+"です。"); } String getWeekDay(int year, int month, int day) { String ans=""; return ans; } 最初に全体構造を設計することがポイント!
基礎課題5-2 String getWeekDay(int year, int month, int day) { String ans=""; return ans; }
基礎課題5-2 String getWeekDay(int year, int month, int day) { int dayNumber=getDayNumber(year,month,day); int no=dayNumber % 7; String[] weekDay={"日曜日","月曜日","火曜日","水曜日", "木曜日","金曜日","土曜日"}; String ans= weekDay[no]; return ans; } int getDayNumber(int year, int month, int day) { int ans=0; return ans; }
基礎課題5-3 int getDayNumber(int year, int month, int day) { int ans=0; return ans; }
基礎課題5-3 int getDayNumber(int year, int month, int day) { int[] monthDay={0,31,28,31,30,31,30,31,31,30,31,30,31}; int ans=0; // 2000年12/31から(year-1)年12/31日までの日数のカウント for(int i=2001;i<year;i++){ if( (i%4)==0 && (i%100)!=0 || (i%400)==0 ){ ans=ans+366; } else { ans=ans+365; } // year年の1/1から(month-1)月の月末までの日数のカウント // month月の一日からday日までの日数のカウント return ans;
基礎課題5-4 boolean isLeapDay(int year){ boolean ans=false; if( ) { ans=true; } return ans; (year%4)==0 && (year%100)!=0 || (year%400)==0
基礎課題5-5 ・・・ // year年1/1から(month-1)月の月末までの日数のカウント for(int i=1;i<month;i++){ ans=ans+monthDay[i]; //うるう年の補正 if( i==2 && isLeapDay(year) ){ ans=ans+1; } // month月の一日からday日までの日数のカウント ans =ans+day; return ans;
基礎課題5-5 ・・・ // year年1/1から(month-1)月の月末までの日数のカウント for(int i=1;i<month;i++){ ans=ans+monthDay[i]; //うるう年の補正 if( i==2 && isLeapDay(year) ){ ans=ans+1; } // month月の一日からday日までの日数のカウント ans =ans+day; return ans;
基礎課題5-5 ・・・ // year年1/1から(month-1)月の月末までの日数のカウント for(int i=1;i<month;i++){ ans=ans+monthDay[i]; //うるう年の補正 if( i==2 && isLeapDay(year) ){ ans=ans+1; } // month月の一日からday日までの日数のカウント ans =ans+day; return ans;
基礎課題5-5 ・・・ // year年1/1から(month-1)月の月末までの日数のカウント for(int i=1;i<month;i++){ ans=ans+monthDay[i]; //うるう年の補正 if( i==2 && isLeapDay(year) ){ ans=ans+1; } // month月の一日からday日までの日数のカウント ans =ans+day; return ans;
基礎課題5-5 ・・・ // year年1/1から(month-1)月の月末までの日数のカウント for(int i=1;i<month;i++){ ans=ans+monthDay[i]; //うるう年の補正 if( i==2 && isLeapDay(year) ){ ans=ans+1; } // month月の一日からday日までの日数のカウント ans =ans+day; return ans;
基礎課題5-5 ・・・ // year年1/1から(month-1)月の月末までの日数のカウント for(int i=1;i<month;i++){ ans=ans+monthDay[i]; //うるう年の補正 if( i==2 && isLeapDay(year) ){ ans=ans+1; } // month月の一日からday日までの日数のカウント ans =ans+day; return ans;
基礎課題5-5 ・・・ // year年1/1から(month-1)月の月末までの日数のカウント for(int i=1;i<month;i++){ ans=ans+monthDay[i]; //うるう年の補正 if( i==2 && isLeapDay(year) ){ ans=ans+1; } // month月の一日からday日までの日数のカウント ans =ans+day; return ans;
モジュール化に基づくプログラムの作成 まとめ① モジュール化に基づくプログラムの作成 まとめ① メインプログラムの作成(設計) private void jButtonCalcActionPerformed(ActionEvent evt) { int Year=Integer.parseInt(jTextFieldYear.getText()); int Month=Integer.parseInt(jTextFieldMonth.getText()); int Day=Integer.parseInt(jTextFieldDay.getText()); String weekDay=getWeekDay(year,month,day); jLabelResult.setText(weekDay+"です。"); } 西暦年月日から曜日を求めるメソッド
モジュール化に基づくプログラムの作成 まとめ② モジュール化に基づくプログラムの作成 まとめ② getWeekDay()メソッドの定義 String getWeekDay(int year, int month, int day) { int dayNumber=getDayNumber(year,month,day); int no=dayNumber % 7; String[] weekDay={"日曜日","月曜日","火曜日","水曜日", "木曜日","金曜日","土曜日"}; String ans= weekDay[no]; return ans; } 基準日からの経過日数を求めるメソッド
モジュール化に基づくプログラムの作成 まとめ③ モジュール化に基づくプログラムの作成 まとめ③ getDayNumber()メソッドの定義-1 基本構造(設計)を固める int getDayNumber(int year, int month, int day) { int[] monthDay={0,31,28,31,30,31,30,31,31,30,31,30,31}; int ans=0; // 2000年12/31から(year-1)年12/31日までの日数のカウント // year年の1/1から(month-1)月の月末までの日数のカウント // month月の一日からday日までの日数のカウント return ans; }
モジュール化に基づくプログラムの作成 まとめ④ モジュール化に基づくプログラムの作成 まとめ④ getDayNumber()メソッドの定義-2 各部の詳細を記述する。 int getDayNumber(int year, int month, int day) { int[] monthDay={0,31,28,31,30,31,30,31,31,30,31,30,31}; int ans=0; // 2000年12/31から(year-1)年12/31日までの日数のカウント ・・・ // year年の1/1から(month-1)月の月末までの日数のカウント // month月の一日からday日までの日数のカウント return ans; }
モジュール化に基づくプログラムの作成 まとめ④ モジュール化に基づくプログラムの作成 まとめ④ メインプログラム(jButtonCalcActionPerformed())の設計 メソッドgetWeekDay(int year, int month, int day)の定義 うるう年の判定 boolean isLeapDay(int year) メソッドgetDayNumber(int year, int month, int day)の定義 <トップダウン的思考> 全体の構造 ⇒ 各部分の詳細 考察範囲(対象)を狭めて行く 重要!