📄 c++.txt
字号:
for (i=0;i<M-2;i++)
{ k=i;
for(j=i+1;j<M-1;j++)
if (s[k][4]<s[j][4]) k=j;
if (k!=i)
for (j=0;j<N;j++)
{ temp=s[i][j];s[i][j]=s[k][j];s[k][j]=temp;}
}
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)<<s[i][j];
cout<<endl;
}
cout<<"------------------------------\n";
}
4.20
设A为m行n列矩阵,B为n行k列矩阵,C为m行k列矩阵。设计矩阵乘法程序,能完成C=A*B的操作。m、n与k用define定义为常量,其值由用户自定义。
解:
#include <iostream>
#include <iomanip.h>
#define M 2
#define N 3
#define P 4
void main(void)
{ int a[M][N],b[N][P],c[M][P],i,j,k;
cout<<"Input a["<<M<<"]["<<N<<"]:"<<endl;
for (i=0;i<M;i++)
for (j=0;j<N;j++)
cin>>a[i][j];
cout<<"Input b["<<N<<"]["<<P<<"]:"<<endl;
for (i=0;i<N;i++)
for (j=0;j<P;j++)
cin>>b[i][j];
for (i=0;i<M;i++)
for (j=0;j<P;j++)
{ c[i][j]=0;
for (k=0;k<N;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
for (i=0;i<M;i++)
{ for (j=0;j<P;j++)
cout<<setw(4)<<c[i][j];
cout<<endl;
}
}
习题5
5.1 什么是函数?函数是如何分类的?
答:
函数是实现特定功能的相对独立的程序段。
函数分成:标准库函数和用户自定义函数,主调函数和被调函数,无参函数和有参函数。库函数可以直接使用,而用户自定义函数通常是先定义,然后使用。
5.2 自定义函数如何定义?有哪三种调用方式?
答:
自义函数定义一般格式为:
〔类型〕 <函数名>(<形式参数表>)
{<语句序列> }
自定义函数三种调用形式为:函数调用语句、函数表达式、函数参数。
5.3 在函数的调用过程中,实参传送给形参有哪两种方式?这两种传送方式有什么区别?
答:
在函数的调用过程中,实参传送给形参有值传送与传地址两种形式。
“值传送”方式:调用函数时,系统给形参分配存储单元,使用形参与实占用不同的内存空间,形参值的改变不影响实参,实参保持原来的值。
“传地址”方式:调用函数时,系统将实参地址传递给形参,实与形参占用相同的内存空间。形参的变化会影响实参的变化,使形参与实参具有相同的值。
5.4 什么情况下必须使用函数的原型说明?在函数的原型说明的形参表中,形参名是否是必须的?为什么?
答:
在C++程序中,当函数调用在前、函数定义在后时,则应在主调函数中,在调用前增加对被调函数的原型说明。因为在函数的原型说明的形参表中,只须说明形参的类型与个数,所以形参名不是必须的。
5.5 什么是递归?递归方法解决问题时,必须分析清楚哪三个问题?
答:
函数的递归调用指的是在一个函数定义的函数体中又出现直接或间接地调用该函数本身。
利用递归方法解决问题时,必须注意三点:递归的公式、递归的结束条件、递归的限制条件。
5.6 什么是作用域?在C++中,作用域分成哪5类?在前4类作用域中,变量有效作用区域是什么?
答:
作用域是变量在程序中可引用的区域。在C++中,作用域共分成五种:块作用域、文件作用域、函数原型作用域、函数作用域和类作用域。
1.块作用域:从块内变量定义处到块的结束处
2.文件作用域:从函数外变量定义开始到文件结束(可用extern进行扩展);
3.函数原型作用域:从函数原型变量定义开始到函数原型说明结束;
4.函数作用域:从函数开始到函数结束;
5.7
什么是局部变量与全局变量?局部变量与全局变量的作用域是什么?什么是静态变量与动态变量?静态变量与动态变量分别存放在什么存储区?静态变量与动态变量各自生存期是什么?
答:
在一个函数内部定义的变量或在一个块内定义的变量称为局部变量。局部变量都具有块作用域。在函数外定义的变量称为全局变量。全局变量具有文件作用域。
在程序的执行过程中,为其分配存储空间的变量称为动态变量,存储在内存中的动态存储区,生存期为从变量定义开始到作用域结束。
在程序开始执行时系统就为变量分配存储空间,直到程序执行结束时,才收回为变量分配的存储空间,这种变量称为静态变量,存储在内存中的静态存储区,生存期为程序执行的全过程。
5.8 变量的存储类型有哪四种?按存储类型,变量可分为哪五种?叙述每类存储变量的存储特性。
答:
变量的存储类型分为四种:自动类型(auto)、静态类型(static)、寄存器类型(register)、外部类型(extern)。按存储类型,变量可分为自动变量、寄存器变量、局部静态变量、全局静态变量、外部变量。各类变量的存储特性如下:
变量类型全局、局部变量作用域静、动态变量存储区
自动变量局部变量块作用域动态变量动态存储区
寄存器变量局部变量块作用域动态变量CPU寄存器
局部静态变量局部变量块作用域 静态变量 静态存储区
全局静态变量全局变量文件作用域静态变量静态存储区
外部变量全局变量文件作用域静态变量静态存储区
5.9 如何定义内联函数?使用内联函数的实质与目的是什么?
答:
在类型前加关键字inline定义的函数称为所谓内联函数,定义格式为:
inline <类型> <函数名>(<形式参数表>)
{函数体}
内联函数的实质就是在编译时把函数的函数体直接插入到调用处。其目的是降低系统的开销,提高程序的执行效率。
5.10 什么是函数的重载?调用重载函数时,通过什么来区分不同的重载函数?
函数的重载是指用重名函数完成不同功能的函数运算。调用重载函数时,通过重载函数形参(参数个数不同或者数据类型不同)来区分不同的重载函数。
5.11 写出下列程序的运行结果:
#include <iostream.h>
void modify(int x,int y)
{ cout<<"x="<<x<<'\t'<<"y="<<y<<endl;
x=x+3; y=y+4;
cout<<"x="<<x<<'\t'<<"y="<<y<<endl;
}
void main(void)
{ int a,b;
a=1;b=2;
cout<<"a="<<a<<'\t'<<"b="<<b<<endl;
modify(a,b);
cout<<"a="<<a<<'\t'<<"b="<<b<<endl;
}
解:
运行结果:
a=1 b=2
x=1 y=2
x=4 y=6
a=1 b=2
5.12 写出下列程序运行后的输出图形:
#include <iostream.h>
void main(void)
{ int i=4,j;
void printchar(int,char);
printchar(25,' ');
j=i;
printchar(i+2*j-2,'*');
cout<<endl;
for (j=2;j>=0;j--)
{ printchar(28-j,' ');
printchar(i+2*j,'*');
cout<<endl;
}
}
void printchar(int len,char c)
{ int k;
for (k=1;k<=len;k++)
cout<<c;
}
解:
**********
********
******
****
5.13 写出下列递归程序的递归公式、限制条件、结束条件及运行结果:
#include <iostream.h>
int fac(int n)
{ int z;
if (n>0)
z=n*fac(n-2);
else
z=1;
return z;
}
void main(void)
{ int x=7,y;
y=fac(x);
cout<<y<<endl;
}
解:
递归公式: fac(n)=1; 当n=0,n=1;
fac(n)=n*fac(n-2); 当n>0
限制条件: n>=0
结束条件: n=0
运行结果: 105
5.14 写出下列以数组为参数的函数调用运行结果:
#include <iostream.h>
#include <string.h>
void main(void)
{ char a[]="abcdef";
int n;
void fun(char s[],int k);
n=strlen(a);
fun(a,n);
cout<<a<<endl;
}
void fun(char s[],int k)
{ int x,y;
char c;
x=0;
for (y=k-1;x<y;y--)
{ c=s[y]; s[y]=s[x]; s[x]=c;
x++;
}
}
解:
运行结果: fedcba
5.15 指出下列程序各函数中的全局变量与局部变量,静态变量与动态变量,各变量的存储类型、作用域与生存期,并写出下列程序的运行结果:
#include <iostream.h>
extern int x;
void change(void)
{ register int y=0,z=3;
cout<<x<<'\t'<<y<<’\t'<<z<<endl;
x=2;y=2;
cout<<x<<'\t'<<y<<’\t'<<z<<endl;
}
int x=3,y=4;
void main(void)
{ auto int x,z= -3;
x=1;
cout<<x<<'\t'<<y<<’\t'<<z<<endl;
change();
cout<<x<<'\t'<<y<<’\t'<<z<<endl;
cout<<::x<<'\t'<<::y<<’\t'<<z<<endl;
}
解:
1 4 -3
3 0 3
2 2 3
1 4 -3
2 4 -3
5.16 指出下列各函数中各变量的存储类型、作用域与生存期,写出下列程序的运行结果:
#include <iostream.h>
void main(void)
{ int i;
void add1(void),add2(void);
for (i=0;i<3;i++)
{ add1();
add2();
cout<<endl;
}
}
void add1(void)
{ int x=0;
x++;
cout<<x<<'\t';
}
void add2(void)
{ static int x=0;
x++;
cout<<x<<'\t';
}
解:
1 1
1 2
1 3
5.17 指出下列各文件中变量的存储类型、作用域与生存期,写出下列程序的运行结果:
//文件名:exercise5_17.cpp
#include <iostream.h>
int x=1,y=2;
static int z=3;
extern void add(void);
void main(void)
{ add();
cout<<"x="<<x<<'\t'<<"y="<<y <<'\t'<<"z="<<z<<endl;
}
//文件名:exercise5_171.cpp
#include <iostream.h>
extern int x,y;
void add(void)
{ x+=3;
y+=4;
cout<<"x="<<x<<'\t'<<"y="<<y<<endl;
}
在第二个文件中能否将第一个文件中的变量z定义为外部变量?
解:
x=4 y=6
x=4 y=6 z=3
在第二个文件中可以将第一个文件中的变量z定义为外部变量。
5.18编写一个函数把华氏温度转换成摄氏温度,温度转换公式为:c=(f-32)*5/9。在主函数中输入华氏温度值,转换后输出相应的摄氏温度值。
解:
#include <iostream.h>
float fc(float f)
{ float c;
c=(f-32)*5/9;
return c;
}
void main(void)
{ float c,f;
cout<<"请输入华氏温度值:";
cin>>f;
c=fc(f);
cout<<"摄氏温度值:"<<c<<endl;
}
程序运行后
请输入华氏温度值: 41
摄氏温度值:5
5.19编写一个函数判断一个整数是否为素数。在主函数中输入一个整数,输出该整数是否为素数的信息。(提示:参考例3.24)
解:
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
int prime(int a)
{ int k,i;
k=sqrt(a);
for (i=2;i<=k;i++) //判断a是否是素数
if (a%i==0)
break;
if (i>k) //若i>k,则i为素数
return 1;
else
return 0;
}
void main(void)
{ int a,b;
cout<<"请输入一个整数:";
cin>>a;
b=prime(a);
if (b==1)
cout<<a<<"是素数!"<<endl;
else
cout<<a<<"不是素数!"<<endl;
}
运行程序后
请输入输入一个整数: 7
7是素数
5.20编写一个函数power(float x,int n),用于计算x的n次幂。在主函数中实现输入输出。
解:
#include <iostream.h>
# include <math.h>
float power(float x,int n)
{ float y=1;
int i;
for(i=1;i<=n;i++)
y=y*x;
return y;
}
void main(void)
{ float x,y;
int n;
cout<<"请输入自变量x与指数n:";
cin>>x>>n;
y=power(x,n);
cout<<"幂函数值:"<<y<<endl;
}
运行程序后
请输入自变量x与指数n:2 3
幂函数值:8
5.21编写一个计算1至n的平方和的函数,并调用此函数计算:
( )+ 解:
#include <iostream.h>
#include <math.h>
long square_sum(int n)
{ long sum=0;
int i;
for(i=1;i<=n;i++)
sum=sum+i*i;
return sum;
}
void main(void)
{ long s;
s=square_sum(12)+square_sum(15)*square_sum(15);
cout<<"S="<<s<<endl;
}
程序运行后输出:
S=1538250
5.22编写两个函数,分别求两个整数m、n的最大公约数和最小公倍数。在主函数中输入两个整数,分别调用这两个函数求得结果并输出。求两个整数m、n的最大公约数和最小公倍数的算法提示如下:
(1)将m、n中的最大数赋给变量a,最小数赋给变量b。
(2)用大数a除以小数b,若余数c为0,则余数c为最大公约数,否则进行(3)。
(3)将小数b赋给a,余数c赋给b,再进行(2),直到余数等于0为止。
(4)最小公倍数=(m*n)/最大公约数。
例如:求20与14的最大公约数方法:20%14=6,14%6=2,6%2=0,则2为20与14的最大公约数。最小公倍数=20*14/2=140。
解:
# include <iostream.h>
int gcd(int m,int n)
{ int r;
while (m%n!=0)
{ r=m%n;
m=n;
n=r;
}
return n;
}
int lcm(int m,int n)
{ int lcm;
lcm=m*n;
lcm=lcm/gcd(m,n);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -