小知识:
当初始化需要换行时:
char s[] = "Hello"
"World"; //c99中
char s[] = "Hello\
World"; //c89中
二维整型数组:
示例:
每一行逆序:
int main(void)
{
7 int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
8 int cows = sizeof(a) / sizeof(a[0]);
9 int cols = sizeof(a[0]) / sizeof(a[0][0]);
10 int i,j;
11
12 for(i = 0;i < cows;++i)
13 {
14 for(j = 0; j < cols / 2;++j)
15 {
16 int t = a[i][j];
17 a[i][j] = a[i][cols - j -1];
18 a[i][cols - j - 1] = t;
19 }
20 }
21 for(i = 0;i < cows;++i)
22 {
23 for(j = 0;j < cols;++j)
24 {
25 printf("%2d ",a[i][j]);
26 }
27 putchar('\n'); //puts("");
28 }
29 return 0;
30 }
魔方阵:
所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之7.7和均相等
原理:
代码:
#define N 3
int main(void)
{
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("");
}
return 0;
}
字符型二维数组:
错误的puts:
tips:s[0]是数组名即首元素地址&s[0][0]。
正确的puts:
示例:
求极值:
74 int main(void)
75 {
76 char s[][100] = {"Hello","World","China!"};
77 char max[100];
78 int i,rows = sizeof(s) / sizeof(s[0]);
79 strcpy(max,s[0]);
80 for(i = 1;i < rows;++i)
81 {
82 if(strcmp(max,s[i]) < 0)
83 {
84 strcpy(max,s[i]);
85 }
86 }
87 puts(max);
88 return 0;
89 }
逆序:
91 int main(void)
92 {
93 char s[][100] = {"Hello","World","China!","America"};
94 char max[100];
95 int i,rows = sizeof(s) / sizeof(s[0]);
96 for(i = 0;i < rows / 2;++i)
97 {
98 char t[100];
99 strcpy(t,s[i]);
100 strcpy(s[i],s[rows - i - 1]);
101 strcpy(s[rows - i - 1],t);
102 }
103 for(i = 0;i < rows; ++i)
104 {
105 puts(s[i]);
106 }
107 }
排序:
1、选择排序:
110 int main(void)
111 {
112 char s[][100] = {"Hello","World","China!","America"};
113 char max[100];
114 int i,j,rows = sizeof(s) / sizeof(s[0]);
115 for(i = 0;i < rows - 1;++i)
116 { for(j = i + 1;j < rows;++j)
117 {
118 if(strcmp(s[i],s[j]) > 0)
119 {
120 char t[100];
121 strcpy(t,s[i]);
122 strcpy(s[i],s[j]);
123 strcpy(s[j],t);
124 }
125 }
126 }
127 for(i = 0;i < rows; ++i)
128 {
129 puts(s[i]);
130 }
131 return 0;
132 }
2、冒泡排序:
int main(void)
6 {
7 char s[][100] = {"Hello","World","China","America"};
8 int i,j,rows = sizeof(s) / sizeof(s[0]);
9 for(j = rows - 1;j > 0;--j)
10 {
11 for(i = 0;i < j;++i)
12 {
13 if(strcmp(s[i],s[i + 1]) > 0)
14 {
15 char t[100];
16 strcpy(t,s[i]);
17 strcpy(s[i],s[j]);
18 strcpy(s[j],t);
19
20 }
21 }
22 }
23 for(i = 0;i < rows;++i)
24 {
25 puts(s[i]);
26 }
27 return 0;
28 }
3、插入法排序:
31 int main(void)
32 {
33
34 char s[][100] = {"Hello","World","China","America"};
35 int i,j,rows = sizeof(s) / sizeof(s[0]);
36 for(i = 1;i < rows;++i)
37 {
38 char t[100];
39 strcpy(t,s[i]);
40 j = i;
41 while(strcmp(s[j -1],t) > 0 && j>0)
42 {
43 strcpy(s[j],s[j - 1]);
44 --j;
45 }
46 strcpy(s[j], t);
47 }
48 for(i = 0;i < rows;++i)
49 {
50 puts(s[i]);
51 }
52 return 0;
53 }
查找:
先排序再查找:
//上接排序
152 char n[100] = "China!";
153 int begin = 0;
154 int end = rows -1,mid;
155 while(begin <= end)
156 {
157 mid = (begin + end) / 2;
158 if(strcmp(s[mid],n) > 0)
159 {
160 end = mid - 1;
161 }
162 else if(strcmp(s[mid],n) < 0)
163 {
164 begin = mid + 1;
165 }
166 else
167 {
168 break;
169 }
170 }
171 if(begin <= end)
172 {
173 printf("found\n");
174 }
175 else
176 {
177 printf("not found\n");
178 }
179
180 return 0;
181 }
此处输出可更新为
第八章:函数
定义:
编写函数的理由
1、提高代码的复用性;
2、降低程序的耦合性。
注:
1、
一个源程序文件由一个或多个函数以及其他有关内容(如命令行、数据定义等组成。
2、
程序的执行是从 main 函数开始的,如是在 ain 函数中调用其他函数在调用后流程返回到 main 函数,在 main 函数中结束整个程序的运行。
3、
所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一个函数,即函数不能嵌套定义
4、
从函数的形式看,函数分两类。有参函数与无参函数,无参函数实际上是有参函数的特殊形式。
函数的定义:
注:
1、类型标识符:类型名。最终运行的结果返回值。
2、函数名:要符合标识符的一般规则。
3、(): 括号不能省,内部为形参,形参的类型要独立给出
4、函数的调用()中,要填入实参,个数类型要与形参匹配。
5、函数的定义、调用举例:
实参可以直接写成常量printf("%d\n",add( 'A' , 20 ) );
6、c语言中,若没给返回值,则会默认返回int型
7、main()为主调函数,add()为被调函数;被调写前,主调写后,否则编译有警告。
示例:
求最大值:
184 int maxOfThreeNumbers(int a,int b,int c)
185 {
186 int max = a > b ? a : b;
187 return max > c ? max : c;
188
189 }
190 int main(void)
191 {
192 int a = 10,b = 9,c = 11;
193 int max = maxOfThreeNumbers(a,b,c);
194 printf("%d\n",max);
195 return 0;
196 }
还可以嵌套使用:
判断是否被3整除:
判断是否是闰年:
222 int isLeapYear(int year)
223 {
224 return 0 == year % 4 && year % 100 != 0 || 0 == year % 400;
225 }
226
227 int main(void)
228 {
229 int year = 2024;
230 puts(isLeapYear(year) ? "Yes" : "No");
231 return 0;
232 }
输出某年某月的天数:
222 int isLeapYear(int year)
223 {
224 return 0 == year % 4 && year % 100 != 0 || 0 == year % 400;
225 }
253 int daysOfTheMonth(int year,int month)
254 {
255 int days;
256 if(month < 1 || month > 12)
257 {
258 return -1;
259 }
260 if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month ==12)
261 {
262 days = 31;
263 }
264 else if(month == 4 || month == 6 || month == 9 || month ==11)
265 {
266 days = 30;
267 }
268 else
269 {
270 if(isLeapYear(year))
271 {
272 days = 29;
273 }
274 else
275 {
276 days = 28;
277 }
278 }
279 return days;
280 }
282 int main(void)
283 {
284 printf("%d\n",daysOfTheMonth(2024,13));
285 return 0;
286 }
//简化版本:
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;
}