习题答案
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;
运算结果:
数据库系统概论第五版(笔记+习题答案)(全)
因学习数据库系统概论,将会对每一个章节进行一个整理,包括笔记和习题答案。
目录
前言
- 本篇文章学习参考书:《数据库系统概论》第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语言程序设计(第三版)课后习题完整答案附源码--高等教育出版社