习题 9
一.选择题
1. A
2. A
3. A
4. A
5.B
6.C
二编程题
9.2 编写一函数,判断N×N矩阵是否为上三角阵。上三角阵是指不含主对角线,下半三角都是0的矩阵。#include <stdio.h>
int fun(int x[][3],int n){
int flag=1,i,j;
for(i=1;i<n;i++)
for(j=0;j<i;j++)
if(x[i][j]!=0){
flag=0;break;
}
return flag;
}
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 <stdio.h>
#include <string.h>
void invertsub(char *str,int i,int j){
char *p,*q,c;
int n=0;
p=q=str;
if(str==NULL)
printf("str is NULL!\n");
else if(i<=0||j>strlen(str))
printf("i and j value error!\n");
else {
while(*p!='\0'&&n!=i-1)
{ p++;n++; }
q=p;
while(*q!='\0'&&n!=j-1){
q++;n++;
while(p<q){
c=*p;
*p++=*q;
*q--=c;
}
}
}
void main(){
char str[]="abcdefg";
printf("%s\n",str);
invertsub(str,2,5);
printf("%s\n",str);
}
9.4 题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
.程序源代码:
main()
{
int number[20],n,m,i;
printf("the total numbers is:");
scanf("%d",&n);
printf("back m:");
scanf("%d",&m);
for(i=0;i<n-1;i++)
scanf("%d,",&number[i]);
scanf("%d",&number[n-1]);
move(number,n,m);
for(i=0;i<n-1;i++)
printf("%d,",number[i]);
printf("%d",number[n-1]);
}
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个整数,将最小数与第一个数对换,把最大数与最后一个数对换
程序源代码:
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("%d,",&number[i]);
scanf("%d",&number[9]);
}
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<arr_end;p++)
if(*p>*max) max=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<array+9;p++)
printf("%d,",*p);
printf("%d\n",array[9]);
}
9.6 输入n个字符串,按由小到大顺序输出。程序源代码:
main()
{
char *str1[20],*str2[20],*str3[20]; char swap();
printf("please input three strings\n"); scanf("%s",str1);
scanf("%s",str2);
scanf("%s",str3);
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("after being sorted\n");
printf("%s\n%s\n%s\n",str1,str2,str3);
}
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("please input a string:\n");
scanf("%s",str);
len=length(str);
printf("the string has %d characters.",len); }
length(p)
char *p;
{
int n;
n=0;
while(*p!='\0')
{
n++;
p++;
}
return n;
}
9.11约瑟夫环问题:n个人围成一圈,从第一个人开始报数,凡报到3的人退出,问最后剩下的是第几号。
程序代码:
#define nmax 50
main()
{
int i,k,m,n,num[nmax],*p;
printf("please input the total of numbers:"); scanf("%d",&n);
p=num;
for(i=0;i<n;i++)
*(p+i)=i+1;
i=0;
k=0;
m=0;
while(m<n-1)
{
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("%d is left\n",*p);
}
9.12
# include "stdio.h"
# define NULL 0
# define LEN sizeof(struct student)/*LEN表示结
构体student的长度*/
struct student
{ long num;
int score;
struct student *next;};            /*student成
员中的next仍为student结构体类型,链表必用此种结
c语言中struct
构*/
struct student listA,listB;    /*listA,listB皆
为student结构体类型*/
int n,sum=0;
void print(head)                                      /*输出函数*/
struct student *head;
{ struct student *p;
printf("\n  sum %d record ,they are :\n",sum);
p=head;                                                              /*从表头开始*/ if(p!=NULL) do                                                              /*未到结尾时*/
{ printf("%ld %d\n",p->num,p->score);                                      /*输出学号和成绩*/
p=p->next;}                                                                    /*指针前进*/ 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前进到下一个结点.到此已经脱离循环*/
if (pb1->num<pa1->num)                    /*如果某一步第二个链表的学号小于第一个链表的学号了*/
{ if(ah==pa1)ah=pb1;                        /*如果现在ah 指向第一个链表的某结点, 则让ah 指向第二个链表的当前结点,乃因第二个链表
的学号比第一个链表的学号小.注意ah 为目标链表*/
else pa2->next=pb1;
/
*否则,第二个链表pa2指针指向第二个链表的当前位
置*/ pb1=pb1->next;pb2->next=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()          /*定义建立链表函数*/
{ struct student *p1,*p2,*head;          /*此三个指针皆为student 结构体类型*/
n=0;                                    /*计数器n 赋初值为0*/
p1=p2=(struct student *)malloc(LEN);            /*为结构体分配地址,p1,p2都指向这个地址*/
printf("input sno score:\n"); printf(" input 0 end.");
scanf("%ld,%d",&p1->num,&p1->score);                  /*输入学号和成绩*/ head=NULL;                                /*表头先置为空指针*/
while (p1->num!=0)                /*当输入的学号不为0时*/
{ n=n+1;                        /*计数器增值1*/
if(n==1)head=p1;                  /*如果是第生个结点,head 指向第一个结点*/
else p2->next=p1;                    /*如果不是第一个结点,链结到p2中,p2是建立的链表*/ p2=p1;                              /*指针p2前进*/
p1=(struct student *)malloc(LEN);          /*再分配地址*/
scanf("%ld,%d",&p1->num,&p1->score);}          /*再输入学号及成绩*/
p2->next=NULL;                        /*当脱离循环时,链表已经建立完毕.勿忘给表尾一个空指针*/ return(head);}                          /*返回表头地址*/ main(){
struct student *ahead,*bhead,*abh;      /*三个变量皆为结构体student 类型*/ ahead=creat();
print(ahead);    /*调用建立链表函数建立链表
llistA,把返回地址赋给指针ahead*/
sum=n;                            /*n 为链表结
点数*/
bhead=creat();
print(bhead);    /*调用建立链表函数建立链表llistB,把返回地址赋给指针bhead*/ sum=sum+n;              /*sum 为两个链表的结点总数*/
abh=insert(ahead,bhead);  /*调用插入函数连结两个链表,把表头地址赋给abh*/
print(abh);}                /*打印连接的结果*/
9.1 写一个函数,将一个3行3列矩阵转置。
main()/*将一个3行3列矩阵转置*/ { int a[3][3],*p,i;
printf("input 3*3 ju zhen:\n");
for (i=0;i<3;i++)/*一行一行的输入*/
scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]); p=&a[0][0];/*p 指向二维数组首地址*/ move(p);/*调用转置函数进行转置*/ printf("zhuan zhi hou juzhen wei:\n"); for (i=0;i<3;i++)/*一行一行的输出*/

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。