0. 温习
0.1 循环
while(表达式){}do{}while(表达式);for(初始化循环变量;判断条件;循环变量的变动){}
个别比拟明确循环次数的时候,应用for
不太明确循环次数的时候,个别应用while
两个管制语句:
break: 跳出循环,只能跳出以后循环(只能跳出一层循环)
continue: 间接开始下一轮循环
表达式的虚实问题:
a>b a>b&&b>c 相似于这样的关系表达式或者逻辑表达式,后果只有两个:true false值就是1和0
反过来说 0是假,非零是真
int n =0;while(n<=100){ printf("%d",n); n++;}n =0;while(101-n){ printf("%d",n); n++;}
0.2 预处理命令
0.2.1 #include
用于蕴含头文件的 <>用于编译器自带的 “”用于本人写的头文件
0.2.2 #define
无参宏
0.3 二维数组
能够看成是多个1维数组
#include <stdio.h>int main(){ //二维数组的定义和初始化 //如果方括号内的元素不够,前面就都初始化为0 int arrTest1[3][4] = { 1,2,3,4,5,6,7 }; // 1 2 3 4 // 5 6 7 0 // 0 0 0 0 int arrTest2[3][4] = { {1,2},{3,4},{5,6} }; // 1 2 0 0 // 3 4 0 0 // 5 6 0 0 int arrTest3[][5] = { 1,2,3,4,5,6,7,8,9,10,11 }; //等价于int arrTest[3][5] = {1,2,3,4,5,6,7,8,9,10,11}; //1 2 3 4 5 //6 7 8 9 10 //11 0 0 0 0 return 0;}
什么时候会应用二维数组:
在一组数据中,还要再次分组的时候,须要应用二维数组。
如果有一个二维数组,如何遍历这个二维数组
1. 函数
温习:
system 执行一条CMD命令
printf 格式化输入
scanf_s 格式化输出
getchar 获取一个字符
putchar 输入一个字符
_getch 无回显的获取一个字符
strlen 求字符长度
strcat_s 拼接字符串
strcpy_s 拷贝字符串
strcmp 比拟字符串
1.1 函数的根本定义格局
返回值类型 函数名称(形参列表){ 函数的语句; return 返回值;}
函数名称:是咱们本人定义的名字,名字的规定和变量名是统一:字母数字下划线 数字不能结尾,不能应用关键字
返回值类型:一个函数如果须要返回一个数据作为整个函数的后果,那么就应该定义返回值类型。
return的作用:
a. 完结函数b. 返回给函数的调用的地位一个数值,这个数值就是函数的后果。返回的数值须要和返回值类型匹配。
形参列表:咱们要实现这个函数,须要什么参数,在这里规定好类型和参数个数
设计一个函数准则:
1.咱们须要明确这个函数的性能是什么???个别状况下,函数的性能越繁多越好,一个函数最好只解决一个问题。
2.明确了函数性能之后,须要明确须要哪些前置的数据。(咱们应该如何去设计参数)
3.当性能实现结束之后,要如何将后果告知调用者
a. 返回值b. 也能够通过参数,传出数据c. 也能够批改全局变量d. 也能够将后果写入到一个文件中e. 也能够在屏幕上输入一个后果(非常少的)
1.2 函数的应用场景
#include <stdio.h>int main(){ //咱们输出3个同学的名字 //输入3个同学名字字符数量之和 char szName1[20] = {}; char szName2[20] = {}; char szName3[20] = {}; printf("请输出名字:"); scanf_s("%s", szName1,20); printf("请输出名字:"); scanf_s("%s", szName2,20); printf("请输出名字:"); scanf_s("%s", szName3,20); int n1 = 0; while (szName1[n1]!=0) { n1++; } int n2 = 0; while (szName2[n2] != 0) { n2++; } int n3 = 0; while (szName3[n3] != 0) { n3++; } printf("3个同学的名字长度之和为%d", n1 + n2 + n3); return 0;
以上解决了问题,然而求名字长度的代码,写了3遍,万一100个学生,那反复代码就太多了。
这个时候就应该应用函数,能够少些反复代码.
#include <stdio.h>//1.明确性能:写一个求字符数组中字符串长度的函数//2.明确参数:字符数组//3.明确后果如何告知调用者:通过返回值就能够 返回值类型就应该是int//返回值类型 函数名//{// 具体的函数语句// return 返回值;//}int GetStrLenth(char szBuf[20]){ int n2 = 0; while (szBuf[n2] != 0) { n2++; } return n2;}int main(){ //咱们输出3个同学的名字 //输入3个同学名字字符数量之和 char szName1[20] = {}; char szName2[20] = {}; char szName3[20] = {}; printf("请输出名字:"); scanf_s("%s", szName1, 20); printf("请输出名字:"); scanf_s("%s", szName2, 20); printf("请输出名字:"); scanf_s("%s", szName3, 20); //应用函数的益处1: //定义完函数之后,调用的时候就只须要写函数名和参数,就可能应用这个性能了 //不须要写很多反复代码 //代码的 【复用性】就进步了 //应用函数的益处2: //咱们给这段代码起了名字,在浏览代码的时候,依据名字可能更好的了解代码逻辑 //进步了 代码的 【可读性】 int n1 = GetStrLenth(szName1); int n2 = GetStrLenth(szName2); int n3 = GetStrLenth(szName3); printf("3个同学的名字长度之和为%d", n1 + n2 + n3); return 0;
1.3 对于形参和实参的问题
形参是定义函数时候,用于规定参数类型的
实参是调用函数的时候,实在传递的参数。
1.4 须要留神的中央
1.形参的扭转,不会影响实参的值
2.如果函数的定义在调用的上面,此时编译器就不会辨认这个函数,咱们须要在调用之前加上函数的申明。
练习:
实现一个函数,可能失去两个整数中的较大值。
#include <stdio.h>int GetMax(int a, int b);int main(){ int n = 10; int m = 20; int c = GetMax(n, m); printf("较大值为%d", c); return 0;}int GetMax(int a, int b){ if (a > b) { return a; } else { return b; }}
2. 全局变量与局部变量
2.1 作用域
标识符 起作用的 代码范畴
局部变量:定义在函数外部的变量,只在函数外部起作用,精确的说,是在定义它的花括号内起作用。
全局变量:定义在函数内部的变量,整个文件中的任何函数,都能拜访到
2.2 局部变量和全局变量的特点
例子1,2:局部变量是在定义它的花括号内起作用。
例子3:小作用域笼罩大的
#include <stdio.h>int main(){ int n = 100; if (n>5) { //同名的时候,小作用域会笼罩大作用域 int n = 50; printf("%d", n);//这个地位输入的是50 } printf("%d", n);//这个地位输入的是100 return 0;}
总结:
1.大家应用同一个全局变量
2.局部变量和全局的同名了,这就是两个变量了,在定义局部变量的函数中,应用的是局部变量
3.全局变量如果定义在了上面,下面应用的时候,就应该加申明。
#include <stdio.h>//全局变量如果不初始化,默认就是0//局部变量不初始化,就是随机值extern int g_nNum;void Fun1(){ g_nNum = 100;}void Fun2(){ int g_nNum = 30; Fun1(); g_nNum *= 2;}int main(){ printf("%d", g_nNum); Fun2(); printf("%d", g_nNum); return 0;}int g_nNum = 0;
2.3 static类型的局部变量
#include <stdio.h>void Fun1(){ int nNum = 0; nNum++; printf("%d ", nNum);}void Fun2(){ //这里就定义了一个动态局部变量 static int nNum = 0; nNum++; printf("%d ", nNum);}int main(){ for (int i = 0; i < 10; i++) { Fun1(); } printf("\n"); for (int i = 0; i < 10; i++) { Fun2(); } return 0;}
一般的局部变量,在来到作用域的时候,就会被销毁掉,再次进入函数,局部变量会从新建设。
动态局部变量,再来到作用域也不销毁。下次进入函数,间接应用上一次的值。
2.4 const类型的变量
const被用于定义 不能批改的变量 (常量)
C/C++程序的工程治理形式
3.1 根本组织形式
一个工程由多个文件组成
.cpp中写 函数与全局变量的定义。
.h中 写申明
在应用的地位,蕴含头文件即可。
千万不要在.h中写定义
3.2 static润饰全局变量和函数的作用
4. 指针
三步:
定义指针变量
给指针变量赋值
解援用
#include <stdio.h>int main(){ //1. 定义指针变量 int* p1 = nullptr;//定义了一个整型指针 变量 nullptr是0 char* p2 = nullptr;//定义了一个字符型指针 //2. 给指针变量赋值 //指针应该存储的是地址 int nNum1 = 100; int nNum2 = 50; //p存储了nNum1的地址 //p存储了谁的地址,咱们就说p指向了谁 p1 = &nNum1; //3. 解援用 //通过指针间接的拜访到,它所指向的地位 printf("%d\n", nNum1); printf("%d\n", *p1); *p1 = 500;//*p1此时就相当于是nNum1 printf("%d\n", nNum1); printf("%d\n", *p1); p1 = &nNum2; *p1 = 300; printf("%d\n", nNum1); printf("%d\n", nNum2); return 0;}
4.2 利用场景
4.2.1 场景1 在函数外部批改到函数内部的变量
#include <stdio.h>//用一个函数,替换两个变量的值void swap1(int a, int b){ int n = a; a = b; b = n;}void swap2(int* p1,int * p2){ int n = *p1; *p1 = *p2; *p2 = n;}int main(){ int n = 10; int m = 20; swap2(&n, &m); printf("%d %d", n, m); return 0;}
以上代码,咱们通过指针批改了内部的数据,能不能算形参扭转了实参呢???
不能。为什么????
因为 实参是变量的地址。变量的地址并没有产生扭转。