之前在黑马程序员的零基础课程里系统学习了c++,但是黑马程序员的课程还是太慢了,近四百节课让人很难受 ,基本上前一百节后就已经对C语言了解的差不多了(和c++差不多),两百节之后对c++也基本熟悉了。
总归还是太慢了,其中课程的很多内容都是重复出现的,为了方便我将课程中可以省略的重复步骤省略,将其余内容直接以代码加注释的方式展示出来,在其中还加入了《c++程序设计》机械工业出版社的黑皮书的内容进去作为补充。
c++是非常基础的语言,学习也比较容易,如果减去自己的代码编写时间单纯的看懂就可以的话其实不用一个星期就能基本了解。
但是还是需要多练习,很多程序bug等(有版本不适问题,操作系统不适问题)都在是实操中发现并处理。
简单的学习之后就可以应对csp考试,数据结构等课程了就。
我就是本来用java,考csp前学习回顾一下c++想用c++考。java岗的就业情况也比较饱和,会c++一定是很合算的事。
下面是第一节的代码文件,基本涵盖了c和c++的最基础操作部分。
https://wwk.lanzout.com/b039oxuaf
密码:e03v
C++基本内容
主要内容取自黑马程序员c++从零课程,和c++程序设计(机械工业出版社)
旨在速成c++
初始内容
- C++运行软件(devc++或者vs)安装配置简单
- vs Visual Studio
- 新建一个控制台引用 会打印helloword的那个
直接上代码
阅读代码建议使用vs,或者可以下载notepad++(一个类似于记事本的东西,里面可以选择各种编程语言的类型 会按照选中的语言的格式来显示)
双击点开就是代码了。
Xuexic++1.cpp
下面的复制进新弄出来的项目文件里也可以
//前面是注释标志 单行注释标志
/*这是多行注释标志 首尾是*加/
编译运行程序 按ctrl+F5
注释程序运行时不影响
也可以点击绿三角
程序下面的框会显示错误
错误内容可以从互联网得到解决 复制到网上搜
*/
也可以直接从csdn复制
#include <ctime>//引入时间函数的头文件,之后通过当前时间生成随机数的代码用到
#include<stdio.h>//标准输入输出头文件 c语言的 printf() scanf()用到的就是这个
#include<math.h>//数学库,包含数学函数
#include <iostream>//输入输出头文件 cin cout
#define Day 7//定义常量 语法记住就行
#include <string>//字符串头文件 引入字符串
using namespace std;//使用标准命名空间 c++程序必须有
int main()//only one(就一个理论上也是一种函数 main函数 一个程序里面只有一个)
{
std::cout << "Hello World!\n";//"\n"输出也是换行的效果,"\t"是提供格式的作用(tab键一样,所以是\t)
cout << "Hello Sunny!" << endl;//endl;输出结束的时候换行
/*多行
注释*/
//变量
//变量存在的意义---方便管理内存空间
//数据类型 变量名=变量初始值
int firstdata = 10;//整型变量 int的意思就是整型 (整数)
cout << "firstdata=" << firstdata << endl;//cout<<输出 cin>>输入
//常量
/*1.#define 宏常量 见第一行
2.const修饰的变量 也叫常量*/
cout << "a week has" << Day << "days." << endl;
const int month = 12;//不可修改了;
cout << "a year has" << month << "months" << endl;
//不用关键字起名
//标识符 字母数字下划线 第一个字符必须是字母或者下划线 区分大小写
//建议给变量起名字可以见名知意 简单易懂(最好是英语)
//数据类型 创建变量或者常量的时候都要给定类型 整形 short int long longlong
//占用空间不同,从小到大 更改int即可
//short -323768 ~32767 越界会循环到下限/上限 2byte
//int 31 次方 4Bs
//long 也是31 windows 4B
// longlong 63 8B
//sizeof
/*
语法 sizeof(数据类型或变量) 显示占用空间(byte)
*/
cout << "int占有字节" << sizeof(int) << "firstdata占有字节" << sizeof(firstdata) << endl;
//实型(浮点数) float单精度浮点数 double双精度浮点数
// float 一般会在后面加一个f ,小数不加f会直接认为是双精度,再转换成单精度会浪费时间
float tryfloat = 3.1415926f;//默认情况最多表示六位有效数字
cout << tryfloat << "这个数只显示六位" << endl;
//float 4byte 8byte
cout << "float占" << sizeof(tryfloat) << "字节" << endl;
//科学计数法
float tryfloat2 = 3e2;//e后的数字表示*10的次方(负数是0.1的次方)
cout << tryfloat2 << "科学计数法显示的3e2" << endl;
//字符型 要用’‘,里面只能有一个字符 占用一个字节 只存储了ascll码而不是字符本身
char chtest = 'a';
cout << chtest <<sizeof(chtest)<< endl;
cout << (int)chtest << endl;//强制变成整形
//a--97 A--65 记下来,其余的可以推算 前31个是控制字符
//转义字符
// \--特殊符号 \n 换行 \反斜杠(两个反斜杠输出一个) \\ \t 水平制表符
cout << "aaa\tHelloWorld!" << endl;
cout << "aa\tHelloWorld!" << endl;
cout << "aaaaaa\tHelloWorld!" << endl;//整齐的输出数据
//字符串 C语言风格字符串 char 字符串名[]=“字符串值” (双引号)
//c++风格字符串
//c
char strtest[] = "NiuBi!";
cout << strtest << endl;
//c++
//使用前要加入 #include <string>
string strtest2 = "NiuBier!";
cout << strtest2 << endl;
//bool 类型 1真0假 占用一个字节
bool flag = true;
cout << flag << endl;//C++里可以用0表示假,不是0都可以表示真
//数据的输入
int a = 0;
cout << "please give number to a(int):";
//cin >> a;
cout << a << "\n";//float 等 相同; string要加入头文件
//运算符
//算数运算符 赋值运算符 比较运算符 逻辑运算符
//
cout << month + Day << endl;
//整数相除依旧是整数,将小数部分去除
//小数相除也可以还是小数 除数不能为0;
//取模运算(求余数)
cout << 10 % 3 << endl;//两个小数不能取模,只有整形变量可以取模
//递增递减运算符(前置和后置区别)
//前置 后置区别
firstdata++;//先进行运算再加一
++firstdata;//先加一在进行运算
cout<<firstdata<<"后置" << firstdata++ * 10 << "前置" <<++firstdata*10<< endl;
//赋值运算符 = += -= *= /= %=
firstdata += 2;//firstdata=firstdata+2;
firstdata *= 2;
firstdata /= 2;
cout << firstdata << endl;
firstdata %= 10;
cout << firstdata << endl;
//
//比较运算符 ==等于 !=不等于 < > <= >=(正常两个拼成一个)
cout << (month == Day) << endl;
//逻辑运算符 !非 &&与 ||或
cout << !firstdata << "\t" << !!firstdata << endl;
//和数学里的一样
cout << ((!!firstdata) || (!firstdata)) << "\t" <<((!firstdata) && (!!firstdata))<< endl;
//程序流程结构 顺序 选择 循环 if的结构里面不输入;
if (firstdata==10) {
cout << "应该不等于十的,输出这一段就是错了" << endl;
}
else if(firstdata==6){
cout << "Good! Test right!" << endl;
}//一般配合cin使用,判断输入的值是否满足条件 else if可以有好几个呢
else {
cout << "不对不对" << endl;
}//(使用{嵌套语句})
/*
if(...){
...
if(...){
...
}
}
*/
//案例 (黑马程序员) 三只小猪分别输入体重判断哪只更重
//为便于展示省略输入(用firstdata Day month)代替
//分支语句逻辑上只执行一个 if或者else看条件符合哪个
if (month > Day) {//月大于 DAY=7
if (month > firstdata) {//嵌套分支 一个个来分
cout << "小猪month最重" << endl;
}
else {
cout << "小猪firstdata最重" << endl;
}
}
else {
if (Day > firstdata) {
cout << "小猪Day最重" << endl;
}
else {
cout << "小猪firstdata最重" << endl;
}
}
//三目运算符
//类似if
// setene1?setence2:sentence3 语句一为真执行2,为假执行3
int threeEyes = (Day > month) ?firstdata : ++firstdata;
cout << "day>month吗" <<threeEyes<< "\n";//返回的是变量,可以继续赋值
//switch
cout << "please give a int number between 0~10"<<endl;
int score = 0;
//cin >>score;
switch (score) {
case 10:{
cout << "good movies!" << endl;
break;//用来跳出循环
}
case 9: {
cout << "it is ok!" << endl;
break;//用来跳出循环
}
case 8: {
cout << "capable to see." << endl;
break;
}
default: {//其他情况
cout << "bad shit!" << endl;
break;
}
//Switch 只能用整形或者字符型,不可以是一个区间
//优点是执行效率高,结构清晰
}
//循环结构 while for
//while 条件是真就一直执行循环里面的代码
//print 1~10
firstdata = 0;
while (firstdata < 11) {
cout << "number"<<firstdata<<"\t";
firstdata++;
}
cout << "\n";
//猜数字游戏
srand((unsigned int)time(NULL));//加入随机数种子
//根据当前系统时间来生成不一样的随机数 用time要加ctime头文件
threeEyes = rand() % 100 + 1;//生成随机数(原本会出来的是)0到99 +1=1~100
while (1) {
cout << threeEyes << "\n";
cout << "猜一下1~100的数字" << endl;
firstdata = threeEyes;
//cin >> firstdata;
if (threeEyes != firstdata) {
if (threeEyes > firstdata) {
cout << "猜小了" << endl;
}
if (threeEyes < firstdata) {
cout << "猜大了" << endl;
}
}
else {
cout << "right!" << endl;
break;
}
}
//do while
//do {循环}while(循环条件)
//先执行一次再测试是不是满足条件
firstdata = 0;
do {//print 0~9
cout << "number" << firstdata<<"\t";
firstdata++;
} while (firstdata < 10);//就算不满足条件也会先打印一次firstdata
cout << "\n";
//案例 水仙花数
//三位数 1^3+5^3+5^3=153 三位数中所有这样的数
firstdata = 100;
//#include<stdio.h> #include<math.h>引入乘方函数pow所需头文件
cout << pow(firstdata, 3) << endl;//pow函数的乘方运算
while (firstdata<1000) {
int a = pow(firstdata % 10,3);
int b = pow((firstdata / 10) % 10,3);
int c = pow(firstdata / 100 , 3);//局部变量,循环里面才能用,取名比较随意
if (firstdata ==a+b+c) {
cout << firstdata << endl;
}
firstdata++;
}
//for (起始表达;条件;语句 和{}里面的一样)
for (int i=0;i<10;i++) {
cout << i << "\t";
}
cout << endl;//每个部分都可以省略写到下面去 for(;;“这里的语句会在{}执行完之后执行”)
//敲桌子游戏
//1~100 找出含有7(个位十位有或者七的倍数的数字)
for (int i = 1; i < 100; i++) {
if (i % 7 == 0) {
cout << i << "\t";
}
else if (i % 10 == 7) {
cout << i << "\t";
}
else if (i / 10 == 7) {
cout << i << "\t";
}
else {
cout << "." << "\t";
}
}
cout << "\n";//嵌套循环
//乘法口诀表
for (int i = 1; i < 10; i++) {
for (int j = 1; j <= i; j++) {
cout <<j << "*" << i<< "=" << i * j<<"\t";
}
cout << endl;
}//注释快捷键,选中后ctrl+K+c
//break语句
/*
* switch select 用来退出case
* for dowhile 跳出循环
* 嵌套循环中 退出当前层循环
*/
//continue 语句
//跳过还没执行的剩下的语句,直接进行下一个循环 不会退出循环
//goto语句(有争议)
/*
goto 标记
goto FLAG;//一般大写标记 直接执行到标记的位置
标记FLAG FLAG:
不推荐使用,不方便阅读
*/
//数组
/*
* 数据元素数据类型一样
* 数据存储的位置连续
*/
//三种定义 从0开始计数 下标从0开始(习惯)
//int arrayTest1[5]; //需要在后续给初始化
int arrayTest2[2] = { 2,3 };//数组的长度可以省略,后面提供初始化的话
//访问
cout << arrayTest2[0] << endl;//显示2
//一维数组数组名的作用 可以统计数组在内存的长度和获取数组存储的首地址
//sizeof() 用来表示内存长度
cout << "占用内存" << sizeof(arrayTest2) << endl;
cout << "该数组的首地址address:" << arrayTest2 << endl;
//一般会显示16进制,在数组名前面+(int)就可以显示十进制地址
//array的第一个元素地址就是 数组首地址 int4字节 每个元素间隔4字节
//五只小猪称重 //找出数组中最大的
int arrayTest1[] = {300,520,521,314,867 };
int maxWeightPig = 0;
for (int i = 0; i < 5; i++) {
if (arrayTest1[i] > maxWeightPig) {
maxWeightPig = arrayTest1[i];
}
}
cout <<"最重的猪有"<< maxWeightPig<<"kg" << endl;
//数组元素逆置
for (int i = 0; i < 5; i++) {
cout << arrayTest1[i] << "\t";
}
cout << endl;
int arrayUponStart = 0;//起始下标肯定是0
int arrayUponEnd = sizeof(arrayTest1) / sizeof(arrayTest1[0]) - 1;//末尾下标=数组长度比数据长度-1
int arrayUponTemp = arrayUponStart;
for (; arrayUponStart<arrayUponEnd; ) {
//交换
arrayUponTemp = arrayTest1[arrayUponStart];
arrayTest1[arrayUponStart] = arrayTest1[arrayUponEnd];
arrayTest1[arrayUponEnd] = arrayUponTemp;
//下标变化
arrayUponStart++;
arrayUponEnd--;
}
for (int i = 0; i < 5; i++) {
cout << arrayTest1[i] << "\t";
}
cout << endl;
//冒泡排序
//最常用,对数组内部数据排序
/*
*比较相邻元素,第一个比第二个大就交换 (交换要三倒油葫芦)
* 就可以找到第一个最大的数,这样下一次再次比较就可以少比较一个,直到排序完
* 每次比较数-1,
*/
cout << "冒泡排序前:" << endl;
for (int i = 0; i < 5; i++) {
cout << arrayTest1[i] << "\t";
}
cout << endl;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5 - i; j++) {//内层的次数是总数-外层轮次
if (arrayTest1[j] < arrayTest1[j+1]) {
int temp = arrayTest1[j + 1];
arrayTest1[j + 1] = arrayTest1[j];
arrayTest1[j] = temp;
}
}
}
cout << "冒泡排序后(降序):" << endl;
for (int i = 0; i < 5; i++) {
cout << arrayTest1[i] << "\t";
}
cout << endl;
//二维数组
int arrayTest3[2][3] =
{
{2,3,9},
{1,2,8}
};
//也可以直接堆数据{1,2,3,4,5,6,7};程序会按行列数提示划分,先满一行
//定义时也可以不提供行数[][5]系统可以通过列数推断(同上)
//二维数组数组名 (内存空间,首地址) 第一行和第一个还有数组首地址都是一个
//考试成绩统计 sum
int scoreTest[3][3] =
{
{100,100,100},
{90,50,100},
{60,70,80}
};
string scoreTestName[3] = { "sunny","xioama","shit" };
for (int i = 0; i < 3; i++) {
int sum = 0;
for (int j = 0; j < 3; j++) {
sum += scoreTest[i][j];
}
cout << scoreTestName[i] << "`s sumscore is " << sum << endl;
}
system("pause");//要求随便按一个键
return 0;
}