#include <iostream>
using namespace std;
int main()
{
cout << "hello world!" << endl;
return 0;
}
————————————————————————————————————
知识点一,用sizeof测量数据类型的长度
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
cout << sizeof(double) << endl;
return 0;
}
————————————————————————————————————
知识点二,信息输出cout
//打印Alan的信息
#include <iostream>
#include <windows.h>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
//设定Alan的能力信息
SetConsoleTitle ("Alan能力信息"); //set console title 设置 控制台 标题
double attack = 9999; //伤害=9999
double attack_growth = 9999; //伤害成长值
double attack_distance = 9999; //攻击距离
double defence = 9999; //防御值
double defence_growth = 9999; //防御成长值
//打印出上述信息
cout << "名称:Alan能力信息" << endl;
cout << "伤害:" << attack << "(+" << attack_growth << ")" << endl;
cout << "攻击距离" << attack_distance << endl;
cout << "防御:" << defence << "(+" << defence_growth << ")" << endl;
return 0;
}
——————————————————————————————————
知识点三,信息输入cin
#include <iostream>
#include <iomanip>
#include <cmath>
#include <string>
using namespace std;
int main()
{
int num;
string ch;
cout << "Please input a number and a word:";
cin >> num; //等同于scanf("%d",&num);
cin >> ch;
cout << num << "\t" << ch << endl;
return 0;
}
————————————————————————————————
知识点四,左对齐cout<<left,打印宽度setw(8),设定空格处填充setfill('_')
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double attack1 = 111;
double attack2 = 222;
double attack3 = 333;
cout << left; //左对齐
cout << setfill('_'); //加上这一句,空格的地方会用下划线填充,不加的话就是空格填充。单引号中内容可随意更改
cout << setw(8) << attack1 <<
setw(8) << attack2 <<
setw(8) << attack3 << endl; //setw(8) 宽度为8个字符
return 0;
}
——————————————————————————————————————
知识点五,判断对错
#include <iostream>
using namespace std;
int main()
{
bool flag = true; //bool类型赋值,只有两个值,true或者false
cout << boolalpha; //有了这一句,之后判断对错,输出的就是上面定义的true或者false。没有这一句,判断对错时输出的是1或0
cout << "15>88吗?" << (15 > 88) << endl;
cout << "16<88吗?" << (16 < 88) << endl;
return 0;
}
————————————————————————————————————
知识点六,测量数据类型在内存占多少字节 sizeof
cout<<sizeof(12)<<endl;
————————————————————————————————————
知识点七,运算符?:
int num = 5 > 6 ? 10 : 12; //?之前的结果为真,输出10,结果为假,输出12
————————————————————————————————————
知识点八,if else
//判断用户输入的字符是否是合法硬盘盘符
#include <iostream>
using namespace std;
int main()
{
char pan = '\0';//默认值设置为空字符
cout << "请输入一个大写字符,我来判断是否合法:" << endl;
cin >> pan;//输入的字符赋值到pan这个变量中去
if (pan >= 'A'&&pan <= 'Z')
{
cout << "是合法盘符" << endl;
}
else
{
cout << "非合法盘符" << endl;
}
}
——————————————————————————————————
知识点九,if else 应用,购物车商品结算
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
int main()
{
double LV = 35000.0, Hermes = 11044.5, Chanel = 1535.00, zongji, jiesuan;
char shangpinming1, shangpinming2, shangpinming3;
int shuliang1,shuliang2,shuliang3;
cout << "节日打折,总价>50000就打7折,否则打9折" << endl;
cout << "下列是商品价格清单" << endl;
cout << "LV = 35000.0\tHermes = 11044.5\tChanel = 1535.00"<< endl;
cout << "请选择商品数量" << endl;
cin >> shuliang1;
cin >> shuliang2;
cin >> shuliang3;
cout << "确认订单" << endl;
cout <<"LV价格"<< LV <<' '<< "数量" << shuliang1 << '\t'
<<"Hermes价格"<< Hermes <<' '<< "数量" << shuliang2 << '\t'
<<"Chanel价格"<< Chanel<<' ' << "数量" << shuliang3 << endl;
zongji = LV * shuliang1 + Hermes * shuliang2 + Chanel * shuliang3;
if (zongji > 50000)
{
jiesuan = zongji * 0.07;
}
else
{
jiesuan = zongji * 0.09;
}
cout << "原价总计" << zongji << endl;
cout << "折后金额为" << jiesuan << endl;
}
————————————————————————————————————
知识点十,if else if
————————————————————————————————————
知识点十一,switch case break default
#include <iostream>
using namespace std;
int main()
{
int choice ;
cout << "1为战士,2为法师,3为术士,4为医师" << endl;
cout << "请选择职业" << endl;
cin >> choice;
switch (choice)
{
case 1: cout << "您选择了战士" << endl; break;
case 2: cout << "您选择了法师" << endl; break;
case 3: cout << "您选择了术士" << endl; break;
case 4: cout << "您选择了医师" << endl; break;
default:cout << "您选择了退隐山林" << endl;
}
}
————————————————————————————————————
知识点十二,while循环
//1-100的累加和
#include <iostream>
using namespace std;
int main()
{
int i = 1, z = 0, n = 1;
while(i<=100)
{
z = z + i;
i++;
}
cout << z << endl;
}
——————————————————————————————————
知识点十三,while 和 if 的综合运用 创建用户名、密码,登录时三次输入错误强制退出
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main()
{
string password, name, password2, name2;
int i = 0, n=3;
cout << "请创建用户名:" << endl;
cin >> name;
cout << "请创建密码" << endl;
cin >> password;
cout << "已创建新账户\n" << "用户名:" << name << '\t' << "密码:" << password << endl;
while (i < 3)
{
cout << "请重新登陆" << endl;
cout << "用户名:" << endl;
cin >> name2;
cout << "密码:" << endl;
cin >> password2;
i++;
if (name2 != name || password2 != password)
{
if (i < 3)
{
cout << "用户名或密码不存在,请重新输入\t" << "已尝试次数" << i << endl;
}
else
{
cout << "3次输入错误,系统强制退出!" << endl;
exit(0);
}
}
else
{
cout << "登陆成功" << endl;
exit(0);
}
}
}
——————————————————————————————————————————————
知识点十四,do while
先执行do,再while判断
——————————————————————————————————————————————
知识点十五,for循环
const int N=20; //const代替C中的宏定义define
for(int i = 0; i < N; i++)
{
XXXXXXX;
}
//输入六个月的工资,并计算总工资和平均工资
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double avg = 0, sum = 0, salary;
int month;
for (month = 1; month <= 6; month++)
{
cout << "请输入第" << month << "个月的工资:" << endl;
cin >> salary;
sum += salary;
}
avg = sum / 6;
cout << "总工资是" << sum << '\t' << "平均工资是" << avg << endl;
}
——————————————————————————————————————————————
知识点十六,已知1997年7月1日是星期二,打印出1997年7月的月历
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
cout << "1997年7月的月历:" << endl;
int day = 31, week = 2;
cout << "一\t二\t三\t四\t五\t六\t日\t" << endl;
//打印\t
for (int i = 0; i < week - 1; i++) //自此往下,原理搞不懂就背下来
{
cout << '\t';
}
//打印日子
for (int i = 1; i <= day; i++)
{
cout << i;
if ((i + week - 1) % 7==0)
{
cout << '\n';
}
else
{
cout << '\t';
}
}
cout << endl;
}
——————————————————————————————————————————
知识点十七,跳过本次循环,进行下一次循环 continue
循环输入五个玩家的消费,统计消费额低于500的玩家数量
#include <iostream>
using namespace std;
int main()
{
double money; //消费额
int count = 0; //计数器
int i = 0;
for (i = 0; i < 5; i++)
{
cout << "请输入当前玩家消费额:";
cin >> money;
if (money >= 500)
{
continue; //跳过500以上的情况
}
else
{
count++;
}
}
cout << "消费额低于500的玩家数量为" << count << "人" << endl;
}
————————————————————————————————————————————
知识点十八,用continue求1-100之间
#include <iostream>
using namespace std;
int main()
{
int i, sum = 0;
for (i = 0; i <= 100; i++)
{
if (i % 2 == 1)
{
continue;
}
else
{
sum += i;
}
}
cout << "偶数和为" << sum << endl;
}
————————————————————————————————————————————
知识点十九,用双循环(嵌套)打印五行五列星星图案
#include <iostream>
using namespace std;
int main()
{
int i, j;
for (i = 0; i < 5; i++) //外层循环控制行(行数,换行)
{
for (j = 0; j < 5; j++) //内层循环控制列(列数,列的图形)
{
cout << "*"; //这个地方一次只做一件事,要么控制图形,要么控制列数,打印了*号就不能打印endl换行
}
cout << endl;
}
}
打印用星号组成的直角三角形
#include <iostream>
using namespace std;
int main()
{
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; j <= i; j++)
{
cout << "*";
}
cout << endl;
}
}
打印用星号组成的等腰三角形△
#include <iostream>
using namespace std;
int main()
{
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j <= 2 - i; j++)
{
cout << " ";
}
for (j = 0; j <= 2 * i; j++)
{
cout << "*";
}
cout << endl;
}
}
打印用星号组成的菱形◇
#include <iostream>
using namespace std;
int main()
{
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j <= 2 - i; j++)
{
cout << " ";
}
for (j = 0; j <= 2 * i; j++)
{
cout << "*";
}
cout << endl;
}
for (i = 0; i < 4; i++)
{
for (j = 0; j <= i; j++)
{
cout << " ";
}
for (j = 0; j <= 4 - 2 * i; j++)
{
cout << "*";
}
cout << endl;
}
}
上方菱形变异体,用ABC组成菱形
#include <iostream>
using namespace std;
int main()
{
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j <= 2 - i; j++)
{
cout << " ";
}
for (j = 0; j <= 2 * i; j++)
{
cout <<(char)('A' + i); //(char)是强制类型转换
}
cout << endl;
}
for (i = 0; i < 4; i++)
{
for (j = 0; j <= i; j++)
{
cout << " ";
}
for (j = 0; j <= 4 - 2 * i; j++)
{
cout << (char)('E'+i);
}
cout << endl;
}
}
——————————————————————————————————————————
知识点二十,一维数组动态赋值
//给定数组长度为5
#include <iostream>
using namespace std;
int main()
{
int num[5];
int i = 0;
for (i = 0; i < 5; i++)
{
cout << "请输入第" << (i + 1) << "个数组元素:";
cin >> num[i]; //只做一件事,这里只进行输入
}
for (i = 0; i < 5; i++)
{
cout << num[i] << endl; //只做一件事,这里只进行输出
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int num[]{ 8,4,2,1,23,344,12 };
int i;
int sum = 0;
int numLen = sizeof(num) / sizeof(int); //计算数组长度的固定公式,记住它!!但不适用于string型
for (i = 0; i < numLen; i++)
{
cout << num[i] << '\t'; //首先挨个打印出数组中的数据
}
cout << endl;
//进行累加操作
for (i = 0; i < numLen; i++)
{
sum += num[i]; //计算出数据的和
}
cout << "累加和为" << sum << '\t' << "平均值为" << sum / numLen << endl;
}
——————————————————————————————————————————————
知识点二十一,数组基本操(套)作(路)
#include <iostream>
using namespace std;
int main()
{
int num[]{ 8,4,2,1,23,344,12 };
int i;
int sum = 0;
int numLen = sizeof(num) / sizeof(int); //计算数组长度的固定公式,记住它!!但不适用于string型
for (i = 0; i < numLen; i++)
{
cout << num[i] << '\t'; //首先挨个打印出数组中的数据
}
cout << endl;
//进行累加操作
for (i = 0; i < numLen; i++)
{
sum += num[i]; //计算出数据的和
}
cout << "累加和为" << sum << '\t' << "平均值为" << sum / numLen << endl;
▼▼▼↓↓↓重点在这里↓↓↓▼▼▼
//套路1:给出一组数,求数组中的最大最小值
//下方开始找最大值
/*假设第一个元素是最大值*/
int max = num[0];
int maxIndex = 0; //最大值的下标
for (i = 1; i < numLen; i++)
{
if (num[i] > max)
{
max = num[i];
maxIndex = i; //记录最大值的下标
}
}
cout << "最大值是:" << max << "/" << num[maxIndex] << endl; //此处max / num[maxIndex]并无特殊意义,只告诉程序猿有两种编写方法,max 或者num[maxIndex]
cout << "最大值的下标是" << maxIndex << endl;
//下方开始找最小值
int min = num[0];
int minIndex = 0;
for (i = 1; i < numLen; i++)
{
if (num[i] < min)
{
min = num[i];
minIndex = i;
}
}
cout << "最小值是" << min << '/' << num[minIndex] << endl;
cout << "最小值的下标是:" << minIndex << endl;
//套路2:定义一个整形数组,赋值后,求出奇数个数和偶数个数
int Jcount = 0, Ocount = 0; //定义 奇数个数变量 和 偶数个数变量
for (i = 0; i < numLen; i++)
{
if (num[i] % 2 == 0)
{
Ocount++;
}
else
{
Jcount++;
}
}
cout << "奇数个数" << Jcount << '\t' << "偶数个数" << Ocount << endl;
//套路3:查找输入的数字在数组中的下标,没找到则下标为-1
int searchNum; //用户要查找的数字
int searchIndex = -1; //了用户查找数字的下标。后面=-1只是编程习惯,写成=-999也没问题,甚至定义成=INT_MIN也可以,因为意思是,把searchIndex设定成一个不可能的值
loop:cout << "请输入要查找的数字:";
cin >> searchNum;
//实用循环查找
for (i = 0; i < numLen; i++)
{
if (num[i] == searchNum)
{
searchIndex = i;
break;
}
}
if (searchIndex == -1)
{
cout << "您所查找的数字不存在,请重新输入" << endl;
goto loop;
}
else
{
cout << searchIndex << endl;
}
}
——————————————————————————————————————
知识点二十二,数组的常用算法 (高等级套路)
/*冒泡法:两相比较,小的放前面*/
#include <iostream>
using namespace std;
int main()
{
int nums[] = { 15,25,90,23,91 };
int i, j, temp;
for (i = 0; i < 5 - 1; i++) //外层循环控制比较轮数
{
for (j = 0; j < 4 - i; j++) //内层循环控制每轮的比较和交换
{
if (nums[j] < nums[j + 1]) //如果前面的小于后面的就交换
{
temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
}
/*选择排序:假设第一个是最小值,跟后面的值比较大小*/
#include <iostream>
using namespace std;
int main()
{
int num[]{ 8,4,2,1,23,,344,12 };
int numlen = sizeof(num) / sizeof(int); //数组长度公式,不能用于字符串数组
int min = num[0]; //假设第一个元素是最小值
int minIndex = 0; //最小值的初始下标设置为0
int temp;
for (int i = 0; i < numlen - 1; i++)
{
min = num[i];
minIndex = i;
for (int j = i + 1; j < numlen - 1; j++)
{
if (num[j] < min)
{
min = num[j];
minIndex = j;
}
}
if (minIndex > i) //交换
{
temp = num[minIndex];
num[minIndex] = num[i];
num[i] = temp;
}
}
cout << "排序后" << endl;
for (int i = 0; i < numlen; i++)
{
cout << num[i] << endl;
}
}
————————————————————————————————————————
知识点二十三,数组元素的删除和插入
#include <iostream>
using namespace std;
int main()
{
double power[99]; //数组大小一旦确定无法更改,所以预留足够大的空间
int powerCount = 0; //当前数组中的元素个数
double insertPower; //要插入的数值
int insertIndex = 0; //默认插入到第一个元素位置
power[powerCount++] = 45771;
power[powerCount++] = 42322;
power[powerCount++] = 40907;
power[powerCount++] = 40706;
double temp;
for (int i = 0; i < powerCount; i++)
{
for (int j = 0; j < powerCount - i - 1; i++)
{
if (power[j] < power[j + 1])
{
temp = power[j];
power[j] = power[j + 1];
power[j + 1] = temp;
}
}
}
cout << "排序后" << endl;
for (int i = 0; i < powerCount; i++)
{
cout << power[i] << '\t';
}
cout << endl;
//插入
cout << "请输入要插入的数字" << endl;
cin >> insertPower;
insertIndex = powerCount;
/*插入以后,保证数组仍然是有序的
1、把新数字放在数组的末尾,重新进行排序
2、找到第一个比插入数字打的位置insertIndex
从最后一个元素开始,将数字复制到后面一个元素中
3、将要插入的数字赋值给下标为insertIndex的元素*/
//1、把新数字放在数组的末尾,重新进行排序
for (int i = 0; i < powerCount; i++)
{
if (insertPower > power[i])
{
insertIndex = i;
break;
}
}
// 2、找到第一个比插入数字打的位置insertIndex。从最后一个元素开始,将数字复制到后面一个元素中
for (int i = powerCount - 1; i >= insertIndex; i--)
{
power[i + 1] = power[i];
}
//3、将要插入的数字赋值给下标为insertIndex的元素
power[insertIndex] = insertPower;
//4、将数组的总长度+1
powerCount++;
cout << "插入后" << endl;
for (int i = 0; i < powerCount; i++)
{
cout << power[i] << '\t';
}
//删除
//1、找到要删除的元素下标
double deletePower;
int deleteIndex = int INT_MIN; //INT_MIN相当于-1,表示“一个不存在的数值”
cout << "请输入要删除的数字";
cin >> deletePower;
for (int i = 0; i < powerCount; i++)
{
if (deletePower == power[i])
{
deleteIndex = i;
break;
}
}
//判断是否找到这个数字
if (deleteIndex == INT_MIN)
{
cout << "没有找到要删除的对象,删除失败!" << endl;
}
else
{
//2、从找到的下标开始,侯敏一个元素赋值给前面一个元素
for (int i = deleteIndex; i < powerCount - 1; i++)
{
power[i] = power[i + 1];
}
//3、总长度-1
powerCount--;
}
cout << "删除后:" << endl;
for (int i = 0; i < powerCount; i++)
{
cout << power[i] << '\t';
}
}
----------------------------------------------------------------------------------
知识点二十四,二维数组
//打印成绩表
#include <iostream>
#include <string> //不添加这个,cout就不能输出string型
using namespace std;
int main()
{
string stu_names[]{ "刘备","关羽","张飞" };
string course_names[]{ "语文","数学","英语" };
const int ROW = 3;
const int COL = 3;
double scores[ROW][COL];
for (int i = 0; i < ROW; i++) //外层循环控制学生(行)
{
for (int j = 0; j < COL; j++) //内层循环控制课程(列)
{
cout << stu_names[i] << "的" << course_names[j] << "成绩:";
cin >> scores[i][j];
}
}
//打印结果
cout << '\t';
for (int i = 0; i < COL; i++)
{
cout << course_names[i] << '\t';
}
cout << endl;
for (int i = 0; i < ROW; i++)
{
cout << stu_names[i] << '\t';
for (int j = 0; j < COL; j++)
{
cout << scores[i][j] << '\t';
}
cout << endl;
}
}
-----------------------------------------------------------------------------
知识点二十五,数组的替代品:向量容器vector
vector是一个快速的动态分配内存的数组 (容器) ,大小可以动态扩展,可以在运行阶段设置长度
定义和初始化:
vector<double>vec1;
vector<string>vec2(5);
vector<int>vec3(20,998); //给他20个元素,每一个元素都是998
操作方法:
#include <iostream>
#include <vector> //使用vector所需要的头文件
#include <algorithm> //使用sort所需要的头文件,这个单词的意思是“算法”
using namespace std;
int main()
{
vector<double>vecDouble = { 98.5,67.9,43.6,32.9 };
//向数组中插入数字
vecDouble.push_back(100.8); //在数组的尾部插入一个数字
//遍历1
for (int i = 0; i < vecDouble.size(); i++) //vecDouble.sizi()表示:数组大小
{
cout << vecDouble[i] << endl;
}
//遍历2:集合的通用遍历方法,使用迭代器iterator
//先得到它的迭代器
vector<double>::iterator it; //我要得到一个vector<double>类型的迭代器(得到迭代对象,实际上是一个指针对象)
//从第一个元素开始迭代
for (it = vecDouble.begin(); it != vecDouble.end(); ++it)
{
cout << *it << endl;
}
//排序
sort(vecDouble.begin(), vecDouble.end());
for (it = vecDouble.begin(); it != vecDouble.end(); ++it)
{
cout << *it << endl;
}
//逆序
sort(vecDouble.begin(), vecDouble.end());
reverse(vecDouble.begin(), vecDouble.end()); //逆序
for (it = vecDouble.begin(); it != vecDouble.end(); ++it)
{
cout << *it << endl;
}
}
---------------------------------------------------------------------------------
知识点二十六,指针(pointer)
#include <iostream>
using namespace std;
int main()
{
double num = 1024.5;
double*ptr_num = #
cout << "ptr_num的值:" << ptr_num << '\t' << &num << endl;
cout << "ptr_num指向空间的值是:" << *ptr_num << endl;
return;
}
--------------------------------------------------------------------------------
知识点二十七,空指针null pointer
用法:
int *ptr1 = nullptr; //等价于int *ptr1 = 0;
int *ptr2 = 0; //直接将ptr2初始化为字面常量0
操作:
#include <iostream>
using namespace std;
int main()
{
double *ptr_double = nullptr;
cout << ptr_double << endl;
}
如果要直接使用:int *ptr3 = NULL; //等价于int *ptr3 = 0
就需要头文件cstdlib
---------------------------------------------------------------------------------
知识点二十八,特殊指针类型 void*
可以存放任意对象的地址
#include <iostream>
using namespace std;
int main()
{
double num = 3;
double *ptr_num1 = #
void *ptr_num2 = #
cout << boolalpha;
cout << (ptr_num1 == ptr_num2) << endl;
}
----------------------------------------------------------------------------------
知识点二十九,引用reference
给对象起了另外一个名字(引用即别名)
#include <iostream>
using namespace std;
int main()
{
int int_value = 1024;
int& refValue = int_value; //赋值号右面只能写这样的变量名,不能写数值
//如果要给赋值号右边写数值,前面必须加const
const int& refValue = 100;
}
---------------------------------------------------------------------------------------
知识点三十,指针和数组
double score[]{11,22,33,44,55};
double *otr_score = score; //数组中,赋值号右边不加&
-----------------------------------------------------------------------------------
知识点三十一,指针的运算
指针的递增和递减++,--
int i;
double score[5]{98,87,65,43,76};
double *ptr_score;
ptr_score=score;
for(i=0;i<5;i++)
{
cout<<*ptr_score++<<endl; //这里指针描述的是位置
}
指针加上或减去某个整数值
int i;
double score[5]{98,87,65,43,76};
double *ptr_score;
ptr_score = &score[1];
ptr_score += 2;
cout<<*ptr_score<<endl;
ptr_score -= 3;
cout<<*ptr_score<<endl; //并不是数值+2或-3,而是位置上的加减,出现加减变化的是下标
---------------------------------------------------------------------------------------------
知识点三十二,动态分配内存
使用new分配内存,使用delete释放内存
int *ptr_int = new int;
delete ptr_int; //delete释放内存
例如
int *num = new int[5];
动态分配的数组
int *intArray = new int[10];
delete[] intArray; //delete[]释放整个数组
-------------------------------------------------------------------------------------------
知识点三十三,指针通过移动的方式访问数组
#include <iostream>
using namespace std;
int main()
{
int arrays[]{ 15,23,30,40,50 };
int *p_arrays = arrays;
for (int i = 0; i < 5; i++)
{
cout << *p_arrays++ << endl;
}
}
--------------------------------------------------------------------------------
知识点三十四,使用指针创建二维数组
#include <iostream>
using namespace std;
int main()
{
int *p = new int[10];
//使用指针创建二维数组
int(*p2)[3] = new int[5][3]; //降维,把p2当做行来操作
p2[3][2] = 998;
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 3; j++)
{
cout << p2[i][j] << endl;
}
}
}