学习目标:
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++中创建变量常量时必须声明其数据类型,否则无法分配内存
数据类型意义:给变量分配合理的内存空间
数据类型 | 占用空间 | 取值范围 |
---|---|---|
bool | 1 | -2^7 ~2 ^7-1 |
char | 1 | -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 |
float | 4 | -2^31 ~2 ^31-1 |
double | 8 | -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/5 | 2 |
% | 取模(取余) | 10%3 | 1 |
++x | 前置递增 | a=2,b=++a | a=3,b=3 |
- -x | 前置递减 | a=2,b=- -a | a=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都为真 则结果为真 | |
II | 或 | a,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;
}
switch和if
一般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++核心编程