1.变量的一些问题
1).当变量的值有可能是0时,初始化为-1.
2)C99标准中新增布尔类型,可直接使用
_Bool isTrue; // C99
isTrue = 1 < 2;
printf("%d\n", isTrue);//打印0;
2.程序的结构分类
1).结构化程序设计(英语:Structured programming),一种编程范型。它采用子程序、代码区块、for循环以及while循环等结构,来取代传统的 goto。希望借此来改善计算机程序的明晰性、质量以及开发时间,并且避免写出面条式代码。
2).程序结构分成:顺序结构、分支结构和循环结构
3.if语句
1)复合语句
将多条语句,用花括号括起来,那么就构成一个复合语句,在逻辑上相当于一条语句。
{
if(1 > 2);
printf("打印一下");
printf("程序结束");
//代码段中的语句称为复合语句
}
2).空语句
只有一个分号的语句称为空语句。也就是什么也不做的语句
if(1 > 2);
printf("打印一下");
printf("程序结束");
该段代码执行结果为 :打印一下执行结束,if后为空语句
4.if else 与 if else if语句
/*
学校现在不允许给学生打分,值能够给打 ABCDE 几个等级
如果分数大于等于 90,那么就是 A
如果分数在 80 到 89 之间,就是 B
如果分数在 70 到 79 之间,就是 C
如果分数在 60 到 69 之间,就是 D
如果分数低于 60 分,那么就是 E
*/
if(score <= 100 && score >= 90) {
printf("评级为 A 级\n");
} else if(score >= 80) {
printf("评级为 B 级\n");
} else if(score >= 70) {
printf("评级为 C 级\n");
} else if(score >= 60) {
printf("评级为 D 级\n");
} else {
printf("评级为 E 级\n");
}
注意点:
1、空语句
2、if 语句与复合语句
3、if 语句与 return 语句
4、if 语句的作用域问题
5、作用域紊乱
if(1 > 2) {
int num = 10;
}
printf("%d\n", num);
// 无法获得num
if(1 < 2) int num = 10;
)
6、if 语句与 else 子句的配对问题(悬停 else 问题)
if(num >= 0)
if(num < 5)
printf("printf1\n");
else
if (num < 10)
printf("printf2\n");
if(num > 12)
printf("printf3\n");
else
printf("printf4\n");
打印结果为:printf2 printf4
技巧:从下往上,else 与最近的 if 配对
5.剪刀石头布游戏
思路分析
1)将规则数字化(剪刀:0 石头:1 布:2)
2)计算机出拳
随机出拳,即随机生成一个 0 到 3 的数字
头文件:stdlib.h
arc4random_uniform(int num);
3)提示用户出拳
4)开始比较(详细分析)
// 给出规则 剪刀0 石头1 布2
// 1,声明变量
int computer, player;
// 2,计算机随机的出一个数字(0,1,2)
// 参数为一个非负的整数,表达的含义是创建一个 0 到 该数的随机数
// 这个数字本身取不到
computer = arc4random_uniform(3);
printf("计算机出的是%d\n", computer);
// 3,用户输入数字
printf("请出拳:剪刀0 石头1 布2\n");
scanf("%d", &player); // 假定不会出错
// 5,进行比较
if(computer == player) {
printf("平局\n");
} else if(computer == 2) {
// 看看用户会不会出 0 ,如果用户出0 那么用户赢,否则计算机赢
if(player == 0) {
printf("玩家赢\n");
} else {
printf("电脑赢\n");
}
} else if(player == 2) {
// 看计算机是否出0
if(computer == 0) {
printf("电脑赢\n");
} else {
printf("玩家赢\n");
}
} else if(player > computer) {
printf("玩家赢\n");
} else {
printf("电脑赢\n");
}
6.switch语句
1).switch 后面的表达式的值应该是整型或可以转换为整型的数据
2).switch贯穿:case后不加break执行完成以后,会继续往下执行其他的case.
一个case后可以执行多条语句,也可以执行空语句
例:
case 0: printf("零\n");printf("哈哈哈\n");printf("嘻嘻\n");break;
case 4: case 6: case 9:
case 11:printf("30天\n");break;
注:
1)、switch 需要是整型
2)、case 后可以跟多条语句(变量问题)
3)、break 与 default 都是可选的
4)、default 可以是任意位置
switch (1) {
default:printf("没有匹配\n");
case num:printf("打印2\n");
case 3:printf("打印3\n");
case 4:printf("打印4\n");
}
//打印结果为: 没有匹配 打印2 打印3 打印4
5)、case 后只允许使用常量
6)、case 后也不允许使用小数
7)、case后定义变量时必须加{}
//错误写法
case 1:
printf("请输入一个数字\n");
// int num=2;
// scanf("%d", &num);
break;
//正确写法
case 1:{
printf("请输入一个数字\n");
// int num=2;
// scanf("%d", &num);
}
break;
7.练习
1). 简单计算器
//简单计算器
int calculator(){
int num1,num2,oper; //operation
char array[] = "+-*/";
//0,1,2,3代表+ - * /
//提示用户输入
printf("请输入第一个数:");
scanf("%d",&num1);
printf("请输入运算符(0,1,2,3代表+ - * /):");
scanf("%d",&oper);
printf("请输入第二个数:");
scanf("%d",&num2);
switch(oper){
case(0):printf("%d %c %d = %d",num1,array[oper],num2,num1+num2);break;
case(1):printf("%d %c %d = %d",num1,array[oper],num2,num1-num2);break;
case(2):printf("%d %c %d = %d",num1,array[oper],num2,num1*num2);break;
case(3):printf("%d %c %d = %d",num1,array[oper],num2,num1/num2);break;
}
printf("\n");
2).铁路托运行李规定:行李重不超过50公斤的,托运费按0.15元每公斤计算,如果超过50公斤,超出部分每公斤加收0.1元。编程实现上述功能
double weight; //行李的重量
double delta; //超出部分的重量
double userPrice; //运费
const double price = 0.15;
const double baseWight = 50;
const double deltaPrice = 0.1;
printf("请输入重量:\n");
scanf("%lf",&weight);
if (weight <= baseWight) {
userPrice = weight * price;
} else if (weight > baseWight){
delta = weight - baseWight;
userPrice = baseWight * price+ delta * (price + deltaPrice);
}
printf("你的重量为:%.2lf,运费为%.2lf元\n",weight,userPrice);
3).有3个整数a,b,c,由键盘输入,输出其中最大的数
int a,b,c,max;
//用户输入三个整数
printf("请输入第一个数:\n");
scanf("%d",&a);
printf("请输入第二个数:\n");
scanf("%d",&b);
printf("请输入第三个数:\n");
scanf("%d",&c);
//判断
if (a > b) {
max = a;
if (max < c) {
max = c;
}
}else{
max = b;
}if (max < c) {
max = c;
}
printf("最大的数是:%d\n",max);
4).由用户输入两个日期(1/31/1900),比较哪一个日期更早
int year1,month1,day1;
int year2,month2,day2;
//提示用户输入日期
printf("请输入第一个日期(格式为:1/31/1900):\n");
scanf("%d/%d/%d",&month1,&day1,&year1);
printf("请输入第二个日期(格式为:1/31/1900):\n");
scanf("%d/%d/%d",&month2,&day2,&year2);
//判断
if (year1 > year2){
printf("%d年%d月%d日更早\n",year2,month2,day2);
}else if (year1 < year2){
printf("%d年%d月%d日更早\n",year1,month1,day1);
}else if (year1 == year2){
if (month1 > month2) {
printf("%d年%d月%d日更早\n",year2,month2,day2);
}else if (month1 < month2){
printf("%d年%d月%d日更早\n",year1,month1,day1);
}else if (month1 == month2){
if (day1 > day2) {
printf("%d年%d月%d日更早\n",year2,month2,day2);
}else if (day1 < day2){
printf("%d年%d月%d日更早\n",year1,month1,day1);
}else if (day1 == day2){
printf("%d年%d月%d日和%d年%d月%d日是同一天\n",year1,month1,day1,year2,month2,day2);
}
}
}
5).由用户输入一个两位数,用汉字输出出来
int num;
int decade; //保存十位
int unit; //保存个位
//提示用户输入
printf("请输入一个两位数:\n");
scanf("%d",&num);
if (num < 10 || num >99) {
printf("输入有误,请重新输入\n");
scanf("%d",&num);
}
/*
if (num % 10 == 0) {
switch(num / 10){
case 1: printf("一");break;
case 2: printf("二");break;
case 3: printf("三");break;
case 4: printf("四");break;
case 5: printf("五");break;
case 6: printf("六");break;
case 7: printf("七");break;
case 8: printf("八");break;
case 9: printf("九");break;
}
printf("十");
}else if (num / 10 == 1){
switch(num % 10){
printf("十");
case 1: printf("一");break;
case 2: printf("二");break;
case 3: printf("三");break;
case 4: printf("四");break;
case 5: printf("十");break;
case 6: printf("十");break;
case 7: printf("十");break;
case 8: printf("十");break;
case 9: printf("十");break;
}
}else{
switch(num / 10){
case 2: printf("二");break;
case 3: printf("三");break;
case 4: printf("四");break;
case 5: printf("五");break;
case 6: printf("六");break;
case 7: printf("七");break;
case 8: printf("八");break;
case 9: printf("九");break;
}
printf("十");
switch(num % 10){
case 1: printf("一");break;
case 2: printf("二");break;
case 3: printf("三");break;
case 4: printf("四");break;
case 5: printf("五");break;
case 6: printf("六");break;
case 7: printf("七");break;
case 8: printf("八");break;
case 9: printf("九");break;
}
}
printf("\n");
*/
//方法二,将两位数拆分,商为十位,余数为个位,加权
decade = num / 10;
unit = num % 10;
switch(decade){
case 1: printf("你输入的数为:十");break;
case 2: printf("你输入的数为:二十");break;
case 3: printf("你输入的数为:三十");break;
case 4: printf("你输入的数为:四十");break;
case 5: printf("你输入的数为:五十");break;
case 6: printf("你输入的数为:六十");break;
case 7: printf("你输入的数为:七十");break;
case 8: printf("你输入的数为:八十");break;
case 9: printf("你输入的数为:九十");break;
}
switch(unit){
case 1: printf("一");break;
case 2: printf("二");break;
case 3: printf("三");break;
case 4: printf("四");break;
case 5: printf("五");break;
case 6: printf("六");break;
case 7: printf("七");break;
case 8: printf("八");break;
case 9: printf("九");break;
}
printf("\n");
6).输入年月得到当月天数
//由于2月有28天和29天所以需判断闰年
// 年份可以被4整除且不能被100整除,或者可以被400整除
// year % 4 == 0 && year % 100 != 0 || year % 400 == 0
// 该年就是闰年
int year, month;
// 1,提示输入
printf("请输入年月,2000年1月,可以写作2000-1\n");
// 2,输入内容
scanf("%d-%d", &year, &month);
// 3,判断得结果
/*
if(2月) {
if(闰年)
}else {
switch
}
*/
//先判断简单的
if(month == 2) {
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
// 闰年
printf("29天\n");
} else {
printf("28天\n");
}
} else {
switch (month) {
/*
case 1:printf("31天\n");break;
case 3:printf("31天\n");break;
case 4:printf("30天\n");break;
case 5:printf("31天\n");break;
case 6:printf("30天\n");break;
case 7:printf("31天\n");break;
case 8:printf("31天\n");break;
case 9:printf("30天\n");break;
case 10:printf("31天\n");break;
case 11:printf("30天\n");break;
case 12:printf("31天\n");break;
*/
//简化后,将结果分为30天和31天
case 4: case 6: case 9:
case 11:printf("30天\n");break;
default:printf("31天\n");
}
}