- 什么是算术运算?什么是关系运算?什么是逻辑运算?
答:算术运算:加减乘除;关系运算:><=;逻辑运算:与或非;
- C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?
答:0为假 非零为真
- 写出下面各逻辑表达式的值。设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)直接从左到右结合 0
(2)先从左到右 a||b+c为6 然后再运算b-c为-1 最后6&&-1为1
(3)1
(4)0
(5)1
总结:
- 此题易错点为1&&1+2的实质相当于1&&(1+2)为1
- 有3个整数a, b, c,由键盘输入,输出其中最大的数。
算法思路:
1.函数输入值为三个数,返回值为最大的
代码实现:
#include<stdio.h>
int main(int argc, char const *argv[])
{
int max(int a,int b,int c);
int a,b,c;
printf("please input three numbers:");
scanf("%d%d%d",&a,&b,&c);
printf("the max number is:%d",max(a,b,c));
return 0;
}
int max(int a,int b,int c)
{
int max=a ;
if (max<b)
{
max=b;
}
if (max<c)
{
max=c;
}
return max;
}
结果:
5.从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000 的正数。若不是,则要求重新输入。
算法思路:
1.输入一个数
2.若该数>1000则继续输入
3.若小于1000则调用sqrt函数输出其值
代码结果:
#include<stdio.h>
#include<math.h>
int main(int argc, char const *argv[])
{
double number;
printf("please input a number:");
scanf("%lf",&number);
while (1)
{
if (number<1000.0)
{
printf("the result is :%.0lf",sqrt(number));
break;
}
else
{
printf("please input a number:");
scanf("%lf",&number);
}
}
return 0;
}
算法思路:
三个选择语句对应三个区间的函数
代码实现:
#include<stdio.h>
int main(int argc, char const *argv[])
{
int x,y;
printf("please input a number:");
scanf("%d",&x);
if (x<1)
{
y=x;
}else if (x<=10)
{
y=2*x-1;
}else
{
y=3*x-11;
}
printf("the result is : %d",y);
return 0;
}
#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;
}
#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;
}
答案:
第一个程序输入x=-1,y为0。不满足题目分段函数要求,第二个满足。
总结:
1. 此题的if...else是易错点,else是紧跟他上面最近的if. 若有两个if,除非第二个的if被{ }括起来,否则第二个if后面的else是跟的第二个if,不是第一个,尽管前面有空格
- 给出一百分制成绩,要求输出成绩等级’A’、‘B’、‘C’、‘D’、‘E’。 90分以上为’A’,80~ 89分为’B’,70 ~ 79分为’C’ ,60~69分为’D’ ,60分以下为’E’。
算法思路:
输入一个成绩,不断用if else 实现区间的判断
代码实现:
#include<stdio.h>
int main(int argc, char const *argv[])
{
void printGrade(int grade);
int grade;
scanf("%d",&grade);
printGrade(grade);
return 0;
}
void printGrade(int grade)
{
if (grade>=90&&grade<=100)
{
printf("A");
}else if (grade>=80)
{
printf("B");
}else if (grade>=70)
{
printf("C");
}else if (grade>=60)
{
printf("D");
}else{
printf("E");
}
}
结果:
总结:
- 此题容易想到用switch函数,但是switch函数后的case只能是一个常数,不能用未知数和表达式代替,所以必须得用if else选择结构
- 给一个不多于5位的正整数,要求:①求出它是几位数;②分别输出每一位数字;③按逆序输出各位数字,例如原数为321,应输出123。
算法思路:
1.此题关键是利用number%10000则取到低四位数,number%1000则取到低三位数,number%100则取到低两位数
2.(number%10000)/1000则在低四位基础上取第四位数,三位数/100则取第三位数
代码实现:
#include<stdio.h>
int main(int argc, char const *argv[])
{
int number;
void numberOfQuantity(int number);
void printEveryNumber(int number);
void printEveryNumberReversed(int number);
printf("please input a number:");
scanf("%d",&number);
numberOfQuantity(number);
printf("\n");
printEveryNumber(number);
printf("\n");
printEveryNumberReversed(number);
return 0;
}
void numberOfQuantity(int number)//判断个数
{
int first,second,third,fourth,fifth;
if (number>=10000)
{
printf("five numbers");
}else if (number>=1000)
{
printf("four numbers");
}else if (number>=100)
{
printf("three numbers");
}else if (number>=10)
{
printf("two numbers");
}else if (number>=1)
{
printf("one numbers");
}else
{
printf("not in area!");
}
}
void printEveryNumber(int number)//输出每一位数字
{//规律不要自己去探索了,直接总结前人的规律
if (number/10000>0)
{
printf("%d ",number/10000);
}
if (number/1000>0)
{
printf("%d ",(number%10000)/1000);
}
if (number/100>0)
{
printf("%d ",(number%1000)/100);
}
if (number/10>0)
{
printf("%d ",(number%100)/10);
}
if (number/1>0)
{
printf("%d ",number%10);
}
}
void printEveryNumberReversed(int number)//逆序输出每一位数字
{
if (number/1>0)
{
printf("%d ",number%10);
}
if (number/10>0)
{
printf("%d ",(number%100)/10);
}
if (number/100>0)
{
printf("%d ",(number%1000)/100);
}
if (number/1000>0)
{
printf("%d ",(number%10000)/1000);
}
if (number/10000>0)
{
printf("%d ",number/10000);
}
}
总结与错误:
- 此题对基础不够扎实或者小白来说较难,得弄清楚%符号和/在取第几位数的用法,建议想不出直接理解并运用答案。
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语句编写程序
(2) 使用switch语句编写程序。
算法思路:
1.输入利润按照相应要求返回利润即可
代码实现:
#include<stdio.h>
int main(int argc, char const *argv[])
{
double returnWard1(int profit);
double returnWard2(int profit);
int profit;
double ward1,ward2;
printf("please input profit:");
scanf("%d",&profit);
ward1=returnWard1(profit);
ward2=returnWard2(profit);
printf("%lf %lf",ward1,ward2);
return 0;
}
double returnWard1(int profit)
{
if (profit<100000)
{
return profit*0.1;
}else if (profit<=200000)
{
return 100000*0.1+(profit-100000)*0.075;
}else if (profit<400000)
{
return 200000*0.1+(profit-200000)*0.05;
}else if (profit<=600000)
{
return 400000*0.1+(profit-400000)*0.03;
}else if (profit<=1000000)
{
return 600000*0.015+(profit-600000)*0.015;
}else if (profit>1000000)
{
return 1000000*0.01+(profit-1000000)*0.01;
}
}
double returnWard2(int profit)
{
int grade;
grade=profit/100000;
switch (grade)
{
case 0:
return profit*0.1;
break;
case 1:
return 100000*0.1+(profit-100000)*0.075;
break;
case 2:
case 3:
return 200000*0.1+(profit-200000)*0.05;
break;
case 4:
case 5:
return 400000*0.1+(profit-400000)*0.03;
break;
case 6:
case 7:
case 8:
case 9:
return 600000*0.015+(profit-600000)*0.015;
break;
default:
return 1000000*0.01+(profit-1000000)*0.01;
break;
}
}
总结与经验:
- 用switch(int profit)时,如果需要选择的是一段范围,则可以用profit除以100000来获取相应的等级,配合break来确定范围。
11.输入4个整数,要求按由小到大的顺序输出。
算法思路:
1.用一个数组,比较相邻两个的大小,对数组进行排序。
代码具体实现:
#include<stdio.h>
int main(int argc, char const *argv[])
{
void printNumberOrderly(int a[]);
int a[4];
printf("please input four numbers:");
for (int i = 0; i < 4; i++)
{
scanf("%d",&a[i]);
}
printNumberOrderly(a);
return 0;
}
void printNumberOrderly(int a[])
{
int temp=a[0];
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
if (a[j]>a[j+1])
{
temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
}
}
}
for (int i = 0; i < 4; i++)
{
printf("%d ",a[i]);
}
}
总结与思考:
- 用到了冒泡排序,还不太熟悉
- 可以不用数组的方法,用a,b,c,d四个变量,先将a看作最小的,与后面三个进行比较,如果后面有比a小的,就交换位置,b,c以此类推。
12.有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1,见图。这4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。
算法思路:
1.只要满足在第一象限的圆内则高度为10否则为0
代码具体实现:
#include<stdio.h>
#include<math.h>
int main(int argc, char const *argv[])
{
int judgeCircleArea(int x ,int y );
int x,y,height;
printf("please input x and y:");
scanf("%d%d",&x,&y);
height=judgeCircleArea(x,y);
printf("height is :%d",height);
return 0;
}
int judgeCircleArea(int x ,int y )
{
int flag,height;
if (x*x+y*y-4*fabs(x)-4*fabs(y)+7<=1)
{
flag=1;
}
else
{
flag=0;
}
if (flag)
{
height=10;
}
else
{
height=0;
}
return height;
}
总结:
- 此题分析出数学模型后,用c语言实现还是比较简单。