使用十六进制地址表示变量内容放入内存的位置
变量的存在是为了方便管理内存空间
变量创建:
//数据类型 变量名 = 变量初始值;
int a = 10;
作用:记录程序中不可更改的数据
定义常量:
宏常量: #define,通常在文件上方定义
//#define 常量名 常量值
#define Day 7
const修饰的变量:在变量前加关键字const,修饰该变量为常量,不可修改,可在函数内定义
//const 数据类型 变量名=常量值
const int weekday =2
关键字
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IhGBOmTP-1583504234957)(C:\Users\WangWeikai\AppData\Roaming\Typora\typora-user-images\image-20200229215957721.png)]
标识符命名
命名要求:
数据类型的作用是给变量分配合适的内存空间
sizeof关键字:统计数据类型所占内存的大小;语法: sizeof(数据类型/变量)
转义字符
\n换行
\\反斜杠 \t制表符
float 单精度 4字节 7位有效数字;double 双精度 8 字节 16~16位有效数字
默认情况下,输出一个小数会只显示出6位有效数字
float num1=2.345f;//一般在数字后面加上f表示是float类型的小数
科学计数法:
float f2=3e2;//3*10^2
float f2=3e-2;//3*10^(-2)
用于显示字符串
语法:
char str[]="shdg";//增加了[]和“”包含多个字符
//C++风格,需包含String的头文件
String ="sdhhdh";
只有两个值:true false
一个字节
bool s_bool=true;
cout<
关键词:cin
cin>>变量;//变量需要提前定义
整数与整数相除结果为整数;两数相除只要其中一个为浮点型,结果就为浮点型;
%取模(取余)运算;两个小数不可以做取模运算;两者必须有一个整数;
++a与a++的区别:++a是先进行加1计算再进行其他运算,a++是先运算后加1
+=;-+;*=;/=;%=;相当于a=a+2的形式
比较运算符:==;!=;<;>;<=;>=
逻辑运算符:根据表达式的值返回真值或假值
!非;&&与;||或
单行格式
if(条件语句){语句}
多行格式
if (条件语句){
语句1
}
else{
语句2
}
多条件if语句
if(条件1){
语句1
}else if(条件2){
语句2
}else{
语句3
}嵌套if 语句:在if语句中,嵌套if语句
c=(a>b? a:b);
//返回的是变量可以继续赋值
(a>b? a:b)=10;
switch(表达式)
{
case 结果1:执行语句;
break;//不使用break则继续往下执行
case 结果2:执行语句;
break;
...
default:执行语句;
break;
}
while (循环条件){
循环语句;
}//只要循环条件为真,就执行循环语句
do {
循环语句
}while(条件)//先执行后判断
#include
#include
using namespace std;
int main() {
//添加随机数种子,利用系统时间生成随机数,放置每次随机数都一样
srand((unsigned int)time(NULL));
//1、生成随机数
int num = rand() % 100 + 1//生成0~99的随机数
//2、玩家进行猜测
int val = 0;
cout << "请输入猜测数值:" << endl;
cin >> val;
//3、判断玩家的猜测
if (val > num) {
cout << "猜测数值过大" << endl;
}
else if (val < num) {
cout << "猜测的数值过小" << endl;
}
else
{
cout << "恭喜你猜对了" << endl;
break;
}
system("pause");
}
#include
using namespace std;
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);
system("pause");
return 0;
}
for (int i=0;i<10;i++){//起始条件;条件表达式;末尾循环体
循环语句;
}
//循环条件内分号必须写,分号之间内容可以不写
continue:在循环语句中,跳过未完成的循环语句,执行下一个循环
数组:存放相同类型数据元素的集合
特点:1、每个数据元素的类型相同;2、由连续的内存位置组成
定义方式:
//1、数据类型 数组名[数组长度];
//2、数据类型 数组名[数组长度]={值1,值2,值3,...};
//3、数据类型 数组名[]={值1,值2,...};
一维数组名称的用途:1、可以统计整个内存中的长度 :sizeof(arr);2、获取数组在内存中的首地址
int arr[5]={1,2,3,45,5};
cout<<"元素个数:"<
冒泡排序:
#include
using namespace std;
int main() {
int arr[8] = {3,31,9,12,5,4,6,10 };
int len_s = sizeof(arr) / sizeof(arr[0]);
int len = len_s;
int tempo;
for (int i = 0; i <= (len_s - 1); i++) {
cout << i << " " << arr[i] << endl;
}
for (int i = 0; i <= (len - 1); i++) {
tempo = arr[i];
if (i < len-1) {
arr[i] = arr[len-1];
arr[len-1] = tempo;
len--;
}
}
for (int i = 0; i <= (len_s - 1); i++) {
cout<= 1; j--) {
for (int i = 0; i < j; i++) {
tempo = arr[i];
if (arr[i + 1] < arr[i]) {
arr[i] = arr[i + 1];
arr[i + 1] = tempo;
}
}
}
for (int i = 0; i <= (len_s - 1); i++) {
cout << i << " " << arr[i] << endl;
}
system("pause");
return 0;
}
二维数组
定义:
// 数据类型 数组名[行数][列数]
int arr[2][3];
//数据类型 数组名[行数][列数]={{数据1,数据2},{数据3,数据4}...};
int arr1[2][3]={{1,2,3},{2,3,4}};
//数据类型 数组名[行数][列数]={数据1,数据2,数据3,数据4...};自动区分
int arr2[2][3]={1,2,3,2,3,4};
//数据类型 数组名[][列数]={数据1,数据2,数据3,数据4...};自动区分,不能只写行不写列
int arr3[][3]={1,2,3,2,3,4};
二维数组数组名:
查看所占用的内存空间;
空间大小:sizeof()
获取二维数组的首地址;arr–数组首地址;arr[0]–每行的首地址;
作用:将一段经常使用的代码封装起来。减少代码重复量;
函数的定义:
返回值类型 函数名 (参数列表){
函数体语句;
return 表达式;
}
函数的调用
函数名(参数1,参数2);
参数传递(无指针时):形参,实参
函数的常见样式
函数声明可以多次,但是定义只有一次
定义函数在main函数之后,需要在main函数前先声明
声明:
返回值类型 函数名(参数列表);
函数的分文件编写:让代码结构更加清晰
//1、定义指针
int a = 10;
//指针定义语法:数据类型 *指针变量名;
int* p;
//让指针记录变量a的地址
p = &a;
cout << "a的地址为:" << &a << endl;
cout << "指针p为:" << p << endl;
//使用指针
//指针前面加*代表解引用,找到指针指向的内存中的数据
*p = 1000;
cout << "a= " <
指针所占内存空间:32位系统占4字节,64位系统占8字节;
空指针:指针白能量指向内存中编号为0的空间
const修饰指针
三种情况:
const修饰指针–常量指针
const int* p;//常量指针
//指针的指向可以修改但是指针的值不可以修改
int b = 30;
const int* p=&b;//常量指针
//指针的指向可以修改但是指针的值不可以修改
int a=20;
p = &a;//不可以对*p进行赋值
const修饰常量 --指针常量
int* const p1 = &b;//指针常量
//指针的指向不可以改,指针指向的值可以改
*p1 = 20;
//p1=&a;错误
const既修饰指针,又修饰常量
const int* const p = &b;
//指针指向的值和指向都不可以修改
指针作为函数的参数
int func1(int* a,int * b){
...
return 0;
}
int main(){
int a=23;
int b=28;
func1(&a,&b);//地址传递,实参数值改变
return 0;
}
属于用户自定义的数据类型,允许用户存储不同类型的数据类型;
语法:
struct 结构体名{结构体成员列表};
通过结构体创建变量的方式:
结构体数组
作用:将自定义的结构体放入数组中方便维护
语法:
struct 结构体名 数组名[元素个数] ={{},{},{}}
struct Student {
//成员列表
//姓名
string name;
//年龄
int age;
//分数
int score;
};
void jgtsz() {
//创建结构体数组
struct Student stuArray[8] =
{
{"张三",18,90},
{"李四",19,80},
{"王五",21,99},
};
//给结构体数组中元素赋值
stuArray[2].name = "赵六";
stuArray[2].age = 19;
stuArray[2].score = 100;
//遍历结构体数组
for (int i = 0; i < 3; i++) {
cout << "姓名:" << stuArray[i].name
<< "年龄: " << stuArray[i].age
<< "分数: " << stuArray[i].score << endl;
}
}
结构体指针
//创建学生结构体变量
Student s = { "张三",18,90 };
//通过指针指向结构体变量
Student* p = &s;
//通过指针访问结构体变量中的数据
cout << " 姓名:" << p->name<<" 年龄: "
<< p->age <<" 分数: "<< p->score << endl;
结构体嵌套结构体
//定义结构体
struct Student {
//成员列表
//姓名
string name;
//年龄
int age;
//分数
int score;
};
//嵌套结构体
struct teacher {
int id;
string name;
int age;
struct Student stu;//辅导的学生,使用已经定义好的结构体
};
//结构图嵌套
teacher t;
t.id = 100000;
t.name = "老张";
t.age = 50;
t.stu.name = "小王";//嵌套结构体的属性
t.stu.age = 20;
t.stu.score = 60;
cout << "老师姓名: " << t.name << " 老师编号: " << t.id << " 老师年龄: "
<< t.age << " 老师辅导学生的姓名: " << t.stu.name << " 学生年龄: "
<< t.stu.age << " 学生的考试成绩: " << t.stu.score << endl;
结构体做函数参数
void printStudent(struct Student s) {
cout << "子函数 姓名" << s.name << " 年龄 " << s.age << " 分数"
<< s.score << endl;
}
//地址传递
void printStudent1(struct Student* s) {
//地址传递在函数体内修改结构体实参会发生改变
//将函数中的形参改为指针,可以减少内存空间且不会赋值新的副本出来
cout << "子函数 姓名" << s->name << " 年龄 " << s->age << " 分数"
<< s->score << endl;
}
//创建学生结构体变量
Student s = { "张三",18,90 };
printStudent(s);
printStudent1(&s);
结构体内使用const使用结构
void printStudent1(const struct Student* s) {
//一旦有修改的操作就会报错
cout << "子函数 姓名" << s->name << " 年龄 " << s->age << " 分数"
<< s->score << endl;
}
结构体案例
#include
#include
using namespace std;
struct student {
string sname;
int age;
int score;
};
struct teacher {
string name;
//学生数组
struct student stu[5];
};
void allocateSpace(struct teacher tArray[], int len) {
string nameSeed = "ABCDE";
//给老师赋值
for (int i = 0; i < len; i++) {
tArray[i].name = "Teacher_" ;
tArray[i].name += nameSeed[i];
//通过循环给每名老师所带的学生赋值
for (int j = 0; j < 5; j++) {
tArray[i].stu[j].sname = "student_" ;
tArray[i].stu[j].sname +=nameSeed[j];
tArray[i].stu[j].age = 19;
tArray[i].stu[j].score = 100;
}
}
}
//打印所有信息
void printInfo(struct teacher tArray[], int len) {
for (int i = 0; i < len; i++) {
cout << "\t老师姓名: " << tArray[i].name << endl;
for (int j = 0; j < 5; j++) {
cout << " 学生姓名: " << tArray[i].stu[j].sname << endl;
cout << " 学生成绩: " << tArray[i].stu[j].score << endl;
}
}
}
int main() {
//创建3名老师的数组
struct teacher tArray[3];
//通过函数给3名老师的信息赋值,并给老师带的学生信息赋值
int len = sizeof(tArray) / sizeof(tArray[0]);
allocateSpace(tArray, len);
//打印所有信息
printInfo(tArray, len);
system("pause");
return 0;
}
案例:通讯录管理系统
#include
#include
using namespace std;
//联系人结构体
struct person {
string name;//姓名
string m_sex;//性别
int m_age;//年龄
string m_phone;//电话号码
string m_add;//地址
};
//通讯录地址
struct Addressbooks {
//通讯录中保存的联系人数组
person personArray[100];
//通讯录中当前记录联系人个数
int m_size = 0;
};
void showMenu() {
//显示菜单信息
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;
}
//1 添加联系人
void addPeerson(Addressbooks* abs)
{
//判断通讯录是否满了。如果满了就不再添加
if (abs->m_size == 100) {
cout << "通讯录已满。无法添加!" << endl;
return;
}
else {
//添加具体的联系人
//姓名
string name;
cout << "请输入姓名: " << endl;
cin >> name;
abs->personArray[abs->m_size].name = name;
//性别
string sex;
cout << "请输入性别(man or woman): " << endl;
cin >> sex;
abs->personArray[abs->m_size].m_sex = sex;
//年龄
int age;
cout << "请输入年龄: " << endl;
cin >> age;
abs->personArray[abs->m_size].m_age = age;
//电话号码
string pN;
cout << "请输入电话号码: " << endl;
cin >> pN;
abs->personArray[abs->m_size].m_phone = pN;
//地址
string addr;
cout << "请输入地址: " << endl;
cin >> addr;
abs->personArray[abs->m_size].m_add = addr;
abs->m_size++;
cout << "添加成功!" << endl;
system("pause");//按任意键继续
system("cls");
}
}
//2 显示联系人
void showPerson(Addressbooks* abs) {
//判断通讯录中人数是否为0,如果为0,提示记录为空
//如果不为0,显示记录的联系人信息
if (abs->m_size==0){
cout << "当前记录为空" << endl;
}
else {
for (int i = 0; i < abs->m_size; i++) {
cout << "姓名: " << abs->personArray[i].name << " 性别: "
<< abs->personArray[i].m_sex << " 年龄: "
<< abs->personArray[i].m_age << " 电话号码: "
<< abs->personArray[i].m_phone << " 地址: "
<< abs->personArray[i].m_add << endl;
}
}
system("pause");
system("cls");
}
//删除联系人
//检测联系人是否存在,如果存在,返回联系人所在数组的具体位置,不存在返回-1
//传递的参数 通讯录,对比的姓名
int isExist(Addressbooks* abs, string name) {
for (int i = 0; i < abs->m_size; i++) {
//找到用户输入的姓名
if (abs->personArray[i].name==name)
{
return i;//找到了返回联系人在数组中的位置
}
}
return -1;
}
//3 删除指定联系人
void deletePerson(Addressbooks* abs)
{
cout<<"请输入您要删除的联系人"<> name;
int ret =isExist(abs, name);
//ret=-1未查到
//ret!=-1查到了
if (ret != -1) {
//查到此人,要进行删除操作
for (int i = ret; i < abs->m_size; i++) {
//数据前移
abs->personArray[i] = abs->personArray[i + 1];
}
abs->m_size--;//更新通讯录中的人员数
cout << "删除成功!" << endl;
}
system("pause");
system("cls");
}
//查找联系人
void findPerson(Addressbooks* abs) {
string pname;
cout<< "请输入您要查找的联系人: " << endl;
cin >> pname;
//判断指定的联系人是否存在通讯录中
int ret = isExist(abs, pname);
if (ret != -1) {//找到联系人
cout << "姓名: " << abs->personArray[ret].name << "\t";
cout << "性别: " << abs->personArray[ret].m_sex << "\t";
cout << "年龄: " << abs->personArray[ret].m_age << "\t";
cout << "电话: " << abs->personArray[ret].m_phone << "\t";
cout << "住址: " << abs->personArray[ret].m_add << "\t";
}
else //未找到联系人
{
cout << "查无此人" << endl;
}
system("pause");
system("cls");
}
//5 修改联系人
void modifyPerson(Addressbooks* abs)
{
cout << "请输入您要修改的联系人:" << endl;
string name;
cin >> name;
int ret =isExist(abs,name);
if (ret != -1)//找到指定联系人
{
cout << "姓名: " << abs->personArray[ret].name << "\t";
cout << "性别: " << abs->personArray[ret].m_sex << "\t";
cout << "年龄: " << abs->personArray[ret].m_age << "\t";
cout << "电话: " << abs->personArray[ret].m_phone << "\t";
cout << "住址: " << abs->personArray[ret].m_add << "\t" << endl;
cout << "请输入您要修改的选项的代码:\n name--1 /sex--2 /age--3 /phone--4 /address--5/all--6 " << endl;
int option;
cin >> option;
switch (option)
{
case 1:
//姓名
cout << "请输入姓名" << endl;
cin >> abs->personArray[ret].name;
break;
case 2:
//性别
cout << "请输入性别" << endl;
cin >> abs->personArray[ret].m_sex;
break;
case 3:
//年龄
cout << "请输入年龄" << endl;
cin >> abs->personArray[ret].m_age;
break;
case 4:
//电话号码
cout << "请输入电话号码" << endl;
cin >> abs->personArray[ret].m_phone;
break;
case 5:
//地址
cout << "请输入地址" << endl;
cin >> abs->personArray[ret].m_add;
break;
case 6:
//所有内容
//姓名
cout << "请输入姓名" << endl;
cin >> abs->personArray[ret].name;
//性别
cout << "请输入性别" << endl;
cin >> abs->personArray[ret].m_sex;
//年龄
cout << "请输入年龄" << endl;
cin >> abs->personArray[ret].m_age;
//电话号码
cout << "请输入电话号码" << endl;
cin >> abs->personArray[ret].m_phone;
//地址
cout << "请输入地址" << endl;
cin >> abs->personArray[ret].m_add;
break;
default:
cout << "输入的代码无效" << endl;
break;
}
}
else {
cout<<"查无此人"<m_size = 0;
cout<<"通讯录已清空"<> select;
switch (select)
{
case 1://1、添加联系人
addPeerson(&abs);
break;
case 2://2、显示联系人
showPerson(&abs);
break;
case 3://3、删除联系人
deletePerson(&abs);
cout << "请输入删除联系人的姓名:" << endl;
break;
case 4://4、查找联系人
findPerson(&abs);
break;
case 5://5、修改联系人
modifyPerson(&abs);
break;
case 6://6、清空联系人
cleanPerson(&abs);
break;
case 0://0、退出通讯录
cout << "**欢迎下次使用!**" << endl;
system("pause");
return 0;
break;
default:
break;
}
}
}