Free考研资料 - 免费考研论坛

 找回密码
 注册
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
地理初学者 发表于 06-11-27 14:12:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题目要求:
读入两个小于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;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
沙发
 楼主| 地理初学者 发表于 06-11-27 14:13:23 | 只看该作者
谁是开门关门的人?(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;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
板凳
 楼主| 地理初学者 发表于 06-11-27 14:13:36 | 只看该作者
由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。
地板
 楼主| 地理初学者 发表于 06-11-27 14:13:51 | 只看该作者
从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
5#
 楼主| 地理初学者 发表于 06-11-27 14:14:28 | 只看该作者
最大连续子序列 (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;

}

}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
6#
 楼主| 地理初学者 发表于 06-11-27 14:15:06 | 只看该作者
分数统计 (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;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
7#
zubus 发表于 07-3-30 14:25:48 | 只看该作者
是那年的,06的吗?>!?!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系我们|Free考研资料 ( 苏ICP备05011575号 )

GMT+8, 24-11-27 05:34 , Processed in 0.192145 second(s), 10 queries , Gzip On, Xcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表