谭浩强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);  
			}  
		}  
	}  
}
  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值