c基础-数组
二维数组:如a[2][3],行大小定义可以省略但列的大小不行
初始化的时候可以直接和一维数组一样,直接把数据放入一个花括号中,除此以外还可以把在花括号中把每一行的数据括起来。
习题:
在3*4二维数组中查找并输出最大值和其下标(行号和列号)
通过for循环遍历,if语句进行对比判断,将最大值和其下标存到定义的变量中最后进行输出,这里要给最大值和最大值下标变量设定初始值,因此这里i遍历的起点可以从1开始。
1 #include <stdio.h>
2
3 int main()
4 {
5 #if 0
6 int max,a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12},row=0,col=0;
7 max=a[0][0];
8 for(int i=0;i<3;i++)
9 {
10 for(int j=0;j<4;j++)
11 {
12 printf("%d ",a[i][j]);
13 if(a[i][j]>max)
14 {
15 max=a[i][j];
16 row=i;
17 col=j;
18 }
19
20 }
21 printf("\n");
22 }
23 printf("%d,%d行%d列\n",max,row,col);
24 return 0;
25 }
26 #endif
从键盘输入(某年某月(包含闰年),输出该年的的该月拥有的天数,闰年:能被4整除,但不能被100整除;能被400整除
可以用一维数组,当然用二维数组分别存闰年和平年每月的天数也行
38#include <stdio.h>
39
40 int main()
41 {
42 #if 1
43 //int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
44 int days[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
45 {31,29,31,30,31,30,31,31,30,31,30,31}};
46 int year=0,month=0,day=0;
47 while(1)
48 {
49 printf("请输入年和月(year,month):\n");
50 reget:
51
52 scanf("%d,%d",&year,&month);
53 if(year<0)//小于0表示退出
54 return 0;
55 else if(month>12||month<1)
56 {
57 printf("月份出错,重新输入年和月(year,month):\n");
58 goto reget;
59 }
60 else if(year%4==0&&year%100!=0||year%400==0)
61 #if 0
62 days[1]=29;
63 else
64 days[1]=28;
65 printf("%d年的%d月有%d天\n",year,month,days[month-1]);
66 #endif
67 printf("%d年的%d月有%d天\n",year,month,days[1][month-1]);
68 else
69 printf("%d年的%d月有%d天\n",year,month,days[0][month-1]);
70
71 }
72 #endif
73 return 0;
74 }
75
字符数组:用单引号给字符数组初始化和赋值数据例如char a[10]={‘a’,‘c’};这里是把字符a和c存到字符数组中,其余字符数组内容为空字符‘\0’;
定义数组初始化时和其他类型数组一样可以在初始化通过字符个数来确定数组方括号里被忽略的大小常量
字符数组的输入输出%c
c高级
字符串外部输入读取%s
gets(数组名)输入
puts(数组名)输出
字符串的头文件 #include<string.h>
常用的字符串处理函数
strcat函数:连接字符串
strcat(数组1,数组2)把字符串2放到字符串1后面(字符串1的\0被去掉,保留尾部字符串2的\0)
strlen函数:计算字符串长度
strlen(字符串数组)//不包括\0字符串的字符个数
strcpy:字符串复制函数
strcpy(字符串1数组名,字符串2数组名或字符串常量)把字符串2复制给字符串数组1中(字符串1数组的大小要大于等于字符串2数组中字符串长度加上\0的大小或者是大于等于字符串常量长度加上\0的大小)
strcmp字符串大小比较
strcmp(字符串1,字符串2)比较的可以是字符串数组中的字符串,也可以是字符串常量,实际上这个函数是将字符串中相对应顺序的字符进行挨个对比(按ascll大小比),一旦字符不同必然会有大小之分,就会结束比较,当然遇到\0就也会结束,如果比完二者完全相同就是相等。
模块化程序设计(函数、传参返回值)
函数 定义(函数类型为void,无返回值,其他类型都要有相应类型的返回值(只有一个))
函数类型 函数名(形参)//可以没有形参
{
函数体;
}
函数声明
如果函数定义在调用之前,相当于已经声明了,如果在调用之后就必须声明,声明格式就是去掉函数定义时的函数体和花括号,然后在后面加上结束符“;”,当然函数定义时,圆括号内部如果有形参同样要有,但是这里重要的是类型要一致,形参变量名可以省略。
函数调用
函数名 (实参);//有实参就要传入相应类型的变量,没有就不用
函数嵌套调用
定义函数时不能嵌套定义,但是可以嵌套调用,就是可以在调用的一个函数中调用另一个函数
习题:
输入四个数,求最大值(在max_4函数中多次调用my_max函数)
40 #if 0
41 int my_max(int a,int b)
42 {
43 return a>b?a:b;
44 }
45 int max_4(int a,int b,int c,int d)
46 {
47 my_max(my_max(my_max(a,b),c),d);
48 }
49 int main()
50 {
51 int a=0,b=0,c=0,d=0;
52 printf("请输入4个数(a,b,c,d):\n");
53 scanf("%d,%d,%d,%d",&a,&b,&c,&d);
54
55 printf("%d、%d、%d和%d之间最大的是%d\n",a,b,c,d,max_4(a,b,c,d));
56
57 return 0;
58 }
函数递归调用
在调用的函数中通过一定的规律(递归表达式)调用自身实现代码复用,要有递归出口,就是不能无终止的调用,在满足相应条件要能自动退出。
习题:
求n的阶乘(通过factorial函数递归调用实现,也可以不用递归用for循环中不断相乘的方法实现)
62 #if 0
63 int factorial(int num)
64 {
65 if(num==0)
66 return 1;
67 else
68 return num*factorial(num-1);
69 }
70 int main()
71 {
72 int num=0;
73 printf("请输入需要求几的阶乘:\n");
74 scanf("%d",&num);
75 printf("%d的阶乘结果是%d\n",num,factorial(num));
76
77 return 0;
78
79 }
斐波那契数列
F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
这题看题目其实很绕,但是如果自己去试着代入直接求几个出来,那么通过结果的规律就可以发现它是截取了斐波那契数列中的一段。
1 2 3 5 .....
1#include <stdio.h>
2 #if 0
3 int fun1(int n)
4 {
5 if(n==1)
6 return 1;
7 else if(n==2)
8 return 2;
9 return (fun1(n-2)+fun1(n-1));
10 }
11 int main()
12 {
13 int n;
14 printf("请输入跳的级数");
15 scanf("%d",&n);
16 printf("有%d种方法\n",fun1(n));
17
18 return 0;
19 }
20 #endif
数组与函数
在调用函数时实参传数组名,传递的是数组的首地址,在调用函数中接收的就是地址,所以在那里定义的数组形参相当于指针,因此不能直接用sizeof求数组长度,因为传递的是地址所以在调用函数中是对实际数组进行操作,如果需要传递数组大小,需要另外定义变量进行传递,字符数组可以通过strlen函数求得字符个数表示数组长度,同理,字符串数组也可以通过strlen求,但结果要加上‘\0’。
这周的学习内容并不是很多,最主要的是通过习题来锻炼融汇之前所学以及学会使用函数的定义声明和调用。在这周的编程练习中我发现了我编程时有时候会不细心使编程有些答非所问,不符合题意,这需要警戒,其次写代码考虑的时候,有时还是有些不太全面,虽然也能实现功能,但在正常应用中肯定是要越全面越好,因为代码需要有健壮性,扛得住测试。