原文内容来自免费考研论坛,请点击查看全文
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的吗?>!?!