文章目录
- 1. 什么是语句
- 2. 分支语句
- 2.1 if语句
- 2.2 switch语句
- 2.3 分支语句练习
- 3. 循环语句
- 3.1 for语句
- 3.2 while语句
- 3.3 goto语句(不推荐使用)
- 3.4 循环语句练习题
1. 什么是语句
C语言中由一个分号隔开的就是一条语句
2. 分支语句 2.1 if语句if语句(单选)
#includeint main(){ int a = 0; if(a == 0) printf("hello world!n"); }
if-else语句(二选一)
#includeint main(){ int a = 0; int b = 2; if(a == 0){ printf("呵呵n"); }else{ printf("哈哈n"); } return 0; } //打印:呵呵
悬空if-else语句(else与最近的未匹配的if相结合)
#includeint main(){ int a = 0; int b = 2; if(a == 0) if(b == 1) printf("呵呵n"); else printf("哈哈n"); return 0; } //打印:哈哈
if-else语句 可以替换为 条件表达式(三目表达式)
#includeint main(){ int a = 1; int b = 5; if(a > b){ printf("max = %dn",a); }else{ printf("max = %dn",b); } //int max = (a > b ? a : b); //printf("max = %dn",max); }
if …else if …else(多选一)
注意事项: 1. 一个 if 后可跟零个或一个 else,else 必须在所有 else if 之后 2. 一个 if 后可跟零个或多个 else if,else if 必须在 else 之前 3. 一旦某个 else if 匹配成功,其他的 else if 或 else 将不会被测试
#include2.2 switch语句int main() { int day = 0; printf("请输入一个整数(1~7):"); scanf("%d", &day); if (day == 1) { printf("工作日n"); } else if (day == 2) { printf("工作日n"); } else if (day == 3) { printf("工作日n"); } else if (day == 4) { printf("工作日n"); } else if (day == 5) { printf("工作日n"); } else if (day == 6) { printf("休息日n"); } else if (day == 7) { printf("休息日n"); } else { printf("数字输入错误,请重新输入!n"); } return 0; }
switch语句(多选一)
每个switch语句中只能出现一条default子句,它可以出现在语句列表中的任何位置。 (相较于if...else if...else使用更简单)
#includeint main() { int day = 0; printf("请输入一个整数(1~7):"); scanf("%d", &day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("工作日n"); break; case 6: case 7: printf("休息日n"); break; default: printf("数字输入错误,请重新输入!n"); break; } return 0; }
#include2.3 分支语句练习int main(){ int n = 1; int m = 2; switch(n){ case 1: m++; case 2: n++; case 3: switch(n){ case 1: n++; case 2: m++;n++; break; } case 4: m++; break; default: break; } printf("m = %d,n = %dn",m,n); return 0; } //结果:m = 5,n = 3
//将三个数按从小到大输出 #includevoid swap(int* x,int* y){ int tmp = *x; *x = *y; *y = tmp; } void sort(int* p1,int* p2,int* p3){ if(*p1<*p2){ swap(p1,p2); } if(*p1<*p3){ swap(p1,p3); } if(*p2<*p3){ swap(p2,p3); } } int main(){ int a,b,c; printf("请输入三个整数:"); scanf("%d %d %d",&a,&b,&c); sort(&a,&b,&c); printf("由大到小排序后为:%d %d %dn",a,b,c); return 0; }
//打印闰年 #includeint main(){ int year = 0; int count = 0; for(year=1000; year<=2000;++year){ //判断year是否为闰年 //1. 能被4整除并且不能被100整除 //2. 能被400整除 if(year%4==0 && year%100!=0){ printf("%d ",year); count++; }else if(year%400 == 0){ printf("%d ",year); count++; } } printf("ncount = %dn",count); return 0; } ------------------------------------ //打印闰年 #include int main(){ int year = 0; int count = 0; for(year=1000; year<=2000;++year){ //判断year是否为闰年 //1. 能被4整除并且不能被100整除 //2. 能被400整除 if((year%4==0 && year%100!=0)|| (year%400 == 0)){ printf("%d ",year); count++; } } printf("ncount = %dn",count); return 0; }
//输出1~100之间的奇数 #includeint main(){ for (int i = 1; i <= 100; ++i){ if (i % 2){ printf("%d ", i); } else{ continue; // printf(""); } } return 0; } ------------------------------------ //输出1~100之间的奇数 #include int main(){ int i = 0; for(i = 1; i <= 100; i+=2){ if(i % 2){ printf("%d ",i); }else{ continue; } } }
下面即将学习的循环语句也能实现
//输出1~100之间的奇数 #include3. 循环语句 3.1 for语句int main(){ int i = 1; while(i<=100){ printf("%d ",i); i+=2; } // while(i<=100){ // if(i%2 != 0) // printf("%d ",i); // ++i; // } return 0; }
for(表达式1;表达式2;表达式3){
语句;
}
表达式1为初始化部分,表达式2为条件判断,表达式3为调整部分
理解for循环的执行顺序(表达式①只执行了一次)
①表达式1 – ②表达式2 – ③语句 – ④表达式3 --⑤表达式2 – ⑥语句 – ⑦表达式3…
for语句使用建议
- 不可在for循环体内修改循环变量,防止for循环失去控制
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法
//死循环 #include3.2 while语句int main(){ for(int i = 1; i<=10; ++i){ if(i = 5){ //修改了循环变量 printf("haha"); } printf("hehe"); } return 0; }
//打印1~10 #includeint main(){ int i = 1; while(i<=10){ printf("%d ",i); ++i; } return 0; }
while语句与if语句的结合
#includeint main(){ int i = 1; while(i<=10){ if(i == 5) break; printf("%d ",i); ++i; } return 0; } //结果:1 2 3 4 ---------------------------------------- #include int main(){ int i = 1; while(i<=10){ ++i; if(i == 5) continue; printf("%d ",i); } return 0; } //结果:2 3 4 6 7 8 9 10 11 ---------------------------------------- //代码死循环 #include int main(){ int i = 1; while(i<=10){ if(i == 5) continue; printf("%d ",i); ++i; } return 0; } //结果:1 2 3 4 [光标]
while语句的常用方法(去除缓冲区多余的字符)
#includeint main(){ int ch = getchar(); putchar(ch); return 0; } ---------------------------------------- #include int main(){ int ch = 0; while((ch=getchar())!=EOF){ putchar(ch); } return 0; } //结束按ctrl + z //EOF end od file -> -1
具体例子
//情况1 //假设输入:12345 //输入缓冲区为:12345n #includeint main(){ int ret = 0; char password[20] = {0}; printf("请输入密码:>"); scanf("%s",password); //输入密码,存放在数组中 //缓冲区还剩余一个"n" //读取下一个'n' getchar(); printf("请确认(Y/N):>"); ret = getchar(); //Y/N if(ret == 'Y'){ printf("确认成功n"); }else{ printf("确认失败n"); } return 0; } //情况2 //输入:12345 ABCDE //输入缓冲区为:12345 ABCDEn //利用getchar(),使用循环接收缓冲区到'n'之前的所有字符(包括空格) #include int main(){ int ret = 0; int ch = 0; char password[20] = {0}; printf("请输入密码:>"); scanf("%s",password); //输入密码,存放在数组中 //缓冲区还剩余一个"n" //读取下一个'n' while((ch = getchar()) != 'n'){ ; } printf("请确认(Y/N):>"); ret = getchar(); //Y/N if(ret == 'Y'){ printf("确认成功n"); }else{ printf("确认失败n"); } return 0; }
3.3 goto语句(不推荐使用)do…while语句(至少执行一次)
goto语句会打乱程序的执行顺序
//电脑关机程序 #include3.4 循环语句练习题#include #include #include int main(){ char input[20] = {0}; //shutdown -s -t 60 //system() 执行系统命令 system("shutdown -s -t 60"); again: printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机n请输入>:"); scanf("%s",&input); if(strcmp(input,"我是猪") == 0){ //比较两个字符串 system("shutdown -a"); }else{ goto again; } return 0; } ------------------------------------ //使用while循环语句 #include #include #include #include int main(){ char input[20] = {0}; //shutdown -s -t 60 //system() 执行系统命令 system("shutdown -s -t 60"); while(1){ printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机n请输入>:"); scanf("%s",&input); if(strcmp(input,"我是猪") == 0){ //比较两个字符串 system("shutdown -a"); break; } } return 0; }
//1.计算n的阶乘 #includeint main(){ int num = 1; int n = 0; printf("请输入一个整数:"); scanf("%d",&n); for(int i = 1; i<=n; ++i){ num *= i; } printf("%d的阶乘为%dnn",n,num); return 0; } ------------------------------------ #include int main(){ int num = 1; int n = 0; printf("请输入一个整数:"); scanf("%d",&n); while(n){ num *= (n--); } printf("%d的阶乘为%dnn",n,num); return 0; } ------------------------------------ #include int fact(int n){ if(n){ return n*fact(n-1); }else{ return 1; } } int main(){ int n = 0; printf("请输入一个正整数:"); scanf("%d",&n); int num = fact(n); printf("%d的阶乘为%dn",n,num); return 0; }
//2.计算1!+2!+3!+...+10! #includeint main(){ int sum = 0; for(int i = 1; i<=10; ++i){ int num = 1; for(int j = 1; j<=i; ++j){ num *= j; } sum += num; } printf("%dn",sum); return 0; } //结果:4037913 ------------------------------------ //代码优化 #include int main(){ int num = 1; int sum = 0; for(int i = 1; i<=10; ++i){ num *= i; sum += num; } printf("%dn",sum); return 0; }
//3.在一个有序数组中查找具体的某个数字n。 //编写int binsearch(int x,int v[],int n); //功能:在V[0] <= V[1]<= V[2]...<= V[n-1]的数组中查找x #includeint main(){ int arr[] = {1,2,3,4,5,6,7,8,9,10}; int k = 7; int i = 0; int sz = sizeof(arr)/sizeof(arr[0]); for(i = 0; i int main(){ int arr[] = {1,2,3,4,5,6,7,8,9,10}; int sz = sizeof(arr)/sizeof(arr[0]); int left = 0; //左下标 int right = sz - 1; //右下标 int a = 0; printf("请输入一个数(1~10):"); scanf("%d",&a); while(left<=right){ //① int mid = (left+right)/2; //② if(arr[mid] > a){ //③ right = mid - 1; }else if(arr[mid] < a){ left = mid + 1; }else{ printf("找到了,下标是:%dn",mid); break; //④ } if(left>=right){ //⑤ printf("找不到n"); } } return 0; }
//4.编写代码,演示多个字符从两端移动,向中间汇聚 //整型数组无须考虑 ' ' 问题, //但字符串或字符数组要考虑 //' ' 问题。 //strlen 是一个函数,它用来计算指定字符串 str 的长度 #include#include #include #include int main(){ char arr1[] = {"welcome to bit!!!!!!"}; char arr2[] = {"####################"}; int left = 0; //int right = sizeof(arr1)/sizeof(arr1[0]-2); int right = strlen(arr1)-1; while(left<=right){ arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf("%sn",arr2); //休息一秒 Sleep(1000); //单位ms system("cls"); //执行系统命令的一个函数 cls清空屏幕 left++; right--; } printf("%sn",arr2); return 0; }
//5.编写代码实现,模拟用户登录场景, //并且只能登录三次。 //(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。) strcmp函数规定:左边大于右边返回正数,左边小于右边返回负数,左边等于右边返回0。 #include#include int main(){ int i = 0; char password[20] = {0}; for(i=0; i<3; ++i){ printf("请输入密码:>"); scanf("%s",password); if(strcmp(password,"123456") == 0){ // *等号*不能用来比较两个字符串是否相等,应该使用一个库函数 strcmp printf("登录成功n"); //strcmp(str1,str2) break; //当str1小于str2时,返回一个小于0的数 }else{ //当str1大于str2时,返回一个大于0的数 printf("密码错误n"); //当str1等于str2时,返回0 } } if(i == 3) printf("n三次密码均错误,退出程序n"); return 0; }
//6.求最大公约数 #includeint main(){ int m,n; int r = 0; printf("请输入两个正整数:"); scanf("%d%d",&m,&n); //while(m%n){ // r = m%n; // m = n; // n = r; //} while(r = m%n){ m = n; n = r; } printf("%dn",n); return 0; }
//7.打印100到200的素数 #includeint main(){ int i,j; int count = 0; for(i = 100; i<=200; ++i){ //判断i是否为素数 //素数判断规则 //1. 试除法(除开1,都没有被整除的数字) for(j = 2; j #include int main(){ int i,j; int count = 0; for(i = 100; i<=200; ++i){ //判断i是否为素数 //素数判断规则 //1. 试除法(除开1,都没有被整除的数字) for(j = 2; j<=sqrt(i); ++j){ //使用库函数 if(i%j == 0){ break; } } if(j>sqrt(i)){ count++; printf("%d ",i); } } printf("ncount = %dn",count); } ------------------------------------ //继续优化 //打印100到200的素数 #include #include int main(){ int i,j; int count = 0; for(i = 101; i<=200; i+=2){ //偶数不可能为素数 for(j = 2; j<=sqrt(i); ++j){ if(i%j == 0){ break; } } if(j>sqrt(i)){ count++; printf("%d ",i); } } printf("ncount = %dn",count); }
//8.编写一个程序数一下 1~100的所有整数中出现数字9的个数 #includeint main(){ int count = 0; for(int i=1; i<=100; ++i){ if((i%10 == 9) || (i/10 == 9)){ printf("%d ",i); count++; } } printf("ncount = %dn",count); return 0; } //结果:9 19 29 39 49 59 69 79 89 90 91 92 93 94 95 96 97 98 99 //count = 19 ------------------------------------ //编写一个程序数一下 1~100的所有整数(个位和十位)中出现数字9的个数 #include int main(){ int count = 0; for(int i=1; i<=100; ++i){ if(i%10 == 9){ printf("%d ",i); count++; } if(i/10 == 9){ printf("%d ",i); count++; } } printf("ncount = %dn",count); return 0; } //结果:9 19 29 39 49 59 69 79 89 90 91 92 93 94 95 96 97 98 99 99 count = 20
//9.分数求和1.0 + (1/2) + (1/3) + (1/4) + ... + (1/99) + (1/100) #includeint main(){ double sum = 0.0; for(int i=1; i<=100; ++i){ sum+=1.0/i; //浮点数除以浮点数 } printf("%lfn",sum); return 0; } //结果:5.187378 ------------------------------------ //分数求和 1.0 + (-1/2) + (1/3) + (-1/4) + ... + (1/99) + (-1/100) #include int main(){ double sum = 0.0; int flag = 1; for(int i=1; i<=100; ++i){ sum+=flag*1.0/i; //浮点数除以浮点数 flag = -flag; } printf("%lfn",sum); return 0; } 结果:0.688172
//10.求最大值 #includeint main(){ int arr[] = {1,2,3,4,5,6,7,8,9,10}; int max = arr[0]; //max不能随便取值(只能取数组里面的任意一个值作为最大值) int sz = sizeof(arr)/sizeof(arr[0]); for(int i=1; i max){ max = arr[i]; } } printf("max = %dn",max); return 0; }
//11.乘法口诀表 #includeint main(){ for(int i=1; i<10; ++i){ for(int j=1; j<=i; ++j){ printf("%d*%d=%-2d ",j,i,(i*j)); } printf("n"); } return 0; }
//12.猜数字游戏 //① 电脑会生成一个随机数 //② 猜数字 #include#include #include void menu(){ printf("*******************************n"); printf("**** 1.play 0.exit ****n"); printf("*******************************n"); } void game(){ //1. 生成一个随机数,rand范围1~32699 int ret = 0; int guess = 0; //拿时间戳来设置随机数的生成起始点 //time_t time(time_t *timer) //time_t ret = rand()%100 + 1; //生成1~100之间的随机数,rand最大尾数为99 // printf("%dn",ret); //2. 猜数字 while(1){ printf("请猜数字:>"); scanf("%d",&guess); if(guess>ret){ printf("猜大了n"); }else if(guess :"); scanf("%d",&input); switch(input){ case 0: printf("退出游戏nn"); break; case 1: game(); //猜数字游戏 break; default: printf("选择错误nn"); Sleep(1000); system("cls"); break; } } while(input); return 0; }



