谭浩强C程序设计第四版第八章课后答案
1.三个数排序
#include <stdio.h>
void fuction(int *p1,int *p2,int *p3);
void swap(int *p1,int *p2);
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int *p1,*p2,*p3;
p1 = &a;
p2 = &b;
p3 = &c;
fuction(p1,p2,p3);
printf("the order is :%d,%d,%d\n",a,b,c);
return 0;
}
void fuction(int *p1,int *p2,int *p3)
{
if(*p1 > *p2)
swap(p1,p2);
if(*p1 > *p3)
swap(p1,p3);
if(*p2 > *p3)
swap(p2,p3);
}
void swap(int *p1,int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
2.字符串输出
#include <stdio.h>
#include <string.h>
void fuction(char *p1,char *p2,char *p3);
void swap(char *p1,char *p2);
int main()
{
char a[10],b[10],c[10];
gets(a);
gets(b);
gets(c);
char *p1,*p2,*p3;
p1 = a;
p2 = b;
p3 = c;
fuction(p1,p2,p3);
printf("the order is :\n%s\n%s\n%s\n",a,b,c);
return 0;
}
void fuction(char *p1,char *p2,char *p3)
{
if(strcmp(p1,p2) > 0)
swap(p1,p2);
if(strcmp(p1,p3) > 0)
swap(p1,p3);
if(strcmp(p2,p3) > 0)
swap(p2,p3);
}
void swap(char *p1,char *p2)
{
char *temp;
temp = p1;
p1 = p2;
p2 = temp;
}
3.数组处理
#include <stdio.h>
void input(int *p)
{
for (int i = 0;i < 10;i++)
{
scanf("%d",p + i);
}
}
void output(int *p)
{
for (int i = 0;i < 10;i++)
{
printf("%d \t",*(p + i));
}
printf("\n");
}
void change(int *p)
{
int t1,t2;
int max,min;
int temp;
t1 = t2 = 0;
max = min = *p;
for (int i = 0;i < 10;i++)
{
if ( max < *(p+i))
{
max = *(p+i);
t1 = i;
}
if ( min > *(p+i))
{
min = *(p+i);
t2 = i;
}
}
if ( t1 != 9 )
{
temp = *(p + t1);
*(p + t1) = *(p + 9);
*(p + 9) = temp;
}
if ( t2 != 0 )
{
temp = *(p + t2);
*(p + t2) = *p;
*p = temp;
}
}
int main()
{
int a[10];
int *p = a;
input(p);
output(p);
change(p);
output(p);
return 0;
}
4.数组部分移动
#include <stdio.h>
#include <stdlib.h>
void fuc(int *p,int n,int m)
{
int *q = (int *)malloc( n * sizeof(int));
int i;
for ( i = 0;i < n - m;i++)
{
*(q + m + i) = *(p + i);
}
for ( i = 0;i < m;i++)
{
*(q + i) = *(p + n - m +i);
}
for(i = 0;i < n;i++)
{
*( p + i ) = *(q + i);
}
free(q);
}
int main()
{
int n,m;
printf("需要多少个整数?");
scanf("%d",&n);
printf("请输入这 %d 个数:",n);
int *p = (int *)malloc( n * sizeof(int));
for (int i = 0;i < n;i++)
{
scanf("%d",p+i);
printf("%d ",*(p+i));
}
printf("从哪个位置调整?");
scanf("%d",&m);
fuc(p,n,n - m);
for (int i = 0;i < n;i++)
{
printf("%d ",*(p+i));
}
}
5.报数退出
#include <stdio.h>
#include <stdlib.h>
void move(int *p,int k,int n)
{
for (int i = k;i < n;i++)
{
p[i] = p[i+1];
}
}
void print(int *p,int n)
{
for (int i = 1;i <= n;i++)
{
printf("%d \t",p[i]);
}
}
int main()
{
int n;
int i,j;
printf("输入个数:");
scanf("%d",&n);
int *p = (int *)malloc(n * sizeof(int));
for ( i = 1;i <= n;i++)
{
p[i] = i;
}
i = 0;j = 0;
while(n)
{
i++;
j++;
if ( j == 3)
{
printf("%d 出列\n",*(p + i));
move(p,i,n);
n--;
j = 0;
i--;
}
if (i == n)
{
i = 0;
}
}
printf("最后剩下%d",*(p+1));
}
6.输出字符串长度
#include <stdio.h>
void length(char *p)
{
int i = 0;
for(;*p != '\0';p++,i++);
printf("字符串长度为 %d\n\n",i);
}
int main()
{
char a[100];
char *p = a;
gets(a);
length(p);
}
7.指定位置复制字符
#include <stdio.h>
#include <stdlib.h>
void copym(char *a,int m)
{
char *b = (char *)malloc( (11 - m ) *sizeof(char));
int j = 0;
for ( int i = m;i < 10;i++)
{
b[j++] = a[i];
}
b[j] = '\0';
printf("%s\n",b);
}
int main()
{
int m;
char *a = "1234567890";
printf("a 字符串为 %s\n输入开始复制位置:\n",a);
scanf("%d",&m);
printf("复制之后的字符串b:\n");
copym(a,m);
return 0;
}
8.统计字符
#include <stdio.h>
void count(char *p)
{
int Character = 0,character = 0,space = 0,number = 0,other = 0;
for (int i = 0;*p != '\0';i++,p++)
{
if ( *p >= 'A' && *p <= 'Z')
{
Character++;
}
else if (*p >= 'a' && *p <= 'z')
{
character++;
}
else if ( *p >= '0' && *p <= '9')
{
number++;
}
else if ( *p == ' ')
{
space++;
}
else
other++;
}
printf("字母有 %d 个。\n",character);
printf("数字有 %d 个。\n",number);
printf("空格有 %d 个。\n",space);
printf("其他有 %d 个。\n",other);
}
int main()
{
char p[100];
gets(p);
count(p);
return 0;
}
9.整型举证转置
#include <stdio.h>
void zhuanzhi(int (*p)[3])
{
for (int i = 0;i < 3;i++)
{
for (int j = 0;j <= i;j++)
{
int t = *(*(p + i) + j);
*(*(p + i) + j) = *(*(p + j) + i);
*(*(p + j) + i) = t;
}
}
}
void print(int (*p)[3])
{
for (int i = 0;i < 3;i++)
{
for (int j = 0;j < 3;j++)
{
printf("%d\t",*(*(p + i) + j));
}
printf("\n");
}
}
int main()
{
int a[3][3] = {1,2,3,4,5,6,7,8,9};
int (*p)[3] = a;
zhuanzhi(p);
print(p);
return 0;
}
10.矩形操作,没什么意义
#include<stdio.h>
int main()
{
printf("将一个5*5的矩阵中最大的元素放在中心,四个角分别放四个最小的元素\n\n");
void change(int *p);
int a[5][5]={{35,34,33,32,31},{30,29,28,27,26},
{25,24,23,22,21},{20,19,18,17,16},{15,14,13,12,11}};
int *p;
int i;
int j;
printf(" 原矩阵为:\n");
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
printf("%5d",a[i][j]);
}
printf("\n");
}
printf("\n");
p=&a[0][0];
change(p);
printf(" 处理后的矩阵为:\n");
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
printf("%5d",a[i][j]);
}
printf("\n");
}
return 0;
}
void change(int *p)
{
int i;
int j;
int temp;
int *pmax;
int *pmin;
pmax=p;
pmin=p;
for(i=0;i<5;i++)
{
for(j=i;j<5;j++)
{
if(*pmax<*(p+5*i+j))
{
pmax=p+5*i+j;
}//求max
if(*pmin>*(p+5*i+j))
{
pmin=p+5*i+j;
}//求第一min
}
}
temp=*(p+12);
*(p+12)=*pmax;
*pmax=temp;//将max放在中心 也即是12位置
temp=*p;
*p=*pmin;
*pmin=temp;//将第一min放在第0位置
pmin=p+1;//把第二min指向第1位置
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))
{//第一min已存放在0位置 求第二min
pmin=p+5*i+j;
}
}
}
temp=*pmin;
*pmin=*(p+1);
*(p+1)=temp;//把第二min存放在1位置
pmin=p+2;//把第三min指向2位置
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(((p+5*i+j)!=p)&&((p+5*i+j)!=(p+1))&&(*pmin>*(p+5*i+j)))
{//第一,二min已存放 求第三min
pmin=p+5*i+j;
}
}
}
temp=*pmin;
*pmin=*(p+2);
*(p+2)=temp;//将第三min存放在2位置
pmin=p+3;//把第四min指向3位置
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(((p+5*i+j)!=p)&&(p+5*i+j)!=(p+1)&&(p+5*i+j)!=(p+2)&&(*pmin>*(p+5*i+j)))
{//第一,二,三min已存放 求第四min
pmin=p+5*i+j;
}
}
}
temp=*pmin;
*pmin=*(p+24);
*(p+24)=temp;//将第四min存放在3位置
*(p+4)=*(p+1);*(p+20)=*(p+2);
//第一,四min为第一次和最后一次筛选,第二,三min是中间排查最后再放入角
}
11.字符串排序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void sort(char p[10][10])
{
char t[10] ;
for (int i = 0;i < 9;i++)
{
for (int j = 0;j < 9 - i;j++)
{
if ( strcmp(p[j],p[j+1]) > 0 )
{
strcpy(t,p[j]);
strcpy(p[j],p[j+1]);
strcpy(p[j+1],t);
}
}
}
}
int main()
{
char c[10][10];
for ( int i = 0;i < 10;i++)
{
gets(c[i]);
}
sort(c);
for ( int i = 0;i < 10;i++)
{
printf("%s\n",*(c+i));
}
}
12.指针数组处理上题
#include <stdio.h>
#include <string.h>
void sort(char *p[])
{
char *t;
for (int i = 0;i < 9;i++)
{
for (int j = 0;j < 9 - i;j++)
{
if ( strcmp(p[j],p[j+1]) > 0 )
{
t = p[j];
p[j] = p[j+1];
p[j+1] = t;
}
}
}
}
int main()
{
char c[10][10];
char *p[10];
//指针数组
for ( int i = 0;i < 10;i++)
{
gets(c[i]);
p[i] = c[i];
}
sort(p);
for ( int i = 0;i < 10;i++)
{
printf("%s\n",*(p+i));
}
}
13.矩形法定积分
#include <stdio.h>
#include <math.h>
float i = 1/50.0;
void fun(float (*p)());
float Cos();
float Sin();
float Exp();
int main()
{
int n;
scanf("%d",&n);
if(n == 1)
fun(Cos);
if (n == 2)
fun(Sin);
if (n == 3)
fun(Exp);
return 0;
}
void fun(float (*p)())
{
float result;
result = (*p)();
printf("%6.3f",result);
}
float Cos()
{
float sum = 0;
for ( float step = 0;step <= 1;step += 0.002)
{
sum += 0.002 * cos(step);
}
return sum;
}
float Sin()
{
float sum = 0;
for ( float step = 0;step <= 1;step += 0.002)
{
sum += 0.002 * sin(step);
}
return sum;
}
float Exp()
{
float sum = 0;
for ( float step = 0;step <= 1;step += 0.002)
{
sum += 0.002 * exp(step);
}
return sum;
}
14.逆序输出
#include <stdio.h>
#include <stdlib.h>
void fun()
{
printf("输入10个数:\n");
int *p = (int *)malloc(10 * sizeof(int));
for (int i = 0;i < 10;i++)
{
scanf("%d",(p+i));
}
printf("逆序输出为:\n");
for ( int i = 9;i >= 0;i--)
{
printf("%d\t",*(p+i));
}
free(p);
}
int main()
{
fun();
return 0;
}
15.学生成绩
#include <stdio.h>
float average(float score[4][5],int n);
float stu_ave(float score[4][5],int i);
void find1(float score[4][5]);
void find2(float score[4][5]);
void print(float score[4][5],int n);
int main()
{
float score[4][5] = {{91,92,98,88,83},{52,51,66,33,77},{55,57,89,90,92},{77,88,99,66,76}};
float (*p)[5] = score;
printf("查哪门平均成绩:");
int n;
scanf("%d",&n);
printf("%5.2f\n",average(p,n-1));
printf("两门以上不及格学生:\n");
find1(score);
printf("成绩优秀同学:\n");
find2(score);
return 0;
}
float average(float score[4][5],int n)
{
float sum = 0;
for ( int i = 0;i < 4;i++)
{
sum += *(*(score+i)+n);
}
return sum/4.0;
}
float stu_ave(float score[4][5],int i)
{
float sum = 0;
for ( int j = 0;j < 5;j++)
{
sum += *(*(score + i) + j);
}
return sum/5.0;
}
void find1(float score[4][5])
{
int flag = 0;
for (int i = 0;i < 4;i++)
{
for (int j = 0;j < 5;j++)
{
if ( *(*(score + i) + j) < 60)
flag++;
}
if (flag >= 2)
print(score,i);
flag = 0;
}
}
void find2(float score[4][5])
{
int flag = 0;
for (int i = 0;i < 4;i++)
{
for ( int j = 0;j < 5;j++)
{
if ( *(*(score + i) + j) >= 85)
{
flag++;
}
}
if ( flag == 5 || stu_ave(score,i) >= 90)
{
print(score,i);
}
flag = 0;
}
}
void print(float score[4][5],int n)
{
printf("No.%d 成绩:",n + 1);
for (int i = 0;i < 5;i++)
{
printf("%5.2f ",*(*(score + n)+i));
}
printf("\n");
}
16.统计数字
#include <stdio.h>
void f(char *p);
int main()
{
char c[100];
gets(c);
f(c);
return 0;
}
void f(char *p)
{
int a[10],i,j=0,b=0;
for(i=0;*(p+i)!='\0';i++)
{
if(*(p+i)>='0'&&*(p+i)<='9')
{
b=*(p+i)-48+b*10;//如果检测到数字减去48=本身,b*10位数递增
if(*(p+i+1)<'0'||*(p+i+1)>'9')
{
a[j]=b;j++;b=0;//检测到非数字将整数b赋值给数组a的元素,b重置
}
}
}
printf("\n一共有%d个整数,分别为:\n",j);
for(i=0;i<j;i++)
printf("%4d",a[i]);
}
17.字符串比较
#include <stdio.h>
int strcmp(char *p1,char *p2)
{
int len_p1 = 0;
int len_p2 = 0;
int i;
int flag = 0;
for ( i = 0;*(p1 + i)!='\0';i++)
len_p1 = i;
for ( i = 0;*(p2 + i)!='\0';i++)
len_p2 = i;
int len = len_p1 > len_p2 ? len_p1 : len_p2;
for (int i = 0;i<len;i++)
{
if ( *(p1+i) != *(p2 +i))
{
return flag = *(p1+i) - *(p2 +i);
}
}
if ( flag == 0 )
{
if ( len_p1 > len_p2)
return 1;
else
return -1;
}
return 0;
}
int main()
{
char a[10],b[10];
gets(a);
gets(b);
printf("%d",strcmp(a,b));
}
18.中英月份
#include <stdio.h>
void month(int m);
int main()
{
int mon, i;
printf("Pleae enter month: ");
scanf("%d",&mon);
month(mon);
return 0;
}
void month(int m)
{
//定义指针数组,指向12个字符串
char *mm[12]={"January", "February", "March", "April", "May",
"June", "July", "August", "September", "October", "November", "December"};
int i;
char **p;
for (p=mm, i=0; i<12; p++, i++)
if ( m == (i+1))
{
printf("%s",*p);
break;
}
}
19.开辟与释放空间
#include <stdio.h>
#include <stdlib.h>
int *New(int n)
{
int *p = (int *)malloc(n * sizeof(int));
return p;
}
void Free(int *p)
{
free(p);
}
int main()
{
int *p = New(5);
Free(p);
return 0;
}
20.指针的指针输出
#include<stdio.h>
#include<string.h>
int main()
{
char str[5][10],pt[10];
char **q,*p[]={str[0],str[1],str[2],str[3],str[4]};
int i,j;
printf("输入5行字符串:\n");
for(i=0;i<5;i++)
gets(str[i]);
q=p;
for(i=0;i<4;i++)
{
for(j=0;j<4-i;j++)
{
if(strcmp(*(q+j),*(q+j+1))>0)
{
strcpy(pt,*(q+j));
strcpy(*(q+j),*(q+j+1));
strcpy(*(q+j+1),pt);
}
}
}
printf("\n字符串小到大排序:\n");
for(i=0;i<5;i++)
printf("%s\n",*(q+i));
}
21.指向指针的指针
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
void swap(int*, int*);
void sort(int**, int);
int main(void)
{
int i;
int n;
//整形数组
int array[MAXSIZE];
//指针数组
int *pArray[MAXSIZE];
printf("please enter n:\n");
scanf("%d", &n);
for (i = 0; i < n; ++i)
{
scanf("%d", &array[i]);
pArray[i] = &array[i];
}
sort(pArray, n);
for (i = 0; i < n; ++i)
{
printf("%d\n", *pArray[i]);
}
return 0;
}
//交换
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
//排序
void sort(int **array, int n)
{
int *p;
int *q;
for (p = *array; p < *array + n; ++p)
{
for (q = p + 1; q < *array + n; ++q)
{
if (*p > *q)
{
swap(p, q);
}
}
}
}