目录
3.数组
3.1数组的概念
数组是若干个相同类型的变量在内存中有序村存储的集合。
int a[10];//定义了一个整型的数组a,a是数组的名字,数组中有10个元素,每个元素的类型
都是 int类型,而且在内存中连续存储。
这十个元素分别是a[0]...........a[9]
a[0]~a[9]在内存中连续的顺序存储
3.2数组的分类
3.2.1按元素的类型分类
(1)字符数组
即若干个字符变量集合,数组中得每一个元素都是字符型得变量
char s[10]; s[0]~s[9];
(2)短整型的数组
short int a[10]; a[0], a[9]; a[0]=4; a[9]=8;
(3)整型的数组
int a[10]; a[0] a[9] ;a[0]=3; a[0]=6;
(4) 长整型的数组
long int a[5];
(5) 浮点型的数组(单双)
float a[6]; a[4]=3.14f;
double a[8]; a[7]=3.115926;
char*a[10];
int*a[10];
(7)结构体数组
struct stu boy[10];
3.2.2按维数分类
一维数组
int a[30];
类似一排平房
二维数组
int a[2][30]
可以看做一栋高楼,有多层,每层有多个房间,有行,有列
2行每行30元素
多维数组
int a[4][2][10];
三维数组是由多个相同的二维数组构成的;
3.3数组的定义
定义一个数组,在内存里分配空间
3.3.1一维数组的定义
格式;
数据类型 数组名 [数组元素个数] ;
int a [10];
char b [5];定义了5个char类型变量数组b
5个变量分别为 b[0]~b[4];
在数组定义的时候可以不给出数组元素的个数,根据初始化的个数来定数组的大小
#include <stdio.h>
int main()
{
int a[5];
int b[] = { 1,2,3,4 };
printf("sizeof(a)=%d\n",sizeof (a));
printf("sizeof(b)=%d\n",sizeof (b));
return 0;
}
a=20 b=16 整型一个元素四个字节
3.3.2二维数组的定义
格式:
数据类型 数组名 [行的个数][列的个数]
int a [4][5];
定义了20个int类型的变量 分别是
a[0][0], a[0][1], a[0][2], a[0][3], a[0][4];
a[1][0], a[1][1], a[1][2], a[1][3], a[1][4];
a[2][0], a[2][1], a[2][2], a[2][3], a[2][4];
a[3][0], a[3][1], a[3][2], a[3][3], a[3][4];
多维数组定义
int a[3][4][5];
int a[8][3][4][5];
扩展:
二维数组在定义的时候,可以不给出行数,但必须给出列数,二维数组的大小根据初始化的行数来定
#include <stdio.h>
int main()
{
int a[][3]={
{1,2,3},
{4,5,6},
{7,8,9},
{10,11,12}
};
printf("sizeof (a)=%d\n",sizeof (a));
return 0;
}
输出48
3.4数组的初始化
定义数组的时候,顺便给数组的元素赋初值,即开辟空间的同时并且给数组元素赋值
3.4.1一维数组的初始化
a 全部初始化
int a[5]={2,4,7,8,5};
代表a[0]=2;...
b部分初始化
int a[5]={2,3,4};初始化赋值不够后面补0
注意:只能省略后面元素,可以不初始化,不能中间的不初始化
#include <stdio.h>
int main()
{
int a[5]={2,3,5};
int i;
for(i=0;i<5;i++)
{
printf("a[%d]=%d\n",i,a[i]);
}
return 0;
}
3.4.2二维数组的定义并初始化
按行初始化
a 全部初始化
int a[2][2]={{1,2},{4,5}};
a[0][0]=1;a[0][1]=2;类推
b部分初始化
int a[3][3]={{1,2},{1}};
a[0][0]=1; a[0][2]=0;
#include <stdio.h>
int main()
{
int a[2][2]={{1,2},{4,5}};
int b[3][3]={
{1,2},
{1},
};
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("a[%d][%d]=%d",i,j,a[i][j]);
}
printf("\n");
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("b[%d][%d]=%d",i,j,b[i][j]);
}
printf("\n");
}
return 0;
}
逐个初始化:
全部初始化:
int a[2][3]={2,5,4,2,3,4};
部分初始化:
int a[2][3]={3,5,6,8};
#include <stdio.h>
int main()
{
int a[2][3]={1,2,4,5,6};
int b[2][3]={3,5,6,8 };
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("a[%d][%d]=%d",i,j,a[i][j]);
}
printf("\n");
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("b[%d][%d]=%d",i,j,b[i][j]);
}
printf("\n");
}
return 0;
}
3.5数组元素的引用方法
3.5.1一堆数组元素的引用方法
数组名[下标];//下标代表数组元素在数组中的位置
int a[5];
a[0] 到 a[4];
3.5.2二维数组元素的引用方法
数组名[行标]
int a [4][5];
a[0][0], a[0][1], a[0][2], a[0][3], a[0][4];
a[1][0], a[1][1], a[1][2], a[1][3], a[1][4];
a[2][0], a[2][1], a[2][2], a[2][3], a[2][4];
a[3][0], a[3][1], a[3][2], a[3][3], a[3][4];
#include <stdio.h>
int main()
{
int a[3][4]={{1,2,3,4},{5,6},{5}};
int b[3][4]={11,12,13,14,15,16,17,18, 19};
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("a[%d][%d]=%d",i,j,a[i][j]);
}
printf("\n");
}
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("b[%d][%d]=%d",i,j,b[i][j]);
}
printf("\n");
}
return 0;
}
3.5.3字符数组
char c1[]={'c', ' ', 'p', 'r', 'o', 'g'};六个元素
char c2[]="c prog";
char a[][5]={
{ 'B', 'A', 'S', 'I', 'C', },
{ 'b', 'A', 'B', 'S', 'c', }
};
char a[][6] = {“hello”,“ world”};
字符数组的引用
1.用字符串方式赋值比用字符逐个赋值要多占1个字节,用于存放字符串结束标志'\0’
2.上面的数组 c2 在内存中的实际存放情况为:
#include <stdio.h>
int main()
{
char c1[]={'c', ' ', 'p', 'r', 'o', 'g'};
char c2[]="c prog";
printf ("sizeof(c1)=%d\n",sizeof(c1));
printf ("sizeof(c2)=%d\n",sizeof(c2));
return 0;
}
3.由于采用'\0'标志,字符数组的输入输出将更加方便
#include <stdio.h>
int main()
{
char str[15];
printf("input str:\n");
sacnf_s("%s", str,15);
printf("str:%s\n", str);
return 0;
}
练习:
1、任意给出一个年、月、日,判断是这一年的第几天:闰年算法:能被 4 整除且不能 100 整除,或者能被 400 整除如: 2012 5 10 是这一年的第 131 天提示:使用数组的方式计算,将每月的天数放在一个数组中
#include <stdio.h>
int main()
{
int year, month, day;
int a[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
int i, sum = 0;
printf("please input year month day\n");
scanf_s( "%d %d %d",&year,&month,&day );
for (i = 0; i < month - 1; i++)
{
sum = sum + a[i];
}
sum = sum + day;
if ((month > 2) && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
{
sum = sum + 1;
}
printf("sum=%d\n", sum);
return 0;
}
2、打字游戏
1)随机函数
A.srand((unsigned)time(NULL));以当前时间为准,设置随机种子注意:此函数,在每次开始游戏后调用一次即可B.ch=rand0;
注意: rand0函数,每调用一次,产生一个随机数字
2)获得键值函数
ch=_getch(; //无需按下回车,可直接获得键盘上按下的键值
3)时间函数start time-time(NULL)
end time=time(NULL):
4)system("cls");//清空
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <corecrt.h>
#include <conio.h>
void help(void)
{
printf("\n******************************************");
printf("\n*输入过程中无法退出! *");
printf("\n*请按所给的字母敲击键盘! *");
printf("\n*按任意键开始测试,按下搜字母时开始计时!*");
printf("\n*输入出错则以_表示 *");
printf("\n******************************************\n\n");
}
int main()
{
char ch;
char str[51] = "";
int count = 0;
int i;
time_t start_time, end_time;
while (1)
{
system("cls");
help();
ch = _getch();
srand(time(NULL));
srand(4);
for (i = 0; i < 50; i++)
{
str[i] = rand() % 26 + 'a';
}
str[50] = '\0';
printf("%s\n", str);
count = 0;
for (i = 0; i < 50; i++)
{
ch = _getch();
if(i==0)
{
start_time = time(NULL);
}
if (ch ==str[i])
{
count++;
printf("%c", ch);
}
else
{
printf("_");
}
}
end_time = time(NULL);
printf("count=%d\n",count);
printf("\n正确率:%d%c\n", count * 100 / 50, '%');
printf("用时%ld秒\n", (long int)end_time - start_time);
while (1)
{
ch = _getch();
if (ch == ' ')
{
break;
}
if (ch == 27)
{
return 0;
}
}
}
return 0;
}
4.函数
4.1函数概念
函数是C语言的功能单位,实现一个功能可以封装一个函数来实现。
定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。
4.2函数的分类
1.从定义角度分类(即函数是谁实现的)
1.库函数(C库实现的)
2.自定义函数(程序员自己实现的函数)
3.系统调用(操作系统实现的函数)
2.从参数角度分类
1.有参函数
函数有形参,可以是一个,或者多个,参数的类型随便
完全取决于函数的功能
int fun(int a,float b,double c)
{
}
int max(int x,int y)
2.无参函数
函数没有参数,在形参列表的位置写一个void或什么都不写
int main(void)
{
}
int main()
{
}
3.从返回值角度分类
(1)带返回值的函数
在定义函数的时候,必须带着返回值类型,在函数体里,必须有return
如果没有返回值类型,默认返回值整型
例:
char fun()
{
char b='a';
return b;
}
fun
{
}
如果把函数的返回值类型省略了,默认返回整型
(2.)没返回值的函数
在定义函数的时候,函数名字前面加void
void fun(形参表)
{
;
;
return;
;
}
在函数里不需要return(它是用来结束一个函数的调用)
如果想结束函数,返回到被调用的地方,return什么都不返回就可以了
#include <stdio.h>
int max(int x,int y)
{
int z;
if (x > y)
z = x;
else
{
z = y;
}
return z;
}
void help(void)
{
printf("**************************\n");
printf("*********帮助信息*************\n");
printf("**************************\n");
}
int main()
{
int num;
num = max(5, 10);
printf("num=%d/n", num);
help();
return 0;
}
4.3函数的定义
什么叫做函数的定义?
即函数的实现
1.函数的定义方法
返回值类型 函数名字(形参列表)
{//函数体,函数的功能在函数体里实现
}
注:形参必须带类型,而且以逗号隔开
函数的定义不能嵌套,即不能在一个函数体内定义另外一个函数
所有函数的定义是平行的
注 :在一个程序中,函数只能定义一次
给函数起名字的时候,尽可能见名思意
4.4函数声明
1.概念
对已经定义的函数,进行说明
函数的声明可以声明多次
2.为什么要声明
有些情况下,如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数,
因为编译器在编译器C程序的时候,从上往下编译的
3.声明的方法
什么时候需要声明
(1)主调函数和被调教函数在同一个.c文件中的时候
被调函数在上,主调函数在下
这种情况下不需要声明
2被调函数在下,主调函数在上
编译器从上往下编译,在mai函数(主调函数),不认识fun,需要声明
怎么声明?
1.直接声明法
将被调用的函数的第一个拷贝过去,后面加分号
#include <stdio.h>
void fun(void)
{
printf("hello world\n");
}
int main()
{
fun();
return 0;
}
#include <stdio.h>
void fun(void);
int main()
{
fun();
return 0;
}
void fun(void)
{
printf("hello world\n");
}
2.间接声明法
将函数的声明放在头文件里,.c程序包含头文件即可(在外部写,在内部声明)
<>在库函数里找,""在当前文件里找
在主调函数和被调函数不在同一个.c文件中的时候
一定要声明
声明的方法:
直接声明法
将被调用的函数的第一行拷贝过去,后面加分号,前面加extern
间接声明发
将函数声明放在头文件,.c程序包含头发文件即可
4.5函数的调用.
函数的调用方法
变量=函数名(实参列表);//带返回值
函数名(实参列表);//不带返回值的
1.有无返回值
(1)有返回值,根据返回值的类型,需要在主调函数中定义一个对应类型的变量,接返回值
(2)没有返回值的函数,不需要接受返回值.
2.有无形参
函数名(实参列表);//带形参的
函数名();//没有形参的
注意:实参,可以常量,可以是变量,或者是表达式
形参是变量,是被调函数的局部变量(int x)是max的局部变量