习 题 9
一.选择题
1. A 2. A 3. A 4. A 5.B 6.C
二 编程题
9.2 编写一函数,判断N×N矩阵是否为上三角阵。上 while(p c=*p; *p++=*q; *q--=c; } } 三角阵是指不含主对角线,下半三角都是0的矩阵。 #include void main() { int a[3][3]={{1,4,5},{0,2,6},{0,0,3}}; int result=fun(a,3); if(result==1) printf(\此矩阵是上三角矩阵!\\n\ else printf(\此矩阵不是上三角矩阵!\\n\ } 9.3 有一个字符串,包含n个字符,将字符串从第i个字符到第j个字符间的字符逆置。 程序代码: #include void invertsub(char *str,int i,int j){ char *p,*q,c; int n=0; p=q=str; if(str==NULL) printf(\ else if(i<=0||j>strlen(str)) printf(\ else { while(*p!='\\0'&&n!=i-1) { p++;n++; } q=p; while(*q!='\\0'&&n!=j-1){ q++;n++; } } void main(){ char str[]=\ printf(\ invertsub(str,2,5); printf(\ } 9.4 题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数 .程序源代码: main() { int number[20],n,m,i; printf(\scanf(\printf(\scanf(\for(i=0;i scanf(\scanf(\move(number,n,m); for(i=0;i printf(\printf(\} move(array,n,m) int n,m,array[20]; { int *p,array_end; array_end=*(array+n-1); for(p=array+n-1;p>array;p--) *p=*(p-1); *array=array_end; m--; if(m>0) move(array,n,m); } 9.5 输入n个整数,将最小数与第一个数对换,把最大数与最后一个数对换 1 程序源代码: main() { int number[10]; input(number); max_min(number); output(number); } input(number) int number[10]; {int i; for(i=0;i<9;i++) scanf(\ scanf(\} max_min(array) int array[10]; {int *max,*min,k,l; int *p,*arr_end; arr_end=array+10; max=min=array; for(p=array+1;p else if(*p<*min) min=p; k=*max; l=*min; *p=array[0];array[0]=l;l=*p; *p=array[9];array[9]=k;k=*p; return; } output(array) int array[10]; { int *p; for(p=array;p printf(\} 9.6 输入n个字符串,按由小到大顺序输出。程序源代码: main() { char *str1[20],*str2[20],*str3[20]; char swap(); printf(\ scanf(\scanf(\scanf(\ if(strcmp(str1,str2)>0) swap(str1,str2); if(strcmp(str1,str3)>0) swap(str1,str3); if(strcmp(str2,str3)>0) swap(str2,str3); printf(\ printf(\} char swap(p1,p2) char *p1,*p2; { char *p[20]; strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p); } 9.7 写一函数,功能是交换两个实数变量的值。 void swap(float * x, float * y); main() { float a, b, *p1, *p2; a=10; b=20; p1=&a; p2=&b; printf("a=%f, b=%f\\n", a, b); swap(p1, p2); printf("a=%f, b=%f\\n", a, b); /* 或printf(″%d %d″, *p1, *p2) */ } void swap(float *pa, float *pb { float temp; temp=*pa; *pa=*pb; *pb=temp; } 9. 10 写一个函数,求一个字符串的长度。 程序源代码: main() { int len; char *str[20]; printf(\ 2 scanf(\len=length(str); printf(\} length(p) char *p; { int n; n=0; while(*p!='\\0') { n++; p++; } return n; i=0; k=0; m=0; while(m if(*(p+i)!=0) k++; if(k==3) { *(p+i)=0; k=0; m++; } i++; if(i==n) i=0; } while(*p==0) p++; printf(\} 9.12 # include \# define NULL 0 # define LEN sizeof(struct student)/*LEN表示结构体student的长度*/ struct student } { long num; int score; 9.11 约瑟夫环问题:n个人围成一圈,从第一个人开始报数,凡报到3的人退出,问最后剩下的是第几号。 程序代码: #define nmax 50 main() { int i,k,m,n,num[nmax],*p; printf(\scanf(\p=num; for(i=0;i 3 struct student *next;}; /*student成员中的next仍为student结构体类型,链表必用此种结构*/ struct student listA,listB; /*listA,listB皆为student结构体类型*/ int n,sum=0; void print(head) /*输出函数*/ struct student *head; { struct student *p; printf(\ if (pb1->num p=head; { if(ah==pa1)ah=pb1; /*/*从表头开始*/ 如果现在ah指向第一个链表的某结点, 则让ah指向第二个链表的当前结点,乃因第二个链表 if(p!=NULL) do /*未到结尾时*/ 的学号比第一个链表的学号小.注意ah为目标链表*/ { printf(\/*输出学号和成绩*/ else pa2->next=pb1; /*否则,第二个链表pa2指针指向第二个链表的当前位 p=p->next;} 置*/ /*指针前进*/ pb1=pb1->next;pb2->next=pa1; while(p!=NULL);} struct student *insert(ah,bh) /*定义插入函数*/ struct student *ah,*bh; { struct student *pa1,*pa2,*pb1,*pb2; /*这四个指针皆为student结构体类型*/ pa2=pa1=ah; /*两个指针指向第一链表的表头*/ pb2=pb1=bh; /*两个指针指向第二链表的表头*/ do { while((pb1->num>pa1->num)&&(pa1->next!=NULL)) /*注意是按学号链接.当第二个链表的学号大于第一个链表的学号而且未到第一个链表结尾时*/ { pa2=pa1;pa1=pa1->next;} /*用pa2记下第一个链表的当前位置,pa1前进到下一个结点.到此已经脱离循环*/ /*做完上面的事情,两指针同时前进到下一个结点*/ pa2=pb2;pb2=pb1;}} /*pa2指向第二个链表的当前位置,pb2 指向第二个链表的当前位置*/ while /*当第一个链表未到末尾或者第一个链表结束而第二个链表未结束 ((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL)); 时,便重复做上面的事情*/ if((pb1->num>pa1->num)&&(pa1->next==NULL)) /*脱离循环时如果是第一个链表结束而且第二个链表之序号大于第一个 链表之序号则把pa1之next 域指向第二个链表的当前位置*/ pa1->next=pb1; return(ah); } /*返回目标链表的头地址*/ struct student *creat() /*定义建立链表函数*/ 4

