【真题1】 给定程序的功能是对指定字符在字符串a 中出现的次数进行统计,统计 的数据存到b 数组中。其中:字符'Z'出现的次数存放到b[0]中,字符'Y'出现的次数 存放到b[1]中,字符'X'出现的次数存放到b[2]中,字符'W'出现的次数存放到b[3] 中,字符'V'出现的次数存放到b[4]中,其它字符出现的次数存放到b[5]中。 例如,当a 中的字符串为"AYYZXW1Y+ZWVP",调用该函数后,b 中存放数据应 是:2、3、1、2、1、4。 #include < stdio.h >#include < string.h >void fun(char *a, int b[]) { int i; for (i=0; i< 6; i++) b[i] = 0; /**************found**************/ for (i=0; i< ___1___(a); i++) if (a[i] >= 'V' && a[i] < = 'Z') b[4-(a[i]-'V')]++; /**************found**************/ ___2___ b[5]++; } main() { int i, b[6]; char a[100] = "AYYZXW1Y+ZWVP"; /**************found**************/ fun(___3___); printf("The result is: "); for (i=0; i< 6; i++) printf("%d ", b[i]); printf("\n"); } (2011年2月) 解析: 本题的考核点是对指定字符在字符串中出现的次数进行统计。 提示思路:本题先对数组b初始化,通过for循环,将字符串在'V'~'Z'之间的 字符用b[4-(a[i]-'V')]++运算进行累加,其它字符出现的次数存放到b[5] 中。 答案:【1】strlen 【2】else 【3】a,b 【真题2】 给定程序modi.c 中函数fun的功能是:对N 名学生的学习成绩,按从 高到低的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的 连续存储区中,此存储区的首地址作为函数值返回。 请改正函数fun 中指定部位的错误,使它能得出正确的结果。 注意:不要改动main 函数, #include < stdio.h >#include < alloc.h >#include < string.h >#include < conio.h >#define N 10 typedef struct ss { char num[10]; int s; } STU; STU *fun(STU a[], int m) { STU b[N], *t; int i,j,k; /**********found**********/ *t=calloc(sizeof(STU),m); for(i=0; i< N; i++) b[i]=a[i]; for(k=0; k< m; k++) { for(i=j=0; i< N; i++) if(b[i].s > b[j].s) j=i; /**********found**********/ t[k].num=b[j].num; t[k].s=b[j].s; b[j].s=0; } return t; } outresult(STU a[], FILE *pf) { int i; for(i=0; i< N; i++) fprintf(pf,"No = %s Mark = %d\n", a[i].num,a[i].s); fprintf(pf,"\n\n"); } main() { STU a[N]={ {"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77}, {"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71} }; STU *pOrder; int i, m; clrscr(); printf("***** The Original data *****\n"); outresult(a, stdout); printf("\nGive the number of the students who have better score: "); scanf("%d",&m); while( m >10 ) { printf("\nGive the number of the students who have better score: "); scanf("%d",&m); } pOrder=fun(a,m); printf("***** THE RESULT *****\n"); printf("The top :\n"); for(i=0; i< m; i++) printf(" %s %d\n",pOrder[i].num , pOrder[i].s); free(pOrder); } (2011年2月) 解析: 本题的考核点是按学习成绩找出前m名学生。 提示思路: 1、首先开辟存储空间存放m名学生的信息; 2、通过循环,计算出前m 名学生的成绩,并将这些学生的数据放入动态分配 的存储区中。 程序中的第一个错误:malloc(size)在内存的动态存储区中分配一个长度为 size的连续空间。此函数的值是一个指针,它的值是该分配域的起始地址。 calloc(n,size)在内存的动态区存储中分配n 个长度为size的连续空间。函数 返回分配域的起始地址。 程序中的第二个错误:C 语言中不能整体给字符数组赋值。 【真题3】 请编写函数fun,函数的功能是:将M 行N 列的二维数组中的字符数据 按列的顺序依次放到一个字符串中。 例如,二维数组中的数据为: W W W W S S S S H H H H 则字符串中的内容应是:WSHWSHWSH。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编 写的若干语句。 #include < stdio.h >#define M 3 #define N 4 void fun(char (*s)[N], char *b) {……} main() { char a[100],w[M][N]={{'W','W','W','W'},{'S','S','S','S'},{'H','H','H','H'}}; int i,j; printf("The matrix:\n"); for(i=0; i< M; i++) { for(j=0;j< N; j++)printf("%3c",w[i][j]); printf("\n"); } fun(w,a); printf("The A string:\n");puts(a); printf("\n\n"); } (2011年2月) 解析: 本题的考核点是二维数组按行转换为一维数组的算法。 解题思路:本题提供的参考程序先通过一个for 语句开辟一个100 个字节的存 储空间,初值均为0,然后再利用内、外两层for循环,按列的顺序将第1到3 行的数据依次存放到一个字符串中,即实现了将M行N 列的二维数组中的字符 数据按列的顺序依次放到一个字符串中。 void fun(char (*s)[N], char *b) {int x,y; /*定义两个整型变量*/ for(x=0;x< 100;x++) /*通过for循环开辟一个100 个字节的存储空间,并 将其中各元素的初值赋为0*/ *(b+x)=0; for(x=0;x< N;x++) /*利用内、外两层for循环,按列的顺序将第1 到3行 的数据依次存放到一个字符串中*/ for(y=0;y< M;y++) b[x*M+y]=*(s[y]+x); } |