C++入门到进阶(图文详解,持续更新中)

news2024/9/17 8:56:01

C++入门到进阶(图文详解,持续更新中)

目录

C++入门到进阶(图文详解,持续更新中)

数据

数据类型

基本数据类型/内置数据类型

C++常用运算符

赋值运算符

关系运算符

逻辑运算符

杂项运算符

数据的本地化存储

一、准备工作:

二、写流即向本地文件中写入数据该如何实现?

1.创建写流的对象或创建写流的变量

2.打开文件执行,准备执行写数据(称为开流)

3.对本地写数据

4.关闭流

三、读流(即从本地文件中读取数据)

1.创建读流对象

2.打开文件准备读取数据(称为开流)

3.开始从本地读取数据

4.关闭流

函数

函数的声明和定义

​编辑

函数传值

传出数据(即返回值)

传入数据(即传参)

1.什么是传参?

2.作用

3.类型

4.关于形参在函数声明和函数定义中注意点

5.默参

6.函数重载

7.传参方式

面向对象


数据

数据类型

基本数据类型/内置数据类型

整型:有符号与无符号

int

unsignedf int

long

unsigned long int

short int

ushort

byte

sbyte

long int

unsigned long int

浮点型/实型:

float

double

long double

字符型:

char

布尔型:

bool

C++常用运算符

赋值运算符

基本赋值运算符:=

复合赋值运算符:+=(加赋值)、-=(减赋值)、*=(乘赋值)、/=(除赋值)、%=(求余赋值)、 <<=(左移赋值)、>>=(右移赋值)、&=(按位与赋值)、|=(按位或赋值)、*A=(按位异或赋值)

关系运算符

== != < > <= >=

逻辑运算符

&& || !

杂项运算符

sizeof和三目运算符

数据的本地化存储

一、准备工作:

实现本地化存储需要

头文件为:iostream,ofstream

引入头文件

#include<iostream>

#include<ofstream>

命名空间为:std

引入命名空间:

using namespace std;

二、写流即向本地文件中写入数据该如何实现?

使用ofstream的方法,操作步骤为:

1.创建写流的对象或创建写流的变量

ofstream ofs;

2.打开文件执行,准备执行写数据(称为开流)

ofs.open("abc.txt", ios::out);

3.对本地写数据

string name;

getline(cin, name,'q');

ofs << name << endl;

4.关闭流

ofs.close();

三、读流(即从本地文件中读取数据)
1.创建读流对象

 ifstream ifs;

2.打开文件准备读取数据(称为开流)

ifs.open("abc.txt", ios::in);

3.开始从本地读取数据

方法1:
 char ValueArrays[1024]{};

 while (ifs >> ValueArrays)//非零即为真
    {
        cout << ValueArrays << endl;//这是字符串的打印
    }

方法2:

string str = " ";
    while (ifs >> str)
    {
        cout << str << endl;
    }

4.关闭流

 ifs.close();

存储案例展示:(存储数据到UserInfo的txt文本中,读取数据,新增数据,查找相关姓名、年龄、地址)

#include <iostream>
#include<fstream>  
#include<string>
#include"User.h"
/*
预处理
#include中的" "和<>的使用
<>:代表的导入C++库文件
“ ”:先检索是否有没有自己写的头文件,如果检索不到自己写的头文件,会自动查找C++库,找不到就报错
*/


using namespace std;
void Save()
{
    using namespace std;
    ofstream ofs;
    ofs.open("abc.txt", ios::out);
    string name;
    getline(cin, name,'q');
    ofs << name << endl;
    
    
    ofs.close();
  
}
int name_index = 0;
void Add(string nameArrays[])//name是一个形参,需要一个string 类型数组的地址
{
    string name = " ";
    cin >> name;
    nameArrays[name_index] = name;
    name_index++;
    ofstream ofs;
    ofs.open("abc.txt", ios::out);
    for (int i = 0; i < name_index; i++)
    {
        ofs << nameArrays[i] << endl;
    }
    ofs.close();
}

void GetValue()
{
    using namespace std;
    //1. 创建对象
    ifstream ifs;
    //2. 开流
    ifs.open("abc.txt", ios::in);
    //3.读取数据,方法1
        //3.1数据本地读取出来了,需要找到一个容器去存放读取出来的数据
    char ValueArrays[1024]{};
        //3.2开始取出数据,并将本地数据在数据中
    while (ifs >> ValueArrays)//非零即为真
    {
        cout << ValueArrays << endl;//这是字符串的打印
    }
    ifs.close();
    cout << "---------" << endl;
    //3.读取数据,方法2
        //3.1数据本地读取出来了,需要找到一个容器去存放读取出来的数据
        //读取不走回头路
    ifs.open("abc.txt", ios::in);
    string str = " ";
    while (ifs >> str)
    {
        cout << str << endl;
    }
    ifs.close();
    cout << "--------" << endl;
    //3.读取数据,方法3 借助一个ifstream里的一个函数getline
    ifs.open("abc.txt", ios::in);
    char buf[1024]{};
    while (ifs.getline(buf, sizeof(buf)))//getline是ifstream下的一个函数,用于获取到一行数据,函数的第一个参数是用于接收一行数据的字符数组,
        //第二个参数是用于接收数据的容器的大小

    {
        cout << buf << endl;
    }
    ifs.close();
    cout << "--------" << endl;

    //3.读取数据,方法4 借助一个string里的一个函数getline
    ifs.open("abc.txt", ios::in);
    string str_buf = {};
    while (getline(ifs, str_buf))
    {
        cout << str_buf << endl;
    }
    ifs.close();

    cout << "--------" << endl;

    //3.读取数据,方法5 借助一个ifstream里的一个函数eof
    ifs.open("abc.txt", ios::in);
    char eof_buf[1024]{};
    while (!ifs.eof())
    {
        ifs >> eof_buf;
        cout << eof_buf << endl;
    }
    ifs.close();
}

void SetValue()
{
    string name = " ";
    string age = " ";
    string address = " ";
    cout << "请输入姓名:" << endl;
    cin >> name;
    cout << "请输入年龄:" << endl;
    cin >> age;
    cout << "请输入地址:" << endl;
    cin >> address;
    ofstream ofs;
    ofs.open("Value.txt", ios::out);
    ofs << name << "  ";
    ofs << age << "  ";
    ofs << address << endl;
    ofs.close();
}

void SelValue()
{
    string r_name = " ";
    string r_age = " ";
    string r_address = " ";
    ifstream ifs;
    ifs.open("Value.txt", ios::in);
    while (ifs >> r_name && ifs >> r_age && ifs >> r_address)
    {
        cout << "姓名:" << r_name << ",年龄:" << r_age << ",地址:" << r_address << endl;
    }
    ifs.close();
}

//增加用户
User uArray[6] = {};
int uSize = 0;
void AddUser()
{
    string name;
    int age;
    string address;
    cout << "输入姓名:" << endl;
    cin >> name;
    cout << "输入年龄:" << endl;
    cin >> age;
    cout << "输入地址:" << endl;
    cin >> address;

    User uInstance;
    uInstance.name = name;
    uInstance.age = age;
    uInstance.address = address;

    uArray[uSize] = uInstance;
    uSize++;
    ofstream ofs;
    ofs.open("UserInfo.txt", ios::out);
    for (int i = 0; i < uSize; i++)
    {
        ofs << uArray[i].name << " ";
        ofs << uArray[i].age << " ";
        ofs << uArray[i].address << endl;
    }
    ofs.close();
}

int Find(string name)
{
    for (int i = 0; i < uSize; i++)
    {
        if (uArray[i].name == name)
        {
            return i;
        }
    }
    return -1;
}


//查询所有人的所有信息
void SelAllUser()
{
    ifstream ifs;
    ifs.open("UserInfo.txt", ios::in);
   //is_open判断上一行代码中打开的文件是否存在
    //存在返回真,不存在返回假
    /*if (ifs.is_open())
    {
        cout << "文件存在" << endl;
    }
    else
        cout << "文件不存在" << endl;*/
    if (!ifs.is_open())
    {
        cout << "文件不存在" << endl;
        return;//文件不存在,下方逻辑不用执行
    }
    char buf[1024];
    ifs >> buf;
    if (ifs.eof())
    {
        cout << "文件存在,但没数据" << endl;
        return;//下方逻辑无需进行
    }
    ifs.close();
    ifs.open("UserInfo.txt", ios::in);
    int i = 1;
    string name;
    int age;
    string address;
    while (ifs >> name && ifs >> age && ifs >> address)
    {
        cout << "第" << i << "人的姓名是" << name << ",年龄是" << age << ",地址是" << address << endl;
    }
   
}
//查询某个人的所有信息
void SelUser()
{
    cout << "输入名字" << endl;
    string sel_name = " ";
    cin >> sel_name;
    int index = Find(sel_name);//Find()会返回一个int类型的值
    if (index != -1) {}//
    ifstream ifs;
    ifs.open("UserInfo.txt", ios::in);
    string name = " ";
    int age = 0;
    string address = " ";

    while (ifs >> name && ifs >> age && ifs >> address)
    {
        if (name == sel_name)
        {
            cout << "用户名为:" << name << ",年龄是:" << age << ",地址是:" << address << endl;
        }
    }
}
//初始化
int Init()
{
    ifstream ifs;
    ifs.open("UserInfo.txt", ios::in);
    if (!ifs.is_open())
    {
        cout << "文件不存在" << endl;
        return -1;//文件不存在,下方逻辑不用执行
    }
    char buf[1024];
    ifs >> buf;
    if (ifs.eof())
    {
        cout << "文件存在,但没数据" << endl;
        return -1;//下方逻辑无需进行
    }
    ifs.close();
    ifs.open("UserInfo.txt", ios::in);
    int i = 0;
    string name;
    int age;
    string address;
    while (ifs >> name && ifs >> age && ifs >> address)
    {
        uArray[i].name = name;
        uArray[i].age = age;
        uArray[i].address = address;
        i++;
    }
    return i;
}
int main()
{   
    //string str = {};
    //getline(cin, str, 'q');//控制台输入数据,赋值到str中,按q键再按回车键结束
    //getline(cin, str, '\t');//控制台输入数据,赋值到str中,按Tab键然后再按回车结束
    //cout << str << endl;
    //Save();
    //GetValue();
    //SetValue();
   // SelValue();
    int addIndex = Init();

    while (true) {
        cout << "添加:1,查询:2,退出:0" << endl;
        int selecter;
        cin >> selecter;
        switch (selecter)
        {
        case 0:
            exit;
            break;
        case 1:
            AddUser();
            break;
        case 2:
            SelAllUser();
            break;
        }
    }
    system("pause");
}

函数

函数的声明和定义

函数声明的作用:代表的是函数的出生位置(占位置的),如果在文件最上方的位置声明了函数,不用担心函数和函数之间互相调用编译不通过的问题

函数的定义:为函数声明写函数体(写逻辑)

注 :可能出现的bug,函数只有声明,没有定义,这个函数却被调用了,被编译时期的异常error

函数传值

传出数据(即返回值)

作用:在函数内传数据出函数

样式

返回类型 函数名称(参数)

{

        return 对应返回类型的值;

        //此处的return有双重作用:

        1.跳转语句(跳出函数)

        2.返回值

}

可以返回的值:

1.对应返回类型的值

2.对应返回类型的变量

3.带同种返回类型返回值的函数调用——先执行函数调用,再返回值

传入数据(即传参)
1.什么是传参?

传参就是实参传入形参

2.作用

在函数外部传入数据到函数内部

3.类型

形参:在函数声明和定义的时候写的是行参

实参:在函数调用的时候 传递的值是实参

实参的种类:

(1)对应形参类型的值

(2)对应形参类型的变量

(3)带同种返回类型返回值的函数调用,即先执行函数调用,再传参数(实参传参数)

4.关于形参在函数声明和函数定义中注意点

(1)声明的形参参数名称和定义的形参参数名称

(2)可以不一样声明的时候可以省略参数名称

(3)如果存在函数的默参,默认是必须写在函数声明位置的,不可以在声明和定义中都写一遍默参

5.默参

作用:函数可以在声明或者定义的时候给出默认的逻辑执行

  • 关于默参的放置位置说明

    • 如果只有一个默参

      • 放在参数结尾处(最右侧)

    • 如果有多个默参

      • 从右到左依次给出默参,中间不可以隔开使用

        • 错误演示:void Function(int i=10,int a,bool b=false)

        • 正确演示::void Function(int i=10,int a=10,bool b=false)

6.函数重载
  • 函数名相同,但是函数参数(参数类型)不同,通过传入不同的实参,调用不同的函数,执行不同的功能

  • 注意:

    • 函数返回值不参与函数重载的过程

    • 如果被重载的函数中出现了默参

      • 建议不要写成重载函数

      • 如果不接受建议,就需要保证默参的几个参数类型与其他被重载的函数的参数不一致

7.传参方式

(1)值传递:值传递只能影响本函数,值的修改不会影响其他的功能,也不会影响到实参

(2)地址传递

(3)引用传递

面向对象

待更新.....

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

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

相关文章

VBA即用型代码手册:删除完全空白的行

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

Hadoop的HA模式搭建

准备三台虚拟机 bigdata007&#xff0c;bigdata008&#xff0c;bigdata009 1.前置工作 1.修改虚拟机的IP地址和hostname 2.配置集群中的ip映射&#xff08;/etc/hosts&#xff09; 192.168.111.57 bigdata007 192.168.111.58 bigdata008 192.168.111.59 bigdata0093.关闭虚拟…

千万慎投!自引率高达93%!这16本On hold正处于高危状态,无法检索,剔除岌岌可危中!近四年镇压期刊“出狱”情况一览

本周投稿推荐 SCI • 能源科学类&#xff0c;1.5-2.0&#xff08;25天来稿即录&#xff09; • CCF推荐&#xff0c;4.5-5.0&#xff08;2天见刊&#xff09; • 生物医学制药类&#xff08;2天逢投必中&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09…

昇思25天学习打卡营第19天|LSTM+CRF序列标注

概述 序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。 条件随机场&#xff08…

thinkphp 生成邀请推广二维码,保存到服务器并接口返回给前端

根据每个人生成自己的二维码图片,接口返回二维码图片地址 生成在服务器的二维码图片 控制器 public function createUserQRcode(){$uid = input(uid);if

【VUE进阶】安装使用Element Plus组件

Element Plus组件 安装引入组件使用Layout 布局button按钮行内表单菜单 安装 包管理安装 # 选择一个你喜欢的包管理器# NPM $ npm install element-plus --save# Yarn $ yarn add element-plus# pnpm $ pnpm install element-plus浏览器直接引入 例如 <head><!-- I…

万字总结XGBoost原理、核心参数以及调优思路(上篇)

万字总结XGBoost原理、核心参数以及调优思路&#xff08;上篇&#xff09; 在数据科学领域&#xff0c;XGBoost以其卓越的性能和灵活性&#xff0c;成为了众多机器学习算法中的佼佼者。作为一种梯度提升框架&#xff0c;XGBoost通过构建决策树的集合来最小化一个可微分的损失函…

简洁易用,快速制作高品质产品册的工具

在数字化时代&#xff0c;高效制作高品质产品册的需求日益增长。市场上涌现出众多声称能够帮助快速制作产品册的工具&#xff0c;但真正能兼顾简洁易用和品质的却寥寥无几。 ​这款工具名为“FLBOOK”&#xff0c;它凭借其强大的功能和简单易用的操作界面&#xff0c;赢得了众多…

深入理解FFmpeg--libavformat接口使用(一)

libavformat&#xff08;lavf&#xff09;是一个用于处理各种媒体容器格式的库。它的主要两个目的是去复用&#xff08;即将媒体文件拆分为组件流&#xff09;和复用的反向过程&#xff08;以指定的容器格式写入提供的数据&#xff09;。它还有一个I/O模块&#xff0c;支持多种…

自动化回复信息工具的开发分享!

在当今信息爆炸的时代&#xff0c;无论是个人还是企业&#xff0c;都面临着大量的信息处理和回复工作&#xff0c;为了提高效率&#xff0c;自动化回复信息工具变得越来越重要。 本文旨在分享一个简单但实用的自动化回复信息工具的五段源代码开发过程&#xff0c;帮助读者理解…

Datawhale 2024 年 AI 夏令营第二期——电力需求预测挑战赛

#AI夏令营 #Datawhale #夏令营 1.赛事简介 随着全球经济的快速发展和城市化进程的加速&#xff0c;电力系统面临着越来越大的挑战。电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。 2.赛事任务 给定多个房屋对应电力消耗历史N天的相关…

水库水电站泄洪预警系统解决方案

一、方案背景 水电站建立的初衷有两个&#xff0c;一是用于发电&#xff0c;二是用于调节水量&#xff0c;解决下游洪涝灾害。水电站在丰水期蓄水、枯水期泄洪&#xff0c;泄洪时产生的水流又急又大&#xff0c;对电站大坝及下游存在巨大危险。为了加强水电站工程安全管理&…

对比H100与4090:两者谁才是更好的GPU算力选择?

在进行深度学习和人工智能的应用时&#xff0c;挑选最合适的硬件工具对于模型的训练和推断任务显得尤为关键。尤其在大模型的训练上&#xff0c;英伟达4090或许并不是最合适的选项。进行训练任务时&#xff0c;通常要求有更大的显示存储容量、更宽的内存带宽以及更出色的计算性…

浅说背包问题(上)

背包问题 什么是背包问题背包的分类01背包思路一思路二思路三&#xff08;重头戏&#xff09;常规代码空间优化 例题讲解[NOIP2001 普及组] 装箱问题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 最大约数和题目描述输入格式输出格式样例 #1样例输入 #1样例…

商品分类左右联动

1、先看效果 2、以hooks方法处理&#xff0c;方便复制使用&#xff0c;见代码 Good.vue文件 <script setup lang"ts" name"goods">import {onMounted, ref, nextTick} from "vue";import useProductScroll from "/utils/hooks/useP…

halcon序列化机制

可以结合halcon算子的.net程序进行面向对象的编程&#xff1a; 源码如下&#xff1a; 打开算子的.net程序&#xff1a; 将程序运用到C#中&#xff1a; halcondonet.dll源码解读 halcon与C#联合编程的demo halcon的序列化机制 采用二进制进行序列化保存和反序列化 步骤&#…

GigE Vision GVCP/GVSP

GIGE协议&#xff0c;全称Gigabit Ethernet Vision协议&#xff0c;是一种基于千兆以太网&#xff08;Gigabit Ethernet&#xff09;技术开发的相机接口标准&#xff0c;主要用于高速图像采集和处理。该协议通过以太网技术实现图像数据和控制信号的传输&#xff0c;具有低成本、…

【Conda】命令大全 + 包安装报错一招解决

conda常用命令总结 一、conda常用命令大全 命令用法命令获取版本号conda -V conda --version获取帮助conda -h conda --help获取环境相关命令的帮助conda env -h所有 --单词 都可以用 -单词首字母来代替比如 -version 可以用 -V来代替&#xff0c;只不过有的是大写…

float、double

按照这个规定&#xff0c;单精度浮点数&#xff08;float&#xff09;这个数据类型所占内存大小为4个字节&#xff0c;也就是32位&#xff0c;所以单精度浮点数也叫32位浮点数&#xff0c;它在内存或硬盘中要占用32个比特。 单精度浮点数的尾数部分用23位存储&#xff0c;加上默…

贝叶斯估计模型及 Stata 具体操作步骤

目录 一、引言 二、贝叶斯估计的理论原理 三、Stata 代码示例 四、结果解读与分析 一、引言 贝叶斯估计作为一种强大的统计推断方法&#xff0c;在结合先验信息和样本数据以获得更准确的参数估计方面具有显著优势。本文将深入探讨贝叶斯估计的理论原理&#xff0c;并通过 St…