Free Pascal 程序题

请问错在哪里

某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:

1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;

2) 五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;

3) 成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;

4) 西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;

5) 班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;

只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。

现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。

输入格式
输入的第一行是一个整数N(1 <= N <= 100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。

输出格式
输出包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。

Program jiax;
var xinm,ganbu,sibu,maxxinm:string;
qimo,banji,lunwen:integer;
count,max,i,jim,b,code:integer;

temp,tems,temo:string;
temt:integer;
begin
readln(b);
for i:=1 to b do
begin

max:=0;
jim:=0;
xinm:='';
qimo:=0;
banji:=0;
ganbu:='';
sibu:='';
lunwen:=0;

{readln(xinm,qimo,banji,ganbu,sibu,lunwen);}

readln(temp);

temt:=pos(' ',temp);
xinm:=copy(temp,1,temt);

delete(temp,1,temt);
temt:=pos(' ',temp);
temo:=copy(temp,1,temt-1);
val(temo,qimo,code);

delete(temp,1,temt);
temt:=pos(' ',temp);
temo:=copy(temp,1,temt-1);
val(temo,banji,code);

delete(temp,1,temt);
temt:=pos(' ',temp);
ganbu:=(copy(temp,1,temt-1));

delete(temp,1,temt);
temt:=pos(' ',temp);
sibu:=copy(temp,1,temt-1);

delete(temp,1,temt);

temt:=pos(' ',temp);
temo:=copy(temp,1,temt+1);
val(temo,lunwen,code);

{Yuanshi}
if (qimo > 80) and (lunwen >= 1) then jim:=jim+8000;
{wusi}
if (qimo > 85) and (banji > 80) then jim:=jim+4000;
{chenji}
if (qimo > 90) then jim:=jim+2000;
{sibu}
if (qimo > 85) and (sibu='Y') then jim:=jim+1000;
{banji}
if (banji> 80) and (ganbu='Y') then jim:=jim+850;

{huizing}
if jim>max then
begin
max:=jim;
maxxinm:=xinm;
end;
count:=count+jim;
end;

writeln(maxxinm);
writeln(max);
writeln(count);

end.

var a,b,c,s:array[1..100]of longint;m,x,y:array[1..100]of string;
t1,t2:char;n,i,j,l,k,max:longint;sz:int64;t:string;
begin
max:=0;
readln(n);
for i:=1 to n do
begin
readln(t);
while pos(' ',t)>0 do
begin
l:=pos(' ',t);
m[i]:=copy(t,1,l-1);
delete(t,1,l);
l:=pos(' ',t);
val(copy(t,1,l-1),a[i]);
delete(t,1,l);
l:=pos(' ',t);
val(copy(t,1,l-1),b[i]);
delete(t,1,l);
l:=pos(' ',t);
x[i]:=copy(t,1,l-1);
delete(t,1,l);
l:=pos(' ',t);
y[i]:=copy(t,1,l-1);
delete(t,1,l);
val(copy(t,1,99),c[i]);
end;
if (a[i]>80)and(c[i]>0) then inc(s[i],8000);
if (a[i]>85)and(b[i]>80) then inc(s[i],4000);
if (a[i]>90) then inc(s[i],2000);
if (a[i]>85)and(y[i]='Y') then inc(s[i],1000);
if (b[i]>80)and(x[i]='Y') then inc(s[i],850);
inc(sz,s[i]);
if max<s[i] then begin max:=s[i];k:=i;end;
end;
writeln(m[k]);
writeln(s[k]);
writeln(sz);
end.

这是我的 程序 你可以参考下
通过 100分
测试点1: 答案正确 432KB 0MS
测试点2: 答案正确 436KB 0MS
测试点3: 答案正确 432KB 0MS
测试点4: 答案正确 432KB 0MS
测试点5: 答案正确 436KB 0MS
测试点6: 答案正确 432KB 0MS
测试点7: 答案正确 432KB 4MS
测试点8: 答案正确 432KB 4MS
测试点9: 答案正确 436KB 0MS
测试点10: 答案正确 432KB 0MS
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-12-23
有两个问题,其中一个是致命的错误,至于判断奖学金那里没详细看
Program jiax;
var xinm,ganbu,sibu,maxxinm:string;
qimo,banji,lunwen:integer;
count,max,i,jim,b,code:integer;

temp,tems,temo:string;
temt:integer;
begin
readln(b);
max:=0; //max初始化不能放在循环内,否则每次都清0,结果就不正确,这个是致命错误
for i:=1 to b do
begin

jim:=0;
xinm:='';
qimo:=0;
banji:=0;
ganbu:='';
sibu:='';
lunwen:=0;

{readln(xinm,qimo,banji,ganbu,sibu,lunwen);}

readln(temp);

temt:=pos(' ',temp);
xinm:=copy(temp,1,temt); //姓名这里好像应该xinm:=copy(temp,1,temt-1);

delete(temp,1,temt);
temt:=pos(' ',temp);
temo:=copy(temp,1,temt-1);
val(temo,qimo,code);

delete(temp,1,temt);
temt:=pos(' ',temp);
temo:=copy(temp,1,temt-1);
val(temo,banji,code);

delete(temp,1,temt);
temt:=pos(' ',temp);
ganbu:=(copy(temp,1,temt-1));

delete(temp,1,temt);
temt:=pos(' ',temp);
sibu:=copy(temp,1,temt-1);

delete(temp,1,temt);

temt:=pos(' ',temp);
temo:=copy(temp,1,temt+1);
val(temo,lunwen,code);

{Yuanshi}
if (qimo > 80) and (lunwen >= 1) then jim:=jim+8000;
{wusi}
if (qimo > 85) and (banji > 80) then jim:=jim+4000;
{chenji}
if (qimo > 90) then jim:=jim+2000;
{sibu}
if (qimo > 85) and (sibu='Y') then jim:=jim+1000;
{banji}
if (banji> 80) and (ganbu='Y') then jim:=jim+850;

{huizing}
if jim>max then
begin
max:=jim;
maxxinm:=xinm;
end;
count:=count+jim;
end;

writeln(maxxinm);
writeln(max);
writeln(count);

end.本回答被网友采纳
第2个回答  2010-12-23
我看着你的读入貌似注销了啊,你写的程序我没有仔细看,我给你一个我的程序。
type
atp = record
avg , cla , text , sum : longint;
monitor , tibet : char;
name : string;
end;

var
a : array[0..101] of atp;
n , i , tot , max , k : longint;
c : char;

procedure init;
begin
readln(n);
for i := 1 to n do
begin
read(c);
while c <> ' ' do
begin
a[i].name := a[i].name + c;
read(c);
end;
read(a[i].avg , a[i].cla ,c, a[i].monitor , c , a[i].tibet , c , a[i].text);
readln;
end;
end;

procedure main;
begin
for i := 1 to n do
begin
if (a[i].avg > 80) and (a[i].text >= 1) then a[i].sum := a[i].sum + 8000;
if (a[i].avg > 85) and (a[i].cla > 80) then a[i].sum := a[i].sum + 4000;
if (a[i].avg > 90) then a[i].sum := a[i].sum + 2000;
if (a[i].avg > 85) and (a[i].tibet='Y') then a[i].sum := a[i].sum + 1000;
if (a[i].cla > 80) and (a[i].monitor='Y')then a[i].sum := a[i].sum + 850;
if max < a[i].sum then
begin
k := i;
max := a[i].sum;
end;
tot := tot + a[i].sum;
end;
writeln(a[k].name);
writeln(a[k].sum);
writeln(tot);
end;

begin
init;
main;
end.

参考资料:去年自己做的!

第3个回答  2010-12-24
var
i,max,min,sum:longint; //max,min 为最大,最小值,sum是平均值
a:array [1..20] of longint;//要读入的20个数
begin
sum:=0;
max:=-maxlongint;min:=maxlongint; //数值初始化,maxlongint是系统定的最大longint值,约21亿
for i:=1 to 20 do
begin
read(a[i]);//读入20个数
sum:=sum+a[i];//求出总的和
if max<a[i] then max:=a[i];
if min>a[i] then min:=a[i];//找出最大,最小值
end;
writeln(max);
writeln(min);
writeln(sum/20);输出答案。。。。
end.
明白了吗?
第4个回答  2010-12-25
没错

Freepascal编程问题
i,j,n:longint;begin readln(n);\/\/你要9就输9 for i:=1 to n do begin for j:=1 to i do write(' ');for j:=1 to i do write('*');writeln;end;end.羡慕你们,我们的程序...后天就是省选

懂free pascal语句的朋友进!,我有问题
第一题(我把两个数分两行输出了,你如果要输一行,可以自己改)var a,b,c:longint;begin readln(a,b);c:=a;c:=c*100+b;writeln(c);b:=b*1000;b:=b+a;writeln(b);end.第二题 var a:longint;begin readln(a);a:=a mod 10000;a:=a div 10;writeln(a);end.第三题 var a...

free pascal编程问题
2.在函数中,函数的返回值可以作为一个变量来处理。比如:function a : longint;begin a:=12;while a>4 do begin {...} end;end;这个例子在Turbo Pascal中,a>4会被认为是函数的递归调用,但是在Free Pascal中会认为a只是一个变量。如果想在Free Pascal中实现递归调用,就要写成下面的形式:fu...

free pascal编程,帮忙解释一下,假如能提示更简便的方法就给三十分...
第四个:if语句:这个if语句的判断条件1111*j,因为这个新产生的四位相同数数比模拟的平方数小就做 第五个:if语句:这是判断模拟的平方数减去四位相同数后是否还是一个完全平方数(sqr函数是求平方的,sqrt函数是求平方根的)如果让我写,我可能会写过程,这样会简单一点。看在我拼命理解你给的程...

问几个关于free pascal的题目,急急急!(完成几道是几道)
1、输出如下图形。2、编写一程序,验证角谷猜想。所谓的角谷猜想是:"对于任意大于1的自然数n,若n为奇数,则将n变为3*n+1,否则将n变为n的一半。经过若干次这样的变换,一定会使n变为1。"3、有一堆100多个的零件,若三个三个数,剩二个;若五个五个数,剩三个;若七个七个数,剩五个...

请用Free Pascal解答以下3道题。请答案简单一点,我是一个小菜鸟。_百度...
先打一下第二题:var a,b,c,m:longint;begin a:=36 div 3;b:=(48+a) div 3;c:=(64+a+b) div 3;writeln(a:4,48+a:4,64+a:4);writeln(a+b:4,b:4,64+a+b:4);writeln(a+b+c:4,b+c:4,c:4);end.

Free pascal练习题大全
1、倒油问题:看懂,并完成程序。有10升油在10的容器中,另有两个7升和3升的空容器,现要求用这三个容器倒油,使得最后在10升和7升的容器中各有5升。2、书本的P.250-251页的迷宫问题:看懂,完成程序并调试 3、细胞问题:一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为细胞数字...

FREE PASCAL编程问题
program Project1;var a:array[0..10000,0..10000]of integer;i,j,k,l,m,n:integer;begin k:=0;repeat k:=k+1;case k of 1:a[1,1]:=k;2:a[1,2]:=k;3:a[2,1]:=k;4:a[3,1]:=k;5:a[2,2]:=k;6:a[1,3]:=k;7:a[1,4]:=k;8:a[2,3]:=k;9:a[3,2...

帮忙!两道Free Pascal问题
1 program project1;var p,i,j,x:real;begin p:=1;i:=0;j:=1;writeln('x=?');readln(x);while (abs(p)>=1\/1000000) do begin i:=i+p;p:=(-1)*p*x*x\/(j*(j+1));j:=j+2;end;writeln('i:',i);readln;end.2 program project2;var i:string;j,p,q:integer;begin...

free pascal的问题 (用while语句解答)
n:=1; tot:=1;while n<=9 do begin tot:=(tot+1)*2;n:=n+1;end;writeln(tot);end.program ex_2;var i,j,k:integer;begin for i:=2 to 1000 do begin write(i,'=');k:=i; j:=2;{j 用来试探其因子,1000以内很小,枚举即可} while k<>1 do if k mod j=0 then ...

相似回答
大家正在搜