このディレクトリの索引

# 出典::C/C++の宿題片付けます 第130代目 #676 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9965.txt # 以下のプログラムを作成せよ。 # 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 # 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした # 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される # このような点数の変換プログラムを考える # 達成条件は # ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。 # ・ファイルからデータを読み込んだ時に、構造体にデータを入力している # ・ファイルout.txt内では、正しく点数が変換されている。 # ・名前は最大でも半角で20文字として。配列nameの外をアクセスしていない。 '以下のプログラムを作成せよ。 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される このような点数の変換プログラムを考える 達成条件は ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。 ・ファイルからデータを読み込んだ時に、構造体にデータを入力している ・ファイルout.txt内では、正しく点数が変換されている。' :- get_lines('in.txt',Lines), 点数を嵩上げ計算する(Lines,L2), '変換された点数データをファイルoutput.txtに書き込んでいる。'('out.txt',L2). 点数を嵩上げ計算する(Lines,L2) :- 'Linesから名前・三科目点数ならびのならびに分解'(Lines,LL), 三科目の最高点を得る(LL,MaxA,MaxB,MaxC), 嵩上げ率の計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C), 嵩上げ計算した表示行ならびの生成(LL,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,L2). 'Linesから名前・三科目点数ならびのならびに分解'(Lines,LL) :- findall([Name2,A1,B1,C1],( member(Line,Lines), split(Line,[' ',','],[Name1,A1,B1,C1]), 名前の長さ制限(Name1,Name2)), LL). 三科目の最高点を得る(L,MaxA,MaxB,MaxC) :- findmax(A,(member([_,A,_,_],L)),MaxA), findmax(B,(member([_,_,B,_],L)),MaMaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C) :- _嵩上げ率A is 100 / MaxA, _嵩上げ率B is 100 / MaxB, _嵩上げ率C is 100 / MaxC. 嵩上げ計算(A,B,C,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX) :- AX is A * _嵩上げ率A, BX is B * _嵩上げ率B, CX is C * _嵩上げ率C. 嵩上げ計算した表示行ならびの生成(LL,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,L2) :- findall(表示行,( member([Name,A2,B2,C2],LL), 嵩上げ計算(A2,B2,C2,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX), atomic_list_concat([Name,AX,BX,CX],',',表示行)), L2). 名前の長さ制限(Name,NameX) :- atom_code(Name,L), 名前の長さ制限(0,L,LX), atom_codes(NameX,LX). 名前の長さ制限(_バイト累計_1,[A|R1],[A|R2]) :- char_code(A,Code), 文字のバイト累計(Code,_バイト累計_1,_バイト累計_2), 名前の長さ制限(_バイト累計_2,R1,R2). 名前の長さ制限(_,_,[]). 文字のバイト累計(Code,_バイト累計_1,_バイト累計_2) :- 全角文字の場合2バイト加算(Code,_バイト累計_1,_バイト累計_2). 文字のバイト累計(Code,_バイト累計_1,_バイト累計_2) :- 半角文字の場合1バイト加算(Code,_バイト累計_1,_バイト累計_2). 全角文字の場合2バイト加算(Code,_バイト累計_1,_バイト累計_2) :- Code > 255, _バイト累計_1 < 19, _バイト累計_2 is _バイト累計_1 + 2. 半角文字の場合1バイト加算(Code,_バイト累計_1,_バイト累計_2) :- Code < 256, _バイト累計_1 < 20, _バイト累計_2 is _バイト累計_1 + 2.