C++入门基础(二)

5、数组

5.1 概述

所谓数组,就是一个集合,里面存放了相同数据类型的数据元素。

特点1:数组中的每个数据元素都是相同的数据类型;

特点2:数组是由连续的内存位置组成的

5.2 一维数组

5.2.1 一维数组定义方式

1.数据类型 数组名[数组长度];

2.数据类型 数组名[数组长度]={值1,值2,....};

3.数据类型 数组名[ ]={值1,值2,....};

示例代码如下:

定义方式1

#include<iostream>
using namespace std;

int main()
{
	//一维数组定义
	//方法1  数据类型 数组名[数组长度];
	int arr[5];
	arr[0] = 50;
	arr[1] = 10;
	arr[2] = 20;
	arr[3] = 30;
	arr[4] = 40;
	//访问数组最后一个位置的内容
	cout << arr[4] << endl;
	system("pause");
	return 0;
}

定义方式2

#include<iostream>
using namespace std;

int main()
{
	//一维数组定义
	//方法2  数据类型 数组名[数组长度]={数组内容};
	int arr[10] = { 0, 1, 2, 3};
	//访问数组中的所有元素
	int i;
	for (i = 0; i < 9; i++)
	{
		cout << arr[i] << endl;
	}
	system("pause");
	return 0;
}

注意:在此例中,数组初始定义为10个位置,但是赋值并没有完全赋值,此时没有赋值的位置将自动补0.

运行结果如下:

 

 定义方式3 

#include<iostream>
using namespace std;

int main()
{
	//方法3  数据类型 数组名[ ]={数组内容};
	int i;
	int arr[ ] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 ,9 };
	//打印数组中的所有元素
	for(i=0;i<9;i++)
	{
		cout << arr[i] << endl;
	}
	system("pause");
	return 0;
}

注意:不论哪种方式定义数组,初始定义时必须定义数组长度。

5.2.2 一维数组数组名的作用

1、通过元素名统计数组元素的大小;

2、可以查看数组首地址;

注意一维数组数组名为常量不可直接赋值。

示例代码如下:

#include<iostream>
using namespace std;

int main()
{
	//数组名的用途
	//1、通过元素名统计数组元素的大小
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
	cout << "整个数组所占空间大小" << sizeof(arr) << endl;
	cout << "数组中的单个元素所占空间大小" << sizeof(arr[1]) << endl;
	cout << "数组长度为" << sizeof(arr) / sizeof(arr[1]) << endl;
	//2、可以查看数组首地址
	cout << "数组的首地址为" << arr << endl;
	//将数组首地址16进制的数转化为10进制
	cout << "数组的首地址为" << (int)arr << endl;
	//查看数组中第一个元素的地址
	cout << "数组的第一个元素地址为" << (int)&arr[0] << endl;
	cout << "数组的第二个元素地址为" << (int)&arr[1] << endl;
	system("pause");
	return 0;
}

此时运行结果如下:

第二个元素地址刚好比第一个元素地址多四个。正好一个元素所占空间的大小。并且数组地址每次运行都会发生变化。

5.2.3 案例-五只小猪称体重

示例代码如下:

#include<iostream>
using namespace std;

int main()
{
	//定义五只猪的体重
	int arr[] = { 150,200,350,100,250 };
	//找出体重最重的那只猪
	int max = 0;
	for (int i = 0; i < 5; i++)
	{
		if (max < arr[i])
			max = arr[i];
		else
			max = max;
	}
	cout << "最重的猪为" << max << "斤"<<endl;
	system("pause");
	return 0;
}

5.2.4 一维数组案例-数组元素逆置

示例代码如下: 

#include<iostream>
using namespace std;

int main()
{
	//实现数组元素的逆置
	//1、创建数组
	int arr[] = { 3,5,1,2,4 };
	cout << "逆置前的数组为" << endl;
	for (int i = 0; i < 5; i++)
	{
		cout << arr[i] << endl;
	}
	//2、数组元素的逆置
	int start = 0;  //记录起始下标位置
	int end = sizeof(arr) / sizeof(arr[0])-1;  //记录末尾下标位置
	while (start < end)
	{
		//实现元素互换的代码
		int temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;
		//下标更换
		start++;
		end--;
	}
	//打印逆置后的数组
	cout << "逆置后的数组为" << endl;
	for (int i = 0; i < 5; i++)
	{
		cout << arr[i] << endl;
	}
	system("pause");
	return 0;
}

 注意:末尾下标为数组长度-1

 5.2.5 冒泡排序

 示例代码如下:

#include<iostream>
using namespace std;

int main()
{
	//利用冒泡排序实现数组的升序排列
	//创建数组
	int arr[] = {7,2,1,6,8,9,3,5};
	//开始冒泡排序
	//总共排序论述为 元素个数-1
	for (int i = 0; i < 8 - 1; i++)
	{
		//内层循环对比 次数=元素个数-当前轮数-1
		for (int j = 0; j < 8 - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}

	}
	//打印排序后的序列
	for (int k = 0; k < 8 ; k++)
	{
		cout << arr[k] << endl;
	}
	system("pause");
	return 0;
}

5.3 二维数组

5.3.1 二维数组定义方式

二维数组定义的四种方式:

1.数据类型 数据名[行数][列数];

2.数据类型 数组名[行数][列数]={{数据1,数据2},{数据3,数据4}};

3.数据类型 数组名[行数][列数]={数据1,数据2,数据3,数据4};

4.数据类型 数组名[  ][列数]={数据1,数据2,数据3,数据4};

建议:第二种定义方式更加直观,提高了代码的可读性。

示例代码如下(以第二种定义方法为例,其他同理):

include<iostream>
using namespace std;

int main()
{
	//二维数组定义
	//2、数据类型 数组名[行数][列数]={{数据1,数据2},{数据3,数据4}};
	int arr1[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << arr1[i][j] << " ";
		}
		cout << endl;
	}

	system("pause");
	return 0;
}

5.3.2 二维数组数组名

作用:查看二维数组所占的内存空间;

获取二维数组首地址;

示例代码如下:

#include<iostream>
using namespace std;

int main()
{
	//二维数组名的用途
	int arr1[2][3] = { {1,2,3} ,{4,5,6} };
	//作用1:查看二维数组所占的内存空间;
	cout << "二维数组所占内存空间的大小:" << sizeof(arr1) << endl;
	cout << "二维数组第0行所占内存空间大小:" << sizeof(arr1[0]) << endl;
	cout << "二维数组第0行第0列所占内存空间大小:" << sizeof(arr1[0][0]) << endl;
	cout << "求二维数组的行数:" << sizeof(arr1)/ sizeof(arr1[0])<< endl;  //利用整个二维数组的内存空间/二维数组一行的内存空间
	cout << "求二维数组的列数:" << sizeof(arr1[0]) / sizeof(arr1[0][0]) << endl;  //利用二维数组一行的内存空间/整个二维数组的一个元素的内存空间
	//作用2:获取二维数组首地址;
	cout << "二维数组所在地址的16进制:" << arr1 << endl;
	cout << "二维数组所在地址的16进制强制转化为10进制:" << (int)arr1 << endl;
	system("pause");
	return 0;
}

5.3.3 二维数组案例-考试成绩统计

要求:利用二维数组统计下列成绩

 示例代码如下:

#include<iostream>
using namespace std;

int main()
{
	int arr1[3][4] =     //二维数组也可以采取这种方式定义更直观
	{
		{100, 100, 100},
		{100, 50, 100},
		{60, 70, 80}
	};
	for (int i = 0; i < 3; i++)
	{
		int sum = 0;  //注意定义变量时的位置,输出在第一层循环,那么定义不能在内部循环中循环
		for (int j = 0; j < 3; j++)
		{
			sum += arr1[i][j];
			cout << arr1[i][j] << " ";
		}
		cout << "第一个人的成绩为:" << sum;
		cout << endl;
	}
	system("pause");
	return 0;
}

6、函数

6.1 概述

作用:将一段经常使用的代码封装起来,减少重复代码

一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。

6.2 函数的定义

函数的定义一般有5个步骤:

1、返回值类型

2、函数名

3、参数表列

4、函数体语句

5、return 表达式

语法:

 示例:

 代码如下:

#include<iostream>
using namespace std;

//函数体的定义
int add(int num1, int num2)
	{
		int sum = num1 + num2;
		return sum;
	}
int main()
{
	system("pause");
	return 0;
}

6.3 函数的调用

功能:定义使用好的函数;

语法:函数名(参数)

示例代码如下:

#include<iostream>
using namespace std;

//函数体的定义
int add(int num1, int num2)
	{
		int sum = num1 + num2;
		return sum;
	}
int main()
{
	int a = 10, b = 2;
	int c = add(a, b);
	cout << "c=" << c << endl;

	int chinese = 90, math = 100;
	int score = add(chinese, math);
	cout << "总成绩为:" << score << endl;
	system("pause");
	return 0;
}

注:num1和num2在定义时,并没有实际的值。因此,它们通常称为形式参数,简称形参。实际参数是下面的a,b以及chinese,math。

6.4 值传递

功能:在函数调用时实参将数值传入形参。

值传递时,如果形参发生改变,并不会影响实参。

示例:利用函数实现两个数的互换。

示例代码如下:

#include<iostream>
using namespace std;
//函数的值传递

//定义函数时,如果函数没有返回值,可以使用void定义。
void swap(int num1, int num2)
	{
	cout << "交换前的数据" << endl;  //定义函数实现两个数的互换;
	cout << "num=" << num1 << endl;
	cout << "num=" << num2 << endl;
	int temp = num1;
	num1 = num2;
	num2 = temp;
	cout << "交换后的数据" << endl;
	cout << "num=" << num1 << endl;
	cout << "num=" << num2 << endl;
	}

int main()
{
	int a = 10, b = 2;
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	 swap(a, b);
	 cout << "a=" << a << endl;
	 cout << "b=" << b << endl;
	
	system("pause");
	return 0;
}

运行结果如下:

解释如下:

程序从main函数开始 首先打印main函数中定义的a,b的值,然后进入到swap函数里面,首先实参ab将自己的值传递给形参num1,num2,中间两个即是函数运行的结果,但是等到swap函数结束,a依然没有交换。这是因此在函数进行值传递的过程中,形参不论如何变化都不会影响实参的值。

6.5 函数的常见样式

常见的函数样式有四种

1、无参无返

2、有参无返

3、无参有返

4、有参有返

示例代码如下:

#include<iostream>
using namespace std;

//函数常见的四种样式
//无参无返
void demo1()
{
	cout << "this is a demo1" << endl;
}
//无参有返
int demo2()
{
	cout << "this is a demo2" << endl;
	return 100;
}
//有参无返
void demo3(int a)
{
	cout << "this is a demo3a="<<a << endl;
}
//有参有返
int demo4(int a)
{
	cout << "this is a demo4a=" << a << endl;
	return a;
}
int main()
{
	//无参无返的调用
	demo1();
	//无参有返的调用
	int num1=demo2();
	cout << num1 << endl;
	//有参无返的调用
	demo3(100);
	//有参有返的调用
	int num2 = demo4(20);
	cout << "a=" << num2 << endl;
	system("pause");
	return 0;
}

输出结果如下:

 6.6 函数的声明

作用:告诉编译器函数名称及如何调用函数,函数的实际主体可以单独定义。

函数的声明可以是多次,但是函数的定义只能有一次

应用过程中,函数体如何在函数调用之后,会报错,因此可以在调用函数前加上函数声明。

示例代码如下:

#include<iostream>
using namespace std;

//函数的声明
//比较两个数字,并返回较大的一个

int max(int a, int b);
int main()
{
	int num1 = 20, num2 = 10;
	int c = max(num1, num2);
	cout << "a与b中大的一位数是" << c << endl;
	system("pause");
	return 0;
}
int max(int a, int b)
{
	return a > b ? a : b;  //三目运算符,如果a>b则返回a,否则返回b
}

6.7 函数的分文件编写

作用:让代码更加清晰

函数的分文件编写一般有四个步骤

1、创建后缀名为.h的头文件;

2、创建后缀名为.cpp的源文件;

3、在头文件中写函数的声明;

4、在源文件中写函数的定义;

示例代码如下:

头文件swap.h

#include<iostream>
using namespace std;


//14、函数分文件编写的头文件
//函数声明
void swap(int a, int b);

函数定义文件swap.cpp

#include"swap.h"

//14、函数分文件编写的函数定义文件
void swap(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
	cout << a << endl;
	cout << b << endl;
}

主函数文件

#include<iostream>
using namespace std;
#include"swap.h"

int main()
{
	int a = 20, b = 10;
	swap(a, b);
	system("pause");
	return 0;
}

运行结果如下:

7、指针

7.1 指针的基本概念

指针的作用:可以通过指针间接访问内存;

内存编号是从0开始记录的,一般用十六进制数字表示;

可以利用指针变量保存地址;

7.2 指针变量的定义和使用

指针变量定义语法:数据类型 *变量名;

示例代码如下:

#include<iostream>
using namespace std;

int main()
{
	int a = 10;
	//定义指针 数据类型 *变量名;
	int *p;
	p = &a;  //建立变量a与指针p的联系。
	
	cout << "a的地址为:" << &a << endl;
	cout << "指针p的值为:" << p << endl;

	//使用指针
	//使用解引用的方法使用指针,即*。
	*p = 1000;
	cout << "*p的值为" <<*p<< endl;
	cout << "a的值为" << a << endl;
	system("pause");
	return 0;
}

7.3 指针的内存空间

在32位操作系统下:指针占用4个字节空间;64位操作系统下,占用8个字节内存空间;

示例代码如下:

#include<iostream>
using namespace std;


int main()
{
	int a = 10;
	int* p;
	p = &a;

	cout << sizeof(int *) << endl;
	cout << sizeof(float*) << endl;
	cout << sizeof(double*) << endl;
	cout << sizeof(char*) << endl;
	system("pause");
	return 0;
}

运行结果如下:

 7.4 空指针和野指针

空指针:指针变量指向内存中编号为0的空间;

用途:初始化指针变量;

注意:空指针指向的内存是不可以访问的;

#include<iostream>
using namespace std;

int main()
{
	//定义空指针
	int* p = NULL;

	//空指针不可以访问
	//因为0-255的内存空间是系统占用的,不能访问
	*p = 100;
	cout << *p << endl;

	system("pause");
	return 0;
}

运行结果如下:

 野指针:指针变量指向非法的内存空间。

#include<iostream>
using namespace std;

int main()
{
	//野指针
	int* p = (int*)0x1100;
	cout << *p << endl;
	system("pause");
	return 0;
}

运行结果如下:

7.5 const修饰指针 

1、常量指针

特点:指针的指向可以修改,但是指针指向的值不可以修改。

eg:

const int *p=&a;

*p=20;  //错误,指针指向的值不可以修改;

p=&b;  //正确,指针指向可以修改;

2、指针常量

特点:指针的指向不可以改,指针指向的值可以改。

eg:

int * const p=&a;

*p=20;  //正确,指针指向的值可以修改;

p=&b;  //错误,指针指向不可以修改;

3、const 既修饰指针又修饰常量

特点:指针的指向和指针指向的值都不可以改。

记忆方式:我们将*称为指针,const称为常量。常量指针先出现const再出现*,所以称为常量指针。

示例代码如下:

#include<iostream>
using namespace std;

int main()
{
	int a =10,b;
	const int *p1 = &a;  //常量指针定义
	//*p1 = 20;  //错误,常量指针指针指向的值不可以修改
	p1 = &b;  //正确,常量指针指针指向可以修改
	
	int* const p2 = &a;  //指针常量定义
	*p2 = 20;  //正确,指针常量指针指向的值可以修改
	//p2 = &b;  //错误,指针常量指针指向不可以修改

	const int* const p3 = &a;  //const即修饰指针又修饰常量
	//*p3 = 20;  //错误,指针指向的值不可以修改
	//p3 = &b;  //错误,指针指向不可以修改
	system("pause");
	return 0;
}

7.6 指针和数组

作用:利用指针访问数组元素。

示例代码如下:

#include<iostream>
using namespace std;

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int *p = arr;  //数组名代表数组的内存地址
	for (int i = 0; i < 10; i++)
	{
		cout << *p << endl;
		p++;
	}
	system("pause");
	return 0;
}

7.7 指针和函数

作用:利用指针作为函数参数,可以修改实参的值。

示例代码如下:

#include<iostream>
using namespace std;

void swap1(int a, int b)  //值传递
{
	int temp1 = a;
	a = b;
	b = temp1;
	cout << a << endl;
	cout << b << endl;
}
void swap2(int *p1, int *p2)  //地址传递
{
	int temp2 = *p1;
	*p1 = *p2;
	*p2 = temp2;
	cout << *p1 << endl;
	cout << *p2 << endl;
}
int main()
{
	int num1 = 10, num2 = 20;
	swap1(num1, num2);
	cout << num1 << endl;  //值传递并不会改变实参的值
	cout << num2 << endl;
	int num3 = 100, num4 = 10;
	swap2(&num3, &num4);
	cout << num3 << endl;  //地址传递可以改变实参的值
	cout << num4 << endl;
	system("pause");
	return 0;
}

运行结果如下:

解释:运行结果中,前两组数据显示的是值传递后的数据,第一个输出的是,函数定义中的输出实现了交换(形式参数),第二个输出的是main函数中的实际参数,并没有发生交换。后两组数据显示的地址传递后的数据, 第三个输出的是函数定义中的输出实现了交换(形式参数),第四个输出的是main函数中的实际参数,发生了交换。

7.8 指针、数组、函数案例

案例描述:封装一个函数,利用冒泡排序,实现对整型数组的升序排列。

#include<iostream>
using namespace std;

void bubblesort(int*arr,int len)  //定义冒泡排序函数,一个参数为数组的首地址(以指针形式),另外一个参数为数组的长度
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
void printArray(int *arr,int len)  //定义输出函数
{
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << endl;
	}
}
int main()
{
	//利用数组进行冒泡排序
	int arr[] = { 3,1,4,6,8,9,5,2,7,0 };  //创建数组
	int len = sizeof(arr) / sizeof(arr[0]);
	bubblesort(arr, len);  //冒泡函数声明
	printArray(arr, len);  //打印函数声明
	system("pause");
	return 0;
}

8、结构体

8.1 结构体基本概念

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。

8.2 结构体定义和使用

语法:struct 结构体名 {结构体成员列表};

通过结构体创建变量的方式有三种:

1、struct 结构体名 变量名

2、struct 结构体名 变量名={成员1值,成员2值...}

3、定义结构体时顺便创建变量

示例代码如下:

#include<iostream>
#include<string>
using namespace std;

//定义student数据类型,包含学生的(姓名、年龄、分数)
//struct 结构体名 {结构体成员列表};
struct student
{
	string name;  //学生姓名
	int age;  //学生年龄
	double score;  //学生考试成绩
}s3;  //第三种创建方法
int main()
{
	//第一种方式:struct 结构体名 变量名
	struct student s1;  //通过结构体创建变量
	s1.name = "张三";  //通过.访问结构体变量中的属性
	s1.age =18;
	s1.score = 97.5;
	cout << "姓名:" << s1.name << " 年龄:" << s1.age << " 考试成绩:" << s1.score<<endl;

	//第二种方式:struct 结构体名 变量名={成员1值,成员2值...}
	struct student s2 = { "李四",19,92.5 };
	cout << "姓名:" << s2.name << " 年龄:" << s2.age << " 考试成绩:" << s2.score << endl;

	//第三种方式:创建结构体时,顺便创建结构体变量s3
	s3.name = "小明";  //通过.访问结构体变量中的属性
	s3.age = 18;
	s3.score = 65;
	cout << "姓名:" << s3.name << " 年龄:" << s3.age << " 考试成绩:" << s3.score << endl;
	system("pause");
	return 0;
}

8.3 结构体数组

作用:将自定义的结构体放入到数组中方便维护。

语法:struct  结构体名  数组名[元素个数]={{},{},{},...{}}

示例代码如下:

#include<iostream>
using namespace std;
#include<string>

//结构体数组
	//1、定义结构体数组
struct student
{
	string name;
	int age;
	double score;
};
int main()
{
	//2、创建结构体数组
	struct student stuArray[3] =
	{
		{"张三",18,90},  //创建结构体数组时顺便赋值
		{"李四",28,80},
		{"小明",68,60}
	};
	//3、为结构体数组元素赋值
	stuArray[1].name = "小红";  //使用结构体数组元素进行赋值
	stuArray[2].age = 20;
	//4、遍历结构体数组
	for (int i = 0; i < 3; i++)
	{
		cout << "第" << i << "个人的姓名为:" << stuArray[i].name << "第" << i << "个人的年龄为:" << stuArray[i].age << "第" << i << "个人的成绩为:" << stuArray[i].score << endl;
	}

	system("pause");
	return 0;
}

8.4 结构体指针

作用:利用指针访问结构体中的元素;

利用操作符->可以通过结构体指针访问结构体属性;

#include<iostream>
using namespace std;
#include<string>
//结构体指针
//1、创建结构体
struct student
{
	string name;
	int age;
	double score;
};
int main()
{

//2、创建结构体变量
	struct student s = { "张三",18,99 };   //struct可以省略
//3、定义指针并指向结构体
	struct student* p = &s;  //struct可以省略
//4、通过指针访问结构体中的元素
	cout << p->name << p->age << p->score;
	system("pause");
	return 0;
}

8.5 结构体嵌套结构体

作用:结构体中的成员可以是另一个结构体;

eg:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体;

示例代码如下:

#include<iostream>
using namespace std;

//结构体嵌套结构体
//每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体;
//定义学生结构体
struct student
{
	string name;
	int age;
	double score;
};
//定义老师结构体
struct teacher
{
	string name;
	int id;
	int age;
	struct student stu;
};
int main()
{
	struct teacher t;
	t.id = 10000;
	t.name = "张三";
	t.age = 57;
	t.stu.name = "李四";
	t.stu.age = 22;
	t.stu.score = 90;
	cout << "老师信息:" << t.id << t.name << t.age << "学生信息" << t.stu.name << t.stu.age << t.stu.score;
	system("pause");
	return 0;
}

8.6 结构体做函数参数

作用:将结构体作为参数向函数传递;

传递方式有两种:

值传递

地址传递

示例代码如下:

#include<iostream>
using namespace std;

//结构体做函数参数
//定义结构体
struct student
{
	string name;
	int age;
	double score;
};

struct student stu;
struct student *p;
//值传递
void printfstudent1(struct student stu)
{
	cout << "子函数输出" << stu.name << stu.age << stu.score<<endl;
}
//地址传递
void printfstudent2(student *p)
{
	cout << "子函数输出2" << p->name << p->age << p->score;

}
int main()
{
	struct student stu;
	stu.name = "张三";
	stu.age = 22;
	stu.score = 86;
	cout << "主函数输出" << stu.name << stu.age << stu.score<<endl;
	printfstudent1(stu);
	printfstudent2(&stu);
	system("pause");
	return 0;
}

8.7 结构体中const的使用场景

作用:用const来防止误操作;

示例代码如下:

#include<iostream>
using namespace std;
//const修饰结构体
struct student
{
	string name;
	int age;
	int score;
};
void printfstudent(  const struct student s)
{
	//s.age = 18; 程序报错,结构体加了const,里面的值不能改变
	cout << s.name << s.age << s.score << endl;
}
int main()
{
	student s;
	s.age = 20;
	s.name = "李华";
	s.score = 90;
	printfstudent(s);
	system("pause");
	return 0;
}

8.8 结构体案例1-学生毕业论文

案例描述:

 实现示例代码如下:

#include<iostream>
using namespace std;
#include<string>


//定义英雄结构体
struct hero
{
	string name;
	int age;
	string sex; //性别

};

void bulllesort(struct hero heroarray[], int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - i - 1; j++)
		{
			//如果j下标的元素的年龄大于j+1元素,则交换
			if (  heroarray[j].age > heroarray[j + 1].age)
			{
				struct hero temp = heroarray[j];
				heroarray[j] = heroarray[j + 1];
				heroarray[j + 1] = temp;
			}
		}
	}
}
//定义打印函数
void printfhero(struct hero heroarray[], int len)
{

	for (int i = 0; i < 5; i++)
		{
			cout << "姓名" << heroarray[i].name << "年龄为" << heroarray[i].age << "性别为" << heroarray[i].sex << endl;
		}
}
int main(){
	//1、创建英雄结构体
	//2、创建数组,存放英雄信息
	struct hero heroarray[5] =
	{
		{"刘备",23,"男"},
		{"关羽",22,"男"},
		{"貂蝉",17,"女"},
		{"张飞",20,"男"},
		{"赵云",18,"男"},
	};
	//int len = sizeof(heroarray) / sizeof(heroarray[0]);  //阶段测试
	//for (int i = 0; i < 5; i++)
	//{
	//	cout << "姓名" << heroarray[i].name << "年龄为" << heroarray[i].age << "性别为" << heroarray[i].sex << endl;
	//}
	//3、对数组进行排序,按照年龄进行升序排序
	int len = sizeof(heroarray) / sizeof(heroarray[0]);
	bulllesort(heroarray, len);
	//4、输出,将排序后结果打印
	printfhero(heroarray, len);

	system("pause");
	return 0;
}

运行结果如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值