《c++》编程题试卷
第三章
1.编写一个求方程ax2 + bx + c = 0的根 的程序,用3个函数分别求当b2-4ac大于零、等于零、和小于零时的方程的根。要求从主函数输入a,b,c的值并输出结果。
#include < iostream.h >
#include < math.h >
void equation_1 (int a, int b, int c)
{
double x1, x2, temp;
temp = b*b - 4 * a * c;
x1 = (-b + sqrt(temp) ) / (2 * a * 1.0);
x2 = (-b - sqrt(temp) ) / (2 * a * 1.0);
cout<<"两个不相等的实根"<< endl;
cout<<"x1 = "<< x1<<", x2 = "<< x2<< endl;
}
void equation_2 (int a, int b, int c)
{
double x1, x2, temp;
temp = b*b - 4 * a * c;
x1 = (-b + sqrt(temp) ) / (2 * a * 1.0);
x2 = x1;
cout<<"两个相等的实根"<< endl;
cout<<"x1 = "<< x1<<", x2 = "<< x2<< endl;
}
void equation_3 (int a, int b, int c)
{
double temp, real1, real2, image1, image2;
temp = - (b*b - 4 * a * c);
real1 = -b / (2 * a *1.0);
real2 = real1;
image1 = sqrt(temp);
image2 = - image1;
cout<<"两个虚根"<< endl;
cout<<"x1 = "<< real1<<" + "<< image1<<"j"<< endl;
cout<<"x2 = "<< real2<<" + "<< image2<<"j"<< endl;
}
void main()
{
int a, b, c;
double temp;
cout<<"输入a,b,c的值"<< endl;
cin>>a>>b>>c;
cout<<"方程为:"<< a<<"x*x+"<< b<<"x+"<< c<<" = 0"<< endl;
temp = b*b - 4 * a * c;
if(temp > 0)
equation_1 (a, b, c);
if(temp == 0)
equation_2 (a, b, c);
if(temp < 0)
equation_3 (a, b, c);
}
2.定义函数up(ch),如字符变量ch是小写字母就转换成大写字母并通过up返回,否则字符ch不改变。要求在短小而完全的程序中显示这个程序是怎样被调用的。
#include < iostream >
using namespace std;
char up (char c)
{
if(c >= 97 && c <= 122)
return (c - 32) ;
else
return c;
}
void main()
{
int i;
char c[15] = {'A','v','e','t','E','T','%','&','4','Y','e','i','@','9','^'};
for(i = 0 ; i < 15 ; i++)
cout<< up(c[i])<<", ";
cout<< endl;
}
3.编写主程序条用带实数r和整数n两个参数的函数并输出r的n次幂。
#include < iostream.h >
#include < math.h >
double power(double a, int b)
{
int i;
double result = 1.0;
for(i=0;i< b;i++)
result = result * a;
return result;
}
void main()
{
double r;
int n;
cout<<"r = ";
cin>>r;
cout<<"n = ";
cin>>n;
cout<< r<<"的"<< n<<"次幂是:"<< power(r,n)<< endl;}
4.编写有字符型参数C和整形参数N的函数,让他们显示出由字符C组成的三角形。其方式为第1行有1个字符C,第2行有2个字符C ,等等。
#include < iostream >
using namespace std;
void print_triangle(char c, int n)
{
int i, j;
for(i=0; i< n; i++)
{
for(j=0; j<=i; j++)
{
cout<< c;
}
cout<< endl;
}
}
void main()
{
print_triangle('a',10);
}
5.编写一个ieqiu字符串长度的函数,strlen(),再用strlen()函数编写一个函数revers(s)的倒序递归程序,使字符串s逆序。
#include < iostream >
#include < string >
using namespace std;
int strlen(char *str)
{
int len = 0;
while(str[len] != '\0')
{
len++;
}
return len;
}
void revers(char *b)
{
char c;
int j, len;
len=strlen(b);
j=len/2-1;
while(j>=0)
{
c=*(b+j);
*(b+j)=*(b+len-j-1);
*(b+len-j-1)=c;
j--;
}
b[len]='\0';
}
void main()
{
char str[]={"1234567890"};
cout<< str<<"----的长度:"<< strlen(str)<< endl;
cout<< str<< endl;//倒序前
revers(str);//
cout<< str<< endl;//倒序后
}
6.用函数模板实现3个数值中按最小值到最大值排序的程序。
#include < iostream >
using namespace std;
template
void sort(T a, T b, T c)
{
T array[3],temp;
int i,j;
array[0] = a;
array[1] = b;
array[2] = c;
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
if(array[j]>array[j+1])
{
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
cout<< array[0]<< array[1]<< array[2]<< endl;
}
void main()
{
sort(5,1,9);
}
7.利用函数模板设计一个求数组元素中和的函数,并检验之。
#include < iostream >
using namespace std;
template
T sum (T a[],int n)
{
int i;
T s=0;
for(i=0;i< n;i++)
s = s + a[i];
return s;
}
void main ()
{
int a[5]={1,2,3,4,5};
int s = sum(a,5);
cout<< s<< endl;
}
8.重载上题中的函数模板,使他能够进行两个数组的求和。
#include < iostream >
using namespace std;
template
T sum (T a[], int n)
{
int i;
T s=0;
for(i=0;i< n;i++)
s = s + a[i];
return s;
}
template //重载上面的模板
T sum (T a[], int n, T b[], int m)
{
return sum(a,n)+sum(b,m);
}
void main ()
{
int a[5]={1,2,3,4,5};
int b[10]={1,2,3,4,5,6,7,8,9,10};
int s1 = sum(a, 5);
int s2 = sum(b, 10);
int s3= sum(a, 5, b, 10);
cout<< s1<< endl;
cout<< s2<< endl;
cout<< s3<< endl;
}
第四章
1.设计一个点类Point,再设计一个矩形类,矩形类使用Point类的两个坐标点作为矩形的对角顶点。并可以输出4个坐标值和面积。使用测试程序验证程序。
#include
using namespace std;
class Point //点类
{
private:
int x, y;//私有成员变量,坐标
public :
Point()//无参数的构造方法,对xy初始化
{
x = 0;
y = 0;
}
Point(int a, int b) {
x = a;
y = b;
}
void setXY(int a, int b) {
x = a;
y = b;
}
int getX()//得到x的方法
{
return x;
}
int getY()//得到有的函数
{
return y;
}
};
class Rectangle //矩形类
{
private:
Point point1, point2, point3, point4;
public :
Rectangle();//类Point的无参构造函数已经对每个对象做初始化啦,这里不用对每个点多初始化了
Rectangle(Point one, Point two)
{
point1 = one;
point4 = two;
init();
}
Rectangle(int x1, int y1, int x2, int y2)
{
point1.setXY(x1, y1);
point4.setXY(x2, y2);
init();
}
void init()//给另外两个点做初始化的函数
{
point2.setXY(point4.getX(), point1.getY() );
point3.setXY(point1.getX(), point4.getY() );
}
void printPoint()//打印四个点的函数
{
cout<<"A:("<< point1.getX() <<","<< point1.getY() <<")"<< endl;
cout<<"B:("<< point2.getX() <<","<< point2.getY() <<")"<< endl;
cout<<"C:("<< point3.getX() <<","<< point3.getY() <<")"<< endl;
cout<<"D:("<< point4.getX() <<","<< point4.getY() <<")"<< endl;
}
int getArea()//计算面积的函数
{
int height, width, area;
height = point1.getY() - point3.getY();
width = point1.getX() - point2.getX();
area = height * width;
if(area > 0)
return area;
else
return -area;
}
};
void main()
{
Point p1(-15, 56), p2(89, -10);//定义两个点
Rectangle r1(p1, p2);//用两个点做参数,声明一个矩形对象r1
Rectangle r2(1, 5, 5, 1);//用两队左边,声明一个矩形对象r2
cout<<"矩形r1的4个定点坐标:"<< endl;
r1.printPoint();
cout<<"矩形r1的面积:"<< r1.getArea() << endl;
cout<<"\n矩形r2的4个定点坐标:"<< endl;
r2.printPoint();
cout<<"矩形r2的面积:"<< r2.getArea() << endl;
}
2.使用内联函数设计一个类,用来表示直角坐标系中的任意一条直线并输出它的属性。
#include < iostream.h >
#include < math.h >
class Line
{
private:
int x1, y1, x2, y2;
public :
Line();
Line(int =0, int =0, int =0, int=0 );
void printPoint();
double getLength();
};
inline Line::Line(int a, int b, int c, int d)
{
x1 = a;
y1 = b;
x2 = c;
y2 = d;
}
inline void Line::printPoint()
{
cout<<"A:"<< x1 <<", "<< y1 << endl;
cout<<"B:"<< x2 <<", "<< y2 << endl;
}
inline double Line::getLength()
{
double length;
length = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) );
return length;
}
void main()
{
Line line(10,80,-10,12);
line.printPoint();
cout<< line.getLength() << endl;
}
第五章
1.声明复数的类,complex,使用友元函数add实现复数加法。
#include < iostream >
using namespace std;
class Complex
{
private:
double real, image;
public :
Complex(){}
Complex(double a,double b)
{
real = a;
image = b;
}
void setRI(double a, double b)
{
real = a;
image = b;
}
double getReal()
{ return real;
}
double getImage()
{ return image;
}
void print(){
if(image>0)
cout<<"复数:"<< real <<" + "<< image <<"i"<< endl;
if(image<0)
cout<<"复数:"<< real <<" - "<< image <<"i"<< endl;
}
friend Complex add(Complex ,Complex);//声明友元函数
};
Complex add(Complex c1, Complex c2)//定义友元函数
{
Complex c3;
c3.real = c1.real + c2.real;//访问Complex类中的私有成员
c3.image = c1.image + c2.image;
return c3;
}
void main()
{
Complex c1(19, 0.864), c2, c3;
c2.setRI(90,125.012);
c3 = add(c1, c2);
cout<<"复数一:";c1.print();
cout<<"复数二:";c2.print();
cout<<"相加后:";c3.print();
}
3.编写一个程序,该程序建立一个动态数组,为动态数组的元素赋值,显示动态数组的值并删除动态数组。
#include < iostream >
using namespace std;
void main()
{
int i, n, temp=0;
cout<<"输入数组大小:";
cin>>n;
double *array = new double[n]; //用指针,动态申请数组大小
cout<<"给每个数组元素赋值:"<< endl;
for(i=0; i < n; i++)
{
cout<<"array["<< i <<"] = ";
cin>>temp;
*(array+i) = temp;//给数组元素赋值
}
cout<<"动态数组个元素的值如下:"<< endl;
for(i=0; i < n; i++)
{
cout<<"array["<< i <<"] = "<< array[i] << endl;//打印数组元素
}
delete [] array;//释放内存
}
4.定义一个Dog类,它用静态数据成员Dogs记录Dog的个体数目,静态成员函数GetDogs用来存取Dogs。设计并测试这个类。
#include < iostream >
using namespace std;
class Dog
{
private:
static int dogs;//静态数据成员,记录Dog的个体数目
public :
Dog(){}
void setDogs(int a)
{dogs = a;
}
static int getDogs(){
return dogs;
}
};
int Dog :: dogs = 25;//初始化静态数据成员
void main()
{
cout<<"未定义Dog类对象之前:x = "<< Dog::getDogs() << endl;; //x在产生对象之前即存在,输出25
Dog a, b;
cout<<"a中x:"<< a.getDogs() << endl;
cout<<"b中x:"<< b.getDogs() << endl;
a.setDogs(360);
cout<<"给对象a中的x设置值后:"<< endl;
cout<<"a中x:"<< a.getDogs() << endl;
cout<<"b中x:"<< b.getDogs() << endl;
}
第六章
1.设计一个基类,从基类派生圆柱,设计成员函数输出它们的面积和体积;
#include < iostream >
using namespace std;
class Basic//基类
{
protected:
double r;
public :
Basic(){ r = 0; }
Basic(double a):r(a){}
};
class Circular : public Basic//从基类派生圆类
{
protected:
double area;
public :
Circular(double a)
{
r = a;
area = area = 3.1415926 * r * r;
}
double getArea()//返回圆面积
{
return area;
}
};
class Column : public Circular//从圆类派生圆柱类
{
protected:
double h;
double cubage;
public :
Column(double a, double b) : Circular(a){
h = b;
cubage = getArea() * h;
}
double getCubage()//返回圆柱体积函数{
return cubage;
}
};
void main()
{
Circular circular(45);
Column column(12, 10);
cout<<"圆的面积:"<< circular.getArea() << endl;
cout<<"圆柱的体积:"<< column.getCubage() << endl;
}
3.定义一个线段类作为矩形的基类,基类有起点和终点坐标,有输出左边和长度以及线段和x轴的夹角的成员函数。矩线段对象的两个坐标作为自己一条边的位置,它具有另外一条边,能输出矩形的4个顶点坐标。给出类的定义并用程序验证它们的功能。
#include < iostream >
#include < cmath >
using namespace std;
class Point//点类
{
protected:
double x, y;
public :
Point(){}
Point(double a, double b)
{
x = a; y = b;
}
double getX()
{return x;}
double getY()
{return y;}
};
class Line
{
protected:
Point p1, p2;//Point对象做成员
double length, angle;
public:
Line(double a, double b, double c, double d):p1(a, b), p2(c, d)//用两对坐标初始化线段
{
init();
}
Line(Point a, Point b)//用两个点的对象初始化线段
{
p1 = a; p2 = b;
init();
}
void init()//计算线段长度,以及和x轴的夹角的度数
{
double x1 = p1.getX(), y1 = p1.getY();
double x2 = p2.getX(), y2 = p2.getY();
length = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
angle = atan( (y2-y1) / (x2-x1) );
angle = angle *180/3.141592653;
}
void printXY()
{
cout<<"("<< p1.getX() <<","<< p1.getY() <<"); ("<< p2.getX() <<","<< p2.getY() <<")"<< endl;
}
void printLength()
{
cout<<"线段长度:"<< length << endl;
}
void printAngle()
{
cout<<"与x轴的夹角:"<< angle <<"°"<< endl;
}
};
class Rectangle : public Line
{
protected:
Line *line;
public:
Rectangle(double a, double b, double c, double d, double e, double f, double g, double h):Line(a,b,c,d)
{
line = new Line(e,f,g,h);
}
Rectangle(Point a, Point b, Point c, Point d) : Line(a, b)//4个点对象,初始化
{
line = new Line(c, d);
}
void printPoint()
{ cout<<"矩形4个顶点:\n";
printXY();
line->printXY();
}
};
void main()
{
Point p1(0, 0), p2(4, 3), p3(12, 89), p4(10, -50);
Line l1(0,0,4,3);
l1.printXY();
l1.printLength();
l1.printAngle();
Line l2(p1, p2);
l2.printXY();
l2.printLength();
l2.printAngle();
Rectangle r1(12,45,89,10,10,23,56,1);
r1.printPoint();
Rectangle r2(p1, p2, p3, p4);
r2.printPoint();
}
4.基类是使用极坐标的点类,从它派生一个圆类,圆类用点类的左边作圆心,圆周通过极坐标原点,圆类有输出圆心直、圆半径和面积的成员函数。完成类的设计并验证之。
#include < iostream >
#include < cmath >
using namespace std;
class Point//点类
{
protected: int x, y;
public : Point(){}
};
class Circular : public Point//圆类,继承点类
{
protected:
double r, area;
public :
Circular(int a, int b)
{
x = a;
y = b;
r = sqrt( x * x + y * y );
area = 3.1415926 * r * r;
}
void printPoint()
{
cout<<"圆形直角坐标:("<< x <<", "<< y <<")"<< endl;
}
void printRadius()
{ cout<<"圆的半径:"<< r << endl;
}
void printArea(){
cout<<"圆的面积:"<< area << endl;
}
};
void main()
{
Circular c(10,25);
c.printPoint();
c.printRadius();
c.printArea();
}
5.设计一个线段基类,当创建五参数对象时,才要求用户输入长度。同样,其派生的直角三角形类也是在产生对象时要求输入两个直角边的长度。直角三角形在派生矩形类,矩形类的参数也由键盘输入。设计这些类并测试他们的功能。
#include < iostream >
#include < cmath >
using namespace std;
class Line//线段基类
{
protected:
double sizeA;
public :
Line()
{
cout<<"输入线段的长度:"<< endl;
cin>>sizeA;
}
Line(double a)
{
sizeA = a;
}
double getLength()
{
return sizeA;
}
};
class Triangle : public Line//三角形类
{
protected: double sizeB, sizeC;
public : Triangle()
{
cout<<"输入线段长度:"<< endl;
cin>>sizeB;
sizeC = sqrt( sizeB * sizeB + sizeA * sizeA );
}
void printSize()
{ cout<<"直角三角形,三条边分别为:";
cout<<"A: "<< sizeA << ", b: "<< sizeB << ", C: "<< sizeC << endl;
}
};
class Rectangle : public Triangle//矩形类
{
protected:
double sizeD;
public :
Rectangle()
{
sizeC = sizeA;
sizeD = sizeB;
}
void printSize()
{
cout<<"矩形,四条边分别为:";
cout<<"A: "<< sizeA << ", b: "<< sizeB << ", C: "<< sizeC << ", D: "<< sizeD << endl;
}
};
void main()
{
/* Line *l = new Line();
cout<<"线段长度为:"<< l->getLength() << endl;
*/
/*Triangle *t = new Triangle();
t->printSize();*/
Rectangle *r = new Rectangle();
r->printSize();
}
第七章
1.使用类模板演示复制兼容性规则。
#include < iostream>
using namespace std;
template
class Point
{
protected:
T x, y;
public :
Point(T a, T b)
{
x = a;
y = b;
}
void show()
{
cout<<"x = "<< x <<", y = "<< y << endl;
}
};
template
class Rectangle : public Point
{
private:
T h, w;
public :
Rectangle(T a, T b, T c, T d) : Point(a, b)
{h = c;
w = d;
}
void show(){
cout<<"x = "<< x <<", y = "<< y <<"; h = "<< h <<", w = "<< w << endl;
}
};
void main()
{
Point a(3, 4);
Rectangle b(5.1, 6.2, 7.3, 8.4);
a.show();
b.show();
Point & ra = b;//子类对象 初始化父类的引用
ra.show();
Point * p = &b;//子类对象的地址,赋给指向父类的指针
p->show();
Rectangle * pb = &b;//子类指针pb
pb->show();
a = b; //派生类对象的属性值,更新父类对象的属性值
a.show();
}
2.设计一个点的类模板,分别使用继承、包含的方法设计线段类模板,要求演示构造函数和复制构造函数的设计方法,并用主程序验证之。
#include < iostream>
using namespace std;
template class Point
{
public :
T x, y;
Point(T a=0, T b=0)
{
x = a;
y = b;
}
void show()
{
cout<<"x = "<< x <<", y = "<< y << endl;
}
};
template class Line_1 : public Point // 继承Point类模板, 的线段类模板
{
protected:
T x1, y1;
public :
Line_1(T a, T b, T c, T d) : Point(a, b)
{
x1 = c;
y1 = d;
}
Line_1(const Line_1 & );//复制构造函数
void show()
{
cout<<"("<< x <<", "<< y <<"); ("<< x1 <<", "<< y1 <<")"<< endl;
}
};
template Line_1 :: Line_1(const Line_1 & t) : Point(t.x, t.y)
{
x1 = t.x1;
y1 = t.y1;
}
template class Line_2 //包含point类模板,的线段类
{
protected:
Point p1, p2;
public :
Line_2(T a, T b, T c, T d)
{
p1.x = a;
p1.y = b;
p2.x = c;
p2.y = d;
}
Line_2(const Line_2 &);//复制构造函数
void show()
{
cout<<"("<< p1.x <<", "<< p1.y <<"); ("<< p2.x <<", "<< p2.y <<")"<< endl;
}
};
template Line_2 :: Line_2(const Line_2 & t)
{
p1 = t.p1;
p2 = t.p2;
}
void main()
{
Line_1 L1(1,2,3,4);
cout<<"L1 : ";L1.show();
Line_1 L2(L1); //用现有的对象,初始化新对象
cout<<"L2 : ";L2.show();
Line_2 J1(5,6,7,8);
cout<<"J1 : ";J1.show();
Line_2 J2(J1);
cout<<"J2 : ";J2.show();
}
3.已知有一个整型数组a,其内容为1 3 5 7 9 2 4 6 8 10.先对数组进行升序排列,再使用它产生向量b,然后再在向量的尾部追加11,并按降序排列输出向量的内容和capacity()的内容。
#include < iostream >
#include < vector >
#include < algorithm >
using namespace std;
void main()
{
int a[] = {1,3,5,7,9,2,4,6,8,10};
sort(a, a+10);//先对数组进行升序排序
copy(a, a+10, ostream_iterator(cout," "));
cout<< endl;
vector pa(a, a+10); //再声明向量
pa.push_back(11);//向量尾部追加11
reverse_copy(pa.begin(), pa.end(), ostream_iterator(cout," "));//按降序输出向量的内容
cout<<"\ncapacity : "<< pa.capacity() << endl;//输出capacity()的内容
}
第九章
1.利用流格式控制,进行成绩和名字的输出,要求名字左对齐,分数右对齐。
#include < iostream >
#include < string >
using namespace std;
class Student
{
private :
string name;
float score;
public :
Student(){}
Student(string n, float s)
{
name = n;
score = s;
}
string getName()
{
return name;
}
float getScore()
{
return score;
}
};
void main()
{
Student s1("liming", 98);
Student s2("sdfh", 90);
Student s3("vn.fy", 80);
Student s4("cnbtrt", 70);
Student s5("ryuety", 48);
cout.width(15); cout<< left <<"姓名"<< right <<"分数"<< endl;
cout.width(15); cout<< left << s1.getName() << right << s1.getScore() << endl;
cout.width(15); cout<< left << s2.getName() << right << s2.getScore() << endl;
cout.width(15); cout<< left << s3.getName() << right << s3.getScore() << endl;
cout.width(15); cout<< left << s4.getName() << right << s4.getScore() << endl;
cout.width(15); cout<< left << s5.getName() << right << s5.getScore() << endl;
}
2.编写一个产生文本文件的程序。
#include < iostream>
#include < fstream >
using namespace std;
void main()
{
char *p = {"C++程序设计"};
ofstream myFile("Worl9_5_2.txt");
myFile<< p;
}
3.编写一个程序,要求输入三角形的3条边,然后判断是否合理,如果不合理,给出信息并要求重新输入;如果合理,计算其面积并将结果存入文件中。
#include < iostream >
#include < fstream >
#include < cmath >
#include < vector >
#include < iomanip >
#include < string >
using namespace std;
class Triangle
{
double sizeA, sizeB, sizeC, area;
public:
Triangle(){}
void setArea()
{
double p = (sizeA + sizeB + sizeC) *0.5;
area = sqrt( p * (p - sizeA) * (p - sizeB) * (p - sizeC) );
}
void setSizeA(double a)
{
sizeA = a;
}
void setSizeB(double b)
{
sizeB = b;
}
void setSizeC(double c)
{
sizeC = c;
}
void set(vector &);
};
//***************************************
//* 成员函数:set
//* 参 数 :向量对象的引用
//* 返回值 :无
//* 功能 :为向量赋值并将向量存入文件
//***************************************
void Triangle :: set(vector & v )
{
Triangle t;
double a, b, c;
while(1)
{
cout<<"三角形,边A:";
cin>>a;
if(a == -1)//结束符为-1
{
ofstream writeFile;
char fileName[20];
cout<<"输入要保存到的文件名:";
cin>>fileName;
cout<<"保存到文件:"<< fileName << endl;
writeFile.open(fileName);
if(writeFile.fail())
{
cout<<"没有正确建立文件!"<< endl;
return;
}
for(int i=0; i< v.size(); i++)
writeFile<< v[i].sizeA <<" "<< v[i].sizeB <<" "<< v[i].sizeC <<" "<< v[i].area << endl;
writeFile.close();
cout<<"一共写入"<< v.size() <<"个三角形信息"<< endl;
return;
}
cout<<"三角形,边B:";
cin>> b;
cout<<"三角形,边C:";
cin>> c;
if( a>0 && b>0 && c>0 && a+b>c && a+c>b && b+c>a )
{
t.setSizeA(a);
t.setSizeB(b);
t.setSizeC(c);
t.setArea();
v.push_back(t);
}
else
cout<<"不能组成三角形,重新输入"<< endl;
}
}
void main()
{
vector tri;
Triangle triangle;
triangle.set(tri);
}
4.改写上题的程序,使程序反复计算,直到输入结束符号为止。要求在停止计算后,询问要保存的文件名,然后讲结果一次写入制定文件中。
#include < iostream >
#include < fstream >
#include < cmath >
#include < vector>
#include < iomanip >
#include < string >
using namespace std;
class Triangle
{
double sizeA, sizeB, sizeC, area;
public:
Triangle(){}
void setArea()
{
double p = (sizeA + sizeB + sizeC) *0.5;
area = sqrt( p * (p - sizeA) * (p - sizeB) * (p - sizeC) );
}
void setSizeA(double a)
{
sizeA = a;
}
void setSizeB(double b)
{
sizeB = b;
}
void setSizeC(double c)
{
sizeC = c;
}
void set(vector &);
};
//***************************************
//* 成员函数:set
//* 参 数 :向量对象的引用
//* 返回值 :无
//* 功能 :为向量赋值并将向量存入文件
//***************************************
void Triangle :: set(vector & v )
{
Triangle t;
double a, b, c;
while(1)
{
cout<<"三角形,边A:";
cin>>a;
if(a == -1)//结束符为-1
{
ofstream writeFile;
char fileName[20];
cout<<"输入要保存到的文件名:";
cin>> fileName;
cout<<"保存到文件:"<< fileName << endl;
writeFile.open(fileName);
if(writeFile.fail())
{
cout<<"没有正确建立文件!"<< endl;
return;
}
for(int i=0; i< v.size(); i++)
writeFile<< v[i].sizeA <<" "<< v[i].sizeB <<" "<< v[i].sizeC <<" "<< v[i].area << endl;
writeFile.close();
cout<<"一共写入"<< v.size()<<"个三角形信息"<< endl;
return;
}
cout<<"三角形,边B:";
cin>>b;
cout<<"三角形,边C:";
cin>>c;
if( a>0 && b>0 && c>0 && a+b>c && a+c>b && b+c>a )
{
t.setSizeA(a);
t.setSizeB(b);
t.setSizeC(c);
t.setArea();
v.push_back(t);
}
else
cout<<"不能组成三角形,重新输入"<< endl;
}
}
void main()
{
vector tri;
Triangle triangle;
triangle.set(tri);
}
5.从文件TEST中读出字符并写入TEST1里,要求均附加错误检查。
#include
#include
using namespace std;
void main()
{
ifstream txt1("TEST.txt");
ofstream txt2("TEST1.txt");
char c;
if(!txt1)
{
cout<<"文件打不开!"<< endl;
return;
}
if(!txt2)
{
cout<<"没有正确建立文件!"<< endl;
return;
}
while(1)
{
txt1>>c;
if(txt1.eof())
{
txt1.close;
return;
}
cout<< c;//打印字符
txt2<< c;//写文件TEST1.txt中
}
}
6.从键盘输入一个字符串,将其中的大写字母全部转换成小写字母,然后存入到文件名为“text”的磁盘文件中保存。输入的字符串以“$”结束。
//需要关掉卡巴斯基
#include < iostream >
#include < fstream >
using namespace std;
void main()
{
char a[100];
ofstream writeFile("text.txt");
int i;
while(1)
{
cin>>a;
if(a[0] == '$')
return;
i = 0;
while(a[i] != '\0')
{
if( a[i]>=65 && a[i]<=90 )
a[i]=a[i] + 32;
i++;
}
writeFile<< a<<" ";
}
}
计算机等级考试二级C++模拟题及解析1上机部分
一、改错题
使用VC6打开考生文件夹下的工程kt6_1,此工程包含一个源程序文件kt6_1.cpp,但该程序运行有问题,请改正程序中的错误,使程序的输出结果如下:
Constructor2
Constructor1
i=0
i=10
Destructor
源程序文件kt6_1.cpp清单如下:
#include
classCSample
{
inti;
public:
CSample(){cout<<"Constructor1"<
CSample(intval){cout<<"Constructor2"<
~CSample(){cout<<"Destructor"<
voiddisp();
};
/**********found**********/
voiddisp()
{cout<<"i="<
voidmain()
{
CSample*a,b(10);
/**********found**********/
a->disp();
/**********found**********/
b->disp();
}
【参考答案】
(1)将void disp()
改为:void CSample::disp()
(2)将a->disp();
改为:a=new CSample; a->disp();
(3)将b->disp();
改为:b.disp();
【试题解析】
(1)主要考查类成员函数定义格式的熟练掌握,对于类体外函数的实现,应该使用作用域符"::",按照返回值类型 类名::函数名(参数列表)的形式进行说明;
(2)主要考查对动态存储分配的掌握,根据前面的定义,a是一个指针类型的变量,指向一个对象,但是并没有被初始化,此时a中的数据无任何意义,应该使用动态存储分配new生成一个新的对象,并将返回的指针赋值给a;
(3)主要考查对象指针与对象在调用成员函数时格式的不同,b是一个对象变量,使用b调用成员函数应该用"."运算符。
二、简单应用题
编写函数fun(),它的功能是利用以下所示的简单迭代方法求方程cos(x)-x=0的一个实根。
xn+1=cos(xn)
迭代步骤如下:
(1)取x1初值为0.0。
(2)x0=x1,把x1的值赋给x0。
(3)x1=cos(x0),求出一个新的x1。
(4)若x0-x1的绝对值小于0.000001,则执行步骤(5),否则执行步骤(2)。
(5)所求x1就是方程cos(x)-x=0的一个实根,做为函数值返回。
程序输出结果Root=0.739085。
注意:部分源程序已存在文件kt6_2.cpp中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
文件kt6_2的内容如下:
#include
#include
#include
floatfun()
{
}
voidmain()
{cout<<"Root="<
【参考答案】
float fun()
{
float x1=0.0,x0;
do
{ x0=x1;
x1=cos(x0);}
while(fabs(x0-x1)>=1e-6);
return x1;
}
【试题解析】
解答本题的关键之处在于看清题中所给的“迭代步骤”,同时要理解xn+1=cosxn通式的含义,要考虑到x1的初值为0.0。
三、综合应用题
使用VC6打开考生文件夹下的工程kt6_3,此工程包含一个源程序文件kt6_3.cpp,其中定义了用于表示考生的类Student,请按要求完成下列操作,将程序补充完整。
(1)定义私有数据成员code、english分别用于表示考生的编号、英语成绩、它们都是int型的数据。请在注释“//**1**”之后添加适当的语句。
(2)完成成员函数voidStudent::inputinformation()的定义,该函数用于用户输入一个考生对象的信息,输入格式如下所示:
输入编号:
英语成绩:
计算机成绩:
请在注释“//**2**”之后添加适当的语句。
(3)利用已实现的类Student的成员函数,完成函数voidfirstname(Student*A[],intnum)的定义,该函数根据考生信息A[],输出num个考生中总分最高者的编号及其相应的总分,在此不考虑总分相同的情况。请在注释“//**3**”之后添加适当的语句。
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序文件kt6_3.cpp清单如下:
#include
classStudent
{//**1**
intcomputer;
inttotal;
public:
voidgetinformation();
voidcomputesum();
intgetcode();
intgettotalscore();
~Student();};
voidStudent::getinformation()
{//**2**
cout<<"英语成绩:";
cin>>english;
cout<<"计算机成绩:";
cin>>computer;}
voidStudent::computesum()
{total=english+computer;
cout<<"编号"<
intStudent::getcode()
{returncode;}
intStudent::gettotalscore()
{returntotal;}
voidfirstname(Student*A[],intnum)
{
//**3**
tempsum=(*A[0]).gettotalscore();
for(inti=1;i
{
if(((*A[i]).gettotalscore())>tempsum)
{tempcode=(*A[i]).getcode();
tempsum=(*A[i]).gettotalscore();}
}
cout<<"总分最高者--"<
}
voidmain()
{Student*A[3];
inti,n=3;
for(i=0;i
{A[i]=newStudent;
A[i]->getinformation();}
for(i=0;i
{A[i]->computesum();}
firstname(A,3);}
【参考答案】
(1)int code;
int english;
(2)cout<<"输入编号:";
cin>>code;
(3)int tempcode,tempsum;
tempcode=(*A[0]).getcode();
【试题解析】
本题是对C++程序设计的综合考查,其设计类的成员及成员函数的定义与调用,数据的输入输出,for循环语句,if条件判断语句等多个知识点,其中(3)中为指针数组的使用,指针数组是一组指针,每一个成员都按照指针的操作规则,但是整个访问规则仍然使用数组下标方式,如A[0]指的是第一个指针,而* A[0]是取出第一个指针指向的内容。
计算机等级考试二级C++模拟题及解析2上机部分
一、改错题
使用VC6打开考生文件夹下的工程kt7_1,此工程包含一个源程序文件kt7_1.cpp,但该程序运行有问题,请改正程序中的错误,使程序的输出结果如下:
Constructor1
Constructor1
Constructor1
Destructor
Constructor2
Destructor
x=0
x=5
Destructor
Destructor
源程序文件kt21_1.cpp清单如下:
#include
classB
{intx;
public:
B(){x=0;cout<<"Constructor1"<<p>
B(inti){x=i;cout<<"Constructor2"<<p>
~B(){cout<<"Destructor"<<p>
/**********found**********/
~B(inti){cout<<<"BEDESTRUCTOR"<<p>
voidprint(){cout<<"x="<<<p>
voidmain()
{B*ptr;
ptr=newB[2];
/**********found**********/
ptr[0]=B(0);
ptr[1]=B(5);
/**********found**********/
for(inti=0;i<2;)
ptr[i].print();
delete[]ptr;}
【参考答案】
(1)将~B(int i){cout<<<" pDestructor?<< be>
(2)将ptr[0]=B(0);改为:ptr[0]=B();
(3)将for (int i=0;i<2;)改为:for(int i=0;i<2;i++)
B(inti){x=i;cout<<"Constructor2"<<p>
~B(){cout<<"Destructor"<<p>
/**********found**********/
~B(inti){cout<<<"BEDESTRUCTOR"<<p>
voidprint(){cout<<"x="<<<p>
voidmain()
{B*ptr;
ptr=newB[2];
/**********found**********/
ptr[0]=B(0);
ptr[1]=B(5);
/**********found**********/
for(inti=0;i<2;)
ptr[i].print();
delete[]ptr;}
【参考答案】
(1)将~B(int i){cout<<<" pDestructor?<< be>
(2)将ptr[0]=B(0);改为:ptr[0]=B();
(3)将for (int i=0;i<2;)改为:for(int i=0;i<2;i++)
【试题解析】
本题主要考查对文件相关操作的熟练程度。首先定义文件流类的变量,然后使用该对象的open方法打开一个文件,接着使用while循环和getch方法每次读入一个字符并统计字符个数,最后使用close方法关闭文件,返回i值。
二、简单应用题
编写一个函数intcharnum(charfn[10]),该函数以只读方式打开文件fn,,通过统计,返回文件中字符的个数,请使用while循环实现计数功能。
注意:部分源程序已存在文件kt7_2.cpp中。
请勿修改主函数main和其他函数中的任何内容,仅在函数charnum的花括号中填写若干语句。
文件kt7_2.cpp的内容如下:
#include
#include
#include
intcharnum(charfn[10]);
voidmain()
{intnum;
num=charnum("abc.txt");
cout<<"num="<<<p>
intcharnum(charfn[10])
{
}
【参考答案】
int charnum(char fn[10])
{fstream file;
file.open(fn,ios::in);
if(!file)
{cout<<"abc.txt can'topen"<< p>
abort();}
char ch;
int i=0;
while(!file.eof())
{file.get(ch);
i++;}
file.close();
return i-1;}
【试题解析】
本题主要考查对文件相关操作的熟练程度。首先定义文件流类的变量,然后使用该对象的open方法打开一个文件,接着使用while循环和getch方法每次读入一个字符并统计字符个数,最后使用close方法关闭文件,返回i值。
三、综合应用题
使用VC6打开考生文件夹下的工程kt7_3,此工程包含一个源程序文件kt7_3.cpp,其中含有一个类Circle的定义,但该类的定义并不完整。请按要求完成下列操作,将类Circle的定义补充完整。
(1)为类Circle增加一个构造函数,该函数有一个参数,并在构造时将该参数值赋给成员radius。将该函数实现为一个非内联函数,并且使用参数列表的方式将类成员赋值。请在注释“//**1**”之后添加适当的语句。
(2)为类Circle增加一个成员函数print(),使得可以输出有关圆的信息,比如下列程序
Circlec;
c.SetRadius(5);
c.Print();
将输出:Thecirclehasradiusof5!
请在注释“//**2**”之后添加适当的语句。
(3)完成友元函数voidCompareR(Circle*c1,Circle*c2)的定义,在屏幕中输出c1与c2比较radius大小结果,要求使用if-else结构完成。请在注释“//**3**”之后添加适当的语句。
输出结果如下:
Thecirclehasradusof5!
Thecirclehasradiusof10!
c1< p>
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序文件kt7_3.cpp清单如下:
#include
classCircle{
public:
Circle():radius(5){}
//**1**
voidSetRadius(intr){radius=r;}
intGetRadius(){returnradius;}
//**2**
friendvoidCompareR(Circle*c1,Circle*c2);
private:
intradius;};
voidCompareR(Circle*c1,Circle*c2)
{//**3**
cout<<"c1>c2"<<p>
else
if((c1->GetRadius())==(c2->GetRadius()))
cout<<"c1=c2"<< p>
else
if((c1->GetRadius())<(c2->GetRadius()))
cout<<"c1<< p>
voidmain()
{Circlec1;
c1.SetRadius(5);
c1.Print();
Circlec2(10);
c2.Print();
CompareR(&c1,&c2);}
【参考答案】
(1)Circle(int rad):radius(rad){}
(2)void Print(){cout<<"The circlehas radius of "<<<"!\N";}< p>
(3)if((c1->GetRadius())>(c2->GetRadius()))
【试题解析】
本题考查成员函数的定义与实现,友元函数,if分支语句等知识点。友元函数的类体外的定义与一般函数一样,其中if-else的使用,else总是与其最近的那个if配对使用的,书写时最好使用缩进格式,将配对的if-else对齐,以免出错。
计算机等级考试二级C++模拟题及解析3上机部分
一、改错题
使用VC6打开考生文件夹下的工程kt8_1,此工程包含一个源程序文件kt8_1.cpp,但该程序运行有问题,请改正程序中的错误,使程序的输出结果如下:
f1functionofderive
f2functionofbase
f4functionofbase
源程序文件kt8_1.cpp清单如下:
#include
classbase
{ public:
/**********found**********/
voidf1(){cout<<"f1functionofbase"<< p>
virtualvoidf2(){cout<<"f2functionofbase"<<p>
virtualvoidf3(){cout<<"f3functionofbase"<<p>
voidf4(){cout<<"f4functionofbase"<<>
/**********found**********/
classderive::publicbase
{ voidf1(){cout<<"f1functionofderive"<<p>
voidf2(intx){cout<<"f2functionofderive"<<p>
voidf4(){cout<<"f4functionofderive"<<>
voidmain()
{ base*p;
deriveobj2;
/**********found**********/
p=obj2;
p->f1();
p->f2();
p->f4(); }
【参考答案】
(1)将void f1(){cout<<"f1 function of base"<< p>
改为:virtual void f1(){ cout<<"f1 functionof base"<< p>
(2)将classderive::public base
改为:class derive:public base
(3)将p=obj2;
改为:p=&obj2;
【试题解析】
(1)主要考查对虚函数的深刻理解,虚函数是动态联编的基础,也是实现多态性的重要方法,它可以根据不同的情况动态的选择执行哪一个函数。在派生类中实现虚函数应该满足与基类的同名函数完全相同,并且使用关键字virtual修饰,本题中由输出结果中的f1 function of derive可知,必须将基类base的成员函数f1()定义为虚函数;
(2)主要考查对派生类定义格式的掌握,应该使用“:”后面是继承列表,而“::”是作用域符;
(3)主要考查类对象的定义与使用,p是一个指针类型的变量,给它的赋值应该是一个地址,即使用取地址操作符&。
二、简单应用题
已知考生的记录由学号和学习成绩构成,N名考生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最低的考生记录,通过形参返回主函数(规定只有一个最低分)。已给予出函数的首部,请完成该函数。
注意:部分源程序已存在文件kt8_2.cpp中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
文件kt8_2.cpp的内容如下:
#include
#include
#include
#defineN10
typedefstructss
{charnum[10];
ints;
}STU;
voidfun(STUa[],STU*s)
{
}
voidmain()
{STU
a[N]={{"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77},{"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71}},m;
fun(a,&m);
cout<<"*****Theoriginaldate*****"<< p>
cout<<"Thelowest:"<<<< p>
【参考答案】
fun(STU a[],STU *s)
{int i, min;
min=a[0].s;
for(i=0;i< p>
if(a[i].s< p>
{min=a[i].s;
*s=a[i];}}
【试题解析】
解题思路为:先假设第一个考生的成绩最优,通过循环找到最低成绩,并将最低成绩的考生记录传给指针s,带回主函数。
三、综合应用题
使用VC6打开考生文件夹下的工程kt8_3,此工程包含一个源程序文件kt8_3.cpp,该文件设计了用于输出乘法九九表的类。请认真阅读已有的代码,按要求完成下列操作,将程序补充完整。
(1)定义类Table的私有数据成员x和y,分别用于表示九九表中的两个乘数(x*y),它们都是int型的数据。请在注释“//**1**”之后添加适当的语句;
(2)完成类Table的成员函数print()的定义,该函数以"x*y=z"的格式打印出九九表中的一个乘法算式,请使用格式化输出函数printf实现,在注释“//**2**”之后添加适当的语句;
(3)完成类Table9的成员函数print()的定义,该函数调用基类Table的print()函数,将九九表输出到屏幕,请在注释“//**3**”之后添加适当的语句;
(4)补充主函数,在屏幕上输出九九表,以便测试所定义的类的正确性。请在注释“//**4**”之后添加适当的语句。
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序文件kt8_3.cpp清单如下:
#include
#include
classTable
{//**1**
intz;
public:
voidprint(intx,inty,intz);};
voidTable::print(intx,inty,intz)
{//**2**}
classTable9:publicTable
{public:
voidprint();};
voidTable9::print()
{//**3**
intx,y,z;
for(i=1;i<10;i++)
{for(j=1;j< p>
{x=i;
y=j;
z=i*j;
Table::print(y,x,z);}
printf("\n");}}
main()
{//**4**
return0;}
【参考答案】
(1)int x;
int y;
(2)printf( "%d*%d=%d ",x,y,z);
if(z<10) printf(" ");
(3)int i,j;
(4)Table9 t_9;
t_9.print();
【试题解析】
主要考查将具体问题抽象为类,将类的定义补充完整,并进行类定义测试的能力。
计算机等级考试二级C++模拟题及解析4上机部分
一、改错题
使用VC6打开考生文件夹下的工程kt9_1,此工程包含一个源程序文件kt9_1.cpp,但该程序运行有问题,请改正程序中的错误,使程序的输出结果如下:
4,5
20
源程序文件清单如下:
#include<iostream.h>
classA
{ protected:
intn,m;
public:
voidset(inta,intb){m=a;n=b;}
voidshow(){cout<<m<<","<<n<<endl;}
/**********found**********/ }
classB:publicA
{ ints;
public:
voidset(){s=m*n;}
voidshows(){cout<<s<<endl;} };
voidmain()
{
Bb;
/**********found**********/
b.set();
b.show();
b.set();
/**********found**********/
b.show();
}
【参考答案】
(1)在“}”后添加分号
(2)将b.set();改为:b.A::set(4,5);
(3)将b.show();改为:b.shows();
【试题解析】
(1)主要考查对类定义格式的掌握,类的结尾应该使用";";
(2)主要考查对基类与派生类函数调用关系的掌握,根据所要求的输出结果,应该调用的函数为类A的set,而不是类B自身的set函数,应该避免调用的二义性;
(3)主要考查对继承与派生的理解,由所要求输出结果可知正确:b.shows()。
二、简单应用题
请编写一个函数intCalcDigital(char*str),该函数可返回字符串str中数字字符(即“0”-“9”这10个数字)的个数,如字符串"olympic2008"中数字字符的个数为4。请用if条件判断语句与for循环语句来实现该函数。
注意:部分源程序已存在文件中。
请勿修改主函数main和其他函数中的任何内容,仅在函数find的花括号中填写若干语句。
文件kt9_2.cpp的内容如下:
#include<iostream.h>
#include<string.h>
intCalcDigital(char*str);
voidmain()
{ char*str;
str=newchar[255];
cout<<"输入字符串:";
cin>>str;
intnum=CalcDigital(str);
cout<<str<<":"<<num<<endl;}
intCalcDigital(char*str)
{
}
【参考答案】
int CalcDigital(char *str)
{ if(str==NULL) return 0;
int num_of_digital=0;
int len=strlen(str);
for(inti=0;i<len;i++)
if(str[i]<='9' && str[i]>='0')
num_of_digital++;
returnnum_of_digital; }
【试题解析】
本题考查对于if条件判断语句与for循环语句的熟练使用程度。注意判断条件(判断是否是数字是直接比较ASCII码)的使用。
3.综合应用题
使用VC6打开考生文件夹下的工程kt9_3,此工程包含一个源程序文件kt9_3.cpp,其中定义了Circle类与Money类,Circle类可对半径为r的圆进行周长与面积的计算,而Money类用于计算一圆形游泳池的造价。游泳池四周有原形过道,过道外围上栅栏,过道宽度为3米,根据键入的游泳池半径,每米栅栏价格及每平方米过道价格,即可计算出游泳池的造价。请按要求完成下列操作,将程序补充完整。
(1)定义符号常量PI(值为3.14159f)与WIDTH(值为3.00f),分别用于表示圆周率与过道的固定宽度。请在注释“//**1**”之后添加适当的语句。
(2)定义Circle类默认构造函数,把私有成员radius初始化为参数r的值。请在注释“//**2**”之后添加适当的语句;
(3)完成Money类默认构造函数的定义,把私有成员FencePrice(每米栅栏的价格)、ConcretePrice(每平方米过道的价格)初始化为参数f,c的值。请在注释“//**3**”之后添加适当的语句。
(4)完成Money类成员函数floatMoney::TotalMoney(floatfencelen,floatconarea)的定义,根据参数fencelen(栅栏的长度)和conarea(过道的面积),返回栅栏与过道的总造价。请在注释“//**4**”之后添加适当的语句。
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序文件kt9_3.cpp清单如下:
#include<iostream.h>
//**1**
classCircle
{ private:
floatradius;
public:
//**2**
floatCircumference(){return2*PI*radius;}
floatArea(){returnPI*radius*radius;}};
classMoney
{ private:
floatFencePrice;
floatConcretePrice;
public:
Money(floatf,floatc);
floatTotalMoney(floatfencelen,floatconarea);};
Money::Money(floatf,floatc)
{ //**3** }
floatMoney::TotalMoney(floatfencelen,floatconarea)
{ //**4** }
voidmain()
{ floatradius,fence,concrete;
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
cout<<"Entertheradiusofthepool:";
cin>>radius;
cout<<"EntertheFencePrice:";
cin>>fence;
cout<<"EntertheConcretePrice:";
cin>>concrete;
CirclePool(radius);
CirclePoolRim(radius+WIDTH);
Moneymon(fence,concrete);
floattotalmoney=mon.TotalMoney(PoolRim.Circumference(),(PoolRim.Area()-Pool.Area()));
cout<<"ThetotalmoneyisRMB"<<totalmoney<<endl;}
【参考答案】
(1)const float PI= 3.14159f;
constfloat WIDTH =3.00f;
(2)Circle(floatr):radius(r){};
(3)FencePrice=f;
ConcretePrice=c;
(4)returnFencePrice*fencelen+ConcretePrice*conarea;
【试题解析】
本题考查对符号常量的定义及类的定义与实现等方面的内容,其中常类型的定义应使用const关键字。
计算机等级考试二级C++模拟题及解析5上机部分
一、改错题
使用VC6打开考生文件夹下的工程kt10_1,此工程包含一个源程序文件kt10_1.cpp,但该程序运行有问题,请改正程序中的错误,使程序的输出结果为:
classBase
classD1
classD2
classD3
finBase
源程序文件kt10_1.cpp清单如下:
#include<iostream.h>
classBase
{ public:
Base(){cout<<"classBase"<<endl;}
voidf(){cout<<"finBase"<<endl;} };
classD1:virtualpublicBase
{ public:
D1(){cout<<"classD1"<<endl;}
voidf(){cout<<"finD1"<<endl;} };
/**********found**********/
classD2:publicBase
{ public:
D2(){cout<<"classD2"<<endl;} };
/**********found**********/
classD3::publicD1,publicD2
{ public:
D3(){cout<<"classD3"<<endl;} };
voidmain()
{ D3d;
/**********found**********/
d.f(); }
【参考答案】
(1)将class D2:public Base
改为:class D2:virtual public Base
(2)将class D3::public D1,public D2
改为:class D3:public D1,public D2
(3)将d.f();改为:d.Base::f();
【试题解析】
(1)主要考查对虚基类的理解,虚基类可以解决二义性的问题,其定义方式是在继承列表中使用virtual关键字,使用虚基类可以避免程序运行中对基类函数调用的不惟一;
(2)主要考查对类的定义方法的掌握,“::”为作用域符,此处应该使用“:”,因为后面是继承列表;
(3)主要考查对虚基类函数调用过程的理解,只有使用"::"限定才能访问基类函数,否则将会调用自身的函数,如果该类没有该函数的定义,则会自动调用其父类的该函数,所以必须使用“::”符号。
二、简单应用题
请编写一个函数inlinelongsum(intn),用递归函数完成运算:sum(n)=1*1+2*2+???+n*n,递归表达式为sum(n)=sum(n-1)+n2。
注意:部分源程序已存在文件kt10_2.cpp中。
请勿修改主函数main和其他函数中的任何内容,仅在函数sum的花括号中填写若干语句。
文件kt10_2.cpp的内容如下:
#include<iostream.h>
inlinelongsum(intn)
{
}
voidmain()
{ intn;
cout<<"输入n:";
cin>>n;
cout<<"结果为:"<<sum(n)<<endl; }
【参考答案】
inline long sum(int n)
{ if(n==1)
return 1;
else
return n*n+sum(n-1); }
【试题解析】
本题考查对递归函数掌握的熟练程度。递归的终止条件为n=1时,值为1。
三、综合应用题
使用VC6打开考生文件夹下的工程kt10_3,此工程包含一个源程序文件kt10_3.cpp,其中定义了用于表示雇员信息的CEmployee类与表示公司信息的Company类,但这两个类的定义并不完整。请按要求完成下列操作。
(1)定义Cemployee类的私有数据成员name(大小为50的字符数组)和pay(double型数据),分别用于记录雇员姓名和月薪。请在注释“//**1**”之后添加适当的语句。
(2)完成Company类默认构造函数的定义,该构造函数将n值赋值给私有成员num,并完成指针emp所指的n个Cemployee对象空间的申请,请在注释“//**2**”之后添加适当的语句。
(3)完成Company类成员函数voidCompany::add(intcode,charname[50],doublepay)的定义,该函数将某一雇员的编号code、姓名name及月薪pay输入到公司信息中。请在注释“//**3**”之后添加适当的语句。
(4)完成Company类成员函数voidCompany::print()的定义,使其以"_ispaid_RMBforonemonth"的格式输出公司内所有员工的月薪信息。请在注释“//**4**”之后添加适当的语句。
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序清单如下:
#include<iostream.h>
#include<string.h>
classCEmployee
{ public:
voidputname(charn[50]){strcpy(name,n);}
voidgetname(charn[50]){strcpy(n,name);}
voidputpay(doubled){pay=d;}
doublegetpay(){returnpay;}
private:
//**1** };
classCompany
{ private:
CEmployee*emp;
intnum;
public:
Company(intn);
voidadd(intcode,charname[50],doublepay);
voidprint(); };
Company::Company(intn)
{ //**2** }
voidCompany::add(intcode,charname[50],doublepay)
{ //**3** }
voidCompany::print()
{ //**4**
for(inti=0;i<num;i++)
{ (emp+i)->getname(c);
money=(emp+i)->getpay();
cout<<c<<"ispaid"<<money<<
"RMBforonemonth"<<endl; } }
voidmain()
{ Companycom(2);
com.add(0,"Jack",200);
com.add(1,"Lee",300);
com.print(); }
【参考答案】
(1)char name[50];
double pay;
(2)num=n;
emp=new CEmployee[num];
(3)(emp+code)->putname(name);
(emp+code)->putpay(pay);
(4)char c[50];
double money;
【试题解析】
本题考查类成员的定义、类成员函数的定义与调用、对象数组的使用。注意指针和动态申请空间new的使用方法。使用指针调用成员应该用"->"符号,new的返回值是指针类型的。
计算机等级考试二级C++模拟题及解析6上机部分
一、改错题
使用VC6打开考生文件夹下的工程kt11_1,此工程包含一个源程序文件kt11_1.cpp,但该程序运行有问题,请改正函数中的错误,使该程序的输出结果为:
Valuesare:1,2and3
Pressanykeytocontinue
源程序文件kt11_1.cpp清单如下:
#include<iostream.h>
classCommonBase
{ public:
intx; };
/*****************found*****************/
classDeriveCommonA::publicCommonBase
{ public:
inty; };
classDeriveCommonB:publicCommonBase
{ public:
intz; };
/*****************found*****************/
classOverlapping:publicDeriveCommonA;publicDeriveCommonB
{ public:
voidDisplay()
{cout<<"Valuesare:"<<DeriveCommonA::x<<","<<y<<"and"<<z<<endl;} };
intmain()
{ Overlappingov;
/*****************found*****************/
ov.x=1;
ov.y=2;
ov.z=3;
ov.Display();
return0; }
【试题解析】
(1)主要考查对派生类定义的理解,C++规定的继承格式是在类名的后面加冒号,之后是继承方式和继承类的名称,题目中错误的使用了作用域运算符;
(2)主要考查多继承的定义,多继承的格式基本上和单继承相同,不过在多个基类之间应该使用逗号分开,题目中错误的使用了分号,分号在C++中是结束标志;
(3)主要考查对派生类的对象访问的掌握,x是类CommonBase的成员,如果不加限制的访问就会产生二义性,编译程序不知道这个x是A类的,还是B类的,所以必须使用作用域限制符“::”,为了解决这个问题可以使用虚基类。
二、简单应用题
请编写函数fun(),该函数的功能是判断字符串是否为回文,若是则函数返回1,主函数中输出YES;否则返回0,主函数中输出NO。回文是指顺读和倒读都一样的字符串。
例如:字符串LEVEL是回文,而字符串123312就不是回文。
注意:部分源程序已存在文件kt11_2.cpp中。
请勿修改主函数main和其他函数中的任何内容,仅在函数fun的花括号中填写若干语句。
文件kt11_2.cpp的内容如下:
#include<iostream.h>
#include<stdio.h>
#defineN80
intfun(char*str)
{
}
voidmain()
{ chars[N];
cout<<"Enterastring:"<<endl;
gets(s);
cout<<"\n\n";
puts(s);
if(fun(s))
cout<<"YES\n";
else
cout<<"NO\n"; }
【参考答案】
int fun(char *str)
{
int i,n=0,fg=1;
char *p=str;
while(*p)
{ n++; p++; }
for(i=0;i<n/2;i++)
if(str[i]==str[n-1-i]) ;
else
{ fg=0; break; }
return fg;
}
【试题解析】
本题的解题思路是:先利用循环中指针的移动来求得字符串的长度n,然后用一个for循环依次取得数组中的前半部分元素,用取得的前半部分内的元素逐个与后半部分内的对应位置的元素进行比较,如果相同,不做任何工作,接着取下一个元素,继续比较;如果不相同,可以判断该字符串肯定不是回文,就给标志变量fg赋值0(fg的初始值为1)。最终把fg作为函数的返回值返回(fg值为1表明是回文,fg值为0表明不是回文)。
三、综合应用题
使用VC6打开考生文件夹下的工程kt11_3。此工程包含一个kt11_3.cpp,其中定义了类queue,但该类的定义并不完整。请按要求完成下列操作,将程序补充完整。
(1)完成类queue的无参数的构造函数的定义,要求把数据成员bl和el都初始化为0,同时输出queueinitialized。请在注释“//**1**”之后添加适当的语句。
(2)完成类queue的成员函数qput(intj)的定义,它的功能是把新的元素加入队列,过程是先依据bl的值判断数组是否已经满了,如果是就输出queueisfull,否则bl自加一,并且把参数j的值存入bl指向的数组元素中,请在注释“//**2**”之后添加适当的语句。
(3)完成类queue的成员函数qget()的定义,它的功能是把队列开头的元素提取出队列,并返回该值,过程是先比较el和bl的值判断队列是否已空,如果是就输出queueisempty,否则el自加一,并且把el指向的数组元素返回,请在注释“//**3**”之后添加适当的语句。
程序输出结果如下:
queueinitialized
queueinitialized
3311
4422
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序文件kt11_3.cpp清单如下:
#include<iostream.h>
classqueue
{ intq[100];
intbl,el;
public:
queue();
voidqput(intj);
intqget(); };
queue::queue()
{ //**1** }
voidqueue::qput(intj)
{ //**2**
{ cout<<"queueisfull\n";
return; }
bl++;
q[bl]=j; }
intqueue::qget()
{ //**3**
{ cout<<"queueisempty\n";
return0; }
el++;
returnq[el]; }
voidmain()
{
queueaa,bb;
aa.qput(11);
bb.qput(22);
aa.qput(33);
bb.qput(44);
cout<<aa.qget()<<""<<aa.qget()<<"\n";
cout<<bb.qget()<<""<<bb.qget()<<"\n";
}
【参考答案】
(1)bl=el=0;
cout<<"queue initialized\n";
(2)if(bl==100)
(3)if(el==bl)
【试题解析】
主要考查对于具体的一个队列类的掌握,对列是一种特殊的存储结构,应使用先进先出原则。题目中bl和el分别指向队列的开头和结尾,其中(2)是队列的标准插入操作,(3)是队列的标准的删除操作,注意它们的操作方式和先判断后操作的原则。
计算机等级考试二级C++模拟题及解析7上机部分
一、改错题
使用VC6打开考生文件夹下的工程kt12_1,此工程包含一个源程序文件kt12_1.cpp,但该程序运行有问题,请改正函数中的错误,使该程序的输出结果为:
100
源程序文件kt12_1.cpp清单如下:
#include<iostream.h>
template<classT>
classpair
{ Tvalue1,value2;
public:
pair(Tfirst,Tsecond)
{value1=first;value2=second;}
/*****************found*****************/
chargetmax(); };
/*****************found*****************/
Tpair<T>::getmax()
{ Tretval;
/*****************found*****************/
retval=value1>value2??value1:value2;
returnretval; }
voidmain()
{ pair<int>myobject(100,75);
cout<<myobject.getmax()<<endl;}
【参考答案】
(1)将char getmax();改为:T getmax ();
(2)缺少模板的声明,应改为:template<class T>
(3)将retval =value1>value2?? value1 : value2;
改为:retval= value1>value2? value1 : value2;
【试题解析】
(1)主要考查对模板使用的理解,该函数属于模板类定义的一部分,对于返回值类型,应该使用模板类名称T,这样编译的时候才能被接受;
(2)主要考查是模板的使用,前面的模板类已经声明完成了,在类的外面定义类的成员函数时仍然需要使用模板的声明,这样在后面的函数定义体中才能使用模板类;
(3)主要考查对“表达式1? 表达式2 :表达式3”语句的掌握,这个语句是一个复合语句,先计算第一个表达式,如果为真则整个式子值为表达式2的值,否则为表达式3的值,题目中错误的使用了两个问号。
二、简单应用题
请编写函数fun(),其功能是将s所指字符串中除了下标为奇数、同时ASCII值也为奇数的字符之外,其余的所有字符都删除。字符串中剩余的字符所形成的一个新的字符串放在t所指的数组中。
例如:s所指字符串中的内容为ABCDEFG12345,其中字符A的ASCII码值虽为奇数,但元素所在的下标为偶数,因此必需删除;字符1的ASCII码值为奇数,所在数组中的下标也为奇数,不删除,最后t所指的数组中的内容应是135。
请勿修改主函数main和其他函数中的任何内容,仅在函数su的花括号中填写若干语句。
文件kt12_2.cpp的内容如下:
#include<conio.h>
#include<stdio.h>
#include<iostream.h>
#include<string.h>
voidfun(char*s,chart[])
{
}
voidmain()
{ chars[100],t[100];
cout<<"PleaseenterstringS:"<<endl;
gets(s);
fun(s,t);
puts(t); }
【参考答案】
void fun(char *s,char t[ ])
{ int i,j=0,n;
n=strlen(s);
for(i=0;i<n;i++)
if(i%2!=0&&s[i]%2!=0)
{ t[j]=s[i];j++;}
t[j]='\0'; }
【试题解析】
本体的解题思路是要先搞清楚在字符参与数值运算时,用的是其ASCII码值来进行计算。其次是判断某数是奇数的方法,即判断该数与2的余数是否为0。
三、综合应用题
使用VC6打开考生文件夹下的工程kt12_3。此工程包含一个kt12_3.cpp,其中定义了类ARRAY,但类的定义并不完整。请按要求完成下列操作,将程序补充完整。
(1)完成类ARRAY的带一个参数的构造函数,参数i为int型,如果i不是正数则输出错误信息并退出,否则申请int型的大小为i的空间,然后把i赋值给类的数据成员num。请在注释“//**1**”之后添加适当的语句。
(2)完成类ARRAY的拷贝初始化构造函数,注意解决重复删除的问题,请在注释“//**2**”之后添加适当的语句。
(3)完成类ARRAY的重载的运算符函数[],参数i为int型,如果i超界则输出错误信息并退出,否则把下标为i的元素返回,请在注释“//**3**”之后添加适当的语句。
(4)完成类ARRAY的重载的运算符函数=,同样需要注意解决重复删除的问题,不能只是简单的赋值,请在注释“//**4**”之后添加适当的语句。
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序文件kt12_3.cpp清单如下:
#include<iostream.h>
#include<stdlib.h>
classARRAY
{ private:
int*p,num;
public:
ARRAY(){p=newint[10],num=10;}
ARRAY(inti)
{ //**1**
{ cout<<"错误!数组长度应为正。\n";
exit(0); }
p=newint[i];
num=i; }
ARRAY(constARRAY&a);
int&operator[](inti);
~ARRAY(){deletep;}
ARRAY&operator=(constARRAY&a);
friendARRAYoperator+(ARRAY&a,ARRAY&b);
friendostream&operator<<(ostream&os,ARRAY&a); };
ARRAY::ARRAY(constARRAY&a)
{ //**2**
for(inti=0;i<num;i++)
p[i]=a.p[i]; }
int&ARRAY::operator[](inti)
{ //**3**
{ cout<<"越界访问!";
exit(0); }
returnp[i]; }
ARRAY&ARRAY::operator=(constARRAY&a)
{ num=a.num;
p=newint[num];
for(inti=0;i<num;i++)
p[i]=a.p[i];
//**4** }
ARRAYoperator+(ARRAY&a,ARRAY&b)
{ if(a.num!=b.num)
{ cout<<"数组长度不相同!"<<endl;
exit(0); }
ARRAYt(a.num);
for(inti=0;i<a.num;i++)
t.p[i]=a.p[i]+b.p[i];
returnt; }
ostream&operator<<(ostream&os,ARRAY&a)
{ inti=0;
for(;i<a.num;i++)
{ cout<<a.p[i]<<'';
if(!((i+1)%10))cout<<endl; }
returnos; }
voidmain()
{ ARRAYa(3);
a[0]=a[1]=a[2]=3;
cout<<'a'<<a<<endl;
ARRAYb(a);
cout<<'b'<<b<<endl;
ARRAYc(2);
c=a+b+b;
cout<<'c'<<c<<endl;
c=((b=(a+b))+c);
cout<<'a'<<a<<'b'<<b<<'c'<<c<<endl;
a[7]=3;
cout<<a; }
【参考答案】
(1)if(i<=0)
(2)num=a.num;
p=new int[num];
(3)if(i>=num||i<0)
(4)return *this;
【试题解析】
主要考查对一个特殊的类--安全数组的掌握,其中涉及了友元函数、重载函数等,其中(2)中必需申请新的空间,这样可以使得两个对象分别占用不同的两个空间,在自动调用析构函数时不会遇到重复删除的问题,这种方法要掌握。
计算机二级C++上机南开百题(简单应用题)
1: 第1题 m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人作为函数值返回,将低于平均分的分数放在below所指定的函数中。 答案: int fun(int score[],int m,int below[]) { int i,k=0,aver=0; for(i=0;i<m;i++) aver+=score[i]; aver/=m; for(i=0;i<m;i++) if(score[i]<aver) { below[k]=score[i]; k++; } return k; } 2: 第2题 请编写函数fun,它的功能是:求出1到100之内能北7或者11整除,但不能同时北7和11整除的所有证书,并将他们放在a所指的数组中,通过n返回这些数的个数。 答案: void fun(int *a, int *n) { int i,j=0; for(i=2;i<1000;i++) if ((i%7==0 || i%11==0) && i%77!=0) a[j++]=i; *n=j; } 3: 第3题 请编写函数void fun(int x,int pp[],int *n),它的功能是:求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。 答案: void fun(int x, int pp[ ], int *n) { int i=1,j=0;k=0,*t=pp; for(i=0;i<=x;i++) if(i%2!=0) { t[j]=I; j++; } for(i=0;i<j;i++) if(x%t[i]==0) { pp[k]=t[i]; k++; } *n=k; } 4: 第4题 请编写一个函数void fun(char *tt,int pp[]),统计在tt字符中"a"到"z"26各字母各自出现的次数,并依次放在pp所指的数组中。 答案: void fun(char *tt, int pp[]) { int i; for (i=0;i<26;i++) pp[i]=0; while (*tt) { switch (*tt) { case ‘a’: pp[0]++;break; case ‘b’: pp[1]++;break; case ‘c’: pp[2]++;break; case ‘d’: pp[3]++;break; case ‘e’: pp[4]++;break; case ‘f’: pp[5]++;break; case ‘g’: pp[6]++;break; case ‘h’: pp[7]++;break; case ‘i’: pp[8]++;break; case ‘j’: pp[9]++;break; case ‘k’: pp[10]++;break; case ‘l’: pp[11]++;break; case ‘m’: pp[12]++;break; case ‘n’: pp[12]++;break; case ‘o’: pp[14]++;break; case ‘p’: pp[15]++;break; case ‘q’: pp[16]++;break; case ‘r’: pp[17]++;break; case ‘s’: pp[18]++;break; case ‘t’: pp[19]++;break; case ‘u’: pp[20]++;break; case ‘v’: pp[21]++;break; case ‘w’: pp[22]++;break; case ‘x’: pp[23]++;break; case ‘y’: pp[24]++;break; case ‘z’: pp[25]++;break; } tt++; } } 5: 第5题 请编写一个函数void fun(int m,int k,int xx[]),该函数的功能是:将大于整数m且紧靠m的k各素数存入xx所指的数组中。 答案: void fun(int m, int k, int xx[]) { int g=0,I,j,flag=1; for(i=m+1;i<m*m;i++) { for(j=0;j<I;j++) { if(i%j!=0) flag=1; else { flag=0; break; } } if (flag==1 && j>=i) { if (k>=0) { xx[g++]=i; k--; } else break; } } } 6: 第6题 请编写一个函数void fun(char a[],char[],int n),其功能是:删除以各字符串中指定下标的字符。其中,a指向原字符串,删除后的字符串存放在b所指的数组中,n中存放指定的下标。 答案: void fun(char a[],char b[], int n) { int I,j=0; for (i=0;i<LEN;i++) if (i!=n) { b[j]=a[i]; j++; } b[j]=‘\0’; } 7: 第7题 请编写一个函数int fun(int *s,int t,int *k),用来求除数组的最大元素在数组中的下标并存放在k所指的储存单元中。 答案: void fun (int *s, int t, int *k) { int I, max; max=s[0]; for(i=0;i<t;i++) if (s[i]>max) { max=s[i]; *k=I; } } 8: 第8题 编写函数fun,功能是:根据以下攻势计算s,计算结果作为函数值返回;n通过形参传入。S=1+1/(1+2)+1/(1+2+3)+…….+1/(1+2+3+4+……+n) 答案: float fun (int n) { int i; float s=1.0, t=1.0; for(i=2;i<=n;i++) { t=t+i; s=s+1/t; } return s; } 9: 第9题 编写一个函数fun,它的功能是:根据以下公式求p的值,结果由函数值带回。M与n为两个正整数,且要求m>n。 p=m!/n!(m-n)! 答案: float fun(int m, int n) { float p,t=1.0; int I; for (i=1;i<=m;i++) t=t*I; p=t; for(t=1.0,i=1;i<=n;i++) t=t*I; p=p/t; for(t=1.0,i=1;i<=m-n;i++) t=t*I; p=p/t; return p; } 10: 第10题 编写函数fun,它的功能是:利用以下的简单迭代方法求方程cos(x)-x=0的一个实根。 迭代步骤如下:(1)取x1初值为0.0; (2)x0=x1,把x1的值赋各x0; (3)x1=cos(x0),求出一个新的x1; (4)若x0-x1的绝对值小于0.000001,则执行步骤(5),否则执行步骤(2); (5)所求x1就是方程cos(x)-x=0的一个实根,作为函数值返回。 程序将输出root=0.739085。 答案: float fun() { float x1=0.0,x0; do { x0=x1; x1=cos(x0); } while(fabs(x0-x1)>1e-6); return x1; } 11: 第11题 下列程序定义了n×n的二维数组,并在主函数中自动赋值。请编写函数 fun(int a[][n]),该函数的功能是:使数组左下半三角元素中的值全部置成0。 答案: int fun(int a[][N]) { int I,j; for(i=0;i<N;i++) for(j=0;j<=I;j++) a[i][j]=0; } 12: 第12题 下列程序定义了n×n的二维数组,并在主函数中赋值。请编写函数fun,函数的功能使求出数组周边元素的平均值并作为函数值返回给主函数中的s。 答案: double fun(int w[][N]) { int I,j,k=0; double s=0.0; for(j=0;j<N;j++) { s+=w[0][j]; k++; } for(j=0;j<N;j++) { s+=w[N-1][j]; k++; } for(i=1;i<=N-2;i++) { s+=w[i][0]; k++; } for(i=1;i<=N-2;i++) { s+=w[i][N-1]; k++; } return s/=k; } 13: 第13题 请编写一个函数void fun(int tt[m][n],int pp[n]),tt指向一个m行n列的二维函数组,求出二维函数组每列中最小元素,并依次放入pp所指定一维数组中。二维数组中的数已在主函数中赋予。 答案: void fun(int tt[M][N], int pp[N]) { int I,j,min; for(j=0;j<N;j++) { min=tt[0][j]; for(i=0;i<M;i++) { if (tt[i][j]<min) min=tt[i][j]; } pp[j]=min; } } 14: 第14题 请别写函数fun,函数的功能使求出二维数组周边元素之和,作为函数值返回。二维数组中的值在主函数中赋予。 答案: int fun(int a[M][N]) { int I,j,s=0; for(j=0;j<N;j++) { s+=a[0][j]; s+=a[M-1][j]; } for(i=1;i<=M-2;i++) { s+=a[i][0]; s+=a[i][N-1]; } return s; } 15: 第15题 请编写一个函数unsigned fun(unsigned w),w使一个大于10的无符号整数,若w使n(n≥2)位的整数,则函数求出w后n-1位的数作为函数值返回。 答案: unsigned fun(unsigned w) { unsigned t,s=0,s1=1,p=0; t=w; while(t>10) { if(t/10) p=t%10; s=s+p*s1; s1=s1*10; t=t/10; } return s; } 16: 第16题 请编写一个函数float fun(double h),函数的功能使对变量h中的值保留2位小树,并对第三位进行四舍五入(规定h中的值位正数)。 答案: float fun(float h) { long t; float s; h=h*1000; t=(h+5)/10; s=(float)t/100.0; return s; } 17: 第17题 请编写一个函数fun(char *s),该函数的功能使把字符串中的内容拟置。 答案: void fun(char *s) { char ch; int I,m,n; i=0; m=n=strlen(s)-1; while(i<(n+1)/2) { ch=s[i]; s[i]=s[m]; s[m]=ch; i++; m--; } } 18: 第18题 编写程序,实现矩阵(3行3列)的转置(即行列互换)。 答案: void fun(int array[3][3]) { int I,j,temp; for(i=0;i<3;i++) for(j=0;j<I,j++) { temp=array[i][j]; array[i][j]=array[j][i]; array[j][i]=temp; } } 19: 第19题 编写函数fun,该函数的功能是:从字符中删除指定的字符,同一字母的大、小写按不同字符处理。 答案: void fun(char s[],int c) { int i=0; char *p; p=s; while(*p) { if(*p!=c) { s[i]=*p; i++; } p++; } s[i]=‘\0’; } 20: 第20题 编写函数int fun(int lim,int aa[max]),该函数的功能是求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。 答案: int fun(int lim, int aa[MAX]) { int k=0,I,j; for(i=lim;i>1;i--) { for(j=2;j<i;j++) if(i%j==0) break; else continue; if(j>=i) { aa[k]=i; k++; } } return k++; } 21: 第21题 请编写函数fun,对长度位7个字符的字符串,除首尾字符外,将其余5个字符按ascii码降序排列。 答案: void fun(char *s,int num) { char t; int I,j; for(i=1;i<num-2;i++) for(j=i+1;j<num-1;j++) if(s[i]<s[j]) { t=s[i]; s[i]=s[j]; s[j]=t; } } 22: 第22题 n名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,它的功能是:找出学生的最高分,由函数值返回。 答案: double fun(STREC *h) { double max; STREC *q=h; max=h->s; do { if(q->s>max) max=q->s; q=q->next; } while(q!=0); return max; } 23: 第23题 请编写函数fun,该函数的功能是:判断字符串是否为回文?若是则函数返回1,主函数中输出yes,否则返回0,主函数中输出no。回文是指顺读和倒读都是一样的字符串。 答案: int fun(char *str) { int I,n=0;fg=1; char *p=str; while (*p) { n++; p++; } for(i=0;i<n/2;i++) if (str[i]==str[n-1-i]); else { fg=0; break; } return fg; } 24: 第24题 请编写一个函数fun,它的功能是:将一个字符串转换为一个整数(不得调用c语言提供的将字符串转换为整数的函数)。 答案: long fun (char *p) { long s=0,t; int i=0,j,n=strlen(p),k,s1; if(p[0]==‘-’) i++; for(j=I;j<=n-1;j++) { t=p[j]-‘0’; s1=10; for(k=j;k<n-1;k++) t*=s1; s+=t; } if(p[0]==‘-’) return –s; else return s; } 25: 第25题 请编写一个函数fun,它的功能是:比较两个字符串的长度,(不得调用c语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,则返回第一个字符串。 答案: char *fun(char *s,char *t) { char *p,*t1=t,*s1=s; int n=0;m=0; while (*s1) { n++; s1++; } while(*t1) { m++; t1++; } if(n>=m) p=s; else p=t; return p; } 26: 第26题 请编写一个函数fun,它的功能是:根据以下公式求x的值(要求满足精度0.0005,即某项小于0.0005时停止迭代): x/2=1+1/3+1×2/3×5+1×2×3/3×5×7+1×2×3×4/3×5×7×9+…+1×2×3×…×n/3×5×7×(2n+1) 程序运行后,如果输入精度0.0005,则程序输出为3.14…。 答案: double fun(double eps) { double s; float n,t,pi; t=1;pi=0;n=1.0;s=1.0; while((fabs(s))>=eps) { pi+=s; t=n/(2*n+1); s*=t; n++; } pi=pi*2; return pi; } 27: 第27题 请编写一个函数fun,它的功能是:求除1到m之内(含m)能北7或11整除的所有整数放在数组a中,通过n返回这些数的个数。 答案: void fun(int m, int *a, int *n) { int I,j=0; *n=0; for(i=1;i<=m;i++) if (i%7==0 || i%11 ==0) { a[j]=I; j++; } *n=j; } 28: 第28题 请编写一个函数fun,它的功能是:找出一维整型数组元素中最大的值和它所在的下标,最大的值和它所在的下标通过形参传回。数组元素中的值已在主函数中赋予。主函数中x是数组名,n 是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。 答案: void fun (int a[],int n, int *max, int *d) { int I; *max=a[0]; *d=0; for(i=0;I<n;i++) if(a[i]>*max) { *max=a[i]; *d=I; } } 29: 第29题 请编写一个函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置上的字母转换为大写(若该位置上不是字母,则不转换)。 答案: void fun(char *ss) { int I,n; n=strlen(ss); for(i=1;i<n;i+=2) if(ss[i]>=‘a’&& ss[i]<=‘z’) ss[i]=ss[i]-32; } 30: 第30题 请编写一个函数fun,它的功能是:求除一个2×m整型二维数组中最大元素的值,并将此值返回调用函数。 答案: int fun(int a[][M]) { int I,j,max; max=a[0][0]; for(i=0;i<2;i++) for(j=0;j<M;j++) if(a[i][j]>max) max=a[i][j]; return max; } 31: 第31题 请编写函数fun,其功能是:将s所指字符串中除了下标为偶数、同时ascii值也为偶数的字符外,其余的全都删除;串中剩余字符所形成的一个新串放在t所指的一个数组中。 答案: void fun(char *s,char t[]) { int I,j=0,n; n=strlen(s); for(i=0;I,n;i++) if(i%2==0&&s[i]%2==0) { t[j]=s[i]; j++; } t[j]=‘\0’; } 32: 第32题 请编写函数fun,其功能是:将s所指字符串中除了下标为奇数、同时ascii值也为奇数的字符之外,其余的所有字符都删除,串中剩余字符所形成的一个新串放在t所指的一个数组中。 答案: void fun(char *s,char t[]) { int I,j=0,n; n=strlen(s); for(i=0;I,n;i++) if(i%2!=0&&s[i]%2!=0) { t[j]=s[i]; j++; } t[j]=‘\0’; } 33: 第33题 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:使字符串中尾部的*号不得多于n个;若多于n个,则删除多于的*号;若少于或等于n个,则什么也不做,字符串中间和前面的*号不删除。 答案: void fun(char *a,int n) { int i=0;k=0; char *p, *t; p=t=a; while (*t) t++; t--; while(*t==‘*’) { k++; t--; } t++; if(k>n) { while (*p&&p<t+n) { a[i]=*p; i++; p++; } a[i]=‘\0’; } } 34: 第34题 学生的记录由学号和成绩组成,n名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能使:把分数最高的学生数据放在h所指的数组中,注意:分数最高的学生可能不止一个,函数返回分数最高的学生的人数。 答案: int fun (STREC *a, STREC *b) { int I,j=0,n=0, max; max=a[0].s; for(i=0;i<N;i++) if(a[i].s>max) max=a[i].s; for(i=0;i<N;i++) if(a[i].s==max) { *(b+j)=a[i]; j++; n++; } return n; } 35: 第35题 请编写一个函数,用来删除字符串中的所有空格。 答案: void fun(char *str) { int i=0; char *p=str; while (*p) { if(*p!=‘’) { str[i]=*p; i++; } p++; } str[i]=‘\0’; } 36: 第36题 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中的前导*号全部移到字符串的尾部。 答案: void fun(char *a) { int i=0,n=0; char *p; p=a; while (*p==‘*’) { n++; p++; } while (*p) { a[i]=*p; i++; p++; } while(n!=0) { a[i]=‘*’; i++; n--; } a[i]=‘\0’; } 37: 第37题 某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已在主函数中给出。请编写函数fun,它的功能是:求出该学生的平均分放在记录的ave成员中。请自己定义正确的形参。 答案: void fun(STREC *p) { double av=0.0; int i: for(i=0;i<N;i++) av+=p->s[i]; av/=N; p->ave=av; } 38: 第38题 请编写函数fun,它的功能是:求出ss所指字符串中指定字符的个数,并返回此值。 答案: int fun(char *ss, char c) { int n=0; while (*ss) { if(*ss==c) n++; ss++; } return n; } 39: 第39题 请编写函数fun,该函数的功能是:移动一维数组中的内容,若数组中由n个整数,要求把下标从0到p(p小于等于n-1)的数组元素平移到数组的最后。 答案: void fun(int *w, int p, int n) { int b[N], i, j=0; for(i=0;i<=p;i++) { b[i]=w[i]; j++; } for(i=0;i<=p;i++) { w[j]=b[i]; j++; } } 40: 第40题 请编写函数fun,该函数的功能是移动字符串中内容,移动的规则如下:把第1到第m个字符,平移到字符串的最后,把第m+1到最后的字符移到字符串的前部。 答案: void fun(char *w,int m) { char b[N]; int I,j=0; for(i=0;i<m;i++) { b[j]=w[i]; j++; } for (i=0;i<strlen(w)-m;i++) w[i]=w[i+m]; for(j=0;j<m;j++) { w[i]=b[j]; i++; } w[i]=‘\0’; } 41: 第41题 请编写函数fun,该函数的功能是:将m行n列的二维数组中的字符数据,按列的顺序依次放到一个字符串中。 答案: void fun(char (*s)[n],char *b) {int i,j,k=0; for(j=0;j<n;j++) for(i=0;i<m;i++) {b[k]=*(*(s+i)+j) k++;} b[k]=‘\0’;} 42: 第42题 下列程序定义了n×n的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][n],int n),该函数的功能是:将数组右上半三角元素中的值乘以m。 答案: void fun(int a[][n],int m) {int i,j; for(j=0;j<n;j++) for(i=0;i<=j;i++) a[j]=a[j]*m;} 43: 第43题 编写一个函数,从传入的num个字符串中找出一个最长的一个字符串,并通过形参指针max传回该串地址(用****作为结束输入的标志)。 答案: char *fun(char (*a)[81],int num) {int i; char *max; max=a[0]; for(i=0;i<num;i++) if(strlen(max)<strlen(a)) max=a; return max;} 44: 第44题 编写一个函数,该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数。 答案: int fun(char *str,char *substr) {int n; char *p,*r; n=0; while(*str) {p=str; r=substr; while(*r) if(*r==*p) {r++; p++;} else break; if(*r==‘\0’) n++; str++;} return n;} 45: 第45题 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:只删除字符串前导和尾部的*号,串中字母之间的*号都不删除。形参n 给出了字符串的长度,形参h给出了字符串中前导*号的个数,形参e给出了字符串中最后的*个数。在编写时不得使用c语言给提供得字符串函数。 答案: void fun(char *a,int n,int h,int e) {int i=0; char *p; for(p=a+h;p<a+n-e;p++) {*(a+i)=*p; i++;} *(a+i)=‘\0’;} 46: 第46题 学生得记录由学号和成绩组称个,n名大学生得数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能时:按分数的高低排列学生的记录,高分在前。 答案: void fun(strec a[]) {int i,j; strec t; for(i=0;i<n-1;i++) for(j=i;s<n;j++) if(a.s<a[j].s) {t=a; a=a[j]; a[j]=t; }} 47: 第47题 请编写一个函数void fun(char *ss),其功能时:将字符串ss中所有下标为奇数位置上的字母转换为大写(若位置上不是字母,则不转换)。 答案: void fun(char *ss) {int i,n=0; char *p=ss; while(*p) {n++; p++;} for (i=0;i<n;i++) if ((ss=‘a’&ss<=‘z’)&i%2!=0) ss=ss-32; ss=‘\0’;} 48: 第48题 请编写函数fun,其功能是:将两个两位数的正整数a,b合并成一个整数放在c中。合并的方式是:将a数的十位和个位依次放在c数的千位和十位上,b数的十位和个位数依次放在c数的百位和个位上。 答案: void fun(int a,int b,long *c) {*c=(a/10)*1000+(b/10)*100+(a%10)*10+b%10;} 49: 第49题 请编写函数fun,其功能是:将s所指字符串中下标位偶数同时ascii值为奇数的字符删除,s中剩余的字符形成的新串放在t所指的数组中。 答案: void fun(char *s,char t[]) {int i,j=0,n=strlen(s); for(i=0;i<n;i++) if(i%2==0&s%2!=0) else {f[j]=s; j++;} t[j]=‘\0’;} 50: 第50题 已知学生的记录是由学号和学习成绩构成,n名学生的数据已存入a机构体数组中。请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数(规定只有一个最高分)。 答案: void fun(stu a[],stu *s) {int i,max; max=a[0].s; for (i=0;i<n;i++) if(a.s>max) {max=a.s; *s=a;}} |
计算机二级C语言上机南开100题及答案(2)
默认分类 2009-07-10 19:05 阅读1962 评论11
51: 第51题 请编写函数fun,其功能是:将所有大于1小于整数m的非素数存入xx所指的数组中,非素数的个数通过k传回。
答案:
voidfun(int m,int *k,int xx[])
{int i,j;
int t=0;
for(i=2;i<m;i++)
{j=2;
while(j<i)
{if(i%j==0)
{xx[t]=i;
t++;
break;}
j++;}
*k=t;}}
52: 第52题 编写一个函数fun,它的功能是:实现两个字符串的连接(不使用库函数strcat),即把p2所指的字符串连接到p1所指的字符串后。
答案:
voidfun(char p1[],char p2[])
{int i=0,n=0;
char *p=p1,*q=p2;
while (*p)
{p++;
n++;}
i=n;
while(*p)
{p1=*q;
q++;
i++;}
p1=‘\0’;}
53: 第53题 请编写函数fun,该函数的功能是:实现b=a+a,即把矩阵a加上a的转置,存放在矩阵b中。计算结果在main函数中输出。
答案:
voidfun(int a[3][3],int b[3][3])
{int i,j,at[3][3];
for(i=0;i<=2;i++)
for(j=0;j<=2;j++)
at[j]=a[j];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
b[j]=a[j]+at[j];}
54: 第54题 学生的记录由学号和成绩组称个,n名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把低于平均分的学生数据放在b所指的数组中,低于平均分的学生人数通过形参n传回,平均分通过函数值返回。
答案:
doublefun(strec *a, strec *b,int *n)
{double aver=0.0;
int i,j=0;
*n=0;
for (i=0;i<n;i++)
aver+=a.s;
aver/=n;
for(i=0;i<n;i++)
if(a.s<aver)
{b[j]=a;
(*n)++;
j++; }
return aver;}
55: 第55题 请编写函数fun,该函数的功能是:将m行n列的二维数组中的数据,按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参n所指的储存单元中。
答案:
voidfun(int(*s)[10],int *b,int *n,int mm,int nn)
{int i,j;
for(i=0;i<mm;i++)
for(j=0;j<nn;j++)
{b[*n]=*(*(s+i)+j);
*n=*n+1;}}
56: 第56题 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了尾部的*号之外,将字母串中其他*号全部删除。形参p已指向字符串中最后的一个字母。不使用c的字符串函数。
答案:
voidfun(char*a,char *p)
{int i=0;
char *p=a;
while(q<=p)
{if(*q!=‘*’)
{a=*q;
i++;}
q++;}
while(*q)
{a=*q;
i++;
q++;}
a=‘\0’;}
57: 第57题 学生的记录是由学号和成绩组成,n名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把指定分数范围内的学生数据放在b所指的数组中,分数范围内的学生人数由函数值返回。
答案:
intfun(strec*a,strec *b,int l,int h)
{int i,j=0;
for(i=0;i<n;i++)
if(a.s>=l&a.s<=h)
{b[j]=a;
j++;}
return j;}
58: 第58题 编写函数藏服那,它的功能是:求n以内(不包括n)同时能被3与7整除的所有自然数之和的平方根s,并作为函数值返回。
答案:
doublefun(int n)
{double s=0.0;
int i;
for(i=1;i<n;i++)
if(i%3==0&i%7==0)
s=s+i;
s=sqrt(s);
return s;}
59: 第59题 请别写函数fun,该函数的功能是:将放在字符串数组中的m个字符串(每串的长度不超过n),按顺序合并组成一个新的字符串。
答案:
voidfun(char a[m][n],char *b)
{int i,j,k=0;
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
if(*(*(a+i)+j))
{b[k]=*(*(a+i)+j)
k++;}
else
break;
b[k]=‘\0’;}}
60: 第60题 请编写函数fun,该函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。
答案:
intfun(int a[],int n)
{int i,t,j=0,*p=a;
t=p[0];
for(i=0;i<=n;i++)
if(t==p)
;
else
{a[j]=t;
t=p;
j++;}
if(i>=n)
a[j]=t;
return j;}
61: 第61题 第请编写函数fun,该函数的功能使:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中;要求函数把0至9岁年龄段的人数放在d[0]中,把10至19岁年龄段的人数放在d[1]中,把20至29岁的人数放在d[2]中,其余以此类推,把100岁(含100以上年龄的人数都放在d[10]中。结果在主函数中输出。
答案:
voidfun(int *a,int *b)
{int i,j;
for(j=0;i<m;j++)
b[j]=0;
for(i=0;i<n;i++)
if(a>=0&a<=9)
b[0]+=1;
else if(a>=10&a<=19)
b[1]+=1;
else if(a>=20&a<=29)
b[2]+=1;
else if(a>=30&a<=39)
b[3]+=1;
else if(a>=40&a<=49)
b[4]+=1;
else if(a>=50&a<=59)
b[5]+=1;
else if(a>=60&a<=69)
b[6]+=1;
else if(a>=70&a<=79)
b[7]+=1;
else if(a>=80&a<=89)
b[8]+=1;
else if(a>=90&a<=99)
b[9]+=1;
else
b[10]+=1;}
62: 第62题 请编写函数fun,该函数的功能是:统一一含字符串中单词的个数,作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格格开,一行的开始没有空格。
答案:
int fun(char *s)
{int i,n=0;
for(i=0;i<strlen(s);i++)
{if(s=‘a’&s<=‘z’&s[i+1]==‘’
‖s[i+1]==‘\0’)
n++;}
return n;}
63: 第63题 请编写一个函数fun,它的功能是:计算并输出给定整数n的所有因子(不包括1与自身)之和。规定n的值不大于1000。
答案:
intfun(int n)
{int s=0,i;
for(i=2;i<=n-1;i++)
if(n%i==0)
s+=i;
return s;}
64: 第64题 请编写函数fun,其功能是:将s所指字符串中ascii值为奇数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。
答案:
voidfun(char *s,char t[])
{int i,j=0,n;
n=strlen(s);
for(i=0;i<n;i++)
if(s%2==0)
{t[j]=s;
j++;}
t[j]=‘\0’;}
65: 第65题 请编写函数fun,其功能是:将两位数的正整数a、b合并成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的十位和千位上。
答案:
voidfun(int a,int b,long *c)
{*c=(b%10)*1000+(a/10)*100+(b/10)*10+a%10;}
66: 第66题 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中所有*号。在编写函数时,不得使用c语言提供的字符串函数。
答案:
voidfun(char *a)
{int i=0;char *p=a;
while(*p)
{if(*p!=‘*’)
{a=*p;
i++;}
p++;}
a=‘\0’;}
67: 第67题 学生的记录时由学号和成绩组成,n名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能时:函数返回指定学号的学生数据,指定的学号在主函数中输入。若没找到指定学号,在结构体变量中给学号置空串,给成绩置-1,作为函数值返回(用于字符串比较的函数时strcmp)。
答案:
strecfun(strec*,char *b)
{int i;
strec h;
for(i=0;i<n;i++)
if(strcmp(a.num,b)==0)
{h=a;
break; }
else
{h.num=="";
h.s=-1;}
return h;}
68: 第68题 请编写函数fun,其功能时:计算并输出下列多项式的值:
sn=1+1/1!+1/2!+1/3!+1/4!+…+1/n!
答案:
sn=1+1/1!+1/2!+1/3!+1/4!+...+1/n!
double fun(int n)
{double t,sn=1.0;
int i,j;
for(i=1;i<n;i++)
{t=1.0;
for(j=1;j<=i;j++)
t*j;
sn+=1.0/t;}
return sn;}
69: 第69题 请编写一个函数fun,它的功能时:求fibonacci数列中大于t的最小的一个数,结果由函数返回。其中fibonacci数列f(n)的定义为:
f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)
答案:
f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)
int fun(int t)
{int a=1,b=1,c=0,i;
for(i=4;i<=t;i++)
{if(c<t)
{c=a+b;
a=b;
b=c;}
else
break;}
return c;}
70: 第70题 编写函数fun,它的功能时:计算并输出下列级数和:
s=1/1*2+1/2*3+…+1/n(n+1)
答案:
doublefun (int n)
{double s=0.0;
int i;
for(i=1;i<=n;i++)
s=s+1.0/(i*(i+1));
return s;}
71: 第71题 请编写函数fun,其功能时:将两个两位数的正整数a、b合并形成一个整数放在c中,合并的方式是:将a数的十位和个位数依次放在c数的十位和千位上,b的十位和个位整数依次放在c数的百位和个位上。
答案:
voidfun(int a,int b,long *c)
{*c=(a%10)*1000+(b/10)*100+(a/10)*10+b%10;}
72: 第72题 请编写函数fun,其功能是:将s所指字符串中下标为偶数的字符删除,串中剩余字符形成新串放在t所指数组中。
答案:
voidfun(char *s,char t[])
{int i,j=0,n=strlen(s);
for(i=0;i<n;i++)
if(i%2!=0)
{t[j]=s;
j++;}
t[j]=‘\0’;}
73: 第73题 假定输入的字符串中只包含字母和*号,请编写函数fun,它的功能是:除了字符串前导和尾部的*号之外,将串中其他*号全部删除。形参h已指向字符串第一个字符,形参p已指向字符串中最后一个字母。在编写程序时,不得使用c语言提供的字符串函数。
答案:
voidfun(char *a,char *h,char *p)
{int i=0;
char *q=a;
while(q<h)
{a=*q;
q++;
i++;}
while(q<p)
{if(*q!=‘’*)
{a=*q;
i++;}
q++;}
while(*q)
{a=*q;
i++;
q++;}
a=‘\0’;}
74: 第74题 学生的记录由学号和成绩组成n名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能时:把分数最低的学生数据放在h所指的数组中,注意:分数最低的学生可能不止一个,函数返回分数最低的学生的人数。
答案:
intfun(strec *a,strec *b)
{int i,j=0,n=0,min;
min=a[0].s;
for(i=0;i<n;i++)
if(a.s<min)
min=a.s;
for(i=0;i<n;i++)
if(a.s==min)
{*(b+j)=a;
j++;
n++;}
return n;}
75: 第75题 请编写函数fun ,该函数的功能:将m行n列的二维数组中的数据,按列的顺学依次放到一维数组中。
答案:
voidfun(int (*s)[]10,int *b,int *n,int mm,int nn)
{int i,j;
for(j=0;j<nn;j++)
for(i=0;i<mm;i++)
{b[*n]=*(*(s+i)+j);
*n=*n+1;}}
76: 第76题 请编写函数fun,其功能时:计算并输出当x<0.97时下列多项式的值,直到|sn-s(n-1)|<0.000001为止。
Sn=1+0.5x+0.5(0.5-1)/2!x(2)+…+0.5(0.5-1)(0.5-2)…..(0.5-n+1)/n!x(n)
答案:
.doublefun(double x)
{double s1=1.0,p=1.0,sum=0.0,s0,t=1.0;
int n=1;
do
{s0=s1;
sum+=s0;
t*=n;
p*=(0.5-n+1)*x;
s1=p/t;
n++;}while(fabs(s1-s0)>1e-6);
return sum;}
77: 第77题 请编写一个函数fun,其功能是:将两个两位数的正整数ab合并形成一个整数放在c中。合并方式是:将a数的十位和个位数依次放在c数的个位和百位上,b数的十位和个位数依次放在c数的十位和千位上。
答案:
voidfun(int a,int b,long *c)
{*c=(b%10)*1000+(a%10)*100+(b/10)*10+a/10;}
78: 第78题 请编写函数fun,其功能是:将s所指字符串中ascii值为偶数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。
答案:
voidfun(char *s,char t[])
{int i,j=0,n=strlen(s);
for(i=0;i<n;i++)
if (s%2!=0)
{t[j]=s;
j++;}
t[j]=‘\0’;}
79: 第79题 已知学生的记录由学号和学习成绩构成,n名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。
答案:
voidfun(stu a[],stu *s)
{int i,min;
min=a[0].s;
for(i=0;i<n;i++)
if(a.s<min)
{min=a.s;
*s=a;}}
80: 第80题 程序定义了n×n的二维数组,并在主函数中自动赋值。请编写函数fun,该函数的功能是:使数组左下半三角元素中的值乘以n。
答案:
fun(inta[][n],int n)
{int i,j;
for(i=0;i<n;i++)
for(j=0;j<=i;j++)
a[j]=a[j]*n;}
81: 第81题 请编写函数fun,其功能使:将两个两位正整数a b合并形成一个整数放在c中。合并的方式使:将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的千位和十位上。
答案:
voidfun(int a,int b,long *c)
{*c=(b/10)*1000+(a/10)*100+(b%10)*10+a%10;}
82: 第82题 请编写一个函数fun,它的功能使:计算n门课程的平均分,计算结果作为函数值返回。
答案:
floatfun(float *a,int n)
{float ave=0.0;
int i;
for(i=0;i<n;i++)
ave+=a;
ave/=n;
return ave;}
83: 第83题 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能使:将字符串尾部的*号全部删除,前面和中间的*号不删除。
答案:
voidfun(char *a)
{int i=0;
char *p,*q;
p=q=a;
while(*p)
p++;
p--;
while(*p==‘*’)
p--;
while(q<=p)
{a=*q;
i++;
q++;}
a=‘\0’;}
84: 第84题 请编写函数fun,其功能是:将两个两位数的正整数a b合并形成一个整数放在c中,合并的方式是:将a数的十位和个位数依次放在c的个位和百位上,b数的十位和个位数依次放在c数的千位和十位上。
答案:
voidfun(int a,int b,long *c)
{c=(b/10)*1000+(a%10)*100+(b%10)*10+a/10;}
85: 第85题 n名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,它的功能是:求出平均分,由函数值返回。
答案:
doublefun(strec *h)
{double aver=0.0;
while(h!=null)
{aver+=h->s;
hy=h->next;}
aver/=n;
return aver;}
86: 第86题 请编写函数fun,计算并输出给定10个数的方差。
答案:
doublefun(double x[10])
{int i,j;
double s=0.0,s1=0.0;
for(i=0;i<10;i++)
s1+=x;
s1/=10;
for(j=0;j<10;j++)
s+=(x[j]-s1)*(x[j]-s1);
s/=10;
s=pow(s,0.5);
return s;}
87: 第87题 请编写函数fun,其功能是:将两个两位数的正整数a b合并形成一个整数放在c 中。合并的方式是:将a数的十位和个位数依次放在c数的千位和十位上,b数的十位和个位数依次放在c数的个位和百位上。
答案:
voidfun(int a,int b,long *c)
{*c=(a/10)*1000+(a%10)*10+(b%10)*100+b/10;}
88: 第88题 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导的*号之外,将串中其他*号全部删除。在编写函数亚时,不得使用c语言提供的字符串函数。
答案:
voidfun(char *a)
{int i=0;
char *p=a;
while(*p&&*p==‘*’)
{a=*p;
i++;
p++;}
while(*p)
{if(*p!=‘*’)
{a=*p;
i++;}
p++;}
a=‘\0’;}
89: 第89题 学生的记录是由学号和成绩组成,n名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把高于等于平均分的学生数据放在b所指的数组中,高于等于平均分的学生人数通过形参n传回,平均分通过函数值返回。
答案:
doublefun(strec *a,strec *b,int *n)
{double aver=0.0;
int i,j=0;
for(i=0;i<n;i++)
aver+=a.s;
aver/=n;
for(i=0;i<n;i++)
if(a.s)>=aver}
{*(b+j)=a;
j++;}
*n=j;
return aver;}
90: 第90题 请编写函数fun,其功能是:计算并输出下列多项式值:sn=(1-1/2)+(1/3-1/4)+…+(1/(2n-1)1/2n).
答案:
sn=(1-1/2)+(1/3-1/4)+...+(1/(2n-1)1/2n).
double fun(int n)
{int i;
double sn=0.0;
for(i=1;i<=n;i++)
sn+=(1.0/(2*i-1)-1.0/(2*i));
return sn;}
91: 第91题 请编写函数fun,其功能是:将两个两位数的正整数a b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c的十位和千位上,b数的十位和个位数依次放在c数的个位和百位上。
答案:
voidfun(int a, int b, long *c)
{
*c=(a%10)*1000+(b%10)*100+(a/10)*10+b/10;
}
92: 第92题 请编写函数fun,它的功能是计算:s=(ln(1)+ln(2)+ln(3)+…+ln(m))(0.5),s作为函数值返回。
答案:
doublefun(int m)
{
int I;
double s=0.0, log(double x);
for(i=1;i<=m;i++)
s=s+log(i);
s=sqrt(s);
return s;
}
93: 第93题 请编写函数fun,它的功能是计算下列级数和,和值由函数值返回。
S=1+x+x(2)/2!+x(3)/3!+…x(n)/n!
答案:
doublefun(double x, int n)
{
double s=1.0, p=1.0;
int I,j,t;
for(i=1;i<=n;i++)
{
t=1;
for(j=1;j<=i;j++)
t=t*j;
p=p*x;
s=s+p/t;
}
return s;
}
94: 第94题 规定输入字符串中只包含字母和*号。请编写函数fun,它的功能是:将函数字符串中的前导*号全部删除,中间和尾部的*号不删除。
答案:
voidfun(char *a)
{
int i=0;
char *p=a;
while(*p&&*p==‘*’)
p++;
while(*p)
{
a[i]=*p;
i++;
p++;
}
a[i]=‘\0’;
}
95: 第95题 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:使字符串的前导*号不得多于n个;若多于n个,则删除多于的*号;若少于或等于n个,则什么也不做。字符串中间和尾部的*号不删除。
答案:
voidfun(char *a, int n)
{
int i=0,k=0;
char *t=a;
while(*t==‘*’)
{
k++;
t++;
}
t=a;
if(k>n)
t=a+k-n;
while( *t)
{
a[i]=*t;
i++;
t++;
}
a[i]=‘\0’;
}
96: 第96题 请编写函数fun,其功能使:计算并输出给定数组(长度为9)中每相邻两个元素之平均值的平方根之和。
答案:
doublefun(double x[9])
{
double sum=0.0;
int I,j=1;
for(i=0;i<9;i++)
if(j<=8)
{
sum+=sqrt((x[i]+x[i+1])/2.0);
j++;
}
return sum;
}
97: 第97题 请编写函数fun,其功能是:计算并输出下列多项式值:
s=1+1/(1+2)+1/(1+2+3)+..1/(1+2+3…+50)
答案:
doublefun(int n)
{
int I,j;
double sum=0.0, t;
for(i=1;i<=n;i++)
{
t=0.0;
for(j=1;j<=I;j++)
t+=j;
sum+=1.0/t;
}
return sum;
}
98: 第98题 请编写函数fun,它的功能是:计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和。
答案:
doublefun(int n)
{
int I;
double sum=0.0;
for(i=1;i<=n;i++)
if(i%5==0 || i%9==0)
sum+=1.0/I;
return sum;
}
99: 第99题 请编写函数fun ,其功能是:计算并输出3到n之间所有素数的平方根之和。
答案:
doublefun(int n)
{
int m,k,I;
double s=0.0;
for(m=3;m<=n;m++)
{
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0) break;
if(i>=k+1)
s+=sqrt(m);
}
return s;
}
100: 第100题 请编写函数fun,其功能是:计算并输出s=1+(1+2(0.5))+(1+2(0.5)+3(0.5))+…+(1+2(0.5)+3(0.5)+…+n(0.5))
答案:
doublefun(int n)
{
int I;
double =1.0,p=1.0;
for(i=2;i<=n;i++)
{
p+=pow(I,0.5);
s+=p;
}
return s;
}