C++是由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的
进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。
C++ 可运行于多种平台上,如 Windows、MAC 操作系统以及 UNIX 的各种版本。
最初命名为带类的C,后来在 1983 年更名为 C++。
C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c
开发流程
源代码-->编译器-->目标代码-->链接器-->可执行程序
/ \
启动代码 库代码
#include //头文件包含了程序中必需的或有用的信息
using namespace std; //命名空间
int main() //主函数 程序从这里开始执行。
{
cout << "Hello World"; // 输出 Hello World
return 0; //终止 main( )函数 并向调用进程返回值0。
}
命名空间是 C++ 中一个相对新的概念。
为了解决合作开发时的命名冲突问题,
C++ 引入了命名空间(Namespace)的概念。
就好比一个软件由多个人合作完成,每个人各自做的部分命名什么都合适,
可是到时候把每个人的部分进行整合就会出现名字一样重复定义的问题,
所以有了命名空间的概念
用现实案例来说就是一个学校有好几个人都叫张三,这样不好管理,
那如果把他们分到不同的班级就不会冲突
自定义命名空间的格式:namespace关键字
namespace 名字{
}
注释:解释说明的意思 用来做笔记用的 用来给我们程序员自己看的
//单行注释 只能注释掉双斜杠以后的当前行
/*多行注释*/ 只要写在斜杠星开始星斜杠结束的中间都可以被注释掉
//包含daoc++的标准输入输出头文件
#include
//C++标准程序库中的所有标识符都被定义于名为std的namespace中。
using namespace std;
//自己定义一个命名空间
namespace day01 {
int age = 20;
}
int main() {
cout << "HelloWorld" << endl;//endl 相当于 /n换行
cout << day01::age << endl; //访问自己命名空间中的内容
return 0;
}
1.基本数据类型
整型 浮点型 字符型 宽字符型 布尔型 无类型
int float double char wchar_t bool void
字节: 4 4 8 1 2或4 1
位: 32 32 64 8 16或32 8
范围:
int:(-2147483648 到 2147483647)
float : 6~7位有效数字
double : 15~16位有效数字
char : -128~127 或 0~255
wchar_t: (-2147483648 到 2147483647)
bool : true false
2.typedef
可以使用 typedef 为一个已有的类型取一个新的名字
typedef int zhengshu; //给int取名为zhengshu
zhengshu distance; //使用新名字
//包含daoc++的标准输入输出头文件
#include
//C++标准程序库中的所有标识符都被定义于名为std的namespace中。
using namespace std;
int main() {
//数据类型
int age;//用来表示年龄
double score;//用来表示分数
char gender;//用来表示性别
bool b;//用来表示真假
return 0;
}
常量是固定值,在程序执行期间不会改变。
这些固定的值,又叫做字面量。
比如pai = 3.124.. 已经规定好了
在 C++ 中,有两种简单的定义常量的方式:
使用 #define 预处理器。
使用 const 关键字。
#include
using namespace std;
//定义常量
#define PI 3.14 //预处理器形式
const double pai = 3.14; //const关键字形式
int main() {
cout << "常量输出:" << PI << endl;
cout << "常量输出:" << pai << endl;
//pai = 3.1415; //常量的值不允许修改
//PI = 3.1415; //常量的值不允许修改
return 0;
}
1.概念:可以改变的值,实质是内存的别名,
想要知道内存中存放变量的地址可以在变量名前加&符号
2.命名规则:
变量名可以由字母,数字,下划线组合而成必须以字母或下划线开头
C++语言中的某些词(main include等)成为保留字,具有特殊意义,不能用作变量名
C++语言区分大小写price和PRICE是两个不同的变量
#include
using namespace std;
int main() {//定义在函数体当中的变量为局部变量 只能在当前函数体内使用
//定义变量
int a;
a = 10;
cout << "变量a输出:" << a << endl;
int b = 20;
cout << "变量b输出:" << b << endl;
b = 40;
cout << "变量b修改后输出:" << b << endl;
int c, d;
c = 3;
d = 4;
cout << "变量c的值为:"<< c <<",变量d的值为" << d << endl;
int e = 1, f = 2;
cout << "变量e的值为:" << e <<",变量f的值为"<< f << endl;
return 0;
}
#include
using namespace std;
int i; //定义在函数体外的变量为全局变量 可以在当前文件中使用
int main() {
//定义在函数体当中的变量为局部变量 只能在当前函数体内使用
//定义变量
int a = 10;
cout << "变量a输出:" << a << endl;
i = 30;
cout << "变量i输出:" << i << endl;
return 0;
}
void eat() {
//a = 11; //提示未定义访问不到
i = 31; //不提示错误证明可以访问到
}
#include
using namespace std;
int main() {
short s = 1;
int i = 2;
long l = 3;
char c = 'a';
cout <<s<<i<<l<<c<<endl;
i = 2200000000;//选用数据类型时 注意是否超出范围
cout <<i<<endl; //如果超出范围则输出错误的值
int c11, d; //--> int c11; int d;
int e = 1, f = 2;//-->int e = 1; int f = 2;
float ff = 3.14f; //浮点数类型后面加f
double dd = 3.14;
//char类型
char cs = 'a';//char类型的值要用单引号引起来
char cc = ' ';//char类型的值不能啥也没有哪怕是一个空格也可以
char ccc = '\n';//表示转义字符
char c1 = 98;//ASCII码
cout <<c1<<cs<<ccc<<endl;
//类型转换
short st1 = 20;
int it1 = st1;
cout <<"it1的值为:"<<it1<<endl;
long l1 = 20000L;
int it2 = (int)l1;
cout <<"it2的值为"<<it2<<endl;
return 0;
}
#include
using namespace std;
int main() {
int x;
float y;
cout << "请输入一个整数:" << endl;
cin >> x;
cout << "您输入的整数为:" << x << endl;
cout << "请输入一个小数:" << endl;
cin >> y;
cout << "您输入的小数的值为:" << y << endl;
int xx;
float yy;
cout << "请输入一个整数和小数:" << endl;
cin >> xx >> yy; //输入时空格分隔两个数
cout << "您输入的整数为:" << xx << endl;
cout << "您输入的小数的值为:" << yy << endl;
return 0;
}
+ - * / % ++ --
#include
using namespace std;
int main() {
int A = 10, B = 5;
//算数运算符的各种运算
cout <<"A=10,B=5"<<endl;
cout <<"A+B="<<A + B<<endl;
cout <<"A-B=" << A - B<<endl;
cout <<"A*B=" << A * B<<endl;
cout <<"A/B=" << A / B<<endl;
//取模,表达式中书写了A%%B,其中两个%表示输出一个%
cout <<"A%%B=" << A % B<<endl;
int a = 1, b = 2, c = 3, d = 0;
cout <<"a,b,c的值为:" << a << b << c<<endl;
cout <<"a++的值为:" << a++<<endl;
cout <<"a的值为:" << a<<endl;
cout <<"++a的值为:" << ++a<<endl;
cout <<"a的值为:" << a<<endl;
a = 1, b = 2, c = 3, d = 0;
// 1 2 3 3 3
d = a++ + a + ++b + b + ++a; //在下一次计算时才会得到所有加一后的值
cout <<"d的值为:" << d<<endl;
return 0;
}
(比较是否相等) != > < >= <=
#include
using namespace std;
int main()
{
int a = 10;
int b = 5;
//1为真 0为假
cout <<"a=" << a<<"b="<<b<<endl;
cout <<"a>b:"<<(a > b)<<endl;
cout <<"a<<(a < b)<<endl;
cout <<"a>=b:"<<(a >= b)<<endl;
cout <<"a<=b:"<<(a <= b)<<endl;
cout <<"a==b:"<<(a == b)<<endl;
cout <<"a!=b:"<<(a != b)<<endl;
return 0;
}
&& || !
#include
using namespace std;
int main()
{
int d = 1;
int e = 2;
int f = 3;
cout <<"d > e && f < e = "<<(d > e && f < e)<<endl;//0
cout <<"ef = " <<(e<f || d>f)<<endl;//1
cout <<"!(f > d) = "<<(!(f > d))<<endl;//0
return 0;
}
= (赋值) += -= *= /= %=
#include
using namespace std;
int main()
{
int a = 10;
int b = 20;
int c = 0;
c = a + b;
cout <<"a+b结果为:"<<c<<endl;//30
c += a;
cout <<"a+=b结果为:"<<c<<endl;//40
c -= a;
cout <<"a-=b结果为:"<<c<<endl;//30
c /= 1;
cout <<"a/=b结果为:"<<c<<endl;//30
b %= 2;
cout <<"a%b结果为:"<<b<<endl;//0
return 0;
}
&(按位与) |(或) ^(异或) ~(非) <<(左移) >>(右移)
/**
* 位运算符
* &(按位与) |(或) ^(异或) ~(非) <<(左移) >>(右移)
*
* 二进制
* 十进制转换二进制
*
* 13 二进制 1101
*
* 2048 1024 512 256 128 64 32 16 8 4 2 1 权次方
* 1 1 0 1
* 154 1 0 0 1 1 0 1 0
* 685 1 0 1 0 1 0 1 1 0 1
* 1250 1 0 0 1 1 1 0 0 0 1 0
* 243 1 1 1 1 0 0 1 1
* 684 1 0 1 0 1 0 1 1 0 0
* 60 1 1 1 1 0 0
**/
#include
using namespace std;
int main() {
int a = 60;
//二进制:111100
int b = 13;//二进制:001101 1101前面的0是补上去的 正数补0负数补1 为了和要比较的二进制位数一致
int c = 0; //
c = a & b; // 二进制:001100 相对应的位都为1时结果为1
cout <<"c的值为:"<<c<<endl;//12 二进制 1100
c = a | b;//二进制:111101相对应的只要有一个为1结果为1 111101
cout <<"c的值为:"<<c<<endl;//61 二进制 111101
c = a ^ b;//二进制:110001相对应的位 相同为0 不同为1
cout <<"c的值为:"<<c<<endl;//49 二进制 110001
c = ~a; //二进制:000011 相对应的位 取反
cout <<"c的值为:"<<c<<endl;//-61 二进制 000011
c = a << 2; //二进制:11110000
cout <<"c的值为:"<<c<<endl;//240 二进制 11110000
c = -a >> 60;//二进制:
cout <<"c的值为:"<<c<<endl;//-1 二进制 32个1
return 0;
}
(三元运算符) 表达式1?表达式2:表达式3 -> 3>2?3:2
#include
using namespace std;
int main() {
int a = 10, b = 5, c = 0;
c = a > b ? a : b;
cout<<"c的值为:"<<c<<endl;
return 0;
}
1.单分支if语句
如果...就...
if(条件){条件成立后我们要做的事}
2.if-else语句
如果...就...否则...
if(条件){条件成立后我们要做的事}else{条件不成立我们要做的事}
需求:判断用户年龄 如果年龄满18我们就输出 欢迎光临 否则输出 谢绝入内
#include
using namespace std;
int main() {
//需求:判断用户年龄
//如果年龄满18我们就输出 欢迎光临
//否则输出 谢绝入内s
cout <<"请输入年龄:"<<endl; //给用户一个提示
int age;
cin >> age; //获取用户在控制输入的值,并给age赋值
if (age >= 18) {
cout <<"欢迎光临"<<endl;
}
else {
cout <<"谢绝入内"<<endl;
}
return 0;
}
3.if-esle if语句
如果...就...否则 如果(可能有多个)...就 ...否则...
if(条件1){条件1成立后我们要做的事}
else if(条件2){条件2成立后我们要做的事}
.可以有多个
else(前面所有条件都不满足我们要做的事)
需求:判断春夏秋冬
#include
using namespace std;
int main() {
//需求:判断春夏秋冬
// 1 2 3春
// 4 5 6夏
// 7 8 9秋
// 10 11 12冬
// 要求 : 用户输入的形式
// 至少三种方式实现 && || if嵌套
cout << "请输入月份:" << endl;
int month;
cin >> month;
if (month <= 3) {
cout <<"春天在这里"<<endl;
}
else if (month >= 4 && month <= 6) {
cout <<"最爱的夏天来了"<<endl;
}
else if (month >= 7 && month <= 9) {
cout <<"落叶秋"<<endl;
}
else if (month >= 10 && month <= 12) {
cout <<"冻感超人"<<endl;
}
else {
cout <<"月份错误"<<endl;
}
return 0;
}
4.if嵌套
需求:如果分数大于60输出及格
否则如果小于60输出挂科
否则输出 谢天谢地
#include
using namespace std;
int main() {
//需求:如果分数大于60输出及格
//否则如果小于60输出挂科
//否则输出 谢天谢地
int score;
cin >> score;
if (score > 60 && score <= 100) {
cout <<"及格"<<endl;
}
else if (score < 60 && score >= 0) {
cout <<"挂科"<<endl;
}
else {
if (score > 100 || score < 0) {
cout <<"成绩错误"<<endl;
}
else {
cout <<"谢天谢地"<<endl;
}
}
cout <<"=============================="<<endl;
if (score > 60) {
if (score <= 100) {
cout <<"及格"<<endl;
}
else {
cout <<"成绩错误"<<endl;
}
}
else if (score < 60) {
if (score >= 0) {
cout <<"挂科"<<endl;
}
else {
cout <<"成绩错误"<<endl;
}
}
return 0;
}
5.switch case
switch (值) {//整型 字符 Enum枚举
case 值:语句; break;
...
...
...
default:语句; break;
}
需求:判断春夏秋冬
1 2 3春
4 5 6夏
7 8 9秋
10 11 12冬
#include
using namespace std;
int main() {
cout <<"请输入月份:"<<endl;
int month;
cin >> month;
switch (month) {//整型 字符 Enum枚举
case 1:
case 2:
case 3:cout <<"春"<<endl; break;
case 4:
case 5:
case 6:cout <<"夏"<<endl; break;
case 7:
case 8:
case 9:cout <<"秋"<<endl; break;
case 10:
case 11:
case 12:cout <<"冬"<<endl; break;
default:cout <<"没有当前月"<<endl; break;
}
return 0;
}
循环语句是由循环体及终止语句两部分组成,循环体就是要重复执行的操作
1.while循环
while(循环条件){循环操作}
特点:先判断,再执行
#include
using namespace std;
int main() {
//需求:输出10次我要成功!
int i = 0;
while (i < 10)
{
cout << "我要成功!" << endl;
i++;
}
return 0;
}
2.do while循环
do{循环操作}while(循环条件);
特点:先执行一次,再判断
#include
using namespace std;
int main() {
//需求:输出10次我要成功!
int i = 0;
do {
cout<<"我要成功!"<<endl;
i++;
} while (i < 10);
return 0;
}
3.for循环
for(1;2;3){4}
1.初始值(从几开始循环)
2.条件(boolean类型的结果)
3.每次循环对初始值的改变
4.循环体(重复要做的事情)
执行顺序:1 2 4 3 2 4 3 2 4 3 ...直到2条件不成立 循环结束
#include
using namespace std;
int main() {
//需求:输出1~100的偶数
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) {//打出偶数个
cout<<"当前i的值为:"<<i<<endl;
}
}
return 0;
}
4.continue和break(通常与条件语句同时使用)
continue:继续下一次循环
break:跳出整个循环
#include
using namespace std;
int main() {
//1:50层楼 模拟电梯 第8楼和第9楼位同一家公司电梯只停8楼,9楼不停
//2:40层及以上为私人住所电梯不上去
for (int i = 1; i <= 50; i++) {
if (i == 9) {
continue;
}
else if (i > 39) {
break;
}
cout<<"电梯当前在第"<<i<<"层"<<endl;
}
return 0;
}
5.各循环的无限循环
while(true){循环操作}
do{循环操作}while(true);
for(;;){循环操作}
#include
using namespace std;
int main() {
/*for (;1==1;) {
cout<<"a"<
/*for (;true;) {
cout<<"a"<
/*for (;;) {
cout<<"a"<
/*while (1==1) {
cout<<"a"<
/*while (true) {
cout<<"a"<
/*do {
cout<<"a"<
/*do {
cout<<"a"<
return 0;
}
6.小练习
#include
using namespace std;
int main() {
//需求1:计算1+2+3+4+...100的结果
int x = 0;
for (int i = 1; i <= 100; i++) {
x = x + i;//x+=i;
cout<<x<<endl;
}
return 0;
}
#include
using namespace std;
int main() {
//需求2:找出100到999之间所有的水仙花数(153 = 1*1*1 + 5*5*5 +3*3*3)
int g, s, b;
for (int i = 100; i < 1000; i++) {
g = i % 10;
s = i % 100 / 10;
b = i / 100;
if (i == g * g * g + s * s * s + b * b * b) {
cout<<i<<endl;
}
}
return 0;
}
#include
using namespace std;
int main() {
//需求:循环输入5个学生的成绩 计算5个学生的总分及平均分
int sum = 0;
for (int i = 1; i <= 5; i++) { //5个学生成绩的循环输入
cout<<"请输入第%d个学生的成绩:"<<i<<endl;
double score; //获取输入的成绩
cin>>score;
sum += score; //计算总分
}
cout << "总分为:" << sum << endl;
cout << "平均分为:" << (sum / 5.0) << endl;
return 0;
}
#include
#include //使用随机数
#include
using namespace std;
int main() {
while (true) {
int numWj = 0;//玩家出的拳(数字)
//生成随机数之前必须先调用 srand() 函数。
//使用了 time() 函数来获取系统时间的秒数
//否则返回一个伪随机数每次游戏生成随机数顺序一样
srand((unsigned)time(NULL));// 设置种子
int numDn = rand() % 3 + 1; //电脑随机出拳(数字)
cout<<"请出拳:1-石头 2-剪刀 3-布 0-退出"<<endl;
cin>>numWj;
if (numWj > 3 || numWj < 0) {
cout << "请正确出拳!" << endl;
}
else if (numWj == 0) {
break;
}
else {
/* 1 2 3
-1 */
if (numWj - numDn == -1 || numWj - numDn == 2) {//玩家赢的局
cout << "你出的是"
<< (numWj == 1 ? "【石头】," : numWj == 2 ? "【剪刀】," : "【布】,")
<<"电脑出的是"
<< (numDn == 1 ? "【石头】," : numDn == 2 ? "【剪刀】," : "【布】,")
<<"恭喜你,你赢了!" << endl;
}
else if (numWj - numDn == -2 || numWj - numDn == 1) {//玩家输的局
cout << "你出的是"
<< (numWj == 1 ? "【石头】," : numWj == 2 ? "【剪刀】," : "【布】,")
<< "电脑出的是"
<< (numDn == 1 ? "【石头】," : numDn == 2 ? "【剪刀】," : "【布】,")
<< "再接再厉哦,你输了!" << endl;
}
else {
cout << "你出的是"
<< (numWj == 1 ? "【石头】," : numWj == 2 ? "【剪刀】," : "【布】,")
<< "电脑出的是"
<< (numDn == 1 ? "【石头】," : numDn == 2 ? "【剪刀】," : "【布】,")
<< "太有默契了,你们打平了!" << endl;
}
}
}
return 0;
}
概念:连续等大的存储空间,类型相同的数据集合
定义:类型 数组名 [数组大小]
int arr[3]; //只定义不赋值
int arr1[3]={1,2,3}; //完全列举法
int arr2[3]={1,2}; //部分列举法
int arr3[]={1,2,3,4}; //省略大小列举法
如何访问数组元素:
通过数组下标来访问,数组下标从0开始
#include
using namespace std;
int main() {
int arr[3]; //只定义不赋值
int arr1[3] = { 1,2,3 }; //完全列举法
int arr2[3] = { 1,2 }; //部分列举法
int arr3[] = { 1,2,3,4 }; //省略大小列举法
//通过下标获取数组中的元素
cout<<"获取数组中的元素:"<< arr1[1]<<endl;
//给数组赋值
arr[0] = 1;
arr[1] = 2;
cout<<"arr数组赋值后的第一个元素为:"<<arr[0]<<endl;
//未被赋值的数组元素 数组在全局时默认为0 局部时为随机值
cout<<"arr数组未赋值的空间元素为:"<< arr[2]<<endl;
//数组遍历
for (int i = 0; i < 4; i++) {
cout<<"遍历arr3数组中的元素:"<< arr3[i]<<endl;
}
return 0;
}
//循环给数组赋值
#include
using namespace std;
int main()
{
int a[100];
for (int i = 0; i < 100; i++)
{
a[i] = i+1;
}
cout<<"遍历数组:"<<endl;
for (int i = 0; i < 100; i++)
{
cout<<a[i]<<endl;
}
return 0;
}
/**
* 对数组元素求最大值、最小值
*/
#include
using namespace std;
int main()
{
//num[5]存放要排序的数字
//max,min 最大值,最小值
//i 循环变量
int num[5], max, min, i;
/*循环输入5个数字*/
cout<<"请输入5个数字:"<<endl;
for (i = 0; i < 5; i++)
{
cin>>num[i];
}
//默认将最大值、最小值均设置为数组的第一个元素
max = num[0];
min = num[0];
/**
*循环遍历数组
*将max与每个数组元素相比较,求出最大值
*将min与每个数组元素相比较,求出最小值
*i从1开始,即从数组第二个元素开始,是因为我们默认了max=min=num[0]
*所以不需要与数组第一个元素比较
*/
for (i = 1; i < 5; i++)
{
//如果当前数组元素比当前max还大,则将该数组元素设置为最大值
if (max < num[i])
{
max = num[i];
}
//如果当前数组元素比当前min还小,则将该数组元素设置为最小值
if (min > num[i])
{
min = num[i];
}
}
//输出最大值和最小值
cout<<"最大值为:"<< max<<endl;
cout<<"最小值为:"<< min<<endl;
return 0;
}
/**
* 冒泡排序:相邻的两个数字两两比较 较大的放在后面
* int [] x = {6,3,8,2,9,1};
* 从小到大排序:6 3 8 2 9 1-->1 2 3 6 8 9
*
* 第一趟:6 3 8 2 9 1
* 第一次:3 6 8 2 9 1
* 第二次:3 6 8 2 9 1
* 第三次:3 6 2 8 9 1
* 第四次:3 6 2 8 9 1
* 第五次:3 6 2 8 1 9
* 第二趟:3 6 2 8 1 9
* 第一次:3 6 2 8 1 9
* 第二次:3 2 6 8 1 9
* 第三次:3 2 6 8 1 9
* 第四次:3 2 6 1 8 9
* 第三趟:3 2 6 1 8 9
* 第一次:2 3 6 1 8 9
* 第二次:2 3 6 1 8 9
* 第三次:2 3 1 6 8 9
* 第四趟:2 3 1 6 8 9
* 第一次:2 3 1 6 8 9
* 第二次:2 1 3 6 8 9
* 第五趟:2 1 3 6 8 9
* 第一次:1 2 3 6 8 9
*
* 趟数=总数-1
* 次数为每趟-1
* */
#include
using namespace std;
#define SIZE 6
int main() {
int x[] = { 6,3,8,2,9,1 };
cout<<"排序前输出"<<endl;
for (int i = 0; i < SIZE; i++) {
cout<<x[i]<<endl;
}
for (int i = 0; i < SIZE - 1; i++) {
for (int j = 0; j < SIZE - 1 - i; j++) {
if (x[j] > x[j + 1]) {
//借助第三块空间
/*int n = x[j];
x[j] = x[j+1];
x[j+1] = n;*/
// c a b
x[j] = x[j] ^ x[j + 1];
// a c b
x[j + 1] = x[j] ^ x[j + 1];
// b c a
x[j] = x[j] ^ x[j + 1];
}
}
}
cout<<"排序后输出"<<endl;
for (int i = 0; i < SIZE; i++) {
cout<<x[i]<<endl;
}
return 0;
}
1.理解:函数相当于一系列逻辑的集合
2.为什么使用函数:
使程序变得更简短而清晰
有利于程序为维护
可以提高程序开发的效率
提高代码的复用性
3.函数类型:
库函数
由C++语言系统提供
用户无须定义,也不必在程序中作类型说明
只需在程序前包含有该函数定义的头文件即可使用
自定义函数
用户在程序中根据需要而编写的函数
函数的定义
返回值类型 函数名 参数列表 函数体
void eat () {}
函数原型声明
在形式上与函数头部类似,最后加一个分号
原型声明中参数表里的参数名可以不写(只写参数类型)
#include
using namespace std;
int count(int,int);
int main(){
return 0;
}
int count(int x,int y){
return x+y;
}
函数的调用
通过在程序中使用函数名称,可以执行函数中包含的语句,称为函数调用
函数名(参数列表)
函数的形参和实参
形参:定义函数时的参数
实参:调用函数时传过来的参数
#include
using namespace std;
void test1();
void test2(int a);
void test3(int a, int b);
int test4();
int test5(int, int); //声明可以不写参数名
int main() {
//函数调用
test1();
test2(2);
test3(1, 2);
int a = test4();
cout<<"调用test4函数得到的返回值为:"<<a<<endl;
int b = test5(2, 3);
cout<<"调用test5函数得到的返回值为:"<<a<<endl;
return 0;
}
//没有参数没有返回值的函数
void test1() {
cout<<"我是没有参数没有返回值的test1函数"<<endl;
}
void test2(int a) {
a = a + 1;
cout<<"我是有1个参数没有返回值的test2函数"<<a<<endl;
}
void test3(int a, int b) {
int c = a + b;
cout<<"我是有2个参数没有返回值的test3函数"<<c<<endl;
}
int test4() {
cout<<"我是没有参数有返回值的test4函数"<<endl;
return 4;
}
int test5(int a, int b) {
cout<<"我是有参数有返回值的test5函数"<<endl;
return a + b;
}
#include
using namespace std;
/*求最大值函数*/
int max(int a, int b)
{
if (a > b)
{
return a;
}
return b;
}
void main()
{
int m = max(5, 8);
cout<<"最大值:"<< m<<endl;
}
/*
根据边长计算长方形的周长及面积,用函数完成
函数定义:double getArea(double c){}
double getGirth(double c){}
*/
#include
using namespace std;
//定义函数,计算面积
double getArea(double c, double k)
{
//计算,并返回面积
return c * k;
}
//定义函数,计算周长
double getGirth(double c, double k)
{
//计算,并返回周长
return (c + k) * 2;
}
int main() {
//定义变量
double c, k;
cout << "请输入长方形的长:" << endl;
cin>>c;
cout<<"\n请输入长方形的宽:" << endl;
cin>>k;
//调用函数,并输出面积
cout<<"正方形的面积是"<<getArea(c, k) << endl;
cout<<"正方形的周长是:"<<getGirth(c, k) << endl;
return 0;
}
指针:专门存放变量地址的变量
指针变量声明的一般形式为:数据类型 *变量名=初始地址值;
指针运算符有&和*运算符
&:取变量的地址
*:取指针指向变量的内容
两者互为逆运算
#include
using namespace std;
int main() {
int a;
int* b = &a; //指针的类型必须与指针所指向的类型一致
int c;
int* d = &c;
int* e = d; //用已初始化指针变量做初值
int* ip; /* 一个整型的指针 */
double* dp; /* 一个 double 型的指针 */
float* fp; /* 一个浮点型的指针 */
char* ch; /* 一个字符型的指针 */
//cout<<"未赋值的指针变量:"<
//指针变量需要先赋值,再使用
//dp = 2.5;//不允许把一个数赋予指针变量
int* f, g;
cout << "请输入一个数字:" << endl;
cin>>g;
f = &g;
cout << "你输入的数字是:" << *f << endl;
return 0;
}
星号是用来指定一个变量是指针。以下是有效的指针声明:
int i;
int *p = &i; 指针的类型必须与指针所指向的类型一致
int i;
int *p = &i;
int *q = p; 用已初始化指针变量做初值
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch /* 一个字符型的指针 */
注意:指针变量需要先赋值,再使用,不允许把一个数赋予指针变量
所有指针的值都是一个代表内存地址的长的十六进制数。
不同数据类型的指针之间唯一的不同是,
指针所指向的变量或常量的数据类型不同。
1.方便的使用字符串
2.有效地表示复杂的数据结构
3.动态分配内存
4.得到多于一个的函数返回值
#include
using namespace std;
int main() {
/*用传统数组形式*/
/*int i, a[10];
cout<<"请输入十个数字组成数组a:"<>a[i];
}
cout<<"输出a数组中的所有元素:"<
/*采用指针变量表示的地址法输入输出数组各元素*/
int i, a[10], * p = a;//数组名表示数组首地址->*p=&a[0];
cout<<"请输入十个数字组成数组a:"<<endl;
for (i = 0; i < 10; i++) {
cin>> *(p + i);//a[i]->*(a+i)
}
cout<<"输出a数组中的所有元素:"<<endl;
for (i = 0; i <= 9; i++) {
cout << *(p + i);
}
cout<<" "<<endl;
/*采用数组名表示的地址法输入输出数组各元素*/
int ii, aa[10];
cout<<"请输入十个数字组成数组a:"<<endl;
for (ii = 0; ii < 10; ii++) {
cin >> *(aa + ii);
}
cout<<"输出aa数组中的所有元素: "<<endl;
for (ii = 0; ii <= 9; ii++) {
cout << *(aa + ii);
}
cout<<" "<<endl;
/*采用指针变量表示的下标法输入输出数组各元素*/
int iii, aaa[10], * ps = aaa;
cout<<"请输入十个数字组成数组a:"<<endl;
for (iii = 0; iii < 10; iii++) {
cin>>ps[iii];
}
cout<<"输出aaa数组中的所有元素:"<<endl;
for (iii = 0; iii <= 9; iii++) {
cout<<ps[iii];
}
cout<<" "<<endl;
/*采用指针法输入输出数组各元素*/
int is, as[10], * pp = as;
cout<<"请输入十个数字组成数组a:"<<endl;
for (is = 0; is < 10; is++) {
cin >> *pp++;
}
pp = as; //重新将指针指向数组a的首地址
cout<<"输出as数组中的所有元素: "<<endl;
for (is = 0; is <= 9; is++) {
cout<<*pp++;
}
cout<<" "<<endl;
return 0;
}
#include
using namespace std;
#define N 5
int main() {
int score[N];
int* p = score;
for (int i = 0; i < N; i++) {
cout<<"请输入第"<<(i+1)<<"个学生的成绩:";
cin>>*(p + i);
}
cout << " " << endl;
for (int i = 0; i < N; i++) {
cout<<"成绩为:"<<score[i];
}
cout << " " << endl;
for (int i = 0; i < N; i++) {
cout<<"成绩为:"<< *(score + i);
}
cout << " " << endl;
for (int i = 0; i < N; i++) {
cout<<"成绩为:"<< *(p + i);
}
return 0;
}
C++语言中函数参数的传递方式有两种
1.值传递:实参传递给形参 对形参的操作 不影响实参
2.地址传递:实参地址传递给形参 对形参的操作 影响实参
#include
using namespace std;
void test1(int);
void test2(int*);
int main() {
int a = 0;
test1(a);
//test2(&a);
cout<<a;
return 0;
}
void test1(int a) {//值传递
a = 10; //给参数赋值看a的值会不会影响
}
void test2(int* a) {//地址传递
*a = 10; //给参数赋值看a的值会不会影响
}
数组形式
指针形式
#include
using namespace std;
int getMin(int[]);
int getMax(int*);
int main() {
int arr[5];
int min;
int max; //存放找到的最大值
cout<<"请输入5个不同的值,存储在数组中"<<endl;
for (int i = 0; i < 5; i++) {
cin>>arr[i];
}
min = getMin(arr);
max = getMax(arr);
cout<<"数组中最小的值为:"<<min << endl;
cout<<"数组中最大的值为:"<< max << endl;
return 0;
}
int getMin(int a[]) {
int num = a[0]; //默认先赋值为数组中第一个元素
for (int i = 0; i < 5; i++) {
if (num > a[i]) {
num = a[i];
}
}
return num;
}
int getMax(int* ptr) {
int num = *ptr;
for (int i = 0; i < 5; i++) {
if (num < *ptr) {
num = *ptr;
}
ptr++; //移动指针
}
return num;
}
C++ 提供了以下两种类型的字符串表示形式:
C 风格字符串
通常用一个字符数组来存放一个字符串字符数组末尾有一个空字符\0
C++ 引入的 string 类类型
#include
using namespace std;
int main()
{
char name1[15] = { 'W','a','n','g','L','i','\0' };
char name2[15] = "WangLi"; //系统自动加空字符
char name3[15];
//省略数组大小,系统自动计算,
//大小为字符总数+1,最后一位存入空字符
char password[] = "12345678";
cout << "请输入一个姓名:";
cin >> name3;
cout << name3 << endl;
cout << password << endl;
return 0;
}
1 strcpy(s1, s2);
复制字符串 s2 到字符串 s1。
2 strcat(s1, s2);
连接字符串 s2 到字符串 s1 的末尾。
3 strlen(s1);
返回字符串 s1 的长度。
4 strcmp(s1, s2);
如果 s1 和 s2 是相同的,则返回 0;如果 s1s2 则返回大于 0。
5 strchr(s1, ch);
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6 strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
#include
#include //string类型字符串引入
using namespace std;
int main(){
string str1 = "Hello";
string str2 = "World";
string str3;
// 复制 str1 到 str3
str3 = str1;
cout << "str3 : " << str3 << endl;
// 连接 str1 和 str2
str3 = str1 + str2;
cout << "str1 + str2 : " << str3 << endl;
// 连接后,str3 的总长度
int len = str3.size();
cout << "str3.size() : " << len << endl;
return 0;
}