第四章:函数与数组

第一节:函数

第二节:数组是个大仓库

数组的概念

根据前面的知识,基本展示并使了了如何使用变量,可是,单个的变量有什明显的缺点,那就是它只能存储少量的数据,比如一个数,或一个字符,那么如果想要处理很多数据,那就需要很多的变量,然而变量一旦太多,便难以管理,因此就必需有一个更适宜的存储方式。这就是数组。

数组的声明与初始化

数组的本质也是变量,所以在数组使用前,也必须声明数组。

1、数组的语法格式

数据类型 数组名[常量表达式];

注意:数组的类型、命名规则与变量相同,特征是有 [ ] ,每个存在数组中的变量称为 数组元素 ,中括号内的常量表达式,指的是数组的大小

例:

// 声明一个可以存放5个整型数据的数组
int a[5]
2、操作数组
  1. 数组元素的下标
    数组会给每个存储在里面的每个元素进行编号,这些号码称为 下标 ,操作数组是可使用 数组名[下标] ,访问对应的数组元素,数组的下标从0开始。
    例:
    在这里插入图片描述
  2. 将元素存入数组
    对数组的操作跟对变量在操作大同小异,也是通过赋值的形式,但要注意下标是否有效
    例:
   int array[5];
   // 对数组元素进行赋值 
   array[0] = 1;
   array[1] = 3;
   array[2] = 5;
   array[3] = 7;
   array[4] = 9;
   
   //访问元素,并输出
   cout << array[3] << endl; 
   cout << array[0] << endl; 

执行结果:
在这里插入图片描述

3、数组的初始化

在学习变量时,变量在声明的同时可以进行初始化。同样地,数组也可以在声明时同时进行初始化。

格式:
数据类型 数组名[常量] = {元素0初始值,元素1初始值...}

注意:
大括号中值 的个数不能大于声明数组的大小。
不能通过添加逗号的方式跳过
值的个数可以小于声明数组的大小

例:

int a1[3] = { 0, 1, 2, }// 正确
int a2[3] = { 0, 1, 2, 3}// 错误,初始化值个数大于数组大小
int a3[3] = { 0, , 2, }// 错误,初始化值被跳过
int a4[3] = { 0, 1, }// 错误,最后一个不能在后面加逗号
int a5[3] = { 0, 1 }// 正确,初始化值少于数组大小是可以的

4、省略数组的大小

面对初始化一个数组,既要进行赋值,又要数元素的个数,这显然非常不方便 ,因此省略数组的大小,也是一个方便的操作。

例:

// 正常初始化赋值
int a[4] = {0, 3, 6, 8};
// 省略数组大小赋值
int a[] = {0, 3, 6, 8};

省略数组大小的写法便于在声明数组元素时的插入或修改,不必再去考虑数组的大小变化,计算机会自动根据数组的元素定义大小。

字符数组在内存中的存储

1、内存和地址

在计算机中,变量和数组者是放在内存里的,内存里就像有一个个的小房间,数据都存在这些房间里面。然而每个房间都有唯一的房间号码,因此计算机就是通过寻找这些房间号码进行访问和修改指定的数据。这些号码就是 内存地址 ,通常这些内存地址都以一串16进制的数来表示。
一个小房间只能存储一个字节的数据(即1B,一个汉字至少是2B), 因此不同的变量需要的房间大小都是不同的

2、数组在内存中的存储

不同的变量存储的内存大小是不同的,而数组在内存中则是由N个相邻的元素按顺序组成,声明时若省略数组的大小,访问时便很可能会越界。
sizeof(数组名或数据类型) ———— 求数组/ 数据内型的大小

例:

   int a[] = {3, 5, 6, 8, 7, 9} ;
   int s1 = sizeof(a);
   cout << "a所占内存是:" << s1 << endl;
   int s2  = sizeof(int);
   cout <<  "a的数据类型所占内存是:" << s2 << endl;
   int s3  = s1 / s2;
   cout << "数组的大小是:" << s3 << endl;

执行结果:
在这里插入图片描述

3、字符的储存
  1. ASCII字符集

【什么是字符集】
计算机记录文本的方式是通过字符集序号来记录的;
每一个字符的存储,都是以其位于字符集中的序号来实现的,包括空格、换行符、标点等;
最早的字符集是ASCII,只包含包括大小写字母、阿拉伯数字、一些基本符号;
随着计算机在全球各国的普及,由于世界的语言众多,就诞生了各种适应不同语种的字符集;
专门适应中文的字符集有GBK、GB2312等,例如Windows操作系统中文版所使用的就是GBK字符集;
但无论何种字符集,都默认将ASCII完整包含在前128位当中;
防止由于不同主机中使用的字符集不同,导致了严重的数据传输乱码问题;
UTF-8字符集包含了世界各种不同语言中的常用字符,正逐渐成为某种意义上的、心照不宣的业界标准;

【什么是ASCII字符集】
美国标准信息交换码(American Standard Code for Information Interchange);
包括最基本的128个字符,是最早也最基本的字符集;
内容包括大小写字母、阿拉伯数字、以及一些常用符号;
序号和字符的互换可以使用chr(order)和ord(character)两个系统内建函数;

在这里插入图片描述
例:

char t;
t = 33;
cout << t <<endl;

执行结果:
在这里插入图片描述
例:

char t;	
for(int i=32;i<=127;i++){
	t = i;
	cout << t << endl;
}

执行结果:
在这里插入图片描述
2) 字符与字符串

字符和字符串是不同的,字符中能是一个,而字符串是由若干个字符连接而成。例如:‘a’ 和"a".字符串在结尾处会默认加上一个看不见的结尾符’\0’.它也是个转义字符。所以字符串"a"实际上的两个字符:“a\0”,因此在声明若按字符串初始化时要注意空间是否足够

例:

char a[] = {"hello"};// 按字符串初始化 
char b[] = {'h','e','l','l','o'};// 按字符初始化
char c[] = {'h','e','l','l','o','\n'};// 按字符串初始化
cout << "数组a的大小是:" << sizeof(a) << endl;
cout << "数组b的大小是:" << sizeof(b) << endl;
cout << "数组c的大小是:" << sizeof(c) << endl;
cout << a << endl;
cout << b << endl;
cout << c << endl;

执行结果:
在这里插入图片描述

二维数组的声明与初始化

1、什么是二维数组

二维数组与一维数组的关系就像是线与面的关系,一条线,数学上用一条数轴来表示,而一个平面,数学上则是用平面坐标系来表达。
数组中用下标来描述数组中的某个元素就像是描述一条线上的一点。如果使用两个下标,就能形成一个平面。像表格一样,有行和列,所有数据都能存在这些表格里。

在这里插入图片描述

通常把二维数组的两个下标分别称为行下标和列下标,在前面的是 行下标 ,在后面的是 列下标
用到二维数组一般有两种情况,一种是描述一个二维的事物,比如1表示墙,0表示通路。还有一种是描述多个具有多项属性的事物,比如有多个学生,每个学生有语、数、英的成绩,这些成绩就可以用于二维数组表示。

2、二维数组的声明与初始化
  1. 声明的结构
    数据类型 数组名[行数][列数]

  2. 声名二维数组

二维数组的初始化分两种,一种是顺序初始化,另一种是按行初始化。

例:

	int a[3][2] = {4, 2, 5, 6};       //顺序初始化 
	int b[3][2] = {{4,2}, {5}, {6}};  //按行初始化
	
	cout << "以下是数组a" << endl;
	for (int i=0;i<3;i++){
		for(int j=0;j<2;j++){
			cout <<setw(2) << a[i][j];
		}
		cout << endl;
	}
	
	cout << "以下是数组b" << endl;
	for (int k=0;k<3;k++){
		for(int l=0;l<2;l++){
			cout <<setw(2) << b[k][l];
		}
		cout << endl;
	}

执行结果:
在这里插入图片描述
3) 可省略的第一维

一维数组的大小可以省略,可是二维数组的元素个数是行数和列数的乘积,如果只有元素个数,计算机是无法知道在第几行,第几列的位置的,因些C++有规定,在声明和初始化一个二维数组时,只有第一维(行数)可以省略。

例:

int array[2][3] = {1, 2, 3, 4, 5, 6};
//等同于
int array[][3] = {1, 2, 3, 4, 5, 6};

二维数组和一维数组的关系

1、二维数组可以转化为一维数组

有些时候用二维数组来描述某些事物非常方便 。例如用二维数组来画一个地图,那么使用行下标和列下标就如同平面直解坐标系一样。可是在某些情况下,不能使用二维数组,或者难以制造一个二维数据。由于二维数组在内存中的存储情况和一维数组是相同的,所以可以用一个一维数组来代替它

在这里插入图片描述
一个二维数组a[x][y]在一维数组b中的转化关系为:
a[x][y] = b[ x*列数 + y ]

向函数传递数组的方法

数组的空间很大,如果能够把它作为参数传递给函数,那么就能发挥很大的作用,例如,普通的参数只能比较两个或三个数的大小,如果能使用数组,便能比较一堆数中的最大的数,这大大提高了程序的效率。

例:

#include<iostream>
using namespace std;
int max(int a[],int size);
int main(){	
	int numb[] = {2,45,12,6,23,98,13,3};
	int mb = sizeof(numb)/sizeof(int);
	cout << "最大的数是:" << max(numb,mb)<<endl; 
	
	return 0;
}
int max(int a[],int size){
	int max = 0;
	for(int i=0;i<size;i++){
		if(a[i]>max){
			max = a[i];
		}
	}
	return max;
}

执行结果:
在这里插入图片描述

第二节:函数

函数的概念

什么是函数

函数,是可以用来解决问题,得到想要的结果的工具。例如日常生活中,画表格需要用到尺子、吃饭需要筷子、开瓶子需要开瓶器等。工具是现成的,而且是可以重复使用的,有了工具直接用就能得到我们想要的结果。函数也是同样的道理。

源函数与调用函数

每个工具都有自己的使用说明书,函数也不例外,这份说明书就叫源函数,又可以称为函数的原形。

例:求最值函数

int max(int a,int b);

此函数的函数名为max,一听就知其意。运行该函数后会产生一个整数的结果。括号内表示需要填上两个整形参数,这两个参数规定了所填的类型、位置、序顺,因此使用时需要一一对应

例:使用(调用)最值函数

int r=3,s=5,t;
t = max(r,s);
cout << "较大的数是:" << t <<endl; 

执行结果:
在这里插入图片描述
注:调用函数时放入括号内的变量名r和s与源函数里a、b的名字是可以不一们的,a和b只是一个代表,只是形式参数,不是实际参数。调用函数后的结果可以任意赋值

例: 输出函数

void output(char c);

函数名称:output(见名知意,输出的意思,方便记忆);
函数结果类形: void(即空类型,表示不会产生任何定量的结果)
函数参数个数:1个
参数的类型:char

常用的函数

前面的学习中,第一行往往是 #include xxxx 头文件。其实在头文件中就有不少系统已经为你准备好的函数(工具),max()函数就是其中之一,它们叫做 标准库函数。include一个头文件,就相当于指定使用某个工具箱。所以使用系统定义好的函数,就要知道这些函数在哪个头文件。
系统已经为我们准备了很多函数,只要通过文件头就能够调用它们。(可以通过C++工具书查或使用IDE)

标准C++文件头(部分)
在这里插入图片描述
在这里插入图片描述
例:使用标准库退出程序的方法

#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
int main(){	
	// 定义一个圆周率常量
	const double PI = 3.141592654;
	// 定义一个度数 
	double a = 90;	
	cout << "sin(a) = "<< sin(a/360*2*PI) << endl;
	//调用退出程序的方法
	exit(1) ;
	cout << "能看到我吗?"; 
	return 0;
}

执行结果:
在这里插入图片描述

函数的声明和定义方法

系统给了我们标准库函数,大大地方便了我们平时的操作,不必再一点一滴地写代码。然而,仅靠系统给出的标准库函数是不够用的,有时候要根据实际需求,自己做一个属于自己的函数。

1、函数的声明

告诉电脑我要创建一个新的函数,即声明一个函数。其次,要告诉电脑如何运作,这是定义一个函数。函数产生的结果,叫函数的返回值

函数的结构:
返回值类型 函数名(参数1,参数2);

2、函数的定义

不解释,一图说完函数头与函数体
在这里插入图片描述

3、函数的返回值

返回值和运行结果是两种概念。返回值是函数反馈给调用函数处的信息,运行结果是程序通过屏幕反馈给用户的信息。
return xxx 称为返回语句,retrun 是语句的关键字。

例:真假悟空

#include<iostream>
using namespace std;
string monkey();  //声明函数
int main(){	
	string t;
	t = monkey();
	cout << t <<"才是真的悟空!" <<endl; 	
	return 0;
}

string monkey(){
	cout << "有筋斗云的猴子" <<endl; 
	return "有金箍棒的猴子";
}

运行结果:
在这里插入图片描述

主函数

主函数是一个特殊的函数,不管把它放在代码的什么位置 ,程序的运行都是从主函数开始的。所以,每个程序有且只能有一个主函数,否则计算机将不知道从何处开始运行。因为主函数只有一个,因此就没必要声明主函数的存在了。
主函数也有返回值,就是0,一般地返回这个值是告诉系统运行了该程序,并且正常结束。一般地返回其他值则表示程序异常,只要类型正确,不影响运行。

【小提示】
C++有不同版本的编译器,像Visual C++ 、Borland C++、GCC 等,美国国家标准机构和国际化标准组织规定C++语法和编译器无关,并制定相关标准,目前最高标准是ISO/IEC 144882:2014 ,简称C++14
主函数除了可以使用int main外,还可以使用argc,char*argv[]等,有兴趣可参考相关书籍

注意:在同一个函数里,不能有相同的变量或参数,否则将导致报错,而在两个不同的函数中,可以有相同的变量或参数

例:

#include<iostream>
using namespace std;
int func1(int a,int b);
int func2(int a,int b);
int func3(int a,int b);
int main(){	
	int x=3,y=4,res1,res2,res3;
	res1 = func1(x,y);
	res2 = func2(x,y);
	res3 = func3(x,y);
	cout << res1 <<endl; 
	cout << res2 <<endl; 
	cout << res3 <<endl; 	
	return 0;
}

int func1(int a,int b){
	return (a+b);
}
int func2(int a,int b){
	return (a-b);
}
int func3(int a,int b){
	return 666;
}

执行结果:
在这里插入图片描述

函数重载

函数的默认参数

变量的引用

函数的递归

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值