浙江大学计算机复试上机2005-2007
(由林子整理  )
2005年浙江大学计算机学院考研复试上机试题及参考答案(1/5) 
第一题:A+B(10分) [结题]
题目要求:读入两个小于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 =
输出样例:
3
90
96
#include <>
#include <>
#include <>
#include <>
int main(void)
{
 const char data[12][6] = {"zero", "one", "two",  "three", "four",
  "five", "six", "seven", "eight", "nine",  "+", "="};
 unsigned a, b; /* 转换后的表达式参数,如a+b(123+456) */
 unsigned i, j, k; /* 临时变量,作为下标    */
 char str[100]; /* 输入字符串,足够大容量   */
 char temp[6];  /* 临时字符串,用于检索数字,如"one"->'1' */
 char result[30]; /* 转换后的表达式参数,如"123+456="  */
 do{
  a = b = i = j = k = 0; /* 初始化变量 */
  memset(str, 0, sizeof(str));
  memset(temp, 0, sizeof(temp));
  memset(result, 0, sizeof(result));
  gets(str); /* 获取输入字符串,不能使用scanf,因为有空格 */
  for(i=0, k=0; i<strlen(str); ++i)
  {
   for(j=0;!isspace(str[i])&&i<strlen(str);++i,++j) /* 提取一个单词 */
    temp[j] = str[i];
   temp[j] = 0; /* 字符串结束标记 */
   for(j=0; j<12; j++) /* 把这个单词转换为数字 */
    if(strcmp(temp, data[j]) == 0)
    {
     if( j <= 9  ) result[k++] = j + '0';
     if( j == 10 ) result[k++] = '+';
     if( j == 11 ) result[k++] = '=';
     break; /* 到匹配数字就不必再搜索了 */
    }
  }
  result[k] = 0; /* 字符串结束标记,result形式"123+456=" */
  sscanf(result,"%d+%d=",&a,&b);  /* 用sscanf来获得a,b的值 */
  if( a==0 && b==0 ) break;   /* A,B同时为零则退出程序printf直接输出数字 */
  else printf("%d\n", a + b);  /* 打印输出 A + B 的数值 */
 }while(1);
 return 0;
}
2005年浙江大学计算机学院考研复试上机试题及参考答案(2/5) 
第二题:谁是开门关门的人?(10分)
题目要求:每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签到、签离记录,请根据记录出当天开门和关门的人。