目录
前言
新手开始学习C语言笔记记录 ,基于b站张鹏伟老师的视频,写给自己的笔记,刚开始会比较杂乱后面会慢慢完善补充修改。从分支循环开始写,前面缺的部分以后会慢慢补上。大家一起学习。
!( >A<) !
(富文本编辑的目录没搞明白,上面的蓝色目录没有转跳功能只能用左侧的目录,目前只有蓝色前言可以跳转,但是会转到总结处。有知道我哪出错的可以简单说下哈)
一、学前基础
●代码中所有符号均为英文半角符号。
●\n 换行 语句的结束需要换行。
●语句结束的时候末尾需要有分号;。
●//注释(不被机器所识别,便于程序员理解)
●= 赋值 (不允许连续赋值,如a=b=1错误)
== 判断相等(5=a 错误,a无法赋值给5 。 5==a好写法,易于避免把a==5写成a=5进行赋值,变量在右侧方便识别错误)
==不能用来判断两个字符串相等,应使用库函数-strcmp
strcmp(passward,"123456")==0 //把两个字符串传给strcmp,若相等返回0,若前者大于后者返回大于0数字,后者大于前者返回小于0数字
●0表示假,非零表示真
二、数据类型
三、
●%s:字符串
●数组
int arr[]={1,2,3,4,5,6,7,8,9,10}; //[1 2 3 4 5 6 7 8 9 10 \0] 数组元素
int sz=sizeof(arr)/sizeof(arr[0]); // [0 1 2 3 4 5 6 7 8 9 10] 数组下标
//计算数组中元素个数
●指针是变量用来存放字节
●default
●x%y 取余子式 计算x/y的余数,常用来判断奇偶 x%2
●goto语句: 无条件转移语句,可以随意跳进跳出循环,从一个语句块转移到另一个语句块无所顾忌。goto语句只能在一个函数范围内跳转,不能跨函数。
goto again直接跳转到下面的again,中间的hello被跳过。
不被推荐使用易出bug,常用于终止程序在某些深度嵌套的结构的处理过程。
goto语言真正适合的场景如下,当从多重循环深处直接跳转到某个外循环之外时。如果用break,就只能一重一重的退,用goto要更合适。
for (...)
for (...)
{
for (...)
{
if (disaster)
goto error;
}
}
…
error :
if (disaster)
// 处理错误情况
四、运算符号
五、分支与循环
由一个分号(;)隔开的就是一条语句
; //空语句
分支语句(选择结构)
if语句
语法结构 (if后语句不加;)
1.if(表达式) 2.if(表达式)
语句; 语句1;
else
语句2;
//多分支
if(表达式1)
语句1
else if(表达式2)
语句2;
else
语句3
例:
{
int age = 10;
if(age<18)
printf("未成年\n");
}
若条件成立需要执行多条语句,使用代码块{}
if(表达式)
{
语句列表1;
}
else
{
语句列表2;
}
else会与最近的一个未匹配的if相匹配 就近原则
switch语句
switch语句常用于多分支的情况
switch(整形表达式)
{
语句项;
}
语句项:一些case语句(整形常量表达式) ( 1.0不是整形,a不是常量)
break跳出switch语句,每一个case后面加上一句break语句。当case语句后面没有break;来打断时会进入吓一条case。
break只能从最内层循环退出跳到上一层的循环。
defalut子句:所有值于case标签都不匹配,位置无所谓顺序。
循环内的switch中break和continue使用区别:
break语句在循环和switch语句中使用,用于终止最近的封闭代码块,如果在嵌套循环中,则只终止最近的循环。
continue语句在循环中使用,不能单独在switch中使用,可以在循环内的switch中使用,用于跳过当次循环,直接进入下一次循环。
switch举例:
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
小测试:判断m,n的值
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:m++;
case 2:n++;
case 3:
switch (n) //switch可以嵌套
{
case 1:n++;
case 2:m++, n++;
break;
}
case 4:m++;
break;
default:
break;
}
printf("m=%d,n=%d\n", m, n);
return 0;
}
m=5,n=3
循环语句
● while
● for
● do while
while循环
while(表达式) //表达式为真,执行语句,循环
循环语句;
例:
int main()
{
int i = 1;
while (i < 10)
{
printf("%d ", i);
i++;
}
return 0;
}
break在while循环中的作用:永久终止循环
int main()
{
int i = 1;
while (i < 10)
{
if(i==5)
break;
printf("%d ", i);
i++;
}
return 0;
}
continue在while循环中的作用:终止本次循环,后面代码不会执行,跳转到while语句的判断部分。
int main()
{
int i = 1;
while (i < 10)
{
if(i==5)
contine;
printf("%d ", i);
i++;
}
return 0;
}
int main()
{
int ch = 0;
//输入函数赋值给ch,当不等于EOF文件结束标志end of file执行循环
//EOF ctrl+z
while ((ch = getchar()) != EOF)
{
//输出函数
putchar(ch);
printf("%c\n", ch);
//二者效果相同
}
return 0;
}
例:while的应用,清楚缓冲区
int main()
{
int ret = 0;
int ch = 0;
char passward[20] = { 0 };
printf("请输入密码>:");
scanf("%s", passward);//%s,字符串
//读取缓冲区passward后面内容到\n,包括\n
while (ch=getchar()!='\n')
{
;
}
printf("请确认 (Y\N)>:");
ret = getchar();
if (ret == 'Y')
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
例2:
int main()
{
int ch = 0;
while( (ch = getchar() )!= EOF)
{
if (ch<'0' || ch>'9')
continue;
putchar(ch);
}
return 0;
}
for循环
循环中最常用,基本可完成所有循环。
for(表达式1;表达式2;表达式3)
循环语句;
表达式1:初始化
表达式2:条件判断
表达式3:调整
截自b站比特
对比while循环
int main()
{
int i = 0; //i的初始化
while (i < 10) //i的判断
{
printf("%d\n", i);
i++; //i的调整
}
return 0;
}
例:
int main()
{
int i = 0;
for (i = 1; i < 10; i++)
printf("%d\n", i);
return 0;
}
建议:
1.不要在for循环中修改循环变量,防止for循环失去控制。
2.for语句的循环控制变量采用“前闭后开区间”的写法。
3.for循环的初始化、判断、调整都可以省略。当判断被省略时,判断条件:恒为真。
建议不要随便省略。
判断题
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++,k++;) //判断部分把0赋值给k,k为0,假,循环不成立。若判断部分表达式为非零,则陷入死循环。
k++;
return 0;
}
do...while()循环
语法:
do
循环语句;
while(表达式);
特点:循环至少执行一次,很少被使用。
例:
int main()
{
int i = 1;
do
{
printf("%d\n", i);
i++;
} while (i < 10);
return 0;
}
练习
1.计算n的阶乘。
int main()
{
int i = 0;
int n = 0;
int ret = 1;
scanf("%d", &n);
for (i = 1; i <=n; i++)
{
ret = ret * i;
}
printf("%d\n", ret);
return 0;
}
2.计算1! + 2! + 3! +.....+10! 正确答案:4037913
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 10; n++)
{
ret=1;
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
sum = sum + ret;
}
printf("%d\n", sum);
return 0;
}
进行优化,删减多余计算
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 10; n++)
{
ret = ret * n;
sum = sum + ret;
}
printf("%d\n", sum);
return 0;
}
3.二分查找。在一个有序数组中查找某个具体的数字。
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;//左下标
int right = sz - 1;//右下标
while (left <= right)
{
int mid = (left + right) / 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;
}
4.编写代码实现用户登录,模拟用户登录场景,并且只能登录三次(只允许输入三次密码,如果密码正确则提示登录成功,如果三次密码均输入错误,则退出程序)
int main()
{
int i = 0;
char passward[20] = {0};
for (i = 1; i <= 3; i++)
{
printf("请输入密码:");
scanf("%s", &passward);
if (strcmp(passward, "123456") == 0) //上面有讲
{
printf("密码正确\n");
break;
}
else
printf("密码错误\n");
}
if (i == 3)
printf("三次密码输入错误,账号已被冻结\n");
return 0;
}
5.打印乘法口诀表
int main()
{
int i = 0;
for (i = 1; i <= 9; i++) //行
{
int k = 0;
for (k = 1; k <= i; k++) //列
{
printf("%d*%d=%-2d ", i, k, i*k);
//%2d 宽度为2,右对齐 %-2d 宽度为2,左对齐
}
printf("\n");
}
return 0;
}
//int main()
//{
// int i = 0;
// for (i = 1; i <= 9; i++)
// {
// int k = 0;
// for (k = 1; k <= i; k++)
// {
// printf("%d*%d=%-2d ", i, k, i*k);
// //%2d 宽度为2,右对齐 %-2d 宽度为2,左对齐
// }
// printf("\n");
// }
// return 0;
//}
六、猜数字游戏
1.电脑会生成一个随机数
2.玩家猜数字
我们将见到学习c语言来第一个小游戏的实现,由于会遇见我们之前并不了解的随机数,所以要先对随机数的生成进行学习,这里贴星空之路Star的随机数生成详解,很详细。
C语言随机数的生成【详解】_⭕星空之路Star的博客⭕-CSDN博客_c语言随机数生成
看完后我们一步步的来实现这个游戏
首先是游戏开始界面
芭比Q了,查后说是把w32改成x64,但我改完后没解决,卡这了,解决后再写
七、函数
1.函数是什么
2.库函数
3.自定义函数
4.函数参数
5.函数的嵌套调用和链式访问
6.函数的嵌套调用与链式访问
7.函数的声明与定义
8.函数递归
函数是什么
●子程序:有一个或多个语句块组成,他负责某项特定任务,且相较于其他代码,具备相对的独立性。
●一般会有输入函数并有返回值,提供对过程的封装与细节的隐藏,这些代码通常被集成为软件库。
c语言中函数的分类;
●库函数:C语言为我们提供的可调用的库函数,我们之前学习C语言时候用到的 printf, scanf, 这些都是c语言为我们提供的。在我们使用某一库函数的时候,需要在程序中嵌入(#include<>) 该函数所需要的头文件。
●自定义函数:与库函数一样,有函数名,返回值与函数参数。但不一样的是这些都是沃恩自己设计。
//返回类型 //函数名 //函数参数
int ADD (int x, int y)
{
int z = 0; //函数体
z = x + y; //交代函数的实现
return 0
//定义函数
int get_max(int x, int y)
{
if (x > y)
return x;
else
return y;
}
int main()
{
int a = 1;
int b = 2;
//函数的使用
int max = get_max(a, b);
printf("max = %d\n", max);
return 0;
}