C语法基础1课件_第1页
C语法基础1课件_第2页
C语法基础1课件_第3页
C语法基础1课件_第4页
C语法基础1课件_第5页
已阅读5页,还剩43页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

重庆邮电大学计算机科学与技术学院冯潇fengxiao@2024/1/6本次课内容C++程序的基本构成重点C++基本数据类型初步学会cin、cout的基本用法初步理解标准名字空间的作用和用法标准头文件和头文件初步了解string和vector的基础语法初步认识和理解模板机制函数模板2024/1/6C++程序

基本构成#include<iostream>usingnamespacestd;//使用标准名字空间std

intmain(){charname[20],classNo[9];

cout<<"inputnameandclassnumber:";

cin>>name>>classNo;

cout<<"Hello,"<<name<<",welcometoClassNo."<<classNo<<endl;return0;}说明C++标准头文件名没有扩展名“.h”namespace表示了标识符的可见范围标准名字空间std是C++标准库中所有标识符的有效可见范围using指示符表示让标准名字空间中所有标识符可见试试将上述程序中的“using......”一行注释掉C++中,行注释//和段注释/**/仍然可用2024/1/62024/1/6C++标准库演化过程C++诞生后的很长时间,各个软件厂商对C++库的实现有所不同,这就意味着不同软件厂商生产的C++程序库,其内容和行为可能不同C++标准化可以简化C++的教学、使用以及在不同平台间的移植,是C++的一个重要里程碑C++为保持向下兼容,以.h结尾的C++旧头文件仍然可用而新的C++标准头文件将旧头文件中的.h去掉,如<iosteam>,并标准库中的一切都被放在标准名字空间std中原来C语言的头文件去掉.h扩展名,并在文件名前加c,如<cstring>2024/1/6C++中完成标准输入/输出C语言中,输入和输出通过库函数scanf()和printf()完成C++通过I/O流库完成输入和输出,I/O流库声明于标准库文件<iostream>中,使用格式为#include<iostream>usingnamespacestd;//该文件在标准名字空间std下全局流对象cout(读音,see-out)代表标准输出设备,即屏幕全局流对象cin(读音,see-in)代表标准输入设备,即键盘全局

名字空间#include<iostream>usingnamespacestd;/*函数fun定义在所有函数之外,即定义在全局名字空间中*/voidfun(){cout<<"thisisatestfuction!"<<endl;}intmain(){fun();//调用全局函数fun

::fun();//全局名字空间前,域作用符::可省略

return0;}名字空间为避免软件开发商、程序员所命名的不同标识符产生命名冲突,可将自定义的标识符放在自己定义的名字空间下这里以线性同余产生伪随机数为例说明名字空间的用法古老的LCG(linearcongruentialgenerator)代表了最朴素的伪随机数产生器算法。主要原因是容易理解,容易实现,而且速度快。LCG算法数学上基于公式:X(n+1)=(a*X(n)+c)%m模m,m>0系数a,0<a<m增量c,0<=c<m原始值(种子)0<=X(0)<m2024/1/6其中参数c,m,a比较敏感,或者说直接影响了伪随机数产生的质量。一般而言,高LCG的m是2的指数次幂(一般2^32或者2^64),因为这样取模操作截断最右的32或64位就可以了。多数编译器的库中使用了该理论实现其伪随机数发生器rand()自定义

名字空间xiao#include<iostream>usingnamespacestd;namespacexiao{ intrand();};intxiao::rand()//产生的随机数不超过32767{ staticintxi=1;//(a*xi+c)%32767,位运算比除法快//高16位随机性较好,令xi右移16位,得到的数在[0,65535] ((xi=214013L*xi+2531011L)>>16)&0x7fff; returnxi;}2024/1/6自定义

名字空间xiaointmain(){inttimes=10,i; for(i=1;i<=times;i++) { cout<<i<<"."<<xiao::rand()<<endl; }return0;}//采用域名::标识符名可以有效避免命名冲突2024/1/62024/1/6空类型void整型int字符型实型逻辑型bool单字符型char宽字符型w_chart单精度型float双精度型double指针type*结构struct枚举enum类class非基本数据类型数据类型基本数据类型联合union数组type[]说明:

VC++中整型数据占4B,字符型占1B,float型占4B,double型占8B,指针占4Bbool类型示例-1编写函数isalpha判断字符是否是英文字符boolisalpha(charch){return(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z');}intmain(){charch;cin>>ch;if(isalpha(ch))cout<<ch<<"isaletter."<<endl;else

cout<<ch<<"isnotaletter."<<endl;}bool类型示例-2数树某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。计算将这些树都移走后,马路上还有多少棵树。2024/1/6样本输入数据5003//马路长度500,区域数为3150300//第一个区域的起点和终点100200//第二个区域的起点和终点470471//第三个区域的起点和终点样本输出数据298//马路上剩余的树的数目思路定义bool类型数组,元素共L+1个,初始值均为true将区间内的元素值标记为false统计true值元素,即为所求树的数目2024/1/6C++的顺序存储容器--vectorC++在标准头文件<vector>中定义了向量类vector,用于存放大量同类型元素和C的数组相比,vector的元素个数可以由用户动态指定、能做整体的赋值、比较等运算、程序运行过程中,数组容量可以扩大、缩小定义容器对于相关语法:vector<int>v1;//定义空的向量v1,里面没有元素//定义bool类型向量v2,有l+1个元素,每个元素值为truevector<bool>v2(l+1,true);对第i个元素赋值:v2[i]=falsememset:指定内存块填充值函数原型void*memset(void*s,intch,size_tn);作用将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,或者给指定内存块填充指定值,其返回值为指向S的指针。对应头文件<cstring>2024/1/6#include<iostream>#include<vector>#include<cstring>usingnamespacestd;intmain(){ intl,blocksNumber; cout<<"inputlandblocks:"; cin>>l>>blocksNumber;//l+1个元素,每个元素值为true vector<bool>points(l+1,true);//blocksNumber*2个元,未初始化向量 vector<int>blocks(blocksNumber*2);inti;bool*start=&(*points.begin());for(i=0;i<blocksNumber*2;i+=2){ cout<<"inputstartandendpointofblockNo."<<i+1<<":"; cin>>blocks[i]>>blocks[i+1]; memset((void*)(start+blocks[i]),0,blocks[i+1]-blocks[i]+1);}intcount=0;for(i=0;i<l+1;i++){ if(points[i]==true) count++;}cout<<"treesremained:"<<count<<endl;

return0;}2024/1/6引用(reference)C++引入“引用”的目的指针存在着相当大的安全隐患引用,即变量的别名引用的声明格式类型&引用名=变量名;intnumber=10;int&ref=number;声明引用时,必须对其进行初始化numberref2024/1/6观察程序#include<iostream>usingnamespacestd;intmain(){ intnumber=1; int*pointer;//指针未初始化,编译器不报错

int&ref=number;//去掉=number,编译器报错

cout<<ref<<endl; return0;}2024/1/6观察程序#include<iostream>usingnamespacestd;intmain(){ intnumber=1;

int&ref=number;

constint&con_ref=number;

cout<<"++number="<<++number<<endl; cout<<"++ref="<<++ref<<endl; cout<<"++con_ref="<<++con_ref<<endl; return0;}2024/1/6指针VS.引用什么时候用指针?什么时候用引用?如果存在不指向任何对象的情况,应使用指针不能定义引用类型的数组,只能当以单个引用绑定单个变量引用比指针更安全……

voidswap(int&one,int&another){inttemp;

temp=one;one=another;another=temp;}

intmain(){intone=3,another=5;

print("交换前",one,another);

swap(one,another);print("交换后",one,another);return0;}我需要更通用的swap实现!voidswap(int&a,int&b){

inttemp;temp=a;a=b;b=temp;}voidswap(double&a,double&b){

doubletemp;temp=a;a=b;b=temp;}voidswap(string&a,string&b){

stringtemp;temp=a;a=b;b=temp;}voidswap(date&a,date&b){

datetemp;temp=a;a=b;b=temp;}2024/1/6intmain(){inta=3,b=5; charc='a',d='b'; doublee=3.1,f=1.1;cout<<"beforeswap,a="<<a<<",b="<<b<<endl;

swap(a,b);//swap(c,d);cout<<"afterswap,a="<<a<<",b="<<b<<endl;return0;}2024/1/6具有相似功能的不同函数使用同一函数名,但这些同名函数的参数类型、参数个数、返回值类型、函数功能可以不同编译系统根据参数的类型和个数来判断实际调用时该调用哪个函数函数重载是C++对多态性的一个体现如果只是函数返回值类型不同,无法让编译其确定调用哪个函数什么是函数重载参数泛化的swap()//如果把各种数据类型抽象为参数Type//并保证swap能接受各种已定义类型的参数voidswap(Type&a,Type&b){

Typetemp;temp=a;a=b;b=temp;}//泛化以后的swap具有更强的通用性intstringcomplexcomplex其他类型认识模板#include<iostream>#include<string>#include<complex>usingnamespacestd;//这里的Type也可换成其他你愿意的,如<classAny>template<classType>voidSwap(Type&a,Type&b)//const能否加上?{ Typetemp; temp=a; a=b; b=temp;}intmain(){ inta1=5; inta2=3; cout<<"beforeswap,integer1="<<a1<<",integer2="<<a2<<endl; Swap(a1,a2);//int类型函数调用 cout<<"afterswap,integer1="<<a1<<",integer2="<<a2<<endl; strings1="C++"; strings2="Java"; cout<<"\nbeforeswap,string1="<<s1<<",string2="<<s2<<endl; Swap(s1,s2);//string类型函数调用 cout<<"afterswap,string1="<<s1<<",string2="<<s2<<endl; complex<double>c1(2.2,-5); complex<double>c2(-1,3.9); cout<<"\nbeforeswap,complex1="<<c1<<",complex2="<<c2<<endl; Swap(c1,c2);//complex类型函数调用 cout<<"afterswap,complex1="<<c1<<",complex2="<<c2<<endl; return0;}动态跟踪程序执行过程模板使用参数化的C++类型创建相应的函数和类,是更高一级的抽象。模板分为函数模板和类模板一个模板并非实实在在的类或函数,是参数化的类和函数函数模板的定义格式:template<class或typename<类型参数表>><返回值类型><函数名>(<参数表>){<函数体>}模板关于函数模板参数化的函数称为函数模板,代表的是一个函数家族函数模板不是一个实实在在的函数。编译系统不为其产生任何执行代码。只有当编译器发现一个具体的函数调用时,才根据具体的参数类型产生相应的代码,这部分代码称为模板函数。它是函数模板的一个具体实例,只处理唯一的一种数据类型。模板函数的生成由编译系统隐式生成,其实质是函数重载2024/1/6程序版式利用空行分隔出逻辑不同的各部分,紧密相关的代码应相互靠近利用空格分隔相关性较弱的事物,联系紧密的事物不需要空格(如函数名和左圆括号、*和指针名),一行代码一般保持在80个字符内,最多不超过120个字符变量声明尽可能靠近其使用位置,标识符命名做到名副其实注释的恰当用法是弥补我们在用代码表达意图时遭遇的失败(注释总是一种失败)程序员不能坚持维护注释代码是唯一真正准确的信息来源请尽量用代码而非注释来表达自己的意图如何写好函数整洁代码提倡函数应该做一件事。做好这件事。只做这件事注意以下要点函数的长度以20行封顶最佳函数的缩进层级不应该多于一层或两层(函数不应该达到足以容纳嵌套结构)if语句、else语句、while语句等,其中代码块应该只有一行只做一件事的函数无法被合理的分为多个区段程序中重复出现的代码应抽象为函数,重复的代码潜藏着无数隐患2024/1/6整洁代码相关作业独立写出筛选素数的整洁代码编程实现打印2012年年历已知2012年1月1日是星期天注意按照简洁代码的要求规范自己的程序能做出万年历最好写出有张力的程序2024/1/6从很熟悉的问题谈起#include<iostream>usingnamespacestd;

voidswap(int*p1,int*p2){inttemp;

temp=*p1;*p1=*p2;*p2=temp;}

intmain(){intx1=3,x2=5;

cout<<"beforeswap,x1="<<x1<<",x2="<<x2<<endl;swap(&x1,&x2);cout<<"afterswap,x1="<<x1<<",x2="<<x2<<endl;return0;}对比

前一程序#include<iostream>#include<string>usingnamespacestd;

voidswap(int*one,int*another){inttemp;

temp=*one;*one=*another;*another=temp;}

voidprint(stringhint,intone,intanother){cout<<hint<<",one="<<one<<",another="<<another<<endl;}对比前一程序intmain(){intone=3,another=5;

print("交换前",one,another);swap(&one,&another);print("交换后",one,another);return0;}//前后两个程序哪个更好,为什么?2024/1/6说明标识符的命名应做到名副其实,以数字系列命名(x1、x2,...xN),则完全没有提供正确信息或不能体现作者意图函数名应当是动词或动词短语,如deleteNode、save代码之间应减少重复和依赖多次重复出现的代码段应想办法将其模块化为函数最小权限原则整洁代码的编写虽然也遵循很多规范,但也有较强主观性,需要多加练习才能掌握大量的实用技巧并积累出优化代码和程序结构的经验2024/1/6阅读程序#include<iostream>usingnamespacestd;#defineN5boollegal(intscore){ returnscore>=0&&score<=100;}intmain(){ in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论