写在前面:
- 本系列专栏主要介绍C语言的相关知识,思路以下面的参考链接教程为主,大部分笔记也出自该教程。
- 除了参考下面的链接教程以外,笔者还参考了其它的一些C语言教材,笔者认为重要的部分大多都会用粗体标注(未被标注出的部分可能全是重点,可根据相关部分的示例代码量和注释量判断,或者根据实际经验判断)。
- 如有错漏欢迎指出。
参考教程:C语言程序设计从入门到进阶【比特鹏哥c语言2024完整版视频教程】(c语言基础入门c语言软件安装C语言指针c语言考研C语言专升本C语言期末计算机二级C语言c语言_哔哩哔哩_bilibili
一、while语句
1、语法
while(循环条件)
{
循环语句
}
2、执行流程
(1)判断循环条件是否为真,如果为真(值为非0)则转向下一步,如果为假(值为0)则结束while循环。
(2)运行循环体,接着转回上一步。
3、举例
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
printf("加入比特\n");
int line = 0;
while (line <= 20)
{
line++;
printf("我要继续努力敲代码\n");
}
if (line > 20)
printf("好offer\n");
return 0;
}
二、do…while语句
1、语法
do
{
循环语句
} while(循环条件); //末尾有分号
2、执行流程
(1)执行一遍循环体。
(2)判断循环条件是否为真,如果为真(值为非0)则转向上一步,如果为假(值为0)则结束do…while循环。
3、举例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i); //无论如何,先执行一次循环,再判断是否满足循环条件
} while (i < 10);
return 0;
}
三、for语句
1、语法
for(起始表达式;条件表达式;末尾循环体)
{
循环语句
}
2、执行流程
(1)运行起始表达式。
(2)计算条件表达式的值,如果此值不等于0(即循环条件为“真”)则转向下一步,如果此值等于0(即循环条件为“假”)则结束for循环。
(3)执行一遍循环体。
(4)运行末尾循环体,然后转向第二步。
3、举例
(1)例1:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
(2)例2:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue; //即使continue了某次循环,该次循环本应执行的i++还是会执行,这样就不会出现死循环
printf("%d ", i);
}
return 0;
}
4、使用for语句的一些建议和注意事项
(1)一般在for语句的末尾循环体中修改循环变量,如果是这样的话,最好不要再在for循环体内修改循环变量,防止for循环失去控制。
(2)建议for语句的循环控制变量的取值采用“前闭后开区间”写法,这点主要体现在条件表达式上,具体视情况而定,主要以代码更加清晰易读为目标。
(3)for语句的条件表达式千万不要写成赋值表达式,也就是不要把“==”写成“=”。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++) //k=0这个表达式的结果是k的值,k的值为0,即假,for循环不进行(如果k的值为非0,那么就是死循环)
k++;
return 0;
}
5、for语句的一些变种
(1)省略起始表达式、条件表达式和末尾循环体。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
for (;;)
{
printf("hehe\n");
}
//for循环中的初始化部分、判断部分、调整部分都是可以省略的,但是不建议省略,容易引发问题(判断部分一旦省略就是认为条件恒为真,只能依靠break跳出循环)
return 0;
}
(2)for循环可以嵌套。(当然,while循环和do…while循环也可以嵌套,这里不再赘述)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
//这里打印100个hehe,一次外层循环中内存循环会进行10次,而外层循环会进行10次
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++) //每次进入for循环都会执行一次起始表达式
{
printf("hehe\n");
}
}
return 0;
}
(3)省略起始表达式。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i2 = 0;
int j2 = 0;
//如果省略掉初始化部分,这里只打印10个hehe,内层循环的变量j2变成10后不会重新初始化变回0,也就不会再执行内层循环了
for (; i2 < 10; i2++)
{
for (; j2 < 10; j2++)
{
printf("hehe\n");
}
}
return 0;
}
(4)使用多个变量控制循环。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++) //起始表达式和末尾循环体采用逗号表达式,条件表达式采用逻辑表达式
{
printf("hehe\n");
}
return 0;
}
四、跳转语句
1、break语句
(1)break语句又称为跳出语句,由关键字break加上一个分号构成。
(2)break语句只能用在switch语句和循环语句中。
①在switch语句中,break用来使执行流程跳出switch语句,而继续执行switch语句之后的语句。
②在循环语句中,break用来使执行流程跳出本层循环体(一个break语句只能跳出一层)。
(3)举例:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i = i + 1;
}
return 0;
}
2、continue语句
(1)continue语句又称为继续语句,由关键字continue加上一个分号构成。
(2)continue语句只能用在循环语句中,它的功能是跳过循环体中尚未执行的语句并结束本次循环,然后进行下一次是否执行循环的条件判定。
①在while和do…while循环中,continue语句将使执行流程直接跳转到循环条件的判定部分,然后决定循环是否继续进行。
②在for循环中,当遇到continue时,执行流程将跳过循环体中余下的语句,而专区执行for语句中的“末尾循环体”,再根据循环条件的判断以决定循环是否继续进行。
(3)举例:
①例1:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
while (i <= 10)
{
i = i + 1;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
②例2:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF) //输入Ctrl + z会退出循环
{
if (ch < '0' || ch > '9')
continue;
putchar(ch);
}
return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的
3、goto语句
(1)goto语句又称转向语句,其语法形式如下:
goto <标号>;
①goto为关键字,标号是一个由用户命名的标识符。
②在goto语句所处的函数体中必须同时存在一条由标号标记的语句,这种语法结构称为标号语句,其格式为
<标号> : <语句>
(2)goto语句可以很方便地跳出多层循环,这是单条break语句没办法做到的,但它很容易破坏程序结构,在实际开发中应尽量避免使用goto语句。
(3)举例(请谨慎运行本例的代码):
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string>
int main()
{
char input[10] = { 0 };
system("shutdown -s -t 60"); //对本例介意的可以将该行代码替换为调用printf的语句
again: //转移出口
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
if (0 == strcmp(input, "我是猪")) //对本例介意的可以替换字符串的内容
{
system("shutdown -a"); //对本例介意的可以将该行代码替换为调用printf的语句
}
else
{
goto again; //转移入口
}
return 0;
}
4、return语句
(1)return语句又称返回语句,它有两种语句格式:
①return;
②return <表达式>;
(2)return语句只能用在函数体中。
①在返回类型为void的函数体中,若想跳出函数体,将执行流程转移到调用该函数的位置,应使用return语句的第一种格式(也就是return后面不带表达式的一种)。
②在返回类型不是void的函数体中,应使用(应该是必须使用)return语句的第二种格式(也就是return后面带表达式的一种),使执行流程转移到调用该函数的位置,并将<表达式>的值作为函数的返回值。
五、含循环结构设计的一些例子
1、计算n的阶乘
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int sum = 1;
for (int i = 1; i < n + 1; i++)
{
sum *= i;
}
printf("阶乘结果为:%d\n", sum);
return 0;
}
2、计算 1!+2!+3!+……+10!
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int n = 10;
int temp = 1;
int sum = 0;
for (int i = 1; i < n + 1; i++)
{
temp *= i;
sum += temp;
}
printf("结果为:%d\n", sum);
return 0;
}
3、使用二分查找法在一个有序数组中查找具体的某个数字n
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0; //起始左边下标
int right = sizeof(arr) / sizeof(arr[0]) - 1; //起始右边下标(元素个数减一)
int k;
scanf("%d", &k);
while (left <= right)
{
int mid = (left + right) / 2; //中间元素下标
//printf("mid:%d\n", mid);
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
printf("找到了,下标是:%d\n", mid);
break;
}
//printf("%d\n", right);
//printf("%d\n", left);
}
if (right < left)
{
printf("未找到相应元素\n");
}
return 0;
}
4、演示多个字符从两端移动,向中间汇聚
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string>
#include <windows.h>
#include <stdlib.h>
int main()
{
char arr1[] = "welcome to bit!!!!!!!";
char arr2[] = "#####################";
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000); //休息1000ms <windows.h>
system("cls"); //清屏 <stdlib.h>
left++;
right--;
}
return 0;
}
5、模拟用户登录情景,并且只能登录三次
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string>
int main()
{
int cishu = 0;
char input[20] = { 0 };
printf("请输入密码:");
while (cishu < 3)
{
scanf("%s", input);
if (strcmp(input,"123456") != 0)
{
system("cls");
printf("输入错误,请重新输入(剩余可尝试次数为%d):\n", 2 - cishu);
}
else
{
printf("登录成功!\n");
break;
}
cishu++;
}
return 0;
}
6、打印九九乘法表
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
printf("%d*%d=%-2d ", j, i, i*j); //-2表示划出两格的空间进行左对齐
}
printf("\n");
}
return 0;
}
7、猜数字游戏
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void menu()
{
printf("**********************************\n");
printf("*********** 1.play **********\n");
printf("*********** 0.exit **********\n");
printf("**********************************\n");
}
void game()
{
int i = rand() % 100 + 1; //生成1-100之间的随机数
int input2;
system("cls");
printf("提前看一下正确答案:%d\n", i);
printf("输入数字:");
while (true)
{
scanf("%d", &input2);
if (input2 == i)
{
printf("猜对了!\n");
break;
}
else if(input2 > i)
{
printf("猜大了!\n");
}
else if (input2 < i)
{
printf("猜小了!\n");
}
}
system("pause");
system("cls");
}
int main()
{
srand((unsigned)time(NULL));
int input = 0;
do
{
menu();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
break;
}
} while (input);
return 0;
}