复习
冒泡排序
int a[10] = {1,1,1,1,1,1,1,1};
int i, j;
for(i = 0;i < 10-1;i++)//外层循环 反复冒泡
{
for(j = 0;j < 10-1-i;j++)//内层循环冒一个泡
{
//升序排
if(a[j] > a[j+1])
{
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
二维数组的本质
C语言只有一维数组
所谓的二维数组是 数组元素是一维数组的一维数组。
定义二维数组
int a[2][3];
遍历
//遍历二维数组,一般使用双重for循环,因为二维数组的元素有两个角标
int i, j;
//一般都是使用外层循环遍历第一个角标,内层循环遍历第二个角标
for(i = 0;i < 2;i++)
{
for(j = 0;j < 3;j++)
{
printf("%d\n", a[i][j]);
}
}
初始化
//完全初始化
int a[2][3] = {1,2,3,4,5,6};
int a[2][3] = {{1,2,3},{4,5,6}};
//部分初始化
int a[2][3] = {1,2,3};
int a[2][3] = {{1}, {2,3};
//默认初始化
int a[][3] = {1,2,3,4,5};
作业:
请将杨辉三角形(7阶)保存在二维数组中,并输出。
1 0
1 1 0
1 2 1 0
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
#include <stdio.h>
int main()
{
int a[7][7] = {0};
int i, j;
for(i = 0;i < 7;i++)
{
a[i][0] = 1;//每一行的第一个是1
for(j = 1;j < i+1;j++)
{
a[i][j] = a[i-1][j]+a[i-1][j-1];
}
}
for(i = 0;i < 7;i++)
{
for(j = 0;j < 7;j++)
{
printf("%d ", a[i][j]);
}
printf("\n");//打印完一个小数组换行
}
return 0;
}
作业1:
鞍点。 判断数组中是否存在鞍点,在该行最大,并且在该列最小
1 2 6 4 a[0][j]
5 6 7 8 a[1]
9 10 11 12 a[2]
6是鞍点
#include <stdio.h>
int main()
{
int a[3][4] = {1,2,6,4, 5,6,7,8,9,10,11,12};
int i, j;
for(i = 0;i < 3;i++)
{
int max = a[i][0];
int col = 0;
for(j = 1;j < 4;j++)
{
if(a[i][j] > max)
{
max = a[i][j];
col = j;//保存最大值所在的“列”
}
}
int row;
for(row = 0;row < 3;row++)
{
if(a[row][col] < max)
{
break;
}
}
if(row == 3)
{
printf("安点%d\n", max);
}
}
return 0;
}
作业2:(和二维数组没有关系)
输入一个字符串,转换为数字 例如:“1234” --> int 1234
sum=sum*10+a; a是将数字字符转换成的整数
将数字字符转换成对应的整数,减去'0' char c = '7';int num = c-'0';
#include <stdio.h>
int main()
{
char buf[] = "1234";
int i = 0;
int sum = 0;
while(buf[i] != '\0')
{
int num = buf[i]-'0';
printf("%d\n", num);
sum = sum*10+num;
i++;
}
printf("%d\n", sum);
return 0;
}
作业3:
尝试输出如下图形。 输入位子信息和字符信息,可以任选位置,并将该位置的字符换成输入的新字符。
二维数组常用来表示一个平面直角坐标系。
一般没规定坐标原点在左上角;
X轴向右递增
y轴向下递增
第一个角标表示y轴
第二个角标表示x轴
2 3 &
* * * * *
* ^ * * *
* * * * *
* * & * *
* * * * *
#include <stdio.h>
int main()
{
char map[10][9];
int i,j;
//1.数组初始化
for(i = 0;i < 10;i++)//Y轴
{
for(j = 0;j < 9;j++)//X轴
{
map[i][j] = '*';
}
}
while(1)
{
//2.打印数组
for(i = 0;i < 10;i++)
{
for(j = 0;j < 9;j++)
{
printf("%c ", map[i][j]);
}
printf("\n");
}
int x, y;
char c;
scanf("%d%d %c", &x, &y, &c);
map[y][x] = c;
}
return 0;
}
1、函数
什么时候封装函数?
1、固定的算法,应该封装成函数。
2、会反复执行的逻辑。
3、当函数写的太长,它一定可以拆分成若干个小函数。
1. 函数分类
系统函数: printf(); rand(); gets(); 会调用即可。
自定义函数: 要求自己实现功能。
函数是对功能的封装!
对于完整的函数实现,包含四个部分:
- 函数名
- 返回值类型 函数会产生一个结果,返回值类型就是结果的类型。
- 参数列表 y = x; 用来给函数的逻辑中的一些变量赋值。 sin(30) = 0.5 30是函数的参数,0.5是函数的返回值
- 函数体 被{}包含 写函数的逻辑。
示例:
int main(参数列表(可以为空))
{
函数体(函数要做的事情)
}
//函数名 main
//返回值类型 int
//参数列表空 () int main(int argc, char** argv)
//{} 函数
2. 函数的调用与执行
使用要点:
-
函数只有被调用,才会执行。如果不调用某函数,那么就不会执行它。
-
在 c 语言中,函数和变量,要先声明、再使用。
示例1:
#include <stdio.h>
//函数名 function
//返回值类型 int
//参数列表 空 ()
//函数体 {}里的内容 这个函数的功能是输出4 和 9 的最小值
int function()
{
int a = 4, b = 9;
int min = a<b?a:b ;
printf("min = %d\n",min);
return 0;
}
int main()
{
printf(“hello world\n”);
function();
printf(“end\n”);
return 0;
}
程序的执行过程分析:
练习1:
编写函数,实现功能。 可以对两个数进行求和输出。
#include <stdio.h>
int add()
{
int a = 4, b = 9;
printf("%d\n", a+b);
return 0;
}
int main()
{
add();
return 0;
}
变量的作用域:
变量的可用范围,只在定义它的{}内是有效的。
int main()
{
int a = 20, b = 10;
if(a > b)
{
int max = a;
}
printf("%d\n", max);//max是在if的{}中定义的,所以只能在if的{}中使用
return 0;
}
3、形参列表(参数列表)
注意要点:
-
信息传递的方向: 由 主调函数 传递给 被调函数。
-
形参与实参,个数要一致,类型要一致。
形参:定义在函数的()里的变量,我们叫形参。形参和定义在函数的{}里的变量唯一的区别,形参必须被实实参初 始化。
实参:调用函数时传递的参数,按照顺序给形参初始化。
示例2:
#include <stdio.h>
int get_sum(int a,int b) //a 和b就是函数get_sum的形参。每个形参都要写类型,形参之间用,隔开。
{
a = a + b;
printf("sum = %d\n",a);
return 0;
}
int main()
{
printf(“hello world\n”);
get_sum(6,7); //6 7是调用函数get_sum的实参,用来初始化形参a和b,实参也可以是变量
printf(“end\n”);
return 0;
}
程序执行过程分析:
练习2:
编写函数,实现功能:三个整数中,找到个最大值打印输出。
#include <stdio.h>
//形参的作用域只在函数中
int max(int a, int b, int c)
{
int bigger = a>b?a:b;
int biggest = bigger>c?bigger:c;
printf("%d\n", biggest);
return 0;
}
int main()
{
int a, b, c;//main中的abc作用域在main中,和max中的形参abc没有任何关系
scanf("%d%d%d", &a, &b, &c);
max(a, b, c);//使用main中的abc分别初始化max中的abc
return 0;
}
练习3:
编写函数,实现功能:将一个整数值,放大十倍输出。
#include <stdio.h>
int ten(int num)
{
printf("%d\n", num*10);
return 0;
}
int main()
{
int num;
scanf("%d", &num);
ten(num);
return 0;
}
4、返回值
注意要点:
1) 信息传递的方向: 被调函数 传回给 主调函数。
2) 返回的值是什么类型,取决于:函数定义的返回类型。
3) 对应关系:
float return 3.14; return后面也可以接变量
int return 3;
void return ; void表示函数没有返回值
函数中一旦执行到return,函数马上停止,去继续执行主调函数。如果是main中执行到return,main函数会结束,程序也就结束了。
示例3:
#include <stdio.h>
int get_max(int a, int b, int c)
{
a = a>b ? a: b;
a = a>c ? a: c;
return a;
}
int main()
{
int number;
number = get_max(67,22,149);//将被调函数中的返回值赋值给 number
printf("max = %d\n",number);
return 0;
}
执行过程分析:
练习4:
编写函数,实现功能: 可以将小写字符转换为大写,或者将大写转换为小写。其余字符,原样不动。
#include <stdio.h>
char train(char c)
{
if(c>='A' && c<='Z')
{
return c+32;
}
else if(c>='a' && c<='z')
{
return c-32;
}
else
{
return c;
}
}
int main()
{
char c = getchar();
c = train(c);
printf("%c\n", c);
return 0;
}
练习5:
编写函数,实现功能: 求一个整数的 n 次方。
#include <stdio.h>
int power(int a, int n)
{
int mul = 1;
int i;
for(i = 0;i < n;i++)
{
mul*=a;
}
return mul;
}
int main()
{
printf("%d\n", power(3, 3));
return 0;
}
5、局部变量与全局变量
局部变量: 定义在函数(花括号)之内的变量,叫局部变量。
全局变量: 定义在函数之外的变量,叫全局变量。
区别:
-
对于全局变量,如果没有进行初始化操作。那么这个变量默认为 0.
-
生命周期:全局变量从定义的位置开始,到程序结束为止。 (可以先忽略)
局部变量从所在的{}开始执行创建,{}执行完删除。
-
作用域: 全局变量程序的任何地方都可以用。
局部变量只能在定义的{}里使用。
- 全局变量不能重名。
示例4:
全局和局部 变量的初始值问题。
#include <stdio.h>
int a;//全局变量,默认值0
int main()
{
int b; //局部变量,没有默认值
printf("a = %d,b = %d\n", a,b);
return 0;
}
示例5:
全局变量 与 局部变量 重名的问题。
#include <stdio.h>
int a = 80;
void function()
{
int a = 1;
printf("fun: a = %d\n",a);//输出 1 使用变量,就近原则,找最近的作用域里的变量
}
int main()
{
function();
printf("a = %d\n",a);//输出80 在main中没有a,所以使用全局变量a
return 0;
}
练习6:
编写函数,两个函数,分别实现 “给二维数组赋值” 功能 和 “输出二维数组值” 的功能。
-
二维数组定义为全局
-
封装两个函数,给二维数组赋值putArr,输出二维数组printArr
-
main中调用两个函数
#include <stdio.h>
int arr[4][5];
void putArr()
{
int i, j;
for(i = 0;i < 4;i++)
{
for(j = 0;j < 5;j++)
{
arr[i][j] = i+j;
}
}
}
void printArr()
{
int i, j;
for(i = 0;i < 4;i++)
{
for(j = 0;j < 5;j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main()
{
putArr();
printArr();
return 0;
}
练习7:
编写函数,实现功能:从一个一维数组中,找到一个最小值。 并返回
一维数组定义成全局的
#include <stdio.h>
int arr[10] = {12,34,56,78,6,4,334,67,9,45};
int findMin()
{
int i;
int min = arr[0];
for(i = 1;i < 10;i++)
{
if(min > arr[i])
{
min = arr[i];
}
}
return min;
}
int main()
{
int min = findMin();
printf("%d\n", min);
return 0;
}
作业1:
定义函数判断一个整数是否为质数
参数:要判断的整数
返回值:0 表示不是质数 1 表示是质数
作业2:
定义函数求任意整数的位数
例如:12345
返回:5
参数:要计算整数
返回值:整数的位数
作业3:
for(i = 0;i < 4;i++)
{
for(j = 0;j < 5;j++)
{
arr[i][j] = i+j;
}
}
}
void printArr()
{
int i, j;
for(i = 0;i < 4;i++)
{
for(j = 0;j < 5;j++)
{
printf("%d “, arr[i][j]);
}
printf(”\n");
}
}
int main()
{
putArr();
printArr();
return 0;
}
### 练习7:
编写函数,实现功能:从一个一维数组中,找到一个最小值。 并返回
一维数组定义成全局的
```C
#include <stdio.h>
int arr[10] = {12,34,56,78,6,4,334,67,9,45};
int findMin()
{
int i;
int min = arr[0];
for(i = 1;i < 10;i++)
{
if(min > arr[i])
{
min = arr[i];
}
}
return min;
}
int main()
{
int min = findMin();
printf("%d\n", min);
return 0;
}
作业1:
定义函数判断一个整数是否为质数
参数:要判断的整数
返回值:0 表示不是质数 1 表示是质数
作业2:
定义函数求任意整数的位数
例如:12345
返回:5
参数:要计算整数
返回值:整数的位数
作业3:
35选7使用函数封装。