C++从0开始基础复习

学习目标:

9/07 9/08复习C++基础

学习内容:

C++基础
1、-变量 常量 关键字 标识符
2、-数据类型
3、-运算符
4、-程序流程结构
5、-数组
6、-函数
7、-指针
8、-结构体
9、-基础案例 通讯录管理系统

学习时间:

2020 9/7,9/8,9/9.

学习产出:

技术笔记&CSDN 博客 1 篇

START

1、变量 常量 关键字 标识符

变量 :方便内存管理
常量 : 不可修改的变量
#define修饰 宏常量
const修饰

#include<iostream>
using namespace std;

//宏常量#define以及const修饰的变量(修饰后变量不可被修改)
#define days01 7
int main(){
	//days = 8;(错误,宏常量不可被修改)
	int days02 = 8;
	cout<<"days02="<<days02<<endl;
	const int days03 = 9;
	cout<<"days02="<<days02<<endl;
	//days03 = 19;(错误,const修饰不可被修改)
	system("pause");
	return 0;
}

关键字 &标识符 :c++预先保留的单词
字母、数字以及下划线组成
不能以数字开头
标识符不能是关键字
区分大小写
————————————————————

2、数据类型

c++中创建变量常量时必须声明其数据类型,否则无法分配内存
数据类型意义:给变量分配合理的内存空间

数据类型占用空间取值范围
bool1-2^7 ~2 ^7-1
char1-2^7 ~2 ^7-1
short (短整型)2-2^15 ~2 ^15-1
int(整型)4-2^31 ~2 ^31-1
long (长整型)windows为4字节,Linux(32位)为4字节,64位为8字节-2^31 ~2 ^31-1
long long (长长整型)8-2^63 ~2 ^63-1
float4-2^31 ~2 ^31-1
double8-2^63 ~2 ^63-1

sizeof关键字 :统计数据类型占用内存大小

//size of用法
//short	< int <= long <= long long
cout<<"short占用的内存空间为:"<<sizeof(short);
#include<iostream>
using namespace std;
int main(){
	short a = 1;//-2^15   -2^15-1
	int b = 2;//-2^31   -2^31-1
	long c = 3;//-2^31   -2^31-1
	long long d = 4;//-2^32   -2^32-1
	cout<<"short占用内存空间为"<<sizeof(short)<<endl;//2
	cout<<"int占用内存空间为"<<sizeof(int)<<endl;//4
	cout<<"long占用内存空间为"<<sizeof(long)<<endl;//4
	cout<<"long long占用内存空间为"<<sizeof(long long)<<endl;//8
	
	//输出时自动精确到小数点后5位
	float e = 5.55555555555f;//有效七位
	cout<< e <<"float占用内存空间为"<<sizeof(float)<<endl;//4
	double f = 6.66666666;//有效15~16位
	cout<< f <<"float占用内存空间为"<<sizeof(double)<<endl;//8
	system("pause");
	return 0;
}

字符变量 :并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元

char ch = 'a';
//占用1字节
cout<<"ch占用的内存空间为:"<<sizeof(ch);
//a--97,A--65
cout<<"其对应的ASCII数值为"<<(int)ch<<endl;

转义字符

转义字符含义ASCII码值
\a 警报007
\b 退格008
\n换行010
\r回车010
\t制表符009
\反斜线092

\t 水平制表符 所占的位置为8-已用位置

cout<<"aa\thello"<<endl;
cout<<"aaaa\thello"<<endl;
cout<<"aaaaaa\thello"<<endl;

字符串型:用来表示一串字符
注意:使用string时需要添加头文件
#include< string>

//C语言风格
char str[] = "helloworld";
cout<<str<<endl;
//C++风格
string str2 = "helloworld";
#include<iostream>
#include<string>
using namespace std;
int main(){
	char ch1 = 'a';
	char ch2 = 'A';
	char ch3 = '0';
	char ch4 = '5488';
	//char ch5 = "1"; 必须为单引号
	//char ch6 = 'hdhsjcn';创建字符型变量,单引号内必须只有一个字符
	char ch5[] = "abcfefg";//C语言的写法
	string ch6 = "abcdefg";//C艹的新写法,需要引用<string>头文件
	cout<<"字符型占用"<<sizeof(char)<<"字节"<<endl;
	cout<<"字符型占用"<<sizeof(char)<<"字节"<<endl;
	cout<<ch4<<endl;//8,只显示最后一位
	cout<<ch5<<endl;//abcdefg
	cout<<ch6<<endl;//abcdefg

	//ASCII表中
	cout<<"a对应的ASCII码为"<<int(ch1)<<endl;//97
	cout<<"A对应的ASCII码为"<<int(ch2)<<endl;//65
	cout<<"0对应的ASCII码为"<<int(ch3)<<endl;//48
	cout<<"NULL对应的ASCII码为"<<int(NULL)<<endl;//0

	//转义字符 \a警报	\n换行	\t制表符		\\ 表示\。
	//错误号的第二笔,叫反斜杠
	cout<<"\a"<<endl;
	cout<<"wahaha\n";
	cout<<"aa\tbbb"<<endl;
	cout<<"aaa\tbbb"<<endl;
	cout<<"aaaaaaaa\tbbb"<<endl;//8个+制表符,后面跟8个
	cout<<"aaaaaaaaa\tbbb"<<endl;//9个+制表符,后面跟7个

	system("pause");
	return 0;
}

数据的输入与输出

cin>>
cout<<
	cout<<flag<<endl;//1 (真)

	flag = false;
	cout<<flag<<endl;//0 (假)
	cout<<"布尔类型所占内存空间为:"<<sizeof(bool)<<"字节"<<endl;//1

	int a = 0;
	cout<<"请输入整型变量:"<<a<<endl;
	cin>>a;
	cout<<"a = "<<a<<endl;
	
	float b = 0.0f;
	cout<<"请输入浮点型变量:"<<b<<endl;
	cin>>b;
	cout<<"b = "<<b<<endl;
	
	char c = ' ';
	cout<<"请输入字符型变量:"<<c<<endl;
	cin>>c;
	cout<<"c = "<<c<<endl;
	
	string d = "";
	cout<<"请输入字符串型变量:"<<d<<endl;
	cin>>d;
	cout<<"d = "<<d<<endl;
	
	bool flag = true;
	cout<<"请输入布尔型变量:"<<flag<<endl;
	cin>>flag;
	cout<<"flag = "<<flag<<endl;//只要不是0,都代表1(真)
	
	system("pause");
	return 0;
}

3、运算符
运算符类型作用
算数运算符用于进行四则运算
赋值运算符将表达式值赋值给变量
比较运算符用于表达式的比较,返回一个真值或假值
逻辑运算符根据表达式的值返回真值或假值
3.1算数运算符
算数运算符术语示例结果
+正号
-负号
+
-
*
/10/52
%取模(取余)10%31
++x前置递增a=2,b=++aa=3,b=3
- -x前置递减a=2,b=- -aa=1,b=1
x++后置递增a=2,b=a++a=3,b=2
x- -后置递减a=2,b=a- -a=1,b=2

注意点1、两个整数相处,结果依然是整数,去除掉小数部分

int a = 10,b = 20;
//输出为0
cout<<a/b<<endl;
//输出为2
double a1 = 0.5,b1 = 0.25;
cout<<a/b<<endl;
//输出为2.27273
double a1 = 0.5,b1 = 0.22;
cout<<a/b<<endl;

注意点2、c++中不允许两个小数作取模运算

3.2赋值运算符

赋值运算符(内容略。。。easy)

赋值运算符术语示例结果
=
+=
-+
*=
/=
%=
3.3比较运算符

比较运算符(内容略。。。easy)
注意一点,比较运算符返回的是一个真值或假值就行

比较运算符术语示例结果
=
!=
>
<
>=
<=
3.4逻辑运算符

逻辑运算符(这个需要牢记,黄阿牛本人老忘)

逻辑运算符术语示例结果
&&a,b都为真 则结果为真
IIa,b有一真,则结果为真

——————————————————

4、程序流程结构

最基本的三种程序运行结构:顺序,选择,循环

三只小猪比体重案例
#include<iostream>
using namespace std;

int main(){
	int pig01 = 0;
	int pig02 = 0;
	int pig03 = 0;

	cout<<"请输入第1只小猪的体重"<<endl;
	cin>>pig01;
	cout<<"请输入第2只小猪的体重"<<endl;
	cin>>pig02;
	cout<<"请输入第3只小猪的体重"<<endl;
	cin>>pig03;

	cout<<(pig01>pig02?(pig01>pig03?pig01:pig03):(pig02>pig03?pig02:pig03))<<endl;
	(pig01>pig02?pig01:pig02) = 100;//C艹中,三目运算符返回的是变量,可以再进行赋值
	cout<<pig01<<endl;
	system("pause");
	return 0;
}

注意:C艹中,三目运算符返回的是变量,可以再进行赋值

switch语句
#include<iostream>
using namespace std;

int main(){
	int score = 0;
	cout<<"请输入电影评分 10/7/4"<<endl;
	cin>>score;

	//switch结构清晰,执行效率高,缺点是不可以判断区间
	switch(score){ //switch语句中的这个类型必须是整型或者字符型
	case 10:
		cout<<"高分"<<endl;
		break;
	case 7:
		cout<<"中分"<<endl;
		break;
	case 4:
		cout<<"低分"<<endl;
		break;
	default:
		cout<<"未输入合法输入"<<endl;
	}
	system("pause");
	return 0;
}
switchif  
一般switch执行效率会高于if,思路更清晰,结构有序
缺点是判断只能对 整型 或者 字符型,不可以是区间

循环结构之猜数字案例
#include<iostream>
using namespace std;
#include<ctime>

int main(){
	srand((unsigned int)time(NULL));//添加随机数种子,利用当前时间生成随机数,防止每次随机数都一样
	int num01 = (rand()%100 + 1);//系统随机生成1-100的数字(伪随机数)
	int num02 = 0;//初始化num02
	int times = 0;
	cout<<"请输入猜测的数字\n"<<"您有8次机会"<<endl;
	cin>>num02;//用户对num02赋值

	//开始进行判断
	while(times<8){
	if(num02>num01){
		cout<<"猜大了"<<endl;
		cin>>num02;
		times++;
	}
	else if(num02 < num01){
		cout<<"猜小了"<<endl;
		cin>>num02;
		times++;
	}
	else{
		cout<<"猜对了"<<endl;
		break;
	}
	}
	if(times<9){
		cout<<"win"<<endl;
	}else{
		cout<<"lose"<<endl;
	}
	
	system("pause");
	return 0;
}

注意:只用rand()%100,生成的是伪随机数(每次都一样)
可添加随机数种子,利用系统当前时间生成随机数。

#include<ctime>
srand((unsigned int)time(NULL));
循环结构之水仙花数案例
//水仙花数是指一个三位数,每个位上的三次幂之和等于该数
//求所有三位数中的水仙花数
#include<iostream>
using namespace std;

int main(){
	int GeW = 0,ShiW = 0,BaiW = 0;
	for(int i=100;i<1000;i++){
		GeW = i % 10;
		ShiW = i / 10 % 10;
		BaiW = i / 10 / 10;
		if(i == (GeW*GeW*GeW)+(ShiW*ShiW*ShiW)+(BaiW*BaiW*BaiW)){
			cout<<i<<endl;
		}
	}
	system("pause");
	return 0;
}

循环结构之敲桌子案例

#include<iostream>
using namespace std;
//1-100的数字,是7的倍数,或者个位数是7,再或者十位数是7,打印敲桌子

int main(){
	int a=0,b=0,c=0;
	for(int i=1;i<100;i++){
		if((i%7 == 0)||(i%10 == 7)||(i/10 == 7)){
			cout<<i<<endl;
		}
		
	}
	system("pause");
	return 0;
}
循环结构之嵌套(九九乘法表)案例
#include<iostream>
using namespace std;

int main(){
	for(int i=1;i<10;i++){//控制行数,一共九行
	for(int j=1;j<i+1;j++){//控制行的内容,第一行一个,第二行两个,以此类推
		cout<<j<<"*"<<i<<"="<<i*j<<"\t";
	}cout<<endl;}
	system("pause");
	return 0;
}
break,continue,goto

break:跳出选择结构或循环结构
使用场景
switch语句,循环语句,嵌套循环语句。

continue:跳出本次循环,执行下次循环

goto:无条件跳转语句

goto FLAG
。。。

FLAG:
5、数组

数组:一个集合,存放了相同类型的数据元素
数组中的每个数据元素都是相同的数据类型
数组是由连续的内存位置组成的

数组不能和变量重名,数组下标从0开始
一维数组的三种定义
直接上例子,简单明了:

#include<iostream>
using namespace std;

int main(){
	int arr01[] = {1,2,3,4,5,6};//第一种

	int arr02[6] = {0};//第二种
	int i = 0;
	arr02[0] = 1;
	arr02[1] = 2;
	arr02[2] = 3;
	arr02[3] = 4;
	arr02[4] = 5;
	arr02[5] = 6; 

	int arr03[6] = {1,2,3,4,5,6};//第三种

	for(i=0;i<6;i++){
		cout<<arr03[i]<<endl;}
	cout<<sizeof(arr01)<<endl;//通过数组名可以获取数组占用总空间大小,进而可以获取数组个数
	cout<<sizeof(arr01[1])<<endl;
	cout<<int(arr03)<<endl;//数值为x  可通过数组名来获取数组首地址
	cout<<int(&arr03[0])<<endl;//数值与x相同

	//arr03 = 100   错误,数组是常量,不可以被赋值
	system("pause");
	return 0;
}

之前是三只小猪比大小(a,b,c简答比大小)
这次是五只比大小(求数组中最大值)

五只小猪比大小案例
#include<iostream>
using namespace std;

int main(){
	int arr[5] = {6,4,2,9,9};
	int max = 0;
	for(int i=0;i<(sizeof(arr)/sizeof(arr[0]));i++){//用max和数组中的所有元素比
		if (arr[i]>max){
			max = arr[i];
		}}
	cout<<max<<endl;
	system("pause");
	return 0;
}

下面是数组逆置案例
(和五只小猪案例一起发是为冒泡算法打基础)

数组逆置案例
#include<iostream>
using namespace std;

int main(){
	int arr[5] = {6,4,2,9,9};
	int temp = 0;
	int i = 0;
	int end = sizeof(arr)/sizeof(arr[0])-1;
	for(int i=0;i<sizeof(arr)/sizeof(arr[0])/2;i++){
		temp = arr[i];
		arr[i] = arr[end];
		arr[end] = temp;
		end--;
	}
	for(int j = 0;j<sizeof(arr)/sizeof(arr[0]);j++){
		cout<<arr[j]<<endl;}
	
	system("pause");
	return 0;
}

冒泡排序算法 (一种比较实用,相对于其他算法比较简单的算法(滑稽脸))

冒泡排序算法案例
#include<iostream>
using namespace std;

int main(){
	int arr[9] = {2,4,0,5,7,1,3,8,0};
	int temp = 0;
	//冒泡排序(升序)
	for(int i=0;i<8;i++){
	for(int j=0;j<8-i;j++){
	if (arr[j] > arr[j+1]){
		temp = arr[j];
		arr[j] = arr[j+1];
		arr[j+1] = temp;
	}else{
		continue;
	}
	}
	}

	for(int k=0;k<9;k++){
		cout<<arr[k]<<endl;
	}
	system("pause");
	return 0;
}
二维数组
二维数组之四种定义方式
#include<iostream>
using namespace std;

int main(){
	//第一种
	int arr01[2][3];
	arr01[0][0] = 1;
	arr01[0][1] = 2;
	arr01[0][2] = 3;
	arr01[1][0] = 4;
	arr01[1][1] = 5;
	arr01[1][2] = 6;

	//第二种
	int arr02[2][3] = {
		{1,2,3},
		{4,5,6}
	};

	//第三种
	int arr03[2][3] = {1,2,3,4,5,6};

	//第四种
	int arr04[][3] = {1,2,3,4,5,6};

	for(int i = 0;i<2;i++){
		for(int j=0;j<3;j++){
			cout<<arr01[i][j]<<endl;
		}
	}
	system("pause");
	return 0;
}
二维数组之数组名
#include<iostream>
using namespace std;

int main(){
	int arr[2][3] = {
		{1,3,5},
		{2,4,6}
	};
	//二维数组名作用1,查看地址
	cout<<arr<<endl; //数组名地址
	cout<<arr[0]<<endl;//数组第一行地址
	cout<<&arr[0][0]<<endl;	//数组第一个元素地址

	二维数组名作用1,查看数组占用内存空间大小
	cout<<sizeof(arr)<<endl;
	cout<<sizeof(arr[0])<<endl;
	cout<<sizeof(arr[0][0])<<endl;
	cout<<"二维数组行数"<<sizeof(arr)/sizeof(arr[0])<<endl;
	cout<<"二维数组列数"<<sizeof(arr[0])/sizeof(arr[0][0])<<endl;
	system("pause");
	return 0;
}

二维数组之考试案例

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

int main(){
	string names[3] = {"张三","李四","王五"};
	int achievement[3][3] = {
		{100,100,100},
		{90,50,100},
		{60,70,80}
	};
	int score  = 0;
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			score += 0 + achievement[i][j];
		}
		cout<<names[i]<<"同学的总分为"<<score<<endl;
		score = 0;
	}
	system("pause");
	return 0;
}
6、函数

函数:将一段经常使用的代码封装起来,减少重复代码
一个较大的程序,一般分为若干程序块,每个模块实现特定的功能。

6.1函数的定义

返回值类型 函数名(形参)
{
函数体
返回值
}

6.2 值传递

做值传递的时候,函数的形参发生改变,并不会改变实参

6.3 函数的常见样式
1.无参无返
void test01(){
	cout<<"这是test01"<<endl;
}
2.有参无返
void test02(int a){
	cout<<"这是test02"<<endl;
}
3.无参有返
int test03(){
	cout<<"这是test03"<<endl;
	return 1000;
}
4.有参有返
int test04(int a){
	cout<<"这是test04"<<endl;
	return 500;
}
6.4 函数的声明

函数可以声明多次,但函数只能定义一次
例如

int max(int a,int b);
6.5 函数的分文件编写

step 1 创建后缀名为.h的头文件
step 2 创建后缀名为.cpp的源文件
step 3 在头文件中写函数的声明
step 4 在源文件中写函数的定义

//头文件(.h)
#include<iostream>
using namespace std;

void swap01(int a,int b);
//源文件(.cpp)
#include<iostream>
using namespace std;
#include"swap.h"

int main(){
	int a = 10,b = 20;
	swap01(a,b);
	system("pause");
	return 0;
}
7、指针

指针记录着内存地址

数据类型 * 指针变量名
int * p

#include<iostream>
using namespace std;

int main(){
	int a = 10;
	int *p;
	p = &a;//6,7行可统一写成 int *p = &a;
	*p = 1000;

	cout<<*p<<endl<<a<<endl;//*p  解引用
	cout<<&a<<endl<<p<<endl;
	cout<<sizeof(int*)<<endl;//4字节

	int *w = NULL;//空指针不可进行访问,0-255之间的内存编号是系统占用的,不可访问
	//int *e = (int *)0x666;  野指针
	system("pause");
	return 0;
}
//在32位系统中,指针占4个字节,64位中8字节

在32位系统中,指针占4个字节(无论是什么类型的指针),64位中8字节

7.1空指针:指针变量指向内存空间为0的内存为空指针,

空指针指向的内存是不可访问的

	 int * p = NULL;
7.2 野指针:指针变量指向非法地址
7.3 const修饰指针

1.const修饰指针 常量指针
2.const修饰常量 指针常量
3.const既修饰指针,又修饰常量

#include<iostream>
using namespace std;

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

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

	const int * const p3 = &a;//const修饰指针和常量
	//p1 = &b;//错误,指针的指向不可以修改
	//*p1 = 20;//错误,指针指向的值不可修改


	system("pause");
	return 0;
}
7.4指针访问数组
#include<iostream>
using namespace std;

int main(){
	int arr[5] = {2,4,6,8,10};
	int * p1 = arr;
	cout<<arr[0]<<endl;
	cout<<*p1<<endl;
	cout<<int(p1)<<endl;
	cout<<int(arr)<<endl;
	p1++;
	cout<<*p1<<endl;
	
	p1++;
	cout<<int(p1)<<endl;
	
	int * p2 = arr;
	//利用指针遍历数组
	for(int i=0;i<5;i++){
		cout<<*p2<<endl;
		*p2++;
	}

	system("pause");
	return 0;
}
7.5指针、数组、函数组合应用
#include<iostream>
using namespace std;

//冒泡排序(升序)函数
void maoPao(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 bianLi(int * arr,int length){
	for(int i=0;i<length;i++){
		cout<<arr[i]<<endl;
	}
}


int main(){
	int arr[6] = {9,8,7,6,5,4};
	int len = sizeof(arr)/sizeof(arr[0]);

	maoPao(arr,len);
	bianLi(arr,len);
	system("pause");
	return 0;
}

——————————————

8、结构体

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

8.1、结构体的定义(三种)
#include<iostream>
using namespace std;
#include<string>

int main(){
	//第一种
	struct student01{
		string name;
		int age;
		double score;
	}s1;
	s1.name = "张三";
	s1.age = 18;
	s1.score = 80;

	//第二种
	struct student02{
		string name;
		int age;
		double score;
	};
	struct student02 s2;
	s2.name = "李四";
	s2.age = 19;
	s2.score = 90;
	student02 s20;
	s20.name = "李四";//用结构体创建对象的时候struct可以省略
	s20.age = 19;
	s20.score = 90;

	//第三种
	struct student03{
		string name;
		int age;
		double score;
	};
	struct student03 s3 = {"王五",20,100};
	//输出所有信息
	cout<<s1.name<<endl<<s1.age<<endl<<s1.score<<endl;
	cout<<s2.name<<endl<<s2.age<<endl<<s2.score<<endl;
	cout<<s3.name<<endl<<s3.age<<endl<<s3.score<<endl;
	system("pause");
	return 0;
}
8.2、结构体数组和指针
#include<iostream>
using namespace std;
#include<string>

//创建结构体
struct student01{
	string name;
	int age;
	double score;
};
struct student02{
	string name;
	int age;
	double score;
};

int main(){
	//定义结构体数组
	student01 arrStudent[3] = {
		{"张三",18,80},
		{"李四",19,90},
		{"王五",20,100}
	};
	arrStudent[2].name = "毕羽";
	arrStudent[2].age = 21;
	arrStudent[2].score = 400;
	//遍历结构体数组
	for(int i=0;i<3;i++){
		cout<<arrStudent[i].name<<"\t"
			<<arrStudent[i].age<<"\t"
			<<arrStudent[i].score<<endl;
	}

	//通过结构体指针访问结构体属性
	student02 s1 = {"王朝",30,1000};
	student02 * p = &s1;
	cout<<p<<endl;
	cout<<&s1<<endl;

	p->name = "马汉";
	
	cout<<p->name<<p->age<<p->score<<endl;


	system("pause");
	return 0;
}
8.3、结构体嵌套
#include<iostream>
using namespace std;
#include<string>

struct student02{
	string name;
	int age;
	double score;
};
struct teacher01{
		string name;
		int age;
		double score;
		struct student02 s2;
	};
int main(){
	teacher01 s1;
	s1.s2.name = "黄阿牛";
	cout<<s1.s2.name<<endl;
	system("pause");
	return 0;
}
8.4、结构体作参数
#include<iostream>
using namespace std;
#include<string>

struct student01{
	string name;
	int age;
	double score;
};
void structHan(struct student01 s){
	cout<<s.name<<"\t"<<s.age<<"\t"<<s.score<<endl;
	s.name = "李四";//值传递,实参未改变
}
void structHan01(const struct student01 * s){ //将函数中的形参改为指针,可以减少内存空间,不用复制出新的副本传进去
//const可以防止误操作
	cout<<s->name<<"\t"<<s->age<<"\t"<<s->score<<endl;
	s->name = "李四"; //地址传递,实参改变
}
	
int main(){
	student01 s1 = {"张三",20,100};
	structHan(s1);
	cout<<s1.name<<"\t"<<s1.age<<"\t"<<s1.score<<endl;
	structHan01(&s1);
	cout<<s1.name<<"\t"<<s1.age<<"\t"<<s1.score<<endl;
	system("pause");
	return 0;
}
8.5、结构体中const使用场景
#include<iostream>
using namespace std;
#include<string>

struct student01{
	string name;
	int age;
	double score;
};
void structHan(struct student01 s){
	cout<<s.name<<"\t"<<s.age<<"\t"<<s.score<<endl;
	s.name = "李四";//值传递,实参未改变
}
void structHan01(const struct student01 * s){ //将函数中的形参改为指针,可以减少内存空间,不用复制出新的副本传进去
//const可以防止误操作
	cout<<s->name<<"\t"<<s->age<<"\t"<<s->score<<endl;
	s->name = "李四"; //地址传递,实参改变
}
	
int main(){
	student01 s1 = {"张三",20,100};
	structHan(s1);
	cout<<s1.name<<"\t"<<s1.age<<"\t"<<s1.score<<endl;
	structHan01(&s1);
	cout<<s1.name<<"\t"<<s1.age<<"\t"<<s1.score<<endl;
	system("pause");
	return 0;
}
8.6、结构体案例
8.6.2、案例二
#include<iostream>
using namespace std;
#include<string>
#include<ctime>
//定义教师结构体
struct student{
	string name;
	int score;
	string sex;
};
//定义学生结构体
struct teacher{
	string name;
	int age;
	string sex;
	struct student arrs[5];
};
//给教师和学生数值初始化
void getMean(struct teacher arrt[],int tlen){
	string namestring = "ABCDEF";
	for(int i = 0;i < tlen;i++){
			arrt[i].name = "teacher_";
			arrt[i].name  = arrt[i].name + namestring[i];
			arrt[i].age = rand()%41 + 20;//年龄随机在20-60之间
			arrt[i].sex = "男";
		for(int j = 0;j < 5;j++){
			arrt[i].arrs[j].score = rand()%101;//成绩随机在0-100之间
			arrt[i].arrs[j].name = "student_";
			arrt[i].arrs[j].name = arrt[i].arrs[j].name + namestring[j];
			arrt[i].arrs[j].sex = "男";
	}
	
	}
	return;
}

void putMessage(struct teacher arr[],int tlen){
	for(int i = 0;i < tlen; i++){
		cout<<"老师性别:"<<arr[i].sex<<"\t"<<"老师姓名"<<arr[i].name<<"\t"<<"老师年龄"<<arr[i].age<<endl;
		for(int j = 0;j < 5; j++){
			cout<<"学生性别:"<<arr[i].arrs[j].sex<<"\t"<<"学生姓名"<<arr[i].arrs[j].name<<"\t"<<
			"学生分数"<<arr[i].arrs[j].score<<endl;
	}
	}
};
int main(){
	struct teacher arrt[3];
	int tlen = sizeof(arrt)/sizeof(arrt[0]);
	srand((unsigned int)time(NULL));//初始化随机数种子

	getMean(arrt,tlen);
	putMessage(arrt,tlen);
	system("pause");
	return 0;
}
8.6.2、案例二
#include<iostream>
using namespace std;
#include<string>
英雄结构体
struct hero{
		string name;
		int age;
		string sex;
	};
void bubbling(struct hero heros[],int len){
	for(int i=0;i<len-1;i++){
		for(int j=0;j<len-i-1;j++){
			if(heros[j].age<heros[j+1].age){
				int temp = heros[j].age;
				heros[j].age = heros[j+1].age;
				heros[j+1].age = temp;
			}
		}
	}
};
void printt(hero heros[],int len){
	for(int i=0;i<len;i++){
		cout<<heros[i].name<<"\t"<<heros[i].age<<"\t"<<heros[i].sex<<endl;
	}
};

int main(){
	struct hero heros[5] = {
		{"刘备",5,"男"},
		{"关羽",22,"男"},
		{"张飞",20,"男"},
		{"赵云",21,"男"},
		{"貂蝉",190,"女"}

	};
	int len = sizeof(heros)/sizeof(heros[0]);
	bubbling(heros,len);
	printt(heros,len);
	system("pause");
	return 0;
}
==============
9、通讯录管理系统(基础版本)
#include<iostream>
using namespace std;
#include<string>

#define MAX 1000
//联系人结构体
struct Person{
	string m_Name;//姓名
	int m_Sex;//性别  1:男    2:女
	int m_Age;//年龄
	string m_Phone;//电话
	string m_Addr;//地址
};
//通讯录结构体
struct AddressBooks{
	struct Person personArray[MAX];//通讯录中保存了MAX的联系人
	int m_Size;//通讯录中人员个数
};
//菜单界面
void showMenu(){
	for(int i=0;i<27;i++){
		cout<<"*";
	}cout<<endl;
	//添加联系人
	for(int i=0;i<5;i++){
		cout<<"*";
	}cout<<"  1、添加联系人  ";
	for(int i=0;i<5;i++){
		cout<<"*";
	}cout<<endl;
	//显示联系人
		for(int i=0;i<5;i++){
		cout<<"*";
	}cout<<"  2、显示联系人  ";
	for(int i=0;i<5;i++){
		cout<<"*";
	}cout<<endl;
	//删除联系人
		for(int i=0;i<5;i++){
		cout<<"*";
	}cout<<"  3、删除联系人  ";
	for(int i=0;i<5;i++){
		cout<<"*";
	}cout<<endl;
	//查找联系人
		for(int i=0;i<5;i++){
		cout<<"*";
	}cout<<"  4、查找联系人  ";
	for(int i=0;i<5;i++){
		cout<<"*";
	}cout<<endl;
	//修改联系人
		for(int i=0;i<5;i++){
		cout<<"*";
	}cout<<"  5、修改联系人  ";
	for(int i=0;i<5;i++){
		cout<<"*";
	}cout<<endl;
	//清空联系人
		for(int i=0;i<5;i++){
		cout<<"*";
	}cout<<"  6、清空联系人  ";
	for(int i=0;i<5;i++){
		cout<<"*";
	}cout<<endl;
	//退出通讯录
		for(int i=0;i<5;i++){
		cout<<"*";
	}cout<<"  0、退出通讯录  ";
	for(int i=0;i<5;i++){
		cout<<"*";
	}cout<<endl;
	cout<<"请输入对应功能编号"<<"----------"<<endl;
};
void addPerson(AddressBooks * abs){
	if (abs->m_Size == 1000){
		cout<<"通讯录已满"<<endl;
	}else{
		string name;
		cout<<"请输入联系人姓名"<<endl;
		cin>>name;
		abs->personArray[abs->m_Size].m_Name = name;

		int sex = 0;
		cout<<"请输入联系人性别(1代表男,2代表女)"<<endl;
		while(1){
			cin>>sex;
		if(sex==1||sex==2){
			abs->personArray[abs->m_Size].m_Sex = sex;
			break;
		}else{
			cout<<"输入不合法,请重新输入"<<endl;
		}}

		int age = 0;
		cout<<"请输入联系人年龄"<<endl;
		cin>>age;
		abs->personArray[abs->m_Size].m_Age =age;

		string TEL;
		cout<<"请输入联系人电话"<<endl;
		cin>>TEL;
		abs->personArray[abs->m_Size].m_Phone = TEL;

		string ADD;
		cout<<"请输入联系人地址"<<endl;
		cin>>ADD;
		abs->personArray[abs->m_Size].m_Addr = ADD;
		abs->m_Size++;
		cout<<"添加成功"<<endl;
		system("pause");//请按任意键继续
		system("cls");//清屏
		showMenu();
	}
};
void showPerson(AddressBooks * abs){
	if(abs->m_Size==0){
		cout<<"通讯录为空"<<endl;
	}else{
		for(int i=0;i<abs->m_Size;i++){
			
			cout<<"姓名"<<abs->personArray[i].m_Name<<"\t"
			<<"性别:"<<abs->personArray[i].m_Sex<<"\t"
			<<"年龄:"<<abs->personArray[i].m_Age<<"\t"
			<<"电话:"<<abs->personArray[i].m_Phone<<"\t"
			<<"地址:"<<abs->personArray[i].m_Addr<<endl;
		}
	}
	system("pause");
	system("cls");
	showMenu();
};
//删除联系人
void delPerson(struct AddressBooks * abs){
	string name;
	cout<<"请输入您要删除的人员的姓名"<<endl;
	cin>>name;
	for(int i=0;i<abs->m_Size;i++){
		if(abs->personArray[i].m_Name != name){
			cout<<"第"<<i+1<<"次查找"<<"并未有该联系人"<<endl;

		}else{
			cout<<"查找到该联系人"<<endl;
			for(int j=i;j<(abs->m_Size);j++){
				abs->personArray[j] =abs->personArray[j+1]; 
			}abs->m_Size--;
			cout<<"emmmmmm........."<<"删除成功"<<endl;
		}
	}system("pause");
	system("cls");
	showMenu();

};
//查找联系人
void findPerson(struct AddressBooks * abs){
	string name;
	cout<<"请输入要查找的联系人姓名"<<endl;
	cin>>name;
	for(int i=0;i<abs->m_Size;i++){
		if(abs->personArray[i].m_Name == name){
			cout<<"序号"<<i+1<<","<<"有此人"<<endl;
		}else{
			cout<<"第"<<i+1<<"次查找"<<"查无此人"<<endl;
		}
	}
	system("pause");
	system("cls");
	showMenu();
}
//修改联系人
void modifyPerson(struct AddressBooks *abs){
	string name1;
	cout<<"请输入要修改的联系人姓名"<<endl;
	cin>>name1;
	for(int i=0;i<abs->m_Size;i++){
		if(abs->personArray[i].m_Name == name1){
			cout<<"找到此人"<<endl;

			string name2;
			cout<<"请输入姓名进行修改"<<endl;
			cin>>name2;
			abs->personArray[i].m_Name = name2;

			int sex;
			cout<<"请输入性别进行修改"<<endl;
			cin>>sex;
			abs->personArray[i].m_Sex = sex;

			int age;
			cout<<"请输入年龄进行修改"<<endl;
			cin>>age;
			abs->personArray[i].m_Age = age;

			string tel;
			cout<<"请输入电话进行修改"<<endl;
			cin>>tel;
			abs->personArray[i].m_Phone = tel;

			string ADD;
			cout<<"请输入地址进行修改"<<endl;
			cin>>ADD;
			abs->personArray[i].m_Addr = ADD;
			cout<<"修改完毕"<<endl;
		}else{
			cout<<"第"<<i+1<<"次查找"<<"查无此人"<<endl;
		}
	}
	system("pause");
	system("cls");
	showMenu();
}
//清空联系人
void clearPerson(struct AddressBooks * abs){
	abs->m_Size = 0;
	cout<<"联系人已清空"<<endl;
	system("pause");
	system("cls");
	showMenu();
}
int main(){
	showMenu();//菜单界面
	AddressBooks abs;//创建通讯录结构体变量
	abs.m_Size = 0;//初始化通讯录。
	int select = 0;
	while(1){
	cin>>select;
	switch(select){
	case 1://添加联系人
		addPerson(&abs);
		break;
	case 2://显示联系人
		showPerson(&abs);
		break;
	case 3://删除联系人
		delPerson(&abs);
		break;
	case 4://查找联系人
		findPerson(&abs);
		break;
	case 5://修改联系人
		modifyPerson(&abs);
		break;
	case 6://清空联系人
		clearPerson(&abs);
		break;
	case 0://退出通讯录
		cout<<"欢迎下次使用"<<endl;
		system("pause");
		return 0;
		break;
	default://其余不合法输入
		break;
	}}
	system("pause");
	return 0;
}

本章完结 下章将记录c++核心编程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值