浙江大学计算机系硕士研究生复试题目解答(转载)

地理初学者 免费考研论坛/2006-11-27

原文内容来自免费考研论坛,请点击查看全文
http://bbs.freekaoyan.com/viewthread.php?tid=89250
题目要求:
读入两个小于100的正整数A和B,计算A B。需要注意的是:A和B的每一位数字由对应的英文
单词给出。
具体的输入输出格式规定如下:
输入格式:测试输入包含若干测试用例,每个测试用例占一行,格式为"A B =",相邻两
字符串有一个空格间隔。当A和B同时为0时输入结束,相应的结果不要输出。
输出格式:对每个测试用例输出1行,即A B的值。

输入样例:

one two
three four five six
zero seven eight nine
zero zero

输出样例:

The result is 3
The result is 90
The result is 96
附加要求:
(1)不能用string.h及其相关库函数
(2)出错检测机制
界面要求为:

源代码如下:

/* zju.h

Copyright (c) 2002, 2006 by ctu_85
All Rights Reserved.
*/ #include "stdio.h"
#define maxnum 32
#define error -1
int strcompare(char *);
int numcompare(char *);
int compare(char *m,char *c);
int Done();
int main()
{
int i;
do
{
i=Done();
}
while(i);
return 1;
}
int Done()
{
char str1[maxnum/2]={'\0'},str2[maxnum/2]={'\0'},temp;
int i,front=0,low=0,status=0,x,y;
printf("Please enter your formula,end with command 'zero zero'\n");
for(i=0;i<maxnum;i )
{
scanf("%c",&temp);
if(temp=='\n')
break;
if(temp==' ')
{
status=1;
continue;
}
if(status==0)/* number 0 or 1 stands for the front part of the formula */ {
str1[front]=temp;
front ;
}
else
if(status==1)
{
str2[low]=temp;
low ;
}
}
if((x=strcompare(str1))!=error&&(y=strcompare(str2))!=error)
{
if((x y)!=0)
printf("The result is:%d\n",x y);
return x y;
}
else
printf("Invalid input!\n");
}
int strcompare(char *c)
{
char str1[maxnum/4]={'\0'},str2[maxnum/4]={'\0'};
int i,temp,tmp,status=1,front=0,low=0,mid=0;/*the number & status of the input*/ for(i=0;i<maxnum/2;i )/*abstract the string */ {
if(*c=='\0')
break;
if(*c==' ')
{
mid=1;
c ;
}
if(mid==0)
{
str1[front]=*c;
front ;
c ;
}
else
if(mid==1)
{
status=2;
str2[low]=*c;
low ;
c ;
}
}
if(status==1)
{
if((temp=numcompare(str1))!=error)
return temp;
else
return error;
}
else
if(status==2)
{
if((temp=numcompare(str1))!=error&&(tmp=numcompare(str2))!=error)
return temp*10 tmp;
else
return error;
}
}
int numcompare(char *c)
{
char zero[]="zero";
char one[]="one";
char two[]="two";
char three[]="three";
char four[]="four";
char five[]="five";
char six[]="six";
char seven[]="seven";
char eight[]="eight";
char nine[]="nine";
int i;
if(*c=='z')
{
if(compare(c,zero))
return 0;
else
return error;
}
else
if(*c=='o')
{
if(compare(c,one))
return 1;
else
return error;
}
else
if(*c=='t'&&*(c 1)=='w')
{
if(compare(c,two))
return 2;
else
return error;
}
else
if(*c=='t'&&*(c 1)=='h')
{
if(compare(c,three))
return 3;
else
return error;
}
else
if(*c=='f'&&*(c 1)=='o')
{
if(compare(c,four))
return 4;
else
return error;
}
else
if(*c=='f'&&*(c 1)=='i')
{
if(compare(c,five))
return 5;
else
return error;
}
else
if(*c=='s'&&*(c 1)=='i')
{
if(compare(c,six))
return 6;
else
return error;
}
else
if(*c=='s'&&*(c 1)=='e')
{
if(compare(c,seven))
return 7;
else
return error;
}
else
if(*c=='e')
{
if(compare(c,eight))
return 8;
else
return error;
}
else
if(*c=='n')
{
if(compare(c,nine))
return 9;
else
return error;
}
else
return error;
}
int compare(char *c,char *t)
{
for(;*c!=0;c ,t )
if(*c!=*t)
break;
if(*c=='\0'&&*t=='\0')
return 1;
else
return 0;
}

查看积分策略说明 附件 2006-11-27 14:12 clip_image1.jpg (48.12 KB)



---------------------------------
谁是开门关门的人?(10分)
题目要求:
每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签
到、签离记录,请根据记录找出当天开门和关门的人。
具体的输入输出格式规定如下:
输入格式:测试输入的第一行给出记录的总天数N ( > 0 )。下面列出了N天的记录。
每天的记录在第一行给出记录的条目数M ( > 0 ),下面是M行,每行的格式为


证件号码签到时间签离时间

其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。
输出格式:对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。
注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,
且没有多人同时签到或者签离的情况。

要求完整的输入输出如下:

输入:




结果:



源代码如下:

/* zju.h

Copyright (c) 2002, 2006 by ctu_85
All Rights Reserved.
*/ #include "stdio.h"
#include "string.h"
#include "malloc.h"
#define idlength 15
struct Person
{
char id[idlength 1];
char Log[10];
char Leave[10];
};
struct Day
{
Person *work;
int number;
};
struct Day *CreateDayLog(int);
struct Person *CreatePersonLog(int);
int Process(struct Person *,char *);
struct Person *Earliest(struct Day*);
struct Person *Latiest(struct Day*);

int main()
{
int i,j,k;
Day *process;
Person *p;
printf("\nPlease Enter The Days:");
scanf("%d",&i);
process=CreateDayLog(i);
for(j=0;j<i;j )
{
printf("\nIn %dth day:\n",j 1);
if((process j)->number!=0)
{
p=Earliest(process j);
printf("The earliest user and his info is:\n");
printf("%s,%s,%s",p->id,p->Log,p->Leave);
printf("\n");
p=Latiest(process j);
printf("The latiest user and his info is:\n");
printf("%s,%s,%s",p->id,p->Log,p->Leave);
}
else
printf("There is no user that day!\n");
}
return 1;
}
struct Day *CreateDayLog(int i)
{
int j,k;
struct Day *day=(struct Day *)malloc(i*sizeof(struct Day));
for(j=0;j<i;j )
{
printf("\nThe number of users of the %dth day",j 1);
scanf("%d",&k);
(day j)->number=k;
(day j)->work=CreatePersonLog(k);
}
return day;
}
struct Person *CreatePersonLog(int i)
{
int j;
Person *user=(struct Person*)malloc(sizeof(struct Person)*i);
char detail[idlength 20],*t;
gets(detail);
for(j=0;j<i;j )
{
printf("\nThe deatails of the %dth person\n",j 1);
t=gets(detail);
Process(user j,t);
}
return user;
}
int Process(struct Person *p,char *c)
{
int i=0,j=0,k=0,status=0;
char time[8];
for(;*c!='\0';c )
{
if(*c==' ')
{
if(status==0)
{
p->id='\0';
status ;
continue;
}
if(status==1)
status ;
}
if(*c!=' ')
{
if(status==0) /* Now meets the id */ {
p->id=*c;
i ;
}
else
if(status==1) /*Now meets the log time */ {
p->Log[j]=*c;
j ;
}
else
if(status==2) /*Now meets the leave time */ {
p->Leave[k]=*c;
k ;
}
}
}
p->id=p->Log[j]=p->Leave[k]='\0';
}
struct Person *Earliest(struct Day* day)
{
int minhour=25,minminute=61,minsecond=61;
int i,early,temphour,tempminu,tempsec;
struct Person *p=day->work,*result;
result=p;
for(i=0;i<day->number;i ,p )
{
temphour=(p->Log[0]-'0')*10 (p->Log[1]-'0');
tempminu=(p->Log[3]-'0')*10 (p->Log[4]-'0');
tempsec=(p->Log[6]-'0')*10 (p->Log[7]-'0');
if(temphour<minhour)
{
minhour=temphour;
minminute=tempminu;
minsecond=tempsec;
early=i;
}
else if(temphour==minhour&&tempminu<minminute)
{
minminute=tempminu;
minsecond=tempsec;
early=i;
}
else if(temphour==minhour&&tempminu==minminute&&tempsec<minsecond)
{
minsecond=tempsec;
early=i;
}
}
return result early;
}
struct Person *Latiest(struct Day* day)
{
int maxhour=-23,maxminute=-59,maxsecond=-59;
int i,late,temphour,tempminu,tempsec;
struct Person *p=day->work,*result;
result=p;
for(i=0;i<day->number;i ,p )
{
temphour=(p->Leave[0]-'2')*10 (p->Leave[1]-'3');
tempminu=(p->Leave[3]-'5')*10 (p->Leave[4]-'9');
tempsec=(p->Leave[6]-'5')*10 (p->Leave[7]-'9');
if(temphour>maxhour)
{
maxhour=temphour;
maxminute=tempminu;
maxsecond=tempsec;
late=i;
}
else if(temphour==maxhour&&tempminu>maxminute)
{
maxminute=tempminu;
maxsecond=tempsec;
late=i;
}
else if(temphour==maxhour&&tempminu==maxminute&&tempsec>maxsecond)
{
maxsecond=tempsec;
late=i;
}
}
return result late;
}

查看积分策略说明 附件 2006-11-27 14:13 clip_imag2.jpg (40.7 KB)

2006-11-27 14:13 hh.jpg (51.22 KB)



---------------------------------
由MIPS指令想到数组与指针
对程序员来说,最重要的莫过于掌握指针的用法了。

先来看下面两个程序:

程序1 程序2

clear1(int array[], int size) clear2(int *array[0]; int size)

{ {

int i; int *p;

for (i=0;i<size;i=i 1) for(p=&array[0];p<&array[size];p=p 1)

array=0; *p=0;

} }

 

先分析程序1,根据我们的约定,一般用$4,$5,$6,$7来保存子程序的参数。所以我们假设两个参数array和size被保存在寄存器$4,$5中,i被保存在寄存器$2中。

1. 初始化i,for 循环的第一部分

move $2,$0 # i=0 (register $0=0)

2. 为将array赋为0,我们要做三步工作

loop1 muli $14,$2,4 # $14=i*4

add $3,#4,$14 # $3=address of array

sw $0,0($3) # array=0

3. 将i自加1,即i=i 1;

addi $2,$2,1 # i=i 1

4. 程序判断i是否还是小于size,如果是的话,再开始下一轮循环。

slt $6,$2,$5

bne $6,$0,loop1

总结如下:

move $2,$0 # i=0

loop1 : muli $14,$2,4 # $14=i*4

add $3,$4,$14 # $3=address of array

sw $0,0($3) # array=0

addi $2,$2,1 # i=i 1

slt $6,$2,$5 # $6=1(i<size)

bne $6,$0,loop1 # if(i<size) go to loop1

 

分析程序2:

第一步也是用$4,$5保存两个参数array 和size,把p分派到寄存器$2中。

1. 将指针p指向数组的第一个元素array[0]

move $2,$4 # p=address of array[0]

2. 将指针p赋为0

loop2 sw $0,0($2) # Memory[0]=0

3. 将指针指向下一个字

addi $2,$2,4 # p=p 4

4. 得到数组的最后一个元素array[size]的地址值:

muli $14,$5,4 # $14=size*4

add $3,$4,$14 # $3=address of array[size]

5. 判断并跳转

slt $6,$2,$3 # $6=(p<array[size])

bne $6,$0,loop2 # if(p<array[size]) go to loop2

总结如下:

move $2,$4 # p=address of array[0]

loop2 : sw $0,0($2) # Memory[p]=0

addi $2,$2,4 # p=p 4

muli $14,$5,4 # $14=size*4

add $3,$4,$14 # $3=address of array[size]

slt $6,$2,$3 # $6=(p<array[size])

bne $6,$0,loop2 # if (p<array[size]) go to loop2

我们注意到在每一个循环中,数组的末地址是不变的,所以程序二又可以写成下面的代码:

move $2,$4 # p=address of array[0]

muli $14,$5,4 # $14=size*4

add $3,$4,$14 # $3=address of array[size]

loop2: sw $0,0($2) # Memory[p]=0

addi $2,$2,4 # p=p 4

slt $6,$2,$3 # $6=(p<array[size])

bne $6,$0,loop2 # if (p<array[size]) go to loop2

让我们来比较两个程序的代码:



move $2,$0 move $2,$4

loop1: muli $14,$2,4 muli $14,$5,4

add $3,$4,$14 add $3,$4,$14

addi $2,$2,1 loop2: sw $0,0($2)

sw $0,0($3) addi $2,$2,4

slt $6,$2,$5 slt $6,$2,$3

bne $6,$0,loop1 bne $6,$0,loop2

现在我们从对两个程序的分析中,发现指针给我们的程序运行带来的不可多得的优化,使程序的循环变得更为简洁,所以在一般的现代的编译器中会将程序1优化成程序2。

---------------------------------
从MIPS指令角度看计算机对子程序的支持
程序是程序员实现程序结构化的一条有效途径。

首先让我们来看看支持子程序过程调用的最基本的操作:MIPS提供了一条指令jal(jump and link),它的功能是把紧位于jal下的指令地址保存到寄存器$31中,然后跳转到子程序,即跳转和链接。这时$31=PC 4, PC是指令jal的地址。

比如: jal Procedure Address

我们已经有一条指令jr(jump register)用于链接的.可以用它来执行跳回操作。

比如: jr $31

这也正是寄存器$31的通常用途所在。对于参数的保存,有两种方法:调用者保存和被调用者保存。现在约定:通常采用被调用者保存,并且$4,$5,$6,$7是专门用以保存参数的。

下面我们举例来说明:

假设程序A调用B,B又调用C,C不调用任何其他程序。在调用C之前,程序B必须将它自己的返回地址存储在寄存器$31中,并且把堆栈指针指向堆栈的新顶端。因此,C被调用,并且指令

jal 将寄存器$31改变为存储C的返回地址。在程序C返回到程序B之后,这个旧的返回值从寄存器$31中被重新存储,并且堆栈指针

还原。

根据上面的分析,我们可以写出该程序的主体代码:

(我们假定寄存器$29保有堆栈指针,并且$24指向当前堆栈的顶端)

A: ...

...

jal B # call B and save return address in $31

B: ...

... # now ready to call C

add $29,$29,$24 # adjust stack to make room for next item

sw $31,0($29) # save the return address

jal C # call C and save return address in $31

# return from C to next instruction

lw $31,0($29) # restore B's return address...

sub $29,$29,$24 # adjust stack to pop B's return address

...

...

jr $31 # return to routine that called B

C: ...

...

jr $31 # return to routine that called C

---------------------------------
最大连续子序列 (13分)
题目要求:
给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni 1, ...,
Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,
例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和
为20。
在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该
子序列的第一个和最后一个元素。
具体的输入输出格式规定如下:
输入格式:测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( < 50
),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。
输出格式:对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元
素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样
例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素


输入样例:

6
-2 11 -4 13 -5 -2
10
-10 1 2 3 4 -5 -23 3 7 -21
6
5 -8 3 2 5 0
1
10
3
-1 -5 -2
3
-1 0 -2
0

输出样例:

20 11 13
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0





要求:

完整的输入输出,以及异常处理




一些异常处理




源代码如下:

/* zju.h



Copyright (c) 2002, 2006 by ctu_85

All Rights Reserved.

*/
#include "stdio.h"

#include "string.h"

#include "malloc.h"

#define maxnum 50

#define lowest -65536

struct List

{

int num;

int maxhead;

int maxend;

int max;

int allneg;

int data[maxnum];

struct List *next;

};

struct List *Create();

int Print(struct List *);

int Sort(struct List *);

int main()

{

int i;

struct List *head;

head=Create();

Sort(head);

Print(head);

return 1;

}

struct List *Create()

{

struct List *head,*pre,*p;

int i=0,j,num,base=1,temp=0,headstatus=0,negtive,t;

char c;

do

{

printf("Please input the number of the array:\n");

scanf("%d",&num);

if(num!=0)

{

p=(struct List *)malloc(sizeof(struct List));

p->maxhead=0;

p->maxend=0;

p->max=lowest;

p->allneg=0;

if(headstatus==0)

{

head=p;

pre=p;

p->num=num;

i=0;

temp=0;

base=1;

negtive=0;

putchar(getchar());

while((c=getchar())!='\n')

if(c==' ')

{

t=temp*((-2)*negtive 1);

p->data=t;

if(t>=0)

p->allneg=1;

i ;

temp=0;

base=1;

negtive=0;

}

else

{

if(c!='-')

{

temp*=base;

temp =c-'0';

base*=10;

}

else

negtive=1;

}

t=temp*((-2)*negtive 1);

p->data=t;

if(t>=0)

p->allneg=1;

headstatus ;

}

else

{

pre->next=p;

p->num=num;

i=0;

temp=0;

base=1;

negtive=0;

putchar(getchar());

while((c=getchar())!='\n')

if(c==' ')

{

t=temp*((-2)*negtive 1);

p->data=t;

if(t>=0)

p->allneg=1;

i ;

temp=0;

base=1;

negtive=0;

}

else

{

if(c!='-')

{

temp*=base;

temp =c-'0';

base*=10;

}

else

negtive=1;

}

t=temp*((-2)*negtive 1);

p->data=t;

if(t>=0)

p->allneg=1;

headstatus ;

pre=pre->next;

}

}

}

while(num!=0);

p->next=NULL;

return head;

}

int Sort(struct List *t)

{

int max,i,j,temp,head,end;

while(t!=NULL)

{

head=0;

end=0;

max=lowest;

for(i=0;i<t->num;i )

{

temp=0;

for(j=i;j<t->num;j )

{

temp =t->data[j];

if(temp>max)

{

max=temp;

head=i;

end=j;

}

}

}

t->maxhead=head;

t->maxend=end;

t->max=max;

t=t->next;

}

return 1;

}

int Print(struct List *t)

{

int i,j,k;

if(t==NULL)

{

printf("Empty input!");

return 0;

}

else

{

while(t!=NULL)

{

i=t->maxhead;

j=t->maxend;

k=t->num;

if(t->max>0)

{

printf("result:%d,%d,%d",t->max,t->data,t->data[j]);

printf("\n");

t=t->next;

}

else

{

if(t->allneg==0)

{

printf("result:%d,%d,%d",0,t->data[0],t->data[k-1]);

printf("\n");

t=t->next;

}

else

{

printf("result:%d,%d,%d",0,0,0);

printf("\n");

t=t->next;

}

}

}

return 1;

}

}

查看积分策略说明 附件 2006-11-27 14:14 41huyyaiuiuiuabhuyysad83yasd2e3uf.jpg (29.15 KB)

2006-11-27 14:14 42adsyyyvuqw87isio8w3i878320965536jdf.jpg (29.17 KB)



---------------------------------
分数统计 (12分)
题目要求:
今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑
每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的
考生,并将他们的成绩按降序打印。
具体的输入输出格式规定如下:
输入格式:测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N
< 1000 )、考题数M ( 0 < M < = 10
)、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一
名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号
(题目号由1到M)。
当读入的考生人数为0时,输入结束,该场考试不予处理。
输出格式:对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高
到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考
号的升序输出。
要求:

完整的输入输出输入样例:











输出样例:


























源代码如下:

/* zju.h

Copyright (c) 2002, 2006 by ctu_85
All Rights Reserved.
*/ #include "stdio.h"
#include "string.h"
#include "malloc.h"
#define maxquestionnum 10
#define maxidnum 20
#define bufsize 32
#define maxparti 1000
struct Examination *CreateExam(int,Examination*,Examination*);
struct Participator *CreateParticipator(int,int);
int Calculate(int,int,Participator *,int [maxquestionnum]);
int Judge(int,int,Participator *,Examination *);
int Sort(Participator *,int);
int Print(Examination *p,int);
struct Examination
{
int participatenum;
int questionnum;
int passline;
int passnum;
int mark[maxquestionnum];
struct Examination *next;
struct Participator *work;
};
struct Participator
{
char id[maxidnum 1];
int status[maxquestionnum 1];
int score;
int pass;
int priority;
int isprint;
struct Participator *next;
};
int main()
{
int i=0;
struct Examination *examhead,*p;
struct Participator *parti;
printf("\nNow please enter the information,end with 0 paticipator of exam:\n");
examhead=CreateExam(0,p,examhead);
if(!examhead)
printf("There is no examination today\n");
else
do
{
printf("The %dth exam:",i 1);
Print(examhead,examhead->passnum);
i ;
examhead=examhead->next;
}
while (examhead);
return 1;
}
struct Examination *CreateExam(int headstatus,Examination * pre,Examination *head) /* Record the details of each examination*/ {
int x,tag=0,count=0,base=1,k,status=1,score=0,tmp;
char buf[bufsize],*c;
struct Examination *exam=(struct Examination*)(malloc(sizeof(Examination)));
if(headstatus==0)
{
pre=exam;
head=exam;
}
else
pre->next=exam;
printf("Please enter the %dth examination:\n",headstatus 1);
c=gets(buf);
if(*buf!='0')
{
for(x=0;x<maxquestionnum;x )
exam->mark[x]=0;/* Initializing */ exam->participatenum=0;
exam->questionnum=0;
exam->passline=0;
exam->next=NULL;
exam->work=NULL;
exam->passnum=0;
for(tag=0;*c!='\0';c ,tag )
{
if(*c==' ')
{
if(status==1)
{
tmp=tag-1;
for(k=count-1;k>=0;k--,tmp--)
{
exam->participatenum =base*(buf[tmp]-'0');
base*=10;
}
}
else
if(status==2)
{
tmp=tag-1;
for(k=count-1;k>=0;k--,tmp--)
{
exam->questionnum =base*(buf[tmp]-'0');
base*=10;
}
}
base=1;
status ;
count=0;
}
else
count ;
}
if(*c=='\0')
if(status==3)
{
tmp=tag-1;
for(k=count-1;k>=0;k--,tmp--)
{
exam->passline =base*(buf[tmp]-'0');
base*=10;
}
}
base=1;
count=0;
printf("Please enter the marks of each problem:\n");
c=gets(buf);
for(tag=0;*c!='\0';c ,tag )
if(*c==' ')
{
tmp=tag-1;
for(k=count-1;k>=0;k--,tmp--)
{
exam->mark[score] =base*(buf[tmp]-'0');
base*=10;
}
base=1;
score ;
count=0;
}
else
count ;
if(*c=='\0')
{
tmp=tag-1;
for(k=count-1;k>=0;k--,tmp--)
{
exam->mark[score] =base*(buf[tmp]-'0');
base*=10;
}
}
exam->work=CreateParticipator(exam->participatenum,exam->questionnum);
Calculate(exam->participatenum,exam->questionnum,exam->work,exam->mark);
Judge(exam->participatenum,exam->passline,exam->work,exam);
Sort(exam->work,exam->participatenum);
headstatus ;
CreateExam(headstatus,exam,head);
}
else
{
if(headstatus!=0)
pre->next=NULL;
else
head=NULL;
return head;
}
}
struct Participator *CreateParticipator(int i,int j)
{
Participator *p,*pre,*head;
int m,n=0,count=0,tag,x,tmp,k,status=1,base=1;
int headstat=0;
char buf[bufsize],*c;
for(m=0;m<i;m )
{
p=(struct Participator*)(malloc(sizeof(struct Participator)));
if(headstat==0)
{
head=p;
headstat ;
pre=p;
}
else
{
pre->next=p;
pre=pre->next;
}
printf("Please enter the %dth participator's info:\n",m 1);
for(j=0;j<maxquestionnum 1;j )/* Initializing */ p->status[j]=0;
p->pass=0;
p->score=0;
p->priority=maxparti 1;
p->isprint=0;
c=gets(buf);
for(tag=0;*c!='\0';c ,tag )
{
if(*c==' ')
{
if(status==1)
{
tmp=tag-1;
for(k=count-1;k>=0;k--,tmp--)
p->id[k]=buf[tmp];
p->id[count]='\0';
}
else if(status>2)
{
tmp=tag-1;
for(k=count-1;k>=0;k--,tmp--)
{
n =base*(buf[tmp]-'0');
base*=10;
}
p->status[n]=1;
}
base=1;
n=0;
status ;
count=0;
}
else
count ;
}
if(*c=='\0'&&status>2)
{
tmp=tag-1;
for(k=count-1;k>=0;k--,tmp--)
{
n =base*(buf[tmp]-'0');
base*=10;
}
p->status[n]=1;
}
base=1;
count=0;
n=0;
status=1;
}
p->next=NULL;
return head;
}
int Calculate(int pepl,int que,Participator *p,int mark[maxquestionnum]) /*To examinate the details of each person*/ {
int i,j,temp=0;
for(i=0;i<pepl;i ,p=p->next)
{
for(j=1;j<=que;j )
if(p->status[j]==1)
temp =mark[j-1];
p->score=temp;
temp=0;
}
return 1;
}
int Judge(int pepl,int pass,Participator *p,Examination *ep)
{
int i;
for(i=0;i<pepl;i ,p=p->next)
{
if(p->score>=pass)
{
p->pass=1;
(ep->passnum) ;
}
else
p->pass=0;
}
return 1;
}
int Sort(Participator *p,int num)
{
int i,j,max=-1,prio=0;
Participator *temp,*t1;
for(i=0;i<num;i )
{
temp=p;
t1=p;
for(j=0;j<num;j ,temp=temp->next) /* Find the max score which is unidentified*/ if(temp->pass==1&&temp->score>=max&&temp->isprint==0)
{
max=temp->score;
t1=temp;
}
temp=p;
for(j=0;j<num;j ,temp=temp->next) /* Find the engager who has the smallest index*/ if(temp->score==max&&temp->isprint==0)
if(strcmp(temp->id,t1->id)<0)
t1=temp;
if(t1->pass==1&&t1->isprint==0)
{
t1->priority=prio;
t1->isprint=1;
prio ;
}
max=-1;
}
return 1;
}
int Print(Examination *p,int num)
{
Participator *head,*temp;
int i,j;
head=p->work;
printf("%dhave(has) passed\n",num);
for(i=0;i<num;i )
{
temp=head;
for(j=0;temp!=NULL;j ,temp=temp->next)
if(temp->priority==i)
{
printf("%s %d\n",temp->id,temp->score);
break;
}
}
return 1;
}

查看积分策略说明 附件 2006-11-27 14:15 1.jpg (46.16 KB)

2006-11-27 14:15 2.jpg (38.42 KB)



---------------------------------
是那年的,06的吗?>!?!

相关话题/

  • 领限时大额优惠券,享本站正版考研考试资料!
    大额优惠券
    优惠券领取后72小时内有效,10万种最新考研考试考证类电子打印资料任你选。涵盖全国500余所院校考研专业课、200多种职业资格考试、1100多种经典教材,产品类型包含电子书、题库、全套资料以及视频,无论您是考研复习、考证刷题,还是考前冲刺等,不同类型的产品可满足您学习上的不同需求。 ...
    本站小编 Free壹佰分学习网 2022-09-19