C语言笔记(二)数组和函数

目录

3.数组

3.1数组的概念

3.2数组的分类

3.2.1按元素的类型分类

3.3数组的定义

3.3.1一维数组的定义

3.3.2二维数组的定义

3.4数组的初始化

3.4.1一维数组的初始化

3.4.2二维数组的定义并初始化

3.5数组元素的引用方法

3.5.1一堆数组元素的引用方法

3.5.2二维数组元素的引用方法

3.5.3字符数组

练习

4.函数

 4.1函数概念

4.2函数的分类

 4.3函数的定义

4.4函数声明

4.5函数的调用.


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的局部变量

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值