C程序设计第五版谭浩强课后答案 第八章习题答案

C语言程序设计第五版谭浩强课后答案

C语言程序设计第五版第八章答案

第八章 善于利用指针

本章习题均要求使用指针方法处理。
在这里插入图片描述

1. 输入3个整数,要求按由小到大的顺序输出。

解题思路: 先获取到三个变量的地址,然后获取三个数据,通过指针进行比较转换即可

答案:

#include <stdio.h>

void swap(int *p_a, int *p_b)
{
   
	int temp = *p_a;
	*p_a = *p_b;
	*p_b = temp;
}
int main()
{
   
	int a, b, c, *p_a = &a, *p_b = &b, *p_c = &c;	 // 获取每个变量空间的地址 
	printf("Please enter three numbers:");
	scanf_s("%d%d%d", p_a, p_b, p_c);
	if (*p_a > *p_b) {
   
		swap(p_a, p_b);//通过指针进行指向空间内的数据交换
	}
	if (*p_a > *p_c) {
   
		swap(p_a, p_c);
	}
	if (*p_b > *p_c) {
   
		swap(p_b, p_c);
	}
	printf("%d %d %d\n", *p_a, *p_b, *p_c);
	system("pause");
	return 0;
}

C语言程序设计第五版谭浩强第1题习题答案

2. 输入3个字符串,要求按由小到大的顺序输出。

解题思路: 字符串的比较可以使用strcmp函数,返回值>0表示大于,返回值小于0表示小于,返回追等于0表示相同。其他的比较排序思路与数字的排序交换没有区别,逐个进行比较先找出最大的,然后找出第二大的。

答案:

#include <stdio.h>
int main()
{
   
	char str[3][32]; 
	char *p[3];
	printf("Please enter three strings:");
	for (int i = 0; i < 3; i++) {
   
		p[i] = str[i];
		scanf_s("%s", p[i], 32);//后边的数字限制缓冲区边界,防止缓冲区溢出访问越界
	}
    //让p[0]和p[1]/p[2]分别进行比较,找出最大的字符串,i+1之后,则让p[1]和p[2]进行比较,找出第二大
    //i循环总个数-1次,最后一个是不需要比较的
	for (int i = 0; i < 2; i++) {
   
		for (int j = i + 1; j < 3; j++) {
    
			if (strcmp(p[i], p[j]) > 0) {
   
				char *tmp = p[i]; p[i] = p[j]; p[j] = tmp;
			}
		}
		
	}
	printf("%s %s %s\n", p[0], p[1], p[2]);
	system("pause");
	return 0;
}

C语言程序设计第五版谭浩强课后习题答案

3. 输入10个整数,将其中最小的数与第一个数对换, 把最大的数与最后一个数对换。

写3个函数:

①输人10个数;
②进行处理;
③输出10个数。

解题思路: 在进行数值逐个比较的同时找到最小值的空间地址以及最大值的空间地址,使用这两个空间中的数据最终与第一和最后数据进行对换即可。

答案:

#include <stdio.h>

void input(int *arry, int len)
{
   
	for (int i = 0; i < len; i++) {
   
		scanf_s("%d", &arry[i]);
	}
}
void print(int *arry, int len)
{
   
	for (int i = 0; i < len; i++) {
   
		printf("%d ", arry[i]);
	}
	printf("\n");
}
void handle(int *arry, int len)
{
   
	int max_num = arry[0], min_num = arry[0];
	int *p_max = NULL, *p_min = NULL;
	for (int i = 1; i < len; i++) {
   
		if (min_num > arry[i]) {
   //逐个比对后找出最小值
			min_num = arry[i];
			p_min = &arry[i];	//逐个比对后找到最小值的空间地址
		}
		if (max_num < arry[i]) {
   //逐个比对后找出最大值
			max_num = arry[i];
			p_max = &arry[i];   //逐个比对后找到最大值的空间地址
		}
	}
	int tmp;
	tmp = *p_min; *p_min = arry[0]; arry[0] = tmp;  //最小值与第一个数据交换
	tmp = *p_max; *p_max = arry[len - 1]; arry[len - 1] = tmp;//最大值与最后一个数据交换
}
int main()
{
   
	int arry[10];
	printf("Please enter ten nums:");
	input(arry, 10);
	handle(arry, 10);
	print(arry, 10);
	system("pause");
	return 0;
}

c语言第三题习题答案

4. 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见图8.43。 写一函数实现以上功能,在主函数中输人n个整数和输出调整后的n个数。

c语言程序设计第五版图片

解题思路: 找出倒数第m个数据,从这里开始保存倒数第m位置的数据,因为倒数第m位置的数据要放到数组最前方,将m之前的数据向后偏移一位,然后将数组第一个位置的数据替换为保存的m位的数据,逐个往后递增即可。

答案:

#include <stdio.h>
void move(int *arry, int n, int m)
{
   
	int end_idx = n - m;//找到倒数第m个数据的位置,也就是要移动到数组首部的数据的起始位置
	for (int i = 0; i < m; i++) {
   
		int *p = arry + end_idx + i;//从倒数第m个数据的位置开始逐渐向后偏移直到数组尾部
		int tmp = *p;//获取到这个位置的值,用于数组前边数据向后偏移1位之后,向数组第i位赋值
		for (int j = end_idx + i; j > i; j--) {
   //从第i位开始逐个向后偏移一位
			*p = *(p - 1);
			p--;
		}
		*(arry + i) = tmp;//数组的前第i个数字逐个替换为后边被覆盖的值
	}
}
int main()
{
   
	int number[32], n, m, i;
	printf("Please enter the number of numbers: ");
	scanf_s("%d", &n);//先确定要输入多少个数字
	printf("Please enter %d numbers: ", n);
	for (i = 0; i < n; i++) {
   
		scanf_s("%d", &number[i]);//输入指定个数的数字
	}
	printf("Number of positions to move: ");
	scanf_s("%d", &m);//确定要向后移动多少个位置
	move(number, n, m);
	for (i = 0; i < n; i++) {
   
		printf("%d ", number[i]);
	}
	printf("\n");
	system("pause");
	return 0
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值