[1] C++编程语言
week9
javaScript转到C++需要注意的地方
-
静态类型:C++ 是一种静态类型语言,因此在声明变量时需要指定其类型,并且变量的类型在编译时就会确定。这与 JavaScript 的动态类型不同,JavaScript 变量的类型是在运行时确定的。
-
内存管理:在 C++ 中,你需要手动管理内存,包括分配和释放内存。这与 JavaScript 自动进行垃圾回收的机制不同。在 C++ 中,你可以使用
new
和delete
运算符来进行内存分配和释放,或者使用智能指针等工具来辅助管理内存。 -
数组:在 C++ 中,数组的长度是固定的,而且数组是通过下标访问的。与 JavaScript 中的动态数组不同,C++ 中的数组长度必须在声明时确定,且不能动态改变大小。
-
函数:在 C++ 中,函数的定义和调用方式与 JavaScript 有所不同。在 C++ 中,你需要显式定义函数的返回类型、参数类型,并且可以进行函数重载(同一函数名但参数类型或个数不同)。此外,C++ 支持引用传递和值传递,需要注意参数传递的方式。
-
类和对象:C++ 是一种面向对象的语言,类和对象是其核心概念之一。你需要了解如何定义类、创建对象、访问成员变量和方法等面向对象的基本操作。
-
指针和引用:在 C++ 中,指针和引用是常见且重要的概念,用于处理内存和传递参数。需要注意指针的声明、操作以及指针的安全使用,以避免出现内存泄漏或悬空指针等问题。
day1
基础变量类型
类型 | 位 | 范围 |
---|---|---|
char | 1 个字节 | -128 到 127 或者 0 到 255 |
unsigned char | 1 个字节 | 0 到 255 |
signed char | 1 个字节 | -128 到 127 |
int | 4 个字节 | -2147483648 到 2147483647 |
unsigned int | 4 个字节 | 0 到 4294967295 |
signed int | 4 个字节 | -2147483648 到 2147483647 |
short int | 2 个字节 | -32768 到 32767 |
unsigned short int | 2 个字节 | 0 到 65,535 |
signed short int | 2 个字节 | -32768 到 32767 |
long int | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
signed long int | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
unsigned long int | 8 个字节 | 0 到 18,446,744,073,709,551,615 |
float | 4 个字节 | 精度型占4个字节(32位)内存空间,+/- 3.4e +/- 38 (~7 个数字) |
double | 8 个字节 | 双精度型占8 个字节(64位)内存空间,+/- 1.7e +/- 308 (~15 个数字) |
long long | 8 个字节 | 双精度型占8 个字节(64位)内存空间,表示 -9,223,372,036,854,775,807 到 9,223,372,036,854,775,807 的范围 |
long double | 16 个字节 | 长双精度型 16 个字节(128位)内存空间,可提供18-19位有效数字。 |
wchar_t | 2 或 4 个字节 | 1 个宽字符 |
#include<iostream>
#include <limits>
using namespace std;
int main()
{
cout << "type: \t\t" << "************size**************"<< endl;
cout << "bool: \t\t" << "所占字节数:" << sizeof(bool);
cout << "\t最大值:" << (numeric_limits<bool>::max)();
cout << "\t\t最小值:" << (numeric_limits<bool>::min)() << endl;
cout << "char: \t\t" << "所占字节数:" << sizeof(char);
cout << "\t最大值:" << (numeric_limits<char>::max)();
cout << "\t\t最小值:" << (numeric_limits<char>::min)() << endl;
cout << "signed char: \t" << "所占字节数:" << sizeof(signed char);
cout << "\t最大值:" << (numeric_limits<signed char>::max)();
cout << "\t\t最小值:" << (numeric_limits<signed char>::min)() << endl;
cout << "unsigned char: \t" << "所占字节数:" << sizeof(unsigned char);
cout << "\t最大值:" << (numeric_limits<unsigned char>::max)();
cout << "\t\t最小值:" << (numeric_limits<unsigned char>::min)() << endl;
cout << "wchar_t: \t" << "所占字节数:" << sizeof(wchar_t);
cout << "\t最大值:" << (numeric_limits<wchar_t>::max)();
cout << "\t\t最小值:" << (numeric_limits<wchar_t>::min)() << endl;
cout << "short: \t\t" << "所占字节数:" << sizeof(short);
cout << "\t最大值:" << (numeric_limits<short>::max)();
cout << "\t\t最小值:" << (numeric_limits<short>::min)() << endl;
cout << "int: \t\t" << "所占字节数:" << sizeof(int);
cout << "\t最大值:" << (numeric_limits<int>::max)();
cout << "\t最小值:" << (numeric_limits<int>::min)() << endl;
cout << "unsigned: \t" << "所占字节数:" << sizeof(unsigned);
cout << "\t最大值:" << (numeric_limits<unsigned>::max)();
cout << "\t最小值:" << (numeric_limits<unsigned>::min)() << endl;
cout << "long: \t\t" << "所占字节数:" << sizeof(long);
cout << "\t最大值:" << (numeric_limits<long>::max)();
cout << "\t最小值:" << (numeric_limits<long>::min)() << endl;
cout << "unsigned long: \t" << "所占字节数:" << sizeof(unsigned long);
cout << "\t最大值:" << (numeric_limits<unsigned long>::max)();
cout << "\t最小值:" << (numeric_limits<unsigned long>::min)() << endl;
cout << "double: \t" << "所占字节数:" << sizeof(double);
cout << "\t最大值:" << (numeric_limits<double>::max)();
cout << "\t最小值:" << (numeric_limits<double>::min)() << endl;
cout << "long double: \t" << "所占字节数:" << sizeof(long double);
cout << "\t最大值:" << (numeric_limits<long double>::max)();
cout << "\t最小值:" << (numeric_limits<long double>::min)() << endl;
cout << "float: \t\t" << "所占字节数:" << sizeof(float);
cout << "\t最大值:" << (numeric_limits<float>::max)();
cout << "\t最小值:" << (numeric_limits<float>::min)() << endl;
cout << "size_t: \t" << "所占字节数:" << sizeof(size_t);
cout << "\t最大值:" << (numeric_limits<size_t>::max)();
cout << "\t最小值:" << (numeric_limits<size_t>::min)() << endl;
cout << "string: \t" << "所占字节数:" << sizeof(string) << endl;
// << "\t最大值:" << (numeric_limits<string>::max)() << "\t最小值:" << (numeric_limits<string>::min)() << endl;
cout << "type: \t\t" << "************size**************"<< endl;
return 0;
}
type: ************size**************
bool: 所占字节数:1 最大值:1 最小值:0
char: 所占字节数:1 最大值: 最小值:?
signed char: 所占字节数:1 最大值: 最小值:?
unsigned char: 所占字节数:1 最大值:? 最小值:
wchar_t: 所占字节数:4 最大值:2147483647 最小值:-2147483648
short: 所占字节数:2 最大值:32767 最小值:-32768
int: 所占字节数:4 最大值:2147483647 最小值:-2147483648
unsigned: 所占字节数:4 最大值:4294967295 最小值:0
long: 所占字节数:8 最大值:9223372036854775807 最小值:-9223372036854775808
unsigned long: 所占字节数:8 最大值:18446744073709551615 最小值:0
double: 所占字节数:8 最大值:1.79769e+308 最小值:2.22507e-308
long double: 所占字节数:16 最大值:1.18973e+4932 最小值:3.3621e-4932
float: 所占字节数:4 最大值:3.40282e+38 最小值:1.17549e-38
size_t: 所占字节数:8 最大值:18446744073709551615 最小值:0
string: 所占字节数:24
type: ************size**************
typedef 声明
//普通类型
typedef int feet;
feet distance = 123;
cout << distance << endl;
//结构体类型
struct MyStruct
{
string name;
int age;
};
typedef MyStruct MyStruct1;
MyStruct1 obj = MyStruct{ "123",19 };
cout << obj.name << endl;
输出指令
// 控制台打印
std::cout << "Hello World";
// 简化std命名空间
using namespace std;
// 转义字符
cout << "\n";
// \n会被渲染成前面有 \的前提下 \n不会被渲染
cout << "\\n";
\n; << endl; 换行;
系统指令
// system()可以调用CMD的命令,具体的命令需要用""括起来
// 系统指令
system()
// 清除控制台cls 任务管理器taskmgr 修改标题title
注释
//标记一段代码块的作用
#pragma ****代码整体结构
**************
##pragma endregion
//
/* */
预处理指令
#include <iostream> // 输入输出流头文件
#include <fstream> // 文件流
#include <string> // 字符串
#include <limits> //范围极限
day2
输入
#include <iostream> //输入输出流
/*
cin: console input 缩写
赋值方式 : cin >> ***
特点 : 会清楚空格后面的内容
*/
string Str;
cin >> Str;
cout << Str;
// getline(cin, Name) 这样的输入会记录空格
getline(cin, Name);
数据类型
整形类型 short int long long
//计算机的存储的那位
//位 bit 8 Byte 字节 1024 KB字节
#include <limits> //导入范围
cout << numeric_limits<short>::min() << endl << numeric_limits<short>::max() << endl;
cout << SHRT_MIN << "," << SHRT_MAX << endl;
//符号定义 unsigned (无符号的数'
unsigned short Num1 = -1;
cout << Num1 << endl;
练习题
#pragma 给定一个字符 , 判断大小写
//cout << "给定一个字符 , 判断大小写\n";
//char num;
//cin >> num;
//cout << num;
//if (num >= 64 && num <= 91) {
// cout << "num是大写";
//}
//else if (num >= 96 && num <= 123) {
// cout << "num是小写";
//}
//cout << num;
//cout << int(Ch) <<endl;
#pragma endregion
#pragma 判断用户输入的是不是指定的某个字符
//cout << "请输入a\n";
//char Num;
//cin >> Num;
//
//char isNum = 'a';
//if (Num == isNum) {
// cout << "想等";
//}
//else {
// cout << "不相等";
//}
#pragma endregion
#pragma 要求用户输入0-9之间的数字 , 判断是否正确
//cout << "输入0-9之间的数字\n";
//char num;
//cin >> num;
//if (num >= 48 && num <= 57) {
// cout << (num + "输入的是数字");
//}
//else {
// cout << "输入的不是数字";
//}
#pragma endregion
day3
算术运算符
//// 除数不能为0
//Result = Num1 / 10;
//// cout << Result << endl;
// % 取余(浮点数默认不支持取余操作)
float Num3 = 5.5;
// float Result1 = Num3 % 2;
// cout << Result1 << endl;
//杂项运算符
// sizeof 虽然看起来像一个函数,本质是一个运算符
int Num = 1;
cout << sizeof(Num) << endl;
// switch
int Num = 0;
// switch中的条件 可以整数或者枚举,其他的值不允许(float double string)
// 如果在case里面声明变量需要花括号括起来
switch (Num)
{
case 0:
cout << "case 0" << endl;
break; // 每一个条件都应该配置一个break
// break后面不要加语句(因为不会执行)
// cout << "case 0 after break" << endl;
case 1:
cout << "case 1" << endl;
break;
case 2:
cout << "case 2" << endl;
break;
default:
cout << "default" << endl;
break;
}
题目
#pragma region 输入两个数, 判断这两个数的关系
//int num1;
//int num2;
//cout << "输入两个数, 判断这两个数的关系\n";
//cin >> num1;
//cin >> num2;
//if (num1 > num2) {
// cout << num1 << "大于" << num2;
//}
//else {
// cout << num1 << "小于" << num2;
//}
#pragma endregion
#pragma region 输入三个数, 求出最大数
//int num1;
//int num2;
//int num3;
//cin >> num1;
//cin >> num2;
//cin >> num3;
//if (num1 > num2) {
// if (num1 > num3) {
// cout << num1 << "最大值";
// }
// else {
// cout << num3 << "最大值";
// }
//}
//else if (num2 > num3) {
// cout << num2 << "最大值";
//}
//else {
// cout << num3 << "最大值";
//}
#pragma endregion
#pragma region 输入一个年份, 判断是否为闰年
//int year;
//cin >> year;
//if (year % 400 == 0) {
// cout << "闰年";
//}
//else {
// cout << "不是闰年";
//}
#pragma endregion
#pragma region 计算1 - 100之间所有数的和;
//int count = 0;
//for (int i = 0; i <= 100; i++) {
// cout << i << endl;
// count += i;
//}
//cout << "和为" << count << endl;
#pragma endregion
#pragma region 计算1 - 100之间所有基数的和;
//int count = 0;
//for (int i = 1; i <= 100; i += 2) {
// count += i;
//}
//cout << "计算1 - 100之间所有基数的和\n" << count;
#pragma endregion
#pragma region 计算1 - 100之间所有偶数的和;
//int count = 0;
//for (int i = 2; i <= 100; i += 2) {
// count += i;
//}
//cout << "计算1 - 100之间所有偶数的和\n" << count;
#pragma endregion
#pragma region 算术运算符的注意项
//整数相除 5 / 10 != 0.5;
//如果要小数需要用小数接受
/*int num = 5;
int num1 = 10;
int fNum;
cout << (float)num / num1 << endl;*/
// 整数不能除以 0
//cout << 10 / 0 << endl; XXXXXXX
// 浮点不能取零
//float fl = 10.02;
//cout << fl % 0
#pragma endregion
#pragma region 计算1000内的完数
#pragma endregion
#pragma region 乘法表
//for (int i = 1; i <= 9; i++) {
//
// for (int j = 1; j <= i; j++) {
// cout << i << "X" << j << "=" << i * j << " ";
// if (j == i) {
// cout << endl;
// }
// }
//
//}
#pragma endregion
#pragma region 倒三角
//int rows = 11;
//for (int i = 0; i < rows; i++) {
// for (int j = 0; j < i; j++) {
// cout << " ";
// }
// for (int k = 0; k < 2 * (rows - i) - 1; k++) {
// cout << "*";
// }
// cout << endl;
//}
#pragma endregion
#pragma region 1 - 100累加
//int count = 0;
//for (int i = 1; i <= 100; i++) {
// if (i % 3 != 0) {
// count += i;
// }
//}
//cout << count;
#pragma endregion
#pragma region white
//int cmd = 0;
//while (cmd !=5)
//{
//
//}
#pragma endregion
#pragma region goto
//for (int i = 0; i <= 100; i++) {
// cout << "i" << i;
// if (i == 50)goto five;
//}
//five;
//int num = 0;
//while (num <= 100) {
// num++;
// if (num == 50)goto Five;
// cout << num << endl;
//}
//Five:
//cout << "goto";
#pragma endregion
day4
for循环
#pragma region size_t
// 循环中不要使用size_t,除非循环条件中没有赋值且0需要格外关注
// size_t unsigned long long
/*size_t Num = -5;
cout << Num << endl;*/
// 死循环
/*for (size_t i = 5; i >= 0; i--)
{
cout << "执行" << endl;
}*/
// 执行了五次
/*for (size_t i = 5; i > 0; i--)
{
cout << "执行" << endl;
}*/
//size_t Num = -1;
//cout << Num << endl;
//// 不会执行
//for (size_t i = 5; i >-1; i--)
//{
// cout << "执行" << endl;
//}
// 执行了6次
/*for (size_t i = 5; i < -1; i--)
{
cout << "执行" << endl;
}*/
#pragma endregion
#pragma region continue break
//int Sum = 0;
//for (int i = 1; i < 100; ++i)
//{
// int G = i % 10; // 求个位数
// // continue 跳过此次循环(进入下一次循环)
// // break 跳出(当前)循环
// if (G % 3 == 0)
// {
// continue;
// // break;
// }
// Sum += i;
//}
//cout << Sum << endl;
#pragma endregion
案例
#pragma region 案例: 输入姓名, 从指定的名称数组中找到对应的索引, 如果未找到打印 - 1;
//string nameArr[5]{ "张三", "李四", "王五", "老六", "小七" };
//string inputName;
//cin >> inputName;
////inputName = "张三1";
//int nameArrLength = sizeof(nameArr) / sizeof(nameArr[0]);
//for (size_t i = 0; i <= nameArrLength; i++) {
// if (nameArr[i] == inputName) {
// cout << "找到了" << inputName;
// return 0 ;
// }
//}
//cout << "-1";
#pragma endregion
while
#pragma region while 和 dowhile
// 有2000块本金,存银行,年利率为2.5%,几年后本息可以超过4000(不确定循环执行次数)
// while (true){ }
// while 用在没有明确的执行次数的情况下,否则优先选择for循环
//// 与for循环相比 控制循环的变量需要在循环外单独定义 循环的增量需要在循环体中处理
//float Money = 2000; // 2000 + 2000 * 0.025f
//int Year = 0;
//while (Money <= 4000)
//{
// Year++;
// Money *= 1.025f;
//}
//cout << Year << endl;
//
// int Num = 10;
// 当条件不满足的时候循环就不会执行
/*while (Num < 5)
{
cout << "测试" << endl;
Num++;
}*/
/*do
{
cout << "测试" << endl;
Num++;
} while (Num < 5);*/
// 结论 while有可能一次也不执行,但是do while保证程序至少执行一次
#pragma endregion
数组
#pragma region 数组
含义 存储一组相同类型的数据的容器
一组 相同数据类型 容器
// 语法 类型 变量名[个数]
int Nums[10]; // 定义数组变量并且指定个数
int Nums2[5] = { 1, 2, 3, 4, 5}; // 声明的时候同时赋值 {}个数不能比前面定义的时候多
int Nums3[5]{ 1, 2, 3}; // 省略 = // {}中的个数可以比前面定义的时候少
int Nums4[]{ 1, 2, 3, 4, 5 , 1, 2, 3}; // 省略个数,通过{}的值来推断数组有几个元素
int Nums5[5]{};
int Nums5[]; // 不能不写个数也不赋值
// 注意点:数组在定义的时候就把个数规定好了,后面不能改变数组的长度
//// 访问数组中的元素
Nums2[2] = 300; // 改写数组中的元素
cout << Nums2[2] << endl; // 表示访问获取Nums2数组中索引为2的元素,索引从0开始
//// 访问数组中的默认值
// cout << Nums[0] << endl; // 如果数组元素使用第一种定义方式,内部是垃圾值
cout << Nums3[3] << endl; // 使用第三种赋值(部分赋值)的方式,没赋值的部分是0
cout << Nums5[0] << endl; // 使用第五种赋值方式,默认值是0
// 访问的时候索引越界会发生生么 -> 数组访问的时候不要越界
cout << Nums2[5] << endl; // 如果是数字,不会发生崩溃。如果是复杂类型(指针)发生崩溃
// 数组的遍历 挨个访问数组中的元素
// 数组长度1 size(数组)
cout << size(Nums4) << endl;
// 数组长度2 整个空间大小 / 一个元素的空间大小 = 数组个数
// sizeof(Nums4)整个数组占用的内存空间 sizeof(Nums4[0]) 表示第0个索引的数据占用的内存空间
cout << sizeof(Nums4) << " " << sizeof(Nums4[0]) << " " << (sizeof(Nums4) / sizeof(Nums4[0])) << endl;
for (int i = 0; i < size(Nums4); ++i)
{
cout << Nums4[i] << endl;
}
for (int i = 0; i < sizeof(Nums4) / sizeof(Nums4[0]); ++i)
{
cout << Nums4[i] << endl;
}
// 相当于蓝图中的ForEach 拿不到索引
for (int Temp : Nums4)
{
cout << Temp << endl;
}
// 练习1 定义存储姓名的数组,并按照A,B,C 的形式打印,最后一个元素后没有,
string Names[3]{ "ZhangSan", "LiSi", "WangWu" };
for (int i = 0; i < size(Names); ++i)
{
// i == size(Names) - 1 表示 i 是最后一个元素
cout << Names[i] << (i == size(Names) - 1 ? "" : ", ");
}
// 练习2 输入姓名,从指定的名称数组中找到对应的索引,如果未找到打印-1
string Names[3]{ "ZhangSan", "LiSi", "WangWu" };
string Name;
cin >> Name;
int Index = -1; // 标记查找的索引
for (int i = 0; i < sizeof(Names) / sizeof(Names[0]); ++i)
{
if (Names[i] == Name)
{
// 说明找到了
Index = i;
break; // 找到之后退出
}
}
cout << Index << endl;
#pragma endregion
day5
char数组
// 字符串和字符的关系
string Names = "Hello"; // 'H' 'e' 'l' 'l' 'o'
//// 字符串是一个一个的字符组成的,字符串是字符的数组
cout << (int)Names[0] << endl;
char Name[6] = { 'H','e', 'l', 'o', '\0', };
string Names = "Hello";
cout << (int)Name[0] << endl; //72
cout << (int)Names[0] << endl; //72
// 字符数组
// 注意点 最后一个字符 \0 标记字符数组结束
// 注意点 有效元素的个数需要比总个数少1,‘\0’需要留出空间,只要有空间'\0'可以自动添加
char Names[6] = { 'H', 'e', 'l', 'l', 'o', '\0'};
cout << Names << endl;
char Names1[6] = "Hello";
/*
char 类型数组用于存储字符序列,每个元素都是一个单个字符。
char 类型数组通常用于存储字符串,以空字符 \0 结尾来表示字符串的结束。
char 类型数组可以直接通过指针操作来进行字符串处理。
char 类型数组使用变量名的时候打印的是数组元素 , 而int、string是数组首元素内存地址
char 类型数组可以直接输出为字符串,而不需要额外的处理
*/
二维数组
// 二维数组
// 二维数组是由一个一个的一维数组组成,一维数组的数组
// 组成二维数组的一维数组的个数必须相同
// 语法 [行][列]
// 行表示有几个一维数组组成 列表示一维数组中有几个元素
int Nums[5][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}, {13,14,15} };
int Nums1[5][3] = { 1,2,3,4,5,6,7,8,9,10,11,12,13 }; // 系统会按照行数和列数自动拆,不够的地方自动补默认值(?垃圾值还是0)
// 只指定列数,会自动算行数
int Nums2[][3] = { 1,2,3,4,5,6,7,8,9,10,11,12,13 };
CPP中没有只指定行数,自动推算列数
int Nums3[2][] = { 1,2,3,4,5,6,7,8,9,10,11,12,13 };
//// 二维数组的长度(行数和列数)size
cout << size(Nums) << endl; // 行数
cout << size(Nums[0]) << endl; // 列数
//// 二维数组的长度 siezof
cout << sizeof(Nums) << endl; // 5 * 3 * 4 = 60
//// Nums[0] 取的是第0个一维数组
cout << sizeof(Nums[0]) << endl; // 3 * 4 = 12
//// [行索引][列索引] 取出来是一个int值
cout << sizeof(Nums[0][0]) << endl; // 4
//cout << " ========================= " << endl;
//// 二维数组的遍历1
for (int i = 0; i < size(Nums); ++i)
{
for (int j = 0; j < size(Nums[0]); ++j)
{
cout << Nums[i][j] << " ";
}
cout << "\n";
}
for (int i = 0; i < sizeof(Nums) / sizeof(Nums[0]); ++i)
{
for (int j = 0; j < sizeof(Nums[0]) / sizeof(Nums[0][0]); j++)
{
cout << Nums[i][j] << " ";
}
cout << endl;
}
结构体
#pragma region 结构体
// 结构体 把不同种类的但是具有一定关联的变量放到一起组成了一个新的类型(背包格子UI, 学生信息)
// 语法 声明写在头文件和命名空间之后,main函数之前 struct XXXX{};
// 命名 按照UE的命名 结构体以F开头 FXxxx FStudent
//FStudent Student1;
//Student1.ID = 10010;
//Student1.bIsMale = true;
//Student1.Name = "ZhangSan";
//Student1.WeChat = "ZhangHaoTian";
///*cout << Student1.ID << endl;
//cout << Student1.bIsMale << endl;
//cout << Student1.Name << endl;*/
//// 注意点 结构体类型不能直接根cout << 结构体 不允许
//// cout << Student1 << endl;
//cout << Student1.ID << ": " << endl;
//cout << "\t" << (Student1.bIsMale ? "男" : "女") << endl;
//cout << "\t" << Student1.Name << endl;
//cout << "\t" << Student1.WeChat << endl;
#pragma endregion