C++重点知识点总结及习题 下载本文

fun1(1); }

void fun1(int i) {

cout<<\}

void fun1(double i) {

cout<<\}

解答:

本题主要考查重载与作用域的关系问题。本程序中虽然定义了重载函数fun1。但是在主函数中仅声明了参数类型为double的函数fun1,然后就对fun1进行调用(调用前没有看到以整型数据作为形参的fun1函数的定义或声明)。那么尽管调用时赋的实参1是整型,也无法调用以整型数据作为形参的fun1函数。只能通过隐式数据类型转换与以double类型作为形参的fun1函数匹配。也就是说,在这里实际上没有实现重载。 所以,结果为:double:1。

例题11:运行下列程序的结果为 var1=300,var2=400

var1=①_,var2=_②_。

#include

void output(int var1,int var2) {

cout<<\ var1=100; var2=200; }

void main() {

int var1=300; int var2=400;

output(var1,var2);

cout<<\}

解答:

本题主要考查变量的作用域问题。在主函数中定义的变量var1和var2其作用域为本程序范围,在函数output中形参var1和var2的作用域在output函数范围内,因为它和主函数中定义的变量同名,所以在该函数范围内会屏蔽主函数中定义的同名变量,其中的访问变量var1和var2的操作都是针对于形参变量,与主函数中定义的变量无关。当对output函数的调用结束后,形参变量消失,返回主函数,在主函数中访问的变量var1和var2仍为主函数中所定义的变量。所以,答案为:①300、②400

例题12:写一个函数,它以一个名字作为命令行参数,打印输出“hello,name”(其中name为输入命令行参数)。 解答:

本程序主要考查对命令行参数的理解及使用。 说明:

void main(int argc,char* argv[]){?}

即是说,除按通常的那种无参方式来使用main函数外,如果需要的话,main函数还可带有两个上述格式以及数据类型的形式参数。

main带有形式参数时,其对应实参值由用户在执行该程序时指定,而后通过操作系统将它们传递给main函数。main函数所含两个参数的含义如下:

argc-----第一参数,记录命令行参数的个数(其值为实际命令行参数的个数加1);

argv-----第二参数,为字符串数组,存放执行程序名以及各实际命令行参数。各数组元素的含义为:

argv[0]:本执行程序的文件名

argv[1]:第1个实际命令行参数(如果有); ?

argv[argc-1]:第argc-1个实际命令行参数。

在vc6.0开发环境下设置命令行参数方法如下:

project?settings??debug?”program arguments:”中,输入以空格分隔的各参数。 在命令提示符环境中,可通过如下形式运行程序:

程序文件名 参数1 ? 参数之间用空格隔开。

参考程序为:

#include

void main(int argc,char* argv[]) {

cout<<\}

例题13:使用重载函数的方法定义两个函数,用来分别求出两个int型数的点间距离和double型数的点间距离。两个int 型点分别为A(5,8),B(12,15);两个double型点分别为C(1.5,5.2),D(3.7,4.6)。 解答:

本题主要考查重载函数的应用。假设有两点A(x1,y1),B(x2,y2)则两点之间距离为

(x2?x1)2?(y2?y1)2。函数sqrt()的作用是求平方根,使用该函数应包含头文件

math.h。这个程序中要实现求整型的两点之间距离和双精度型的两点之间距离,作用相同,但操作的对象类型不同,结果类型不同,所以用函数重载解决。 参考程序如下:

#include #include

void main() {

double distance(int,int,int,int);

double distance(double,double,double,double); int x1=5,y1=8,x2=12,y2=15;

double xd1=1.5,yd1=5.2,xd2=3.7,yd2=4.6; double disi=distance(x1,y1,x2,y2); cout<<\两个int 型数的点间距离:\ cout<

double disd=distance(xd1,yd1,xd2,yd2); cout<<\两个double 型数的点间距离:\ cout<

double distance(int a1,int b1,int a2,int b2) {

cout<<\调用计算两个int型数的点间距离函数\\n\ double s=sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2)); return s; }

double distance(double a1,double b1,double a2,double b2) {

cout<<\调用计算两个double型数的点间距离函数\\n\ return sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2)); }

例题14:使用递归函数求解并输出fibonacci数列的前十项。 解答:

本题主要考查对递归函数的应用。对于fibonacci数列在前边已经介绍,这里使用递归完成,请读者对比递归于非递归编程的方法。 参考程序如下:

#include #include int fib(int n) {

if(n<3) return 1;

return (fib(n-2)+fib(n-1)); }

void main() {

for(int i=1;i<=10;i++) cout<

例题15:打印某一年的年历。 解答:

关于本题的编程细节请参见程序中的注释。 参考程序如下:

#include #include

int FirstDayOfYear(int y); int DaysOfMonth(int m); void PrintMonth(int m); void PrintHead(int m); bool IsLeapYear(int y);

int weekDay; int year;

void main() {

cerr<<\请输入您想要打印的年份:\\n\ cin>>year; if(year<1900)

{

cerr<<\年份不能小于1900。\\n\ return; }

weekDay=FirstDayOfYear(year);//一年的第一天星期几

//打印年标题

cout<<\年日历\\n\ cout<<\

//打印每个月

for(int i=1;i<=12;i++) PrintMonth(i); cout<

//某个月打印函数

void PrintMonth(int m) {

PrintHead(m); //打印月标题

int days=DaysOfMonth(m); //该月的天数 for(int i=1;i<=days;i++) {

cout<

weekDay=(weekDay+1)%7;

if(weekDay==0) //打印下一天时判断是否换行 {

cout<

cout<<\行首空格 } } }

//打印月标题

void PrintHead(int m) {

cout<<\月 日 一 \\n\

cout<<\

for(int i=0;i

//判断某月天数的函数 int DaysOfMonth(int m) {

switch(m){ case 1: case 3: case 5: case 7:

二 三四 五六 case 8: case 10:

case 12:return 31; case 4: case 6: case 9:

case 11:return 30;

case 2:if(IsLeapYear(year)) return 29; else

return 28; }

return 0; }

//判断是否为闰年

bool IsLeapYear(int y) {

return((y%4==0&&y0!=0)||year@0==0); }

//判断某年的第一天

//因为每年都是52个整星期多一天,因此n年多出的天数还是n天, //再加上1900年到year年间因闰年多出来的天数,

//再加上1900年元旦的星期序号1与7取模便得出是第几天。由于2000年正好是闰年,所//以可以计算到2099年。 int FirstDayOfYear(int y) {

int n=y-1900; n=n+(n-1)/4+1; n=n%7; return n; }

【习题】 一、选择题

1.下列函数定义语句正确的是( )。 (a)

void fun(int var1) {

int var1=0;

cout<

void fun(int var1,var2) {

cout<

int fun(int var1) {

if(var1)