📄 c++.txt
字号:
return lcm;
}
void main(void)
{ int m,n;
cout<<"please input m,n:";
cin>>m>>n;
cout<<"Lease common multiple="<<lcm(m,n)<<endl;
cout<<"Gretest common divisor="<<gcd(m,n)<<endl;
}
程序运行后
please input m,n: 6 4
Lease common multiple=12
Gretest common divisor=2
5.23编写一个函数用递归的方法求1+2+3+4+…+n的值。在主函数中进行输入输出。
解:
(1)递归公式为:
1 ; n=1
sum(n)=
sum(n-1)+n ; n>1
(2)递归结束条件: n=1
(3)递归约束条件: n>1
# include <iostream.h>
void main(void)
{ int n;
int sum(int n);
cout<<"please input n:";
cin>>n;
cout<<"sum="<<sum(n)<<endl;
}
int sum(int n)
{ int s;
if (n==1)
s=1;
else
s=sum(n-1)+n;
return s;
}
程序运行后:
please input n:6
sum=21
5.24 编写一个函数power(float x,int n)用递归的方法计算x的n次幂。在主函数中实现输入输出。
(1)递归公式为:
x ; n=1
power(n)=
power(n-1)*x ; n>1
(2)递归结束条件: n=1
(3)递归约束条件: n>1
# include <iostream.h>
void main(void)
{ float x;
int n;
float power(float,int);
cout<<"please input x,n:";
cin>>x>>n;
cout<<"power="<<power(x,n)<<endl;
}
float power(float x,int n)
{ float p;
if (n==1)
p=x;
else
p=power(x,n-1)*x;
return p;
}
程序执行后:
please input x,n:2 4
power=16
5.25编写一个排序函数用选择法对一批整数按从大到小的次序进行排序。在主函数内输入数据,调用排序函数对数据排序,输出排序结果。
解:
# include <iostream.h>
# define N 5
void sort1(int a[])
{ int i,j,k,temp;
for (i=0;i<N-1;i++)
{ k=i;
for (j=i+1;j<N;j++)
if (a[k]<a[j])
k=j;
if (i!=k)
{ temp=a[i];a[i]=a[k];a[k]=temp;}
}
}
void main(void)
{ int a[N],i;
cout<<"Please input a["<<N<<"]:";
for (i=0;i<N;i++)
cin>>a[i];
sort1(a);
for (i=0;i<N;i++)
cout<<a[i]<<'\t';
cout<<endl;
}
程序运行后:
Please input a[5]: 5 8 4 1 3
8 5 4 3 1
5.26用输入input(int s[6][5])、计算calculate(int s[][5],int n)、输出output(int
s[6][5])三个函数完成习题4.21所要求功能。在主函数中定义二维数组s[6][5],调用input()、calculate()、output()完成学号与成绩的输入、总成绩与最高分的计算、结果的输出。
解:
#include <iostream.h>
#include <iomanip.h>
#define M 6
#define N 5
void input(float x[M][N])
{ int i,j;
cout<<"Input data:\n"; //输入数据
for (i=0;i<M-1;i++)
//输入5个学生的学号与3门课成绩
for (j=0;j<N-1;j++)
cin>>x[i][j];
}
void calculate(float x[][N],int n)
{ int i,j;
float sum,max;
for (i=0;i<M-1;i++) //处理数据
{ sum=0.0;
for (j=1;j<N-1;j++) //计算每个学生的总成绩
sum=sum+x[i][j];
x[i][N-1]=sum; //计算每个学生的总成绩
}
for (j=1;j<N;j++) //处理数据
{ max=x[0][j];
for (i=0;i<M-1;i++) //处理计算每门课程
if (max<x[i][j])
max=x[i][j];
x[M-1][j]=max; //计算每门课程的最高分
}
}
void output(float x[M][N])
{ int i,j;
cout<<setw(5)<<" Num. "<<" Math. Chin. Engl. Sum."<<endl; //输出数据
cout<<"-----------------------------------------------------------------\n";
for (i=0;i<M;i++)
{ for (j=0;j<N;j++) //输出学号、3门课程的成绩与总分
if (i==M-1 && j==0) cout<<setw(6)<<" 最高分 ";
else cout<<setw(6)<<x[i][j];
cout<<endl;
}
cout<<"------------------------------------------------------------------\n";
}
void main(void)
{ float s[M][N];
input(s[M][N]);
calculate(s[][N],6);
output(s[M][N]);
}
5.27用内联函数实现求出一维数组的最大值。在主函数中输入数组元素值,调用求最大值函数,并输出数组最大值。
解:
# include <iostream.h>
# define N 5
inline int maxf(int a[])
{ int i,max;
max=a[0];
for (i=1;i<N;i++)
if (max<a[i])
max=a[i];
return max;
}
void main(void)
{ int a[N],i;
cout<<"Please input a["<<N<<"]:";
for (i=0;i<N;i++)
cin>>a[i];
cout<<maxf(a)<<endl;
}
程序运行后:
Please input a[5]: 5 8 4 1 3
Max=8
5.28编写一个函数求长方体的体积,长方体的长、宽、高的默认值分别为30、20、10。在主函数中进行输入输出。
解:
# include <iostream.h>
float cuboid(float a,float b,float c)
{ float v;
v=a*b*c;
return v;
}
void main(void)
{ float l,w,h,v;
cout<<"Please l、w、h:";
cin>>l>>w>>h;
cout<<"volume:"<<cuboid(l,w,h)<<endl;
}
5.29编写两个名为max的重载函数,分别实现求两个整数和两个实数中的大数。
解:
# include <iostream.h>
float max(float a,float b)
{ return a>b?a:b;
}
int max(int a,int b)
{ return a>b?a:b;
}
void main(void)
{ int a,b;
float x,y ;
cout<<"Please a、b:";
cin>>a>>b;
cout<<"max="<<max(a,b)<<endl;
cout<<"Please x、y:";
cin>>x>>y;
cout<<"max="<<max(x,y)<<endl;
}
将光标停留在程序的第3行,按ctrl+F10键,运行程序到
Please x、y:1.2 3.4
后,转移到第3行,再按F5键执行结束。这说明当输入数据为实型时,系统会自动调用实型的max函数求最大值。而当输入数据为整型时,系统会自动调用整型的max函数求最大值。
习题6
6.1 什么是编译预处理?C++具有哪几种编译处理功能?
答:
在编译前,对源程序中的预处理命令作处理的过程称为编译预处理。C++具有:
(1)文件包含
(2)宏定义
(3)条件编译
三种编译处理功能。
6.2 什么是“文件包含”处理?在什么情况下需要使用“文件包含”处理?
答:
将另一个头文件(.h)内容包含到本源文件中来称为文件包含处理。
当要调用标准库函数时,或使用用户自定义头文件时,需要使用文件包含处理。
6.3 什么是宏定义?宏定义有哪两种形式?
答:
用指定标识符(宏名)来代表一个字符串称为宏定义。
宏定义分为无参的宏定义和带参的宏定义两种形式。
6.4 带参数的宏定义和函数有什么区别?
答:
(1)两者的定义形式不一样。宏定义中只给出形式参数,而不要指明每一个形式参数的类型;而在函数定义时,必须指定每一个形式参数的类型;
(2)函数调用是在程序运行时进行的,分配临时的内存单元;而宏调用则是在编译前进行的,并不分配内存单元,不进行值的传递处理。
(3)函数调用时,先求实参表达式的值,然后将值代入形参;而宏调用时只是用实参简单地替换形参;
(4)函数调用时,要求实参和形参的类型一致;而宏调用时不存在类型问题;
(5)使用宏次数多时,宏展开后源程序变长,因为每一次宏展开都使源程序增长;而函数调用不使源程序变长;
6.5 设计一个程序,将求两个实数中的较大数函数放在头文件中,在源程序文件中包含该头文件,并实现输入二个实数,求出其最大值。
exercise6_5.h
float maxf(float a,float b)
{ return (a>b)?a:b; }
exercise6_5.cpp
# include <iostream.h>
# include “exercise6_5.h”
void main(void)
{ float x,y;
cout<<”Input x,y:”;
cin>>x>>y;
cout<<”max=”<<maxf(x,y)<<endl;
}
6.6 设计一个程序,定义一个带参数的宏以求两个数中的较大数。在主函数中输入三个数,求出其中的最大数。
解:
# include <iostream.h>
# define MAX(a,b) (a)>(b)?(a):(b)
void main(void)
{ float x,y,z,m;
cout<<"Input x,y,z,m:";
cin>>x>>y>>z;
m=MAX(x,y);
if (m>z)
cout<<"max="<<m<<endl;
else
cout<<"max="<<z<<endl;
}
6.7 设计一个程序,分别用带参数的宏和函数求矩形的面积、周长。矩形边长用键盘输入。
解法一:用带参宏定义
# include <iostream.h>
# define AREA(a,b) a*b
# define PREIMETER(a,b) 2*(a+b)
void main(void)
{ float x,y;
cout<<"Input x,y:";
cin>>x>>y;
cout<<"Area="<<AREA(x,y)<<endl;;
cout<<"Preimete="<<PREIMETER(x,y)<<endl;
}
解法二:用函数
# include <iostream.h>
float area(float a,float b)
{ return a*b;}
float preimeter(float a,float b)
{ return 2*(a+b);}
void main(void)
{ float x,y;
cout<<”Input x,y:”
cin>>x>>y;
cout<<”Area=”<<area(x,y)<<endl;;
cout<<”Preimete=”<<preimeter(x,y)<<endl;
}
6.8
设计一个程序,三角形三条边用键盘输入,用带参数的宏求三角形的面积、周长。最后输出三角形的面积、周长。在调试程序阶段,定义标识符DEBUG,使用条件编译命令输出调试信息(如:三角形的三条边的边长)。程序调成功后,删除定义标识符DEBUG的命令,不输出调试信息。
//# define DEBUG
# include <math.h>
# include <iostream.h>
# define L(a,b,c) (a+b+c)/2
# define AREA(a,b,c) sqrt(L(a,b,c)*( L(a,b,c)-a)*( L(a,b,c)-b)*( L(a,b,c)-c))
# define PREIMETER(a,b,c) a+b+c
void main(void)
{ float a,b,c;
cout<<"Input a,b,c:";
cin>>a>>b>>c;
# ifdef DEBUG
cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"c="<<c<<'\t'<<endl;
#endif
cout<<"Area="<<AREA(a,b,c)<<endl;;
cout<<"Preimete="<<PREIMETER(a,b,c)<<endl;
}
习题7
7.1什么叫指针?什么叫指针变量?有哪些类型的指针?
答:
指针是变量、数组、字符串、函数等在内存的首地址,指针变量是存放指针的变量。指针变量按定义格式大致可分为五种:指针变量、指针数组、指向一维数组的指针变量、返回指针值的函数、函数指针变量。
7.2 指针变量按定义格式分为哪5类?,每类指针变量如何定义?
答:
指针变量按定义格式大致可分为五种:指针变量、指针数组、指向一维数组的指针变量、返回指针值的函数、函数指针变量。
指针变量:〔存储类型〕 <类型> *<指针变量名>
指针数组:〔存储类型〕 <类型> *<指针变量名>[长度]
指向一维数组的指针变量:〔存储类型〕 (<类型> *)<指针变量名>[长度]
返回指针值的函数:〔存储类型〕 <类型> *<指针变量名>(形参表)
函数指针变量:〔存储类型〕 <类型> (*<指针变量名>)(形参表) ;
7.3 定义一个整型指针变量pi,用什么方法,才能使pi指向整型变量i,指向整型一维数组a的首地址,指向整型二维数组b的首地址。
答:
pi指向整型变量i: pi=&i;
指向整型一维数组a的首地址:pi=a;
指向整型二维数组b的首地址:pi=&b[0][0];
7.4 叙述二维数组a的行地址、行首地址、元素地址的概念、作用及表示方法,写出元素a[i][j]值的表示方法。
答:
(1)二维数组a的第i行首地址是第i行第0列元素地址&a[i][0]。
有三种表示方式:&a[i][0]、a[i]、*(a+i)、&a[i][0]。
(2)二维数组a的第i行的行地址是用于指向一维数组指针变量的地址。
有二种表示方式:a+i、&a[i]
(3)二维数组a的元素a[i][j]的地址为该元素在内存中的地址,
有四种表示方式:a[i]+j 、*(a+i)+j、&a[i][0]+j、&a[i][j]
(4)元素a[i][j]的值的表示方式:*(a[i]+j) 、 *(*(a+i)+j)、*(&a[i][0]+j)、a[i][j]
7.5 引用类型变量与其相关变量有何关系?引用类型变量主要用于什么场合?
答:
引用类型变量是其相关变量的别名,引用类型变量与相关变量使用相同的内存空间,所以用引用类型变量作为函数形参时,形参与实参变量使用相同的内存,在函数内对形参的运算就是对实参的运算,因此可通过参数返回函数运算结果。所以引用类型变量主要用于函数的形参,用于函数之间传送数据。
7.6 对字符串指针变量,能否用cin、cout对其输入/输出字符串?能否对字符串指针变量进行赋值运算?字符串指针变量能否作为字符串处理函数的参数?
答:
对字符串指针变量,能用cout对其输出字符串,但不能用cin对其输入字符串;
能对字符串指针变量进行赋值运算;
字符串指针变量能作为字符串处理函数的参数。
7.7 读下列程序,并写出程序运行结果。
(1)
# include <iostream.h>
void main (void)
{ float x=1.5,y=2.5,z;
float *px,*py;
px=&x;
py=&y;
z= * px + *py;
cout<<"x="<<*px<<'\t'<<"y="<<*py<<"z="<<z<<'\n';
}
解:
x=1.5 y=2.5 z=4.0
(2)
# include <iostream.h>
void main( void)
{ int a[5]={10,20,30,40,50};
int *p=&a[0]; //p指向a[0]
p++; //p指向a[1]
cout<< *p<<'\t'; //输出a[1]=20
p+=3; //p指向a[4]
cout<< *p<<'\t'; //输出a[4]=50
cout<< *p――<<'\t'; //先输出a[4]=50,后p指向a[3]
cout<<++ *p<<'\n'; //先对a[3]内容加1,后输出a[3]=41
}
解:
20 50 50 41
(3)# include<iostream.h>
void f(int *a,int b)
{ int t=*a;*a=b;b=t;}
void main(void)
{ int x=10,y=20;
cout<<x<<’\t’<<y<<’\n’;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -