【C语言入门学习】分支和循环
2024.2.20更新
#基本概念
一、语句
什么是语句?
c语言中语句是用于控制计算机执行相关操作的指令,一个语句 会被编译 成若干条机器命令 继而由计算机执行。
语句的类型
表达式语句
函数调用语句
控制语句
复合语句
空语句
控制语句用于控制程序的执行流程 ,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。可分成以下三类:
条件判断语句也叫分支语句:if语句、switch语句;
循环执行语句:do while语句、while语句、for语句;
转向语句:break语句、goto语句、continue语句、return语句
#代码部分
一、if分支语句
if语句的书写规范,跳转【c语言入门学习】代码的书写规范
二、switch分支语句
switch中break的实际作用是把语句列表划分为不同的分支部分,不加break,会一直向下执行程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 int main () { int n = 1; int m = 2; switch (n)//switch执行一次条件判断,然后指定到对应的case 语句中 { case 1: m++;//n=1,m=3 case 2://此处也会执行,因为没有上句没有break 跳出, case 不需要判断条件,直接执行语句内容 n++;//n=2,m=3 case 3://执行 switch (n) {//switch允许嵌套使用 case 1: n++; case 2: m++; n++;//m=4,n=3 break ;//break跳出自己所在的switch语句 } case 4: m++;//m=5,n=3 break ; default: break ; } printf ("m = %d, n = %d\n" , m, n); return 0; }
三、while循环语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 int main () { //在while 循环中,break 用于永久中止循环 int i = 1; while (i <= 10) { if (i == 5) { break ; } printf ("%d\n" , i); i++; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 int main () { //在while 循环中,continue 的作用是跳过本次循环,直接去判断部分,看是否进行下一次循环体 int i = 1; while (i <= 10) { if (i == 5) { continue ; } printf ("%d\n" , i); i++; } }//执行结果:continue 执行时会直接跳转到while 判断部分,而i=5保持不变,程序无限循环
#do while循环语句
先执行循环体,在执行循环判断
1 2 3 4 5 6 7 8 9 10 11 12 int main () { int i = 0; do { printf ("hi\n" ); i++; } while (i < 5); }
三、for循环语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main () { int i = 0;//c语言风格for 语句之前需要定义变量,c++可以在for 循环内部定义 for (i = 1; i <= 10; i++) { if (i == 5) { continue ; }//会执行i++,之后i=6 printf ("%d\n" , i);//结果跳过5 } return 0; }
for循环范例:
for循环实现阶乘
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main () { int n = 0 ; printf ("请输入n:" ); scanf ("%d" , &n); int i = 0 ; int num = 1 ; for (i = 1 ; i <= n; i++) { num = num * i; } printf ("%d\n" , num); return 0 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 int main()// for 循环 中最好不要在 循环体 内部 进行 变量再定义 { int i = 0; for (i = 0; i < 10; i++) { printf ("%d" , i); i = 5; } return 0; }
for循环实现1到10的阶乘和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main () { int i = 0 ; int num = 1 ; int sum = 0 ; for (i = 1 ; i <= 10 ; i++) { num *= i; sum += num; printf ("第%d次和为:%d\n" , i, sum); } printf ("总的和为:%d\n" , sum); return 0 ; }
for循环输出1到100中3的倍数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main008 () { int i = 0 ; for (i = 1 ; i <= 100 ; i++) { if (i % 3 == 0 ) { printf ("%d\n" , i); } } return 0 ; }
#字符操作语句
getchar
作用:read/print “abcde” from stdin
可能的输出:
1.End of File reached
2.字符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int main () { //getchar() 获取一个字符 //EOF end of file 文件结束的标识 //putchar() 输出一个字符 //int ch = getchar(); //putchar(ch); int ch = 0; while ((ch = getchar()) != EOF) { putchar(ch); } return 0; //ctrl + z 读取到EOF结束 }
1 2 3 4 5 6 7 8 9 运行结果: a a v v c c ^Z D:\2_c++_项目\0_C_Project\01 分支和循环\Release\01 选择结构.exe (进程 39324)已退出,代码为 0。
范例:密码程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 int main () { char password[20] = { 0 }; printf ("请输入密码:" ); scanf("%s" , password); printf ("请确认密码(Y/N):" ); //清除缓存区 //getchar();//得到\n:回车 //getchar();执行一次只能获取一个字符 //清理缓冲区的多个字符 int tmp = 0; while ((tmp = getchar()) != '\n' ) //getchar函数得到的是字符,但是返回值是ASCII值等等,所以可以用整型变量获取 { ;//空操作 } int ch = getchar(); if (ch == 'Y' ) { printf ("确认成功\n" ); } else { printf ("确认失败\n" ); } return 0; }
固定范围字符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main07 () { int ch = 0 ; while ((ch = getchar()) != EOF) { if (ch < '0' || ch >'9' ) { continue ; } putchar (ch); } }
猜数字游戏
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <time.h> void meun () { printf (" ************************ \n" ); printf ("**************************\n" ); printf ("****** 猜数字游戏 ******\n" ); printf ("**** 1.开始 *****\n" ); printf ("**** 0.结束 *****\n" ); printf ("**************************\n" ); printf (" ************************ \n" ); } void Game () { int ret = rand() & 100 + 1 ; int guess = 0 ; while (1 ) { printf ("请猜数字:" ); scanf ("%d" , &guess); if (guess > ret) { printf ("猜大了\n" ); } else if (guess < ret) { printf ("猜小了\n" ); } else { printf (" * *\n" ); printf ("* * * *\n" ); printf ("恭喜你猜对了!\n" ); break ; } } } int main () { srand((unsigned int )time(NULL )); int input = 0 ; do { meun(); printf ("请选择:>" ); scanf ("%d" , &input); switch (input) { case 1 : printf ("<游戏开始>\n" ); Game(); break ; case 0 : printf ("<游戏结束>\n" ); break ; default : printf ("<输错了,请重新输入!>\n" ); } } while (input); return 0 ; }
关机程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <stdlib.h> #include <string.h> int main () { char input[20 ] = { 0 }; system("shutdown -s -t 60" ); again: printf ("请注意,你的电脑将在1分钟内关机,如果输入:我爱玩原神,就取消关机\n" ); scanf ("%s" , input); if (strcmp (input, "我爱玩原神" ) == 0 ) { system("shutdown -a" ); } else { goto again; } return 0 ; }
二分值法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main () { int arr[] = { 1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 }; int k = 7 ; int len = sizeof (arr) / sizeof (arr[0 ]); int left = 0 ; int right = len - 1 ; while (left <= right) { int mid = left + right; if (arr[mid] < k) { left = mid + 1 ; } else if (arr[mid] > k) { right = mid - 1 ; } else { printf ("要查找的值对应数组中的下标[%d]\n" , mid); break ; } } if (left > right) { printf ("数组中没有待查找的值" ); } return 0 ; }
字符汇聚
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <Windows.h> int main () { char arr1[] = "Welcome to bit!!!!!!" ; char arr2[] = "####################" ; int left = 0 ; int right = strlen (arr1) - 1 ; for (;left <= right; left++, right--) { arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf ("%s\n" , arr2); Sleep(1000 ); system("cls" ); } return 0 ; }
密码验证程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> int main () { char password[20 ] = {0 }; int i = 0 ; for (i = 0 ; i < 3 ; i++) { printf ("请输入密码:>" ); scanf ("%s" , password); if ((strcmp (password, "123456" )) == 0 ) { printf ("密码正确\n" ); break ; } else { printf ("密码错误\n" ); } } if (i == 3 ) { printf ("连续三次输入错误密码,程序退出...\n" ); } return 0 ; }
冒泡排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main () { int a = 5 , b = 1 , c = 9 ; int arr[3 ] = { a,b,c }; int i, j = 0 ; for (i = 0 ; i < 3 ; i++) { scanf ("%d" , &arr[i]); } printf ("原始数组为:" ); for (i = 0 ; i < 3 ; i++) { printf ("%d " , arr[i]); } int len = sizeof (arr) / sizeof (arr[0 ]); int temp = 0 ; for (i = 0 ; i < len - 1 ; i++) { for (j = 0 ; j < len - i - 1 ; j++) { if (arr[j] < arr[j + 1 ]) { temp = arr[j]; arr[j] = arr[j + 1 ]; arr[j + 1 ] = temp; } } } printf ("从高到低排序:" ); for (i = 0 ; i < len; i++) { printf ("%d " , arr[i]); } return 0 ; }
求最大公约数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main () { int m = 0 ; int n = 0 ; scanf ("%d %d" , &m, &n); int min = 0 ; if (m > n) { min = n; } else if (m < n) { min = m; } else min = m; int i = 0 ; int t = 0 ; while (t = m % n) { m = n; n = t; } printf ("最大公约数是:%d\n" , n); return 0 ; }
闰年判断程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main () { int y, count = 0 ; for (y = 1000 ; y <= 2000 ; y++) { if ((y % 100 != 0 && y % 4 == 0 ) || (y % 400 == 0 )) { printf ("闰年为:%d年\n" , y); count++; } } printf ("闰年个数为:%d" , count); return 0 ; }
素数判断程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main () { int i, j = 0 ; for (i = 100 ; i <= 200 ; i++) { for (j = 2 ; j < i; j++) { if (i % j == 0 ) { break ; } } if (j == i) { printf ("%d为素数\n" , i); } } return 0 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <math.h> int main () { int i, j = 0 ; for (i = 101 ; i <= 200 ; i += 2 ) { int flag = 1 ; for (j = 2 ; j <= sqrt (i); j++) { if (i % j == 0 ) { flag = 0 ; } } if (flag == 1 ) { printf ("%d是质数\n" , i); } } return 0 ; }