一、二维数组
1、二维数组的定义
二维数组的定义方法和一维数组类似,其一般形式为:
类型说明符 数组名[常量表达式][常量表达式]
例如:float a[3][4];
C语言中,二维数组在内存中存放的顺序是按行存放的,即在内存中先顺序存放第一行元素,接着再来存放第二行元素。
2、二维数组的初始化
(1)分行给二维数组赋初值;
(2)将所有数据放在一个花括号内;
(3)可以对部分元素赋初值。
3、二维数组的举例
有一个3*4的矩阵,求出其中的最大值并输出最大值和其所在的行号和列号。
#include <stdio.h> int main() { int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int i=0,j=0; int row,col; int max=a[0][0]; for(i=0;i<3;i++) { for(j=0;j<4;j++) { if(a[i][j]>max) { max=a[i][j]; row=i; col=j; } } } printf("max:%d\n",max); printf("row:%d\n",row); printf("col:%d\n",col); return 0; } /*输出结果是 max:12 row:2 col:3 */
二、字符数组
1、字符数组的定义
定义字符数组的方法与定义数值型数组的方法类似,例如:
char c[10];
以上就定义了c[]为字符数组,包含10个元素。
2、字符数组的初始化
把各个字符依次赋给数组中各元素。例如:
char c[10]={'I',' ','l','o','v','e',' ','y','o','u'};
把这10个字符依次赋给c[0]~c[9]这10个元素。
3、字符数组的外部输入读取
#include <stdio.h>
int main()
{
char c[3][3];
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
scanf("%c",&c[i][j]);
printf("%c ",c[i][j]);
}
printf("\n");
}
return 0;
}
4、字符串外部输入读取
字符串的头文件 #include <string.h>
#include <stdio.h>
#include <string.h>
int main()
{
char a[3];
scanf("%s",a);
printf("%s\n",a);
return 0;
}
5、字符数组的输入输出
字符数组的输入输出可以像前面的输入输出数字一样,用格式输入输出控制符。
逐个字符输入输出,用格式"%c"输入或者输出一个字符。
将整个字符串一次输入或者输出,用"%s"格式符。
也可以用puts和gets函数。其一般形式如下:
puts(字符数组):其作用是将一个字符串输出到终端,因此该函数用的不是很多。
gets(字符数组):其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。
6、字符串函数
(1)strcat 字符串连接函数
strcat(字符数组1,字符数组2)
其作用是把两个字符数组中的字符串连接起来,把字符串2接到1后面,结果放到字符串1中。
#include <stdio.h>
#include <string.h>
int main()
{
char str1[30]="China";
char str2[]="NJ";
printf("%s\n",strcat(str1,str2));
return 0;
}
/*输出结果是
ChinaNJ
*/
连接前两个字符串后面都有'\0',连接后只在新串后面保留'\0'。
字符串1必须足够大,以便于容纳字符串2。
(2)strlen 测字符串长度的函数
strlen(字符数组)
它是测量字符串长度的函数。函数的值为字符串中的实际长度。
#include <stdio.h>
#include <string.h>
int main()
{
char str1[30]="China";
printf("%ld\n",strlen(str1));
return 0;
}
/*输出结果是
5
*/
(3)strcpy 字符串复制函数
strcpy(字符串1,字符串2)
作用是将字符串2复制到字符串1中。
#include <stdio.h>
#include <string.h>
int main()
{
char str1[30];
char str2[30]="China";
strcpy(str1,str2);
printf("str1:%s\n",str1);
printf("str2:%s\n",str2);
return 0;
}
/*输出结果是
str1:China
str2:China
*/
(4)strcmp 字符串比较函数
strcmp(字符串1,字符串2)
#include <stdio.h>
#include <string.h>
int main()
{
char str1[30]="Beijing";
char str2[30]="Chengdu";
printf("%d\n",strcmp(str1,str2));
return 0;
}
/*输出结果是
-1
*/
结果若小于0,则表示str1小于str2;
结果若大于0,则表示str1大于str2;
结果若等于0,则表示str1等于str2.
三、函数
1、函数调用
一个c语言程序可由一个主函数和若干其他函数构成,每个函数实现一个特定的功能。主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或者多个函数调用多次。下图是一个程序中函数调用的示意图。
函数声明的作用:把有关函数的信息(函数名、函数类型、函数参数的个数和类型)告诉编译器。
2、函数的定义
(1)定义无参函数
无参函数的函数名后的括号中是空的,没有任何参数。其一般形式为
类型名 函数名(){
函数体
}
(2)定义有参函数
一般形式为
类型名 函数名(形式参数列表){
函数体
}
#include <stdio.h>
int main()
{
int max(int x,int y);//声明max函数
int a=10,b=20;
int c;
c=max(a,b);//调用max函数
printf("%d\n",c);
return 0;
}
int max(int x,int y)
{
int z;
z=x>y?x:y;
return z;
}
/*输出结果是
20
*/
在上述的函数调用过程中,主调函数和被调函数之间存在数据传递的关系。在定义函数的时候函数名后面括号的变量名成为“形式参数”(简称“形参”)。在调用语句c=max(a,b)中,a和b称为“实际参数”(简称“实参”)。
在C语言中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:
- 返回类型
- 函数名称
- 参数
- 函数主体
3、函数声明
函数声明会告诉编译器函数名称以及如何调用函数。函数的实际猪蹄可以单独定义。
在函数声明中,参数的名称并不重要,只有参数的类型是必需的。
4、函数参数
如果函数需要使用参数,则必须声明接受参数值的变量,这些变量被称为函数的形式参数。
当调用函数时,有两种向函数传递参数的方式:
5、函数的嵌套调用
输入四个整数,找出其中最大的整数。
#include <stdio.h>
int max2(int a,int b)
{
if(a>=b)
{
return a;
}
else
{
return b;
}
}
int max4(int a,int b,int c,int d)
{
int max;
max=max2(a,b);
max=max2(max,c);
max=max2(max,d);
return max;
}
int main()
{
int a,b,c,d;
int max;
scanf("%d%d%d%d",&a,&b,&c,&d);
max=max4(a,b,c,d);
printf("%d\n",max);
return 0;
}
7、函数的递归调用
递归调用:在调用一个函数的过程中又出现直接或者间接地调用该函数本身。
用递归的方法求阶乘:
#include <stdio.h>
int fun(int n)
{
if(n<=1)
{
return 1;
}
else
{
return n*fun(n-1);
}
}
int main()
{
int n;
int ret;
scanf("%d",&n);
ret=fun(n);
printf("%d!=%d\n",n,ret);
return 0;
}
斐波那契数列:
F (0)=0,F (1)=1, F (n)=F (n - 1)+F (n - 2)(n ≥ 2,n ∈ N*)
#include <stdio.h>
int fib(int i)
{
if(i==0)
{
return 0;
}
if(i==1)
{
return 1;
}
return fib(i-1)+fib(i-2);
}
int main()
{
int i;
scanf("%d",&i);
printf("%d\n",fib(i));
return 0;
}
四、数组与函数
1、数组元素作为函数实参
数组元素可以作为函数实参,不能作为函数形参。在用数组元素作为函数实参时,把实参的值传给形参,是“值传递”的方式。
输入10个数,要求输入其中值最大的元素和该数是第几个数。
#include <stdio.h>
int max(int a[],int x)
{
int m=0,n,i;
m=a[0];
for(i=1;i<10;i++)
{
if(m<a[i])
{
m=a[i];
n=i;
}
}
printf("%d\n%d\n",m,n+1);
}
int main()
{
int a[10]={0};
int i=0;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
max(a,10);
return 0;
}
2、数组名作为函数参数
输入4位数字,要求输出这4个数字字符,每两个数字间空一个空格。
#include <stdio.h>
#include <string.h>
void insert(char str[])
{
int i;
for(i=strlen(str);i>0;i--)
{
str[2*i]=str[i];
str[2*i-1]=' ';
}
printf("%s\n",str);
}
int main()
{
char str[40];
scanf("%s",str);
insert(str);
return 0;
}
/*输入1990
结果为1 9 9 0
*/