一.二维数组
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;
}