文章目录
1、基于过程的程序设计和算法
具体设计出计算机执行的每一个具体步骤,安排好执行顺序。
1.1 算法的概念
一个基于过程的程序包括:
- 对数据的描述(数据结构)
- 对操作的描述(算法)
即:程序=算法+数据结构
算法:处理问题的一系列的步骤。
计算机算法:数值算法、非数值算法。
1.2 算法的表示
常用的4种:
- 自然语言(中文或英文来描述,容易产生歧义,一般不用)
- 流程图(用图的形式,直观形象,但不方便修改,适合比较简单的程序)
- 伪代码(介于自然语言和计算机语言,无固定规则,清晰易读,容易修改)
- 计算机语言(也就是计算机程序)
C++的程序结构和C++语句
#include<iostream> //预处理命令
using namespace std;
int a=3; //全局变量:函数之外定义
int main() //主函数,有且只有一个
{float b; //局部变量:函数内定义
b=4.5; //执行语句:赋值语句
cout<<a<<b; //执行语句:输出语句
return 0; //执行语句:返回值
}
全局变量:函数之外声明的变量,有效范围是该行开始,到本程序单位结束。
局部变量:函数内声明,有效范围是该行开始到本函数结束。
程序包括数据声明(数据类型的声明、函数和变量的定义、变量的初始化等)和数据操作(对已提供的数据进行加工)。
1、4种C++语句
(1)声明语句
C中,变量(不作为语句)的定义必须在所有程序语句之前,所以一般在函数或块的开头定义所有变量。
C++中(作为语句)可以出现在任意行,但必须在它被使用之前。
(2)执行语句
a、控制语句(9种):
- 条件选择语句if()…else…
- 循环语句for()…
- 循环语句while()…
- 循环语句do…while()
- 结束本次循环语句continue
- 中止执行switch或循环语句break
- 多分支选择语句switch
- 转向语句goto
- 从函数返回语句return
b、函数和流对象调用语句
sort(x,y,z);
cout<<x<<endl;
c、表达式语句(最后必须加分号)
x+y;也是一个语句,但无实际意义
(3)空语句(用来做被转向点,或循环语句中的循环体)
(4)复合语句)({ }括起来的部分语句)
3、赋值操作
C++的赋值“=”可以写成a=b=c=d,表示先将d的值赋给c,再把c赋给b,最后把b赋给a.
相当于a=(b=(c=d))
赋值表达式:a=b
赋值语句:a=b;
赋值表达式可以包括在其他表达中,如:
if((a=b)>0)cout<<"a>0"<<endl;
但赋值语句不可以。
4、C++的输入与输出
头文件:#include
C语言的输入:scanf函数,输出:printf函数
C++的输入:cin>>,输出:cout<<;(通过调用数据流)
数据流是由一系列字节组成的,这些字节按进入“流”的顺序排列的。
cin:输入流对象 <<:流插入运算符(显示出来)
cout:输出流对象 >>:流提取运算符(键盘输入)
4.1 输入流与输出流的基本操作
一般格式:
cout<<表达式1<<表达式2<<…<<表达式n;
cin>>变量1>>变量2>>…>>变量n;
定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,并不是插入一个数据就马上输出,而是先把插入 的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到endl(或\n ends、flush)为止,再将所有数据一起输出,并清空缓冲区。
cout语句可以分写成若干行,只需要在结束的那行末尾加分号。
cout<<"This is "
<<"a C++ "
<<"program."
<<endl;//有分号
不能一个<<输出多个输出项,下面是错误示例cout<<a,b,c;
cin输入时会自动根据变量类型从输入流中提取相应长度的字节。
char c1,c2;
int a;
float b;
cin>>c1>>c2>>a>>b;
这时候若输入1234 56.78
,对应取值为1 2 34 56.78
因为c1和c2是字符,所以从输入流各取一个字节的字符,分别为1和2;然后a作为int型,读取到非数字,所以是34,后面56.78就是b了。
也可以这样子输入:1 2 34 56.78
系统会把空格作为数据的分隔符,不做提取。
所以,不能用cin把空格字符或回车行符作为字符输入给字符变量。
4.2 在标准输入流与输出流中使用控制符
头文件:#inclue
(更多内容参考:https://blog.csdn.net/qq_28234213/article/details/72802661)
dec 设置整数的基数为10
hex 设置整数的基数为16
oct 设置整数的基数为8
setbase(n) 设置整数的基数为n(n只能是16,10,8之一)
setfill(c) 设置填充字符c,c可以是字符常量或字符变量
setprecision(n) 设置实数的精度为n位。在以一般十进制小数形式输出时,n代表有效数字。在以fixed(固定小数位数)形式和scientific(指数)形式输出时,n为小数位数。
setw(n) 设置字段宽度为n位。
setiosflags(ios::fixed) 设置浮点数以固定的小数位数显示。
setiosflags(ios::scientific) 设置浮点数以科学计数法(即指数形式)显示。
setiosflags(ios::left) 输出数据左对齐。
setiosflags(ios::right) 输出数据右对齐。
setiosflags(ios::shipws) 忽略前导的空格。
setiosflags(ios::uppercase) 在以科学计数法输出E和十六进制输出字母X时,以大写表示。
setiosflags(ios::showpos) 输出正数时,给出“+”号。
resetiosflags 终止已设置的输出格式状态,在括号中应指定内容。
2.用流对象的成员控制输出格式
流成员函数 与之作用相同的控制符 作用
precision(n) setprecision(n) 设置实数的精度为n位。
width(n) setw(n) 设置字段宽度为n位。
fill(c) setfill(c) 设置填充字符c。
setf( ) setiosflags( ) 设置输出格式状态,括号中应给出格式状态,内容与控制符setiosflags括号中内容相同。
ubsetf( ) resetiosflags( ) 终止已设置的输出格式状态。
cout.width(10);
cout.setf(ios::hex);`在这里插入代码片`
4.3 用getchar和putchar函数进行字符的输入和输出
1、putchar函数——向终端输出一个字符
如:putchar(c);//输出变量c的值。
可以输出转义字符,如:putchar('\n');//使当前位置移到下一行开头。
也可以是一个表达式,如:putchar(c+32);//c的值为字符A,则输出a
内容为数字时,输出数字作为ascii值对应的字符,如:putchar(66);//输出B
2、getchar函数——从终端输入一个字符
没有参数,一般是getchar()
一个getchar()语句只能接受一个字符
它可以直接作为表达式的一部分如:putchar(getchar()+32);//输入A时,就直接输出a了
还可以cout<<getchar();//输出的是字符的ASCII码,输入a时,输出的是整数97
而cout<<(c=getchar());//就输出字符了。
4.4 用scanf和printf函数进行输入和输出
一般格式:
scanf(控制格式,输出表列)//输出表列的变量类型和格式都要严格要求
printf(格式控制,输出表列)
#include<iostream>
using namespace std;
int add(int x,int y);
int main(){
int a,b,c;
char m,n;
//类型格式:int:%d 八进制:%o 十六进制:%x 字符型:%c 字符串:%s float:%f 长整型:l
//"*"符用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。
scanf("%d %*d %d",&a,&b);//当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。
printf("%d %d\n",a,b);
//用十进制整数指定输入的宽度(即字符数).
scanf("%4d%4d",&a,&b);//输入12345678将把1234赋予a,而把5678赋予b。
printf("%d %d\n",a,b);
scanf("%5d",&a);//输入12345678只把12345赋予变量a,其余部分被截去。
printf("%d\n",a);
//因为上面输入12345678,只截取前五位作为输入内容,那么剩下的将作为下一次输入的内容赋给变量
scanf("%d",&a);//这里直接将上面输入多余的部分作为输入,用户没有输入操作,就已经完成该语句了
printf("%d\n",a);
return 0;
}
#include<iostream>
using namespace std;
int add(int x,int y);
int main(){
int a,b,c;
char m,n;
//如果格式控制串中有非格式字符则输入时也要输入该非格式字符。
scanf("a=%d,b=%d,c=%d",&a,&b,&c);//输入应为:a=5,b=6,c=7。
printf("%d %d %d\n",a,b,c);
scanf("%c %c",&m,&n);//"%c %c"之间有空格时,输入的数据之间可以有空格间隔。
printf("%c%c\n",m,n);
scanf("%c%c",&m,&n);//"%c%c"中没有空格,输入M N,结果输出只有M。而输入改为MN时则可输出MN两字符。
printf("%c%c\n",m,n);
return 0;
}
5、顺序结构(从上到下执行语句)
6、关系运算和逻辑运算
if语句,根据某个条件是否满足来执行相应的内容。
6.1关系运算和关系表达式
1、C++的关系运算符:<、>、<=、>=、==、!=
前四个优先级相等,且高于后两个。
关系运算符优先级低于算术运算符,而高于赋值运算符。
2、关系表达式:表达式 关系运算符 表达式
表达式可以是算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式。但表达式都应该有一个确切的值。
1为真,0为假。
6.2逻辑常量和逻辑变量
逻辑常量(布尔常量):false(0)和true(1)
逻辑变量(布尔变量)类型:bool,占一个字节
可以和数值数据进行算术运算。
当布尔变量为非0数时,输出值即为true
6.3逻辑运算和逻辑表达式
1、C++的三种逻辑运算符:
- &&(逻辑与):一假即假
- ||(逻辑或):一真即真
- !(逻辑非):和原来的值相反
前两个为双目运算符(有两个运算量进行运算),逻辑非是单目运算符。
优先顺序:非>算术运算符>关系运算符>与>或>赋值运算符
(a>b)&&(x>y)相当于a>b&&x>y
逻辑运算符两侧的表达式不但可以是关系表达式或整数,也可以是任何数值类型的数据(字符、浮点型、指针型)。如:'c'&&'d'
的值为1.
7选择结构和if语句
7.1if语句的形式
if(表达式)语句1
[else语句2]
主要有三种应用:
1、单分支:if(表达式)语句
2、双分支:if(表达式)语句1 else语句2
3、多分支:
if(表达式1)语句1
else if(表达式2)语句2
else if(表达式3) 语句3
…
else if(表达式m)语句m
else 语句n
每个if后面都有一个括号括起来的表达式,一般是逻辑表达式或关系表达式,非真即假。
else要与离他最近的还有配对的if进行配对,不能单独使用。
执行语句有多条,要用花括号括起来,构成复合语句。
复合语句中可以定义变量,变量仅在花括号内有效。
7.2if语句的嵌套
一般形式:
if( )
if( )语句1
else 语句2
else
if( )语句3
else语句4
为避免出错,建议使用花括号
7.3 条件运算符和条件表达式
一般形式:表达式1?表达式2:表达式3
判断表达式1的布尔值,若为真,执行表达式2,否则,执行表达式3.
if(a>b)max=a;
else max=b;
相当于
max=(a>b)?a:b;
7.4 多分支选择结构与switch语句
一般形式:
switch(表达式)
{ case 常量表达式1:语句1
case 常量表达式2:语句2
…
case 常量表达式n:语句n
default :语句n+1
可以进行多分支选择。
- 表达式可以是数值类型或字符类型
- switch表达式的值和case中常量表达式的值相匹配时,就会执行该case后的语句。
- 每个case语句最后要加break;表示结束switch循环,不用再执行剩下 case了。
- 如果case的常量表达式值都不能和switch的值匹配,就会执行default语句。
- 每一个case语句表达式的值必须互不相同。
- case语句虽然包含一个或以上的执行语句,但不需要花括号。 多个case可以公用一组执行语句。
case 'A':
case 'B':
case 'C‘“//值为’A‘’B‘’C‘时,都会输出test。
cout<<"test"<<endll;break
7.5编写选择结构 程序
首先还是要读懂题意,问题中出现那些条件判断条件,分支多于三个,考虑switch语句。每个判断条件为真为假分别对应那些执行操作。然后就可以开始了。
8、循环结构和循环语句
8.1 用while语句构成循环
一般形式:while(表达式)语句
先判断后执行
循环体有多个执行语句,应该用花括号括起来,否则只会执行第一个执行语句。
循环体中应该有使循环趋于结束的语句,否则会陷入死循环。
无限循环:while(1){}
8.2用do-while语句构成循环
一般形式:do
语句
while(表达式);
先执行后判断,不管怎样,总会先执行一次。
最后要带分号。
8.3 用for语句构成循环
一般形式:for(循环变量赋初值;循环条件;循环变量增值)语句
适合知道确切循环次数,或者循环结束条件的循环。
- 循环遍历赋初值可以省略,但分号不能省,如:for(;i<100;i++)
- 若省略循环条件,默认为循环条件始终为真,无限循环
- 循环变量增值省略了,就要在执行语句中有一条改变变量的语句,如
for(i=1;i<=100;){
sum=sum+i;
i++;
}
- 可以只给循环条件,此时等同于while语句。如:
for(;i<=100;){
sum=sum+i;
i++;}
- 表达式一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要值为非0,就可以执行循环体了。
for(i=0;(c=getchar())!='\n';i+=c);//不断输入字符,将他们的ASCII码相加,直到输入一个换行符。
for(;(c=getchar())!='\n';)cout<<c;//不断输入字符并直接输出,直到输入一个换行符。
//注意,从终端向计算机输入时,是在按enter后才送到缓冲区的,所以上面这一语句/
//如果是输入Computer后再enter,那么在enter之后会输出Computer,而不是CCoommppuutteerr
8.4循环的嵌套
主要是while循环、do-while循环、for循环之间的嵌套。
8.5 提前结束循环(break语句和continue语句)
break;case语句中,跳出switch结构,继续下一个语句;
循环体中,跳出循环体,提前结束。
continue:循环语句中,结束本次循环,继续下一次循环。