8.2 阅读程序,指出程序的输出结果。
(1) #include <stdio.h >void main(){ char *p ="Student ";void prn_str(char *, int, int);prn_str(p, 6, 4);}void prn_str(char *str, int m, int n){ int i;for (i =1; i <=m -n; i ++)printf(" ");for (i =1; i <=n; i ++)printf("%c ", *str ++);printf("\n ");}(2) #include <stdio.h >void main(){ int a[3][4]={1, 2, 3, 4, 3, 4, 5, 6, 5, 6, 7, 8};int i, j, *p =*a;for (i =0; i <3; i ++) { for (j =0; j <4; j ++) printf("%3d ", *p ++); printf("\n ");}}(2) #include <stdio.h >void main() { char a[]="Chang "; char *p =a; while (*p) printf("%s\n ", p ++);}8.3 程序填空。
(1) 以下函数用于求出一个3⨯4矩阵中的最大元素值。
#include <stdio.h >int maxvalue(int (*p)[4]){ int i, j, max;max =①;for (i =0; ②; i ++){ for (j =0; ③; j ++)if (④>max) max =⑤;p ++;}return max;}void main(){ int arr[3][4]={4, 2, 7, 2, 9, 1, -4, 24, 5, 0, 12, 16};int max;max=maxvalue(⑥);printf("Max=%d\n", max);}(2) 下面函数用于计算子串substr在母串str中第一次出现的位置,如果母串中不包含子串,则返回0值。
如:at("ver", "university")返回的值为4,at("ty", "string")返回的值为0。
int at(char *substr, char *str){ int i, j, post;for (post=0; str[post]!=①; post++){ i=0; j=②;{ i++;j++;}if (substr[i]=='\0')return ③;}return ④;}8.4 编写程序(下面程序均要求用指针方法处理)。
(1) 对一个3⨯4矩阵,分别求出它的所有元素中的最大值和最小值所在的行号及列号(假设最大值和最小值都是唯一的)。
#include <stdio.h>void main(){int a[3][4]={2,3,4,12,-5,34,78,-23,65,112,-7,-208};int i,j,max,min,minm,minn,maxm,maxn,(*p)[4]=a;//p保存行号,q保存列号minm=minn=maxm=maxn=0;max=min=*(*p);for(i=0;i<3;i++)for(j=0;j<4;j++){if(*(*(p+i)+j)>max){max=*(*(p+i)+j);maxm=i;maxn=j;}else if(*(*(p+i)+j)<min){min=*(*(p+i)+j);minm=i;minn=j;}}printf("the max number at %d hang %d lie\n",maxm,maxn);printf("the min number at %d hang %d lie\n",minm,minn); }(2) 对一个3 4矩阵分别进行横向和纵向汇总。
#include <stdio.h>void main(){int a[3][4]={2,3,4,12,-5,34,78,-23,65,112,-7,-208};int i,j,hangsum,liesum,(*p)[4]=a;hangsum=0;liesum=0;for(i=0;i<3;i++){for(j=0;j<4;j++){hangsum=hangsum+*(*p+j);printf("%3d ",hangsum);}p++;}printf("hang sum:%3d ",hangsum);printf("\n");p=a;for(j=0;j<4;j++){for(i=0;i<3;i++){liesum=liesum+*(*(p+i)+j);printf("%3d ",liesum);}}printf("lie sum:%3d ",liesum);}(3) 编写一个函数str_cat,实现函数strcat的功能。
#include <stdio.h>char *str_cat(char *str1,char *str2){char *temp = str1;while(*str1!='\0'){str1++;}while(*str2!='\0'){*str1 = *str2;str1++;str2++;}*str1 = '\0';return temp;}void main(){char a[20] = "Good ";char b[20] = "afternoon!";printf("%s",str_cat(a,b));}(4) 有一个班5个学生,4门课。
要求编写四个函数分别实现以下四个要求。
①找出有2门及2门以上课程不及格的所有学生,输出他们的学号;#include <stdio.h>void Fail_Stu(int a[5][5]){int i,j,k,(*p)[5]=a;for(i=0;i<5;i++){k=0;for(j=1;j<5;j++)if (*(*(p+i)+j)<60) k++;if (k>=2) printf("%d ",*(*(a+i)+0));}}②求第1门课的全班平均分,并将该平均分返回主函数中输出;float Average(int (*a)[5]){int i;float ave=0.0;for(i=0;i<5;i++)ave+=*(*(a+i)+1);ave=ave/5;return ave;}③找出4门课程平均成绩在90分以上(含90分)或全部课程成绩都在85分以上(含85分)的所有学生,输出他们的学号及全部课程成绩和平均成绩;void Good_Ave(int (*a)[5]){int i,j,count;float ave=0.0;for(i=0;i<5;i++){count=0;ave=0;for(j=1;j<5;j++){ave+=*(*(a+i)+j);if (*(*(a+i)+j)>=85) count++;}ave=ave/4;if (ave>=90.0 || count==4){for(j=0;j<5;j++){printf("%d ",*(*(a+i)+j));}printf("The average score is:%f\n",ave);}}}④将所有学生按成绩排序,排序后再输出所有学生各门课程的成绩表。
排序的原则是:先按第一门课程成绩排序,第一门课程成绩高的排在前面,成绩低的排在后面;如果第一门课程的成绩相同,则再比较第二门课程的成绩,第二门课程成绩高的排在前面,成绩低的排在后面;如果第一门课程及第二门课程的成绩均相同,则学号在前的排在前面,学号在后的排在后面。
#include <stdio.h>#include <string.h>void SortStu(int (*p[])[5]){int (*t)[5],post;int i,j;for (i=0; i<4; i++){//把学号按照从小到大排好序post=i;for (j=i+1; j<5; j++)if (*(*p[j]+0)<*(*p[post]+0)) post=j;if (post!=i){t=p[i];p[i]=p[post];p[post]=t;}}for (i=0; i<4; i++){//把第二门成绩按照从大到小排好序post=i;for (j=i+1; j<5; j++)if ( *(*p[j]+2)>*(*p[post]+2) ) post=j;if (post!=i){t=p[i];p[i]=p[post];p[post]=t;}}for (i=0; i<4; i++){//把第一门成绩按照从大到小排好序post=i;for (j=i+1; j<5; j++)if ( *(*p[j]+1)>*(*p[post]+1) ) post=j;if (post!=i){t=p[i];p[i]=p[post];p[post]=t;}}}void main(){int i,j;int (*p[5])[5];inta[5][5]={{101,98,76,77,78},{103,85,86,77,78},{102,45,76,67,78},{105,77,76,76,78},{104,77,76, 77,78},};for(i=0;i<5;i++){for(j=0;j<5;j++)printf("%d\t",a[i][j]);printf("\n");}printf("*****按照题目意思排序后的学生成绩:*****\n");printf("学号\t第一门第二门第三门第四门\n");for(i=0;i<5;i++)p[i]=a+i;SortStu(p);for (i=0; i<5; i++){for (j=0; j<5; j++)printf("%d\t", *(*p[i]+j) );printf("\n");}}(5) 编写程序实现将键盘输入的一行字符按单词倒排输出。