c语言程序设计第五版课后答案谭浩强 第六章习题答案 (4)

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

9. 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出"无此数"。

【答案解析】

二分查找是一个非常高效简单的查找算法,笔试和面试中非常喜欢考察。

折半查找又叫二分查找,查找的前提是序列中元素必须有序,假设区间使用[left, right)标记,待查找元素为key,具体查找的方式如下:当区间[left, right)有效时循环进行一下操作

找到[left, right)区间中间位置

如果key等于中间位置元素,则找到,返回该元素在数组中的下标

如果key小于中间位置元素,到数组的左半侧继续二分查找

如果key大于中间位置元素,到数组的右半侧继续二分查找

如果循环结束时还没有找到,则不存在该元素。

【代码实现】

#include<stdio.h> int main() { int array[15] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; int left = 0; int right = sizeof(array) / sizeof(array[0]); int key = 0; printf("请输入要查找的数字: "); scanf("%d", &key); // 二分查找 while (left < right) { // 找到中间位置 int mid = left + ((right - left) >> 1); if (key == array[mid]) { printf("%d\n", mid); break; } else if (key < array[mid]) { right = mid; } else { left = mid + 1; } } if (left >= right) printf("无此数\n"); return 0; }

【结果截屏】

假设数组中元素为:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

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

10. 有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。

【答案解析】

获取文章中的3行文本,并对每行文本进行以下操作

定义保存结果变量:upp、low、digit、space、other

遍历每行文本中的字符

如果该字符ch:ch >= \'a\' && ch <=\'z\',则该字符是小写字母,给low++

如果该字符ch:ch >= \'A\' && ch <=\'Z\',则该字符是小写字母,给up++

如果该字符ch:ch >= \'0\' && ch <=\'9\',则该字符是小写字母,给digit++

如果该字符ch:ch == \' \',则该字符是小写字母,给space++

否则为其他字符,给other++

输入统计结果

【代码实现】

#include <stdio.h> int main() { int upp = 0, low = 0, digit = 0, space = 0, other = 0; char text[3][80]; for (int i=0; i<3; i++) { // 获取一行文本 printf("please input line %d:\n",i+1); gets(text[i]); // 统计该行文本中小写字母、大写字母、数字、空格、其他字符的个数 for (int j=0; j<80 && text[i][j]!=\'\0\'; j++) { if (text[i][j]>=\'A\'&& text[i][j]<=\'Z\') // 大写字母 upp++; else if (text[i][j]>=\'a\' && text[i][j]<=\'z\') // 小写字母 low++; else if (text[i][j]>=\'0\' && text[i][j]<=\'9\') // 数字 digit++; else if (text[i][j]==\' \') // 控制 space++; else other++; // 其他字符 } } printf("\nupper case: %d\n", upp); printf("lower case: %d\n", low); printf("digit : %d\n", digit); printf("space : %d\n", space); printf("other : %d\n", other); return 0; }

【结果截屏】

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

11. 输出一下图案: * * * * * * * * * * * * * * * * * * * *

【答案解析】

该题非常简单,观察图形可以看出:

每行中*的个数相等,都是4个

每行中空格的个数在递增2个

每行先输出空格,然后输出*

按照以上方式通过循环来控制每行的输出内容即可

【代码实现】

#include<stdio.h> int main() { for (int i = 0; i < 5; ++i) { // 输出空格 for (int j = 0; j < i; ++j) printf(" "); // 输出* printf("* * * *\n"); } return 0; }

【结果截屏】

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

12. 有一行电文,以按下面规律译成密码: A--->Z a--->z B--->Y b--->Y C--->X c--->x ……

即第1个字母编程第26个字母,第i个字母编程第(26-i+1)个字母,非字母字符不变,要求编程序将密码译回原文,并输出密码和原文。

【答案解析】

从题目给的实例中可以看到,编码规则非常简单,就是将从前往后数的第i个字母转化为从后往前数的第i个字母。

那解压时直接反过来转换即可:

即\'Z\'--->\'A\' \'z\'--->\'a\'

​ \'Y\'--->\'B\' \'y\'--->\'b\'

​ \'X\'--->\'C\' \'x\'--->\'c\'

假设如果当前拿到的是小写字母,转换方式如下:

先用s[i] - \'a\'计算出s[i]是26个字母中从前往后数的第几个

再用26 - (s[i]- \'a\') - 1 转换为26个字母中从后往前数的第几个

在2的结果上加上\'a\',即转换为对应从后往前的第几个字母

大写字母转换方式与上述相同,将上述每条中的\'a\'换为‘A’即可。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwyyyz.html