一、分支语句
1、多分支语句
if else语句,if与else if的使用
int main() { int age = 100; if (age < 18) printf("未成年\n"); else if (age >= 18 && age < 28) printf("青年\n"); else if (age >= 28 && age < 50) printf("壮年\n"); else if (age >= 50 && age < 90) printf("老年\n"); else printf("长寿\n"); return 0; }
if与else if的使用,if与else if使用时,如果if执行else if就不会执行。
2、悬空else
else与最近的且未匹配的if匹配
int main() { int a = 0; int b = 2; if (a == 1) if (a == 2) //若在这加{}else就无法和这个if匹配 printf("hehe\n"); else printf("haha\n"); return 0; }
3、switch语句
switch(整型表达式)
{
case(整型常量表达式):
}
int main() { int day = 0; scanf("%d", &day); switch(day) //switch括号内的必须是整型表达式 { case 1: //case后面必须是整型常量表达式 printf("星期一\n"); break; case 2: //若1-5的内容都相同 printf("星期二\n"); //case 1: break; //case 2: case 3: //case 3: printf("星期三\n"); //case 4: break; //case 5: case 4: // printf(); printf("星期四\n"); // break; break; case 5: printf("星期五\n"); break; case 6: printf("星期六\n"); break; case 7: printf("星期天\n"); break; default: printf("输入错误\n"); break; } return 0; }
2.循环语句
2.1 while循环
int main() { int i = 1; while (i <= 10) { if (i == 6) break; printf("%d ", i); i++; } return 0; }
结论:break的作用------直接跳到结尾(只要遇到break直接终止所有循环)
int main() { int i = 0; while (i < 10) { i++; if (i == 6) continue; printf("%d ", i); } return 0; }
结论:continue的作用-----回到开头-----终止本次循环,即本次continue后面的语句不再执行,跳回while的判断部分
2.2 getchar()和putchar()
getchar()-----读取一个字符
putchar()-----输出/打印一个字符
int main() { char password[20] = { 0 }; printf("请输入密码:"); scanf("%s", password); //清理缓冲区 while (getchar() != '\n') { ; } //scanf读取完password后剩余一个\n,若不加getchar();会直接读取\n然后输出放弃确认 printf("请确认(Y/N):"); int ch = getchar(); int ret = getchar(); if (ret == 'Y') { printf("确认成功\n"); } else { printf("放弃确认\n"); } return 0; }
2.3 for循环
for(表达式1; 表达式2; 表达式3) { 循环语句; }
表达式1:初始化
表达式2:判读
表达式3:调整
int main() { int i = 0; for (i = 1; i <= 10; i++) printf("%d\n", i); return 0; }
2.4 do…while循环
do…while()循环-----先执行再判断
do { 循环语句; } while(表达式); (判断) 如: int main() { int i = 1; do { printf("%d ", i); i++; } while (i <= 10); return 0; }
2.5 在arr数组(有序的)中找到某个数-----二分查找
int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 7; int sz = sizeof(arr) / sizeof(arr[0]); //计算元素个数 int left = 0; //左下标(以中间元素的下标为标准) 数组元素 1 2 3 4 5 6 7 8 9 10 int right = sz-1; //右下标(以中间元素的下标为标准) 下标 0 1 2 3 4 5 6 7 8 9 while (left <= right) //若查找的元素存在,右下标是会比左下标大的 { //int mid = (left + right) / 2; int mid = left + (right - left) / 2; if (arr[mid] > k) { right = mid - 1; } else if (arr[mid] < k) { left = mid + 1; } else { printf("找到了,下标是:%d\n",mid); break; } } if (left > right) //若查找的元素不存在,左下标是会比右下标大的 printf("找不到\n"); return 0; }
2.6 编写代码,演示多个字符从两端移动,向中间汇聚
int main() { char arr1[] = "welcome to LOL!!!!!"; char arr2[] = "###################"; int left = 0; int right = strlen(arr1)-1; while (right >= left) { arr2[left] = arr1[left]; //使arr1数组左边的元素赋给arr2左边,下同 arr2[right] = arr1[right]; printf("%s\n", arr2); Sleep(1000); //休息1秒,需引用头文件#include<windows.h> system("cls"); //执行系统命令的一个函数-cls-清空屏幕,需引用头文件#include<stdlib.h> left++; right--; } printf("%s\n", arr2); return 0; }
2.7 编写代码实现,模拟登陆情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登陆成功,如果三次都输入错误,则退出程序)
int main() { int i = 0; char password[20] = { 0 }; for (i = 0; i < 3; i++) { printf("请输入密码:"); scanf("%s", &password); if (strcmp(password, "123456") == 0) //(password=="123456"), == 不能用来比较两个字符串是否相等,应该使用一个库函数-strcmp { printf("登陆成功\n"); break; } else { printf("密码错误\n"); } } return 0; }
2.8 猜数字游戏
void menu() { printf("****************************************\n"); printf("**** 1.play 0.exit ****\n"); printf("****************************************\n"); } void game() { //1.电脑生成一个随机数-使用rand()函数--在调用rand之前,使用srand函数为伪随机数生成器种子--在srand()函数里面要放一个随机值,所以引用时间戳放进去 int ret = 0; int guess = 0; //拿时间戳来设置随机数的生成起点 //time_t time(time_t *timer) -时间戳的使用方法time函数(需引用time.h头文件)--time_t是它的类型,实质是long(长整型)--time_t *是指针类型 ret = rand() % 100 + 1; //printf("%d\n", ret); //2.猜数字,猜大了提示你大了,...... while (1) { printf("请输入一个整数(1-100):\n"); scanf("%d", &guess); if (guess > ret) { printf("猜大了\n"); } else if (guess < ret) { printf("猜小了\n"); } else { printf("恭喜你,猜对了\n"); break; } } } int main() { int input = 0; //srand 放在主函数,防止在game()函数里面过于频繁使用,以至于生成的随机值过于相近 srand((unsigned int)time(NULL)); do { menu(); printf("请选择:\n"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误\n"); break; } } while (input); return 0; }
2.9 goto语句的应用-----一个关机程序
在cmd中输入shutdown -s -t 60,电脑会在60s后关机;输入shutdown -a 会取消。代码形式:
int main() { char input[] = { 0 }; //system()--执行系统命令 system("shutdown -s -t 60"); again: printf("请注意,你的电脑将在1分钟内关机,如果输入:我是猪,就会取消关机\n请输入:"); scanf("%s", input); //这里的input是数组,可以不用加& if (strcmp(input, "我是猪") == 0) //strcmp()比较两个字符串 { system("shutdown -a"); } else { goto again; } return 0; }
用循环形式:
int main() { char input[] = { 0 }; //system()--执行系统命令 system("shutdown -s -t 60"); while (1) { printf("请注意,你的电脑将在1分钟内关机,如果输入:我是猪,就会取消关机\n请输入:"); scanf("%s", input); //这里的input是数组,可以不用加& if (strcmp(input, "我是猪") == 0) //strcmp()比较两个字符串 { system("shutdown -a"); break; } } return 0; }
2.10 辗转相除法求最大公约数
求两个数的最大公约数-----辗转相除法:
假如两个数a=24,b=18,先让k=a%b=6,若结果不为0,则将b的值赋给a(a=b=18),k的值赋给b(b=k=6),a%b=0,则b为他们的最大公约数
int main() { int a = 190; int b = 25; int k = 0; while (a % b) //a%b不等于0即为真,执行下面内容;a%b等于0为假,不执行 { k = a % b; a = b; b = k; } printf("最大公约数为:%d\n", b); //5 return 0; }