章节6_老司机登场之数组及常用算法
课时35_初识数组
数组:是一个变量,有数据类型相同的一组元素组成,内存中的一串连续的空间
数组=标识符(名称)+元素+下表+类型
数组长度固定不变
课时36_初识一维数组
datatype arrayName[size]
int yeats[6]={1,2,3,4,5,6}
int yeats[6]={1,2}不够的编译器默认给0
int yeats[]={1,2} 编译器把数组长度定为2,之后就不能再变长了
int yeats[]={} 错误的不可以这样!
课时37_pass
课时38_小议数组排序
冒泡排序:遍历和交换
eg: 16 25 9 90 23
从大到小降序排列
第一轮循环:
- 25 16 9 90 23
- 25 16 9 90 23
- 25 16 90 9 23
- 25 16 90 23 9
1.需要(数组长度-1)轮
2.每一轮比较次数比上一次-1轮
逆序:首尾交换
课时39_pass
章节7_陛下,您该翻牌了!
课时40_二维数组
游戏行走动画
datatype arrayName [rowsize][colsize]
double scores[4][3]={{98,67,89},
{89,67,88},
{99,77,55},
{99,77,55} }
printf("%-8.2lf",scores[i][j])
负号左对齐,否则默认的是右对齐,8是指8个字符宽。
课时41_pass
课时42_实战项目剖析
题目:使用控制台编写一个小游戏,分别实现以下功能:
新增数据
修改数据
查询数据
数据排序
游戏规则:
游戏一共进行10天,。。。。。。
播放音乐
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"Winmm.lib")
//播放音乐
PlaySound('TEXT("sounds\\背景音乐.wav")',
NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
课时43_代码实现
音乐播放需要:
设置>编译器 >连接器设置>-lwnmm
数组index超过了不会报错,还是会执行,只是乱码了
章节8_指针-C语言的灵魂之旅
课时44_初识指针
指针pointer:是一个值为内存地址的变量(或数据对象)
内存地址:16进制地址
数据类型 * 指针变量名
int num = 9
int * ptr_num = NULL
指针的初值设为空,表示指针不指向任何地址。(这样写保险)
取地址运算符&
ptr_num = &num
间接运算符*
*ptr_num = 1111//把这个地址对应的空间改为1111
*ptr_num 取这个地址的值
int * ptr_num2 = &ptr_num //指针的地址
%p 打印指针类型的数据
%x,%X 读入十六进制整数
课时45_指针代码实战
ptr2 = ptr1
直接操作指针,ptr2的指向更改为指向ptr1所指向的地方
课时46_指针小结
注意:
1.指针变量的命名规则和其他变量的命名规则一样
2.不能同名
3.申明之后就不能存其他类型了
4.指定地址,不能附地址。
课时47_指针与数组
数组:存储在一块连续的内存空间中,数组名=首地址。
int num[50];
num = &num[0]
指针的算术运算
*ptr++ = (*ptr) + (ptr++ )
先取内容再移动指针;指针++,指向下一个元素
一个类型为T的指针的移动,以sizeof(T)为单位移动,地址本身是占4个字节
数组的第i+1个元素可表示为
第i+1个元素的地址=&num[i+1]=num+i+1
第i+1个元素的值 = num[i+1] = *(num + i + 1)
为指向数组的指针赋值
int * ptr_num = num
int * ptr_num = &num[0]
指针变量可以指向数组元素
int * ptr_num = &num[4]
int * ptr_num = num+4
double score[] = {1,2,3,4,5};
double * ptr_socre = score;
fot(i=0;i < 5;i++)
{
printf("%.2lf\n",ptr_score[i])//访问同数组
printf("%.2lf\n",*(ptr_score+i))
printf("%.2lf\n",*ptr_score++)//改变了指针的位置
}
课时48_指针与数组示例
题目:数组逆序
ptr_num_start++;
ptr_num_end++;
课时49_二维数组与指针
double a[5][3]={{…},{…},…}
先访问行再访问列;二维数组的首地址&a[0][0]
使用指针访问二维数组中的元素
一维数组 a[i] => *(a + i)
二维数组 进化一下a[i][j] => *(a[i] + j)
再进化一下 a[i][j] => ((a + i) + j)
注意
double * ptr_a = a
((ptr_ + i) + j) 错误:因为指针有类型空间的问题
应该申明的时候让指针有维
double (* ptr_a)[3] = a;
课时50_课程小结
1.&取地址
2.* 根据地址取值 —— 顺藤摸瓜
3. 指针不可以赋常亮
4.((a + i) + j)## 标题
章节9_函数初探-神奇的“黑盒”
课时51_函数初探
函数(function):完成特定任务的独立代码
优势:
1.可以省去重复代码
2.模块化,提高代码可读性
3. 方便后期修改、完善
种类:
1.内置函数
由c语言系统提供
需要在程序前包含定义函数的头文件
2.自定义函数
不带参数
带参数
课时51 52 53_内置函数
#include <ctype.h>
int main()
{
print("%d\n",isupper('a'))
}
isupper 返回传入的字符是否为大写字母(0为假,非0为真),所属头文件ctype.h
ceil(天花板,向上取整);floor(地板,向下取整),所属头文件math.h
另外有stdlib.h(标准库中):
srand(time(NULL))#1.设置随机种子,一般跟时间连用,因为时间每时每刻都不同
rand()#1.设置随机种子,一般跟时间连用,因为时间每时每刻都不同
#include <stdlib.h>
int main()
{
int * nums;
nums = (int *)malloc(20)//为前面的指针动态分配了20字节的空间
//为指针动态分配空间后,指针就变成了数组
//等价于 :int nums[5]
for(i = 0; -<5; i++)
{
scanf("%d",nums + i);
}
for(i = 0; -<5; i++)
{
printf("%d\t",*(nums + i));
}
free(nums);
nums = NULL;
}
动态内存分配
malloc()全称memory allocation,动态内存分配,new,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。编译的时候没有内存,程序运行后才分配内存。
好处:可以free(nums);nums = NULL;//释放动态分配的内存,但要初始指针,最好不要修改指针
calloc() 不需要强制类型转换 num = calloc(5,sizeof(int))
课时54_自定义函数
函数= 返回值类型+函数名+参数列表
函数声明:
return_type fuction_name([datatype arg1],[datatype arg2],[…]);
函数定义:
return_type fuction_name([datatype arg1],[datatype arg2],[…])
{
//函数体
}
课时55_pass
章节10 11_带参函数
课时57 58 _形参与实参
形参:定义函数时候的形式参数
实参:调用函数时候实际传入的参数
课时59_递归
递归 = 自己调用自己
先思考循环退出条件,return 一个常量值是最简单的跳出方式
int factorial(int num)
{
if(num == 1)
return 1;
else
{
num = num*factorial(num-1);
return num;
}
}
#include<stdio.h>
int main()
{
//计算5的阶乘
int result = factorial(5)
}
BAT喜欢考汉诺塔
课时60 61_变量的作用域/生存期
变量的作用域和生存期
1.变量只存在于定义他们的语句块中 {//代码块} 块结束的时候,变量被销毁(自动变量)
2.变量存在的时间称为变量的生存期
变量存储类型
说明符 | 存储类型 | 说明 |
---|---|---|
auto | 自动存储 | 默认的,只能作用于块 |
register | 寄存器存储 | 只用于块的作用域,请求速度快,多次循环、反复使用的变量。 |
static | 静态存储 | 载入程序时创建对象,程序结束时对象消失(尽量少定义)。 |
extern | 外部变量 | 声明的变量定义在别处,作用域是整个程序,生存期贯穿应用程序的开始和结束。 |
静态存储 static int count = 0;第一次执行的时候会被分配空间,之后就不会被分配空间了,之后这句话就不再被执行了。
全局变量 在源文件的main函数外面声明全局变量int a,全局变量的作用域在当前源文件另一个文件中的函数是不能用这个变量的,所以要使用外部变量,extern int a,实现非当前源文件调用变量a。