C语言基础
1.第一个c语言程序
#include <stdio.h>
int main()
{
printf("hello world");
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MDqWMCae-1649660664412)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330114102371.png)]
2.c语言类型以及语句
2.1.关键字
2.1.1数据类型相关关键字
%c ascll码
%d 输出本身
用于定于变量或者类型
类型 变量名 :
char 、short 、 int 、 long 、 float 、 double 、 struct 、 union 、 enum 、 signed 、 unsigned 、 void
1.char 字符型 用char定义的变量 是字符型变量 占一个字节
char ah = 'a' =为赋值号
char ah = 'abc' //错误写法
printf("c =%c\n", c);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LfWJfWBD-1649660664413)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330131522920.png)]
看一些各类型占用几个字节
#include <stdio.h>
int main()
{
char a;
short int b;
int c;
long int d;
float e = 3.8f;
double f = 3.8;
printf("sizeof(a) =%d\n", sizeof(a)); // 1
printf("sizeof(b) =%d\n", sizeof(b)); // 2
printf("sizeof(c) =%d\n", sizeof(c)); // 4
printf("sizeof(d) =%d\n", sizeof(d)); // 4
printf("sizeof(e) =%d\n", sizeof(e)); // 4
printf("sizeof(f) =%d\n", sizeof(f)); // 8
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bixRcS61-1649660664414)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330133001182.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oLL9YkqE-1649660664415)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330133737667.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-04NTFaz6-1649660664415)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330133914065.png)]
12.void关键字 空类型的关键字
char 、 int 、 float 、都可以定义变量
void 不能定义变量 ,没有void 类型的返回值
void是用来修饰函数的参数或者返回值,代表函数没有参数或者没有返回值
例子:
void fun(void){
}
代表fun没有返回值 fun函数没有参数
2.1.2储存类型相关关键字
register 、 static(静态) 、 const(常量) 、 auto 、 extern
1.register
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iY3dHlyG-1649660664416)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330134404256.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yayBSzuM-1649660664416)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330135001474.png)]
不能修饰数组 只能修饰 字符型 整形 ,不能修饰浮点型
2.static
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T5rRwBOg-1649660664416)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330135124942.png)]
3.const
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bedznn1N-1649660664417)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330135141163.png)]
4.auto
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m7V1iOsa-1649660664417)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330135155773.png)]
5.extern
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7QCrDoNY-1649660664418)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330135211706.png)]
2.1.3 控制语句相关的关键字
if 、 else 、 break 、 continue 、 for 、 while 、 do 、 switch 、 case 、goto 、default
2.1.4 其他关键字
sizeof 、 typedef 、 volatile
1.sizeof 测量字节数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jU53nDHn-1649660664418)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330135815570.png)]
2.typedef 重命名相关的关键字
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JaIdvkZF-1649660664419)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330135948633.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pB7iKiMD-1649660664420)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330140052763.png)]
#include <stdio.h>
// 1.short int a ;
// 2.short int INT16;
// 3.typedef short int INT16;
typedef short int INT16;
int main()
{
short int b = 101;
INT16 c = 111;
printf("b=%d\n", b);
printf("c=%d\n", c);
}
3.volatile 易改变得
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CLgvd5t4-1649660664421)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330140725983.png)]
Linux风格
stu_num
驼峰风格
StuNum
大小写敏感
int Num;
int num;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c1wUPTfo-1649660664421)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330141058966.png)]
2.2 数据类型
2.2.1 基本数据类型
char 、 short int 、 int 、 long int 、 float 、 double
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2lFQ4tgs-1649660664422)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330141235803.png)]
字符数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ONn79NK-1649660664422)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330141446722.png)]
整型数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bOykGvgW-1649660664422)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330151540535.png)]
十进制:以正常数字 1-9 开头 如457 789
八进制 :以数字0开头 如 0123
十六进制:以0x开头 如0x123
实型数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yixNa7fZ-1649660664423)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330152439833.png)]
格式化输出字符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FlTZ1xIG-1649660664423)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330152610482.png)]
十进制转二进制
将余数和最后的1从下向上倒序写 就是结果
例如302
302 2 = 151 余0
151 2 = 75 余1
75 2 = 37 余1
37 2 = 18 余1
18 2 = 9 余0
9 2 = 4 余1
4 2 = 2 余0
2 2 = 1 余0
1 2=0 余1
故二进制为100101110
再联想到二进制转十进制
二进制转为十进制的时候,先把二进制从高位(最左边的“1”)开始按从上到下的顺序写出 ,第一位就是最后的商 “2 2 = 1 余0 “,余数肯定是加零。其他位数如果有”1“(原来的余数),就先乘以”2“再加”1“。
下面就是从第一位开始乘以2加余数的方法算回去
例如 100101110
1…………0 2+1=1…………余数为1
0…………1 2+0=2………… 余数为0
0 …………2 2+0=4 ………… 余数为0
1 …………4x2+1=9……………… 余数为1
0…………9x2+0=18 ……………… 余数为0
1 …………18 2+1=37 …………余数为1
1…………… 37 2+1=75…………余数为1
1………………75 2+1=151………… 余数为1
0………………151 2+0=302 ………… 余0
所以得到十进制数302
另:1*2^8+0*2^7+0*2^6+1*2^5+0*2^4+1*2^3+1*2^2+1*2^1+0*2^0=302
八进制转十进制:整体顺序、小数点不变,个位乘8的0次方+十位乘8的1次方...=十进制得数,即可。小数部分从左到右乘8的负一次方开始,以此类推。
十进制转八进制:整体顺序、小数点不变,整数部分除8,余数倒着从左向右排,小数部分乘8,整数自左向右排。
2.2.2 构造类型
概念:由若干个相同或者不同类型的数据构成的集合,这种数据类型被称为构造类型
例:int a[10];
**数组 、 结构体 、共用体 、 枚举 **
2.2.3 类型转换
自动转换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ma0vnDsm-1649660664424)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330160210868.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ma66v1H9-1649660664424)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330161255695.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QSQWnlIU-1649660664426)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330161331099.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ADckVJb-1649660664426)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330163124854.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pV1ZBXXK-1649660664426)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330170226354.png)]
#include <stdio.h>
int main()
{
// printf("%1f\n", 5.0 / 2);
// return 0;
int a = -8;
unsigned int b = 7;
if (a + b > 0)
{
printf("a+b >0\n");
}
else if (a + b < 0)
{
printf("a+b <0\n");
}
else
{
printf("a+b =0\n");
}
printf("a+b =%x\n", a + b);
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ot2Hsb21-1649660664427)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330170836685.png)]
int a;
float f = 5.8f;
a = f;
printf("a=%d", a); //5
return 0;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z8xqQU6z-1649660664427)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330171126176.png)]
强制转换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SeoN6a4J-1649660664428)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330171240716.png)]
float x = 0;
int i = 0;
x = 3.6f;
i = (int)x;
printf("i=%d\n", i);
printf("x=%1f\n", x);
return 0;
说明:
无论是强制类型转换或者是自动转换,都只是为了本次运算的需要,而对变量的数据长度进行临时性的转换,而不改变数据定义的类型以及它的值。
2.2.4 指针
2.3运算符
2.3.1 运算符
用算术运算符将运算对象(也称为操作数)连接起来的、符合C语法规则的式子,称为C算术表达式
运算对象包括常量,变量,函数等等…
例如:a*b/c - 1.5 + ‘a’
2.3.2 运算符的分类
1、双目运算符:即参加运算的操作数有两个
例 +
a+b
2.单目运算符:参加运算的操作数只有一个
++自增运算符 给变量值 +1
– 自减运算符
int a =10;
3.三目运算符: 即参加运算的操作数有三个
()?()😦)
2.3.3 算术运算符
/ + - % += -= *= /= %=
10%3 表达式的结果为 1
复合运算符:
a+=3 相当于 a= a+3
a*=6+8 相当于 a = a*(6+8)
2.3.4 关系运算符
(> 、 < 、== 、>= 、!=)
一般用于判断条件是否满足或者循环语句
2.3.5 逻辑运算符
1.&& 逻辑与
两个条件都为真 。 则结果为真
if()(a>b)&&(a<c))
if(b<a<c)//这种表达式是错误的
2.|| 逻辑或
两个条件至少有一个为真,则结果为真
if()(a>b) || (a<c))
3.! 逻辑非
if(!(a>b))
{
}
2.3.6 位运算符
16进制 除16得余
10进制 除10得余
-数的原码等于正数的原码加个符号位1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6IXIadxW-1649660664430)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330215822663.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KAh6ckPT-1649660664430)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330222009122.png)]
同一为一 ,有0为0.
按位与
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kZ4jHvEJ-1649660664431)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331101220336.png)]
两个都是0则结果为0.有一位为1 则结果为1.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cTBz1sIk-1649660664431)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331103149272.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fOiJzeEw-1649660664432)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331111304992.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V9JEDUXj-1649660664433)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331111334239.png)]
对于无符号数来说,补的就是0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OYluGwdY-1649660664434)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331111533674.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1pPVF56W-1649660664434)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331112145450.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZgfRRKNa-1649660664435)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330220106137.png)]
2.3.7 条件运算符号
三目运算符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L4qTsmf6-1649660664436)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331113128233.png)]
2.3.8 逗号运算符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QM7CeaXp-1649660664436)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331113444463.png)]
2.3.9 自增自减运算符
i++ i–
运算符在变量的后面,在当前表达式中先用i的值,下条语句的时候i 的值改变
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JInPg1r2-1649660664437)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331130542718.png)]
++i --i
在当前表达式中先用i自增后的值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-67IeoJOz-1649660664437)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331130440749.png)]
2.3.10 运算符优先级及结合性
运算符优先级
在表达式中按照优先级先后进行运算,优先级高的优于优先级低的先运算。
优先级一样的按结合性来运算
int a;
a =2+5+3*4-6
运算符结合性
左结合性:从左往右计算
int a;
a=2+3.+9+10;
右结合性:从左往右运算
int a,b,c,d;
a=b=c=d=100;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GOQt5bl7-1649660664438)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331131245656.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DPM0ZHbD-1649660664438)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331131430949.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1kaRIZLw-1649660664439)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331131513416.png)]
2.4 控制语句相关关键字讲解
2.4.1 控制语句相关的关键字
1、if语句
形式 :
if( 条件表达式)
{ //复合语句 ,若干条语句的集合
语句一:
语句二;
}
如果条件成立执行大括号里面的所有语句,不成立的话大括号里的语句不执行
2、
if(条件表达式)
{
}else{
}
if else 语句的作用是,如果if条件成立,执行if后面{}内的语句,否则执行 else 后的语句.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZcCmH3zM-1649660664439)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331132649328.png)]
2.switch 语句
switch (表达式) //表达式只能是字符型或者整型的(short int int long int)
{
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;
default: 语句3; break;
}
注意:break 的使用
2.4.2 循环控制语句
1、for()循环
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iLpR9fKV-1649660664440)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331151831680.png)]
// for (int i = 0; i < 5; i++)
// {
// if (i == 3)
// {
// printf("这个世界很奇妙\n");
// continue;
// };
// printf("i =%d\n", i);
// };
// return 0;
int sum = 0;
for (int i = 0; i <= 100; i++)
{
sum += i;
};
printf("1-100的和sum = %d", sum);
return 0;
循环嵌套
//99乘法表
//循环嵌套
int i, j;
int sum = 0;
for (i = 1; i <= 9; i++) //外层循环一次,内层循环一轮
{
for (j = 1; j <= i; j++)
{
printf("%d*%d=%d ", j, i, j * i);
};
printf("\n");
};
2、while 循环
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HjO4MICU-1649660664440)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331161036106.png)]
//1-100的和
int i = 1;
int sum = 0;
while (i <= 100)
{
sum += i;
i++;
}
printf("sum=%d\n", sum);
return 0;
do{} while(); //至少执行一次
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UGlqdyxq-1649660664441)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331161408879.png)]
int i = 1;
int sum = 0;
do
{
sum += i;
i++;
} while (i <= 100);
printf("sum=%d\n", sum);
return 0;
对于循环来说
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DN4iJgQJ-1649660664441)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331161826494.png)]
3、goto
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BEBYaXx1-1649660664442)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331162134158.png)]
程序经量少使用goto
4.水仙花数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EiT83G1e-1649660664442)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331162241934.png)]
#include <stdio.h>
int main()
{
int a, b, c;
int i;
for (i = 0; i <= 999; i++)
{
a = i / 100; //百位
b = i % 100 / 10; //十位
c = i % 10; //各位
if (i == a * a * a + b * b * b + c * c * c)
{
printf("水仙花数为=%d", i);
};
};
return 0;
}
#include <stdio.h>
int main()
{
/*
任意给出一个年月日、判断是一年的第几天
闰年算法:能被4整除且不能被100整除,或者 能被400整除
如:2012 5 10 是这一年的第131天
提示switch
*/
int year, month, day;
int sum;
printf("please input year month day:\n");
scanf_s(" %d %d %d", &year, &month, &day);
switch (month)
{
case 1:
sum = day;
break;
case 2:
sum = 31 + day;
break;
case 3:
sum = 31 + 28 + day;
break;
case 4:
sum = 31 + 28 + 31 + day;
break;
case 5:
sum = 31 + 28 + 31 + 30 + day;
break;
case 6:
sum = 31 + 28 + 31 + 30 + 31 + day;
break;
case 7:
sum = 31 + 28 + 31 + 30 + 31 + 30 + day;
break;
case 8:
sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + day;
break;
case 9:
sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + day;
break;
case 10:
sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day;
break;
case 11:
sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day;
break;
case 12:
sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day;
break;
default:
sum = 0;
printf("你输入月份有误");
break;
}
if (month > 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
{
sum += 1;
}
printf("%d %d %d 是一年中的第%d 天\n", year, month, day, sum);
return 0;
}
3.数组
3.1数组的概念
数组是若干个相同类型的变量在内存中有序存储的集合。
int a[10]; //定义了一个整型的数组 a, a是数组的名字,数组中有10个元素,每个元素的类型都是 int 类型,而且在内存中连续存储。
这十个元素分别是a[0] a[1] … a[9]
a[0]~a[9]在内存中连续的顺序存储
3.2数组的分类
3.1.1按照元素的类型分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m3aZo3sV-1649660664443)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331172910862.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BfdrmL5Q-1649660664444)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331173159764.png)]
3.2.2 按维数分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccDgTN3Y-1649660664444)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331173359170.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TeXmYZtY-1649660664445)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331173419099.png)]3.3数组的定义
定义一个数组,在内存里分配空间
3.3.1 一维数组的定义
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TIOVYigU-1649660664445)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331174540507.png)]
3.3.2 二维数组的定义
格式:
数据类型 数组名 [行的个数] [列的个数];
int a [4] [5];
定义了20个int 类型的变量 分别是
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aiCUi4W7-1649660664446)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331180506119.png)]
因为一个整数占4个字节 可以按照这样计算
二维数组可以不指定行数,但是必须指定列数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7lpGEwRB-1649660664447)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401093931210.png)]
3.4数组的初始化
定义数组的时候,顺便给数组的元素赋初值,及开辟的内存空间同时并且给元素赋值。
3.4.1一维数组的初始化
a 、 全部初始化
int a[5] = {2,4,7,8,5};
b 、 部分初始化
int a[5] = {2,4,3};初始化赋值不够后面补0
a[0] = 2 a[1] = 4 a[2] =3 a[4] =0 a[5] =0
注意:只能省略后面的元素,可以不初始化,不能中间的不初始化。
3.4.2 二维数组的定义并初始化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nYybKbXP-1649660664447)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401094452739.png)]
#include <stdio.h>
int main()
{
int a[2][2] = {
{
1, 2}, {
4, 5}};
int b[3][3] = {
{
1, 2},
{
9, 8}};
int i, j;
for (i = 0; i < 2; i++)
{
for (j = 0; j < 2; j++)
{
printf("a[%d][%d]=%d ", i, j, a[i][j]);
};
};
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("a[%d][%d]=%d ", i, j, b[i][j]);
};
printf("\n");
};
return 0;
}
#include <stdio.h>
int main()
{
int a[2][3] = {
2, 2, 4, 4, 5, 6};
int i, j;
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
printf("a[%d][%d]=%d", i, j, a[i][j]);
};
printf("\n");
};
}
3.5数组元素的引用方法
3.5.1 一维数组元素的引用方法
数组名[下标]; //下标代表数组元素在数组中的位置
int a[5];
3.5.2 二维数组元素的引用方法
数组名[行下标] [列下标]
int a [4] [5]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y8vKuj7W-1649660664448)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401100950995.png)]
3.5.3 字符数组
char c1[] = {‘c’,‘a’,‘g’,‘r’};
char c2[] = “c prog”;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-et9IrVqY-1649660664448)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401102245644.png)]
[数组是若干个相同类型变量的集合][]
两道练手题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HV98oiTq-1649660664448)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401112245495.png)]
#include <stdio.h>
int main()
{
int i;
int sum = 0;
int year, month, day;
int buf[12] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
printf("please input year month day\n");
scanf_s("%d %d %d", &year, &month, &day);
if (day >= 30 || day < 1)
{
printf("你输入的信息有误");
}
else
{
for (i = 0; i < month - 1; i++)
{
sum += buf[i];
}
sum += day;
if (month > 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
{
sum += 1;
}
printf("sum=%d\n", sum);
}
return 0;
}
打字游戏
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4nmB995c-1649660664449)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401131148819.png)]
#include <stdio.h>
#include <conio.h>
#include <time.h>
void help(void)
{
printf("\n******************************************");
printf("\n* 输入过程中无法退出! *");
printf("\n* 请按住所给字母敲击键盘! *");
printf("\n* 请按任意键开始测试,按下首字母时候开始计时!");
printf("\n* 输入错误则以_表示 ");
printf("\n******************************************\n\n");
}
int main()
{
char ch;
char str[51] = "";
int i;
int count;
time_t start_time, end_time; // typedef long long time_t
while (1)
{
system("cls"); //清除屏幕
help();
ch = _getch();
srand(time(NULL));
for (i = 0; i < 50; i++)
{
str[i] = rand() % 26 + 'a'; // rand()产生一个随机数,26个字母 对26取余 是一个0-25的随机数
}
str[50] = "\0";
printf("%s\n", str);
count = 0;
for (i = 0; i < 50; i++)
{
ch = _getch();
if (i == 0)
{
start_time = time(NULL);
}
if (ch == str[i])
{
count++;
printf("%c", ch);
}
else
{
printf("_");
}
}
end_time = time(NULL);
printf("\n正确率: %d%%\n", count * 100 / 50);
printf("用时%d秒", (long int)end_time - start_time);
//当我输入空格重新开始,输入其他无效,输入esc退出
while (1)
{
ch = _getch();
if (ch == ' ')
{
break;
}
if (ch == 27)
{
return 0;
}
}
}
return 0;
}
4.函数
4.1函数的概念
函数是c语言的功能单位,实现一个功能可以封装一个函数来实现。
定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。
4.2函数的分类
1、从定义的角度分类(即函数是谁实现的)
- 库函数(c库实现的)
- 自定义函数(程序员自己实现的函数)
- 系统调用
2、从参数角度分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7QzEGTfq-1649660664449)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401141601267.png)]
3 、从返回值的角度分类
1.带返回值的函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GGJc1oAs-1649660664450)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401142237504.png)]
2.没有返回值的函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PmDH8tQN-1649660664450)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401144514427.png)]
4.3函数的定义
什么叫做函数的定义呢?即函数的实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-61NS3hK7-1649660664450)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402095635167.png)]
不能再函数体内定义另一个函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eOw6p5hx-1649660664451)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402095940734.png)]
4.4函数的声明
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4kz3tgEL-1649660664451)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402101003626.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B52kLNzI-1649660664452)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402101442600.png)]
声明就是在一个函数中调用另一个函数
1.直接声明法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nVxLDqOF-1649660664452)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402101510543.png)]
#include<stdio.h> //这种类型是C库文件的声明
#include “4_3.h” //是对程序员创建的程序的声明
2.间接声明法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t6jGkYGQ-1649660664452)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402101907638.png)]
3.分文件声明法
将函数都写在一个.c中,使用头文件.h来进行声明,然后再其他文件中就可以直接使用了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T7ZFG7pX-1649660664453)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402103034664.png)]
4.5 函数的调用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N4Fpe71r-1649660664453)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402103315924.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JVIwclJ4-1649660664454)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402103508303.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RtmHhF67-1649660664454)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402103410739.png)]
4.6函数的总结
在定义函数的时候 ,关于函数的参数和返回值是什么情况,完全取决于函数的功能。
使用函数的好处?
1、定义一次,可以多次调用,减少代码的冗余度。
2、使咱们的代码,模块化更好,方便程序调试,而且阅读方便。
递归函数
#include<stdio.h>
int fun(int x){
int p;
if(x==0||x==1)p=3;
else p=x-fun(x-2);
return p;
}
int main(int argc, char const *argv[])
{
printf("%d\n",fun(12));
return 0;
}
//fun(7)=7-fun(5)=7-(5-fun(3))=7-(5-(3-fun(1)))=7-(5-(3-3))=7-5=2 ”
4.7 变量的存储类别
4.7.1 内存的分区:
1、内存:物理内存、虚拟内存
物理内存:实实在在存在的存储设备
虚拟内存:操作系统虚拟出来的内存
操作系统会在物理内存和虚拟内存之间做映射。
在32位平台下,每个进程的寻址范围是4G,0x00 00 00 00 -0xff ff ff ff
在写应用程序,咱们看到的都是虚拟地址。
2、在运行程序的时候,操作系统会将 虚拟内存进行分区。
-
堆
在动态申请内存的时候,在堆中开辟内存。
-
栈
主要存放局部变量。
-
静态全局区
-
未初始化的静态全局区
静态变量(定义变量的时候,前面加static修饰),或全局变量,没有初始化的,存在此区
-
初始化的静态全局区
全局变量、静态变量、赋过初值的,存放此区
-
-
代码区
存放咱们的代码。
-
文字常量区
存放常量的。
4.7.2 普通的全局变量
概念:
在函数外部定义的变量
int num =100; //num 就是一个全局变量
int main(){
return 0;
}
作用范围:
全局变量的作用范围,是程序所有地方。
只不过用之前需要声明。声明方法 extern int num;
注意声明的时候,不要赋值。
生命周期:
程序运行的整个过程,一直存在,直到程序结束。
注意:定义普通的全局变量的时候,如果不赋初值,它的默认值为0
4.7.3 静态的全局变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6E6fWh55-1649660664454)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220403164550691.png)]
#include<stdio.h>
void fun(void) {
static int num = 3; //这就是静态局部变量的好处 ,只执行一次,下次不参与赋值了,此处
// 如果不用static修饰,则在下次执行这个方法的是和num 还是会被赋值。
//不用静态修饰的在内存空间的分配中是同一个
int num1 = 4;
num++;
num1++;
printf("num = %d\n", num);
printf("num1 = %d\n", num1);
}
int main() {
fun();
fun();
fun();
return 0;
}
4.7.4 普通的局部变量
概念:
在函数内部定义的,或者复合语句中定义的变量
int main(){
int num; //局部变量
{
int a;//局部变量
}
}
作用范围:
在函数中定义的变量,在函数中有效。
再复合语句中定义的,再复合语句中有效。
生命周期:
在函数调用之前,局部变量不占用内存空间,调用函数的时候,才为局部变量开辟空间,函数结束了,局部变量就释放了。
在复合语句中的定义亦如此。
#include<stdio.h>