return0;
}
这段程序使用了整数数组计算一组人的平均身高,再计算出有多少人的身高超过平均身高
修改上面的程序,使用动态内存来存储学生的信息,使程序可以处理任意学生的信息
4:
二维数组是数组的数组,而数组可以通过指针动态创建,如果动态数组创建的数组元素也是指针,数组的每个元素都可以存储数组的地址,使用这个概念,创建一个数组,其中包含三个数组指针,每个数组都可以包含六个int类型的值,把第一个整数数组的值设为1到6,下一个数组的元素值设置为第一个数组元素的平方,第三个数组的元素值设为第一个整数数组的三次方,输出3个数组的内容,再释放已分配的内存.
第八章:
使用函数编程*****************************
(1):
函数是一个自包含的代码单元,它有着已定义好的目的,一般的程序总是包含大量的小函数,而不是包含几个大函数
(2):
函数定义包含了函数名称,参数和返回类型的函数头,以及包含函数的可执行代码的函数体
(3):
函数原型允许编辑器处理对该函数的调用,但此时函数定义可能没有处理
(4):
由于给函数传送参数的按值传递机制,是传送原参数的副本,因此原参数值不能在函数中访问
(5):
给函数传送指针可以修改该指针指向的值,但指针本身是按值传送
(6):
把指针参数声明为const可以防止修改原来的值
(7):
可以把数组的地址作为指针传送给函数
(8):
使用引用给函数传送值,即按引用传送机制,可以避免按值传送参数中的隐含复制过程,在函数中不应该修改的值都应该声明为const
(9):
为函数的参数指定默认值后,只要参数有默认值,就允许有选择的省略参数
(10):
从函数中返回引用,允许在等号运算符的左边使用该函数,把返回类型声明为const引用,可以阻止在等号运算符的左边使用该函数
练习题
1:
编写一个value_input(),它接受两个整型参数和一个提示用户输入字符串参数,函数会提示所输入的值应在参数指定的范围之内,函数应一直提示用户输入值,直到输入的值有效为止.
在程序中使用该value_input()函数,获取用户的生日,验证月份,日期,年份是否有意义,最后以下面的格式在屏幕上输出该生日
Noverber21,1977
这个程序应使各个函数month(),year(),day(),管理对数字的输入,最后注意不要忘里闰年
2:
编写一个程序,它要求输入一字符串或一个字符数组,并反转它的顺序,使用什么类型的参数最好?
用main()函数测试该函数,提示用户输入一个字符串,反转其顺序,在输出反转后的字符串
3:
编写一个程序,它接受2到4个命令行参数,如果用少于2个或多于4个参数调用该程序,就输出一个消息,告诉用户该怎么做,然后退出,如果参数的个数是正确的,就输出参数,一行输出一个参数
4:
修改上一题中的程序,让他只接受两个参数,把第二个参数传送给第2题中的字符串反转函数,输出反转后的字符串
5:
编写一个程序,它返回long变量中最小值的引用,编写另一个函数,它返回较大值的引用,使用这两个函数生成斐波纳契级元素,即1,1,2,3,5,8,13..............序列,其中每个数都等于前两个数之和,元素的个数有用户指定(提示:
把序列中的两个数存储在n1和n2中,它们都从1开始,如果把两个数的和存储在较小的变量中,并输出教大的值,就会得到希望的结果,难点就是为什么这是可行的)
第九章:
函数*********************************
(1):
重载函数是名称相同,但参数列表不相同的函数,重载函数不能仅通过返回类型来区分
(2):
函数签名由函数名和参数个数及类型来确定的,在调用重载函数时,编辑器会检查函数签名,把它与可用的函数做比较,然后选择合适的函数
(3):
函数模板是自动生成重载函数的一种方法
(4):
函数模板有一个或多个参数,这些参数通常是类型变量,也可以是非类型的变量,函数模板的实例,即函数定义,有编辑器为每个对应于一组唯一模板参数的函数调用用创建的
(5):
可以使用函数指针来存储有对应返回类型,参数类型和个数的任一函数地址
(6):
可以使用函数指针来调用它包含的地址上的函数,还可以把函数指针作为函数参数来传送
(7):
递归函数是调用它自身的函数,采用递归方式算法有时可以得到非常简明的代码,但与实现同一算法的其他方法相比,采用递归方式常常需要更多的执行时间
练习题
1:
创建一个函数plus(),它把两个数值加在一起,返回它们的和,提供处理,int,double和 string类型的重载版本,测试它们是否能处理下面的调用
intn=plus(3,4);
doubled=plus(3.2,4.2);
strings=plus("he","llo");
strings1="aaa";strings2="bbb";
strings3=plus(s1,s2);
给string版本的函数传送参数的最有效方式是什么?
为什么下面的调用不工作?
d=plus(3,4.2);
2:
把函数plus()变成一个模板,测试它是否能用于处理数值类型,该摸板是否能处理第1题中的语句plus("he","llo')?
,为什么?
提出问题的一种解决方法.
3:
STL提供了三角函数sin(),cos(),tan(),这些函数都带有一个double参数,返回一个double的值,要使用它们需要包含标准库头文件<cmath>,编写一个函数calc(),
它带用两个参数,一个double值和一个指向三角函数的指针,返回把函数应用于double值的结果,编写一个函数,测试所写的函数,如果该函数通过了测试,就建立一个函数指针数组,存储这三个三角函数,并测试它们
4:
有一个递归函数,称为Acherman函数,它广泛应用于计算机科学和数学,其定义如下:
如果m和n是整数,若n>=0,且 m>=0,则
如果m==0,则ack(m,n)=n+1
如果n==0,且m>0,则ack(m,n)=ack(m-1,1)
如果m>0且n>0,ack(m,n)=ack(m-1,ack(m,n-1))
编写一个程序递归计算Ackerman函数,假定n为0到5之间的值,m为0到3之间的值,进行测试,这个函数的一个特性是,如果m和n有小幅度的增加,递归的次数(或深度)就会有非常大的增加,所以不要递归计算n>8或m>3的情形,实际上一台计算机没有足够的能力计算这种情形
第十章:
程序文件和预处理指令*************************
(1):
程序中的每个实体都只能有一个定义
(2):
名称可以有内部链接属性,即该名称可以在一个转换单元中访问,名称也可以有外部链接属性,即名称可以在任何单元中访问,名称还可以没有链接属性,即名称只能在定义它的块中访问
(3):
头文件也可以包含源文件需要的定义和声明,头文件还可以包含模板和类型定义,枚举,常量,函数声明,内联函数定义,以及指定的命名空间,按照约定,头文件使用扩展名.h
(4):
把函数定义和全局变量放在源文件中,C++源文件的扩展名是.cpp
(5):
通过#include指令可以把头文件的内容插入到.cpp文件中
(6):
Cpp文件是转换单元的基础,编辑器会处理转换单元,以生成对象文件
(7):
命名空间定义一个作用域----在这个作用域内声明的所有名称都附加了命名空间的名称,不在显示命名空间作用域内声明的名称就在全局命名空间中
(8):
一个命名空间可以由几个独立的同名命名空间声明组成
(9):
在不同的命名空间中声明的相同名称是不同的
(11):
为了在命名空间的外部引用在命名空间中声明的标识符,需要指定命名空间的名称和标识符,两者之间用作用域解析运算符:
:
分隔开
(12):
在某个命名空间声明的名称,在这个命名空间中使用时,可以不加限定符
(13):
预处理器执行预处理指令,在编译代码之前传送