C++ 教程 - 01 基础篇

文章目录

  • C++介绍
  • 环境配置
  • 第一个cpp程序
    • 案例练习
  • 变量
  • 常量
  • 关系运算符
  • 逻辑运算符
  • 条件运算符
  • 位运算符
  • 类型转换
  • 分支
  • 循环
  • 程序调用
  • 综合案例

C++介绍

  • 基于C语言,继承了C的所有语法;

  • 静态类型语言,需要先编译,再执行;

  • 贴近底层硬件,运行速度快;
     

  • 支持面向对象、面向泛型,增强版的C;

  • 应用领域
    在这里插入图片描述

  • 编译(Compile),编译器 将整个源代码翻译成机器码(二进制文件),一次性交给计算机执行,如C/C++;

  • 解释(Interpret),由解释器将代码逐行解释为机器码,交给计算机执行,如 python/js ;

  • c++的运行
    在这里插入图片描述

  • 版本C++ 98、C++ 11、 C++ 14、 C++ 17、C++ 20

环境配置

集成开发环境Visual Studio ,编辑、编译;
下载地址
工具 -> 选项 可调整字体等
项目上右键 -> 设为启动项目,做项目切换;
Ctrl + k, c 注释;
Ctrl + k, u 取消注释;

 

第一个cpp程序

#include <iostream>    // 包含头文件
using namespace std;  // 使用std 命名空间/*多行注释
int, 返回值类型
main,主函数
arr, 形式参数
{}, 函数体
*/
int main(char* arr[]) { //一个项目中仅仅一个main函数// cout 输出  cin >> 变量 输入// << 流输出运算符// endl  结束一行cout << "Hello jack" << endl; // 必须分号结束// 系统调用system("pause"); // 暂停return 0;
}

在这里插入图片描述
选中源码-右键-编译,可以生成.obj目标文件;
选中项目-右键-生成(build),可以生成exe文件;
查看路径如下:
在这里插入图片描述

 

案例练习

  • 基于函数封装实现功能;
  • 输入用户名,输出欢迎信息;
#include <iostream>    // 包含头文件
using namespace std;  // 使用std 命名空间// 函数封装 void 表示 函数没有返回值
void welcomeUser() {cout << "请输入用户名:" << endl;// C++ 支持字符串类型  而C不支持string name;// 输入cin >> name;// 输出欢迎信息cout << "Welcome " << name << endl;
}int main(char* arr[]) {// 调用函数welcomeUser();// 系统调用system("pause"); // 暂停return 0;
}

也可以将该函数定义在另一个源文件中,本源文件内仅仅声明即可使用。声明如void welcomeUser(); 是没有函数体的;编译器会自动查找。

 

变量

  • 声明变量,即分配内存;
  • 命名以字母、数字、下划线,不以数字开头;
  • 在代码块{ }内部的变量为局部变量;在所有{}外的变量为全局变量
  • 局部变量必须先初始化赋值,才可以使用;而全局变量默认初始化;
  • 代码块内部,优先查找(作用域最小的)局部变量,使用 :: + 变量 访问全局变量;
#include <iostream>    // 包含头文件
using namespace std;  // 使用std 命名空间// 定义枚举类型
enum Sex
{MALE,  // 默认从0开始FEMALE
};int main(char* arr[]) {// 整型定义int age; // 变量的声明age = 23; // 初始化赋值// double  double score = 79.534;  // 声明并赋值  为变量定义float scoreF = 60.8f;// 字符串定义string name = "jack";string fullName = name + "li";  // 字符串的拼接// 布尔bool isGood = false;// 枚举enum Sex sex = MALE; // 定义 并赋值// 输出cout << "姓名:" << name << endl;cout << "全名:" << fullName << endl;cout << "性别:" << sex << endl;cout << "年龄:" << age << endl;cout << "分数:" << score << endl;cout << "是否好学生:" << isGood << endl;// 系统调用system("pause"); // 暂停return 0;
}
  • 变量基本类型(本质占用多少内存空间)
    • char, 字符类型 单引号+单字符;1byte;对应ASCII码整数值;
    • short,短整型 2bytes
    • int ,整型 2-4bytes,注意数据溢出,超出范围循环到另一端;一般使用int;
    • long,4bytes
    • long long 8bytes
    • unsigned short/int/long/long long 无符号(非负);
    • unsigned char 无符号的字符
    • float,单精度浮点型 4bytes
    • double 双精度,8bytes
    • string,字符串
    • bool,true/false,本质为整型
    • void 空类型;
    • 整数字面量默认为int; 可以后缀指定 LL 长整型/ ULL无符号长整型
    • 小数字面量默认为double; 指定后缀 f -> float,L -> long double;
    • 字符串的字面量是字符的数组;
       
  • 自定义类型
    • enum,枚举
    • struct,结构体
    • union,共用体
  • sizeof 查看占用内存大小
    • sizeof age
       

常量

  • const 类型 常量名=赋值;值不可更改;
  • #define ABC 5 宏定义常量;
  • 常量值不可更改
     

关系运算符

  • <、<=、 >、>= 优先;
  • ==、!= 次之
  • 表达式返回bool类型

逻辑运算符

&& 同true 则为true ,第一个为false,则不再计算第二个条件;
|| 有一个true 则返回true ,第一个为true,则不再计算第二个条件;
!取反
优先级
在这里插入图片描述

条件运算符

  • 表达式 ?值1 :值2
  • 表达式为true,则取值1;否则取值2
  • 优先级较低,一般使用()包裹;

位运算符

  • ~ 按位取反;
  • << 按位左移、>> 按位右移; 如 int a = 5; a << 2; 一般无符号的数左移、右移;
  • & 按位与,同1则为1;
  • | 按位或,有1则为1;
  • ^ 按位异或,相同则为0,不同则为1;
  • 优先级从上到下依次降低;

类型转换

  • 隐式转换,
    • 短的数据类型向长的数据类型转换;如int -> long long; 4 + 5.5 这里4转为double
    • short/char/bool 一般会转为int;
    • 判断时,0转为false,非0转为true;
    • 赋值时,右侧值类型转为左侧变量的类型;
  • 强制转换,长的类型向短的类型中转换;
    • int age = 5;
    • double aa =(double)age; // C风格
    • double bb = double(age); // C++风格
    • static_cast<double>(age)

分支

  • if …else
if (表达式) {}if (表达式) {}
else if (表达式) {}
else {}
  • switch
int age = 5;
switch(age){ // 必须传入数值case 1: 语句;break;case 2: 语句;brea;default: 语句;
}

案例1:输入一个人的姓名,分数,输出他的平分等级;
>=90 优秀;
>=80 良好;
>=70中等;
>=60及格;
否则,不及格

#include <iostream>using namespace std;int main() {// declarestring name;double score;cout << "输入姓名:" << endl; // endl换行//获取输入cin >> name;cout << "输入分数:" << endl;cin >> score;// 判断if (score >= 90) {cout << name << ":优秀" << endl;}else if (score >= 80) {cout << name << ":良好" << endl;}else if (score >= 70) {cout << name << ":中等" << endl;}else if (score >= 60) {cout << name << ":及格" << endl;}else {cout << name << ":不及格" << endl;}// system("dir");system("pause");return 0;
}

 
案例2: 输入绩效等级,输出奖金数额;
使用switch

#include <iostream>using namespace std;int main() {// declarechar level;cout << "输入等级:" << endl;cin >> level;switch (level) { // 传入数值case 'A': cout << 1000 << endl; break;case 'B': cout << 500 << endl; break;case 'C': cout << 300 << endl; break;default: cout << "没有奖励" << endl;}// system("dir");system("pause");return 0;
}

 

循环

  • while
  • do…while
  • for
    C是面向过程,为扩展C的功能,开发出了C++,扩展了面向对象、基于泛型的操作;
    C的所有语法在C++中基本都可以使用;
    由于C++的复杂性,基于C++ 实现了java语言,在保留好用的语法的同时,进行了不好的语法的修改;
     
    while循环:
#include <iostream>using namespace std;int main() {// declarechar level;int i = 3;// 用户循环输入while (1) {// 异常捕获try{cout << "输入等级:" << endl;cin >> level;switch (level) {case 'A': cout << 1000 << endl; break;case 'B': cout << 500 << endl; break;case 'C': cout << 300 << endl; break;default: cout << "没有奖励" << endl;}--i;cout << "i:" << 5 / i << endl; //  除0会退出进程continue;  // 继续下次循环}catch (const std::exception&)  // 异常捕获 与java js类似{cout << "捕获异常" << endl;break; // 结束循环}}// system("dir");system("pause");return 0;
}

 
do…while:

int i = 10;
do {cout << "current i:" << i << endl;--i;
}while(i > 0);

 
for循环:

// C 的用法
int i;   
for(i=0; i < 10; i++){ // 满足i<10,则执行代码块,最后执行i++,再判断是否满足条件cout << "current i:" << i << endl;
}// 遍历数组元素  同java
int arr[] = {1, 2, 5, 9};
for (int e : arr) {if (e % 5 == 0) {continue; // 继续下次循环,后面的代码不再执行}else if(e / 3 == 3){break; // 结束循环}elsecout << e << endl;
}
// 最终输出 1 2 

&nbsp;
goto 标签: 跳转到语句块,不推荐使用

#include <iostream>
using namespace std;int main() {goto laufing; // 语句块 跳转 windows批处理支持goto// 声明语句块
laufing: cout << "input your name:" << endl;string name;cin >> name; // 直接输入空格,不会停止扫描,输入字符串后遇到空格则停止// name.empty()  是否为空// name.length() 长度// name.at(idx)  获取对应索引处的字符// name.substr(start_idx, count)  从idx索引开始,截取count个字符// name.find(sub_string)  返回找到的第一个位置的索引,找不到则返回一个很大的数字// name.rfind(sub_string) 从右边开始查找,返回第一个的起始索引// name.clear() 清空该地址的字符串if (name.empty()) { // 字符串为空cout << "empty name" << endl;goto laufing;}else if (name.length() < 2) {cout << "to short" << endl;goto laufing;}else{cout << "idx 0:" << name.at(0) << endl;cout << "substr:" << name.substr(1, 3) << endl;cout << "find:" << name.find("ja") << endl;cout << "find:" << name.rfind("ja") << endl;name.clear();cout << "clear:" << name << endl;}// system("dir");system("pause");return 0;
}

 

程序调用

  • 源代码打断点,直接在对应的行处点击;再次点击取消断点
    在这里插入图片描述
  • 调试快捷键
    • F5 开始调试,shift+F5 结束调试,Ctrl+F5 直接执行(不调试)
    • F11 逐行执行,shift+F11 到下一个断点;
    • shift+F9 快速监视变量值,选中一个变量->shift+F9,点击‘添加监视’
      在这里插入图片描述
    • 也可以点击菜单栏的‘调试’;

 

综合案例

  • 输入一个自然数 n,判断是否为质数;
    • 只能被1和自身整除,则为质数;
    • 1和自身 不用判断,可以取 2 -> n / 2 之间的值,依次判断是否被n整除;
    • n特别大时,为优化性能,可以取 2 - > sqrt(n)之间的值来判断;
#include <iostream>
using namespace std;// bool是函数返回值类型
// n是函数的形式参数
bool isPrimer(int n){  //定义一个函数int i = 2;int upperVal = n / 2;// 标志位bool flag = true;while (i <= upperVal) {if(n % i == 0){flag = false;break;}++i;}if (flag) {cout << n << "是质数" << endl;return 1;}else {cout << n << "不是质数" << endl;return 0;}
}int main() {int n;cout << "input a value:" << endl;cin >> n;isPrimer(n);// system("dir");system("pause");return 0;
}
  • 输入一个自然数n,输出n以内的所有质数;
int i;
for(i=2; i <= n/2; i++){if(isPrimer(i))cout << i << endl;  // 单行语句,可以省略 { }elsecontinue;
}

 

  • 猜数字游戏
    • 程序运行时,随机设定一个目标数值;
    • 让用户输入一个数字,与目标数值比较;
    • 大于目标值,则输出‘大了’;
    • 小于目标值,则输出‘小了’;
    • 等于目标值,则输出“恭喜,猜对了”

int main() {//当前时间戳 秒int curTimestamp = time(0);  // python中 time.time() 获取时间戳 秒  // js: new Date().getTime() 毫秒// 设置随机数种子// srand(10); 种子固定,则每次运行程序时,都产生同样的随机数,为了产生不同的随机数// 需要设置随机数的种子,即伪随机  --不是真正的随机srand(curTimestamp);//生成 100 内的随机数int target = rand() % 100;  // 1000以内就 %1000int guessTimes = 5;int curTimes = 1;int guessVal;while (curTimes <= guessTimes) {// 让用户输入cout << "input your guess:" << endl;cin >> guessVal;if (guessVal < target) {cout << "小了" << endl;++curTimes;}else if (guessVal > target) {cout << "大了" << endl;++curTimes;}else {cout << "恭喜,猜对了" << endl;break;}}if (curTimes > guessTimes) {cout << "game over" << endl;}// system("dir");system("pause");return 0;
}

 
 

下一篇:C++ 教程 - 02 复合数据结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下分卷解压文件

我的文件是这样的&#xff1a; 存放路径为&#xff1a;C:\Users\Luli_study\MICCAI_MMAC\fudanuniversity\DDR dataset 首先要进入分卷文件的目录cd&#xff1a; 第一步&#xff1a;cd /path/o/分卷问文件目录 第二步&#xff1a; 执行之后的结果(红色框出来的)&#xff1a; …

Vellum —— Fluid

目录 Vellum fluids setups Fluid tips and troubleshooting Fluid phases Vellum fluids and soft bodies Vellum fluid vs FLIP fluid Vellum fluids setups Vellum fluid solver是基于粒子流体的解算框架&#xff0c;被完全集成到了Vellum动力学系统&#xff08;可与gr…

王道数据结构课后代码题 p149 第3—— 7(c语言代码实现)

目录 3.编写后序遍历二叉树的非递归算法 4.试给出二叉树的自下而上、自右到左的层次遍历算法 &#xff08;有图解代码详解&#xff09;c语言代码实现 5.假设二叉树采用二叉链表存储结构&#xff0c;设计一个非递归算法求二叉树的高度。 ​编辑 6.设一棵二叉树中各结点的值互不…

普冉(PUYA)单片机开发笔记(7): ADC-轮询式多路采样

概述 应用中经常会有使用单片机进行模数转换的需求。PY32F003 具有 1 个 12 位的模拟数字转换器&#xff08;ADC&#xff09;&#xff0c;今天我们一起来使用一下这个 ADC。 数据手册中对 ADC 简介如下。 SAR ADC&#xff1a;逐次逼近式 ADC&#xff0c;原理参见“参考链接&a…

class070 子数组最大累加和问题与扩展-上【算法】

class070 子数组最大累加和问题与扩展-上【算法】 code1 53. 最大子数组和 // 累加和最大子数组和 // 给你一个整数数组 nums // 请你找出一个具有最大累加和的非空子数组 // 返回其最大累加和 // 测试链接 : https://leetcode.cn/problems/maximum-subarray/ dp[i]&#xff…

【Docker】Docker Compose,yml 配置指令参考的详细讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

基于c++版数据结构基于数组栈改-Python思维总结

##栈部分-&#xff08;叠猫猫&#xff09; ##抽象数据类型栈的定义&#xff1a;是一种遵循先入后出的逻辑的线性数据结构。 换种方式去理解这种数据结构如果我们在一摞盘子中取到下面的盘子&#xff0c;我们首先要把最上面的盘子依次拿走&#xff0c;才可以继续拿下面的盘子&…

【Java期末复习资料】(2)常见例题 //持续更新

本文章主要是常见例题&#xff0c;解析不会太详细&#xff0c;有问题、不会的可以给我发消息哦&#xff0c;后续会出模拟卷 常见例题&#xff1a; 1.下列跟Java技术平台有关的是&#xff08;ABD&#xff09; A.JVM B.JDK C.JPN D.JRE 2.面向对象的特征包括&#xff08;ACD&…

wxPython的控件tree

wxPython树控件介绍 树&#xff08;tree&#xff09;是一种通过层次结构展示信息的控件&#xff0c;如下图所示是树控件示例&#xff0c;左窗口中是树控件&#xff0c;在wxPython中树控件类是wx.TreeCtrl。 wx.TreeCtrl常用的方法有 AddRoot(text, image-1, selImage-1, data…

在Deepin中安装x11vnc工具并结合内网穿透软件实现远程访问桌面

文章目录 1. 安装x11vnc2. 本地远程连接测试3. Deepin安装Cpolar4. 配置公网远程地址5. 公网远程连接Deepin桌面6. 固定连接公网地址7. 固定公网地址连接测试 x11vnc是一种在Linux系统中实现远程桌面控制的工具&#xff0c;它的原理是通过X Window系统的协议来实现远程桌面的展…

P4 Qt如何添加qss样式表文件和添加图片资源

目录 前言 01 添加图片资源文件 02 添加qss文件 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Qt基础_ChenPi的博客-CSDN博客》✨✨✨ &#x1f33a;本篇简介 &#xff1a;这一章…

JVM Optimization Learning(六)

目录 一、JVM Optimization 1、Shenandoah Shenandoah的使用方法 2、ZGC ZGC的版本更迭 ZGC的使用方法 ZGC的参数设置 3、JMH测试GC性能 一、JVM Optimization 1、Shenandoah Shenandoah是由Red Hat开发的一款低延迟的垃圾收集器&#xff0c;Shenandoah并发执行大部分…

机器人纯阻抗控制接触刚性环境(阻尼影响因素)

问题描述 在机器人学中&#xff0c;阻抗控制是一种常用的控制策略&#xff0c;用于管理机器人在与环境交互时的运动和力。阻抗控制背后的关键概念是将环境视为导纳&#xff0c;而将机器人视为阻抗。 纯阻抗控制接触刚性环境时&#xff0c;机器人的行为方式主要受其阻抗参数的…

【开源】基于Vue和SpringBoot的车险自助理赔系统

项目编号&#xff1a; S 018 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S018&#xff0c;文末获取源码。} 项目编号&#xff1a;S018&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 车…

Maven基础

目录 Maven坐标 坐标简介 主要组成 Maven依赖管理 配置依赖 依赖简介 配置依赖 依赖传递 依赖传递简介 排除依赖 依赖范围 生命周期 生命周期简介 执行指定生命周期 Maven坐标 坐标简介 Maven中的坐标是资源的唯一标识&#xff0c;通过该坐标可以唯一定位资…

Python开发运维:Python调用K8S API实现资源管理

目录 一、实验 1.Python操作K8S API获取资源 2.Python操作K8S API创建deployment资源 3.Python操作K8S API删除k8s资源 4.Python操作K8S API修改k8s资源 5.Python操作K8S API查看k8s资源 二、问题 1.Windows11安装kubernetes报错 2.Python通过调用哪些方法实现Pod和De…

在SpringData JPA 中实现对持久层的操作

1.导入依赖 hibernate 这个依赖自带实现JPA接口 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><depen…

CrystalDiskInfo中文版(硬盘检测工具) v9.1.1.0 绿色汉化版-供大家学习研究参考

更新内容 重新支持三星SATA SSD寿命报告 增加对ZHITAI SC001的支持 新增SK hynix Gold S31支持 增加了KLEVV NEO N610的支持。 改进的Micron/Crucial SATA SSD支持 已更改 卸载程序将显示一个确认对话框&#xff0c;用于删除设置。 强大功能 1.拥有多国语言&#xff0c;…

045:Vue读取本地上传JSON文件,导出JSON文件方法

第045个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

jquery手写广告轮播图,无限循环功能

说明 在很多情况下&#xff0c;我们都需要开发广告轮播图&#xff0c;当我们进行页面的功能开发时&#xff0c;采用轮播图来实现也行&#xff0c;但是很多情况下&#xff0c;我们只需要简单的控制轮播循环轮播展示即可&#xff0c;所以用jq开开发广告轮播波&#xff0c;自定义…