面向过程的程序设计和算法
程序=算法+数据结构
数据呈现一定的结构性,可以形成整体的结构,程序中药指定数据类型和组织形式,即数据结构(data structure)
对操作的描述,即操作步骤,也就是算法(algorithm)
C++既支持面向过程的程序设计,又支持面向对象的程序设计
算法的概念
为解决问题而采取的方法和步骤
例:乐谱是乐队演奏的算法
菜谱是做菜肴的算法
算法必须具体指出在执行每一步应当怎么做
算法要说明如何得到解,而不是给出问题的解
算法由一系列操作指令(加减乘除判断等)按顺序,分支,重复等结构组成
研究算法的目的就是如何将各种类型的问题的求解过程分解成一些基本的操作
算法必须要能在有限步骤内得到特定问题的解
算法的描述工具:
自然语言
流程图:程序流程图,N-S图
伪代码
Que:求两个给定正整数a和b的最大公约数
Sol: 伪代码:inputa,b;
If(a<b)交换a和b;
While (b不为0)
{
求a除以b的余数r;
将a取b的值;
将b取r的值;
}
输出a;
辗转相除法,直到余数为o0时循环结束,此时的除数就是最大公约数
求最小公倍数:m和n的积除以m和n的最大公约数
算法的流程图表示:
圆角矩形框表示begin,end
平行四边形框表示输入输出框
菱形框表示判断框,可以为关系表达式或者逻辑表达式,作为判断条件
矩形框表示一些操作处理
只有判断框有一个入口,两个出口
三种基本控制结构
顺序结构 选择结构(单分支和双分支) 循环结构(while和do while)
都是单入口单出口的
算法的N-S图(盒图)
C++程序结构
#include<iostream>
#include<cmath>
using namespace std;
void main ()
{
int gcd(int x,int y);
int m,n;
cout<<"输入两个数字:";
cin>>m>>n;
cout<<"最大公约数:";
cout<<gcd(m,n)<<endl;
}
int gcd(int a,int b)
{int t,r;
if (a<b)t=a,a=b,b=t;
while (b!=0)
{
r=a%b;
a=b;
b=r;
}
return a;
} 该段为对计算最大公约数的函数gcd的算法,就不需要再引入包含该函数的头文件,因为C++中并没有连接到该函数的库函数
C++程序结构图
一个C程序可以包含很多个源程序文件
在这些源程序文件中包含预处理命令如#include,#design,全局变量声明,以及函数1到n,如main函数
每个函数包括函数首部定义(名字,返回值类型,参数)和函数体,函数体中又包括局部变量声明(只能在main函数内使用,而不能在其他函数体内使用)和执行语句
C++程序中最小的独立单位是语句(statement)
声明语句
执行语句
空语句
复合语句
语句分类
1 声明语句
变量声明:int a,b;在计算机内部编译器分配一个空间,可以通过变量名调用这块空间
函数声明:int gcd(int x,int y);
先声明变量和函数,才能使用
2 执行语句
1)控制语句,完成一定控制功能
2)函数和流对象调用语句 由一次函数调用加一个分号构成一个语句
例:sort(x,y,z); 三个参数排序
Cout<<x<<endl; 输出流对象调用
Cin>>x>>endl; 输入流对象调用
3)表达式语句,由一个表达式加一个分号构成一个语句
I=i+1; 赋值表达式+一个分号=赋值表达式语句
I++;
5+i; 表达式+分号=语句,但不是赋值表达式语句
语句必须在最后出现分号
C++的9种控制语句
If else (条件语句)
For (循环语句)
While (循环语句)
Do while (循环语句)
Continue (结束本次循环语句)
Break (终止执行循环语句和switch语句)
Switch (多分支选择语句)
Goto (转向语句,面条型可能导致程序混乱)
Return (从函数返回语句)
3 空语句 复合语句
空语句即只有一个分号的语句,什么都不做,可作为被转向点或者循环语句中的循环体
复合语句用{}将一些语句括起来
复合语句中最后一个语句中最后的分号不能省略
复合语句右花括号后无分号
4 赋值语句
区分赋值语句与赋值表达式
If((a=b)>0) cout<<”a>0”<<endl;
If((a=b;)>0) cout<<”a>0”<<endl; 赋值语句 if()中不能出现表达式语句,因为表达式有返回值,而语句没有返回值,只执行操作
If()中什么表达式都可以,if(a=b)为赋值表达式,if((a=b)>0)为关系表达式,但不能出现语句
C++的输入和输出
用“流”(stream)的方式实现,从键盘输入
流对象cin,cout和流运算符的定义存放在C++的输入输出流库中,因此如果使用它们则必须使用预处理 命令把头文件stream包含到本文件中:
#include <iostream>
例:int b=4;
Cout<<b<<’\t’<<b++<<endl; 输出为:5 4
因为结合时从右向左进行,输出显示时由左向右进行
B=4,b++得b=4,b=b+1,b=5,输出即为5 ‘\t’表空格
Int a=1,b=4,c=8;
Cout<<a,b,c; 逗号表达式语句,求值结果为c,且插入运算符优先级高于逗号运算符
Cout<<a,b,c<<endl; 出错 逗号表达式优先级最低,c<<endl不是输出流运算,非法
Cout<<a+b+c<<endl; 输出a+b+c的结果,优先级比<<高,输出13再换行
Cout输出时,系统会自动判别输出数据的类型,使输出的数据按相应的类型输出
必要时,一条语句中多个数据输出合理分隔
例: cout<<a<<’ ’<<b<<’ ’<<c<<endl;
Cin 输入中,cin>>a>>b>>c>>d; 可以从键盘输入1 2 3 4回车,也可以分多行输入数据,以回车分隔(若输入字符型,则a输入1,b输入空格……)
Cin输入系统也会根据变量的类型从输入流中提取相应长度的字节
在输入流与输出流中使用控制符
目的:输入输出时满足一些特殊的要求
方法:使用输入输出流中的控制符
字符输出函数 putchar函数
Int putchar(int);
作用:向终端输出一个字符
#include<iostream>
using namespace std;
int main ()
{
char a,b,c;
a='B';b='O';c='Y';
putchar(a); a为字符型,输出的为它的ASCII码
putchar(b);
putchar(c);
putchar('\n');
putchar(66);
putchar(79);
putchar(89);
putchar(10);
return 0;
}
输出:BOY
BOY
字符输入函数getchar函数
Int getchar(void);
作用:从终端(或系统隐含指定的输入设备)输入一个字符
#include<iostream>
using namespace std;
int main ()
{
char c; 整型和字符型都可以
c=getchar(); 只接收一个字符,返回值为int型
putchar(c+32); 大写字母转化为小写字母
putchar('\n');
return 0;
}
Cout<<”演示一:原样输出:”<<endl;
While((c=getchar())!=’#’)
Putchar(c);
C语言中用scanf和printf进行输入和输出
函数格式:scanf(格式控制,输出表列)
Printf(格式控制,输出列表)
#include <studio.h>
int main()
{int a; float b; char c;
scanf("%d %c %f,&a,&c,&b"); 输入变量放入a,c,b中,a为整型,c为字符型,b为float型,&为取地址
printf("a=%d,b=%f,c=%c\n",a,b,c); 输出a,b,c的值 可测试输出a,b,c的类型
return o;
}
C语言中:
%d:输入输出为整形 %ld 长整型 %hd短整型
%hu无符号短整形 %u无符号整型 %lu无符号长整形
%s:输入输出为字符串 (char str) %c字符
%f:输入输出为浮点型 %lf双精度浮点型