数组
例子
#include <stdio.h>
int main(void) {
int a[5] = {1,2,3,4,5};
// a是数组名,5表示5个元素, 这5个元素分别用a[0],a[1],a[2],a[3],a[4] 表示
int i;
for (i = 0; i < 5; i++) {
printf("%d\n",a[i]);
}
return 0;
}
为什么需要数组
为了解决大量 同类型数据 的 存储 和 使用
好处:
定义变量方便
模拟现实世界
数组分类
一维数组
怎样定义一维数组
为n个变量连续分配存储空间
所有的变量数据类型必须相同
所有变量所占的字节大小必须相等
int a[5];
相关操作
初始化
- 完全初始化
- 不完全初始化
- 不初始化
- 清零
错误写法
贼值
排序
求最大/小值倒置
查找
二维数组
int a[3][4];
总共是12个元素,可以当做3行4列看待
这12个元素的名字,依次是
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
a[i][j] 表示 第 i + 1行 第j+ 1列的元素
int a[m][n] 该二维数组 最大位置的元素 只能是 a[m-1][n-1]
初始化
两种写法
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int a[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
}
输出二维数组的内容
#include <stdio.h>
int main(void) {
int a[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
};
// 输出内容
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
printf("a[%d][%d] = %d\n",i,j,a[i][j]);
}
}
return 0;
}
a[0][0] = 1
a[0][1] = 2
a[0][2] = 3
a[0][3] = 4
a[1][0] = 5
a[1][1] = 6
a[1][2] = 7
a[1][3] = 8
a[2][0] = 9
a[2][1] = 10
a[2][2] = 11
a[2][3] = 12
改进
左对齐
#include <stdio.h>
int main(void) {
int a[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
};
// 输出内容
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
printf("%-5d",a[i][j]);
}
printf("\n");
}
return 0;
}
1 2 3 4
5 6 7 8
9 10 11 12
负号 表示 左对齐
5 表示 这个数 占5个光标的位置
多维数组
是否存在多维数组
不存在
因为内存是线性一维的
n维数组可以当做每个元素是n-1维数组的一维数组
比如:
int a[3] [4];
该数组是含有3个元素的一维数组
只不过每个元素都可以再分成4个小元素
int a[3] [4] [5];
该数组是含有3个元素的一维数组
只不过每个元素都是4行5列的二维数组
函数
// max 函数名
// a 和 b 是形式参数 形参
// void 表示没有返回值
void max(int a, int b){
int tmp;
if (a > b) {
printf("%d\n", a);
}
printf("%d\n", a);
}
int main(void) {
int a ,b ,c ,d ,e ,f ;
a = 1, b = 2, c =3, d = 9, e = -5, f = 100;
max(a, b);
max(c, d);
max(e, f);
return 0;
}
```![在这里插入图片描述](https://img-blog.csdnimg.cn/82787f82936845dcbaa764675d3f4629.png)
```c
1
3
-5
为什么需要函数
避免了重复性操作
有利于程序的模块化
模块化 图解 如下
什么是函数
逻辑上:能够完成特定功能的独立的代码块
物理上:
能够 接收数据 [当然也可以不接受数据]
能够对 接受的数据 进行 处理
能够将 数据处理的结果 返回[当然也可以不返回任何值]
#include <stdio.h>
int f(void){ // 括号内void 表示没有不能接受数据, int表示返回数据类型为整数
return 10; // 向主调函数返回10
}
int main(void) {
int j = 88;
j = f();
printf("%d\n", j);
return 0;
}
10
总结:
函数是个工具,它是为了解决大量类似问题而设计的函数可以当做一个黑匣子
如何定义函数
函数定义的本质是 详细描述函数之所以能够实现某个特定功能的具体实现方法
return 和 break的用法
return 表达式:的含义
函数返回值的类型也称为函数的类型,
return 和 break 区别
return 终止函数
break 终止循环
int main(void) {
int i;
for (i = 0; i < 5; i++) {
printf("大家辛苦了!\n");
return 0;
}
printf("同事们好!\n");
return 0;
}
大家辛苦了!
int main(void) {
int i;
for (i = 0; i < 5; i++) {
printf("大家辛苦了!\n");
break;
}
printf("同事们好!\n");
return 0;
}
大家辛苦了!
同事们好!
return 表达式 含义:
终止被调函数,向主调函数返回表达式的值
如果表达式为空,则只终止函数,不向被调函数返回任何值
函数分类
有参函数 和 无参函数
有返回值函数 和 无返回值函数
库函数 和 用户自定函数
普通函数 和 主函数(main函数)
一个程序必须有且只能有一个主函数
主函数可以调用普通函数
普通函数不能调用主函数
普通函数可以相互调用
主函数是程序的入口,世是程序的出口
例子
判断是否是 素数
int main()
{
int val;
int i;
scanf("%d", &val);
for (i = 2; i < val; i++) {
if (val % i == 0) {
break;
}
}
if (i == val) {
printf("Yes!\n");
} else{
printf("No!\n");
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
/*structure to hold the details of an employee*/
int IsPrime(int val){
int i;
for (i = 2; i < val; i++) {
if (val % i == 0) {
break;
}
}
if (i == val) {
return 1;
} else{
return 0;
}
}
int main()
{
int val;
printf("请输入数字: \n");
scanf("%d", &val);
if (IsPrime(val)) {
printf("是素数!");
} else{
printf("不是素数!");
}
return 0;
}
函数的声明
函数前置声明:
1。告诉缩译器即将可能出现的若干个字母代表的是一个函数
2。 告诉编译器即将可能出现的若干个字母所代表的函数的形参和返回值的具体情况
3。 函数声明是一个语句,末尾必须加分号
4。对库函数的声明是通过# include 〈库函数所在的文件的名字.h〉来实现的
一定要注意 函数调用 和 函数 定义的顺序
调用 一定要 放在 定义的 后面
如果不的话,需要在前面加 函数声明。
void f(void); // 函数声明,分号不能丢
int main()
{
f();
return 0;
}
void f(void)
{
printf("哈哈!\n");
}
形参和实参
个数相同位置一一对应数据类型必须相互兼容
如何在软件开发中合理的设计函数来解决实际问题
用两个函数来实现求1到某个数字之间所有的素数,并将其输出
一个函数的功能尽量独立,单一
多学习,多模仿牛人的代码
将 1- n之间的 素数 都打印出来
#include <stdio.h>
#include <stdbool.h>
bool Isprime(int val){
int i;
for (i = 2; i < val; i++) {
if (0 == val % i) {
break;
}
}
if (i == val) {
return true;
} else{
return false;
}
}
int main()
{
int val;
int i;
printf("请输入数字: ");
scanf("%d", &val);
for ( i = 2; i <= val; i++){
if (Isprime(i)) {
printf("%d\n", i);
}
}
}
函数是C语言的基本单位,类是Java,C#,C++的基本单位
常用系统函数
double sqrt(double x);
求x的平方根
int abs(int x);
求x的绝对值
double fabs(double x);
求x的绝对值
递归
理解 递归 一定要 知道 栈
栈: 先进后出 的数据结构
变量的作用域和存储方式
按作用域分:
全局变量
局部变量: 在一个函数内部定义的变量或者函数的形参都统称为局部变量。
全局变量
在一个函数内部如果定义的局部变量的名字和全局变量名一样时,局部变量会屏蔽掉全局变量。
按变量的存储方式
静态变量
自动变量
寄存器变量
什么是寄存器,就是CPU内部 可以存储数据的区域