第一个程序
注释
//单行
/*多行注释*/
变量
作用:给一段指定的内存空间起名,方便操作这段内存。
语法:数据类型 变量名 = 初始值;
int a = 10;
cout << "a = "<< a << endl;
常量
作用:用于记录程序中不可更改的数据。
C++定义常量的两种方法
1.#define宏定义
#define 常量名 常量值
通常在文件上方定义,表示一个常量。
2.const修饰的变量
const 数据类型 常量名 = 常量值
通常在变量定义之前加关键字const,修饰该变量为常量,不可修改。
示例:
#define hour 24//是不可修改的值,一旦修改就会报错
const int minuteus = 60;
关键字
作用:关键字是C++中预先保留的单词(标识符)
在定义变量或常量的时候不要使用关键字。
标识符命名规则
(1)标识符不能是关键字
(2)标识符只能由字母、数字、下划线组成
(3)第一个字符必须为字母或者下划线
(4)标识符中字母区分大小写
数据类型
C++规定在创建一个变量或者常量的时候,必须要指定出相应的数据类型,否则无法给该变量分配内存空间。
整型
作用:整型变量表示的是整型类型的数据。
C++中能够表示整型的类型有以下几种方式,区别在于占用的内存空间不同。
sizeof关键字
作用:统计数据类型所占空间的大小。
语法:
sizeof(数据类型/变量);
示例:
实型(浮点型)
作用:用于表示小数。
浮点型分为两种-单精度float-双精度double。
两者的区别在于有效数字的表示范围不一样。
float f1 = 3.14f;//编译器会默认把一个小数当做双精度
//默认情况下输出一个小数会显示出6位有效数字//例如:下面这个f1只输出到6float f1 = 3.1234567f;
字符型
作用:字符型变量用于显示单个字符。
语法:
char s = 'a';
/*注意:显示字符型变量时用单引号括起来,不是双引号。单引号内只能有一个字符,不可以是字符串。*/
(1)C和C++中字符型变量只占1个字节。
(2)字符型变量并不是把所有的字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元中。
转义字符
作用:用于表示一些不能显示出来的ASCII字符。
cout << “hello world\n”<< endl;
字符串
作用:用于表示一串字符串。
两种风格:
1.C风格字符串
要用双引号括起来。
char 变量名[] = "字符串值";
char str1[] = "hello world";
2.C++风格字符串
需要加入头文件#include。
string 变量名 = "字符串值";
string st2 = "hellow world";
布尔类型bool
作用:布尔类型数据代表真或假的值。
bool类型只有两个值:true——真(1),false——假(0)。
bool类型占1个字节大小。
示例:
bool flag = true;
数据输入
作用:用于从键盘获取数据
关键字:cin
语法:
cin >> 变量
int a = 0;
cin >>a;
运算符
作用:用于代码的运算。
算数运算符
作用:用于处理四则运算。
赋值运算符
**作用:**用于将表达式的值赋给变量。
示例:
int a = 1;
a *= 2;//意思就是就是a = a*2;
比较运算符
**作用:**用于表达式的比较,并返回一个真值或假值。
示例:
int a = 4;
int b = 3;
cout << (a < b)<<endl;//真返回1,假0
逻辑运算符
作用:用于根据表达式的值返回真值或假值。
示例:
程序流程结构
C/C++支持最基本的三大基本程序运算结构:顺序结构、选择结构、循环结构。
- 顺序结构:程序按顺序执行,不发生跳转。
- 选择结构:依据条件是否满足,有选择的执行相应代码。
- 循环结构:依据条件是否满足,循环多次指定某段代码。
选择结构
if语句
作用:执行满足条件的语句。
(1)单行格式if语句
if(条件){ //条件满足执行的语句}
(2) 多行格式if语句
if(条件)
{
//条件满足执行的语句
}
else
{
//条件不满足执行的语句
}
(3) 多条件if语句
if(条件1)
{
//条件1满足执行的语句
}
else if(条件2)
{
//条件2满足执行的语句
}
......
else
{
//都不满足执行的语句
}
(4) 嵌套if语句
if()
{
if()
}
else
{
}
三目运算符
作用:通过三目运算符实现简单的判断
语法:
表达式1?表达式2:表达式3
解释:
如果1为真,则结果为表达式2的值。
如果1为假,则结果为表达式3的值。
示例:
switch语句
作用:执行多条件分支语句
语法:
switch(表达式)
{
case 结果1:
执行语句;
break;
......
default:
执行语句;
break;
}
循环结构
作用:满足循环条件,执行循环语句
语法:
while(循环条件){ 循环语句}
解释:只要满足循环条件的结果为真,就执行循环语句。
猜数字练习
do-while循环语句
作用:满足循环条件,执行循环语句。
语法:
do{
循环语句
}while(循环条件)
注意:与while的区别在于do-while会先执行一次循环语句,再判断循环条件。
水仙花数练习
for循环语句
作用:满足循环条件,执行循环语句
语法:
for(起始条件;条件表达式;末尾循环体){ 循环语句}
示例:
#include<iostream>
using namespace std;
int main(void)
{
for(int i = 0;i < 10;i++)
{
}
return 0;
}
敲桌子练习
是7的倍数、个位有7、十位有7
嵌套循环
作用:在循环体中再嵌套一层循环,解决一些实际问题。
打印10*10的正方形
乘法口诀表练习
跳转语句
break语句
作用:用于跳出选择结构或者循环结构。
break使用的时机:
出现在switch语句中,作用是终止case并跳出swtich
出现在循环语句中,作用是跳出当前的循环语句
出现在嵌套语句中,跳出最近的内层循环语句
continue语句
作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环。
goto语句
作用:可以无条件跳转语句
语法:goto标记;
解释:如果标记的名称存在,执行到goto语句的时候,会跳转到标记的位置。
goto s1;......
s1:......
数组
概述
所谓数组就是一个集合,里面存放了相同类型的数据元素
特点1:数组中的每个数据元素都是相同的数据类型。
特点2:数组是由连续的内存位置组成的。
一维数组
数据类型 数组名[数组长度];
数据类型 数组名[数组长度] = {值1,值2......};
数据类型 数组名[] = {值1,值2......};;
数组名的用途
1.可以统计整个数组在内存中的长度
2.可以获取数组在内存中的首地址
输出最重的一只小猪的体重
数组元素逆置
冒泡排序
作用:最常用的排序算法,对数组内元素进行排序
- 比较相邻两个元素,如果第一个比第二个大就交换他们的位置
- 每一对相邻元素做同样的工作,整型完毕后,找到第一个最大值。
- 重复以上的步骤,每次比较次数-1,知道不需要比较
示例:
二维数组
二维数组就是在一维数组的基础上多加一个维度,就是在一维数组里面存储一维数组。
定义:
数据类型 数组名[行][列];
数据类型 数组名[行][列] = {{数据1,数据2},{数据3,数据4}};
数据类型 数组名[行][列] = {数据1,数据2,数据3,数据4};
数据类型 数组名[][列] = {数据1,数据2,数据3,数据4};
建议:以上4种定义方式,利用第二种更加直观,提高代码的可读性。
数组名
(1)查看二维数组所占内存空间
(2)获取二维数组首地址
考试成绩统计练习
分别输出三个人的总成绩
函数
概述
作用:将一段经常使用的代码封装起来,减少重复代码。
一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。
函数的定义
函数的几个要素
返回值类型,函数名 ,参数,函数体语句,return表达式
语法:
返回值类型 函数名(参数列表)
{
函数语句;
return 表达式;
}
函数的调用
功能:使用定义好的函数
语法:函数名(参数)
值传递
就是函数调用时将参数值传给形参
值传递时,如果形参发生变化,并不会影响到实参
函数的常见样式
无参无返、有参无返、无参有返、有参有返
函数的声明
作用:告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
函数的声明可以有很多次,定义只能有一次。
//声明
int max(int a,int b);
//定义
int max(int a ,int b)
{
return a+b;
}
函数的分文件编写
作用:让代码结构更加清晰
就是在.h的头文件里面放函数声明,函数的定义放到.c文件里
指针
概念
指针的作用:可以通过指针间接访问内存。
内存编号是从0开始记录的,一般用16进制数字标识。
可以利用指针变量保存地址。
指针变量的定义和使用
指针变量定义语法:数据类型+变量名
指针所占内存空间
在32位操作系统下无论是什么类型的指针,都占4个字节的内存空间。
空指针
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存空间是不可以访问的
int* p = NULL;
野指针
指针变量指向非法的内存空间。
const修饰指针
const修饰指针有3种情况
- const修饰指针—常量指针
- const修饰常量—指针常量
- const既修饰指针,又修饰常量
const修饰的是指针,指针指向可以改,指针指向的值不可以改
const int* p1 = &a;
const修饰的是常量,指针指向不可以改,指针指向的值可以更改
int* const p2 = &a;
const既修饰指针,又修饰常量,指针的指向和指针指向的值都不可以改变
const int* const p = &a;
指针和数组
作用:利用指针访问数组元素
int arr[] = {1,2,3,4};
int* p = arr;
指针和函数
作用:利用指针作函数的参数,可以修改实参的值。
——传(址)引用
指针、数组、函数
封装一个函数,利用冒泡排序,实现对整型数组的升序排列
结构体
概念
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。
定义和使用
语法:
struct 结构体名称{ 结构体成员列表};
通过结构体创建变量的方式有三种
- struct 结构体名 变量名
- struct 结构体名 变量名 = (成员1值,成员2值…)
- 定义结构体时顺便创建变量
示例:
struct Student
{
string name;
int age;
int score;
};
结构体数组
作用:将自定义的结构头放入到数组中方便维护
语法:
struct 结构体名 数组名[元素个数]= {{},{}...{}};
结构体指针
作用:通过指针访问结构体中的成员
利用操作符->可以通过结构体指针访问结构体属性
struct Student s1;
struct Student* p = &s1;
p->score = 10;
结构体嵌套结构体
作用:结构体中的成员可以是另一个结构体
例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的的结构体
结构体做函数参数
作用: 将结构体作为参数向函数中传递
传递方式有两种
同上函数参数-指针
(1)值传递-无法改变实参
(2)地址传递-可以改变实参
结构体中const使用场景
作用:用const来防止误操作
void ChangeInformation(const struct student* stu1)
{
加了const就无法改变该结构体内的信息
}
结构体案例
每个老师带三个学生
创建5个人并按年龄排序:
通讯录
#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
{
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)
{
if (abs->m_Size == MAX)
{
cout << "联系人已满,无法添加" << endl;
return;
}
string name;
cout << "请输入姓名" << endl;
cin >> name;
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;
}
}
}