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