C++学习/温习:新型源码学编程(三)

news/2025/2/28 6:41:46/

写在前面(祝各位新春大吉!兔年如意!)

  • 【本文持续更新中】
  • 面向初学者撰写专栏,个人原创的学习C/C++笔记(干货
  • 所作源代码输出内容为中文,便于理解
  • 如有错误之处请各位读者指正
  • 请读者评论回复、参与投票,反馈给作者,我会获得持续更新笔记干货的动力。

致粉丝:可以在阅读完我的文章后,自己尝试写一点原创心得(哪怕一行字也好)。
               希望众(尽管840个🤣)粉丝多多支持、浏览、自我创作@_@


知识点概览

写在前面(祝各位新春大吉!兔年如意!)

知识点概览

C++ Primer Plus编程练习4.13笔记

一.姓名成绩年龄打印

1.预处理指令#define

2.char类型

3.getline(); C++库函数(重点)

二.string类

 1.头文件 string 

2.string声明变量

3.getline()函数在string类操作

三.使用strcpy和strcat复制字符串

1.Visual Stdio2022 编译器解除警报错误

2.strcpy 复制字符串的函数

3.strcat 附加字符串的函数

四.使用string对象和string类的粘贴与拼接

1.string类的粘贴方法

2.string类的输入(见前文)

3.string类的拼接方法

五.C++结构(OOP的基石)

 六.C++结构数组

结语

C++ Primer Plus编程练习4.13笔记

一.姓名成绩年龄打印

编写一个C++程序,输出姓名、成绩与年龄。注意,英文输入姓名包含多个单词(中间有空格)。
另外,上调成绩字母,若输入A则上调为B。

//4.13_1.cpp
//整行输入函数cin.getline();
#include<iostream>
#define NameMax 100
using namespace std;
int main()
{char firstName[NameMax];//英文习惯,名前姓后char lastName[NameMax];//lastname为姓,firstname为名char grade;int age;cout << "请输入你的名:\n";cin.getline(firstName,NameMax);//库函数,接受字符串对象名与字符串长度信息做参数cout << "请输入你的姓:\n";cin.getline(lastName, NameMax);//整行输入,检测到Enter自动截断输入cout << "请输入你的成绩(字母等级):\n";cin >> grade;grade += 1;cout << "请输入你的年龄:\n";cin >> age;cout << "姓名:"<<lastName<<","<< firstName <<endl;cout << "成绩:" << grade<<endl;//等级+1,ASCII码+1cout << "年龄:" << age << endl;return 0;
}

1.预处理指令#define

#define NameMax 100
定义全局常量NameMax为100
就像 #include<iostream> 一样,在C++预处理器中,编译器提前了解到要使用头文件 iostream ,这条预处理指令的宏 NameMax 定义为 100 ,全局可用,自动将出现 NameMax的地方置换为值100。

2.char类型

char firstName[NameMax];
char lastName[NameMax];
char grade; 
char类型可以声明字符或字符串(数组)。
char 变量名 ;声明一个字符,可以容纳数字、字母等。
单一字符可以执行算术运算,本例中读取输入的字母,并给其ASCII码+1,再有cout来将类型自动还原,从ASCII码值转换为字符。
char 变量名[字符串长度]; 声明一个字符串,可以容纳多个数字、字母,句子、词组等信息。
此程序将字符串长度设置为名叫NameMax值为100的常量。

!注意:字符串(数组)实际存储比数值长度短1的

3.getline(); C++库函数(重点)

面向行的输入getline()函数,通常有两个参数(后续介绍第三个参数),在头文件istream中,是C++中cin输入的类成员函数,可以不受空格影响,而是在读取到 Enter 键或达到输入上限时截断输入。
示例:
cin.getline(firstName,NameMax); cin通过句点“.”操作符访问它的成员函数getline(); ,示例中让getline函数读取长度为NameMax-1的名叫firstName的数组(字符串),并将读取值返回给该数组。
注:因为函数读取最后会加上空字符标志字符串(数组)结束,同时不会储存换行符,而get();函数会读取并储存换行符。
常用格式:
cin.getline(数组名,数组长度)

源代码运行示例:

二.string类

用string类改写程序清单4.4
(此处不展示原程序清单4.4,原程序使用cin.getline()函数,定义2个长为20的字符串存储姓名与甜点,再打印出来。)

//4.13_2.cpp
//C++中的string类,打印姓名、甜点
#include<iostream>
#include<string>//包含string类的头文件
using namespace std;
int main()
{string name, dessert;//声明2个string类变量cout << "Enter your name:\n";getline(cin,name);	//获取整行输入,参数1的cin说明从哪里获取输入//参数2的name是string类变量,自动调整变量长度//注:char[];声明数组(字符串)类型,string声明普通变量。cout << "Enter your favourite dessert:\n";getline(cin, dessert);cout << "I have some delicious " << dessert<< " for you," << name<<".\n";return 0;
}

 1.头文件 string 

旧版C++实现中使用C++库中头文件<string.h>,新标准中直接使用<string>头文件

2.string声明变量

string类与char类型不同, char[]; 声明数组(字符串)类型, string 声明普通变量
像其他声明一样,只需要在 string 后加上变量名即可。

3.getline()函数在string类操作

常用格式:
getline(cin,string类变量名)

这里的getline函数不是cin的类成员函数。因为最初设计getline时没有string类,所以在cin中也没有直接的对于string类的输入操作。后加入了上述格式的整行输入操作,然而这里的getline()函数不附属于cin类之下,存在于头文件中。
上面的getline函数 getline(cin,string类变量名)  中,cin为getline函数指明获取输入的位置,而长度是由string类的变量自己调整的,所以省去具体长度数值。
输出时string类变量按照欧通变量处理。

源代码运行示例:

三.使用strcpy和strcat复制字符串

编写一个程序,要求用户先输入其名,再输入其姓;然后程序使用一个逗号和空格将姓和名组合起来,并存储和显示组合结果。请使用char数组和头文件cstring中的函数。

//4.13_3.cpp
//使用strcpy和strcat复制字符串
#pragma warning(disable : 4996)//解除编译器strcpy和strcat警告
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int main()
{char firstName[40];//英文习惯,名前姓后char lastName[40];//lastname为姓,firstname为名char total[84];cout << "请输入你的名:\n";cin >> firstName;cout << "请输入你的姓:\n";cin >> lastName;strcpy(total, lastName);strcat(total, ", ");strcat(total, firstName);cout << "姓名:" <<total << endl;return 0;
}

1.Visual Stdio2022 编译器解除警报错误

#pragma warning(disable : 4996) 

解除编译器警告。在出现一些对于编译器给出的完全不会出问题的错误警告时,可以使用上述代码,可以将上面的 4996 用实际警告标号来代替

2.strcpy 复制字符串的函数

strcpy可以将char数组(或普通字符串)从参数二复制到参数一
示例:

strcpy(total, lastName); 

本例中将存储在 char数组 lastName 中的内容复制到 char 数组 total 中。
若编译器提示可能出现未知错误(参数一字符串的长度太小时可能“装不下”参数二字符串里的信息),可以用strcpy_s代替或者使用strncpy的第三个参数指出要复制的字符串长度

3.strcat 附加字符串的函数

strcat可以将char数组(或普通字符串)从参数二附加(再次将内容复制添加到已经有内容的char数组中)到参数一
示例:

strcat(total, ", ");
strcat(total, firstName);

在本例中①将普通字符串", "(注:半角双引号中包括半角逗号与空格)附加到 char 数组 total 中。

              ②将存储在 char数组 firstName 中的内容附加到 char 数组 total 中。
若编译器提示可能出现未知错误(参数一字符串的长度太小时可能“附加不完”参数二字符串里的信息,出现字符覆盖),可以用strcat_s代替或者使用strncat的第三个参数指出要附加的字符串长度

注:strcpy函数和strcat函数都在头文件 csrting 中。
       string类变量执行复制附加时可以直接像普通变量一样。

举例:
#include<string>//包含string类变量声明//#include<cstring>//包含strcpy、strcat等操作函数,此程序中可以不用string str1,str2.str3,str4;
str1="abcd";
str2="efg";
str3=str1;//将str1直接赋(复制)给str3
str4=str1+str2;//将str1和str2拼在一起,再赋给str4
str3+=str2;//将str2附加给str3(注意:此时str3中已有信息)
//上行较为复杂的代码,等同于 str3=str3+str2;  

源代码运行示例:

四.使用string对象和string类的粘贴与拼接

如编程练习三,使用string对象和头文件string中的函数改写编程练习三中的程序。

//4.13_4.cpp
//使用string对象和string类的粘贴与拼接
#include<iostream>
#include<string>
using namespace std;
int main()
{string firstName, lastName, total;//lastname为姓,firstname为名cout << "请输入你的名:\n";getline(cin,firstName);cout << "请输入你的姓:\n";getline(cin, lastName);total = firstName + ", " + lastName;cout << "姓名:" << total << endl;return 0;
}

1.string类的粘贴方法

如同普通int类型的常数,string类是字面值的操作,可以使用如下操作:

#include<string>
#include<iostream>
int main()
{int a,b,c;a=1;b=2;c=a;//把a的值粘贴给cstring str1,str2,str3;//声明string类对象str1="hello";str2="world";str3=str1;//把str1的字面值粘贴给str3return 0;
}

直接使用
string类对象1=string类对象2;
来把 string类对象2的字面值粘贴给 string类对象1 。

2.string类的输入(见前文)

常用格式:
getline(cin,string类变量名)

这里的getline函数不是cin的类成员函数。因为最初设计getline时没有string类,所以在cin中也没有直接的对于string类的输入操作。后加入了上述格式的整行输入操作,然而这里的getline()函数不附属于cin类之下,存在于头文件中。
上面的getline函数 getline(cin,string类变量名)  中,cin为getline函数指明获取输入的位置,而长度是由string类的变量自己调整的,所以省去具体长度数值。
输出时string类变量按照欧通变量处理。

3.string类的拼接方法

如同普通int类型的常数,string类是字面值的操作,可以使用如下操作:

#include<string>
#include<iostream>
int main()
{int a,b,c;a=1;b=2;c=a;//把a的值粘贴给cstring str1,str2,str3;//声明string类对象str1="hello";str2="world";str3=str1;//把str1的字面值粘贴给str3return 0;
}

直接使用(两string类对象拼接后赋给空的string类对象)
string类对象1=string类对象2+string类对象3;

或者(一个string类对象和原有字面值的string类对象拼接并覆盖重新赋给这个原有字面值的string类对象)
string类对象1=string类对象2+string类对象1;
(前后顺序对 string类对象1 的字面值有影响)

源代码运行示例:

五.C++结构(OOP的基石)

结构CandyBar包含3个成员。第一个成员存储了糖块的品牌,第二个成员存储糖块的质量(可以有小数),第三个成员存储了糖块的卡路里含量(整数)。请编写一个程序,声明这个结构,创建1个名为snack的 CandyBar 变量,并将其成员分别初始化为“Mocha Munch”、2.3和350。初始化应在声明snack时进行。最后,程序显示snack 变量的内容。

//4.13_5.cpp
//C++结构
#include<iostream>
using namespace std;
struct CandyBar//结构类型的变量CandyBar,描述包含的数据类型
{char name[20];//char数组(字符串),品牌double weight;//double数,重量int calorie;//int整型,卡路里
};
int main()
{//设置结构类型CandyBar名下的变量,给结构类型CandyBar名下的变量赋值,这时可以省略structCandyBar snack ={"Mocha Munch",//结构中描述的name类char数组2.3,          //结构中描述的weight类double浮点数350           //结构中描述的calorie类int整数};//snack是一个CandyBar类的struct结构CandyBar snack2 = { "Baby Bear", 1.2, 280};//此处仅作展示,实际程序中不需要//snack2是一个CandyBar类的struct结构cout << "糖果品牌:" << snack.name<<endl;//访问结构类型CandyBar名下,变量snack中的name类的值。未使用指针转型。cout << "糖果重量(kg):" << snack.weight << endl;cout << "糖果卡路里含量:" << snack.calorie << endl;return 0;
}

在此连接文章:C++结构(OOP的基石)

源代码运行示例:

 六.C++结构数组

结构CandyBar包含3个成员。第一个成员存储了糖块的品牌,第二个成员存储糖块的质量(可以有小数),第三个成员存储了糖块的卡路里含量(整数)。请编写一个程序,声明这个结构,创建1个名为snack的 CandyBar 变量,并将其成员分别初始化为“Mocha Munch”、2.3和350。初始化应在声明snack时进行。最后,程序显示snack 变量的内容。 

//4.13_6.cpp
//使用C++结构数组
#include<iostream>
using namespace std;
struct CandyBar//结构类型的变量CandyBar,描述包含的数据类型
{char name[20];//char数组(字符串),品牌double weight;//double数,重量int calorie;//int整型,卡路里
};
int main()
{//设置结构类型CandyBar名下的变量,给结构类型CandyBar名下的变量赋值,这时可以省略structCandyBar snack[3];//CandyBar类型数组snack,包含3个元素。snack[0]={"Mocha Munch",//结构中描述的name类char数组2.3,          //结构中描述的weight类double浮点数350           //结构中描述的calorie类int整数};//snack是一个CandyBar类的struct结构数组,snack[0]是该数组的第一个元素snack[1] = { "Alps        " ,4.5,450};snack[2] = {"Little Bear",2.1,210};cout << "糖果品牌:" << snack[0].name;//访问结构类型CandyBar名下数组snack第一个元素中的name类的值。未使用指针转型。cout << "\t糖果重量(kg):" << snack[0].weight;cout << "\t糖果卡路里含量:" << snack[0].calorie<<endl;cout << "糖果品牌:" << snack[1].name;cout << "\t糖果重量(kg):" << snack[1].weight;cout << "\t糖果卡路里含量:" << snack[1].calorie << endl;cout << "糖果品牌:" << snack[2].name;cout << "\t糖果重量(kg):" << snack[2].weight;cout << "\t糖果卡路里含量:" << snack[2].calorie << endl;return 0;
}


结语

今天我们共同学习了 C++  等重要知识。
学习编程是一条漫长的路,贵在坚持。每天学习来提升自己的的编程能力,成为耀眼的IT之星。
各位读者跟随我的脚步,我们共同努力,共同进步吧!

返回作者主页

专栏文档:C++学习/温习:新型源码学编程(一)(优质好文)

                  C++学习/温习笔记:源码学编程(二)

专栏下一篇文档:【待更新】

其它文章:

                  C语言求幂运算(尽大支持)——中文式奇特命名

                  简洁易懂地介绍C++参数

                  学习C++基本数值类型 

                  C/C++基础运算符


 如有探讨问题联系邮箱:yhlz0613@163.com

对于文章中的错误请各位批评指正,我一定及时更正

请在投票后评论回复意见,如有关于写博文的指导也请您回复提出

 <!--感谢浏览                    诸君慢行且留言          过客匆匆常回访-->


http://www.ppmy.cn/news/23273.html

相关文章

leetcode 1233. 删除子文件夹

1233. 删除子文件夹 难度中等142你是一位系统管理员&#xff0c;手里有一份文件夹列表 folder&#xff0c;你的任务是要删除该列表中的所有 子文件夹&#xff0c;并以 任意顺序 返回剩下的文件夹。 如果文件夹 folder[i] 位于另一个文件夹 folder[j] 下&#xff0c;那么 folder…

【C++STL】双向循环链表与其迭代器的深度剖析及实现(百字短文速通)

1&#xff0c;双向循环链表基本结构的实现&#xff08;不包含需要迭代器的部分&#xff09;先用struct封装链表的节点&#xff0c;这里我们仅需要提供一个构造函数即可&#xff0c;并且构造函数必须提供缺省值&#xff0c;因为会有如下使用场景&#xff1a;new Node();此时需要…

SpringBoot + jackson + redis 序列化、反序列化 配置正确姿势

文章目录 1.背景2. 原来项目配置3.修改后配置4.正确配置5.小结1.背景 最近项目上 使用 SpringBoot 2.7.7 + jackson + redis 框架实现将javaBean 序列化和反序列化到 redis 中。但是最近在做登陆的时候将LoginUser 序列化到redis 中没问题,不重启服务的话反序列化成对象也没有…

Spring Boot整合Redis笔记

文章目录前言Java 操作 RedisJedis 操作-测试Jedis 实例-手机验证码Redis与Spring Boot整合整合步骤Redis 的事务操作Redis的事务定义Multi、Exec、discard 基本命令事务冲突的问题为什么要做成事务悲观锁乐观锁WATCH key [key ... ]Redis事务三特性Redis事务秒杀案例解决计数器…

Prometheus简介和部署

Prometheus简介 prometheus官方网站&#xff1a;https://prometheus.io/ prometheus是基于Go语言开发的一套监控、告警和时序数据库的组合&#xff0c;CNCF基金会的第二个毕业项目&#xff0c;在容器和微服务领域有着广泛的应用。一般情况下&#xff0c;是监控Kubernetes的标…

QT入门Input Widgets之QComboBox

目录 一、界面布局功能 1、界面位置介绍 2、界面常用操作属性 2.1基本属性 2.2添加子项目 二、属性功能介绍 1、代码添加item 2、批量插入 3、设置当前显示的索引 4、清除掉所有item 5、 切换item获得索引值与当前文本 三、Demo展示 此文为作者原创&#xff0c;转…

机器学习-基于KNN和LMKNN的心脏病预测

一、简介和环境准备 knn一般指邻近算法。 邻近算法&#xff0c;或者说K最邻近&#xff08;KNN&#xff0c;K-NearestNeighbor&#xff09;分类算法是数据挖掘分类技术中最简单的方法之一。而lmknn是局部均值k最近邻分类算法。 本次实验环境需要用的是Google Colab和Google Dr…

Linux系统安全:安全技术和防火墙

目录 一、安全技术 1、安全技术 2、防火墙分类 二、防火墙 1、iptables五表五链 2、黑白名单 3、iptables基本语法 4、iptables选项 5、控制类型 6、隐藏扩展模块 7、显示扩展模块 8、iptables规则保存 9、自定义链使用 一、安全技术 1、安全技术 ①入侵检测系统…