第4章 选择结构程序设计
1.什么是算术运算?什么是关系运算?什么是逻辑运算?
算术运算:算术运算是数学中的基本运算之一,它包括了加减乘除和取余等运算。在计算机编程中,算术运算是最基础的操作之一。C语言作为一种计算机编程语言,具有强大的算术运算功能。
算术运算符有:+ - * / %(取余)等,详情可见书上52页
关系运算:指比较,大于、大于等于,小于、小于等于,等于、不等于,具体在书上90页
逻辑运算:两个条件进行运算,逻辑与、逻辑或、逻辑非。具体在书上91页
2.C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?
对于逻辑表达式,若其值为“真",则以1表示,若其值为“假”,则以0表示。但是在判断一个逻辑量的值时,系统会以0作为“假”,以非0作为“真”。
3.写出下面各逻辑表达式的值。设a=3,b=4,c=5。
ps:算术运算符优先级>关系运算符>逻辑运算符(不是绝对,逻辑非优先级最高)
(1)a + b > c && b == c
答:3+4 > 5 && 4 == 5
因为3+4等于7大于5,所以为真
4 == 0为假
&&逻辑与运算,有一个假则为假
所以为假,结果是0
(2)a || b + c && b - c
答:3 || 4 + 5 && 4 - 5
因为算术运算符优先级>关系运算符>逻辑运算符
所以就变成 3 || 9&&-1
逻辑与的优先级>逻辑或
9为真 -1是非0,也为真 所以为1
3 || 1 逻辑或其中一个为真则为真,结果是1
(3)! (a>b) && !c || 1
答:!(3>4)&& ! 5 || 1
第一种:最后结果这里是 || 逻辑或运算1,其中一个为真则为真,这里已经逻辑或1了,所以一眼判断结果为1
第二种:3>4为假 0
!(0)&& !5 || 1
!0 为1
1 && 0 || 1
0 || 1 所以结果为1
(4)!(x=a) && (y=b) && 0
答:!(x = 3)&& (y = 4)&& 0
第一种:&&逻辑与运算,有一个假则为假 结果为0
第二种:! x && y && 0
! (3)&&(4)&& 0
0 && 4 && 0
所以结果为0
(5)!(a + b) +c-1 && b+c/2
答:!(3+4)+5-1 && 4+5/2
!(7)+5-1 && 4+2
0 + 5-1 && 4+2
4 && 6 所以结果为1
4.有3个整数a,b,c,由键盘输入,输出其中最大的数。
#include<stdio.h>
int main()
{
int a, b, c;
printf("请输入3个整数:");
scanf("%d,%d,%d",&a,&b,&c);
if (a < b)//如果a<b
if (b < c)//就执行这里,b<c,a<b,所以最大就为c
printf("最大的数为:%d", c);
else
printf("最大的数为:%d", b);//否则在这个if语句中,b>c,最大为b
else if (a < c)//a<c,a<b,最大就为c
printf("最大的数为:%d", c);
else
printf("最大的数为:%d", a);
return 0;
}
5.从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000的正数。若不是,则要求重新输入。
求平方根需要使用数学函数sqrt
所以头文件需要引用#include<math.h>
第一种解法:
#include<stdio.h>
#include<math.h>
int main()
{
int a, b;
printf("请输入一个小于1000的整数:");
scanf("%d", &a);
if (a > 1000)
{
printf("输入有错,请重新输入:");
scanf("%d", &a);
}
else
{
b = sqrt(a);
printf("%d的平方根是%d",a,b);
}
}
这个解法在运行之后,若输入大于1000的数,只处理了一次,提醒用户输入有错,请重新输入,所以是存在问题的
下面的解法将程序改为多次检查,直到正确输入为止。
#include<stdio.h>
#include<math.h>
int main()
{
int a,b;
printf("请输入一个小于1000的整数:");
scanf("%d", &a);
while (a > 1000)
{
printf("输入有错,请重新输入:");
scanf("%d", &a);
b = sqrt(a);
}
printf("%d的平方根整数部分是%d", a, b);
return 0;
}
6.有一个函数:
写程序,输入x的值,输出y相应的值。
根据题意可以分析:
条件1 :x<1
条件2:x>=1且x<10
条件3:x>=10
可以根据if语句,将三个条件使用两个if语句,来判断x<1与x<10。
if x<1 输出..........
else if x<10 输出..........
else 输出..........
具体代码如下:
#include<stdio.h>
#include<math.h>
int main()
{
int x, y;
printf("请输入x:");
scanf("%d", &x);
if (x < 1)
{
y = x;
printf("x=%d,y=x=%d", x, y);
}
else if (x < 10)
{
y = 2 * x - 1;
printf("x=%d,y=2*x-1=%d",x,y);
}
else
{
y = 3 * x - 11;
printf("x=%d,y=3*x-11=%d", x, y);
}
return 0;
}
7.
两段代码如下:
(1)
#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;
}
(2)
#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;
}
程序1:不能实现题目的要求。如果输入的x<0,则输出y=0。
悬空else和离它最近且未匹配的if进行匹配
程序2:也不能实现题目的要求。如果输出的x<0,则输出y=0。
和程序1是同样的问题
8.给出一个百分制成绩,要求输出成绩等级ABCDE
要求:90分以上为A,80-90分:B,70-79分:C ,60-69:D,60分以下:E
这里和我做的C程序设计试题汇编(小绿书)这个题类似
但是我选择的最笨的if语句来执行的,运行暂时也没有发现问题
#include<stdio.h>
int main()
{
int score = 0;
printf("请输入成绩:");
scanf("%d", &score);
while (score > 100 || score < 0)
{
printf("输入有错,请重新输入");
scanf("%d", &score);
}
if (score >= 90)
{
printf("A");
}
else if (score > 80 && score < 89)
{
printf("B");
}
else if (score > 70 && score < 79)
{
printf("C");
}
else if (score > 60 && score < 69)
{
printf("D");
}
else
printf("E");
return 0;
}
但是if.....else这种比较麻烦,可以使用更简洁的Switch语句
如下:
#include<stdio.h>
int main()
{
int score = 0;
char grade;
printf("请输入成绩:");
scanf("%d", &score);
while (score > 100 || score < 0)
{
printf("输入有错,请重新输入:");
scanf("%d", &score);
}
switch (score / 10)
{
case 10:
case 9:grade = 'A'; break;
case 8:grade = 'B'; break;
case 7:grade = 'C'; break;
case 6:grade = 'D'; break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:grade = 'E';
}
printf("成绩是%d,对应的等级是%c\n", score, grade);
}
9.给出一个不多于5位的正整数,要求:
1.求出它是几位数
// 整形运算,得到的结果还是整形
//如果数字大于等于10000就是5位数
//如果数字大于等于1000,小于等于9999,就是四位数
//如果数字大于等于100,小于等于999,就是三位数
//如果数字大于等于1,小于等于99,就是两位数
//否则就是一位数
#include<stdio.h>
int main()
{
int num;
printf("请输入一个不大于五位的正整数:");
scanf("%d", &num);
if (!(num >= 0 && num <= 99999))//如果这个数大于等于0且小于等于9999为真,则逻辑非为假;如果为假,逻辑非后则为真
{
printf("输入错误");
return -1;
}
if (num >= 10000)
{
printf("这个数字是五位数");
}
else if (num >= 1000 && num <= 9999)
{
printf("这个数是四位数");
}
else if (num >= 100 && num <= 999)
{
printf("这个数是三位数");
}
else if (num >= 10 && num <= 99)
{
printf("这个数是两位数");
}
else
{
printf("这个数是一位数");
}
return 0;
}
2.分别输出每一位数字
#include<stdio.h>
int main()
{
int num;
printf("请输入一个不大于五位的正整数:");
scanf("%d", &num);
if (!(num >= 0 && num <= 99999))
{
printf("输入错误");
return -1;
}
if (num >= 10000)
{
printf("%d ",num / 10000);
}
if (num >= 1000)
{
printf("%d ", (num % 10000) / 1000);
}
if (num >= 100)
{
printf("%d ", (num % 1000) / 100);
}
if (num >= 10)
{
printf("%d ", (num % 100) / 10);
}
printf("%d ", num % 10);
return 0;
}
3.按逆序输出各位数字,例如原数为321,输出为123
#include<stdio.h>
int main()
{
int num;
printf("请输入一个不大于五位的正整数:");
scanf("%d", &num);
if (!(num >= 0 && num <= 99999))
{
printf("输入错误");
return -1;
}
printf("%d ", num % 10);
if (num >= 10)
{
printf("%d ", (num / 10) % 10);
}
if (num >= 100)
{
printf("%d ", (num / 100) % 10);
}
if (num >= 1000)
{
printf("%d ", (num / 1000) % 10);
}
if (num >= 10000)
{
printf("%d ", (num / 10000) % 10);
}
return 0;
}
10.
根据题意分析:
10w以下,按照10%提成
10~20万,10万按照10%提成,高出部分按照7.5%提成
20~40万,20万按照20万走,高出20万部分按照5%提成
40~60万,40万按照40万走,高出40万部分按照3%提成
60~100万,60万按照60万走,高出60万部分按照1.5%提成
大于100万,100万按照100万走,高出100万部分按照1%提成
1.计算各个档次最高额的薪资
salary_10=100000*10%,10~20的奖金:salary_10+(I-100000)*7.5%
salary_20=100000*7.5%+salary_10,20~40的奖金:salary_20+(I-200000)*5%
salary_40=100000*5%+salary_20,40~60的奖金:salary_40+(I-400000)*3%
salary_60=100000*3%+salary_40,60~100的奖金:salary_60+(I-600000)*1.5%
salary_100=400000*1.5%+salary_60,大于100的奖金:salary_100+(I-1000000)*1%
(1)用if语句编程序
#include<stdio.h>
int main()
{
double I;
printf("请输入你的利润:");
scanf("%lf", &I);
double salary_10 = 100000 * 0.1;
double salary_20 = (100000 * 0.075) + salary_10;
double salary_40 = (100000 * 0.05) + salary_20;
double salary_60 = (100000 * 0.03) + salary_40;
double salary_100 = (400000 * 0.15) + salary_60;
double salary = 0;
if (I <= 100000)
{
salary = I * 0.1;
}
else if (I > 100000 && I <= 200000)
{
salary = salary_10 + (I - 100000) * 0.075;
}
else if (I > 200000 && I <= 400000)
{
salary = salary_20 + (I - 100000) * 0.05;
}
else if (I > 400000 && I <= 600000)
{
salary = salary_40 + (I - 100000) * 0.03;
}
else if (I > 600000 && I <= 1000000)
{
salary = salary_60 + (I - 100000) * 0.015;
}
else if (I > 1000000)
{
salary = salary_60 + (I - 100000) * 0.01;
}
printf("你的奖金是:%.2f\n", salary);
}
(2)用Switch语句编程序
#include<stdio.h>
int main()
{
double I;
printf("请输入你的利润:");
scanf("%lf", &I);
double salary_10 = 100000 * 0.1;
double salary_20 = (100000 * 0.075) + salary_10;
double salary_40 = (100000 * 0.05) + salary_20;
double salary_60 = (100000 * 0.03) + salary_40;
double salary_100 = (400000 * 0.15) + salary_60;
double salary;
int level =(int)(I / 100000);//强制类型转变
switch (level)
{
case 0:
salary=I * 0.1; break;
case 1:
salary = salary_10 + (I - 100000) * 0.075; break;
case 2:
case 3:
salary = salary_20 + (I - 200000) * 0.05; break;
case 4:
case 5:
salary = salary_40 + (I - 400000) * 0.03; break;
case 6:
case 7:
case 8:
case 9:
salary = salary_60 + (I - 600000) * 0.015; break;
default:
salary = salary_100 + (I - 1000000) * 0.01; break;
}
printf("你的奖金是:%.2f\n", salary);
return 0;
}
11.输入四个整数,要求按由小到大的顺序输出。
由于目前才到第四章,没有学到递归函数与其他更简洁的方法,所以就采用创建临时变量来对这四个整数进行比较
#include<stdio.h>
int main()
{
int tmp, a, b, c, d;
printf("请输入四个整数:");
scanf("%d %d %d %d", &a, &b, &c, &d);
if (a > b)
{
tmp = a;
a = b;
b = tmp;
}
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("a=%d b=%d c=%d d=%d", a, b, c, d);
return 0;
}
12.
求输入位置的高度:其实就是判断坐标是否在圆内
在圆内10m
在圆外0m
输入的坐标绝对值都在3以内,判断输入点,距离圆心的长度,是否大于半径
直角边的第一条边长:输入坐标的(x的绝对值-2)的绝对值就是边长
直角边的第二条边长:输入坐标的(y的绝对值-2)的绝对值就是另一条边长
求数据的绝对值需要用到数学函数fabs
#include <stdio.h>
#include<math.h>
int main()
{
double x, y;//输入x和y的坐标
printf("请输入一个x,y轴坐标<x,y>:");
scanf("%lf,%lf", &x, &y);
if (fabs(x) > 3 || fabs(y) > 3)
{
printf("该点的建筑高度是0m\n");
return 0;
}
//计算输入位置距离圆心的长度:先计算两个边长
double a_x = fabs(fabs(x) - 2);
double b_y = fabs(fabs(y) - 2);
double bevel = sqrt(a_x * a_x + b_y * b_y);//斜边边长 a^2+b^2
if (bevel > 1)
{
printf("该点的建筑高度是0m\n");
}
else
{
printf("该点的建筑高度是10m\n");
}
return 0;
}