我是靠谱客的博主 糟糕冰淇淋,最近开发中收集的这篇文章主要介绍《C语言程序设计》第五版谭浩强课后答案 第八章《善于利用指针》习题答案 (大一大二、考研、计算机二级必看),觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
本章习题均要求使用指针方法处理。
《C语言程序设计》第五版谭浩强课后答案 第八章《善于利用指针》习题答案
- 1. 输入3个整数,要求按由小到大的顺序输出。
- 2. 输入3个字符串,要求按由小到大的顺序输出。
- 3. 输入10个整数,将其中最小的数与第一个数对换, 把最大的数与最后一个数对换。
- ①输人10个数;
- ②进行处理;
- ③输出10个数。
- 4. 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见图8.43。 写一函数实现以上功能,在主函数中输人n个整数和输出调整后的n个数。![在这里插入图片描述](https://file2.kaopuke.com:8081/files_image/2023062210/2020072715103389.png)**解题思路:** 找出倒数第m个数据,从这里开始保存倒数第m位置的数据,因为倒数第m位置的数据要放到数组最前方,将m之前的数据向后偏移一位,然后将数组第一个位置的数据替换为保存的m位的数据,逐个往后递增即可。
- 5. 有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
- 6. 写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。
- 7. 有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
- 8. 输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少。
- 9. 写一函数,将一个3x3的整型矩阵转置。
- 10. 将一个5x5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main函数调用。
- 11. 在主函数中输入10个等长的字符串。用另一函数对它们排序。然后在主函数输出这10个已排好序的字符串。
- 12. 用指针数组处理上一题目,字符串不等长。
- 13. 写一个用矩形法求定积分的通用函数,分别求 ∫ 0 1 s i n x d x , ∫ 0 1 c o s x d x , ∫ 0 1 e x d x , int_0^1 sinxdx, quad int_0^1 cosxdx, quad int_0^1 e^xdx, ∫01sinxdx,∫01cosxdx,∫01exdx, ,说明: sin,cos,exp 函数已在系统的数学函数库中,程序开头要用#include
正文开始
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 %dn", *p_a, *p_b, *p_c);
system("pause");
return 0;
}
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 %sn", p[0], p[1], p[2]);
system("pause");
return 0;
}
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;
}
4. 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见图8.43。 写一函数实现以上功能,在主函数中输人n个整数和输出调整后的n个数。解题思路: 找出倒数第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;
}
5. 有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
解题思路: 从第一个人开始,逐个报数,谁报3就退出,并且重置报数,直到最后一个人后,又重新从第一个人继续报数,直到最终只剩一个人的时候退出即可。
答案:
#include <stdio.h>
int main()
{
int people[128], n;
printf("Please input how many people: ");
scanf_s("%d", &n);
for (int i = 0; i < n; i++) {
people[i] = i + 1; //对每个人顺序排号
}
int remain = n;
int num_off = 0;
int *p = NULL;
while (remain > 1) {
p = people;
while (p != people + n) { // 每次从第一个位置开始,直到最后一个位置,报数是一直递增的
if ((*p) != 0) {//若这个位置人还在
num_off++; //则报数
if (num_off == 3) {//否则当前的人即将要报的数字是3
*p = 0; //则剔除这个人
num_off = 0; //并且重新开始计数,下边会++,所以是从1开始报数
remain--;//剩余人数-1
}
}
p++;
}
}
for (int i = 0; i < n; i++) {
if (people[i] != 0) {
printf("Serial number of the remaining person:%dn", people[i]);
}
}
printf("n");
system("pause");
return 0;
}
6. 写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。
解题思路: 字符串以 作为结尾,则从第一个字符开始向后移动遇到 认为字符串结束。
答案:
#include <stdio.h>
int mystrlen(char *str)
{
int len = 0;
char *ptr = str;
while (*ptr != '