C语言基础day7

复习

冒泡排序

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语言只有一维数组
所谓的二维数组是 数组元素是一维数组的一维数组。

C语言基础day7

定义二维数组

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(); 会调用即可。

自定义函数: 要求自己实现功能。

函数是对功能的封装!

对于完整的函数实现,包含四个部分:

  1. 函数名
  2. 返回值类型 函数会产生一个结果,返回值类型就是结果的类型。
  3. 参数列表 y = x; 用来给函数的逻辑中的一些变量赋值。 sin(30) = 0.5 30是函数的参数,0.5是函数的返回值
  4. 函数体 被{}包含 写函数的逻辑。

示例:

int main(参数列表(可以为空))  
{
	 函数体(函数要做的事情)
}
//函数名  main
//返回值类型  int   
//参数列表空  ()    int main(int argc, char** argv)
//{} 函数

2. 函数的调用与执行

使用要点:

  1. 函数只有被调用,才会执行。如果不调用某函数,那么就不会执行它。

  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;
}

程序的执行过程分析:

C语言基础day7

练习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、形参列表(参数列表)

注意要点:

  1. 信息传递的方向: 由 主调函数 传递给 被调函数。

  2. 形参与实参,个数要一致,类型要一致。

形参:定义在函数的()里的变量,我们叫形参。形参和定义在函数的{}里的变量唯一的区别,形参必须被实实参初 始化。

实参:调用函数时传递的参数,按照顺序给形参初始化。

示例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;
}

执行过程分析:

C语言基础day7

练习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、局部变量与全局变量

局部变量: 定义在函数(花括号)之内的变量,叫局部变量。

全局变量: 定义在函数之外的变量,叫全局变量。

区别:

  1. 对于全局变量,如果没有进行初始化操作。那么这个变量默认为 0.

  2. 生命周期:全局变量从定义的位置开始,到程序结束为止。 (可以先忽略)

    ​ 局部变量从所在的{}开始执行创建,{}执行完删除。

  3. 作用域: 全局变量程序的任何地方都可以用。

    ​ 局部变量只能在定义的{}里使用。

  1. 全局变量不能重名。

示例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:

编写函数,两个函数,分别实现 “给二维数组赋值” 功能 和 “输出二维数组值” 的功能。

  1. 二维数组定义为全局

  2. 封装两个函数,给二维数组赋值putArr,输出二维数组printArr

  3. 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使用函数封装。

上一篇:ORB特征点提取与直方图相似度结合算法过滤视频关键帧


下一篇:函数语法和作用域