第一个C++程序

#include <iostream>
using namespace std;
int main()//main是一个程序的入口 每个程序都必须有 有且仅有一个
{
   cout<<"hello world"<<endl;
   system("pause");//暂停
}

基本概念

注释

单行注释 //

多行注释 /* */

变量

作用:给一段指定的内存空间起名,方便操作这段内存

语法:数据类型 变量名 = 初始值

C++在创建变量时,必须给变量一个初始值,否则会报错

在这里插入图片描述

#include <iostream>
using namespace std;
int main()
{
	int a = 10;
	cout<<"a="<<a<<endl;//10
 	system("pause");
	return 0; //每一个c++需要一个返回值 return 0
}

常量

作用:用于记录程序中不可更改的数据

  1. #define 宏常量:#define 常量名 常量值

    1. 通常定义在文件上方
  2. const修饰的变量 const 数据类型 常量名=常量值

    1. 通常在变量定义前加上关键字const,修饰该变量为常量,不可修改
//1、宏常量
#define Day 7
int main(){
	//Day=14;//错误 Day是常量 不可修改
	cout<<"一天总共有:"<<Day<<"天"<<endl;

	//2.const修饰变量
	const int month = 12;
	//month = 24; //报错,常量是不可以修改的
	return 0;
}

关键字

  1. 系统征用 C++中预先保留的单词(标识符)
  2. 在定义变量和常量时,不用关键字给变量或者常量起名称

在这里插入图片描述

标识符

  1. 标识符不能是关键字
  2. 标识符只能由字母、数字、下划线组成
  3. 第一个字符必须是字符或下划线
  4. 标识符中字母区分大小写

在这里插入图片描述

数据类型

C++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存

整型

在这里插入图片描述

sizeof关键字

作用:利用sizeof关键字可以统计数据类型所占内存大小

语法:sizeof(数据类型/变量)

short < int <= long <= long long

在这里插入图片描述

实型(浮点型)

作用:用于表示小数

在这里插入图片描述

int main(){
	float f1 = 3.14f;
	double d1 = 3.14;
	cout << f1 << endl;
	cout << d1 << endl;
	cout << "float sizeof=" << sizeof(f1) << endl;//4
	cout << "double sizeof=" << sizeof(d1) << endl;//8

	//科学计数法
	float f2 = 3e2;//3 * 10 ^ 2
	float f3 = 3e-2;//3 * 0.1 ^ 2
	return 0;
}

字符型

作用:字符型变量用于显示单个字符

语法:char ch = 'a';

  • 字符型变量只占用1个字符
  • 字符型变量不是把字符本身放到内存中,而是将ASCII编码放入到存储单元中
int main(){
	char ch = 'a';
	cout << ch << endl; // a
	cout << sizeof(char) << endl; //1

	//ch = "a";//错误,不可以使用双引号
	//ch = 'abcd';//单引号只能引用一个字符

	cout<<(int)ch<<endl;//查看字符a对应的ASCII码 97
	return 0;
}

转移字符

作用:表示不能显示出来的ASCII字符

\n 换行

\\ 反斜杠

\t 制表位

字符串型

作用:用于表示一串字符

char [] = "字符串值"

string 变量名 = "字符串值"

在这里插入图片描述

布尔类型bool

作用:布尔数据类型代表真或假的值

bool类型只有两个值,占用一个字节

  • true 真 1
  • false 假 0

数据的输入

作用:用于从键盘获取数据

cin >> 变量

int main(){

	//整型输入
	int a = 0;
	cout << "请输入整型变量:" << endl;
	cin >> a;
	cout << a << endl;

	//浮点型输入
	double d = 0;
	cout << "请输入浮点型变量:" << endl;
	cin >> d;
	cout << d << endl;

	//字符型输入
	char ch = 0;
	cout << "请输入字符型变量:" << endl;
	cin >> ch;
	cout << ch << endl;

	//字符串型输入
	string str;
	cout << "请输入字符串型变量:" << endl;
	cin >> str;
	cout << str << endl;

	//布尔类型输入
	bool flag = true;
	cout << "请输入布尔型变量:" << endl;
	cin >> flag;
	cout << flag << endl;
	system("pause");
	return EXIT_SUCCESS;
}

运算符

  • 在除法运算中,除数不能为0
  • 整数相除 = 整数
  • 只有整型变量可以进行取模运算

在这里插入图片描述

  • 前置递增 先让变量+1 然后进行表达式运算
  • 后置递增 先进行表达式运算 然后让变量+1
//加减乘除
int main() {

	int a1 = 10;
	int b1 = 3;

	cout << a1 + b1 << endl;
	cout << a1 - b1 << endl;
	cout << a1 * b1 << endl;
	cout << a1 / b1 << endl;  //两个整数相除结果依然是整数

	int a2 = 10;
	int b2 = 20;
	cout << a2 / b2 << endl; 

	int a3 = 10;
	int b3 = 0;
	//cout << a3 / b3 << endl; //报错,除数不可以为0


	//两个小数可以相除
	double d1 = 0.5;
	double d2 = 0.25;
	cout << d1 / d2 << endl;

	system("pause");

	return 0;
}

赋值运算符

作用:用于将表达式的赋值给变量

在这里插入图片描述

int main() {

	//赋值运算符

	// =
	int a = 10;
	a = 100;
	cout << "a = " << a << endl;

	// +=
	a = 10;
	a += 2; // a = a + 2;
	cout << "a = " << a << endl;

	// -=
	a = 10;
	a -= 2; // a = a - 2
	cout << "a = " << a << endl;

	// *=
	a = 10;
	a *= 2; // a = a * 2
	cout << "a = " << a << endl;

	// /=
	a = 10;
	a /= 2;  // a = a / 2;
	cout << "a = " << a << endl;

	// %=
	a = 10;
	a %= 2;  // a = a % 2;
	cout << "a = " << a << endl;

	system("pause");

	return 0;
}

比较运算符

作用:用于表达式的比较,并返回一个真值或假值

在这里插入图片描述

int main() {

	//赋值运算符

	// =
	int a = 10;
	a = 100;
	cout << "a = " << a << endl;

	// +=
	a = 10;
	a += 2; // a = a + 2;
	cout << "a = " << a << endl;

	// -=
	a = 10;
	a -= 2; // a = a - 2
	cout << "a = " << a << endl;

	// *=
	a = 10;
	a *= 2; // a = a * 2
	cout << "a = " << a << endl;

	// /=
	a = 10;
	a /= 2;  // a = a / 2;
	cout << "a = " << a << endl;

	// %=
	a = 10;
	a %= 2;  // a = a % 2;
	cout << "a = " << a << endl;

	system("pause");

	return 0;
}

逻辑运算符

作用:用于根据表达式的值返回真值或假值

在这里插入图片描述

程序流程结构

选择结构

依据条件是否满足,有选择地执行相应功能

if语句
int main() {

	//选择结构-单行if语句
	//输入一个分数,如果分数大于600分,视为考上一本大学,并在屏幕上打印

	int score = 0;
	cout << "请输入一个分数:" << endl;
	cin >> score;

	cout << "您输入的分数为: " << score << endl;

	//if语句
	//注意事项,在if判断语句后面,不要加分号
	if (score > 600)
	{
		cout << "我考上了一本大学!!!" << endl;
	}

	system("pause");

	return 0;
}
三目运算符

作用:实现简单的判断

表达式1? 表达式2:表达式3

如果表达式1真,执行表达式2,并返回表达式2的结果

如果表达式1假,执行表达式3,并返回表达式3的结果

int main() {

	int a = 10;
	int b = 20;
	int c = 0;

	c = a > b ? a : b;
	cout << "c = " << c << endl;

	//C++中三目运算符返回的是变量,可以继续赋值

	(a > b ? a : b) = 100;

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;

	system("pause");

	return 0;
}

switch语句

执行多条件分支语句

case中没有break,程序会一直执行下去

在这里插入图片描述

if和switch的区别?

switch的缺点:判断只能是整型或者字符型,不可判断区间

switch的优点:结构清晰,执行效率高

循环结构

while循环语句

只要循环条件的结果为真,就执行循环语句

在这里插入图片描述

do…while循环语句

区别:do…while会先执行一次循环语句,在判断循环条件

在这里插入图片描述

水仙花数

水仙花数是指一个3位数,它的每个位上的数字的3次幂之和等于它本身

在这里插入图片描述

int main(){
	int num = 100;
	do {
		//找水仙花数
		int a = 0; //个位
		int b = 0; //十位
		int c = 0; //百位
		a = num % 10;//获取数字的个位
		b = num / 10 % 10;//获取数字十位
		c = num / 100;//获取数字百位
		//如果是水仙花数,打印输出
		if(a*a*a + b*b*b + c*c*c = num){
			cout<<num<<endl;
		}
		num++;
	}while(num<1000);
}
for循环语句

作用:满足循环条件,执行循环语句

在这里插入图片描述

乘法口诀
#include<iostream>
using namespace std;
int main(void)
{
    for (int i = 1; i < 10; i++)
    {		
        for (int j = 1; j <= i; j++)	
        {		
            cout << j <<"*"<< i<<"="<< i* j<<" ";	
        }	
        cout << endl;
    }
    system("pause");
    return 0;
}

嵌套循环

在这里插入图片描述

跳转语句

return语句

return 用于从函数中返回值并结束函数的执行。当程序执行到 return 语句时,函数将立即返回,并且可以选择性地返回一个值给调用者。

int square(int x) {
    return x * x; // 返回 x 的平方并结束函数
}

当你在一个 for 循环中使用 return 关键字时,它会结束整个函数的执行,而不仅仅是结束当前的循环。

return 语句会立即终止函数的执行,并将指定的值返回给调用者。

void someFunction() {
    for (int i = 0; i < 10; ++i) {
        if (i == 5) {
            return; // 结束函数的执行
        }
        std::cout << i << " ";
    }
    std::cout << "This will not be printed." << std::endl;
}

int main() {
    someFunction(); // 调用函数
    std::cout << "Function execution finished." << std::endl;
    return 0;
}

当 i 的值等于 5 时,return 语句被执行,导致 someFunction() 函数立即结束执行。
因此,for 循环和后续的语句都不会被执行,而 main() 函数中的代码会继续执行。
break语句

作用:用于跳出选择结构或者循环结构

  • 出现在switch条件语句中,作用是终止case并跳出switch
  • 出现在循环语句中,作用是跳出当前的循环语句
  • 出现在嵌套循环中,跳出最近的内层循环语句

在这里插入图片描述

continue语句

作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环

区别:continue并没有使得整个循环终止,break会跳出循环

在这里插入图片描述
在这里插入图片描述

数组

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

  • 数组中的每个数据元素都是相同的数据类型
  • 数组是由连续的内存位置组成的 => 放在同一块连续的内存空间中

在这里插入图片描述

一维数组

定义
  1. 数据类型 数组名 [数组长度];
  2. 数据类型 数组名 [数组长度] = {值1, 值2…};
  3. 数据类型 数组名 [] = {值1, 值2…};
# include<iostream>
using namespace std;
int main(){
    //数据类型 数组名 [数组长度]
    int arr[5];
    //给数组元素赋值
    arr[0] = 10 ;
    arr[1] = 9 ;
    arr[2] = 8 ;
    arr[3] = 7 ;
    arr[4] = 6 ;
    //访问数组元素
    cout<<arr[0]<<endl;

    //数据类型 数组名 [数组长度] = {值1, 值2....}
    //如果在初始化时,没有全部填写完,会用0进行填写
    int arr2[5] = {10,20,30,40,50};
    for(int i = 0 ; i < 5 ; i++){
        cout<<arr2[i]<<endl;
    }

    // 数据类型 数组名 [] = {值1, 值2....}
    //定义数组的时候,必须有初始的长度
    int arr3 [] = {10,20,30,40,60,56,22};
     for(int i = 0 ; i < 8 ; i++){
        cout<<arr3[i]<<endl;
    }
    system("pause");
}

在这里插入图片描述

    // 可以通过数组名统计整个数组占用内存大小
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    cout<<"整个数组占用内存空间为:"<<sizeof(arr)<<endl;//40 int 4个字符
    cout<<"每个元素占用内存空间为:"<<sizeof(arr[0])<<endl;// 4 
    cout<<"数组中元素个数为:"<<sizeof(arr)/sizeof(arr[0])<<endl;//10
  
    // 可以通过数组名查看数组首地址
    cout<<"数组首地址为:"<<arr<<endl;//16进制
    cout<<"数组首地址为:"<<int(arr)<<endl;//10进制

   //数组名是一个常量,不可进行赋值操作
数组逆置
#include<iostream>
using namespace std;
int main(void)
{ 
    int temp = 0;
    nt nums[5] = { 1,2,3,4,5};
    int start = 0;
    int end = sizeof(nums)/sizeof(nums[0]) -1 ;
    while (start < end)
    {	
        temp = nums[start];	
        nums[start] = nums[end];	
        nums[end] = temp;	
        end--;	
        start++;
    }
    for (int i = 0; i < 5; i++)
    {	
        cout << nums[i];
    }
    return 0;
}

冒泡排序

在这里插入图片描述

#include<iostream>
using namespace std;
int main(){
    /*
        1.比较相邻的元素。如果第一个比第二个大,就交换;
        2.对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值;
        3.重复以上步骤,每次比较的次数-1
    */

   int arr[9] = {4,2,8,0,5,7,1,3,9};
//    总共排序轮数为:元素个数-1
    for(int i = 0;i < 9;i++){
        //内层循环对比 次数=元素个数-当前轮数-1
        for(int j = 0;j<9-i-1;j++){
            //如果第一个数字大于第二个数字,交换两个数字
            if(arr[j]>arr[j+1]){
                int temp = arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
    for(int i;i<9;i++){
        cout<<arr[i]<<" ";
    }
}

二维数组

二维数组就是在一维数组的基础上多加一个维度,就是在一维数组里面存储一维数组

  • 数据类型 数组名[行][列];

在这里插入图片描述

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

在这里插入图片描述

  • 数据类型 数组名[行][列] = {数据1,数据2,数据3,数据4};
  • 数据类型 数组名[][列] = {数据1,数据2,数据3,数据4};
#include<iostream>
using namespace std;
int main(void)
{
    int score[3][3] = { {60,50,40},{10,20,30},{70,80,90} };
    //嵌套循环解决
    //外层行数,内层列数
    for (int i = 0; i < 3; i++)
    {	
        int temp = 0;
        for (int j = 0; j < 3; j++)
        {	
            temp += score[i][j];	
        }
        cout << temp << endl;
    }
}

  • 二维数组大小:sizeof(arr)
  • 二维数组第一行大小:sizeof(arr[0])
  • 二维数组元素大小:sizeof(arr[0][0])
  • 二维数组行数:sizeof(arr) / sizeof(arr[0])
  • 二维数组列数:sizeof(arr[0]) / sizeof(arr[0][0])
  • 二维数组首地址:arr
  • 二维数组第一行地址:arr[0]
  • 二维数组第二行地址:arr[1]
  • 二维数组第一个元素地址:&arr[0][0]
  • 二维数组第二个元素地址:&arr[0][1]

函数

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

函数的定义

  • 返回值类型:一个函数可以返回一个值,在函数中定义
  • 函数名 :给函数起个名称
  • 参数列表:使用该函数时,传入的数据
  • 函数体语句:{}内的代码,函数内需要执行的语句
  • return表达式:和返回值挂钩,函数执行完成后,返回相应的数据

语法:

返回值类型 函数名(参数列表)
{  
	函数语句;  
	return 表达式;
}

在这里插入图片描述

函数的调用

功能: 使用定义好的函数

语法:函数名(参数)

在这里插入图片描述

值传递

  • 就是函数调用时将参数值传给形参
  • 值传递时,如果形参发生变化,并不会影响到实参
  • void不需要返回值

在这里插入图片描述

函数的常见样式

  • 无参无返
void test01(){
  cout<<"test01"<<endl;
}

//函数调用
test01();//test01
  • 有参无返
void test02(int a){
  cout<<"test02,a="<<endl;
}

//函数调用
test02(2);//test02,a=2
  • 无参有返
int test03(){
  cout<<"test03"<<endl;
  return 1000;
}

//函数调用
int num1 = test03();// test03 1000
  • 有参有返
int test04(int a){
  cout<<"test04"<<endl;
  return a;
}
//函数调用
int num2 = test04(10);// test04 10

函数的声明

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

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

//声明:提前告诉编译器函数的存在,可以利用函数的声明
int max(int a,int b);

int main(){
    int a = 10;
    int b = 4;
    cout<<max(a,b)<<endl;
}
//定义 代码是一行一行调试
int max(int a ,int b)
{
    return a+b;
}

函数的分文件编写

作用: 让代码结构更加清晰

函数分文件编写4个步骤:

  • 创建后缀名.h的头文件
  • 创建后缀名为.cpp的源文件
  • 在头文件中写函数的声明
  • 在源文件中写函数的定义
//swap.h文件
#include<iostream>
using namespace std;

//实现两个数字交换的函数声明
void swap(int a, int b);

//swap.cpp文件
#include "swap.h"
void swap(int a,int b){
   int temp = a;
   a = b;
   b = temp;
   cout<<"a="<<a<<endl;
   cout<<"b="<<b<<endl;
}

指针

概念

指针的作用: 可以通过指针间接访问内存。指针就是地址

  • 内存编号是从0开始记录的,一般用16进制数字标识。
  • 可以利用指针变量保存地址。

指针变量的定义和使用

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

int a = 10;
int * p ;
//让指针记录变量a的地址
p = &a;
cout<<"a的地址:"<<&a<<endl;//00FFA5C
cout<<"指针p:"<<p<<endl;//00FFA5C

//使用指针
//可以通过解引用(指针前面加*)方式来找到指针指向的内存数据
*p = 1000;
cout<<"a:"<<a<<endl;//1000

指针所占内存空间

在32位操作系统下无论是什么类型的指针,都占4个字节的内存空间

64位 -> 8个字节

空指针

空指针: 指针变量指向内存中编号为0的空间(内存条每一条都有编号,0-255之间的内存编号是系统占用的,不可以访问

用途: 初始化指针变量

注意: 空指针指向的内存空间是不可以访问的 int* p = NULL;

野指针

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

//指针变量p指向内存地址编号为0x1100的空间
int * p = (int *)0x1100;
//访问野指针报错
cout<<*p<<endl;

const修饰指针

const修饰指针有3种情况

  • const修饰指针 —> 常量指针
//常量指针:指针的指向可以修改,指针指向的值不可以修改
const int * p = &a;
//指针指向可以修改
p= &b;
//报错,指针指向的值不可以修改
*p=20;
  • const修饰常量 —> 指针常量
// 指针常量:指针的指向不可以改,指针指向的值可以改
// const p 常量
int * const p = &a;
*p = 100;//正确
p = &b; // 错误
  • const既修饰指针,又修饰常量
// 指针的指向和指针指向的值都不可以改变
// const p 常量
// const int* 修饰指针
const int* const p = &a;

指针和数组

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

int main(){
  int arr[] = {1,2,3,4};
  cout<<"第一个元素:"<<arr[0]<<endl;// 1 
  
  //指向数组的指针
  int* p = arr;// arr就是数组首地址
  cout<<"指针访问第一个元素:"<<*p<<endl;// 1 
  p++;//将指针往后移4个字节
  cout<<"指针访问第二个元素:"<<*p<<endl;// 2 

  int * p2 = arr;
  for(int i = 0 ; i < 10; i++){
     //利用指针遍历数组
     cout<<*p2<<endl;
     p++;
  }
return 0;
}

指针和函数

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

地址传递:会改变实参

值传递:不会改变实参

在这里插入图片描述

void swap(int *p1, int *p2 ){
   int temp = *p1;
   *p1 = *p2;
   *p2 = temp;
}
int main(){
  int a = 10;
  int b = 20;
  swap(&a,&b);
  cout<<"a:"<<a<<endl;// 20
  cout<<"b:"<<b<<endl;// 10
return 0;
}

指针、数组、函数

封装一个函数,利用冒泡排序,实现对整型数组的升序排列

#include<iostream>
using namespace std;
// 2.创建函数,实现冒泡
// 参数1 数组的首地址 
// 参数2 数组的长度
void PopSort(int* a,int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len-i - 1; j++)
		{
			int temp = 0;
                        // 如果 j>j+1 交换
			if (a[j] > a[j + 1])
			{
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
}
int main(void)
{
        //1.创建数组
	int arry[5] = { 6,2,4,8,5 };
        // 数组长度 = sizeof(arry)/sizeof(arry[0])
	PopSort(arry, 5);
	for (int i = 0; i < 5; i++)
	{
		cout << arry[i];
	}
	return 0;
}

结构体

概念

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

结构体定义和使用

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

通过结构体创建变量的方式有三种 struct 在创建变量时可以省略

  • struct 结构体名 变量名 struct Student s1
  • struct 结构体名 变量名 = (成员1值,成员2值…) `struct Student s1 = {....}`
  • 定义结构体时顺便创建变量 s3
// 学生的数据类型:姓名 年龄 分数
// 自定义数据类型,一些类型集合组成的一个类型
// 语法 struct 类型名称{成员列表}
// 定义时 struct 不可以省略
struct Student
{ 
	//成员列表
	string name;  
	int age;  
	int score;
}s3;

// 通过学生类型创建具体的学生
int main()
{
   // struct 在创建变量时可以省略
   struct Student s1;// Student s1;
   // 给s1属性赋值,通过.访问结构体变量中的属性
   s1.name = "张三";
   s1.age = 20;
   s1.score = 100;
   cout<<"姓名:"<<s1.name<<"年龄:"<<s1.age<<"分数:"<<s1.score<<endl;

   struct Student s2 = {"李四",19,99};

   s3.name= "王五";
   s3.age = 16;
   s3.score = 98;
   return 0;
}

结构体数组

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

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

struct Student
{ 
	//成员列表
	string name;  
	int age;  
	int score;
};

// 通过学生类型创建具体的学生
int main()
{
  
   struct Student arr[3] = 
  {   
	{"李四",19,99},
	{"李四",19,99},
	{"李四",19,99},
  }
  arr[2].name = "赵六";
  for(int i=0;i<3;i++){
	cout<<"姓名:"<<arr[i].name<<"年龄:"<<arr[i].age<<"分数:"<<arr[i].score<<endl;
  }
}

结构体指针

作用:通过指针访问结构体中的成员

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

struct Student
{ 
	//成员列表
	string name;  
	int age;  
	int score;
};

// 通过学生类型创建具体的学生
int main()
{
  // 创建学生结构体变量
   struct Student stu = {"李四",19,99};
  // 通过指针指向结构体变量
   struct student * p = &stu;
  // 通过指针访问结构体变量中的数据
  // 通过结构体指针 访问结构体的属性 使用 ->
   cout<<"姓名:"<<p->name<<"年龄:"<<p->age<<"分数:"<<p->score<<endl;
   return 0;
}

结构体嵌套结构体

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

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

// 学生的数据类型:姓名 年龄 分数
struct Student
{ 
	//成员列表
	string name;  
	int age;  
	int score;
};

// 老师的数据类型:职工编号 姓名 年龄 子结构体学生
struct Teacher
{ 
	//成员列表
	int id;
    string name;  
	int age;  
	struct Student std;//子结构体 学生
};

int main()
{
   Teacher t;
   t.id = 1;
   t.name = "老王";
   t.age = 50;
   t.stu.name = "小王";
   t.stu.age = 20;
   t.stu.score = 60;
}

结构体做函数参数

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

传递方式有两种

  • 值传递-无法改变实参
  • 地址传递-可以改变实参
struct Student
{ 
	//成员列表
	string name;  
	int age;  
	int score;
};

//打印学生信息函数
// 1. 值传递
void printStu1(struct Student s1)
{
   cout<<"姓名:"<<s1.name<<"年龄:"<<s1.age<<"分数:"<<s1.score<<endl;
}

// 1. 地址传递
void printStu2(struct Student *p)
{
   cout<<"姓名:"<<p->name<<"年龄:"<<p->age<<"分数:"<<p->score<<endl;
}

int main()
{
   struct Student stu = {"李四",19,99};
   printStu1(stu);
   printStu2(&stu);
}

结构体中const使用场景

作用:用const来防止误操作

 struct Student
{ 
	//成员列表
	string name;  
	int age;  
	int score;
};

//打印学生信息函数
// 将函数中的形参改为指针,可以减少内存空间 同时不会肤质新的副本出来
void printStu2(const struct Student *p)
{
   // 加了const就无法改变该结构体内的信息
   // p -> age = 150;//报错,表达式必须时可修改的左值
   cout<<"姓名:"<<p->name<<"年龄:"<<p->age<<"分数:"<<p->score<<endl;
}

int main()
{
   struct Student stu = {"李四",19,99};
   printStu2(stu);
}

结构体案例

每个老师带5个学生,一共3名老师

#include<iostream>
#include<string>
#include<ctime> // 包含time()函数的头文件
using namespace std;
struct Student
{
	string name;
	int age;
	int score;
};
struct Teacher
{
	string name;
	struct Student sArry[5];
};
//给老师和学生赋值的函数
void inPutInformation(struct Teacher tArry[], int len)
{
	string Name = "ABCDE";
        //给老师赋值
	for (int i = 0; i < len; i++)
	{
		tArry[i].name = "Teacher_";
		// 将Name字符串中第i个字符追加到tArry[i]的name成员变量后面
		tArry[i].name += Name[i];
		//学生
		for (int j = 0; j < 5; j++)
		{
			tArry[i].sArry[j].name = "Student_";
			tArry[i].sArry[j].name += Name[j];
			// %操作符用于取模,将rand()生成的随机数除以60取余数,使得结果范围在0到59之间
			int random = rand()% 60 +40;//随机值 0-59 + 40
			tArry[i].sArry[j].score = random;
		}
	}
}
//打印所有信息
void printInformation(struct Teacher tArry[],int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << "老师的姓名:" << tArry[i].name << endl;
		for (int j = 0; j < 5; j++)
		{
			cout << "\t学生的姓名:" << tArry[i].sArry[j].name << "考试分数:" << tArry[i].sArry[j].score << endl;
		}
	}
}
int main(void)
{
	// 为了生成真正的随机数序列,需要在使用rand()函数之前调用srand()函数来设置随机种子。
	// time(NULL)函数返回的是当前时间的秒数,类型为time_t
	// unsigned int是C++中的一种无符号整数类型,它可以表示大于等于0的整数值
	srand((unsigned int)time(NULL));
	struct Teacher tArry[3];
	int len = sizeof(tArry) / sizeof(tArry[0]);
	inPutInformation(tArry,len);
	printInformation(tArry,len);
	system("pause");
	return 0;
}

创建5个人并按年龄排序

#include<iostream>
#include<string>
#include<ctime>
using namespace std;
struct Hero
{
	string name;
	int age;
	string categories;
};
int main(void)
{
	struct Hero heroArry[5] =
	{
		{"欣南",20,"火"},
		{"东杉",24,"木"},
		{"北淼",23,"水"},
		{"坤中",18,"土"},
		{"西昭",22,"金"},
	};
	int len = sizeof(heroArry) / sizeof(heroArry[0]);
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - 1 - i; j++)
		{
			Hero temp;
			if (heroArry[j].age > heroArry[j + 1].age)
			{
				temp = heroArry[j];
				heroArry[j] = heroArry[j + 1];
				heroArry[j + 1] = temp;
			}
		}
	}
	for (int i = 0; i <len; i++)
	{ 
		cout << heroArry[i].name << heroArry[i].age << heroArry[i].categories << endl;
	}
	system("pause");
	return 0;
}

通讯录

#include<iostream>
#include<string>
#include<cstdlib>
#define MAX 1000
using namespace std;
struct Person
{
	string name;
	int age;
	string sex;
	string phone;
	string addr;
};
struct addreassbooks
{
	// 在 addreassbooks 结构体中定义了一个名为 personarry 的数组。这个数组的元素类型是 Person 结构体,其大小为 MAX
	struct Person personarry[MAX];
	int m_Size;
};
void mainMenu()
{
	cout << "--------------------" << endl;
	cout<<"1.增加联系人" << endl;
	cout<<"2.显示联系人" << endl;
	cout<<"3.删除联系人" << endl;
	cout<<"4.查找联系人" << endl;
	cout<<"5.修改联系人" << endl;
	cout<<"6.清空联系人" << endl;
	cout<<"0.退出通讯录" << endl;
	cout << "--------------------" << endl;
}
void addPerson(addreassbooks* abs)
{
	// abs->m_Size 是指向 addreassbooks 结构体的指针 abs 的成员变量 m_Size。 m_Size 表示通讯录中当前联系人的个数,它的值会随着联系人的添加和删除而变化。
	if (abs->m_Size == MAX)
	{
		cout << "联系人已满,无法添加" << endl;
		return;
	}
	string name;
	cout << "请输入姓名" << endl;
	cin >> name;
	// abs 是指向 addreassbooks 结构体的指针
	// abs->m_Size 是当前通讯录中已存在联系人的个数
	// abs->personarry 是 addreassbooks 结构体中的联系人数组
	// abs->personarry[abs->m_Size] 表示通讯录中空闲的位置,即新联系人应该插入的位置
	// .name 是联系人结构体 Person 中的姓名字段
	abs->personarry[abs->m_Size].name = name;
	string sex;
	cout << "请输入性别" << endl;
	cin >> sex;
	abs->personarry[abs->m_Size].sex = sex;
	int age;
	cout << "请输入年龄" << endl;
	cin >> age;
	abs->personarry[abs->m_Size].age = age;
	string phone;
	cout << "请输入电话" << endl;
	cin >> phone;
	abs->personarry[abs->m_Size].phone = phone;
	string addr;
	cout << "请输入地址" << endl;
	cin >> addr;
	abs->personarry[abs->m_Size].addr = addr;
	//更新通讯录人数
	abs->m_Size++;
	cout << "添加成功" << endl;
	system("pause");
	system("cls");
}
void printPerson(addreassbooks* abs)
{
	if (abs->m_Size == 0)
	{
		cout << "当前记录为空" << endl;
	}
	else
	{
		for (int i = 0; i < abs->m_Size; i++)
		{
			cout << "姓名\t" << abs->personarry[i].name << endl;
			cout << "性别\t" << abs->personarry[i].sex << endl;
			cout << "年龄\t" << abs->personarry[i].age << endl;
			cout << "电话\t" << abs->personarry[i].phone << endl;
			cout << "地址\t" << abs->personarry[i].addr << endl;
			cout << "\n";
		}
	}
	system("pause");
	system("cls");
}
int checkPerson(addreassbooks* abs, string name)
{
	for (int i = 0; i < abs->m_Size; i++)
	{
		if (abs->personarry[i].name == name)
		{
			return i;
		}
	}
	return -1;
}
void deletePerson(addreassbooks* abs)
{
	string dname;
	cout << "请输入你要删除的人名" << endl;
	cin >> dname;
	int ret = checkPerson(abs, dname);
	if (ret == -1)
	{
		cout << "查无此人" << endl;
	}
	else
	{
		for (int i = ret; i < abs->m_Size; i++)
		{
			abs->personarry[i] = abs->personarry[i + 1];
		 }
		abs->m_Size--;
		cout << "删除成功" << endl;
	}
	system("pause");
	system("cls");
}
void findPerson(addreassbooks* abs)
{
	string fname;
	cout << "请输入要查找的联系人姓名" << endl;
	cin >> fname;
	int result = checkPerson(abs, fname);
	if (result == -1)
	{
		cout << "查无此人" << endl;
	}
	else
	{
		cout << "姓名\t" << abs->personarry[result].name << endl;
		cout << "性别\t" << abs->personarry[result].sex << endl;
		cout << "年龄\t" << abs->personarry[result].age << endl;
		cout << "电话\t" << abs->personarry[result].phone << endl;
		cout << "地址\t" << abs->personarry[result].addr << endl;
	}
	system("pause");
	system("cls");
}
void modifyPerson(addreassbooks* abs)
{
	string mname;
	cout << "请输入要修改的联系人姓名" << endl;
	cin >> mname;
	int result = checkPerson(abs, mname);
	if (result == -1)
	{
		cout << "查无此人" << endl;
	}
	else
	{
		string name;
		cout << "请输入姓名" << endl;
		cin >> name;
		abs->personarry[result].name = name;
		string sex;
		cout << "请输入性别" << endl;
		cin >> sex;
		abs->personarry[result].sex = sex;
		int age;
		cout << "请输入年龄" << endl;
		cin >> age;
		abs->personarry[result].age = age;
		string phone;
		cout << "请输入电话" << endl;
		cin >> phone;
		abs->personarry[result].phone = phone;
		string addr;
		cout << "请输入地址" << endl;
		cin >> addr;
		abs->personarry[result].addr = addr;
		cout << "修改成功" << endl;
	}
	system("pause");
	system("cls");
}
void cleanPerson(addreassbooks*abs)//逻辑清空
{
	abs->m_Size = 0;
	cout << "通讯录清空成功!" << endl;
	system("pause");
	system("cls");
}
int main(void)
{

	//创建通讯录结构体变量
	addreassbooks abs;
	//初始化通讯录中当前人员的个数
	abs.m_Size = 0;

	int select = 0;
	while (1)
	{
		mainMenu();
		cin >> select;
		switch (select)
		{
		case 1://添加联系人
			addPerson(&abs);
			break;
		case 2://显示联系人
			printPerson(&abs);
			break;
		case 3://删除联系人
			deletePerson(&abs);
			break;
		case 4://查找联系人
			findPerson(&abs);
			break;
		case 5://修改联系人
			modifyPerson(&abs);
			break;
		case 6://清空联系人
			cleanPerson(&abs);
			break;
		case 0://退出通讯录
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
		default:
			break;
		}
	}
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐