分类: C/C++
2007-02-27 20:48:29
10.1 输入3个整数,按由小到大的顺序输出。
解:程序如下:(xt10-1.c)
#include
main()
{ int n1,n2,n3;
int *p1,*p2,*p3;
printf("Input three integers n1,n2,n3: ");
scanf("%d,%d,%d",&n1,&n2,&n3);
p1=&n1;
p2=&n2;
p3=&n3;
if(n1>n2) swap(p1,p2);
if(n1>n3) swap(p1,p3);
if(n2>n3) swap(p2,p3);
printf("Now, the order is: %d,%d,%d\n",n1,n2,n3);
}
swap(int *p1,int *p2)
{ int p;
p=*p1;*p1=*p2;*p2=p;
}
运行结果如下:
Input three integers n1,n2,n3: 34,21,25↙
Now, the order is: 21,25,34
解:程序如下:(xt10-2.c)
#include
#include
main()
{ char *str1[20],*str2[20],*str3[20];
char swap();
printf("Input three line:\n");
gets(str1);
gets(str2);
gets(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("Now, the order is:\n");
printf("%s\n%s\n%s\n",str1,str2,str3);
}
char swap (char *p1,char*p2) /*交换两个字符串*/
{ char *p[20];
strcpy(p,p1); strcpy(p1,p2); strcpy(p2,p);
}
运行结果如下:
Input three lines:
I study very hard.↙
C language is very interesting.↙
He is a professor.↙
Now, the order is:
C language is very interesting.
He is a professor.
I study very hard.
10.3 输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写3个函数:(1)输入10个数;(2)进行处理;(3)输出10个数。
解:输入输出函数的N-S图见图10.1。。
#include
main()
{ int number[10];
input(number);
max_min_value(number);
output(number);
}
input(int number[10])
{ int i;
printf("Input 10 numbers: ");
for(i=0;i<10;i++)
scanf("%d",&number[i]);
}
max_min_value(int array[10])
{ int *max,*min,*p,*array_end;
array_end=array+10;
max=min=array;
for(p=array+1;p
if(*p>*max) max=p;
else if(*p<*min) min=p;
*p=array[0]; array[0]=*min; *min=*p;
*p=array[9];array[9]=*max;*max=*p;
return;
}
output(int array[10])
{ int *p;
printf("Now, they are: ");
for(p=array;p<=array+9;p++)
printf("%d ",*p);
}
运行结果如下:
Input 10 numbers: 32 24 56 78 1 98 36 44 29 6↙
Now, they are: 1 24 56 78 32 6 36 44 29 98
10.4 有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见图10.3。写一函数实现以上功能,在主函数中输入n个整数,并输出调整后的n个数。
解:程序如下:(xt10-4.c)
#include
main()
{ int number[20],n,m,i;
void move(int array[20],int n,int m);
printf("How many numbers? "); /* 共有多少个数 */
scanf("%d",&n);
printf("Input %d numbers: \n",n); /* 输入n个数 */
for(i=0;i
scanf("%d",&number[i]);
printf("How many place you want to move? "); /* 后移多少个位置 */
scanf("%d",&m);
move(number,n,m); /* 调用move 函数 */
printf("Now, they are: \n");
for(i=0;i
printf("%d ",number[i]);
}
void move(int array[20],int n,int m) /* 循环后移-次的函数 */
{ 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); /* 递归调用,当循环次数m减至0 */
/* 时,停止调用 */
}
运行结果:
How many numbers? 8↙
Input 8 numbers:
12 43 65 67 8 2 7 11↙
How many place you want to move? 4↙
Now, they are:
8 2 7 11 12 43 65 67
10.5 有n个人围成一圈,顺序排号。从第一个人开始报数(从l到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
解:
:(xt10-5.c)
#include
main()
{ int i,k,m,n,num[50],*p;
printf("Input number of person: n=");
scanf("%d",&n);
p=num;
for(i=0;i
*(p+i)=i+1; /* 以l至n为序给每个人编号 */
i=0; /* i为每次循环时的计数变量 */
k=0; /* k为按1、2、3报数时的计数变量 */
m=0; /* m为退出人数 */
while(m
{ if(*(p+i)!=0) k++;
if(k==3) /* 对退出的人的编号置为0 */
{ *(p+i)=0;
k=0;
m++;
}
i++;
if(i==n) i=0; /* 报数到尾后, i恢复为0 */
}
while(*p==0) p++;
printf("The last one is NO.%d\n",*p);
}
运行结果:
Input number of person: n=8↙
The last one is NO.7
解:程序如下:(xt10-6.c)
#include
main()
{ int len;
char *str[20];
int length(char *p);
printf("Input string: ");
scanf("%s",str);
len=length(str);
printf("The length of string is %d.\n",len);
}
int length(char *p) /* 求字符中长度函数 */
{ int n;
n=0;
while(*p!='\0')
{ n++;
p++;
}
return(n);
}
运行结果:
Input string: China↙
The length of string is 5.
解:程序如下:(xt10-7.c)
#include
#include
main()
{ int m;
char *str1[20],*str2[20];
void copystr(char *p1,char *p2,int m);
printf("Input string: ");
gets(str1);
printf("Which character that begin to copy? ");
scanf("%d",&m);
if(strlen(str1)
printf("Input error!");
else
{ copystr(str1,str2,m);
printf("resut: %s\n",str2);
}
}
void copystr(char *p1,char *p2,int m) /* 字符串部分复制函数 */
{ int n;
n=0;
while(n
{ n++;
p1++;
}
while(*p1!='\0')
{ *p2=*p1;
p1++;
p2++;
}
*p2='\0';
}
运行结果:
Input string: reading-room↙
Which character that begin to copy? 9↙
result: room
10.8 输入一行文字,找出其中大写字母、小写字母、空格、数字及其他字符各有多少。
解:程序如下:(xt10-8.c)
#include
main()
{ int upper=0,lower=0,digit=0,space=0,other=0,i=0;
char *p,s[80];
printf("Input string: ");
while((s[i]=getchar())!='\n') i++;
p=&s[0];
while(*p!='\n')
{ if(('A'<=*p)&&(*p<='Z')) upper++;
else if(('a'<=*p)&&(*p<='z')) lower++;
else if(*p==' ') space++;
else if(('0'<=*p)&&(*p<='9')) digit++;
else other++;
p++;
}
printf("upperer case:%d\n",upper);
printf("lowerer case:%d\n",lower);
printf("digit:%d\n",digit);
printf("space:%d\n",space);
printf("other:%d\n",other);
}
运行结果:
Input string: Today is 2000/1/1↙
upperer case:1
lowerer case:6
digit:6
space:2
other:2
10.9 写一个函数,将一个3×3的矩阵转置。
解:程序如下:(xt10-9.c)
#include
main()
{ int a[3][3],*p,i;
void move(int *pointer);
printf("Input matrix: \n");
for(i=0;i<3;i++)
scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]);
p=&a[0][0];
move(p);
printf("Now,matrix: \n");
for(i=0;i<3;i++)
printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
}
void move(int *pointer)
{ int i,j,t;
for(i=0;i<3;i++)
for(j=i;j<3;j++)
{ t=*(pointer+3*i+j);
*(pointer+3*i+j)=*(pointer+3*j+i);
*(pointer+3*j+i)=t;
}
}
运行结果:
Input matrix:
l 2 3↙
4 5 6↙
7 8 9↙
Now,matrix:
1 4 7
2 5 8
3 6 9
l0.l0 将一个5×5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(按从
左到右、从上到下的顺序 ,依次从小到大存放),写一个函数实现之,并用main数调用。
解:程序如下:(xt10-10.c)
#include
main()
{ int a[5][5],*p,i,j;
void change(int *p);
printf("Input matrix:\n");
for(i=0;i<5;i++) /*输入矩阵*/
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
p=&a[0][0]; /*使p指向0行0列元素*/
change(p); /*调用函数, 实现交换*/
printf("Now, matrix: \n");
for(i=0;i<5;i++) /*输出已交换的矩阵*/
{ for(j=0;j<5;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
void change(int *p) /*交换函数*/
{ int i,j,temp;
int *pmax,*pmin;
pmax=p;
pmin=p;
for(i=0;i<5;i++) /*找最大值和最小值的地址,并赋给pmax,pmin*/
for(j=0;j<5;j++)
{ if(*pmax<*(p+5*i+j)) pmax=p+5*i+j;
if(*pmin>*(p+5*i+j)) pmin=p+5*i+j;
}
temp=*(p+12); /*将最大值换给中心元素*/
*(p+12)=*pmax;
*pmax=temp;
temp=*p; /*将最小值换给左上角元素*/
*p=*pmin;
*pmin=temp;
pmin=p+1;
for(i=0;i<5;i++) /*找第二最小值的地址赋给pmin*/
for(j=0;j<5;j++)
if(((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j))) pmin=p+5*i+j;
temp=*pmin; /*将第二最小值换给右上角元素*/
*pmin=*(p+4);
*(p+4)=temp;
pmin=p+1;
for(i=0;i<5;i++) /*找第三最小值的地址赋给pmin*/
for(j=0;j<5;j++)
if(((p+5*i+j)!=(p+4))&&((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))
pmin=p+5*i+j; /*将第三最小值换给左下角元素*/
temp=*pmin;
*pmin=*(p+20);
*(p+20)=temp;
pmin=p+1;
for(i=0;i<5;i++) /*找第四最小值的地址赋给pmin*/
for(j=0;j<5;j++)
if(((p+5*i+j)!=p)&&((p+5*i+j)!=(p+4))&&((p+5*i+j)!=
(p+20))&&(*pmin>*(p+5*i+j))) pmin=p+5*i+j;
temp=*pmin; /*将第四最小值换给右下角元素*/
*pmin=*(p+24);
*(p+24)=temp;
}
运行结果:
Input matrix:
35 34 33 32 31↙
3O 29 28 27 26↙
25 24 23 22 21↙
15 14 13 12 ll↙
Now, matrix:
11 34 33 32 12
30 29 28 27 26
25 24 35 22 21
20 l9 18 17 16
13 23 15 31 14
10.11在主函数中输入10个等长的字符串。用另一个函数对它们排序,然后在主函数输出这10个已排好的字符串。
解:程序如下:(xt10-11.c)
#include
#include
main()
{ void sort(char s[10][6]);
int i;
char str[10][6];
printf("Input 10 strings:\n");
for(i=0;i<10;i++)
scanf("%s",str[i]);
sort(str);
printf("Now, the sequence is:\n");
for(i=0;i<10;i++)
printf("%s\n",str[i]);
}
void sort(char s[10][6])
{ int i,j;
char *p,temp[10];
p=temp;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(strcmp(s[j],s[j+1])>0 )
{ strcpy(p,s[j]);
strcpy(s[j],s[+j+1]);
strcpy(s[j+1],p);
}
}
运行结果:
Input 10 strings:
China↙
Japan↙
Korea↙
Egypt↙
Nepal↙
Burma↙
Ghana↙
Sudan↙
Italy↙
Libya↙
Now, the sequence is: