一、 二维数组与字符串数组的结合使用
1.二维数组镜像
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;
t = a[i][cols - j - 1];
a[i][cols - j - 1] = a[i][j];
a[i][j] = t;
}
}
for(i = 0;i < rows;++i)
{
for(j = 0;j < cols;++j)
{
printf("%2d ", a[i][j]);
}
puts("");
}
原数组为
1 2 3 4
5 6 7 8
9 10 11 12
运行程序的输出结果为
4 3 2 1
8 7 6 5
12 11 10 9
2.N阶魔方阵的输出
魔方阵是指:每一行,每一列,对角线的元素之和均相等。
以3阶魔方阵举例:魔方阵就是将1-9这9个数字填写在3*3的矩阵中,我们在定义二维数组时会将所有元素初始化为0,在开始时,我们会将1放在3*3的矩阵4条边上某一行的中间位置,以此为开始点,然后将这个点向右移动1,向上移动1,填入下一个值,以此类推。若某点已填入应该数值,应该将点还原至此次移动的初始点,即向左向下移动1,然后向下移动1,填入数值。按上述的方法将9个数填完,便得到了一个三阶魔方阵。
int a[N][N] = {0};
int i = 0, j = N / 2, n;
a[i][j] = 1;
for(n = 2;n < N * N + 1;++n)
{
int x = i, y = j;
++j;
if(j > N - 1)
{
j = 0;
}
--i;
if(i < 0)
{
i = N - 1;
}
if(a[i][j] != 0)
{
i = x;
j = y;
++i;
if(i > N - 1)
{
i = 0;
}
}
a[i][j] = n;
}
for(i = 0;i < N;++i)
{
for(j = 0;j < N;++j)
{
printf("%d ", a[i][j]);
}
puts("");
}
3.寻找二维字符串数组最大值
char s[][100] = {"Hello", "World!", "China!", "America"};
char max[100];
int rows = sizeof(s) / sizeof(s[0]);
int i;
strcpy(max, s[0]);
for(i = 1;i < rows;++i)
{
if(strcmp(max, s[i]) < 0)
{
strcpy(max, s[i]);
}
}
puts(max);
做法上与一维数组的类似,只不过不能调用关系运算符,需要调用strcmp、strcpy函数来进行对数组的比较与copy操作。
4.二维字符串数组的逆序
char s[][100] = {"Hello", "World!", "China!", "America"};
int rows = sizeof(s) / sizeof(s[0]);
int i;
for(i = 0;i < rows / 2;++i)
{
char t[100];
strcpy(t, s[i]);
strcpy(s[i], s[rows - i - 1]);
strcpy(s[rows - i - 1], t);
}
for(i = 0;i < rows;++i)
{
puts(s[i]);
}
原理与一维数组相同,不再赘述。
二、函数学习
一、定义
在C语言中,函数主要分为两类1)库函数:C语言内部提供的函数。 2)自定义函数:自我发挥写
出的函数。自定义函数由程序员自主设计,和普通的函数一样有函数名、返回类型、形式参数等。
基本结构如下:
类型标识符 函数名(形参列表)
{
声明部分
语句部分
}
在C语言中,调用函数主要有两个作用:1.提高代码的复用性。2.降低函数的耦合性。
在自定义函数是要注意:
1.main函数有且只有1个。
2.实参与形参的个数要相等,类型匹配。可以选择传变量或是常量
3.return会终止之后的语句。
4.C语言中有默认的返回类型‘int’型。
5.被调函数要写在前,主调函数在后。
二、示例
1.输出3个数中的最大值
int max_of_two_numbers(int a, int b)
{
return a > b ? a : b;
}
int max_of_three_numbers(int a, int b, int c)
{
int max = max_of_two_numbers(a, b);
return max_of_two_numbers(max, c);
}
int main(void)
{
int a = 10, b = 20, c = 15;
int max;
max = max_of_three_numbers(a, b, c);
printf("%d\n", max);
return 0;
}
2.输出某年某月天数
int isLeapyear(int year)
{
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
void printLeapyear(int start, int end)
{
int i;
for(i = start;i <= end;++i)
{
if(isLeapyear(i))
{
printf("%d\n", i);
}
}
}
int daysOfTheMonth(int year, int month)
{
if(month < 1 || month > 12)
{
return -1;
}
int days[] = {31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(month != 2)
{
return days[month - 1];
}
else
{
return isLeapyear(year) ? 29 : 28;
}
}
int main(void)
{
int days;
days = daysOfTheMonth(2024, 12);
if(days < 0)
{
puts("error");
}
else
{
printf("%d\n", days);
}
return 0;
}
以上代码均是在Ubuntu18.04中运行