隐式类型转换把一个表达式中的所有数据调整成同样的类型。
把占地小的变量调整成占地大的变量
int和float一起计算时int会被转换成float数
有符号和无符号数据一起计算时把有符号数据转换成无符号数据
强制类型转换可以把任何数据或变量当成某个类型来使用
/*
类型转换练习
*/
#include <stdio.h>
int main() {
char ch = -10;
printf("-10 + 3 > 0是%d\n", -10 + 3 > 0);
printf("-10 + 3u > 0是%d\n", -10 + 3u > 0);
printf("sizeof(3 > 0 ? 1 : 0.9)是%d\n", sizeof(3 > 0 ? 1 : 0.9));
printf("ch是%d,(unsigned char)ch是%d\n", ch, (unsigned char)ch);
return 0;
}
流程控制语句用来改变语句执行顺序
分支语句可以在程序中产生分叉
if语句是一种分支语句
if语句格式如下
if (逻辑表达式1) {//有且只能有一个
逻辑表达式1成立时的处理代码
}
else if (逻辑表达式2) {//0次或多次
逻辑表达式2成立时的处理代码
}
else { //最多一个,可能没有
所有逻辑表达式都不成立的处理代码
}
/*
if练习
*/
#include <stdio.h>
int main() {
int num = 0;
printf("请输入一个数字:");
scanf("%d", &num);
if (num < 0) {
printf("负数\n");
}
else if (num > 0) {
printf("正数\n");
}
else {
printf("零\n");
}
return 0;
}
练习:
1.考试成绩练习
编写if语句时,如果多个分支不重叠才可以使用else,如果必有一个分支成立才可以把最后的逻辑表达式省略。
/*
考试成绩练习
*/
#include <stdio.h>
int main() {
int rank = 0;
printf("请输入考试成绩:");
scanf("%d", &rank);
if (90 <= rank && rank <= 100) {
printf("优\n");
}
else if (80 <= rank && rank <= 89) {
printf("良\n");
}
else if (70 <= rank && rank <= 79) {
printf("中\n");
}
else if (60 <= rank && rank <= 69) {
printf("及格\n");
}
else {
printf("不及格\n");
}
return 0;
}
练习:
2.使用if语句找出四个数字中最大数
/*
最大数练习
*/
#include <stdio.h>
int main() {
int num1 = 0, num2 = 0, num3 = 0, num4 = 0;
int max = 1 << 31;
printf("请输入四个数字:");
scanf("%d %d %d %d", &num1, &num2, &num3, &num4);
if (num1 > max) {
max = num1;
}
if (num2 > max) {
max = num2;
}
if (num3 > max) {
max = num3;
}
if (num4 > max) {
max = num4;
}
printf("最大数是%d\n", max);
return 0;
}
switch...case也是一种分支语句
/*
switch...case分支练习
*/
#include <stdio.h>
int main() {
int num = 0;
printf("请输入1或者2:");
scanf("%d", &num);
switch(num) {
case 1:
printf("男\n");
break;
case 2:
printf("女\n");
break;
default:
printf("人妖\n");
break;
}
return 0;
}
练习:
3.根据年份数字判断是否闰年
能被4整除但不能被100整除
能被400整除
/*
闰年练习
*/
#include <stdio.h>
int main() {
int year = 0;
printf("请输入年:");
scanf("%d", &year);
if ((!(year % 4) && (year % 100)) || !(year % 400)) {
printf("闰年\n");
}
else {
printf("不是闰年\n");
}
return 0;
}
循环语句也是一种流程控制语句,可以反复执行同样一段程序。
for语句是一种循环语句,可以用来描述一个计数过程,格式如下
int loop = 0;
for (loop = 0;loop < 次数;loop++) {
反复执行的语句
}
for语句的执行过程是分组的
for (1;2;3) {
4
}
[1,2] [4, 3, 2] [4, 3, 2] ......
编号为2的语句是一条逻辑表达式,用来控制循环是否要结束。
编号为2的语句为真时启动下一组,为假时循环结束
编号为4的语句可能根本就不执行
/*
循环练习
*/
#include <stdio.h>
int main() {
int loop = 0;
for (loop = 0;loop < 3;loop++) {
printf("1\n");
}
return 0;
}
练习:
1.把一个-128到127之间数字的二进制反向打印在屏幕上
/*
for语句打印二进制练习
*/
#include <stdio.h>
int main() {
int num = 0, loop = 0;
printf("请输入一个-128到127之间的数字:");
scanf("%d", &num);
for (loop = 0;loop < 8;loop++) {
//printf("%d", num & 1);
//num >>= 1;
printf("%d", (num & 0x80) >> 7);
num <<= 1;
}
printf("\n");
return 0;
}
2.摘花瓣练习
/*
花瓣练习
*/
#include <stdio.h>
int main () {
int num = 0, loop = 0, flag = 0;
printf("请输入花瓣片数:");
scanf("%d", &num);
for (loop = 0;loop < num;loop++) {
if (flag) {
flag = 0;
printf("她爱我\n");
}
else {
flag = 1;
printf("她不爱我\n");
}
}
return 0;
}
3.使用for打印如下图形
54321
5432
543
54
5
/*
for练习
*/
#include <stdio.h>
int main() {
int num = 54321, loop = 0;
/*for (loop = 0;loop < 5;loop++) {
printf("%d\n", num);
num /= 10;
}*/
for (num = 54321;num >= 5;num /= 10) {
printf("%d\n", num);
}
return 0;
}
可以使用规律变化的变量替代专门的循环变量。
练习
1.用循环打印如下图形
1 X 9 = 9
2 X 8 = 16
3 X 7 = 21
4 X 6 = 24
5 X 5 = 25
/*
for练习
*/
#include <stdio.h>
int main() {
int num = 0;
for (num = 1;num <= 5;num++) {
printf("%d X %d = %2d\n", num, 10 - num, num * (10 - num));
}
return 0;
}
2.鸡兔同笼问题
一个笼子里鸡兔共 40个头,100只脚,问分别又几只兔子几只鸡?
/*
鸡兔同笼练习
*/
#include <stdio.h>
int main() {
int num = 0;
for (num = 0;num <= 40;num++) {
if ((4 * num + 2 * (40 - num)) == 100) {
printf("兔子一共有%d只,鸡一共有%d只\n", num, 40 - num);
}
}
return 0;
}
3.判断某个正整数是不是素数
/*
判断素数的练习
*/
#include <stdio.h>
int main() {
int num = 0, num1 = 0, res = 1;
printf("请输入一个正整数:");
scanf("%d", &num);
for (num1 = 2;num1 <= num - 1;num1++) {
if (!(num % num1)) {
printf("不是素数\n");
res = 0;
break; //终止循环的执行
}
}
if (res) {
printf("是素数\n");
}
return 0;
}
在循环中随时可以使用break;语句终止循环的执行
在循环中使用continue;语句可以跳到大括号末尾
/*
continue练习
*/
#include <stdio.h>
int main() {
int num = 0;
for (num = 1;num <= 10;num++) {
if (num == 4) {
continue;
}
printf("%d\n", num);
}
return 0;
}
循环嵌套用于把复杂的问题先分组。外层循环描述组之间的变化,内层循环描述组内的变化。
/*
循环嵌套练习
*/
#include <stdio.h>
int main() {
int row = 0, col = 0;
for (row = 5;row >= 1;row--) {
for (col = row;col >= 1;col--) {
printf("%d", col);
}
printf("\n");
}
return 0;
}
练习:
1.打印如下内容
*
**
***
****
*****
2.打印如下内容
*
***
*****
*******
*********
/*
循环嵌套练习
*/
#include <stdio.h>
int main() {
int row = 0, col = 0;
for (row = 0;row <= 4;row++) {
for (col = 0;col <= row - 1;col++) {
printf(" ");
}
for (col = row;col <= 3 * row;col++) {
printf("*");
}
printf("\n");
}
return 0;
}
for循环的多种写法
1.省略大括号
2.使用,操作符
3.临时定义循环变量
4.小括号中只保留循环条件
5.空语句
6.死循环
while语句也是一种编写循环的语句
使用方法如下
while (逻辑表达式) {
反复执行的语句
}
逻辑表达式为真则循环继续执行
假设有如下语句
while (1) {
2
}
执行顺序是[1, 2][1, 2][1, 2]...
练习:
1.猜数游戏
2.统计一个数字中6的个数
/*
猜数练习
*/
#include <stdio.h>
int main() {
int num = 0, num1 = 0;
printf("请输入一个数字:");
scanf("%d", &num);
/*while (num != num1) {
printf("请猜一个数字:");
scanf("%d", &num1);
if (num1 > num) {
printf("猜大了\n");
}
else if (num1 < num) {
printf("猜小了\n");
}
else {
printf("你真聪明\n");
}
}*/
do {
printf("请猜一个数字:");
scanf("%d", &num1);
if (num1 > num) {
printf("猜大了\n");
}
else if (num1 < num) {
printf("猜小了\n");
}
else {
printf("你真聪明\n");
}
} while (num1 != num);
return 0;
}
/*
统计数字中6的个数练习
*/
#include <stdio.h>
int main() {
int num = 0, num1 = 0;
printf("请输入一个数字:");
scanf("%d", &num);
while (num != 0) {
if (num % 10 == 6) {
num1++;
}
num /= 10;
}
printf("一共有%d个6\n", num1);
return 0;
}
do...while也是一种循环,使用方法如下
do {
反复执行的代码
} while (逻辑表达式);
假设有如下语句
do {
2
} while (1);
它的执行顺序是[2 1][2 1][2 1]....
do...while循环至少会执行一遍
while语句也可以写空语句和死循环
goto语句可以跳转到任何一条语句
每次使用scanf函数读数据后都需要清理输入缓冲区
输出缓冲区内容显示在屏幕上的条件
1.遇到\n
2.函数结束
3.输出缓冲区满了
4.使用fflush(stdout)强制刷新
/*
输入缓冲区练习
*/
#include <stdio.h>
int main() {
int num = 0;
printf("请输入一个数字:");
while (!scanf("%d", &num)) {
scanf("%*[^\n]");
scanf("%*c");
printf("请再次输入数据:");
}
scanf("%*[^\n]");
scanf("%*c");
printf("num是%d\n", num);
printf("请输入一个数字:");
scanf("%d", &num);
scanf("%*[^\n]");
scanf("%*c");
printf("num是%d\n", num);
return 0;
}