c语言实战开发第三课课上内容讲解
1:变量的回顾与拓展
2:scanf格式化输入
3:判断语句
4:运算符
5:问号表达式
6:逗号表达式
7:demo1:计算工资
8:demo2:年龄的阿拉伯数字转英文数字
一.为何要用变量(回顾与拓展)
保存数据:比如密码、金额等
基本数据类型:
int 4 %d 若想补全,则用0补齐 比如输出03 d=3 则printf(“%0d”,a);
long 4 %ld 当需要申请的位数特别大时,即超过了int类型的max时,才用long
float 4 %f float score = 。。。。;分数通常是浮点型 精度到了 0.000000 后面的数据 四舍五入 如果想保留后面两位 则 %.2f
double 8 %f 类似于float
char 1 %c char choose = 'c'; 不能打汉语:一个汉字占据两个字符,而char只能用一个字符,如果用%c打印,说字符。如果用%d打印,那就是字符对应的ASCII码值。
bool 1 %d bool status = true;printf("%d\n",status);则打印出来1—非0即真 用之前导入一个 stdbool.h 的头文件 (status是状态)
#include<stdlib.h>
#include<stdbool.h>
int main(void){
int count = 0;
count = 9;
char choose = 'c';
printf("I have %d dogs\n",count);
float score = 95.5;
printf("%.2f\n",score);
printf("%c\n",choose);
bool status = true;
printf("%d\n",status);
return 0;
}
打印出如下图所示结果
I have 9 dogs
95.50
c
1
二.scanf格式化输入
1
缓冲区:存的是一个字符串123 456。
终端:123 456 输入之后到缓冲区,然后取值,取值情况如下
int a = 123;
char b = ' ';
int b =456;2
scanf("%d\n",&pwd);
printf("pwd = %d\n",pwd) ;
9
9
pwd = 9
为何输入两次9才输出9:因为我%d后面加了换行,所以里面不要加换行。如果加了\n,它表示的不是换行,而是一个字符串。在输入的时候也要输入\n就可以。而且我经常忘了写取地址&。
三.判断语句
当某种条件成立,才做啥事
if(条件--true即非0/false即0){
成立要做的事情}
条件可能是:
四.运算符 比如+ - *
/ 既可以理解为除,也可以理解为取整 比如写
float r = 3/2;
printf("%f",r);
会打印出1
%(取余)x%51 +50 = 50.......100;(取50到100的随机数)尤其是别忘了+号。
&&(且)两个同时成立
||(或)只需要一个成立++ 自增
int g = 20;
if(g++ == 20){//是两个等号 不是一个
printf("a = 20\n");
printf("%d",g);
}else{
printf("a != 20\n");
printf("%d",g);
}
a = 20
21
--== if(a == 2)而不是 if(a = 2)
=
+= a+=2 == a = a+2
-= !=
五.问号表达式
char c;
if(3 > 1){
c = 'y';
}else{
c = 'n';
}
等价于 c = 3>1? 'y':'n';
六.逗号表达式
表达式1,表达式2,表达式3,表达式4。。。把表达式的最后一个视为赋值结果(用的很少)
int temp = 20;
if(temp--,temp--,temp--)
{
printf("temp = %d\n",temp);
}
就打印出来17
int temp = 20;
int t2 = (temp--,temp--,temp--);
if(t2){
printf("temp = %d\n",temp);
printf("t2 = %d\n",t2);}
temp = 17
t2 = 18
小项目1:计算工资
思路:思路很简单,但是想做完美不容易。注意点①:变量名最好取有实际意义的,不要取那些ab啊之类的。②:在开头最好打印诸如:请输入什么什么,然后在最后再打印出:感谢使用之类的话来。也就是要培养自己的用户思维③:scanf里面经常忘记加&。④:当在每个条件语句中都有相同的命令时,可以把命令移到外面,而不是每次都写,比如这里的打印最后工资就是这样。⑤:使用的时候注意某些变量要在开头位置定义,否则就可能是局部变量,使用时会报错。⑥:最好把运算放在外面,把最后结果放在里面,比如
tax = (salary - 5000)*0.1;
printf("到手工资:%d",salary - tax);
而不要把运算放在里面,否则不知道怎么样就出错了,代码也不好看,显得比较臃肿。
#include<stdio.h>
#include<stdlib.h>
int main (){
/*int a;//注意
scanf("%d",&a);
if(a <= 5000){
printf("%d",a);
}else if (a > 5000 && a <= 8000){
printf("%d",a-(a-5000)*(0.1));//printf后面不能进行运算?
}else if(a > 8000 && a <= 10000){
a = a-300-(a-8000)*(0.15);
printf("%d",a);
}
else{
a = a - 600 - (a-10000)*(0.2);
printf("%d",a);}//else后面不能有括号 *///printf里面不要写过于复杂的运算符
printf("请输入工资:");//这个忘了写,也就是没有用户思维。
int salary = 0;//取名字的时候最好有实际意义,比如这里写的salary。
int pay = 0;//税后工资
scanf("%d",&salary);//我又忘了加&符号
printf("%d",salary);//确定一下自己输入的工资
if(salary < 5000){
pay = salary;
}else if(salary >= 5000 && salary < 8000){
tax = (salary - 5000)*0.1;//先计算出税值
}else if(salary >= 8000 && salary < 10000){
tax = (300)+(salary - 8000)*0.15;
}else{
tax = (salary - 10000)*0.2+600;
}
printf("到手工资:%d",salary - tax);//写一次printf就可以,没必要每个判断都写printf
//需要在开头位置定义一下tax 否则tax是局部变量
return 0;
}
小项目2:年龄中阿拉伯语转英语
**这个项目很有挑战性。但是做完之后才觉得这个思路其实不难,就是平时应用相关知识点太少。整个程序的关键就是能知道运用数组和取余,取整的知识点。
思路
①首先分析从1到99的英文数字,1-19都是没有规律的,所以要把它们逐个写出来,在20之后,就有一定的规律,也就是把十位数分别写出来。
②用数组保存1-19以及十位数。
③用判断语句分别对应这里面的1-9。
④用判断语句分别对应10-19,如何体现出差别?就是对10取余,10-19对10取余,结果各不相同。
⑤用判断语句分别对应19以上的数字,其中十位数用输入的数对10取整来确定,个位数用输入的数对10取余来确定。
⑥打印年龄。注意点
①首先不知道 char后面加✳就是字符串的意思。
②注意对10取整与对10取余的应用。
③if括号后面不能加分号,最后一个else不能加括号
④我自己又重新写了一遍,发现里面有很多变量没必要定义,也就是说增大了代码的复杂性。详见写法2
⑤注意当年龄在20及以上时,应该单独为一个小的方块,也就是那个判断要单独写个return 0;
printf("请输入年龄:\n");
int age = 0;//定义变量保存年龄
scanf("%d",&age) ;
//保存个位数
char* gewei[10] = {"","one","two","three","four","five","six","seven","eight","nine"};//char后面加*就是字符串
//保存10-19
char* temp[10] = {"ten","eleven","twelve","thirteen","forteen","fifteen","sixteen","seventeen","eighteen","ninteen"};
//保存十位
char* shiwei[8] = {"twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"};
char* name ;
if (age < 10){
name = gewei[age];
}else if (age >= 10 && age <= 19){//if后面我写了分号
int index = age%10;//注意这里是对10取余,利用这个余数代到数组里面
name = temp[index];
}else {
//取整,获取个位数和十位数
int g = age%10;
int s = age/10;
//取出对应的单词
char* sString = shiwei[s - 2];//这里写char*而不是int,char*是字符串的意思
char* gString = gewei[g];
printf("your age is %s-%s\n",sString,gString);
return 0;
}
printf("your age is %s\n",name);
写法2
printf("请输入年龄:\n");
int age = 0;//定义变量保存年龄
scanf("%d",&age) ;
//保存个位数
char* gewei[10] = {"","one","two","three","four","five","six","seven","eight","nine"};//char后面加*就是字符串
//保存10-19
char* temp[10] = {"ten","eleven","twelve","thirteen","forteen","fifteen","sixteen","seventeen","eighteen","ninteen"};
//保存十位
char* shiwei[8] = {"twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"};
char* name ;
if (age <= 9){
name = gewei[age];
}else if(age >= 10 && age <= 19){
name = temp[age%10];
}else{
char* gString = gewei[age%10];
char* sString = shiwei[age/10 - 2];
printf("Your age is %s-%s",sString,gString);
return 0;
}
总结:
感觉今天学到的东西比之前都多,首先解决了很多误区与知识盲点,比如/是取余,问号表达式写法等等。再一个是通过两个小demo的书写让我对很多知识点更熟练,而且主要是会了一种思路,一种编程思路,还通过写程序学到了很多知识点。对自己写出来的程序也很有成就感。总之,今天过得贼充实。感谢东哥!下周讲解 switch for循环 while循环 数组 Demo