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

C++基础语法:while的使用

前言

      "打牢基础,万事不愁" .C++的基础语法的学习."学以致用,边学边用",编程是实践性很强的技术,在运用中理解,总结.

引入

        while的使用是编写代码的基础内容.笔者的记忆力已不如以前,最近遇到了还花了不少功夫,可见是掌握地不够牢固.所以对while的思路和内容做一个归纳,便于以后使用.当然最重要的还是在思路的推导和总结.

while的概览

        while指的是条件循环.即:满足条件在代码块中反复执行,条件不满足则退出. 

        代码格式:while(循环条件){        //while的代码块语句1;语句2;}                

        使用while的重点有两个,他们都围绕着while的条件

        1.循环条件的描述                        2.退出循环的条件

        循环条件

        while后跟着的循环条件,是一个返回值为bool类型的表达式.

        例如:        true;                     //bool类型值,可以做表达式

                        a>b;                     //比较表达式,返回值是bool类型

                        a<b && a>c         //逻辑表达式,返回值是bool类型

                         cin>>a;              //输入语句,他的返回值也是bool类型;成功执行返回true,否则false

        退出循环条件

        如果没有退出循环条件,那么只能是无限循环,这通常是不想被看见的情况

//无限循环1
while(true){cout<<"hello"<<endl;
}
//无限循环2
int a=2;
while(a>1){cout<<"hello"<<endl;
}

        因此可以作出推导:循环条件中有变量,当变量等于某个值,表达式值为false,退出循环

while的几种应用

        有时候编码内容文字不好表达,简单给个概念,用实际代码来说明.

        1>while遍历字符串

/*while遍历字符串*/char p[] = "hello";char* pt = p;int n = 1;while (*pt) {cout << "第"<<n<<"个字符为:" << *pt << endl;pt++;n++;}

        C++中如果写 char *pt="hello",编译通不过.在C语言中应该可以.C语言中字符串本质上字符数组,C++中常用string对象表达字符串,string对象实现了begin(),end()等接口函数,被看作"字符容器"

        上面代码中用到了"字符串末尾是空字符''\0"这个特点,当遍历到字符串末尾时,while判定为false,跳出循环.

        2>while遍历容器

/*while遍历容器*/list<int> li;li.push_back(1);li.push_back(2);li.push_back(3);auto lip = li.begin();while (lip!=li.end()) {cout << *lip << endl;lip++;}

         上面代码常用for来写,用到了"迭代器变量(lip)从begin()开始,直到超尾迭代器end()结束,中间的迭代器变量指向容器元素"这个特点.

        3>while和cin(输入流)相结合

        下面代码用输入字符控制while的循环退出 

	char ar;int b=0;while (cin >> ar && ar != 'q') {    //输入除空白字符(空格,回车,tab)以外的字符,q退出cout << "你输入的字符是:" << ar << endl;b++;}cout << "b的值是:" <<b<< endl;

        上面代码中cin>>ar表达式,他的返回值也是bool类型.成功输入返回true,否则返回false.

        代码表示:只要不输入q,其他输入进去的字符被显示出来;此外声明的变量b表示输入次数.

        cin有个特点:缓冲流中的空白字符不被识别,比如输入"   3",识别为3,前面的空白字符被丢弃.但cin.get()和cin.getline()会识别空白字符.具体情况可以上网搜索.

        下面代码用输入格式控制while的循环退出         

	    double x, y;cout << "输入两个double型数字:" << endl;while (cin >> x >> y) {					//输入两个值cout << "输入两个值加起来是:" << x + y << endl;cout << "格式:数字+空格+数字+空格,其他字母退出" << endl;}

         上面代码实现两个double类型值相加,输入"2 3",计算出5;当输入"t t"等不符合格式时,退出循环

//使输入值在范围内
int number;
while(!(cin>>number && number>=1 && number<=6)){    //当输入不符合要求时cin.clear();                                    //重置输入while(cin.get()!='\n');                         //清除多余输入cout<<"请输入1到6之间的整数(含1和6)"<<endl;
}
.....
//跳出循环后number值在正确范围内(1~6)

        上面代码表示必须输入1~6内的一个整数,才可以跳出循环 

        下面是一个嵌套的while        

/*用输入作为while的循环条件的写法*/double x, y;cout << "输入任意字符继续,按t退出" << endl;while (cin >> ar && ar != 'q') {		//输入选择cout << "你还在循环中:"  << endl;cout << "输入两个double型数字:" << endl;while (cin >> x >> y) {					//输入两个值cout << "输入两个值加起来是:" << x + y << endl;cout << "按其他键退出" << endl;}									cin.clear();						//注意:一定要用clear,否则直接退出!while(cin.get()!='\n');				//注意:这句和上一句一起用,网上说的cin.syc()不行!cout << "输入任意字符继续,按t退出" << endl;}

         上面代码有个需要注意的地方,从cin从while中跳出来,要将缓冲区做处理,把缓冲区中直到回车符前的部分全部吸收,或者沿用书上叫法-丢弃.不让他影响到下一次的输入.

		cin.clear();						while(cin.get()!='\n');				

        这部分相当于C语言中的

int ch;
while((ch=getchar())!='\n');

          4>while和比较表达式结合

        假设现在有两个数组,一个数组有n个值,另一个数组有n+2个值.把一个数组内的值复制到另一个数组当中.----当然这个例子不是太典型,一般用for来完成.

int a[3]={1,2,3};
int length=sizeof(a)/sizeof(int);
int b[length+2];
int num=0;                            //记录元素个数
while(num<length){                    //数组之间传递值b[num]=a[num];num++;
}

小结

        while条件必须是返回值为bool类型的表达式,可用到的表达式有:比较表达式,逻辑表达式,输入表达式cin.表达式里用变量来编写程序员需要的逻辑,逻辑闭环问题解决.

        思路:while→表达式→变量→逻辑

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据结构--树(笔记)
  • 2025计算机毕设:50条小众好做的SSM题目推荐【计算机毕设选题推荐】
  • 服务器配置miniconda环境
  • npm install 安装报错解决指南
  • 什么是BOM,有哪些分类?
  • Notion使用详解
  • WPF 动画 插值动画、关键帧动画、路径动画
  • Pod基础使用
  • websocket拦截插件
  • 无线数传模块有啥特点?
  • 万象公文常见问题的处理方法
  • Ubuntu22安装MySQL8,并关闭大小写
  • [大模型]配置文件-Langchain-Chatchat-V0.3 (1)
  • 单个像素的威胁:微小的变化如何欺骗深度学习系统
  • 哈工深、NUS等联合提出全新信息抽取基准任务:细粒度定位的统一多模态信息抽取...
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Brief introduction of how to 'Call, Apply and Bind'
  • Hexo+码云+git快速搭建免费的静态Blog
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Java编程基础24——递归练习
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • TypeScript实现数据结构(一)栈,队列,链表
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Vue小说阅读器(仿追书神器)
  • WePY 在小程序性能调优上做出的探究
  • yii2中session跨域名的问题
  • 不上全站https的网站你们就等着被恶心死吧
  • 成为一名优秀的Developer的书单
  • 从setTimeout-setInterval看JS线程
  • 大数据与云计算学习:数据分析(二)
  • 仿天猫超市收藏抛物线动画工具库
  • 飞驰在Mesos的涡轮引擎上
  • 复习Javascript专题(四):js中的深浅拷贝
  • 和 || 运算
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 如何用vue打造一个移动端音乐播放器
  • 我感觉这是史上最牛的防sql注入方法类
  • 源码安装memcached和php memcache扩展
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​Python 3 新特性:类型注解
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • (23)Linux的软硬连接
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (转)jdk与jre的区别
  • (转)Sql Server 保留几位小数的两种做法
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .bat批处理出现中文乱码的情况
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net 获取url的方法