"構成管理システムで管理されているソースファイル単位の更新履歴から関数の変更回数を解析し、複雑度と結合して表示する機能を特徴とする関数の変更回数と複雑度を表示するシステム。請求項1における関数の変更回数の解析に加えて、関数の変更行数も解析し、関数の変更回数と変更行数と複雑度を結合して表示する機能を特徴とする関数の変更回数と変更行数と複雑度を表示するシステム。請求項1における関数の変更回数と複雑度の表示する際に、関数の変更回数と複雑度から改善優先度を評価して表示順序を並び替えて表示する機能を特徴とする関数の変更回数と複雑度を表示するシステム。請求項3における改善優先度を評価する際に、ユーザから指定された値により改善優先度の評価計算を変更する機能を特徴とする関数の変更回数と複雑度を表示するシステム。既に使用されているソースコード構成管理システムで管理しているソースコードでは、ソースコード構成管理システムから取得できる変更履歴はソースファイル単位のため、ソースファイル内のどの関数が変更されたのかを確認する手段がない。本発明が解決する課題は、既存のソースコード構成管理システムのソースファイルの変更履歴情報と、関数ごとの情報である静的解析情報の複雑度とから、関数ごとの変更情報と複雑度を結合して表示することにより、プログラム開発者が見直すべきソースコードを把握することができることである。本発明のシステムは、ソースコード構成管理システムを持つ。ソースコード構成管理システムに作成変更したソースファイルを登録すると、登録時にリビジョンが付加される。ソースコード構成管理システムは、各リビジョンのソースファイルを出力することができる。また、1ソースファイルの2つのリビジョン間の差分情報を出力することができる。差分情報には、リビジョン間で変更削除追加された行の内容および行番号を含む。各リビジョンのソースファイルをソースコード構成管理システムから取得し、ソースファイル内を関数に分割する。次にそのリビジョンの差分情報の変更削除追加された行の内容および行番号の情報をソースコード構成管理システムから取得し、どの関数が変更されたかを把握する。関数ごとの変更情報を作成することにより、関数ごとの静的解析情報の複雑度と結合して表示することが出来る。本発明のシステムにより、関数ごとの変更情報と複雑度を結合して表示することで、プログラム開発者は見直すべきソースコードを把握することができる。以下、実施例を図面を用いて説明する。図1は本発明を実施するシステムの構成図である。本システムは、関数の変更回数と複雑度対応付け機能101、関数の変更回数測定機能102、複雑度測定機能103、ソースコード構成管理システム104を持つサーバ装置105と、入力装置106、出力装置107から構成される。ソースコード構成管理システムは構成管理情報の格納された構成情報管理DB108を持ち、検出機能からの問い合わせに対して構成管理情報を返す。例えば、ソースコード構成管理システムとしてはSubverionというOSSOpenSourceSoftwareがある。本システムが持つソースコード構成管理システムはソースファイル名と2つのリビジョン番号を指定することにより、リビジョン間の差分情報を出力する機能を持つ。図2は差分情報の一例を示した図である。差分情報201は、ユニファイド形式である。ユニファイド形式の差分情報の構造は、先頭にファイル名を示す行、その後にファイルについて2つのリビジョン間で何行目に変更があるかを示す行番号の行が続き、さらにその後に削除行を示す行、挿入行を示す行、非変更行を示す行が続く。ファイル名を示す行は、3つの-記号で始まる行と、3つの記号で始まる行である。変更のあった行番号を示す行は2つの記号で始まり2つの記号で終わる行である。削除行を示す行は-記号で始まる行である。挿入行を示す行は記号で始まる行である。非変更行を示す行は半角スペース記号で始まる行である。行番号の行の-記号から始まる-5,10の部分が変更前のソースコードについて表示されている差分情報の表示開始行と表示範囲行を示し、記号から始まる5,10が変更後のソースコードについて表示されている差分情報の表示開始行と表示範囲行を示す。図3は2つのリビジョン間で変更のあったファイルのファイル名をソースコード構成管理システムから取得して格納するテーブル1を示した図である。テーブル1はファイル名列301を持ち、ファイル名列の各行にはファイル名が1つずつ格納される。図4はテーブル1に格納されたファイル名のファイルについて、その差分情報をソースコード構成管理システムから取得して格納するテーブル2を示した図である。テーブル2は差分情報列401を持ち、差分情報列の各行には差分情報が1行ずつ格納される。図5はテーブル2に格納された差分情報をもとに、変更前後のリビジョンの変更開始行と変更終了行を格納するテーブル3を示した図である。テーブル3はリビジョン列501、変更開始行番号列502、変更終了行番号列503を持つ。リビジョン列の各行には、変更範囲が変更前後のリビジョンのどちらであるかを識別するためにリビジョン番号が格納される。変更開始行番号列の各行には、変更範囲の開始行番号が格納される。変更終了行番号列の各行には、変更範囲の終了行番号が格納される。図6はテーブル1に格納されたファイル名のファイルについて、字句解析して得られたトークンを格納するテーブル4を示した図である。字句解析は、ソースコードを構成する文字の並びを、意味を持つ最小単位ごとに分割する。意味を持つ最小単位をトークンという。C言語のトークンは、ISO/IEC9899で定められている。テーブル4はID列601、値列602、種別列603、行番号列604を持つ。ID列の各行には、トークンを識別するためにトークンの出現する順に数値が1ずつ加算して格納される。値列の各行にはトークンが格納される。種別列の各行にはトークンの種別が格納される。行番号列の各行にはトークンの出現する行の行番号が格納される。トークンの種別はidentifierを識別子、記号を開き丸括弧、記号を閉じ丸括弧、{記号を開き波括弧、}記号を閉じ波括弧、;記号をセミコロン、,記号をコンマ、その他のトークンをその他とする。図7はテーブル4に格納されたトークン情報をもとに、関数定義の開始行と終了行を格納するテーブル5を示した図である。テーブル5はID列701、関数名列702、開始行番号列703、終了行番号列704を持つ。ID列の各行には、関数名を表すトークンのIDが格納される。関数名列の各行には、関数名を表すトークンの値が格納される。開始行番号列の各行には、関数名を表すトークンの出現する行の行番号が格納される。終了行番号列には、関数の終了を表すトークンの出現する行の行番号が格納される。図8はテーブル3に格納された変更開始行番号502と変更終了行番号503と、テーブル5に格納された関数定義範囲の情報をもとに、変更のあった関数の関数名を格納するテーブル6を示した図である。テーブル6はファイル名列801、関数名列802を持つ。ファイル名列の各行には、関数定義が記述されているファイルのファイル名が格納される。関数名列の各行には、関数名が格納される。図9はテーブル6に格納されたファイル名と関数名をもとに、関数の変更回数を格納するテーブル7を示した図である。テーブル7はファイル名列901、関数名列902、変更回数列903を持つ。ファイル名列の各行には、関数定義が記述されているファイルのファイル名が格納される。関数名列の各行には、関数名が格納される。変更回数列の各行には、関数の変更回数が格納される。図10は複雑度測定機能により得られた関数の複雑度を格納するテーブル8を示した図である。テーブル8はファイル名列1001、関数名列1002、複雑度列1003を持つ。ファイル名列の各行には、関数定義が記述されているファイルのファイル名が格納される。関数名列の各行には、関数名が格納される。複雑度列の各行には、関数の複雑度が格納される。図11はテーブル7に格納された変更回数とテーブル8に格納された複雑度を結合して格納するテーブル9を示した図である。テーブル9はファイル名列1101、関数名列1102、変更回数列1103、複雑度列1104を持つ。ファイル名列の各行には、関数定義が記述されているファイルのファイル名が格納される。関数名列の各行には、関数名が格納される。変更回数列の各行には、関数の変更回数が格納される。複雑度列の各行には、関数の複雑度が格納される。図12は関数の変更回数と複雑度の一覧を表示するまでの一実施例を示した処理フロー図である。まず、構成情報管理DBから最新のリビジョン番号を取得し、変数rev1に格納する1201。rev1の値が2以上であるか、1以下であるかを確認する1202。rev1の値が2以上の場合1203、rev1から1引いた値を変数rev2に格納する1204。rev2とrev1の間で変更された全ファイルのファイル名を構成情報管理DBから取得し、テーブル1に格納する1205。テーブル1の先頭の行に移動する1206。行が存在するか確認する1207。行が存在する場合1208、ファイル名列の値を変数fileに格納する1209。構成情報管理DBからファイル名がfileであるファイルについて、rev2とrev1の間の差分情報を取得する1210。取得した差分情報を行単位に分割し、テーブル2に格納する1211。その後に図13のコネクタAへ処理を進める1212。テーブル1の先頭の行に移動したときに行が存在するか確認し、行が存在しない場合1213、rev2の値をrev1に格納し1214、rev1の値を確認し、値が1以下の場合1215、図22のコネクタPに処理を進める1216。図13はテーブル2に格納した差分情報から変更前後のリビジョンについて変更範囲を解析する処理を示した処理フロー図である。処理はコネクタAから開始される1301。テーブル2の先頭の行に移動する1302。行の先頭の文字が記号かその他かを確認する1303。その他の場合1304、テーブル2の1つ後の行に移動する1305。行が存在するか確認し、存在する場合1306、行の先頭の文字が記号かその他かを確認する。記号の場合1307、この行の、記号の直後に出現する数値を変数start1に格納し1308、-記号の直後に出現する数値を変数start2に格納する1309。変数cnt1に0を、変数cnt2に0を格納する1310。変数rng1に-1を、変数rng2に-1を格納する1311。テーブル2の1つ後の行に移動する1312。行が存在するか確認し、行が存在する場合1313、行の先頭の文字が記号かその他かを確認する1314。記号の場合1315、処理1308に進む。その他の場合1316、行の先頭の文字が記号か-記号かその他かを確認する1317。記号の場合1318、rng1の値に1加算する1319。-記号の場合1320、rng2の値に1加算する1321。その後、コネクタB1322を経由して1323、テーブル2の1つ後ろの行の処理に進む。その他の場合1324、図14のコネクタCに処理を進める1325。図14の処理からの復帰を示すコネクタD1326からは、cnt1にrng1に2を加算した値を、cnt2にrng2に2を加算した値を格納し1327、処理1311に進む。テーブル2の1つ後の行に移動して行が存在するか確認し、存在しない場合13281329、図15のコネクタEへ処理を進める13301331。図14は図13で解析した変更範囲の情報をテーブル3に格納する処理を示した処理フロー図である。処理はコネクタC1401から開始される。rng1の値が-1か確認する1402。-1以外の場合1403、変数sl1にstart1とcnt1の和を格納し1404、変数el1にsl1とrng1の和を格納する1405。テーブル3に行を追加し、追加した行のリビジョン列にrev1の値、開始行番号列にsl1の値、終了行番号列にel1の値を格納する1406。rng1の値が-1か確認し、-1の場合1407、rng2の値が-1か確認する1408。-1以外の場合1409、変数sl2にstart2とcnt2の和を格納し1410、変数el2にsl2とrng2の和を格納する1411。テーブル3に行を追加し、追加行のリビジョン列にrev2の値、開始行番号列にsl2の値、終了行番号列にel2の値を格納する1412。格納後、図13のコネクタDへ処理を進める1413。rng2の値が-1か確認し、-1の場合1414、図13のコネクタDへ処理を進める1415。図15はファイル名がfileのファイルについて、リビジョンがrev1のときのソースコードを字句解析してテーブル4に格納する処理を示した処理フロー図である。処理はコネクタE1501から開始される。変数revにrev1の値を格納する1502。構成情報管理DBからファイル名がfileのファイルについて、リビジョンがrevのときのソースコードを取得する1503。ソースコードを字句解析してトークンに分割し、出現する順に1ずつ加算したID、トークン、種別、出現する行の行番号を、テーブル4に格納する1504。その後、図16のコネクタFへ処理を進める1505。図16はテーブル4に格納されたトークンから関数の開始行番号を解析する処理を示した処理フロー図である。処理はコネクタF1601から開始される。テーブル4の先頭の行に移動する1602。行が存在するか確認する1603。行が存在する場合1604、種別列の値を確認する1605。種別列の値が識別子以外の場合1606、テーブル4の1つ後の行に移動する1607。種別列の値が識別子の場合1608、変数idにID列の値を、変数valueに値列の値を、変数lineに行番号列の値を格納する1609。テーブル4の1つ後の行に移動する1610。行が存在するか確認する1611。行が存在する場合1612、種別列の値を確認する1613。種別列の値が開き丸括弧以外の場合1614、コネクタGへ処理を進める1615。種別列の値が開き丸括弧の場合1616、テーブル4の1つ後の行に移動する1617。行が存在するか確認する1618。行が存在する場合1619、種別列の値を確認する1620。種別列の値が閉じ丸括弧以外の場合1621、処理1617へ処理を進める。種別列の値が閉じ丸括弧の場合1622、テーブル4の1つ後の行に移動する1623。行が存在するか確認する1624。行が存在する場合1625、種別列の値を確認する1626。種別列の値が開き波括弧以外の場合1627、コネクタGへ処理を進める1628。種別列の値が開き波括弧の場合1629、テーブル5に行を追加し、追加した行のID列にidの値を、関数名列にvalueの値を、開始行番号列にlineの値を格納する1630。格納後、コネクタGへ処理を進める1628。コネクタG1631からは、テーブル4の1つ後の行に移動し、処理を進める。行が存在するか確認したときに、行が存在しない場合1632163316341635、図17のコネクタHへ処理を進める1636163716381639。図17はテーブル4に格納されたトークンから関数の終了行番号を解析する処理を示した処理フロー図である。処理はコネクタH1701から開始される。テーブル4の末尾の行に移動する1702。行が存在するか確認する1703。行が存在しない場合1704、図18のコネクタJへ処理を進める1705。行が存在する場合1706、種別列の値が閉じ波括弧か確認する1707。種別列の値が閉じ波括弧以外の場合1708、テーブル4の1つ前の行に移動し1709、処理を進める。種別列の値が閉じ波括弧の場合1710、変数id1にID列の値を、変数valueに値列の値を、変数lineに行番号列の値を格納する1711。テーブル4の1つ後の行を確認する1712。行が存在する場合1713、種別列の値が識別子か確認する1714。種別列の値が識別子の場合1715、テーブル4の1つ後の行を確認する1716。行が存在する場合1717か、処理1714で種別列の値が識別子以外の場合1718、種別列の値がコンマかセミコロンか確認する1719。種別列の値がコンマかセミコロンの場合1720か、処理1716で行が存在しない場合1721、コネクタIへ処理を進める1722。コネクタI1723からは、テーブル4の1つ前の行に移動し、処理を進める。種別列の値がコンマでもセミコロンでもない場合1724か、処理1712で行が存在しない場合1725、テーブル5からID列の値がid1の次に小さい行を探す1726。行が存在しない場合1727、図18のコネクタJへ処理を進める1728。行が存在する場合1729、この行の終了行番号の列にlineの値を格納する1730。この行のID列の値を変数id2に格納する1731。テーブル4のID列の値がid2の行へ移動し1732、処理を進める。図18はテーブル3の各行について変更開始行番号列と変更終了行番号列の値を取り出す処理を示した処理フロー図である。処理はコネクタJ1801から開始される。テーブル3の先頭の行に移動する1802。行が存在するか確認する1803。行が存在しない場合1804、図20のコネクタMへ処理を進める1805。行が存在する場合1806、リビジョン列の値を確認する1807。リビジョン列の値がrevと等しくない場合1808、テーブル3の1つ後の1行を確認する1809。リビジョン列の値がrevと等しい場合1810、変数msに変更開始行番号列の値を、変数meに変更終了行番号列の値を格納する1811。格納後、図19のコネクタKへ処理を進める1812。図19の処理からの復帰を示すコネクタL1813からは、テーブル3の1つ後の1行を確認する1809。図19はms、meとテーブル5の関数の開始行番号と終了行番号から、変更のあった関数を解析する処理を示した処理フロー図である。処理はコネクタK1901から開始される。テーブル5の先頭の1行を確認する1902。行が存在するか確認する1903。行が存在しない場合1904、図18のコネクタLへ処理を進める1905。行が存在する場合1906、開始行番号列の値がme以下であり、かつ、終了行番号列の値がms以上であることを満たすか確認する1907。満たさない場合1908、テーブル5の1つ後の1行を確認し1909、次の処理を進める。満たす場合1910、変数funcに関数名列の値を格納する1911。テーブル6から、ファイル名列の値がfileと等しく、関数名列の値がfuncと等しい行を探す1912。行が存在する場合1913、テーブル5の1つ後の1行を確認し1909、次の処理を進める。行が存在しない場合1914、テーブル6に行を追加し、追加した行のファイル名列にfileを、関数名列にfuncを格納する1915。テーブル5の1つ後の1行を確認し1909、次の処理を進める。図20はテーブル6に格納されたファイル名と関数名から、変更のあった関数の変更回数をテーブル7に格納する処理を示した処理フロー図である。処理はコネクタM2001から開始される。テーブル6の先頭の行に移動する2002。行が存在するか確認する2003。行が存在しない場合2004、revの値を確認する2005。revの値がrev1と等しい場合2006、図21のコネクタNへ処理を進める2007。revの値がrev2と等しい場合2008、図12のコネクタOへ処理を進める2009。行が存在する場合2010、変数mfileにファイル名を、変数mfuncに関数名を格納する2011。テーブル7から、ファイル名列の値がmfileと等しく、関数名列の値がmfuncと等しい行を探す2012。行が存在する場合2013、この行の変更回数列の値に1加算する2014。行が存在しない場合2015、テーブル7に行を追加し、追加した行のファイル名列にmfileを、関数名列にmfuncを、変更回数列に1を格納する2016。テーブル5の1つ後の1行を確認し2017、次の処理を進める。図21はファイル名がfileのファイルについて、リビジョンがrev2のときのソースコードを字句解析してテーブル4に格納する処理を示した処理フロー図である。処理はコネクタN2101から開始される。変数revにrev2の値を格納する2102。構成情報管理DBからファイル名がfileのファイルについて、リビジョンがrevのときのソースコードを取得する2103。ソースコードを字句解析してトークンに分割し、出現する順に1ずつ加算したID、トークン、種別、出現する行の行番号を、テーブル4に格納する2104。その後、図16のコネクタFへ処理を進める2105。図22は複雑度測定機能により取得された複雑度とテーブル6の関数の変更回数を結合する処理を示した処理フロー図である。処理はコネクタP2201から開始される。構成情報管理DBから最新のリビジョンの全ソースコードを取得する2202。全ソースコードについて複雑度測定機能により取得された複雑度をテーブル8に格納する2203。テーブル7の先頭の行に移動する2204。行が存在するか確認する2205。行が存在しない場合2206、図23のコネクタQへ処理を進める2207。行が存在する場合2208、変数fileにファイル名列の値を、変数funcに関数名列の値を、変数mcに変更回数列の値を格納する2209。テーブル8からファイル名列の値がfileと等しく、関数名列の値がfuncと等しい行を探す2210。行が存在しない場合2211、テーブル7の1つ後の行に移動し2212、次の処理を進める。行が存在する場合2213、変数ccに複雑度列の値を格納する2214。テーブル9に行を追加し、追加した行のファイル名列にfileを、関数名列にfuncを、変更回数列にmcを、複雑度列にccを格納する2215。その後、テーブル7の1つ後の行に移動し2212、次の処理を進める。図23はテーブル9に格納された関数の変更回数と複雑度を表示する処理を示した処理フロー図である。処理はコネクタQ2301から開始される。テーブル9に格納された関数の変更回数と複雑度を表示し2302、処理を終了する。図24はテーブル9に格納された関数の変更回数と複雑度の表示例である。テーブル9の各行に行番号を付与してNo.列2401として表示する。本実施例では、関数の変更回数に加えて変更行数を表示することができる例を説明する。図25はテーブル3に格納された変更開始行番号502と変更終了行番号503と、テーブル5に格納された関数定義範囲の情報をもとに、変更のあった関数の関数名と変更行数を格納するテーブル10を示した図である。テーブル10はファイル名列2501、関数名列2502、変更行数列2503を持つ。ファイル名列の各行には、関数定義が記述されているファイルのファイル名が格納される。関数名列の各行には、関数名が格納される。変更行数列の各行には、関数の変更行数が格納される。図26はテーブル10に格納されたファイル名と関数名、変更行数から、変更のあった関数の変更回数と変更行数を格納するテーブル11を示した図である。テーブル11はファイル名列2601、関数名列2602、変更回数列2603、変更行数列2604を持つ。ファイル名列の各行には、関数定義が記述されているファイルのファイル名が格納される。関数名列の各行には、関数名が格納される。変更回数列の各行には、関数の変更回数が格納される。変更行数列の各行には、関数の変更行数が格納される。図27はテーブル11に格納された変更回数と変更行数と、テーブル8に格納された複雑度を結合して格納するテーブル12を示した図である。テーブル12はファイル名列2701、関数名列2702、変更回数列2703、変更行数列2704、複雑度列2705を持つ。ファイル名列の各行には、関数定義が記述されているファイルのファイル名が格納される。関数名列の各行には、関数名が格納される。変更回数列の各行には、関数の変更回数が格納される。変更行数列の各行には、関数の変更行数が格納される。複雑度列の各行には、関数の複雑度が格納される。図28は実施例1の図19の処理について、変更行数を取得できるように拡張した処理フロー図である。処理はコネクタK2801から開始される。テーブル5の先頭の1行を確認する2802。行が存在するか確認する2803。行が存在しない場合2804、図18のコネクタLへ処理を進める2805。行が存在する場合2806、変数fsに開始行番号列の値を、変数feに終了行番号列の値を格納する2807。fsがme以下であり、かつ、feがms以上であることを満たすか確認する2808。満たさない場合2809、テーブル5の1つ後の1行を確認し2810、次の処理を進める。満たす場合2811、feの値を確認する2812。feの値がme未満の場合2813、変数reにfeの値を格納する2814。feの値がme以上の場合2815、変数reにmeの値を格納する2816。続けてfsの値を確認する2817。fsの値がms未満の場合2818、変数rsにmsの値を格納する2819。fsの値がms以上の場合2820、変数rsにfsの値を格納する2821。変数mrにreからrsを引いて1を加算した値を格納する2822。変数funcに関数名列の値を格納する2823。テーブル10から、ファイル名列の値がfileと等しく、関数名列の値がfuncと等しい行を探す2824。行が存在する場合2825、この行の変更行数列の値にmrを加算する2826。行が存在しない場合2827、テーブル10に行を追加し、追加した行のファイル名列にfileを、関数名列にfuncを、変更行数列にmrを格納する2828。テーブル5の1つ後の1行を確認し2810、次の処理を進める。図29は実施例1の図20について、テーブル10に格納されたファイル名と関数名、変更行数から、変更のあった関数の変更回数と変更行数をテーブル11に格納するように拡張した処理フロー図である。処理はコネクタM2901から開始される。テーブル10の先頭の行に移動する2902。行が存在するか確認する2903。行が存在しない場合2904、revの値を確認する2905。revの値がrev1と等しい場合2906、図21のコネクタNへ処理を進める2907。revの値がrev2と等しい場合2908、図12のコネクタOへ処理を進める2909。行が存在する場合2910、変数mfileにファイル名を、変数mfuncに関数名を、変数mlineに変更行数を格納する2911。テーブル11から、ファイル名列の値がmfileと等しく、関数名列の値がmfuncと等しい行を探す2912。行が存在する場合2913、この行の変更回数列の値に1を加算し、変更行数列にmlineを加算する2914。行が存在しない場合2915、テーブル11に行を追加し、追加した行のファイル名列にmfileを、関数名列にmfuncを、変更回数列に1を、変更行数列にmlineを格納する2916。テーブル5の1つ後の1行を確認し2917、次の処理を進める。図30は実施例1の図22の処理について、テーブル11に格納された関数の変更回数と変更行数と、複雑度を結合するように拡張した処理フロー図である。処理はコネクタP3001から開始される。構成情報管理DBから最新のリビジョンの全ソースコードを取得する3002。全ソースコードについて複雑度測定機能により取得された複雑度をテーブル8に格納する3003。テーブル11の先頭の行に移動する3004。行が存在するか確認する3005。行が存在しない場合3006、図23のコネクタQへ処理を進める3007。行が存在する場合3008、変数fileにファイル名列の値を、変数funcに関数名列の値を、変数mcに変更回数列の値を、変数mrに変更行数列の値を格納する3009。テーブル7からファイル名列の値がfileと等しく、関数名列の値がfuncと等しい行を探す3010。行が存在しない場合3011、テーブル11の1つ後の行に移動し3012、次の処理を進める。行が存在する場合3013、変数ccに複雑度列の値を格納する3014。テーブル12に行を追加し、追加した行のファイル名列にfileを、関数名列にfuncを、複雑度列にccを、変更回数列にmcを、変更行数列にmrを格納する3015。その後、テーブル11の1つ後の行に移動し3012、次の処理を進める。図31はテーブル12に格納された関数の変更回数と変更行数と、複雑度の表示例である。テーブル12の各行に行番号を付与してNo.列3101として表示する。本実施例では、優先して改善すべき関数を変更回数と複雑度により並び替えて表示することができる例を説明する。図32はテーブル7に格納された変更回数、テーブル8に格納された複雑度、さらに変更回数と複雑度から求めた優先度評価を格納するテーブル13を示した図である。テーブル13はファイル名列3201、関数名列3202、変更回数列3203、複雑度列3204、優先度評価列3205を持つ。ファイル名列の各行には、関数定義が記述されているファイルのファイル名が格納される。関数名列の各行には、関数名が格納される。変更回数列の各行には、関数の変更回数が格納される。複雑度列の各行には、関数の複雑度が格納される。優先度評価列の各行には、変更回数と複雑度から求めた値が格納される。図33は実施例1の図22の処理について、テーブル7に格納された変更回数とテーブル8に格納された複雑度から、優先度評価を求めるように拡張した処理を示した処理フロー図である。処理はコネクタP3301から開始される。構成情報管理DBから最新のリビジョンの全ソースコードを取得する3302。全ソースコードについて複雑度測定機能により取得された複雑度をテーブル8に格納する3303。テーブル7の先頭の行に移動する3304。行が存在するか確認する3305。行が存在しない場合3306、図34のコネクタRへ処理を進める3307。行が存在する場合3308、変数fileにファイル名列の値を、変数funcに関数名列の値を、変数mcに変更回数列の値を格納する3309。テーブル8からファイル名列の値がfileと等しく、関数名列の値がfuncと等しい行を探す3310。行が存在しない場合3311、テーブル7の1つ後の行に移動し3312、次の処理を進める。行が存在する場合3313、変数ccに複雑度列の値を格納する3314。ccの値を確認する3315。ccの値が20以下の場合3316、変数estにmcを格納する3317。ccの値が20より大きい場合3318、変数estにccから20を引いた値にmcをかけた値を格納する3319。テーブル13に行を追加し、追加した行のファイル名列にfileを、関数名列にfuncを、変更回数列にmcを、複雑度列にccを、優先度評価列にestを格納する3320。その後、テーブル7の1つ後の行に移動し3312、次の処理を進める。図34は、テーブル13の行を優先度評価列で降順に並び替えてから表示する処理を示した処理フロー図である。処理はコネクタR3401から開始される。テーブル13の行を優先度評価列で降順に並び替える3402。テーブル13に格納された関数の変更回数と複雑度を表示し3403、処理を終了する。図35はテーブル13に格納された関数の変更回数と変更行数と、複雑度の表示例である。テーブル13の各行に行番号を付与してNo.列3501として表示する。本実施例では、優先して改善すべき関数を変更回数と複雑度により並び替えて表示することができる例を説明する。図36は実施例3の図33について、ユーザから指定された複雑度の閾値により優先度評価を行うように拡張した処理を示した処理フロー図である。処理はコネクタP3601から開始される。構成情報管理DBから最新のリビジョンの全ソースコードを取得する3602。全ソースコードについて複雑度測定機能により取得された複雑度をテーブル8に格納する3603。入力装置106によりユーザから指定された複雑度の閾値を受け取り変数thに格納する3604。テーブル7の先頭の行に移動する3605。行が存在するか確認する3607。行が存在しない場合3608、図34のコネクタRへ処理を進める3609。行が存在する場合3610、変数fileにファイル名列の値を、変数funcに関数名列の値を、変数mcに変更回数列の値を格納する3611。テーブル8からファイル名列の値がfileと等しく、関数名列の値がfuncと等しい行を探す3612。行が存在しない場合3613、テーブル7の1つ後の行に移動し3614、次の処理を進める。行が存在する場合3615、変数ccに複雑度列の値を格納する3616。ccの値を確認する3617。ccの値がth以下の場合3618、変数estにmcを格納する3619。ccの値がthより大きい場合3620、変数estにccからthを引いた値にmcをかけた値を格納する3621。テーブル13に行を追加し、追加した行のファイル名列にfileを、関数名列にfuncを、変更回数列にmcを、複雑度列にccを、優先度評価列にestを格納する3622。その後、テーブル7の1つ後の行に移動し3614、次の処理を進める。"