精华内容
下载资源
问答
  • C语言程序设计第五版 谭浩强 第五版课后答案

    万次阅读 多人点赞 2019-06-16 00:27:29
    谭浩强 C语言程序设计第五版 第4章课后答案 3.求两个正整数m和n,求其最大公约数和最小公倍数。 #include<stdio.h> void main() { int m, n, t, i, a = 1; scanf("%d%d", &m, &n); if (m < n) ...

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

    点我看视频讲解+可运行源码
    记得一键三连哦

    c程序设计

    第一章

    在这里插入图片描述

    1.什么是程序?什么是程序设计?

    • 程序:就是一组能识别和执行的指令,每一条指令使计算机执行特定的操作

    • 程序设计:是指从确定任务到得到结果、写出文档的全过程

    2.为什么需要计算机语言?高级语言有哪些特点?

    • 为什么需要计算机语言:计算机语言解决了人和计算机交流是的语言问题,使得计算机和人都能识别

    • 高级语言有哪些特点:
      2.1 高级语言的数据结构要比汇编和机器语言丰富;
      2.2 高级语言与具体机器结构的关联没有汇编以及机器语言密切;
      2.3 高级语言更接近自然语言更容易掌握;
      2.4 高级语言编写的程序要经过编译或解释计算机才能执行;

    3.正确理解以下名词及其含义:

    (1)源程序,目标程序,可执行程序。

    • ​源程序:指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令

    • 目标程序:为源程序经编译可直接被计算机运行的机器码集合,在计算机文件上以.obj作扩展名

    • 可执行程序:将所有编译后得到的目标模块连接装配起来,在与函数库相连接成为一个整体,生成一个可供计算机执行的目标程序,成为可执行程序

    (2)程序编辑,程序编译,程序连接。

    程序编辑:上机输入或者编辑源程序。

    程序编译:

    • 先用C提供的“预处理器”,对程序中的预处理指令进行编译预处理
    • 对源程序进行语法检查, 判断是否有语法错误,直到没有语法错误未知
    • 编译程序自动把源程序转换为二进制形式的目标程序

    程序连接:将所有编译后得到的目标模块连接装配起来,在与函数库相连接成为一个整体的过程称之为程序连接

    (3)程序,程序模块,程序文件。

    • 程序:一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具

    • 程序模块:可由汇编程序、编译程序、装入程序或翻译程序作为一个整体来处理的一级独立的、可识别的程序指令

    • 程序文件:程序的文件称为程序文件,程序文件存储的是程序,包括源程序和可执行程序

    (4)函数,主函数,被调用函数,库函数。

    • 函数:将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,来完成一定功能

    • 主函数:又称main函数,是程序执行的起点

    • 被调用函数:由一个函数调用另一个函数,则称第二个函数为被调用函数

    • 库函数:一般是指编译器提供的可在c源程序中调用的函数。可分为两类,一类是c语言标准规定的库函数,一类是

    ​ 编译器特定的库函数

    (5)程序调试,程序测试。
    • 程序调试:是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程

    • 程序测试:是指对一个完成了全部或部分功能、模块的计算机程序在正式使用前的检测,以确保该程序能按预定的方式正确地运行

    4.编写一个C程序,运行时输出

    Hello World!
    这个程序是一些国外C教材中作为第一个程序例子介绍的,一般称为Hello程序。

    代码示例:

    #include <stdio.h>
    
    int main()
    {
    	printf("%s\n", "Hello World!");
    	return 0;
    }
    

    运行截图:

    C程序设计第五版谭浩强第4题答案

    5.编写一个C程序,运行时输出以下图形:

    ****

    ****

    ​ ****

    ​ ****

    代码示例:

    #include <stdio.h>
    
    int main()
    {
    	for (int i = 0; i < 4; i++)
    	{
    		for (int j = 0; j < i; j++)
    		{
    			printf("%s", "  ");
    		}
    		printf("%s\n", "*****");
    	}
    	return 0;
    }
    

    运行截图:

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

    6.编写一个C程序,运行时输人a,b,c三个值,输出其中值最大者。

    代码示例:

    #include<stdio.h>
    
    int main()
    {
    	int a, b, c, max;
    	printf("请输入三个数:\n");
    
    	scanf("%d%d%d", &a, &b, &c);
    	if (a > b)
    	{
    		max = a;
    	}
    	else
    	{
    		max = b;
    	}
    
    	if (c > max)
    	{
    		max = c;
    	}
    	printf("三个数中最大的数为:%d", max);
    	return 0;
    
    }
    

    运行截图:

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

    7.看懂《C程序设计(第五版)学习辅导》第16章中介绍的用Visual Studio 2010对C程序进行编辑、编译、连接和运行的方法,并进行以下操作:

    (1)建立一个新项目,定名为project1.

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

    (2)建立一个新文件,定名为test1。

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

    (3)向test1 文件输人源程序(此源程序为读者自己编写的程序)。

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

    (4)编译该源程序,如发现程序有错,请修改之,直到不出现“编译出错”为止。

    (5)连接并运行, 得到结果。分析结果。

    C程序设计第五版课后答案

    点我看视频讲解+可运行源码
    记得一键三连哦

    更多相关文章

    C程序设计第五版谭浩强课后习题答案 第一章
    C程序设计第五版谭浩强课后习题答案 第二章
    C程序设计第五版谭浩强课后习题答案 第三章
    C程序序设计第五版谭浩强课后习题答案 第四章
    C语言程序设计第五版谭浩强课后习题答案 第五章
    C语言程序设计第五版谭浩强课后习题答案 第六章
    C语言程序设计第五版谭浩强课后习题答案 第七章
    C语言程序设计第五版谭浩强课后习题答案 第八章
    C语言程序设计第五版谭浩强课后习题答案 第九章
    C语言程序设计第五版谭浩强课后习题答案 第十章

    展开全文
  • 谭浩强C语言程序设计第五版 第4章 课后习题 答案 1.什么是算术运算?什么是关系运算?什么是逻辑运算? 答:算术运算时数学里基础的加减乘数求余数等;关系运算时求两个或者多个变量或者表达式之间的关系;逻辑运算...

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

    点我看视频讲解+可运行源码
    记得一键三连哦

    第四章 选择结构程序设计

    1. 什么是算术运算?什么是关系运算?什么是逻辑运算?

    【答案解析】

    算熟运算:

    算术运算即“四则运算”,是加法、减法、乘法、除法、乘方、开方等几种运算的统称。

    其中加减为一级运算,乘除为二级运算,乘方、开方为三级运算。在一道算式中,如果有多级运算存在,则应先进行高级运算,再进行低一级的运算。

    C语言中的算熟运算符包括:+-*/++--% 等种类。

    如果只存在同级运算;则从左至右的顺序进行;如果算式中有括号,则应先算括号里边,再按上述规则进行计算。

    示例:$ (1 + 1)^{2} * 4+5 * 3$

    解析:

    1. 先进行括号内运算1+1,然后进行乘方运算得到结果4.
    2. 接下来与4相乘,得到结果16
    3. 因为乘法优先级大于加法,因此先进行5*3,得到结果15
    4. 最终相加得到结果31

    结果:31

    关系运算:

    关系的基本运算有两类:一类是传统的集合运算(并、差、交等),另一类是专门的关系运算(选择、投影、连接、除法、外连接等),而在C语言中,关系运算通常被认为是比较运算,将两个数值进行比较,判断比较结果是否符合给定的条件。

    常见的关系运算符包括:<<=>>===!= 等种类。

    其中,前4种关系运算符(<、<=、>、>= )的优先级别相同,后2种(==、!=)也相同。而前4种高于后2种。

    例如, > 优先于 == 。而 >< 优先级相同。
    并且,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符(=)。

    逻辑运算:

    在逻辑代数中,有与、或、非三种基本逻辑运算。表示逻辑运算的方法有多种,如语句描述、逻辑代数式、真值表、卡诺图等。而在C语言中,逻辑运算通常用于使用逻辑运算符将关系表达式或其它逻辑量连接起来组成逻辑表达式用来测试真假值。

    常见的逻辑运算符包括:&&||! 等种类

    && 与是双目运算符,要求有两个运算对象,表示两个运算对象都成立,则结果为真,否则结果为假。

    例如:(a<b) && (x>y),表示(a<b)和(x>y)同时成立则为真。

    ||:是双目运算符,要求有两个运算对象,表示两个运算对象只要任意一个成立,则结果为真,否则结果为假。

    例如:(a<b) && (x>y),表示(a<b)和(x>y)两个对象中任意一个成立则结果为真。

    **!**是单目运算符,只要求有一个运算对象,表示取运算对象反义,运算对象为真则结果为假,运算对象结果为假则结果为真。

    例如:!(a>b),表示(a>b)成立时结果为假,不成立时结果为真。

    若在一个逻辑表达式中包含多个逻辑运算符,则优先次序为: ! > && > ||。当然若一个逻辑表达式中包含括号括起来的子逻辑,则优先括号内的子逻辑判断。

    示例:

    (1>2)||(2>3)&&(4>3) 结果为0
    !(1>2)||(2>3)&&(4>3)结果为1

    注:&&优先级大于||,((2>3)&&(4>3))无法同时成立,则结果为假,然后与(1>2)结果进行逻辑或运算,两者都为假因此第一次结果为假。 而第二次!优先级最高,先对(1>2)的结果取逻辑非,得到结果为真,因此结果为真。

    2. C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?

    答案:

    在C语言中逻辑常量只有两个,即0和1,用来表示两个对立的逻辑状态,其中0表示假,1表示真。

    逻辑变量与普通代数一样,也可以用字母、符号、数字及其组合成为的逻辑表达式表示。

    对于系统来说,判断一个逻辑量的值时,系统会以0作为假,以非0作为真。例如3&&5的值为真,系统给出3&&5的值为1

    3. 写出下面各逻辑表达式的值。设a=3,b=4,c=5。

    (1)a + b > c && b == c

    (2)a || b + c && b - c

    (3)!(a > b) && !c || 1

    (4)!(x = a) && (y = b) && 0

    (5)!(a + b) + c - 1 && b + c / 2

    解题思路:

    1. 关系运算符的优先级高于赋值运算符,但是低于算术运算符;
    2. &&表示两边条件同为真则成立,||表示两边条件任意一个为真则成立,!取条件反义。
    3. 逻辑运算符优先级: ! > && > ||
    4. 有括号优先括号。
    3.1 题目:a + b > c && b == c -> 3+4>5&&4==5

    解析: 3+4>5 优先3+4得到结果7,因此7>5结果为真; 4==5为假,一真一假逻辑与最终结果为假。

    答案: 0

    #include <stdio.h>
    int main()
    {
    	int a = 3, b = 4, c = 5;
    	printf("%d\n", a || b + c && b - c);
    	system("pause");//这一句是为了让控制台不退出
    	return 0;
    }
    

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

    3.2 题目:a || b + c && b - c -> 3||4 + 5 && 4-5

    解析: 优先算术运算4+5得到7,非0则为真,4-5得到-1,非0则为真,接下来逻辑与判断,最终逻辑或判断

    答案: 1

    #include <stdio.h>
    int main()
    {
    	int a = 3, b = 4, c = 5;
    	printf("%d\n", a || b + c && b - c);
    	system("pause");//这一句是为了让控制台不退出
    	return 0;
    }
    

    C语言程序设计第五版

    3.3 题目:!(a > b) && !c || 1 -> !(3>4) && !5 || 1

    解析 : !优先级最高,!(3>4)最终结果为真,!5为假; 其次 &&,真&&假得到假,最终||,1为真,假或真为真

    答案: 1

    #include <stdio.h>
    int main()
    {
    	int a = 3, b = 4, c = 5;
    	printf("%d\n", !(a > b) && !c || 1);
    	system("pause");//这一句是为了让控制台不退出
    	return 0;
    }
    

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

    3.4 题目:!(x = a) && (y = b) && 0 -> !(x=3) && (y=4)&&0

    解析: 这里&&优先级最低是最后一个逻辑运算,因此不管如何,最终&&0,则肯定为假

    答案: 假-0

    #include <stdio.h>
    int main()
    {
    	int a = 3, b = 4, c = 5;
    	int x, y;
    	printf("%d\n", !(x = a) && (y = b) && 0);
    	system("pause");//这一句是为了让控制台不退出
    	return 0;
    }
    

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

    3.5 题目:!(a + b) + c - 1 && b + c / 2 -> !(3+4)+5-1 && 4+5/2

    解析: 在vs中优先对(a+b)取非得到0,0+5-1结果为4,因此最终为真(此题涉及不同平台结果不同的问题,因为在有的平台下编译器会优先算术运算,则最终取非得到结果为假)

    **答案: ** 1

    #include <stdio.h>
    int main()
    {
    	int a = 3, b = 4, c = 5;
    	printf("%d\n", !(a + b) + c - 1);
    	printf("%d\n", !(a + b) + c - 1 && b + c / 2);
    	system("pause");//这一句是为了让控制台不退出
    	return 0;
    }
    

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

    4. 有3个整数a, b, c,由键盘输入,输出其中最大的数。

    解题思路: 每个数字两两与剩余两个数字进行比较,若比剩下的两个数大则最大,例如:a>b && a>c则a是最大的

    答案:

    #include <stdio.h>
    int main()
    {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        if (a == b && a == c) {
            printf("Three numbers are equal\n");
        }else if (a == b && a > c) {
            printf("a and b are the largest number\n", a); 
        }else if (a == c && a > b) {
            printf("a and c are the largest number\n", a); 
        }else if (b == c && b > a) {
            printf("c and b are the largest number\n", a); 
        }else if (a > b && a > c) {
            printf("a=%d is the largest number\n", a); 
        }else if (b > a && b > c) {
            printf("b=%d is the largest number\n", b); 
        }else {
            printf("c=%d is the largest number\n", c); 
        }   
        return 0;
    }
    

    C语言程序设计第五版 谭浩强

    5.从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000 的正数。若不是,则要求重新输入。

    解题思路: 首先判断输入的数字是否大于1000且是正数,然后使用sqrt函数对数据进行取平方根,最主要的是最终在输出是调整输出格式,小数部分为0位,只需要正数部分,且整数部分不会超过4位,

    答案:

    #include <stdio.h>
    #include <math.h>
    int main()
    {
    	float a, b;
    	scanf_s("%f", &a);
    	if (a >= 1000 || a < 0) {
    		printf("请输入小于1000的正数\n");
    		scanf_s("%f", &a);
    		b = sqrt(a);
    	}
    	else {
    		b = sqrt(a);
    	}
    	printf("a=%4.0f, b=%4.0f\n", a, b);
    	system("pause");//这一句是为了让控制台不退出
    	return 0;
    }
    

    课后习题 答案

    6. 有一个函数,编写程序,输入x的值,输出y相应的值。

    y={x   (x<1)2x1  (1<=x<10)3x11(x>=10) y= \begin {cases} x\qquad\qquad\ \ \ (x<1)\\2x-1\qquad\ \ (1<=x<10)\\3x-11\qquad(x>=10) \end{cases}

    解题思路: 根据输入的不同x值进行条件判断,不同的条件采用不同的表达式进行计算即可

    答案:

    #include <stdio.h>
    int main()
    {
    	int x, y;
    	scanf_s("%d", &x);
    	if (x < 1) {
    		y = x;
    	}
    	else if (x >= 1 && x < 10) {
    		y = 2 * x - 1;
    	}
    	else {
    		y = 3 * x - 11;
    	}
    	printf("y = %d\n", y);
    	system("pause");//这一句是为了让控制台不退出
    	return 0;
    }
    

    C语言程序设计第五版第六题答案

    7. 有一个函数,

    y={1(x<0)0   (x=0)1   (x>0) y= \begin {cases} -1\qquad(x<0) \\ 0\qquad\ \ \ (x=0) \\ 1\qquad\ \ \ (x>0) \end{cases}

    有人编写了以下两个程序,请分析它们是否能实现题目要求。不要急于上机运行程序,先分析两个程序的逻辑,画出它们的流程图,分析它们的运行情况。然后,上机运行程序,观察和分析结果。

    #include <stdio.h>
    
    int main()
    {
    	int x, y;
        printf("enter x:");
        scanf("%d", &x);
        y=-1;
        if (x != 0)
    		if (x > 0)
                y=1;
        	else
            	y=0;
        printf("x=%d,y=%d\n", x, y);
        return 0;
    }
    

    解题思路: if语句使用过程中,else总是匹配距离自己最近的且没有配对的if,因此x!=0具有两种情况x>0和x<0;因此x==0时y保持-1;x!=0&&x>0时y=1;x!=0&&x<0时y=0。

    流程图:

    C语言程序设计第五版流程图

    答案:
    课后习题答案

    #include <stdio.h>
    
    int main()
    {
    	int x, y;
        printf("enter x:");
        scanf("%d", &x);
        y=0;
        if (x >= 0)
    		if (x > 0) y=1;
        	else y=-1;
        printf("x=%d,y=%d\n", x, y);
        return 0;
    }
    

    解题思路: if语句使用过程中,else总是匹配距离自己最近的且没有配对的if,因此x>=0具有两种情况x>0和x0;因此x<0时y保持0;x>=0&&x>0时y=1;x>=0&&x0时y=-1。

    流程图:

    c语言谭浩强课后习题答案

    答案:

    C语言程序设计第五版

    8. 给出一百分制成绩,要求输出成绩等级’A’、‘B’、‘C’、‘D’、‘E’。 90分以上为’A’,8089分为’B’,7079分为’C’ ,60~69分为’D’ ,60分以下为’E’。

    解题思路: 根据不同的阶段成绩区间作为成绩的判断条件,属于哪个区间则输出对应等级即可

    答案:

    #include <stdio.h>
    int main()
    {
    	int score;
    	printf("enter score:");
    	scanf_s("%d", &score);
    	if (score >= 90) {
    		printf("A\n");
    	}else if (score >= 80 && score < 90) {
    		printf("B\n");
    	}else if (score >= 70 && score < 80) {
    		printf("C\n");
    	}else if (score >= 60 && score < 70) {
    		printf("D\n");
    	}else {
    		printf("E\n");
    	}
    	system("pause");
    	return 0;
    }
    

    谭浩强第五版课后习题答案

    9. 给一个不多于5位的正整数,要求:①求出它是几位数;②分别输出每一位数字;③按逆序输出各位数字,例如原数为321,应输出123。

    ①求出它是几位数;

    解题思路: 大于10000就是5位,否则大于1000就是四位,否则大于100是三位…

    答案:

    #include <stdio.h>
    int main()
    {
    	int num;
    	printf("enter num:");
    	scanf_s("%d", &num);
    	if (num > 99999 || num < 0) {
    		printf("请输入0~99999之间的正数\n");
    		return -1;
    	}
    	if (num >= 10000) {
    		printf("5\n");
    	}else if (num >= 1000) {
    		printf("4\n");
    	}else if (num >= 100) {
    		printf("3\n");
    	}else if (num >= 10) {
    		printf("2\n");
    	}else {
    		printf("1\n");
    	}
    	system("pause");
    	return 0;
    }
    

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

    ②分别输出每一位数字;

    解题思路: 99999除以10000则输出9;9999除以1000则输出9,…

    答案:

    #include <stdio.h>
    int main()
    {
    	int num;
    	printf("enter num:");
    	scanf_s("%d", &num);
    	if (num > 99999 || num < 0) {
    		printf("请输入0~99999之间的数字\n");
    		return -1;
    	}
    	if (num / 10000 > 0) {//取出万位数字
    		printf("%d ", num / 10000);
    	}
    	if (num%10000 >= 1000) {//取余10000则可以取出低四位的数据,除以1000则得到千位的数字
    		printf("%d ", (num % 10000) / 1000);
    	}
    	if (num%1000 >= 100) {//取余1000则可以取出低三位的数据,除以100则得到百位的数字
    		printf("%d ", (num % 1000) / 100);
    	}
    	if (num%100 >= 10) {//取余100则可以取出低两位的数据,除以10则得到十位的数字
    		printf("%d ", (num % 100) / 10);
    	}
    	if (num%10 >= 0) {//取余10则取出个位数字
    		printf("%d ", num % 10);
    	}
    	printf("\n");
    	system("pause");
    	return 0;
    }
    

    第八题答案

    ③按逆序输出各位数字,例如原数为321,应输出123。

    解题思路: 思路与第二题相同,只不过将整个过程逆序即可

    答案:

    #include <stdio.h>
    int main()
    {
    	int num;
    	printf("enter num:");
    	scanf_s("%d", &num);
    	if (num > 99999 || num < 0) {
    		printf("请输入0~99999之间的数字\n");
    		return -1;
    	}
    	if (num % 10 >= 0) {
    		printf("%d ", num % 10);
    	}
    	if (num % 100 >= 10) {
    		printf("%d ", (num % 100) / 10);
    	}
    	if (num % 1000 >= 100) {
    		printf("%d ", (num % 1000) / 100);
    	}
    	if (num % 10000 >= 1000) {
    		printf("%d ", (num % 10000) / 1000);
    	}
    	if (num / 10000 > 0) {
    		printf("%d ", num / 10000);
    	}
    	printf("\n");
    	system("pause");
    	return 0;
    }
    

    C语言程序设计第五版习题答案

    10.企业发放的奖金根据利润提成。利润I低于或等于100000元的,奖金可提成10%;利润高于100000元,低于200000元(100000<I≤200000)时,低于100000元的部分按10%提成,高于100000元的部分,可提成7. 5%;200000<I≤400000时,低于200000元的部分仍按上述办法提成(下同)。高于200000元的部分按5%提成;400000<<I≤600000元时,高于400000元的部分按3%提成;600000<1≤1000000时,高于600000元的部分按1.5%提成;I>1000000时,超过1000000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。要求:(1) 使用if语句编写程序。(2) 使用switch语句编写程序。

    (1) 使用if语句编写程序。

    解题思路: 先将每一档的最大奖金算出来,在某一个区间时,则那小于这一档的奖金加上多出部分的奖金即可,例如:

    先列出100000档的奖金是10000,则180000就是10000 + (180000-100000) * 0.075;

    列出200000档的奖金是第一档加上多出100000部分的7.5%得到17500,则300000就是17500 + (300000-200000)*0.05;

    答案:

    #include <stdio.h>
    int main()
    {
    	double I, salary = 0;
    	printf("enter performance:");
    	scanf_s("%lf", &I);
    	if (I < 0) {
    		printf("请输入一个正数\n");
    		system("pause");
    		return -1;
    	}
    	double salary1 = 100000 * 0.1;//10万的奖金
    	double salary2 = (200000 - 100000) * 0.075 + salary1;//20万的奖金
    	double salary3 = (400000 - 200000) * 0.05 + salary2;//40万的奖金
    	double salary4 = (600000 - 400000) * 0.03 + salary3;//60万的奖金
    	double salary5 = (1000000 - 600000) * 0.015 + salary4;//100万的奖金
    	if (I <= 100000) {
    		salary = I * 0.1;//小于100000按10%提成
    	}else if (I > 100000 && I <= 200000) {
    		salary = salary1 + (I - 100000) * 0.075;//多出10万的按比例计算,加上10w的奖金
    	}else if (I > 200000 && I <= 400000) {
    		salary = salary2 + (I - 200000) * 0.05;//多出20万的按比例计算,加上20w的奖金
    	}else if (I > 400000 && I <= 600000) {
    		salary = salary3 + (I - 400000) * 0.03;//多出40万的按比例计算,加上40w的奖金
    	}else if (I > 600000 && I <= 1000000) {
    		salary = salary4 + (I - 600000) * 0.015;//多出60万的按比例计算,加上60w的奖金
    	}else if (I > 1000000){
    		salary = salary5 + (I - 1000000) * 0.01;//多出100万的按比例计算,加上100w的奖金
    	}
    	printf("salary:%f\n", salary);
    	system("pause");
    	return 0;
    }
    

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

    (2) 使用switch语句编写程序。

    解题思路: 与第一题思路没有太大差别,区别在于switch语句的case子句中需要是一个常量整数,并且switch中若子句中没有break将循序向下执行,直到遇到break才会跳出switch语句,如果这时候将利润除以10w,则得到09的数字,其中0表示小于10w,1表示介于1020w,2、3表示介于2040w,4、5表示介于4060w,6、7、8、9表示介于60~100w,否则就是大于100w

    答案:

    #include <stdio.h>
    int main()
    {
    	double I, salary = 0;
    	printf("enter performance:");
    	scanf_s("%lf", &I);
    	if (I < 0) {
    		printf("请输入一个正数\n");
    		system("pause");
    		return -1;
    	}
    	double salary1 = 100000 * 0.1;//大于100000时0~100000的奖金
    	double salary2 = (200000 - 100000) * 0.075 + salary1;//大于200000时0~20万的奖金
    	double salary3 = (400000 - 200000) * 0.05 + salary2;//大于400000时0~40万的奖金
    	double salary4 = (600000 - 400000) * 0.03 + salary3;//大于600000时0~60万的奖金
    	double salary5 = (1000000 - 600000) * 0.015 + salary4;//大于1000000时0~100万的奖金
    	int grade = I / 100000;
    	switch(grade) {
    		case 0:
    			salary = I * 0.1; break;
    		case 1:
    			salary = salary1 + (I - 100000) * 0.075; break;
    		case 2://会顺序执行到下一个breakcase 3:
    			salary = salary2 + (I - 200000) * 0.05; break;
    		case 4:
    		case 5:
    			salary = salary3 + (I - 400000) * 0.03; break;
    		case 6:
    		case 7:
    		case 8:
    		case 9:
    			salary = salary4 + (I - 600000) * 0.015; break;
    		default:
    			salary = salary5 + (I - 1000000) * 0.01; break;
    	}
    	printf("salary:%f\n", salary);
    	system("pause");
    	return 0;
    }
    

    c语言谭浩强课后答案

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

    解题思路: 四个数中先找到最小的,剩下的三个数中找到第二小的,剩下的两个数中找到第三小的。

    答案:

    #include <stdio.h>
    int main()
    {
    	int a, b, c, d;
    	int max_num;
    	scanf_s("%d %d %d %d", &a, &b, &c, &d);
    	int tmp;
    	//找到最小的数
    	if (a > b) {
    		tmp = a; a = b; b = tmp; // a>b两个数据交换,则给a存储小的b
    	}
    	if (a > c) {
    		tmp = a; a = c; c = tmp;
    	}
    	if (a > d) {
    		tmp = a; a = d; d = tmp;
    	}
    	//找到第二小的数,不需要和最小的数比较
    	if (b > c) {
    		tmp = b; b = c; c = tmp;
    	}
    	if (b > d) {
    		tmp = b; b = d; d = tmp;
    	}
    	//找到第三小的数据,不需要和第一和第二小比较
    	if (c > d) {
    		tmp = c; c = d; d = tmp;
    	}
    	printf("%d %d %d %d\n", a, b, c, d);
    	system("pause");
    	return 0;
    }
    

    c语言程序设计第五版第11题答案

    12. 有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1,见图。这4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。

    第12题

    解题思路: 塔的半径为1m,则x坐标小于-3或者大于3,以及y坐标大于3或者小于-3则都是0m的建筑;其余则判断输入的坐标是否在各个圆塔的圆形范围内。该点到各个圆心的距离是否大于1,小于则是10m建筑,否则为0m建筑。

    math.h中提供了fabs(double)求一个浮点数的绝对值,输入x,y坐标

    fabs(fabs(x) - 2)得到输入坐标距离圆心的横轴距离;

    fabs(fabs(y) - 2)得到舒服坐标距离圆心的纵轴距离;

    三角形两个直角边长平方相加,然后开平方根得到第三边长,若大于1,则不再圆塔范围内。

    答案:

    #include <stdio.h>
    #include <math.h>
    void main()
    {
    	int h;
    	double x, y, m, n, r;
    	printf("Please input a coordinate (x,y):");
    	scanf_s("%lf,%lf", &x, &y);
    	if (fabs(x) > 3 || fabs(y) > 3) {
    		h = 0;
    		printf("The height of the coordinate(%f,%f):h=%d\n", x, y, h);
    		return 0;
    	}
    	m = fabs(x) - 2; n = fabs(y) - 2;
    	r = sqrt(m * m + n * n);
    	if (r > 1)
    		h = 0;
    	else
    		h = 10;
    	printf("The height of the coordinate(%f,%f):h=%d\n", x, y, h);
    	system("pause");
    	return 0;
    }
    

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

    点我看视频讲解+可运行源码
    记得一键三连哦

    更多相关文章

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

    展开全文
  • C语言程序设计第五版谭浩强 第七章答案

    万次阅读 多人点赞 2019-06-16 18:22:35
    C语言程序设计第五版谭浩强著 第七章答案 1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。 如有问题欢迎下方留言评论 #include<stdio.h> ...

    C语言程序设计第五版谭浩强著 第七章答案

    在这里插入图片描述

    第七章 用函数实现模块化程序设计

    1、写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输人。

    题目解析:

    • 该题直接使用“辗转相除法”来求解最大公约数和最小公倍数

    • 最大公约数找出两数中的最小值,然后直接相模,当能够同时被两数整除时,则为最大公约数。

    • 最小公倍数找出两数中的最大值,然后直接进入死循环,直到找到一个数能够同时被两数整除时,则为最小公倍数

    【注】此题还有一些比较高级的解法,比如求最大公约数的相减法、欧几里德辗转相除法等,有兴趣的同学可以查询相关资料

    代码示例:

    #include<stdio.h>
    
    //最大公约数
    size_t GCD(size_t a, size_t b)
    {      
    	
    	size_t gcd;      
    	gcd = a > b ? b : a;
    	while(gcd > 1)  
    	{
    		if((a % gcd == 0) && (b % gcd == 0))   
    			return gcd; 
    		gcd--; 
    	}
    	return gcd;
    }
    
    //最小公倍数
    size_t LCM(size_t a, size_t b)
    {
    	size_t lcm;
    	lcm = a > b ? a : b;
    	while(1)
    	{
    		if((lcm % a==0) && (lcm % b==0))
    			break;
    		lcm++;
    	}
    	return lcm;
    }
    
    int main()
    {
    	size_t a, b, result;
    	printf("请输入两个整数:>");
    	scanf("%d %d", &a, &b);
    
    	result = GCD(a, b);
    	printf("%d和%d的最大公约数为:%d\n", a, b, result);
    	result = LCM(a, b);
    	printf("%d和%d的最小公倍数为:%d\n", a, b, result);
    
    	return 0;
    }
    

    运行结果:

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

    2、求方程 ax2+bx+c=0{ax}^2+bx+c=0的根,用3个函数分别求当: b24acb^2-4ac大于0、等于0和小于0时的根并输出结果。从主函数输入a,b,c的值。

    题目解析

    • 根据disc = b24acb^2-4ac 的值来决定如何求根,题目本身编程不难,不过需要同学们复习一下高中的数学知识哦。

    代码示例

    #include<stdio.h>
    #include<math.h>
    
    //x1为第一个根,x2为第二个根
    float x1, x2, disc, p, q;
    
    void greater_than_zero(float a, float b)
    {
    	float m = sqrt(disc);
    	x1 = (-b + sqrt(disc)) / (2 * a);
    	x2 = (-b - sqrt(disc)) / (2 * a);
    }
    
    void equal_to_zero(float a, float b)
    {
    	x1 = x2 = (-b) / (2 * a);
    }
    
    void smaller_than_zero(float a, float b)
    {
    	p = -b / (2 * a);
    	q = sqrt(-disc) / (2 * a);
    }
    
    int main()
    {
    	int a, b, c;
    	printf("请输入 a b c:");
    	scanf("%d %d %d", &a, &b, &c);
    
    	printf("表达式为: %d*x^2+%d*x+%d = 0\n", a, b, c);
    	disc = b*b - 4 * a*c;
    
    	if (disc > 0)
    	{
    		greater_than_zero(a, b);
    		printf("disc>0的根为: x1=%f    x2=%f\n", x1, x2);
    	}
    	else if (disc == 0)
    	{
    		equal_to_zero(a, b);
    		printf("disc==0的根为:x1=%f    x2=%f\n", x1, x2);
    	}
    	else
    	{
    		smaller_than_zero(a, b);
    		printf("disc<0的根为:x1=%f+%f x2=%f-%f\n", p, q, p, q);
    	}
    	return 0;
    }
    

    运行结果:

    课后答案

    3、写一个判素数的函数,在主函数输人一个整数,输出是否为素数的信息。

    题目解析:

    • 素数是一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做素数

    • 该题可以使用概念直接判断法求解,不过不需要判断所有的数据,只需要判断数据的一半即可,因为偶数不可能为素数(除了2),所以只需判断该数的一半即可的到答案

    代码示例:

    #include<stdio.h>
    #include<stdbool.h>
    
    bool IsPrime(int value)
    {
    	for(int i=2; i<value/2; ++i)
    	{
    		if(value % i == 0) //说明除了1和本身之外,还能被其他数整除
    			return false;
    	}
    	return true;
    }
    
    int main()
    {
    	int value;
    	bool flag;
    	printf("请输入 value :>");
    	scanf("%d", &value);
    	
    	flag = IsPrime(value);
    	if(flag)
    		printf("%d 是素数.\n", value);
    	else
    		printf("%d 不是素数.\n", value);
    
    	return 0;
    }
    

    运行结果:

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

    4、写一个函数,使给定的一个3X3的二维整型数组转置,即行列互换。

    题目解析:

    进行数组的行列互换,其关键在于数组互换的表达式 ar[i] [j] = ar[j] [i];其次在循环的时候,内层循环不能到达最大列,需要根据此时是第几行的交换来决定循环的次数,否则有可能数组行列交换之后最后又交换回原来的形状了。

    代码示例

    #include<stdio.h>
    
    void PrintArray(int ar[3][3])
    {
    	for(int i=0; i<3; ++i)
    	{
    		for(int j=0; j<3; ++j)
    		{
    			printf("%d ", ar[i][j]);
    		}
    		printf("\n");
    	}
    }
    
    void ReverseArray(int ar[3][3])
    {
    	int tmp;
    	for(int i=0; i<3; ++i)
    	{
    		for(int j=0; j<i; ++j)
    		{
    			if(i != j) //中间数不发生变化
    			{
    				//交换两个数
    				tmp = ar[i][j];
    				ar[i][j] = ar[j][i];
    				ar[j][i] = tmp;
    			}
    			
    		}
    	}
    }
    
    int main()
    {
    	int array[3][3] = 
    	{
    		{1,2,3},
    		{4,5,6},
    		{7,8,9}
    	};
    
    	printf("转置前:\n");
    	PrintArray(array);
    
    	//进行数组转置
    	ReverseArray(array);
    
    	printf("转置后:\n");
    	PrintArray(array);
    
    	return 0;
    }
    

    运行结果:

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

    5、写一个函数,使输人的一个字符串按反序存放,在主函数中输入和输出字符串。

    题目解析及答案:

    • 要把一个字符串反序存放,其实就是对字符串做一个逆序操作,操作过程为收尾字符交换,直到把所有字符全部交换完毕。

    示例代码

    #include<stdio.h>
    
    void ReverseString(char str[])
    {
    	int start, end;
    	char tmp;
    	start = 0;
    	end = strlen(str)-1; //字符数组小标从0开始,所以-1
    	while(start < end)
    	{
    		tmp = str[start];
    		str[start] = str[end];
    		str[end] = tmp;
    
    		start++;
    		end--;
    	}
    }
    
    int main()
    {
    	char str[100] = {0};
    	printf("请输入一个字符串:>");
    	scanf("%s", str);
    	printf("原始字符串为:> %s\n", str);
    	ReverseString(str);
    	printf("反序字符串为:> %s\n", str);
    	return 0;
    }
    

    运行结果:

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

    6、写一个函数,将两个字符串连接。

    题目解析及答案:

    • 利用一个临时数组,空间要保证能够容纳两个字符串,先把第一个字符串进行拷贝到临时数组,第二个字符串在临时数组的尾部接着链接,最后记得加上字符串的结束标记\0即可

    代码示例:

    #include<stdio.h>
    
    void ConcatStr(char string1[], char string2[], char string[])
    {
    	int i, j;
    	for (i = 0; string1[i] != '\0'; i++)
    		string[i] = string1[i];
    	
    	//找到字符串末尾,继续往后面链接字符串
    	for (j = 0; string2[j] != '\0'; j++)
    		string[i + j] = string2[j];
    
    	//字符串末尾加上结束符 \0
    	string[i + j] = '\0';
    }
    
    int main()
    {
    	char s1[200] = {0}, s2[100]= {0}, s[100] = {0};
    	printf("input string1:");
    	scanf("%s", s1);
    	printf("input string2:");
    	scanf("%s", s2);
    	ConcatStr(s1, s2, s);
    	printf("\nThe new string is %s\n", s);
    	return 0;
    }
    

    运行结果:

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

    7、写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。

    题目解析:

    • 该题的重点在于元音字母的判断,通过或条件,凡是元音字母都进行拷贝

    代码示例:

    #include<stdio.h>
    
    void cpy(char s[], char c[])
    {
    	int i, j;
    	for (i = 0, j = 0; s[i] != '\0'; i++)
    	{
    		//判断元音字母
    		if (s[i] == 'a' || s[i] == 'A' || s[i] == 'e' || s[i] == 'E' || 
    			s[i] == 'i' ||s[i] == 'I' || s[i] == 'o' || s[i] == 'O' ||
                s[i] == 'u' || s[i] == 'U')
    		{
    			c[j] = s[i];
    			j++;
    		}
    	}
    	c[j] = '\0';
    }
    
    int main()
    {
    	char str[80], c[80];
    	printf("input string:");
    	gets(str);
    	cpy(str, c); //将str中的元音字母拷贝到c中
    	printf("The vowel letters are:%s\n", c);
    	return 0;
    }
    

    运行结果:

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

    8、写一个函数,输人一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输人1990,应输出“1 9 9 0”。

    题目解析:

    对字符串进行遍历输出,没输出一个字符,后面就跟着输出一个空格,关键点在于如果输出的是最后一个字符,则不能在输出字符,所以要对是否是最后一个字符的输出进行判断。

    代码示例:

    #include<stdio.h>
    
    void OutString(char str[])
    {
    	int i = 0;
    	while(str[i] != '\0')
    	{
    		printf("%c", str[i]);
    		if(str[i+1] == '\0') //清除最后一个空格不输出
    			break;
    		printf("%c", ' ');
    		i++;
    	}
    	printf("\n");
    }
    int main()
    {
    	char str[5] = {0};
    	printf("input four digits:");
    	scanf("%s", str);
    	OutString(str);
    
    	return 0;
    }
    

    运行结果:

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

    9、编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输人字符串以及输出上述的结果。

    题目解析:

    • 该题的关键在于要能够写出各种字符统计的条件

    代码示例:

    #include<stdio.h>
    
    int letter, digit, space, others;
    
    void CountChar(char str[])
    {
    	int i;
    	for (i = 0; str[i] != '\0'; i++)
    	{
            //统计字母
    		if ((str[i] >= 'a'&& str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) 
    			letter++;
    		else if (str[i] >= '0' && str[i] <= '9') //统计数字
    			digit++;
    		else if (str[i] == ' ')//统计空格
    			space++;
    		else
    			others++;  //统计其他字符
    	}
    }
    
    int main()
    {
    	char text[80];
    	printf("input string:\n");
    	gets(text);
    	printf("string: %s\n", text);
    
    	CountChar(text);
    	printf("\nletter:%d\ndigit:%d\nspace:%d\nothers:%d\n", letter, digit, space, others);
    	return 0;
    }
    

    运行结果:

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

    10、写一个函数,输人一行字符,将此字符串中最长的单词输出。

    题目解析及答案:

    • 单词以空格进行分隔,因此寻找空格出现的位置即为关键,每次从单词的起始到空格出现的位置即为一个单词,此时计算单词的长度,如果比当前最大的还长,就进行跟新最长单词信息,当整个字符串遍历完成,word即保存最长字符串。

    代码示例:

    #include<stdio.h>
    #include<string.h>
    
    void LongestWord(char str[], char word[])
    {
    	int max_len = 0;
    	int len = 0;
    	int i = 0;
    	while(str[i] != '\0')
    	{
    		if(str[i] == ' ')
    		{
    			str[i] = '\0';
    			len = strlen(str);
    			if(len > max_len)
    			{
    				max_len  = len;
    				strcpy(word, str);
    				str = str + len + 1;
    			}
    		}
    		i++;
    	}
    }
    
    int main()
    {
    	char line[100] = {0};
    	char word[100] = {0};
    	printf("input one line:\n");
    	gets(line);
    
    	LongestWord(line, word);
    
    	printf("The longest word is : %s\n", word);
    	return 0;
    }
    

    运行结果:

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

    11、写一个函数,用“起泡法”对输人的10个字符按由小到大顺序排列。

    题目解析及答案:

    • 该题主要是对冒泡排序的理解,外层循环控制排序的趟数,内层循环主要是进行每一趟排序的比较,如果前面的字符大于后面的字符,就进行交换,每做一趟排序,就把一个最大字符排在最后,以及每做一趟排序就需要少比较一个字符。

    代码示例:

    #include<stdio.h>
    #include<string.h>
    
    void BubbleSort(char str[])
    {
    	int i, j;
    	char tmp;
    	int len = strlen(str);
    	for(i=0; i<len-1; ++i)
    	{
    		for(j=0; j<len-i-1; ++j)
    		{
    			if(str[j] > str[j+1])
    			{
    				tmp = str[j];
    				str[j] = str[j+1];
    				str[j+1] = tmp;
    			}
    		}
    	}
    }
    
    int main()
    {
    	int i;
    	char str[11] = {0};
    	printf("请输入10个字符:>");
    	for(i=0; i<10; ++i)
    		scanf("%c", &str[i]);
    
    	BubbleSort(str);
    
    	printf("string sorted: %s\n", str);
    	return 0;
    }
    

    运行结果:

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

    12、用牛顿迭代法求根。方程为ax3+bx2+cx+d=0ax^3+bx^2 +cx+d=0,系数a,b,c,d的值依次为1,2,3,4,由主函数输人。求x在1附近的一个实根。求出根后由主函数输出。

    题目解析及答案:

    • 此题的难点并不是编程,主要是要理解数学公式的求解方法,理解之后代码的实现并不困难。

    代码示例:

    #include<stdio.h>
    #include<math.h>
    
    float solut(int a, int b, int c, int d)
    {
    	float x = 1, x0, f, f1;
    	do
    	{
    		x0 = x;
    		f = ((a*x0 + b)*x0 + c)*x0 + d;
    		f1 = (3 * a*x0 + 2 * b)*x0 + c;
    		x = x0 - f / f1;
    	} while (fabs(x - x0) >= 1e-3);
    	return(x);
    }
    
    int main()
    {
    	int a, b, c, d;
    	printf("input a,b,c,d:");
    	scanf("%d %d %d %d", &a, &b, &c, &d);
    	printf("x=%10.7f\n", solut(a, b, c, d));
    	return 0;
    }
    

    运行结果:

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

    13.用递归方法求n阶勒让德多项式的值,递归公式为

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

    题目解析及答案:

    • 递归函数的设计,有一个点非常重要,那就是必须要有返回条件,,此题中的返回条件即为n0和n1时,因为当n为这两值时,程序直接返回相应的值,只有n>=1时,才进行递归运算。

    代码示例:

    #include<stdio.h>
    
    double polya(int n,int x)
    {
    	double result; 
    	if(n == 0)  
    		result = 1;  
    	if(n == 1)
    		result = x; 
    	if(n>1)
    		result = ((2*n-1)*x*polya(n-1,x)-(n-1)*polya(n-2,x))/n;    
    	return result;
    }
    
    int main()
    { 
    	int x,n; 
    	scanf("%d %d", &n, &x); 
    	printf("%.2f\n", polya(n,x)); 
    	return 0;
    }
    

    运行结果:

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

    14、输人10个学生5门课的成绩,分别用函数实现下列功能:

    ①计算每个学生的平均分;
    ②计算每门课的平均分;
    ③找出所有50个分数中最高的分数所对应的学生和课程;
    ④计算平均分方差:

    其中,x;为某一学生的平均分。

    题目解析及答案:

    • 此题的关键是如何存储某个学生对应某门课程的分数,这里利用了一个二维数组score,其中score[i] [j]就代表了第i个学生的第j门课程的分数,只要能够理解这个存储方式,其余的计算就是比较容易理解和实现的。

    代码示例:

    #include<stdio.h>
    
    #define N 10
    #define M 5
    float score[N][M];
    float a_stu[N], a_cour[M];
    int r, c;
    
    //输入学生成绩信息函数
    void input_stu(void)
    {
    	int i, j;
    	for (i = 0; i < N; i++)
    	{
    		printf("\ninput score of student%2d:\n", i + 1);
    		for (j = 0; j < M; j++)
    			scanf("%f", &score[i][j]);
    	}
    }
    
    //每个学生平均分
    void aver_stu(void)
    {
    	int i, j;
    	float s;
    	for (i = 0; i < N; i++)
    	{
    		for (j = 0, s = 0; j < M; j++)
    			s += score[i][j];
    		a_stu[i] = s / 5.0;
    	}
    }
    
    //每门课程平均分
    void aver_cour(void)
    {
    	int i, j;
    	float s;
    	for (j = 0; j < M; j++)
    	{
    		s = 0;
    		for (i = 0; i < N; i++)
    			s += score[i][j];
    		a_cour[j] = s / (float)N;
    	}
    }
    
    //最高分函数
    float highest()
    {
    	float high;
    	int i, j;
    	high = score[0][0];
    	for (i = 0; i < N; i++)
    	for (j = 0; j<M; j++)
    	if (score[i][j]>high)
    	{
    		high = score[i][j];
    		r = i + 1;
    		c = j + 1;
    	}
    	return(high);
    }
    
    //方差函数
    float s_var(void)
    {
    	int i;
    	float sumx, sumxn;
    	sumx = 0.0;
    	sumxn = 0.0;
    	for (i = 0; i < N; i++)
    	{
    		sumx += a_stu[i] * a_stu[i];
    		sumxn += a_stu[i];
    	}
    	return(sumx / N - (sumxn / N)*(sumxn / N));
    }
    
    int main()
    {
    	int i, j;
    	float h;
    	input_stu();
    	aver_stu();
    	aver_cour();
    	printf("\n  NO.     cour1   cour2   cour3   cour4   cour5   aver\n");
    	for (i = 0; i < N; i++)
    	{
    		printf("\n NO %2d ", i + 1);
    		for (j = 0; j < M; j++)
    			printf("%8.2f", score[i][j]);
    		printf("%8.2f\n", a_stu[i]);
    	}
    	printf("\naverage:");
    	for (j = 0; j < M; j++)
    		printf("%8.2f", a_cour[j]);
    	printf("\n");
    	h = highest();
    	printf("highest:%7.2f   NO. %2d   course %2d\n", h, r, c);
    	printf("variance %8.2f\n", s_var());
    	return 0;
    }
    

    运行结果:

    习题答案
    谭浩强课后答案

    15、写几个函数:

    • ①输人10个职工的姓名和职工号;
      ②按职工号由小到大顺序排序,姓名顺序也随之调整;
      ③要求输人一个职工号,用折半查找法找出该职工的姓名,从主函数输人要查找的职工号,输出该职工姓名。

    题目解析及答案:

    利用二分查找的关键在于数据一定要先有序,所以在查找前我们需要对数据进行排序。

    代码示例:

    #include<stdio.h>
    
    #define N 10
    
    void input(int num[], char name[N][8])
    {
    	int i;
    	for (i = 0; i < N; i++)
    	{
    		printf("input NO.: ");
    		scanf("%d", &num[i]);
    		printf("input name: ");
    		getchar();
    		gets(name[i]);
    	}
    }
    
    void sort(int num[], char name[N][8])
    {
    	int i, j, min, templ;
    	char temp2[8];
    	for (i = 0; i < N - 1; i++)
    	{
    		min = i;
    		for (j = i; j<N; j++)
    		if (num[min]>num[j])  min = j;
    		templ = num[i];
    		strcpy(temp2, name[i]);
    		num[i] = num[min];
    		strcpy(name[i], name[min]);
    		num[min] = templ;
    		strcpy(name[min], temp2);
    	}
    	printf("\n result:\n");
    	for (i = 0; i < N; i++)
    		printf("\n %5d%10s", num[i], name[i]);
    }
    
    void search(int n, int num[], char name[N][8])
    {
    	int top, bott, mid, loca, sign;
    	top = 0;
    	bott = N - 1;
    	loca = 0;
    	sign = 1;
    	if ((n<num[0]) || (n>num[N - 1]))
    		loca = -1;
    	while ((sign == 1) && (top <= bott))
    	{
    		mid = (bott + top) / 2;
    		if (n == num[mid])
    		{
    			loca = mid;
    			printf("NO. %d , his name is %s.\n", n, name[loca]);
    			sign = -1;
    		}
    		else if (n < num[mid])
    			bott = mid - 1;
    		else
    			top = mid + 1;
    	}
    	if (sign == 1 || loca == -1)
    		printf("%d not been found.\n", n);
    }
    
    int main()
    {
    	int num[N], number, flag = 1, c;
    	char name[N][8];
    
    	input(num, name);
    	sort(num, name);
    
    	while (flag == 1)
    	{
    		printf("\ninput number to look for:");
    		scanf("%d", &number);
    		search(number, num, name);
    		printf("continue ot not(Y/N)?");
    		getchar();
    		c = getchar();
    		if (c == 'N' || c == 'n')
    			flag = 0;
    	}
    	return 0;
    }
    

    运行结果:

    课后习题答案
    c语言课后题答案

    16、写一个函数,输人一个十六进制数,输出相应的十进制数。

    题目解析及答案:

    • 转换的过程需要乘的基数为16,其次注意十六进制中的a~f的字母转换,并且无论大小写都要能够转换。

    代码示例:

    #include<stdio.h>
    
    size_t HextoDec(char s[])
    {
    	size_t i, n;
    	n = 0;
    	for (i = 0; s[i] != '\0'; i++)
    	{
    		if (s[i] >= '0'&& s[i] <= '9')
    			n = n * 16 + s[i] - '0';
    		if (s[i] >= 'a' && s[i] <= 'f')
    			n = n * 16 + s[i] - 'a' + 10;
    		if (s[i] >= 'A' && s[i] <= 'F')
    			n = n * 16 + s[i] - 'A' + 10;
    	}
    	return n;
    }
    
    int main()
    {
    	size_t result = 0;
    	char hex[9] = {0}; 
    	printf("input a HEX number:");
    	scanf("%s", hex);
    
    	result = HextoDec(hex);
    	printf("0x%s = %u\n", hex, result);
    	
    	return 0;
    }
    

    运行结果:

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

    17、用递归法将一个整数n转换成字符串。例如,输人483,应输出字符串”483”。n的位数不确定,可以是任意位数的整数。

    题目解析及答案:

    • 递归法求解主要要有结束条件,此题为n/10 == 0时就直接输出,其次本题还要考虑如果整数位负数的情形,此时需要输出一个字符串的负号。
    #include<stdio.h>
    
    void Convert(int n)
    {
    	int i;
    	if ((i = n / 10) != 0)
    		Convert(i);
    	putchar(n % 10 + '0');
    }
    
    int main()
    {
    	int number;
    	printf("input an integer: ");
    	scanf("%d", &number);
    	printf("output: ");
    	if (number < 0)
    	{
    		putchar('-');   //先输出一个负号'-'
    		number = -number;
    	}
    	Convert(number);
    	printf("\n");
    	return 0;
    }
    

    运行结果:

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

    18、给出年、月、日,计算该日是该年的第几天。

    题目解析:

    • 此题采用枚举法进行每月天数的累加,其中关键点注意需要判断年份是否为闰年,如果是还需要多累加1天。

    代码示例:

    #include <stdio.h>
    #include<stdio.h>
    
    /* 函数sum_day:计算日期 */
    int sum_day(int month, int day)        
    {
    	int day_tab[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    	int i;
    	for (i = 1; i < month; i++)
    		day += day_tab[i];      /* 累加所在月之前天数 */
    	return day;
    }                         
    
    /* 函数leap:判断是否为闰年 */
    int leap(int year)
    {
    	int leap;
    	leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    	return leap;
    }
    
    int main()
    {
    	int year, month, day, days;
    	printf("input date(year,month,day):");
    	scanf("%d %d %d", &year, &month, &day);
    	printf("%d/%d/%d ", year, month, day);
    	days = sum_day(month, day);                  /* 调用函数sum_day */
    	if (leap(year) && month >= 3)                  /* 调用函数leap */
    		days = days + 1;
    	printf("is the %dth day in this year.\n", days);
    	return 0;
    }
    

    运行结果:

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

    C语言程序设计第五版谭浩强 第七章答案

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

    谭浩强C语言程序设计第五版 第六章答案

    展开全文
  • 谭浩强 C语言程序设计第五版 第六章 习题 答案

    万次阅读 多人点赞 2019-06-16 14:01:49
    谭浩强 C语言程序设计第五版 第六章 习题 答案 有问题可以在下方留言哦 1.用筛选法求100以内的素数。 #include <stdio.h> #include <math.h> int main() { int i,j,a[100],b[100]; for (i=1;i<=...

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

    第六章:利用数组处理批量数据

    1. 用筛选法求100之内的素数

    【答案解析】

    • 素数:约数为1和该数本身的数字称为素数,即质数

    • 筛选法:又称为筛法。先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛”,简称“筛法”。(另一种解释是当时的数写在纸草上,每要划去一个数,就把这个数挖去,寻求质数的工作完毕后,这许多小洞就像一个筛子。)

    【代码实现】

    //用筛选法求100以内的素数
    #include<stdio.h>
    int main()
    {
    	int i, j, k = 0;
    
    	// 将数组汇总每个元素设置为:1~100
    	int	a[100];
    	for (i = 0; i < 100; i++)
    		a[i] = i+1;
    
    	// 因为1不是素数,把a[0]用0标记
    	// 最后一个位置数字是100,100不是素数,因此循环可以少循环一次
    	a[0] = 0;
    	for (i = 0; i < 99; i++)
    	{
    		// 用a[i]位置的数字去模i位置之后的所有数据
    		// 如果能够整除则一定不是素数,该位置数据用0填充
    		for (j = i + 1; j < 100; j++)
    		{
    			if (a[i] != 0 && a[j] != 0)
    			{
    				//把不是素数的都赋值为0
    				if (a[j] % a[i] == 0)
    					a[j] = 0;
    			}
    		}
    	}
    
    	printf(" 筛选法求出100以内的素数为:\n");
    	for (i = 0; i < 100; i++)
    	{
    		//数组中不为0的数即为素数
    		if (a[i] != 0)
    			printf("%3d", a[i]);
    	}
    
    	printf("\n");
    	return 0;
    }
    

    运行结果

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

    2. 用选择法对10个整数排序

    【答案解析】

    选择排序原理:

    • 总共两个循环,外循环控制选择的趟数,内循环控制具体选择的方式。

    • 用maxPos标记区间中首元素位置,然后用后序元素依次与maxPos标记的元素进行比较,如果有元素大于maxPos位置的元素,用maxPos标记该元素的位置,直到区间的末尾。

    • 该趟选择完成后,即找到该区间中最大元素,如果maxPos标记的最大元素不在区间末尾,用maxPos位置元素与区间末尾的元素进行交换。

    继续新一趟选择,直到区间中剩余一个元素

    谭浩强 C语言程序设计第五版习题答案
    【代码实现】

    #include<stdio.h>
    int main()
    {
    	int array[] = {2,8,3,9,5,7,1,4,0,6};
    	int size = sizeof(array) / sizeof(array[0]);
    	// 输出原数组
    	printf("排序前数组中数据为:");
    	for (int i = 0; i < size; ++i)
    		printf("%d ", array[i]);
    	printf("\n");
    
    	// 选择排序过程:
    	// 外循环控制选择的趟数,总共选择size-1趟,
    	// 减1是因为最后一趟选择区间中剩余一个元素,该趟选择可以忽略
    	for (int i = 0; i < size-1; ++i)
    	{
    		// 用maxPos标记[0, size-i)区间中最大元素
    		// 在该趟选择没有开始前,默认认为0号位置就是最大元素
    		int maxPos = 0;
    		for (int j = 1; j < size - i; ++j)
    		{
    			// 遍历区间[0, size-i)中元素,如果有元素比maxPos位置元素大,maxPos记录该元素位置
    			if (array[j] > array[maxPos])
    				maxPos = j;
    		}
    
    		// 如果最大元素不在区间末尾时,将最大元素与区间末尾元素交换
    		if (maxPos != size - i - 1)
    		{
    			int temp = array[maxPos];
    			array[maxPos] = array[size - i - 1];
    			array[size - i - 1] = temp;
    		}
    	}
    
    	// 输出原数组
    	printf("选择排序后数组中数据为:");
    	for (int i = 0; i < size; ++i)
    		printf("%d ", array[i]);
    	printf("\n");
    	return 0;
    }
    

    【结果截屏】

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

    优化:既然一趟选择能找到最大的元素,那么也可以找到最小的元素,因此在一趟中可以找到最小和最大两个元素,最小元素放在区间左侧,最大元素放在区间右侧,可以减少选择的趟数。

    #include<stdio.h>
    int main()
    {
    	int array[] = {2,8,3,9,5,7,1,4,0,6};
    	int size = sizeof(array) / sizeof(array[0]);
    	// 输出原数组
    	printf("排序前数组中数据为:");
    	for (int i = 0; i < size; ++i)
    		printf("%d ", array[i]);
    	printf("\n");
    
    	
    	int begin = 0, end = size - 1;
    	// [begin, end]区间中进行选择
    	while (begin < end)
    	{
    		int maxPos = begin;  // 标记区间中最大元素的位置
    		int minPos = begin;  // 标记区间中最小元素的位置
    		int index = begin + 1;
    		while (index <= end)
    		{
    			if (array[index] > array[maxPos])
    				maxPos = index;
    
    			if (array[index] < array[minPos])
    				minPos = index;
    			++index;
    		}
    
    		// 如果最大元素不在区间末尾,则交换
    		if (maxPos != end)
    		{
    			int temp = array[maxPos];
    			array[maxPos] = array[end];
    			array[end] = temp;
    		}
    
    		// 如果在交换前区间末尾刚好存储的是最小的元素,则最小的元素被交换到maxPos位置
    		// 此时需要更新minPos
    		if (minPos == end)
    			minPos = maxPos;
    
    		// 如果最小元素不在区间起始位置,则交换
    		if (minPos != begin)
    		{
    			int temp = array[minPos];
    			array[minPos] = array[begin];
    			array[begin] = temp;
    		}
    
    		// 最大与最小元素已经在区间的起始和末尾的位置,
    		// 因此begin往后移动,end往前移动
    		begin++;
    		end--;
    	}
    
    	// 输出原数组
    	printf("选择排序后数组中数据为:");
    	for (int i = 0; i < size; ++i)
    		printf("%d ", array[i]);
    	printf("\n");
    	return 0;
    }
    

    3. 求一个3 X 3的整形矩阵对角线元素之和

    【答案解析】

    矩阵:即二维数组,矩阵行和列相等的二维数组称为方阵。

    1 2 3

    4 5 6

    7 8 9

    左上角到右下角对角线上数字:行下标和列下标相等

    右上角到左下角对角线上数字:列下标减1 行下标加一

    通过两个循环来取到对角线上的元素,并对其求和即可。

    【代码实现】

    #include<stdio.h>
    int main()
    {
    	int array[3][3];
    	int sumLT2RB = 0;  // 标记左上角到右下角对角线元素之和
    	int sumRT2LB = 0;  // 标记右上角到左下角对角线元素之和
    	printf("请输入3行3列的矩阵:\n");
    	for (int i = 0; i < 3; ++i)
    	{
    		for (int j = 0; j < 3; ++j)
    			scanf("%d", &array[i][j]);
    	}
    
    	// 左上角到右下角对角线
    	for (int i = 0; i < 3; ++i)
    		sumLT2RB += array[i][i];
    
    	for (int i = 0, j = 2; i < 3; ++i, j--)
    		sumRT2LB += array[i][j];
    
    	printf("左上角到右下角对角线元素之和: %d\n", sumLT2RB);
    	printf("右上角到左下角对角线元素之和: %d\n", sumRT2LB);
    	return 0;
    }
    

    【结果截屏】

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

    4. 有一个已经排好序的数组,要求输入一个数后,按原来顺序的规律将它插入数组中

    【答案解析】

    将数据插入到已排序的序列中,只需两步即可:

    1. 找待插入元素在数组中的插入位置
    2. 插入元素

    具体如下:
    C语言程序设计谭浩强课后答案

    注意:极端情况下,end可能会被减为-1,比如在上述序列中插入0

    【代码实现】

    #include<stdio.h>
    int main()
    {
    	int num = 0;
    	int array[10] = {1,2,3,4,5,6,7,8,9};
    
    	printf("请输入一个整数:");
    	scanf("%d", &num);
    
    	printf("原数组序列为:\n");
    	for (int i = 0; i < 9; ++i)
    		printf("%d ", array[i]);
    	printf("\n");
    
        // 数组为升序
        // 在数组中找待插入元素的位置,具体找的方式为:
        // 从后往前依次与数组中元素进行比较,如果要插入元素num比end位置数据小,则num一定插在end位置之前
        // 因此将end位置数据往后搬移一个位置
        // 如果num大于end位置元素或者end已经在区间最左侧,则位置找到
        // 最后将新元素插入到end+1的位置
    	int end = 8;
    	while (end >= 0 && num < array[end])
    	{
    		array[end+1] = array[end];
    		end--;
    	}
    
    	array[end + 1] = num;
    	printf("插入元素%d之后的结果为:\n", num);
    	for (int i = 0; i < 10; ++i)
    		printf("%d ", array[i]);
    	printf("\n");
    	return 0;
    }
    

    【结果截图】

    谭浩强 C语言程序设计第4题答案

    5. 将一个数组中的值按逆序重新存放。例如:原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。

    【答案解析】

    该题为数组的逆置,具体处理方式如下:

    如果begin < end时,则循环进行一下操作

    1. 给定两个下标begin和end,begin放在数组起始的位置,end放在数组最后一个元素的位置
    2. 交换begin和end位置的元素
    3. begin往后移动,end往前移动

    【代码实现】

    #include<stdio.h>
    int main()
    {
    	int array[5] = {8,6,5,4,1};
    	int begin = 0, end = 4;
    
    	printf("逆序之前数组为:");
    	for (int i = 0; i < 5; ++i)
    		printf("%d ", array[i]);
    	printf("\n");
    
    	// 逆序:begin在数组最左侧,end在数组最右侧
    	// 只要begin < end,将begin和end位置元素进行交换
    	// 然后begin往后移动一步,end往前移动一步
    	while (begin < end)
    	{
    		int temp = array[begin];
    		array[begin] = array[end];
    		array[end] = temp;
    		begin++;
    		end--;
    	}
    
    	printf("逆置之后数组为:");
    	for (int i = 0; i < 5; ++i)
    		printf("%d ", array[i]);
    	printf("\n");
    	return 0;
    }
    

    【结果截屏】

    6. 输出一下的杨慧三角(要求输出10行)

    1   
    1   1
    1   2   1
    1   3   3   1
    1   4   6   4   1
    1   5  10  10   5   1
    ……
    

    【答案解析】

    仔细观察杨慧三角可以看到:

    第0列和对角线上的数据全部为1,其余位置上的数据为上一行正对数据与上一行正对前一个数据之和。

    比如:a[4][2] = a[3][2] + a[3][1]

    【代码实现】

    #include<stdio.h>
    int main()
    {
    	int array[10][10];
    	for (int i = 0; i < 10; ++i)
    	{
    		for (int j = 0; j <= i; ++j)
    		{
                // 对角线和第0列上全部为1
    			if (i == j || 0 == j)
    				array[i][j] = 1;
    			else
    				array[i][j] = array[i - 1][j] + array[i - 1][j - 1];
    		}
    	}
    
        // 打印杨慧三角的前10行
    	for (int i = 0; i < 10; ++i)
    	{
    		for (int j = 0; j <= i; ++j)
    		{
    			printf("%5d", array[i][j]);
    		}
    
    		printf("\n");
    	}
    	return 0;
    }
    

    【结果截屏】

    杨辉三角

    7. 输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如:

    8   1   6
    3   5   7
    4   9   2
    

    要求输出1~n2n^2的自然数构成的魔方阵。

    【答案解析】

    | 17 | 24 |  1 |  8 | 15 |
    --------------------------
    | 23 |  5 |  7 | 14 | 16 |
    --------------------------
    |  4 |  6 | 13 | 20 | 22 |
    --------------------------
    | 10 | 12 | 19 | 21 |  3 |
    --------------------------
    | 11 | 18 | 25 |  2 |  9 |
    

    仔细观察上述矩阵,可以看到以下规律:

    魔方阵的生成方法为:在第0行中间置1,对从2开始的其余n21n^2-1个数依次按下列规则存放:

    1. 将1放在第1行的中间一列。
    2. 从2开始直到n*n止,各数依次按此规律存放:每一个数存放的行比前一个数的行数减1,列数加1。
    3. 如果上一行的行数为1,则下一个数的行数为n(指最下一行)。
    4. 当上一个数的列数为n时,下一个数的列数应该为1。
    5. 如果按上面规律确定的位置有数,或者上一个数是第1行第n列时,则把下一个数放在上一个数的下面。

    【代码实现】

    #include <stdio.h>
    int main()
    {
    	int a[15][15], n, i, j, k;
    	while (1)
    	{
    		printf("请输入n(1~15):");
    		scanf("%d", &n);
    		if (n != 0 && n <= 15 && n % 2 != 0)
    			break;
    		else
    		{
    			printf("请输入奇数\n");
    		}
    	}
    
    	for (i = 1; i <= n; i++)
    	{
    		for (j = 1; j <= n; j++)
    			a[i][j] = 0;
    	}
    
    	j = n / 2 + 1;
    	a[1][j] = 1;
    	i = 1;
    	for (k = 2; k <= n*n; k++)
    	{
    		i -= 1;
    		j += 1;
    
    		if (i<1 && j>n)
    		{
    			i += 2;
    			j -= 1;
    		}
    		else if (i<1)
    		{
    			i = n;
    		}
    		else if (j>n)
    		{
    			j = 1;
    		}
    
    		if (a[i][j] == 0)
    		{
    			a[i][j] = k;
    		}
    		else
    		{
    			i += 2;
    			j -= 1;
    
    			a[i][j] = k;
    		}
    	}
    
    	for (i = 1; i <= n; i++)
    	{
    		for (j = 1; j <= n; j++)
    			printf("%5d", a[i][j]);
    
    		printf("\n");
    	}
    
    	return 0;
    }
    

    【结果截屏】

    C语言程序设计第五版

    8. 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。

    【答案解析】

    鞍点是行上最大,列上最小的元素,因此对数组的第i元素进行如下操作:

    1. 找到该行上最大元素,用max标记,并标记该元素所在列colindex
    2. 找colindex列上最小的元素,用min标记,并标记该元素所在行号rowindex
    3. 如果max和min相等,并且最小的元素刚好是在第i行,则为鞍点

    如果所有行找完了,没有输出则没有鞍点

    【代码实现】

    #include<stdio.h>
    #define M 3
    #define N 4
    
    int main()
    {
    	int max, min, rowindex, colindex, flag = 0;
    	int array[M][N];
    	printf("请输入%d行%d列的数组:\n", M, N);
    	for (int i = 0; i < M; i++)
    	{
    		for (int j = 0; j < N; j++)
    			scanf("%d", &array[i][j]);
    	}
    
    	for (int i = 0; i < M; ++i)
    	{
    		// 找到i行上最大的元素,记录该元素在列号colindex
    		max = array[i][0];
    		for (int j = 0; j < N; ++j)
    		{
    			if (array[i][j] > max)
    			{
    				max = array[i][j];
    				colindex = j;
    			}
    		}
    
    		// 找max所在列colindex上最小的元素,并记录其所在的行
    		min = array[0][colindex];
    		for (int j = 0; j < M; ++j)
    		{
    			if (array[j][colindex] < min)
    			{
    				min = array[j][colindex];
    				rowindex = j;
    			}
    		}
    
    		// 如果最小元素与最小元素相同,并且最小元素也在第i行,则为鞍点
    		if (max == min && i == rowindex)
    		{
    			flag = 1;
    			printf("鞍点为:%d行%d列的元素%d", rowindex, colindex, max);
    			break;
    		}
    	}
    
    	if (0 == flag)
    		printf("没有鞍点");
    	return 0;
    }
    

    【结果截屏】

    在这里插入图片描述

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

    【答案解析】

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

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

    1. 找到[left, right)区间中间位置
    2. 如果key等于中间位置元素,则找到,返回该元素在数组中的下标
    3. 如果key小于中间位置元素,到数组的左半侧继续二分查找
    4. 如果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语言程序设计第五版谭浩强第五版习题答案第9题

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

    【答案解析】

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

    1. 定义保存结果变量:upp、low、digit、space、other
    2. 遍历每行文本中的字符
    3. 如果该字符ch:ch >= ‘a’ && ch <=‘z’,则该字符是小写字母,给low++
    4. 如果该字符ch:ch >= ‘A’ && ch <=‘Z’,则该字符是小写字母,给up++
    5. 如果该字符ch:ch >= ‘0’ && ch <=‘9’,则该字符是小写字母,给digit++
    6. 如果该字符ch:ch == ’ ',则该字符是小写字母,给space++
    7. 否则为其他字符,给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. 输出一下图案:

    * * * *
      * * * *
        * * * *
          * * * *
            * * * *
    

    【答案解析】

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

    1. 每行中*的个数相等,都是4个
    2. 每行中空格的个数在递增2个
    3. 每行先输出空格,然后输出*

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

    【代码实现】

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

    【结果截屏】

    谭浩强

    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’

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

    1. 先用s[i] - 'a’计算出s[i]是26个字母中从前往后数的第几个
    2. 再用26 - (s[i]- ‘a’) - 1 转换为26个字母中从后往前数的第几个
    3. 在2的结果上加上’a’,即转换为对应从后往前的第几个字母

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

    【代码实现】

    #include<stdio.h>
    int main()
    {
    	char s[1024] = {0};
    	scanf("%s", s);
    
    	int len = strlen(s);
    	// 转换
    	for (int i = 0; i < len; ++i)
    	{
    		// 如果是小写字母(大写字母出来类似):
    		// 1. 先用s[i] - 'a'计算出s[i]是26个字母中从前往后数的第几个
    		// 2. 再用26 - (s[i]- 'a') - 1 转换为26个字母中从后往前数的第几个
    		// 3. 在2的结果上加上'a',即转换为对应从后往前的第几个字母
    		if (s[i] >= 'a' && s[i] <= 'z')
    			s[i] = 'a' + 26 - (s[i]-'a')-1;
    		else if (s[i] >= 'A' && s[i] <= 'Z')
    			s[i] = 'A' + 26 - (s[i] - 'A')-1;
    	}
    
    	printf("%s", s);
    	return 0;
    }
    

    【结果截屏】

    C语言程序设计第五版第六章课后答案12题

    13. 编一程序,将两个字符串连接起来,不要用strcat函数

    【答案解析】

    直接将s2中的字符逐个拷贝到s1的末尾即可,用户需要保证s1中能存的下s2中的字符

    1. 获取s1末尾的位置
    2. 将s2中的字符逐个拷贝到s1中

    【代码实现】

    #include<stdio.h>
    
    int main()
    {
    	char s1[100] = {0};
    	char s2[50] = { 0 };
    	int index1 = 0, index2 = 0;
    	printf("请输入字符串s1:");
    	scanf("%s", s1);
    
    	printf("请输入字符串s2:");
    	scanf("%s", s2);
    
    	printf("将s2拼接在s1之后: ");
    	// 1. 找到s1的末尾
    	while ('\0' != s1[index1])
    		index1++;
    
    	// 2. 将s2中的字符逐个往s1之后拼接
    	while (s1[index1++] = s2[index2++]);
    
    	printf("%s\n", s1);
    	return 0;
    }
    

    【结果截屏】

    C语言程序设计第五版  第六章 习题 答案

    14. 编写一个程序,将连个字符串s1和s2比较,如果s1 > s2,输出一个整数;若s1 = s2,输出0;若s1 < s2,输出一个负数。不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相对应字符的ASCII码的差值。例如,“A"和“C”相比,由于"A” < “C”,应输出负数,同时由于‘A’与‘C’的ASCII码差值为2,因此应输出"-2"。同理:“And”和"Aid"相比较,根据第2个字符比较结果,“n"比"i"大5,因此应输出"5”。

    【答案解析】

    字符串比较规则:从前往后逐个字符进行比较,相等时继续往后,不相等时返回该位置两个字符差值。

    【代码实现】

    #include <stdio.h>
    
    int main()
    {
    	int ret = 0;
    	int index = 0;
    	char s1[100] = { 0 };
    	char s2[100] = { 0 };
    	printf("请输入s1:");
    	gets(s1);
    
    	printf("请输入s2:");
    	gets(s2);
    
        // 将s1和s2中的字符从前往后逐个进行比较,相等继续往后,
        // 不相等时ret中结果不为0,!ret则为0  循环结束
        // 如果一个走到末尾,一个未走到末尾 ret也不为0, !ret为0,循环结束
        // 如果两个字符串相等,同时达到末尾,循环结束
    	while (!(ret = s1[index] - s2[index]) && '\0' != s1[index] && '\0' != s2[index])
    	{
    		++index;
    	}
    
    	printf("%d\n", ret);
    	return 0;
    }
    

    【结果截屏】

    谭浩强 C语言程序设计第五版

    15. 编写一个程序,将字符数组s2中的全部字符复制到字符数组s1中,不用strcpy函数。复制时,‘\0’也要赋值过去。’\0’之后的字符不复制。

    【答案解析】

    首先必须保证s1能否放的下s2中的字符,然后将s2中的每个字符逐个搬移到s1中即可。

    【代码实现】

    #include<stdio.h>
    
    int main()
    {
    	char s1[100] = { 0 };
    	char s2[50] = { 0 };
    	int index1 = 0, index2 = 0;
    	printf("请输入字符串s2:");
    	scanf("%s", s2);
    
    	printf("将s2拷贝到s1中, s1现在为: ");
        
        // 将s2[index2]位置字符拷贝到s1[index]位置,
        // 然后以s1[index1]的值作为循环条件判断是否拷贝到s2的末尾
    	while (s1[index1++] = s2[index2++]);
    	printf("%s\n", s1);
    	return 0;
    }
    

    【结果截屏】

     C语言程序设计第五版  第六章 习题 答案

    更多扩展

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

    展开全文
  • C语言程序设计第五版

    千次阅读 2019-03-24 10:48:56
    一章 程序设计C语言 ##例1.1 要求在屏幕上输出以下一行信息 编写程序: #include<stdio.h> int main() { printf(“This is a C program.\n”); return 0; } 运行结果: ##例1.2 求两个整数之和。 编写程序...
  • C语言程序设计第五版 谭浩强 第六章 答案

    万次阅读 多人点赞 2019-06-16 00:40:04
    C语言程序设计第五版 谭浩强 第六章 答案 1.用筛选法求100以内的素数。 #include <stdio.h> #include <math.h> void main() { int i,j,a[100],b[100]; for (i=1;i<=100;i++) { a[i]=i+1; for ...
  • C语言程序设计第五版_谭浩强_课后习题答案完整版
  • 第五章 1.请画出例5.6中给出的3个程序段的流程图 流程图1: 流程图2: 流程图3: 2.请补充例5. 7程序,分别统计当“fabs(t)>= le- 6”和“fabs(t)> = le- 8”时执行循环体的次数。 fabs(t)>= le- 6 ,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,214
精华内容 16,085
关键字:

c语言程序设计第五版

c语言 订阅