第四章:选择结构程序设计,涵盖条件判断、分支执行等核心概念,通过if、switch等语句实现不同条件下的程序流程控制。
友情提示:有的题目可能没写,因为我感觉没必要,还有就是下面的所有回答专业性的名词解释使用人工智能或Baidu的,程序是完全自己写的,主要是用来记笔记方便以后复习用的,希望对大家有帮助,共勉!
题目1:什么是算术运算?什么是关系运算?什么是逻辑运算?
算术运算符:算术运算主要指加、减、乘、除以及整数的模运算(取余数),它们是计算机处理数值数据时的基本操作,是数学计算和科学计算的核心。
关系运算符:本质上是比较运算,它将两个数值或表达式进行比较,根据比较结果(如相等、不等、大于、小于等)来判断是否满足特定条件,是数据处理和条件判断的关键环节。
逻辑运算符:是对两个或多个条件进行逻辑组合,包括逻辑与、逻辑或和逻辑非三种基本类型,它们是实现程序逻辑控制、条件判断和流程分支的重要工具。逻辑运算的结果通常是布尔值(真或假),用于决定程序的执行路径。
题目2:C 语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?
在C语言中,逻辑值“真”和“假”通常使用整数类型来表示。其中,非零值通常被视为“真”(true),而零值被视为“假”(false)。
题目3:写出下面各逻辑表达式的值。设a=3,b=4,c=5。
(1)a + b > c && b == c
&&:一假则假
-
首先计算
a + b
,得到 7。 -
然后比较 7 > 5,结果为
true
。 -
接着比较
b == c
,即 4 == 5,结果为false
。 -
最后进行与运算
true && false
,结果为false
。
(2)a || b + c && b - c
||:一真则真
-
首先计算
b + c
,得到 9。 -
然后计算
b - c
,得到 -1。 -
由于逻辑或(
||
)的短路特性,如果a
为非零值(即true
),则不会计算后面的表达式。因为a
的值为 3(true
),所以整个表达式的结果为true
。
(3)!(a > b) && ! c || 1
-
首先比较
a > b
,即 3 > 4,结果为false
。 -
对其取非得到
!(a > b)
,即!false
,结果为true
。 -
接着对
c
取非得到!c
,即!5
,在逻辑表达式中,非零值通常被视为true
,所以!5
的结果为false
。 -
进行与运算
true && false
,结果为false
。 -
最后进行或运算
false || 1
,由于 1 在逻辑表达式中也被视为true
,所以结果为true
。
(4)!(x = a) && (y = b) && 0
-
首先执行赋值操作
x = a
,使得x
的值为 3(在逻辑表达式中视为true
)。 -
对其取非得到
!(x = a)
,即!3
,结果为false
。 -
接着执行赋值操作
y = b
,使得y
的值为 4(在逻辑表达式中视为true
)。 -
但由于前面的结果为
false
,并且与运算有短路特性,所以(y = b)
的结果不会被考虑。 -
最后与数字 0 进行与运算,由于 0 在逻辑表达式中视为
false
,所以整个表达式的结果为false
。
(5)!(a + b) + c -1 && b + c/2
-
首先计算
a + b
,得到 7。 -
对其取非得到
!(a + b)
,即!7
,结果为false
。 -
然后计算
c - 1
,得到 4。 -
进行加法运算
!(a + b) + c - 1
,即false + 4
,在大多数编程语言中,布尔值false
会被转换为数字 0,所以结果为 4。 -
接着计算
c / 2
,得到 2.5,但在逻辑表达式中,这通常会被视为true
。 -
计算
b + c / 2
,即 4 + 2.5,得到 6.5,这同样被视为true
。 -
最后进行与运算
4 && true
,由于 4 在逻辑表达式中视为true
,所以整个表达式的结果为true
。
题目4:有3个整数a, b, c,由键盘输入,输出其中最大的数
这个题目在前面第一章节题目6我使用的是三目运算符计算的,使用了两次三目运算符,这里重新写一个三目运算符计算三者之间的最大值问题和使用if进行对比
int a, b, c, max;
scanf("%d %d %d", &a, &b, &c);
//解释:
//如果a>b则执行问号后面的第一个括号里面的语句进行判断,如果a>c说明a是最大的
//如果a>b则执行问号后面的第一个括号里面的语句进行判断,如果a<c说明c是最大的
//如果a<b则执行冒号后面的语句进行判断,如果b>c说明b是最大的
//如果a<b则执行冒号后面的语句进行判断,如果b<c说明c是最大的
max = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
printf("最大数是:%d\n", max);
三目运算符的优点是:代码简洁,一行即可完成,对于简单的条件判断可以使代码紧凑一点
三目运算符的缺点是:对于复杂的逻辑判断可能比较难以理解,有多条语句的时候不够灵活
现在使用if条件判断来实现
#include <stdio.h>
int main() {
int a,b,c,max;
scanf("%d %d %d",&a,&b,&c);
//先把可能是最大值的数传给max
max = a;
if(b > max)
max = b;
if(c > max)
max = c;
printf("The Max num is %d\n",max);
return 0;
if条件判断的优点:代码逻辑清晰,易于理解,更灵活 if条件判断的缺点:代码量多
题目5:从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000 的正数。若不是,则要求重新输入。
#include <stdio.h>
#include<math.h>
int main() {
int num;
printf("请输入小于1000的正数:");
scanf("%d",&num);
//判断输入的数据是否正确
if(num > 1000 || num < 0){
printf("输入的数据有误,请输入小于1000大于0的数.\n");
}else{
//计算平方根
double sqrt_num = sqrt(num);
//获取平方根的整数部分
int integer_num = (int)(sqrt_num);//强转
//检查平方根是否为整数
if(sqrt_num == integer_num){
printf("%d的平方根是整数:%d\n",num,integer_num);
}else{
printf("%d的平方根不是整数,其整数部分是:%d\n",num,integer_num);
}
}
return 0;
}
题目6:给一个不多于5位的正整数,要求:
①求出它是几位数;
分析:
初始化一个计数器count
为0,用于记录位数。
使用一个while
循环,在循环中将num除以10,直到num
变为0。每次循环count
加1,循环结束后count
的值即为位数。
比如777/10 ===>77/10===>7/10=0===>3位数
#include <stdio.h>
#include <stdlib.h>
int main() {
int num, temp;
printf("请输入一个不多于5位的正整数:");
scanf("%d", &num);
if (num > 99999 || num < 0) {
printf("输入的位数有误,请输入不多于5位的正整数.\n");
exit(EXIT_FAILURE);
}
temp = num; // 保存原始值以便后续使用
int count = 0; // 用于记录位数
// ①:判断它是几位数
while (temp != 0) {
temp /= 10;
count++;
}
printf("%d是%d位数.\n", num, count);
return 0;
}
②分别输出每一位数字;
#include<stdio.h>
#include<stdlib.h>
int main(){
int num,temp;
printf("请输入一个不多于5位的正整数:");
scanf("%d",&num);
if(num > 99999 || num < 0){
printf("输入的位数有误,请输入不多于5位的正整数.\n");
exit(EXIT_FAILURE);
}
temp = num;//保存原始值以便后续使用
int count = 0;//用于记录位数
//①:判断它是几位数
while(temp != 0){
temp /= 10;
count++;
}
printf("%d是%d位数.\n",num,count);
temp = num;//保持num的值是初始值
//②:分别输出每一位数字
printf("从个位到其余位的输出结果如下:");
for(int i = 0;i < count;i++){
int figure = temp % 10;//取出数字的位
printf("%d ",figure);
temp /= 10;
}
printf("\n");
return 0;
}
③按逆序输出各位数字,例如原数为321,应输出123。
#include<stdio.h>
#include<stdlib.h>
int main(){
int num,temp;
printf("请输入一个不多于5位的正整数:");
scanf("%d",&num);
if(num > 99999 || num < 0){
printf("输入的位数有误,请输入不多于5位的正整数.\n");
exit(EXIT_FAILURE);
}
temp = num;//保存原始值以便后续使用
int count = 0;//用于记录位数
//①:判断它是几位数
while(temp != 0){
temp /= 10;
count++;
}
printf("%d是%d位数.\n",num,count);
temp = num;//保持num的值是初始值
//②:分别输出每一位数字
printf("从个位到其余位的输出结果如下:");
for(int i = 0;i < count;i++){
int figure = temp % 10;//取出数字的位
printf("%d ",figure);
temp /= 10;
}
printf("\n");
temp = num;//保持num的值是初始值
//③:逆序输出
printf("逆序输出的结果为:");
while(temp != 0){
int res = temp % 10;
printf("%d ",res);
temp /= 10;
}
printf("\n");
return 0;
}
题目7:输入4个整数,要求按由小到大的顺序输出。
提示:
本章的题目主要是使用if来做的,但是这个题有点麻烦,这里我是用的是先用冒泡排序算法将四个数进行从小到大进行排序,然后输出排序后的数据,冒泡排序算法可以看别人的笔记或者后面我会更新也可以看,这里我就不多加注释了。
#include <stdio.h>
void bubbleSort(int arr[], int n) {
int i, j, temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 交换 arr[j] 和 arr[j + 1]
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int arr[4];
int i;
printf("请输入4个整数:\n");
for (i = 0; i < 4; i++) {
scanf("%d", &arr[i]);
}
bubbleSort(arr, 4);
printf("按由小到大的顺序输出为:\n");
for (i = 0; i < 4; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
题目8:有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1,见图。这4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。
分析:
求解任一点在给定四个圆塔下的建筑高度,需要首先判断该点是否位于某个圆塔内或圆塔上。如果点在圆塔内或圆塔上,则建筑高度为10m;如果点在圆塔外,则建筑高度为0m。
可以使用点到圆心的距离与圆半径的比较来判断点是否在圆内或圆上。如果点到圆心的距离小于等于圆的半径,则点在圆内或圆上;否则,点在圆外。
对于每个圆心,距离公式如下图:
#include <stdio.h>
#include <math.h>
#define RADIUS 1.0
#define TOWER_HEIGHT 10.0
int isInsideCircle(double x, double y, double a, double b) {
double distanceSquared = (x - a) * (x - a) + (y - b) * (y - b);
return distanceSquared <= RADIUS * RADIUS;
}
double getBuildingHeight(double x, double y) {
double heights[4] = {0};
// 检查四个圆
heights[0] = isInsideCircle(x, y, 2, 2) ? TOWER_HEIGHT : 0;
heights[1] = isInsideCircle(x, y, -2, 2) ? TOWER_HEIGHT : 0;
heights[2] = isInsideCircle(x, y, -2, -2) ? TOWER_HEIGHT : 0;
heights[3] = isInsideCircle(x, y, 2, -2) ? TOWER_HEIGHT : 0;
// 如果有至少一个圆包含该点,则建筑高度为塔的高度
for (int i = 0; i < 4; i++) {
if (heights[i] == TOWER_HEIGHT) {
return TOWER_HEIGHT;
}
}
// 如果点不在任何圆的内部或边界上,则高度为零
return 0;
}
int main() {
double x, y;
printf("请输入点的坐标 (x y): ");
scanf("%lf %lf", &x, &y);
double height = getBuildingHeight(x, y);
printf("该点的建筑高度为: %.2fm\n", height);
return 0;
}