C++学习笔记——第四天 程序控制结构
目标
- 了解C++的面向过程的结构化设计方法
- 熟练掌握C++支持的三种程序结构:顺序结构,选择结构,循环结构
- 掌握转向语句的功能及其使用
顺序结构
顺序结构是指按照所有语句出现的顺序先后执行,先出现的先执行,后出现的后执行。顺序结构的语句一般包含三种:表达式语句;输入语句;输出语句。
表达式语句
一般形式:
表达式;
复合语句
{
<语句1>
<语句2>
……
<语句n>
}
输入语句
C++没有提供输入/输出语句。其输入/输出功能由函数(scanf,printf)或流控制来实现。
输入/输出流(I/O流)是输入或输出的一系列字节。C++定义了包含重载运算符。“<<”和”>>”的iostream类。
#include<iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int a; cin>>a; //输入语句 getchar(); return 0; }
输出语句
#include<iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { cout<<"Hello.\n"; //输出语句 getchar(); return 0; }
格式控制符
- flags:该函数一般有以下两种形式,第一种形式是通过参数1Flags重新设置标志字并返回原来的标志字;另一种形式是通过无参数的flags函数返回当前的标志字。
long flags(long 1Flags);
long flags(); - setf:该函数一般也有以下两种形式:第一种形式是通过参数1Flags来设置指定的格式控制标志位;第二种形式是用来设置指定的格式控制标志位的值
long setf(long 1Flags);
long setf(long 1Flags,long 1Mask); - unsetf:该函数一般形式如下,这种形式是通过参数1Flags来清除指定的格式控制标志位(使那些位的值为“0”)
long unsetf(long 1Flags); - fill:函数一般有以下两种形式,第一种形式是将填充字符设置为cFill,并返回原填充字符;第二种形式是通过无参数的fill函数返回当前的填充字符。
char fill(char cFill);
char fill(); - precision:该函数形式一般也有以下两种,第一种形式是设置浮点数精度为np,并返回原精度;第二种形式是通过无参数的precision函数返回当前的浮点数精度。
int precision(int np);
int precision(); - width:该函数的形式一般也有以下两种,第一种形式设置当前显示数据的域宽nw,并返回原域宽;第二种形式是通过无参数的width函数返回当前显示数据的域宽。
int width(int nw);
int width();
例如:
控制不同进制的进出。
#include<iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int a=1000; cout<<"默认下:"<<a<<endl; cout<<"十进制下:"<<dec<<a<<endl; cout<<"八进制下:"<<oct<<a<<endl; cout<<"十六进制下:"<<hex<<a<<endl; getchar(); return 0; }
控制输出宽度
#include "stdafx.h" #include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int a =1234567890; double b = 123.45; cout<<setw(10)<<a<<endl; cout<<setw(10)<<b<<endl; cout<<setw(8)<<b<<endl; cout<<setw(6)<<b<<endl; cout<<setw(4)<<b<<endl; getchar(); return 0; }
宽度达不到setw控制符中设定的宽度时,将在输出内容前面填补空格,大于控制符中设定的宽度时,系统将全部予以输出。
控制输出精度
#include "stdafx.h" #include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { double a =1.23456789; cout<<a<<endl; cout<<setprecision(3)<<a<<endl; cout<<setprecision(10)<<a<<endl; getchar(); return 0; }
应用示例
#include "stdafx.h" #include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { const double Num = 123.4567; cout.flags(ios::right); //设置对其的标志位是右 cout<<setw(10)<<Num<<endl; cout.fill('*');//填充字符* cout.width(12);//显示数据的域宽是12 cout<<Num<<endl; cout.precision(4);//浮点数的有效个数为4 cout<<Num<<endl; cout.setf(ios::showpos);//显示正号 cout.precision(2); cout<<Num<<endl; cout.unsetf(ios::showpos);//显示正号 int n; cout<<"输出一个八进制整数:"; cin>>oct>>n; cout<<"八进制数n是:"<<oct<<n<<endl; cout<<"对应的十进制数是"<<dec<<n<<endl; cout<<"对应的十六进制数是"<<hex<<n<<endl; getchar(); getchar(); return 0; }
选择结构
用来判断所给定的语句是否满足条件,根据判断结果,选择执行不同分支语句,常用语句if,if…else,多重if…else,和switch。
if语句
一般形式:
表达式可以是int,long,char和enum型。
if(<表达式>) <语句>;
例
#include "stdafx.h" #include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int x,y,temp; cout<<"Please input 2 numbers:"; cin>>x>>y; if(x<y) { temp=x; x=y; y=temp; } cout<<"x="<<x<<endl; cout<<"y="<<y<<endl; getchar(); getchar(); return 0; }
if…else语句
if…else语句是双分支语句一般形式为
if(<表达式>) <语句1>; else <语句2>;
例
#include "stdafx.h" #include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int score; cout<<"请输入学生分数:"<<endl; cin>>score; if(score>=60) cout<<"及格"<<endl; else cout<<"不及格"<<endl; getchar(); getchar(); return 0; }
多重if…else语句
多重if…else语句为多分支条件语句或if…else if…else语句一般形式为
if(<表达式1>) <语句1>; else if(<表达式2>) <语句2>; …… else if(<表达式n>) <语句n>; else <语句n+1>;
#include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int score; cout<<"请输入学生分数:"<<endl; cin>>score; if(score>=90) cout<<"优"<<endl; else if(score>=80) cout<<"良"<<endl; else if(score>=70) cout<<"中"<<endl; else if(score>=60) cout<<"及格"<<endl; else cout<<"不及格"<<endl; getchar(); getchar(); return 0; }
多分支条件语句可以使用if语句的嵌套实现
#include "stdafx.h" #include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int score; cout<<"请输入学生分数:"<<endl; cin>>score; if(score>=60) { if(score>=70) { if(score>=80) { if(score>=90) cout<<"优"<<endl; else cout<<"良"<<endl; } else cout<<"中"<<endl; } else cout<<"及格"<<endl; } else cout<<"不及格"<<endl; getchar(); getchar(); return 0; }
switch语句
switch语句也称情况语句,也是一种多分支语句,说明语句的一般形式:
switch(<表达式1>) { case<常量表达式1>; <语句1>;break; case<常量表达式2>; <语句2>;break; …… case<常量表达式n>; <语句n>;break; default: <语句n>;break; }
#include "stdafx.h" #include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int day; cout<<"请输入0~6的数值:"<<endl; cin>>day; switch(day) { case 0: cout<<"星期日"<<endl; break; case 1: cout<<"星期一"<<endl; break; case 2: cout<<"星期二"<<endl; break; case 3: cout<<"星期三"<<endl; break; case 4: cout<<"星期四"<<endl; break; case 5: cout<<"星期五"<<endl; break; case 6: cout<<"星期六"<<endl; break; default: cout<<"输入非法"<<endl; } getchar(); getchar(); return 0; }
注意
- 若case后面没有break语句,则程序顺序执行后续的语句,直到switch语句结束。这样就不能实现多分支选择。
- switch语句只能对表达式的结果是否为固定的值进行判断,而不能对其结果是否在某区域进行判断,这与多重if…else语句有所不同
- 每个常量表达式的值不能相同,case语句的排列顺序不影响执行结果
应用示例
// lianxi.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { float a,b,c,d; cout<<"a="; cin>>a; cout<<"b="; cin>>b; cout<<"c="; cin>>c; d=b*b-4*a*c; if(a==0) cout<<"不是一元二次方程"<<endl; else if(d>0) { cout<<"方程有两个实根!"<<endl; cout<<"x1="<<(-b+sqrt(d))/(2*a)<<endl; cout<<"x2="<<(-b-sqrt(d))/(2*a)<<endl; } else if(d==0) { cout<<"方程有一个实根!"<<endl; cout<<"x1=x2="<<-b/(2*a)<<endl; } else cout<<"方程无实根!"<<endl; getchar(); getchar(); getchar(); getchar(); getchar(); getchar(); return 0; }
循环结构
循环结构用来在指定条件下多次重复执行同一组语句。常用形式:
- for语句
- while语句
- do…while语句
for语句
一般形式:
for(<表达式1>;<表达式2>;<表达式3>) <语句>;
- 表达式1对循环控制变量进行初始化
- 表达式2是循环条件
- 表达式3是对循环控制变量进行递增或递减
三个表达式可以缺省但分号不能省略
#include "stdafx.h" #include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int i; int sum=0; for(i=2;i<=100;i=i+2)//for循环 { sum +=i; } cout<<"100内所有偶数和为:"<<sum<<endl; getchar(); return 0; }
while语句
一般形式:
while(<表达式>) <语句>;
// lianxi.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int i; int sum=0; i=2; while(i<=100)//while循环 { sum +=i; i=i+2; } cout<<"100内所有偶数和为:"<<sum<<endl; getchar(); return 0; }
do…while语句
do…while语句的循环体至少被执行一次
一般形式为:
do <语句> while(<表达式>);
// lianxi.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int i; int sum=0; i=2; do { sum+=i; i=i+2; } while(i<=100);//do...while循环 cout<<"100内所有偶数和为:"<<sum<<endl; getchar(); return 0; }
多重循环
多重循环(循环嵌套)是指循环语句的循环体内又包含另一个循环语句。
在多重循环中,循环嵌套的执行顺序是先执行最里层的循环语句,依次往外执行,最后执行最外层的循环
打印一个九九乘法表
// lianxi.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int bcs,cs; for(bcs=1;bcs<=9;bcs++) { for(cs=1;cs<=bcs;cs++) { cout<<bcs<<'*'<<cs<<"="<<bcs*cs<<' '; } cout<<endl; } getchar(); return 0; }
应用示例
求1000内的所有水仙花数。所谓水仙花数是指一个位数,其各位数字立方和等于该数字本身。
// lianxi.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int i,j,k,n,m; for(i=1;i<=9;i++)//百位数从1到9变化,不能取0;如果百位为0就不是三位数了 { for(j=0;j<=9;j++)//十位从0到9,允许取0 { for(k=0;k<=9;k++)//十位从0到9,允许取0 { n=i*100+j*10+k;//这个数等于百位数乘以100加上十位数乘以10在加上个位数 m=i*i*i+j*j*j+k*k*k; //百位上数的立方加上十位上数的立方加上个位上数的立方 if(n==m) cout<<n<<" "; //这是一个三位数是否为水仙花数的条件,即水仙花数是各位数字立方和等于该数字本身 } } } cout<<endl; getchar(); return 0; }
转向语句
转向语句是C++中用来实现无条件转移的语句,常见的有四种
break语句(跳出语句):用来结束循环结构,然后执行循环体后面的语句,一般形式
break;continue语句(继续语句):可用来跳出本次循环而进入下一次循环,一般形式
continue;
区别:continue语句是根据条件判断只结束本次循环,不结束整个循环结构。goto语句(转向语句):用来将程序无条件跳转到指定的标号语句处,一般形式
goto<标号>;
其中标号是一个标识符,放在语句的最前面,一般形式
<标号>:<语句>return语句(返回语句):可用来停止执行当前函数,转而执行调用该函数后面的语句,一般形式
return<表达式>;
例如
// lianxi.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int n=100; int i,j; for(i=2;i<=n;i++) { int flag=1; for(j=2;j<i;j++) if(i%j==0) { flag=0; break; } if(flag==1) cout<<i<<","; } cout<<endl; getchar(); return 0; }
参考:《21天学通C++》作者:刘蕾
阅读更多- [Matlab]基础教程学习笔记(二):程序控制结构
- 【C++学习笔记】03_C++程序结构
- c++ 学习笔记之程序结构
- C_PlusPlus学习笔记 - 4_C++程序结构 (C++语言程序设计【第三版】 郑莉等,清华大学出版社)
- Scala入门学习笔记二-基本数据类型、程序控制结构
- C++学习笔记——3.操作符与控制结构
- c++ 学习笔记之程序结构
- java 学习笔记(入门篇)_程序流程控制结构和方法
- J2SE学习笔记之程序控制结构
- C#学习笔记:程序结构
- c++基础学习第二天(c++程序的结构)
- 【C++学习笔记】C++控制台程序隐藏界面运行的方法
- T-SQL学习笔记-程序设计基础-流程控制语句
- Oracle PLSQL 学习笔记(块、控制结构、过程、函数、包)
- C学习笔记【程序】输入输出与程序设计结构之美 推荐
- C++学习笔记1(Windows程序运行原理及程序编写流程)
- C++学习笔记之结构体与类的区别
- 循环控制结构程序06 - 零基础入门学习C语言21
- 《Practical Clojure》学习笔记[3] Clojure中程序流程控制
- c++ primer 学习笔记:复制控制之赋值操作符