习题答案

Posted 曦文先生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了习题答案相关的知识,希望对你有一定的参考价值。

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

解析:C语言中这些东西太多了,这里只讲最常见的。

(1)算术运算最常见的有:加减乘除、自增、自减、取模

运算符(优先级):++、--   *、/、% +、-

(2)关系运算最常见的是关系运算:大于、小于、等于、大于等于、小于等于、不等于

运算符(优先级):>、<、>=、 <= ==、 !=

(3)逻辑运算基本就是再说 “与或非” 三兄弟

运算符(优先级):!&&、||

&&:逻辑与,要求左右两边同时为真输出才会为真;

||:逻辑或,符号左右两边只需要有一个为真输出便为真;

!:逻辑非,讲符号右边的内容在逻辑上取反;

注:这里的 !非,优先等级非常高。

以上所提到的所有操作符优先级排列:

++、-- 剩下的算数运算符;关系运算符;剩下逻辑运算符

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

解析:纯概念题,书上有原话,我简单概述一下。

在C语言中判断真假很简单:“0为假,非0为真”,具体判断又分为两种:“逻辑常量和逻辑变量”

逻辑常量只有两个:“0和1,0为假,1为真”.

逻辑变量,就跟他的名字一样,会变!因此,逻辑变量可以是数字、字母、符号甚至是表达式,判断方式也是0为假,非0为真。

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

解析:这一题就是上面两题的综合实践版。

(1)a+b>c && b ==c ——>  3+4>5 && 4==5 ——>7>c && 4==5 ——>真 && 假——>假

(2)a||b+c && b-c ——> 3||4+5 && 4-5 ——> 3||9 && -1 ——>真||真&&真 ——>真

(3)!(a>b) && !c||1 ——> !(3>4) && !5||1 ——> !(假) && !真||真 ——>  真 && 假||真 ——>真

(4)!(x=a) && (y=b) && 0 ——>假

(5)!(a+b)+c-1 && b+c/2 ——> !(3+4)+5-1 && 4+5/2 ——> !(7)+4 && 6.5 ——> 0+4 && 6.5 ——>真

注:逻辑运算符优先级:!> && > ||。0为假,非0为真!非0为真!非0为真!重要的事情说三遍,这里的负数也是真!第五题跟编译器有关系,这里说的优先级都是VS2022的,用其他的编译器答案可能是假。

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

解析:这个题目比较简单,就是一个很单纯的关系运算,我们可以使用if语句进行操作,放代码!

int main()

	int num1, num2, num3;
	int tmp = 0;
	scanf("%d %d %d", &num1, &num2, &num3);
	if (num1 <= num2)
	
		tmp = num1;
		num1 = num2;
		num2 = tmp;
	
	if (num1 <= num3)
	
		tmp = num1;
		num1 = num3;
		num3 = tmp;
	
	printf("最大值为:%d\\n", num1);
	return 0;

运算结果:

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

解析:这一题有歧义,“输出其整数部分”,是说输出四舍五入后得整数还是没有四舍五入得整数?因此我这里给了两个答案,大家按需索取。要注意这里要用到一个<math.h>的函数sqrt。放代码!

(1)四舍五入版

int main()

	while (1)
	
		int num1;
		printf("请输入1-999的整数:>");
		scanf("%d", &num1);
		if (num1 >= 1000)
		
			printf("\\n输入错误请重新输入!\\n");
		
		else
		
			printf("%d开平方得:%.0f", num1, sqrt((double)num1));
			return 0;
		
		
	

运算结果:

(2)非四舍五入版:

int main()

	while (1)
	
		int num1;
		printf("请输入1-999的整数:>");
		scanf("%d", &num1);
		if (num1 >= 1000)
		
			printf("\\n输入错误请重新输入!\\n");
		
		else
		
			printf("%d开平方得:%d", num1, (int)sqrt((double)num1));
			return 0;
		
		
	

 运算结果:

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

解析:这题跟第五题是一样的,运用了之前讲到的算数运算、逻辑运算和判断语句,程序的框架就是用if去分割。题目简单而且不严谨,一般数学运算不会总是整数,但是我相信谭浩强是想要用整数去运算的,放代码!

int main()

	int x, y;
	printf("请输入x的值:");
	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);
	return 0;

 当x<1时,运算结果:

当1<=x<10时。运算结果:

当x>=10时。运算结果:

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


解析:else匹配在最近的if上,因此这两个人写的程序都会出现else不匹配的情况,需要在else上的if套上。 

 (1)

 当 x == 0时y = -1;当x > 0时y = 1;当x<0时y = 0 

          

(2)

 当 x < 0时y = 0;当x > 0时y = 1;当x = 0时y = -1 

 

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

 解析:这题的关键在于判断语句和关系运算,基本没有难点。

int main()

	while (1)
	
		int num = 0;
		printf("请输入成绩(0-100):>");
		scanf("%d", &num);
		if (num >= 0 && num <= 100)
		
			if (num >= 90)
			
				printf("成绩等级为'A'\\n");
			
			else if (num >= 80 && num <= 89)
			
				printf("成绩等级为'B'\\n");
			
			else if (num >= 70 && num <= 79)
			
				printf("成绩等级为'C'\\n");
			
			else if (num >= 60 && num <= 69)
			
				printf("成绩等级为'D'\\n");
			
			else
			
				printf("成绩等级为'E'\\n");
			
			/*
			如果把return 0移动到这里
			这个循环的作用就只有判断范围
			*/
		
		else
		
			printf("输入错误,请重新输入!\\n");
		
	
	return 0;//return 0在这里就可以循环使用

运算结果:

9. 给一个不多于5位的正整数,要求:

①求出它是几位数;

②分别输出每一位数字;

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

解析:这题的难点在于如何逆序,可以使用整除和取模来做,取10的模获得的就是个位的数字,整除10获得的就是十位的数字,整除100获得的就是百位的数字,整除1000获得的就是千位的数字,整除10000获得的就是万位的数字。可以用if语句使用判断数据范围的方法来做。

void print_ni(int num, int count)

	if (num > 0)
	
		printf("%d ", num % 10);
		print_ni(num / 10, ++count);
	

void print(int num, int count)

	if (num > 0)
	
		
		print(num / 10, ++count);
		printf("%d ", num % 10);
		++count;
	
	else
	
		
		printf("共%d位\\n", count);
	

int main()

	while (1)
	
		int num = 0;
		int count = 0;
		printf("请输入0-99999的数字:>");
		scanf("%d", &num);
		printf("\\n");
		if (num > 99999 || num < 0)
		
			printf("输入错误,请重新输入!\\n");
		
		else
		
			print_ni(num, count);
			printf("\\n");
			print(num, count);

		
		printf("\\n");
	
	return 0;

运算结果:

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语句

解析:这一题跟前面的是一样的,就是题目长,用if语句进行分类讨论就可以了,直接放代码!

double bonuses(double I)

	double bonus = 0.0;
	double bonus1 = 100000 * 0.1;//10万的奖金
	double bonus2 = (200000 - 100000) * 0.075 + bonus1;//20万的奖金
	double bonus3 = (400000 - 200000) * 0.05 + bonus2;//40万的奖金
	double bonus4 = (600000 - 400000) * 0.03 + bonus3;//60万的奖金
	double bonus5 = (1000000 - 600000) * 0.015 + bonus4;//100万的奖金
	if (I <= 100000 && I >= 0)
	
		bonus = I * 0.1;//小于100000按10%提成
	
	else if (I > 100000 && I <= 200000) 
		bonus = bonus1 + (I - 100000) * 0.075;//多出10万的按比例计算,加上10w的奖金
	
	else if (I > 200000 && I <= 400000) 
		bonus = bonus2 + (I - 200000) * 0.05;//多出20万的按比例计算,加上20w的奖金
	
	else if (I > 400000 && I <= 600000) 
		bonus = bonus3 + (I - 400000) * 0.03;//多出40万的按比例计算,加上40w的奖金
	
	else if (I > 600000 && I <= 1000000) 
		bonus = bonus4 + (I - 600000) * 0.015;//多出60万的按比例计算,加上60w的奖金
	
	else if (I > 1000000) 
		bonus = bonus5 + (I - 1000000) * 0.01;//多出100万的按比例计算,加上100w的奖金
	
	return bonus;

int main()

	while (1)
	
		double I, bonus = 0;
		printf("请输入利润:>");
		scanf_s("%lf", &I);
		printf("\\n");
		if (I < 0)
		
			printf("请输入一个正数\\n");
		
		bonus = bonuses(I);
		printf("奖金为:%.2f\\n", bonus);
	
	return 0;

(2)switch语句

解析:switch语句稍微难一点点,但是!我们看到题目里是以10w递增的,所以这里我们可以用I/10w来做分级,放代码!

double bonuses(double I)

	double bonus = 0.0;
	double bonus1 = 100000 * 0.1;//10万的奖金
	double bonus2 = (200000 - 100000) * 0.075 + bonus1;//20万的奖金
	double bonus3 = (400000 - 200000) * 0.05 + bonus2;//40万的奖金
	double bonus4 = (600000 - 400000) * 0.03 + bonus3;//60万的奖金
	double bonus5 = (1000000 - 600000) * 0.015 + bonus4;//100万的奖金
	int grade = I / 100000;
	switch (grade)
	
	case 0:
		bonus = I * 0.1; break;
	case 1:
		bonus = bonus1 + (I - 100000) * 0.075; 
		break;
	case 2://会顺序执行到下一个break处
	case 3:
		bonus = bonus2 + (I - 200000) * 0.05; 
		break;
	case 4:
	case 5:
		bonus = bonus3 + (I - 400000) * 0.03; 
		break;
	case 6:
	case 7:
	case 8:
	case 9:
		bonus = bonus4 + (I - 600000) * 0.015; 
		break;
	default:	//这里用default做利润I>100w的情况
		bonus = bonus5 + (I - 1000000) * 0.01; 
		break;
	
	return bonus;

int main()

	while (1)
	
		double I, bonus = 0;
		printf("请输入利润:>");
		scanf_s("%lf", &I);
		printf("\\n");
		if (I < 0)
		
			printf("请输入一个正数\\n");
		
		bonus = bonuses(I);
		printf("奖金为:%.2f\\n", bonus);
	
	return 0;

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

解析:这一题和之前一题基本是一致的,就是简单的比较大小重新赋值。

int main()

	int num1, num2, num3, num4, temp;
	scanf("%d %d %d %d", &num1, &num2, &num3, &num4);
	/*---------------------------------------------*/
	if (num1 > num2)//轮番比较确定出最小的数字
	
		temp = num1;
		num1 = num2;
		num2 = temp;
	
	if (num1 > num3)
	
		temp = num1;
		num1 = num3;
		num3 = temp;
	
	if (num1 > num4)
	
		temp = num1;
		num1 = num4;
		num4 = temp;
	
	/*---------------------------------------------*/
	if (num2 > num3)//轮番比较确定出第二小的数字
	
		temp = num2;
		num2 = num3;
		num3 = temp;

	
	if (num2 > num4)
	
		temp = num2;
		num2 = num4;
		num4 = temp;
	
	/*---------------------------------------------*/
	if (num3 > num4)//轮番比较确定出第三小的数字
	
		temp = num3;
		num3 = num4;
		num4 = temp;
	
	/*---------------------------------------------*/
	printf("%d<%d<%d<%d", num1, num2, num3, num4);
	return 0;

运算结果:

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

解析:这题实际上是一道数学题,圆心的坐标分别是(-2,2)、(2,2)、(-2,-2)、(2,-2),圆的半径是1,所以|1|<x<|3|,|1|<y<|3|,最重要的是满足坐标在圆的范围内,这里可以使用点到点的距离来判定即sqrt(x^2+y^2)<=1。为了将负数转换成正数这里引用fabs函数,#include<math.h>。放代码!

void calculate(double x, double y)

	if (1 <= x && x <= 3 && 1 <= y && y <= 3)
			
		x = fabs(x) - 2; 
		y = fabs(y) - 2;
		double r = sqrt(x * x + y * y);
		if (r <= 1)
		
			printf("该点坐标高度为10\\n");
		
		else
			printf("该点坐标高度为0\\n");
	
	else
	
		printf("该点坐标高度为0\\n");
	


int main()

	while (1)
	
		double x, y;
		printf("请输入x和y点的坐标:>");
		scanf("%lf %lf", &x, &y);
		calculate(fabs(x), fabs(y));
	
	return 0;

运算结果:

数据库系统概论第五版(笔记+习题答案)(全)

因学习数据库系统概论,将会对每一个章节进行一个整理,包括笔记和习题答案。


目录

前言

第 1 章 绪论

第 1 章习题答案

第 2 章 关系数据库

第 2 章习题答案

第 3 章 关系数据库标准语言SQL

第 3 章习题答案

第 4 章 数据库安全性

第 4 章习题答案

第 5 章 数据库完整性

第 5 章习题答案

第 6 章 关系数据理论

第 6 章习题答案

第 7 章 数据库设计

第 7 章习题答案


前言

  • 本篇文章学习参考书:《数据库系统概论》第5版 王珊 萨师煊编著
  • 会持续更新直到更新完毕,更新范围为本书的本科生必读范围(1-11章)(如果没有超链接,表示还没有更新到)
  • 作为初学者,初学我们最重要的是掌握其理论、思想,和语句,因为最重要的理论在其它数据库都是通用的,只是因为版本软件问题不一定能全部实现。
  • 本人也是逐渐学习过程,如果笔记和课后习题答案有什么问题可以评论交流。
  • 本文中,我将每一章的大体笔记范围写在章节内,同时在目录章节后面标注章节习题答案,请注意使用。(可以先做着试试在参考,同时有问题可以评论哦)

第 1 章 绪论

1.1 数据库系统概述

1.2 数据模型

1.3 数据库系统的结构

1.4 数据库系统的组成

第 1 章习题答案

第 2 章 关系数据库

2.1 关系数据结构及形式化定义

2.2 关系操作

2.3 关系的完整性

2.4 关系代数

2.5 关系演算(本章节不要求学习)

第 2 章习题答案

第 3 章 关系数据库标准语言SQL

3.1 SQL概述

3.2 学生—课程数据库

3.3 数据定义

3.4 数据查询

3.5 数据更新

3.6 空值的处理

3.7 视图

第 3 章习题答案

第 4 章 数据库安全性

4.1 数据库安全性概述

4.2 数据库安全性控制

4.3 视图机制

4.5 数据加密

4.6 其他安全性保护

第 4 章习题答案

第 5 章 数据库完整性

5.1 实体完整性

5.2 参照完整性

5.3 用户定义完整性

5.4 完整性约束命名字句

5.5 域中的完整性限制(本章节不要求学习)

5.5 断言

5.7 触发器

第 5 章习题答案

第 6 章 关系数据理论

6.1 问题的提出

6.2 规范化

6.3数据依赖的公理系统

6.4 模式的分解(本章节不要求学习)

第 6 章习题答案

第 7 章 数据库设计

7.1 数据库设计概述

7.2 需求分析

7.3 概念结构设计

7.4 逻辑结构设计

7.5 物理结构设计

7.6 数据库的实验和维护

第 7 章习题答案

第 7 章之后的章节,理论性较弱,更多的在于实战方面,还有就是相关性强的方面,有普及知识的,也有真正进入实战的,后续章节属于拓展性,学校教学要求也不高,更多自学,后续章节我将会把 8—11 章节的课后习题答案整理。

有需要的同学可以评论回复,我将会在前面整理完后更新。

以上是关于习题答案的主要内容,如果未能解决你的问题,请参考以下文章

《C++Primer习题集(第5版)》,对使用C Primer(第五版)学习C 程序设计语言的读者来说是一本非常理想的参考书。

C语言程序设计 《招聘信息管理系统》

谭浩强版C语言程序设计(第三版)课后习题完整答案附源码--高等教育出版社

谭浩强版C语言程序设计(第三版)课后习题完整答案附源码--高等教育出版社

《C语言程序设计(第五版)》习题答案

c语言程序设计第二版宁爱军编课后习题答案