当前位置:首页 > 全国计算机等级考试二级C语言资料(机试) - 图文
fun (a,3);
printf(\ for(i=0;i for ( j=0; j printf( \ printf(\ } } 【参考答案】 void fun ( int a[][N], int n ) { int i, j ; for(i=0 ; i for(j=0 ; j<=i ; j++) a[i][j]=a[i][j]*n ; } 【解题思路】针对二维数组元素a[i][j],如果i>=j,也即行号大于等于列号时,是对角线下半三角的元素,相反i<=j,也即行号小于等于列号时,是对角线上半三角的元素,而i==j,即行号等于列号时,正好是对角线上的元素。 ? 题型三:二维数组转一维数组 3、请编写函数fun, 函数的功能是: 将M行N列的二维数组中的数据,按行的顺序依次放到一维数组中, 一维数组中数据的个数存放在形参n所指的存储单元中。 例如, 二维数组中的数据为: 33 33 33 33 44 44 44 44 55 55 55 55 则一维数组中的内容应是: 33 33 33 33 44 44 44 44 55 55 55 55。 #include void fun(int (*s)[10], int *b, int *n, int mm, int nn) 第 21 页 { } main() { int w[10][10] = {{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j ; int a[100] = {0}, n = 0 ;void printf(\ for(i = 0 ; i < 3 ; i++) { for(j = 0 ; j < 4 ; j++) printf(\ printf(\ } fun(w, a, &n, 3, 4) ; printf(\ for(i = 0 ; i < n ; i++) printf(\} 【参考答案】 void fun (int (*s)[10], int *b, int *n, int mm, int nn) { int i,j,k=0; for(i=0;i b中*/ for(j=0;j *n=k; /*通过指针返回元素个数*/ } 【解题思路】我们可以用两个循环来处理问题,由于是按行的顺序取出,所以第1个循环用于控制行下标,第2个循环用于控制列下标; 若改成按列的顺序取出,则循环应改成: for(i=0;i 注意s[j][i]的下标,不能用s[i][j]。 ? 题型四:二维数组转置问题(即行列互换) 4、请编写函数fun, 函数的功能是:实现B=A+A', 即把矩阵A加上A的转置, 共 30 页 存放在矩阵B中。计算结果在 main 函数中输出。例如,输入下面的矩阵: 【解题思路】行列数相等的二维数组的转置就是行列互换,即转置后的第i行第j其转置矩阵为: 1 2 3 1 4 7 4 5 6 2 5 8 7 8 9 3 6 9 程序输出: 2 6 10 6 10 14 10 14 18 #include int i, j ; void fun(a, t) ; for (i = 0 ; i < 3 ; i++) { for (j = 0 ; j < 3 ; j++) printf(\ printf(\ } } 【参考答案】 void fun (int a[3][3], int b[3][3]) { int i,j; for(i=0;i<3;i++) for(j=0;j<3;j++) b[i][j]=a[i][j]+a[j][i]; /*把矩阵a加上a的转置,存放在矩阵b中*/ } 第 22 页 列正好对应原矩阵的第j行第i列。 (1)若要将矩阵a转置后还存入a中,可用程序: int i,j,t; for(i=0;i 共 30 页 } 【参考答案】 long fun(char *p) { long n=0; int flag=1; if(*p=='-') /*负数时置flag为-1*/ {p++;flag= -1;} else if(*p=='+') /*正数时置flag为1*/ p++; while(*p!='\\0') { n=n*10+*p-'0';/*将字符串转成相应的整数*/ p++; } return n*flag; } 【解题思路】if( )的作用是判断它应该是正数还是负数,变量t为1或-1作为符号标示。while( )循环的作用是将字符串转成相应的整数。 注意: p[i]的值是一个字符(如'9'、'4'),并不是一个数,要将其转成相应的数字必须令其减去'0'(不是'\\0'),即*p-'0' 就得到*p这个字符的相应数字,如'0'-'0'=0、'8'-'0'=8等。 ? 题型二:“回文”字符串 2、请编写函数fun, 函数的功能是: 判断字符串是否为回文?若是, 函数返回1,主函数中输出: YES, 否则返回0, 主函数中输出NO。回文是指顺读和倒读都一样的字符串。 例如, 字符串LEVEL是回文, 而字符串123312就不是回文。 #include { char s[N] ;void printf(\ printf(\ if(fun(s)) printf(\ else printf(\} 【参考答案】 int fun(char *str) { int i,n=0,fg=1; char *p=str; n=strlen(str); for(i=0;i return fg; } ? 题型三:字符串统计问题 3、请编写一个函数 void fun(char *tt, int pp[]),统计在tt所指字符串中'a' 到 'z' 26个小写字母各自出现的次数,并依次放在pp所指数组中。 例如,当输入字符串:abcdefgabcdeabc 后,程序的输出结果应该是: 3 3 3 2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 #include void fun(char *tt, int pp[]) { } main( ) { char aa[1000] ; 共 30 页 int bb[26], k ; void printf( \ fun(aa, bb ) ; for ( k = 0 ; k < 26 ; k++ ) printf (\ printf( \} 【参考答案】 void fun(char *tt, int pp[]) { int i; for(i=0;i<26;i++) pp[i]=0; /*初始化pp所指数组,使其所有值均为0*/ for(i=0;tt[i];i++) /*控制条件也可是tt[i]!=‘\\0’或tt[i]!=0 */ pp[tt[i]-‘a’]++; /*tt[i]-‘a’ 的值,即为字符tt[i]的个数存放在pp所指数组中对应的下标*/ } 【解题思路】26个字母的个数在pp所指数组中为0-25,其中数组下标可以通过某一个字符的ASCII值减去97或直接减'a'也可以,就可以得出该字符出现次数存放的位置。例如:字符为b,那么位置为'b'-'a'=1,就是实际存放的位置。 另附统计子字符串的个数 如:编写一个函数,该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数。 例如,假定输入的字符串为:asd asasdfg asd as zx67 asd mklo,子字符串为as,则应输出6。 #include int fun(char *str,char *substr) { } main() { char str[81],substr[3]; int n; 第 24 页 printf(\输入主字符串: \ gets(str); printf(\输入子字符串: \ gets(substr); puts(str); puts(substr); n=fun(str,substr); printf(\} 【参考答案】 int fun(char *str,char *substr) { int n; char *p , *r; n=0; while ( *str ) { p=str; r=substr; while(*r) if(*r==*p) { r++; p++; } else break; if(*r=='\\0') n++; str++; } return n; 共 30 页
共分享92篇相关文档