《第2讲C基础与编程1.ppt》由会员分享,可在线阅读,更多相关《第2讲C基础与编程1.ppt(33页珍藏版)》请在三一办公上搜索。
1、1,C+基础与编程,1 编程练习一:自动出题器2 编程练习二:判断字符串是否是“回文”3 编程练习三:数据排序4 深入学习一:文字常量和常变量5 深入学习二:const的用法6 深入学习三:引用与指针常量,2,要求:对两个随机的100以内的整数进行加法运算,共出10题,每题10分,最后给出得分。,1 编程练习一:自动出题器,基本思想:(1)用循环实现(2)产生两个100以内的随机数(3)将用户输入的答案与正确答案比较,如果一致则在得分上加10分,否则不得分(4)输出总分,3,1 编程练习一:自动出题器,程序:#include#includeusing namespace std;int mai
2、n()int x,y,a,b,s=0;for(int i=1;ib;if(a=b)s+=10;cout您的总得分是:sendl;,4,问题:当程序第二次运行时,所出的题目与第1次一样。,1 编程练习一:自动出题器,原因:随机数的序列总是和一个随机种子相关联,相同随机种子对应的随机数序列相同。由于没有指定随机种子,因此程序运行后均以默认的随机种子产生相应的随机数序列。,解决方案:使用srand库函数重新指定随机种子。,5,1 编程练习一:自动出题器,程序:#include#include#includeusing namespace std;int main()int x,y,a,b,s=0;s
3、rand(unsigned)time(NULL);for(int i=1;ib;if(a=b)s+=10;cout您的总得分是:sendl;,6,要求:对于一个字符串,顺读与逆读是相同的字符。定义一个子函数完成判断功能,若是回文,返回1,否则返回0。在主函数中根据返回值输出结果。,2 编程练习二:回文字符串判断,基本思想:(1)计算字符串的长度(2)第一个字符与最后一个字符比较,第二个字符与倒数第二个字符比较(3)用循环实现(4)考虑参数传递,7,程序:#include#includeusing namespace std;int decidePalindrome(char s)int i=0
4、,j;j=strlen(s)-1;while(ij)if(si!=sj)return 0;i+;j-;return 1;,int main()char str100;coutstr;int result=decidePalindrome(str);if(result)cout“该字符串是回文”endl;else cout“该字符串不是回文”endl;return 0;,2 编程练习二:回文字符串判断,8,要求:冒泡法 选择法 直接插入法,3 编程练习三:数据排序,9,冒泡法程序:#include#includeusing namespace std;void bubblesort(int da
5、ta,int n);int main()int a=20,40,-50,7,13;int n=sizeof(a)/sizeof(int);bubblesort(a,n);for(int j=0;jn;j+)coutajt;coutendl;system(pause);,void bubblesort(int data,int n)int temp;for(int i=0;idataj+1)temp=dataj;dataj=dataj+1;dataj+1=temp;,3 编程练习三:数据排序,10,选择法程序:#include#includeusing namespace std;void bu
6、bblesort(int data,int n);int main()int a=20,40,-50,7,13;int n=sizeof(a)/sizeof(int);selsort(a,n);for(int j=0;jn;j+)coutajt;coutendl;system(pause);,void selsort(int data,int n)int min,k,temp;for(int i=0;idataj)min=dataj;k=j;temp=datai;datai=datak;datak=temp;,3 编程练习三:数据排序,11,练习:把输入的字符串逆序排列,并显示。,分析:数据结
7、构:输入的字符串用字符数组存放。算法要点:逆序排列用交换算法,求出字符串最后一个字符的下标,然后将第一个和最后一个交换,第二个和倒数第二个交换,.。,12,程序:#include using namespace std;int main()char str80;int temp,i,j;coutstr;for(i=0,j=strlen(str)-1;ij;i+,j-)temp=stri;stri=strj;/*交换i,j两个元素*/strj=temp;coutnReversed string:n“str;,13,练习:直接插入法排序,基本思想:先将下标为0的元素作为已排好的元素,然后从下标为1
8、的元素开始,依次把后面的元素按大小插入到前面已排好序的元素中,直到将全部元素插完为止,从而完成排序过程。,14,程序:#include using namespace std;void insertsort(int data,int n);int main()int a=20,40,-50,7,13;int n=sizeof(a)/sizeof(int);insertsort(a,n);for(int j=0;jn;j+)coutajt;coutendl;system(pause);,void insertsort(int data,int n)int nInsert,nPos;int nPo
9、sMax=0;int j;for(int i=1;i=nPos)dataj+1=dataj;datanPos=nInsert;nPosMax+;,15,void insertsort(int data,int n)int nInsert,j;for(int i=1;i=0),16,#include#includeusing namespace std;int const N=3;int main()char lN30,temp30;int i,j,k;cout请输入字符串endl;for(i=0;iN;i+)cin.getline(li,10,#);,for(i=0;i0)strcpy(tem
10、p,lj);strcpy(lj,lj+1);strcpy(lj+1,temp);for(i=0;iN;i+)coutli;system(pause);return 0;,练习:对字符串进行排序,17,文字常量(literal constant)又称为“符号常量”、“字面常量”经编译之后写在代码区,是不可寻址的。利用预编译指令#define定义的常量属于文字常量。常变量(constant variable)常变量与其他变量一样被分配空间,是可以寻址的。由普通变量在前面加const关键字定义的是常变量。,4 深入学习一:文字常量和常变量,18,常变量的值 常变量的值在初始化后不能改变,是在高级语言
11、的语义层面上定义的,由编译器所做的语法检查进行保障。但是,由于运行时常变量并不是放在只读内存中,而是和一般变量一样放在数据区,所以在运行时如果能获得常变量的地址,一样可以通过特殊的途径对它们进行修改。,4 深入学习一:文字常量和常变量,19,例子:#includeusing namespace std;void ShowValue(const int,4 深入学习一:文字常量和常变量,20,例子:#includeusing namespace std;void ShowValue(const int,4 深入学习一:文字常量和常变量,21,原因:编译器在代码优化的过程中已经将j替换成了文字常量
12、5。另:ShowValue()中的形参不用引用可以吗?值传递、指针传递,4 深入学习一:文字常量和常变量,22,出于语法规则或代码优化的需要,在某些情况下文字常量和常变量会由编译器进行转换。例子:#includeusing namespace std;void DefineArray(const int n)int Bn=;/出编译错误 coutB0endl;int main()const int m=5;int Am=;/正确 coutA0endl;,4 深入学习一:文字常量和常变量,23,const的位置 const 的位置与语义之间的关系:#include using namespace
13、 std;int main()int i=5;const int v1=1;int const v2=2;const int*p1;int const*p2;const*int p3;/wrong int*const p3=,5 深入学习二:const用法,24,const的位置(1)const和数据类型结合在一起,形成所谓“常类型”。利用常类型声明或定义变量,就产生了常变量。(2)const用来修饰类型时,既可以放在类型的前面,也可以放在类型的后面(3)用常类型声明或定义变量时,const只会出现在变量前面。(4)const和被修饰类型之间不能有其他标识符存在。(5)在理解有const存在的
14、声明语句时,关键是搞清楚到底什么是“不可变”的。,5 深入学习二:const用法,25,const的位置 1)对一个具体的变量来说,如果const直接出现在该变量的前面,则该变量的值一旦被初始化就不能再改变。2)常指针和指针常量 常指针是指针指向的是一个常量,指针常量是指指针本身的值是一个常量,不能修改。如果指针被定义为指针常量,则在定义它的时候必须同时初始化,否则编译报错。3)常引用是指将被引用对象当做一个常量,也就是不允许通过引用来修改被引用对象的值。,5 深入学习二:const用法,26,const对象和对象的const成员(P6)(1)常对象:用const修饰的对象。(2)常函数:用c
15、onst修饰的类的成员函数(3)在常函数中不允许对任何成员变量进行修改。(4)通过常对象,只能调用该对象的常函数。(5)只有类的非静态成员函数可以被声明为常函数,其他类型的函数不能被声明为常函数。(6)const是重载的标记(7)非只读对象调用某个函数时,先寻找它的非const函数版本,如果没有找到,再调用它的const函数版本。,5 深入学习二:const用法,27,const对象和对象的const成员(8)如果一个非只读对象调用某个函数时,这个函数同时存在非const函数版本和const函数版本,而我们希望调用它的const函数版本?必须通过建立该对象的常引用或指向该对象的常指针来达到目的
16、。(9)定义一个常对象,是将该对象的全体数据成员当做常量看待。(10)类对象的非静态常量成员必须在构造函数中初始化,而且只能借助初始化列表进行。,5 深入学习二:const用法,28,用const修饰函数的参数和函数的返回值(P8)(1)目的:是让编译器为程序员做变量只读性的检查,以便程序更加健壮。(2)如果函数的返回值是引用,则用const修饰返回值可以阻止对被引用对象的修改。常见的对const的误解(P10)(1)用const修饰的变量的值一定是不能改变的。(2)常引用或常指针,只能指向常变量。引用被声明为常引用,只是说明不能通过该引用(或该指针)去修改被引用对象的值。至于被引用对象原来是
17、什么性质,或者是否会被其他引用修改,是无法由常引用来决定的。,5 深入学习二:const用法,29,引用变量是C+语言引入的一个重要机制,它的出现使得原来在C语言中必须用指针实现的功能有了另一种实现的选择,而且在书写形式上更为简便。曾经学过的(1)引用就是被引用对象一个别名。(2)编译器可以不为引用分配内存空间。引用的本质 int i=5;int 也就是说,既然ri是i的别名,那么凡是ri出现的地方,都可以直接用它的“原名”i,或者说,在编译的时候,在符号表中ri和i对应于相同的变量的地址,这样的确就没有必要存在一个名为ri的变量了。,6 深入学习三:引用与指针常量,30,但是,这种在编译阶段
18、进行静态替换的做法并不是在任何情况下都能进行的。void swap(int 由于函数swap()是在不同的上下文环境中被调用的,每次调用的时候,传进函数的实参都可能不相同。所以,在编译阶段将引用替换成被应用对象原名的做法是不行的。因此,必须把引用本身当作实体来看待。实质上,引用本身的确是一个变量。存放的是被引用对象的地址。,6 深入学习三:引用与指针常量,31,指针常量和引用变量 引用变量在功能上等同于一个指针常量,即一量指向某个单元就不能再指向别处。在底层,引用变量也是按指针常量的方式来实现的。在高级语言层面上,指针常量与引用变量的关系如下:,6 深入学习三:引用与指针常量,32,(1)在内
19、存中都是占据4字节的空间,存放的都是被引用对象的地址,都必须在定义的同时进行初始化。(2)指针常量本身允许寻址,即&p返回指针变量(常变量)本身的地址;引用变量本身不允许寻址,&r返回的是被引用对象的地址,r的地址由编译器掌握,程序员无法直接对它进行存取。(3)凡是使用了引用变量的代码,都可以转换成使用指针常量的对应形式的代码,只不过书写形式上要繁琐一些。,6 深入学习三:引用与指针常量,33,关于注释(1)不用过分积极的注释:第一,转移代码阅读者的注意力,增加阅读量.第二,要维护的东西更多.第三,对注释的更改常常被忽视.(2)遵循简单易行的、定义良好的命名习惯(3)采用标准库中的、或尽人皆知的组件,小知识,