二维数组的相关操作及函数的基本概念

一.二维数组

1.定义及相关性质

 int a[m][n] //int(数组类型), a(数组名)

 该数组有m*n个元素,且与一维数组相同,下标都是从0开始,因此,该数组的最后一个元素为:a[m - 1][n - 1]; 

行元素个数:rows = sizeof(a) / sizeof(a[0]);

列元素个数:cols = sizeof(a[0]) / sizeof(a[0][0]);

初始化:

a[2][2] = {{1,2}, {4, 3}};

a[2][2] = {1, 2, 4, 3};

a[][2] = {1, 2, 3, 4}; //只能省略行数;

本质:

二维数组可以视为a中有m个元素(即存储了m个一维数组,每个数组中有n个元素),每个元素又被均分为n个元素。

2.三要素 

与一维数组相同,二维数组同样也满足三要素,即:单一性,有序性,连续性。

(详情见一维数组遍历)

3.二维数组的遍历

先遍历列(内层循环),再遍历行(外层循环)

 eg1:

#include <stdio.h>

int main(void)
{	
	int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
	int rows = sizeof(a) / sizeof(a[0]);
	int cols = sizeof(a[0]) / sizeof(a[0][0]);
	int i, j;
	for(i = 0; i < rows; ++i)
	{
		for(j = 0; j < cols; ++j)
		{
			printf("%2d ", a[i][j]);
		}
		printf("\n");
	}
	puts("");
	
	return 0;
}

4.二维数组的逆序 

 (1)列逆序

只对列元素进行逆序交换(将每行都视为一个一维数组,即为多个一维数组的逆序);

外层循环的条件:i < rows;

内层循环的条件:j < cols / 2;

eg2: 

#include <stdio.h>
#include <string.h>

int main(void)
{
	int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
	int rows = sizeof(a) / sizeof(a[0]);
	int cols = sizeof(a[0]) / sizeof(a[0][0]);
	int i, j;
	for(i = 0; i < rows; ++i)
	{
		for(j = 0; j < cols / 2; ++j)
		{
			int t = a[i][j];
			a[i][j] = a[i][cols - j - 1];
			a[i][cols - j - 1] = t;
		}
	}
	for(i = 0; i < rows; ++i)
	{
		for(j = 0; j < cols; ++j)
		{
			printf("%2d ", a[i][j]);
		}
		printf("\n");
	}

	return 0;
}
(2)行逆序 

将每一行,视为一个整体,只对行元素进行调换;

循环的条件:i < rows / 2;

eg3:

#include <stdio.h>
#include <string.h>

int main(void)
{
	char a[][10] = {"Hello", "World", "China"};
	int rows = sizeof(a) / sizeof(a[0]);
	int i, j;
	for(i = 0; i < rows / 2; ++i )
	{
		char t[10] ;
		strcpy(t, a[i]);
		strcpy(a[i], a[rows - i - 1]);
		strcpy(a[rows - i - 1], t);
	}
	for(i = 0; i < rows; ++i)
	{
		puts(a[i]);
	}

	return 0;
}

 5.二维数组的大小比较

将每一行元素视为一个整体,方法与一维数组相同;

eg4:

#include <stdio.h>
#include <string.h>

int main(void)
{
	char a[][10] = {"Hello", "World", "China"};
	int rows = sizeof(a) / sizeof(a[0]);
	char max[10];
	strcpy(max, a[0]);
	int i;
	for(i = 1; i < rows; ++i)
	{
		if(strcmp(max, a[i]) < 0)
		{
			strcpy(max, a[i]);
		}
	}
	puts(max);

	return 0;
}

 6.二维数组的查找

将每一行元素视为一个整体,方法与一维数组相同,使用二分查找;

eg5: 

#include <stdio.h>
#include <string.h>

int main(void)
{
	char s[][10] = {"Hello", "World", "China"};
	int cols = sizeof(s[0]) / sizeof(s[0][0]);
	int rows = sizeof(s) / sizeof(s[0]);
	int i, j;
	for(i = 0; i < rows; ++i)
	{
		for(j = i + 1; j < rows; ++j)
		{
			if(strcmp(s[i], s[j]) > 0)
			{	
				char t[10];
				strcpy(t, s[i]);
				strcpy(s[i], s[j]);
				strcpy(s[j], t);
			}
		}
	}
	char n[] = "China";
	int begin = 0;
	int end = rows - 1;
	while(begin <= end)
	{
		int mid = (begin + end) / 2;
		if(strcmp(n, s[mid]) < 0)
		{
			end = mid - 1;
		}
		else if(strcmp(n, s[mid]) > 0)
		{
			begin = mid + 1;
		}
		else
		{
			break;
		}
	}
	if(begin <= end)
	{
		printf("found\n");
	}
	else
	{
		printf("not found\n");
	}
	
	return 0;
}

二.函数的基本概念

1.概述

一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能。

一个完整的函数:

函数首部:包含返回值,函数体和形参;

函数主体。

2分类

(6)从函数的形式看,函数分两类。
①无参函数(参数个数为0)。在调用无参函数时,主调函数不向被调用函数传递数据。无参函数一般用来执行指定的一组操作。无参函数可以带回或不带回函数值,但一般以不带回函数值的居多。
②有参函数。在调用函数时,主调函数在调用被调用函数时,通过参数向被调用函数传递数据,一般情况下,执行被调用函数时会得到一个函数值,供主调函数使用。

3.函数的调用 

{}-----作用域,每个不同变量只能在自己所在的作用域有效;

c语言中设计函数时,返回值不能为数组,默认返回值为int型,且函数结束时一定要以return 返回;

eg6:

#include <stdio.h>

int maxOfTwoNumber(int a,int b) 
{
	return a > b ? a : b;
}
int main(void)
{
    int max;
    max = maxOfTwoNumber(10, 20);
    printf("%d\n", max);

    return 0;
}

 4.函数的嵌套调用

eg7:

#include <stdio.h>

int maxOfTwoNumber(int a,int b)
{
	return a > b ? a : b;
}
int maxOfThreeNumber(int a, int b, int c)
{
	int max;
	max = maxOfTwoNumber(a, b);
	max = maxOfTwoNumber(max, c);
	return max;
}
int main(void)
{
    printf("%d\n",maxOfThreeNumber(10, 20, 30));

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值