当前位置: 首页 > news >正文

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

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

  • 【本文持续更新中】
  • 面向初学者撰写专栏,个人原创的学习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.lryc.cn/news/1665.html

相关文章:

  • 阿里云ecs服务器搭建CTFd(ubuntu20)
  • 视频号小店新订单如何实时同步企业微信
  • ag-Grid Enterprise
  • 扫雷——C语言【详解+全部码源】
  • 【C++】类和对象(下)
  • 计算机网络
  • 【Unity VR开发】结合VRTK4.0:将浮点操作转换为布尔操作
  • error when starting dev server:Error: Failed to resolve vue/compiler-sfc.
  • Vue2之完整基础介绍和指令与过滤器
  • JY-7A/3DK/220 19-130V静态【电压继电器】
  • [ECCV 2018] Learning to Navigate for Fine-grained Classification
  • 关于apifox和postman接口工具我有话要说~~
  • Vue3通透教程【二】更高效的构建工具—Vite
  • 前端中如何判断在线状态?
  • [MySQL教程①] - MySQL的安装
  • 第八节 Linux 设备树
  • 一文了解kafka消息队列,实现kafka的生产者(Producer)和消费者(Consumer)的代码,消息的持久化和消息的同步发送和异步发送
  • 数学建模学习笔记(20)典型相关分析
  • EL表达式
  • 优先级队列(PriorityQueue 和 Top-K问题)
  • 计算机组成与设计04——处理器
  • IT行业那么辛苦,我们为什么还要选择它?
  • PyTorch学习笔记:nn.CrossEntropyLoss——交叉熵损失
  • 【VictoriaMetrics】什么是VictoriaMetrics
  • (第五章)OpenGL超级宝典学习:统一变量(uniform variable)
  • 数据存储技术复习(四)未完
  • Rust编码的信息窃取恶意软件源代码公布,专家警告已被利用
  • diffusers编写自己的推理管道
  • 计算机操作系统 左万利 第二章课后习题答案
  • CODESYS开发教程10-文件读写(SysFile库)