资源描述
编程题复习方法:
做编程题时,先别着急动手,一定认真把题意理解清楚,在纸上写出解题方法和关键语句(用到什么算法),最后按照输入数据-〉处理数据-〉输出数据的流程实现主程序和相关函数。(按步骤给分,人工阅卷)编写程序时一定要注意格式,要有缩进或退格。
1、 定义类的框架
2、 成员函数的实现
3、 在主函数中测试类
具体实现的公式:
class 类名{
private: 私有数据成员;
public: 数据成员;
成员函数;(构造函数和析构函数)
};
类名::类名(){ //构造函数
}
成员函数的个数与类中的个数相同,函数名前加类名::
void main(){
类名 对象名( 参数 );//是否带参数取决于构造函数
}
构造函数的定义方法
① 数据成员是内置类型变量,直接用该类型的形参变量初始化数据成员。
class A{
int i;
public: A(int x){ i=x;}
};
②数据成员是一维数组,通过一个for循环将形参数组元素初始化一维数组成员。
class A{
int t[5];
public: A(int b[],int n){
for(int i=0;i<n;i++)
t[i]=b[i]; }
};
③数据成员是二维数组,通过双重循环将形参数组元素初始化二维数组成员。
class A{
int t[3][4];
public: A(int b[][4],int n){
for(int i=0;i<n;i++)
for(int j=0;j<4;j++)
t[i][j]=b[i][j]; }
};
④数据成员是一维字符数组,可以用字符串拷贝函数strcpy,将形参字符数组中的字符串,初始化字符数组成员。
#include <iostream.h>
#include <string.h>
class A{
char t[100];
public: A(char b[ ]){ strcpy(t,b); }
};
⑤数据成员是字符类型指针变量,先用new动态申请长度为[形参指针指向的字符串长度+1]的内存空间,把返回的首地址赋给指针成员,再把形参指向字符串拷贝到动态数组中。
#include <iostream.h>
#include <string.h>
class A{
char *s;
public: A(char *b){
if(b) {
s=new char[strlen(b)+1];
strcpy(s,b);
}
}
};
⑥数据成员是数值类型指针变量,先用new动态申请长度为[形参数组长度]的内存空间,把返回的首地址初始化指针成员,再把形参数组元素循环赋给动态数组元素。
#include <iostream.h>
class A{ int *s;
public: A(int b [10]){
s=new int[10];
int i;
for(i=0;i<10;i++)
s[i]=b[i]; }
};
编程的基本类型题分析:
一、学生成绩
2016春VC01
(1)排序算法
(2)四舍五入算法int(x+0.5)保留整数
int((x*10+0.5)/10.0 保留小数点后一位
int((x*100+0.5)*100)/100.0 保留小数点后两位
(3)友元函数的定义和调用
(4)字符串拷贝函数
【题目】试定义一个实现计算学生课程成绩的类STU,对学生学期总评成绩进行计算并排序。具体要求如下:
(1) 私有数据成员
int norm, ex, final,overall:分别表示平时成绩、实验成绩、期末考试和总评成绩。
char name[15]:学生姓名。
(2) 公有成员函数
void init(char *name1, int nor1, int ex1, int fin1):用参数name1,nor1,exp1,fin1分别初始化成员name,norm, ex, final。
void fun( ):计算学生的总评成绩。计算方法为:总评成绩=平时成绩占*20%+实验成绩占*25%+期末成绩占*55%。总评成绩计算时要求四舍五入,并且期末考试成绩不足50分时,则期末考试成绩即为总评成绩。
friend void sort(STU st[], int n):友元函数,对st按总评成绩进行从大到小排序。
void print( ):输出该学生信息。
(3) 在主函数中先定义一个有5个元素的对象数组,用循环语句输入学生信息,并根据这些信息利用成员函数init()更新学生信息,然后使用函数sort()对数组排序,最后输出排序后的学生信息。
输入/输出示例(下划线部分为键盘输入):
请输入姓名、平时成绩、实验成绩、期末成绩:AAA 82 75 58
请输入姓名、平时成绩、实验成绩、期末成绩:BBB 93 60 84
请输入姓名、平时成绩、实验成绩、期末成绩:CCC 67 82 81
请输入姓名、平时成绩、实验成绩、期末成绩:DDD 54 78 51
请输入姓名、平时成绩、实验成绩、期末成绩:EEE 91 52 41
按总评成绩排序后:
姓名 平时成绩 实验成绩 期末成绩 总评成绩
BBB 93 60 84 80
CCC 67 82 81 78
AAA 82 75 58 67
DDD 54 78 51 58
EEE 91 52 41 41
2016秋VC02编程题
四舍五入算法 int(x+0.5)保留整数
int((x*10+0.5)/10.0 保留小数点后一位
int((x*100+0.5)*100)/100.0 保留小数点后两位
【题目】假设二维数组的一行代表一名学生课程情况记录,前5列为考勤记录(出勤值为1,缺勤值0),第6~10列为作业得分记录(5分制),第11列为实验考核成绩,第12列为期末考试成绩。学生课程总评成绩的计算式为(四舍五入保留整数):平时成绩*20%+实验成绩*30%+期末考试成绩*50%,其中,平时成绩计算方法为:出勤一次记10分,作业每得1分,平时成绩记2分。例如,设有如下学生课程情况记录:
考勤1
考勤2
考勤3
考勤4
考勤5
作业1
作业2
作业3
作业4
作业5
实验
期末
总评
1
1
1
1
0
4
4
5
2
4
90
89
1
0
1
1
1
4
3
4
3
4
85
75
1
1
0
1
1
3
4
5
2
4
95
80
表中第一行学生的平时成绩计算为:(1+1+1+1+0)*10+(4+4+5+2+4)*2=78,则其总评成绩计算为78*0.2+90*0.3+89*0.5=87.1,总评成绩四舍五入计为87分。
试定义一个类Array,根据上述要求计算学生的总评成绩。具体要求如下:
(1)私有成员:
l int a[3][13]: 学生课程情况记录数组。
(2)公有成员:
l Array (float t[][13], int n): 构造函数,用参数t初始化成员数组a,参数n为t的行数。
l int sum(int k): 辅助函数,计算并返回成员数组a的第k行学生的平时成绩。
l void fun( ): 根据题意计算每个学生的总评成绩。
l void print( ): 按示例格式输出每个学生的信息。注意总评成绩结果要四舍五入。
(3)在主函数中给定原始数组(可利用题目中的样例数据,总评成绩暂定为0),并用该数组对类Array进行测试。
输出示例:
考勤: 1,1,1,1,0,
作业: 4,4,5,2,4,
平时成绩: 78 实验: 90 期末: 89 总评: 87
考勤: 1,0,1,1,1,
作业: 4,3,4,3,4,
平时成绩: 76 实验: 85 期末: 75 总评: 78
考勤: 1,1,0,1,1,
作业: 3,4,5,2,4,
平时成绩: 76 实验: 95 期末: 80 总评: 84
【要求】
打开T盘中myfc.cpp文件(空文件),编写后的源程序文件myfc.cpp必须保存在T盘的根目录下,供阅卷用。
1.答案
#include<iostream.h>
#include <string.h>
class STU{
private:
int norm,ex,final,overall;
char name[15];
public:
void init(char *name1,int norm1,int ex1,int fin1);
void fun();
friend void sort(STU st[],int n);
void print();
};
void STU::init(char *name1,int norm1,int ex1,int fin1){
strcpy(name,name1);
norm=norm1;ex=ex1;final=fin1;
overall=0;
}
void STU::fun(){
if(final>=50)
overall=int(norm*0.2+ex*0.25+final*0.55+0.5);
else overall=int(final+0.5);
}
void sort(STU st[],int n){
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
if(st[i].overall<st[j].overall) {
STU t; t=st[i];st[i]=st[j];st[j]=t;
}
}
void STU::print(){
cout<<name<<'\t'<<norm<<'\t'<<ex<<'\t'<<final<<'\t'<<overall<<endl;
}
void main(){
STU s[3];
char name[100];
int norm,ex,fin;
for(int i=0;i<3;i++) {
cout<<"请输入姓名、平时成绩、实验成绩、期末成绩:"<<endl;
cin>>name>>norm>>ex>>fin;
s[i].init(name,norm,ex,fin);
s[i].fun();
}
cout<<"按总评成绩排序后:\n姓名 平时成绩 实验成绩 期末成绩 总评成绩"<<endl;
sort(s,3);
for(i=0;i<3;i++) {
s[i].print();
}
}
2.答案
#include <iostream>
using namespace std;
class Array{
private:
int a[3][13];
public:
Array(float t[][13],int n);
int sum(int k);
void fun();
void print();
};
Array::Array(float t[][13],int n){
for(int i=0;i<n;i++)
for(int j=0;j<13;j++)
a[i][j]=t[i][j];
}
int Array::sum(int k){
int s1=0,s2=0,s=0;
for(int i=0;i<5;i++)
s1+=a[k][i];
for( i=5;i<10;i++)
s2+=a[k][i];
s=s1*10+s2*2;
return s;
}
void Array::fun(){
for(int i=0;i<3;i++)
a[i][12]=int(sum(i)*0.2+a[i][10]*0.3+a[i][11]*0.5+0.5);
}
void Array::print(){
for(int i=0;i<3;i++){
cout<<"考勤:";
for(int j=0;j<5;j++)
cout<<a[i][j]<<',';
cout<<endl;
cout<<"作业:";
for(j=5;j<10;j++)
cout<<a[i][j]<<',';
cout<<endl;
cout<<"平时成绩:"<<sum(i)<<'\t';
cout<<"实验成绩:"<<a[i][10]<<'\t';
cout<<"期末成绩:"<<a[i][11]<<'\t';
cout<<"总评成绩:"<<a[i][12]<<'\t';
cout<<endl;
}
}
void main(){
float b[3][13]={{1,1,1,1,0,4,4,5,2,4,90,89},{1,0,1,1,1,4,3,4,3,4,85,75},{1,1,0,1,1,3,4,5,2,4,95,80}};
Array arr(b,3);
arr.fun();
arr.print();
}
二、二维数组问题
2016春VC02
1.素数算法,
2.从大到小排序算法
3.数据交换
【题目】试定义一个类Array,首先求各列元素中的合数(非素数)之和,再将数组各列以其合数之和的大小从大到小排序,具体要求如下:
(1) 私有数据成员
int a[4][5]:需要排序的二维数组。
(2) 公有成员函数
Array(int t[][5], int n):构造函数,用参数t初始化成员数组a,n表示数组t的行数。
int p(int n):判断整数n是否为合数,如果是合数,返回值为1,否则返回值为0。
int sum_p(int j):求数组a第j列元素中所有合数之和。
void exch(int j1, int j2):交换数组a的第j1, j2列元素。
void fun():根据题意对二维数组进行列排序。
void print():以矩阵的形式输出成员数组。
(3) 在主函数中定义一个二维数组,并使用该数组对类Array进行测试。
输出示例:
原数组:
10 12 5 4 15
16 17 8 19 10
11 12 13 14 15
16 70 18 19 20
排序后的数组:
12 15 10 5 4
17 10 16 8 19
12 15 11 13 14
70 20 16 18 19
2015秋VC03
1.素数算法,
2.从大到小排序算法
3.数据交换
【题目】试定义一个类Array,将二维数组各行按其各行元素中所有素数之和从大到小排序,具体要求如下:
(1) 私有数据成员
l int a[5][4]:待处理的数组。
(2) 公有成员函数
l Array(int t[][4], int n):构造函数,用参数t初始化成员数组a,n为数组t的行数。
l int prime(int n):判断整数n是否为素数,如果是素数,返回值为1,否则返回值为0。
l int sum_prime(int i):求数组a中第i行元素中所有素数之和。
l void exch(int i1, int i2):交换数组a的第i1, i2行元素。
l void fun( ):根据题意对二维数组进行行排序。要求排序过程中交换数据时使用成员函数exch()。
l void print( ):以矩阵的形式输出成员数组。
(3) 在主函数中定义一个二维数组,并使用该数组对类Array进行测试。
输出示例:
原数组:
10 12 5 4
15 16 17 8
19 10 11 12
13 14 15 16
70 18 19 20
排序后的数组:
19 10 11 12
70 18 19 20
15 16 17 8
13 14 15 16
10 12 5 4
【要求】
打开T盘中myfc.cpp文件(空文件),编写后的源程序文件myfc.cpp必须保存在T盘的根目录下,供阅卷用。
2016秋VC04
1.从大到小排序算法
2.数据交换
【题目】试定义一个类Array,将二维数组各行按其各行元素中最大值的大小排序,具体要求如下:
(1) 私有数据成员
l int a[5][4]:需要排序的数组。
(2) 公有成员函数
l Array(int t[][4], int n):构造函数,用参数t初始化成员数组a,n为数组t的行数。
l int max(int *p,int n):求指针p所指向的一维数组中n个元素的最大值。
l void exch(int i1, int i2):交换数组a的第i1, i2行。
l void fun():根据题意对二维数组进行行排序。提示:利用成员函数max()计算每行的最大元素。
l void print():以矩阵的形式输出成员数组a。
(3) 在主函数中定义一个二维数组,并使用该数组对类Array进行测试。
输出示例:
原数组:
10 12 5 4
15 16 17 8
19 10 11 12
13 14 15 16
70 18 19 20
排序后的数组:
70 18 19 20
19 10 11 12
15 16 17 8
13 14 15 16
10 12 5 4
2016秋VC05编程题
1.奇数与偶数
2.选择排序
【题目】试定义一个类Array,实现对二维数组进行按行排序的功能。要求奇数行中的元素按升序排列,偶数行中的元素按降序排列(下标从0开始计数)。具体要求如下:
(1)私有成员:
l int a[4][5]: 需要排序的数组。
(2)公有成员:
l Array(int t[][5], int n): 构造函数,用参数t初始化成员数组a,参数n为t的行数。
l void sort(int *p, int n, int f): 辅助函数,对指针p所指向的数组排序。其中,n为数组p中元素的个数;当参数f的值为奇数时按升序排序,否则按降序排序。
l void fun( ): 根据题意多次调用sort( )函数实现成员数组a的排序。
l void print( ): 按矩阵形式输出成员数组。
(3)在主函数中给定原始数组,并用该数组对类Array进行测试。要求输出处理前和处理后的数组。
输出示例:
原数组:
1 3 9 5 6
7 6 7 5 7
2 5 4 5 6
7 1 5 4 5
处理后数组:
9 6 5 3 1
5 6 7 7 7
6 5 5 4 2
1 4 5 5 7
【要求】
打开T盘中myfc.cpp文件(空文件),编写后的源程序文件myfc.cpp必须保存在T盘的根目录下,供阅卷用。
1.答案
#include <iostream.h>
class Array{
private:
int a[4][5];
public:
Array(int t[][5],int n);
int p(int n);
int sum_p(int j);
void exch(int j1,int j2);
void fun();
void print();
};
Array::Array(int t[][5],int n){
for(int i=0;i<n;i++)
for(int j=0;j<5;j++)
a[i][j]=t[i][j];
}
int Array::p(int n){
for(int i=2;i<n;i++)
if(n%i==0) break;
if(i==n) return 0;
return 1;
}
int Array::sum_p(int j){
int s=0;
for(int i=0;i<4;i++)
if(p(a[i][j])==1)
s+=a[i][j];
return s;
}
void Array::exch(int j1,int j2){
for(int i=0;i<4;i++) {
int d;
d=a[i][j1];
a[i][j1]=a[i][j2];
a[i][j2]=d;
}
}
void Array::fun(){
for(int i=0;i<4;i++){
for(int j=i+1;j<5;j++)
if(sum_p(i)<sum_p(j))
exch(i,j);
}
}
void Array::print (){
for(int i=0;i<4;i++) {
for(int j=0;j<5;j++)
cout<<a[i][j]<<'\t';
cout<<endl;
}
}
void main(){
int a[4][5]={10,12, 5, 4,15,6,17, 8,19,10,11,12, 13,14,15,16,70,18,19, 20};
Array arr(a,4);
cout<<"原数组:"<<endl;
arr.print();
arr.fun();
cout<<"排序后的数组:"<<endl;
arr.print();
}
2.答案
#include <iostream.h>
class Array{
private:
int a[5][4];
public:
Array(int t[][4],int n);
int prime(int n);
int sum_prime(int i);
void exch(int i1,int i2);
void fun();
void print();
};
Array::Array(int t[][4],int n){
for(int i=0;i<n;i++)
for(int j=0;j<4;j++)
a[i][j]=t[i][j];
}
int Array::prime (int n){
for(int i=2;i<n;i++)
if(n%i==0) return 0;
return 1;
}
int Array::sum_prime (int i){
int s=0;
for(int j=0;j<4;j++)
if(prime(a[i][j]))
s+=a[i][j];
return s;
}
void Array::exch(int i1,int i2){
for(int j=0;j<4;j++)
{
int d=a[i1][j];
a[i1][j]=a[i2][j];
a[i2][j]=d;
}
}
void Array::fun (){
for(int i=0;i<4;i++)
for(int j=i+1;j<5;j++)
if(sum_prime(i)<sum_prime(j))
exch(i,j);
}
void Array::print(){
for(int i=0;i<5;i++)
{
for(int j=0;j<4;j++)
cout<<a[i][j]<<'\t';
cout<<endl;
}
}
void main(){
int b[5][4]={10,12,5,4,15,16,17,8,19,10,11,12,13,14,15,16,70,18,19,20};
Array arr(b,5);
cout<<"原数组:";
cout<<endl;
arr.print();
arr.fun();
cout<<"排序后的数组:";
cout<<endl;
arr.print();
}
3.答案
#include <iostream.h>
class Array{
private:
int a[5][4];
public:
Array(int t[][4],int n);
int max(int *p,int n);
void exch(int i1,int i2);
void fun();
void print();
};
Array::Array(int t[][4],int n){
for(int i=0;i<n;i++)
for(int j=0;j<4;j++)
a[i][j]=t[i][j];
}
int Array::max(int *p,int n){
int s=0;
for(int i=0;i<n;i++)
s+=p[i];
return s;
}
void Array::exch(int i1,int i2){
for(int j=0;j<4;j++)
{
int d=a[i1][j];
a[i1][j]=a[i2][j];
a[i2][j]=d;
}
}
void Array::fun (){
for(int i=0;i<4;i++)
for(int j=i+1;j<5;j++)
if(max(a[i],5)<max(a[j],5))
exch(i,j);
}
void Array::print (){
for(int i=0;i<5;i++) {
for(int j=0;j<4;j++)
cout<<a[i][j]<<'\t';
cout<<endl;
}
}
void main(){
int b[5][4]={10,12,5,4,15,16,17 ,8,19,10,11,12,13 ,14,15,16,70 ,18,19, 20};
Array arr(b,5);
cout<<"原数组:"<<endl;
arr.print ();
arr.fun();
cout<<"排序后数组:"<<endl;
arr.print ();
}
4.答案
#include <iostream.h>
class Array{
private:
int a[4][5];
public:
Array(int t[][5],int n);
void sort(int *p,int n,int f);
void fun();
void print();
};
Array::Array(int t[][5],int n){
for(int i=0;i<n;i++)
for(int j=0;j<5;j++)
a[i][j]=t[i][j];
}
void Array::sort(int *p,int n,int f){
if(f%2==1){
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
if(p[i]<p[j]){
int t=p[i];p[i]=p[j];p[j]=t;
}
}
else for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
if(p[i]>p[j]){
int t=p[i];p[i]=p[j];p[j]=t;
}
}
void Array::fun(){
for(int i=0;i<4;i++)
sort(a[i],5,i+1);
}
void Array::print(){
for(int i=0;i<4;i++){
for(int j=0;j<5;j++)
cout<<a[i][j]<<'\t';
cout<<endl;
}
}
void main(){
int b[4][5]={1,3,9,5,6,7,6,7,5,7,2,5,4,5,6,7,1,5,4,5};
Array arr(b,4);
cout<<"原数组:"<<endl;
arr.print();
arr.fun ();
cout<<"处理后的数组:"<<endl;
arr.print ();
}
三、数学问题
2016春VC03
二分法求方程的解
【题目】用二分法求方程f(x)=ax2+bx+c=0在区间[x1, x2]内的一个解的迭代算法如下(假设f(x)在区间[x1, x2]内单调):
(1)如果f(x1)*f(x2)>0,则方程在区间[x1, x2]上无解;
(2)令x=(x1+x2)/2;
(3)如果f(x)*f(x1)>0,方程的解在区间[x, x2]上,则令x1=x;否则,解在区间[x1, x],令x2=x;
(4)重复步聚(2)、(3)直到f(x)满足精度要求。
试定义一个类EQU,实现利用二分法求方程ax2+bx+c=0在区间[x1, x2]内的一个解。具体要求如下:
(1) 私有数据成员
l float a,b,c:存储方程的系数a,b和c。
l double x1, x2, x:x为方程在区间[x1, x2]上的解。
l int k:如果在区间[x1, x2]内方程有解,则k值为1,否则k值为0;
(2) 公有成员函数
l EQU(float a1, float b1, float c1):用参数a1,b1,c1分别初始化成员a,b,c。
l void fun(double xx1, double xx2, double e):求方程ax2+bx+c=0在区间[xx1, xx2]内的一个解x,要求最终误差|f(x)|<e。
l void print():若方程有解,则输出所求得的解;若无解,则输出“方程在给定区间内无解”。
(3) 在主函数中首先输入方程的系数、区间和误差要求,建立EQU对象并初始化,然后调用fun()函数求出方程的解,最后调用print()函数输出所求得的解。
正确程序的输入/输出结果如下(下划线部分为键盘输入):
请输入方程的系数(a,b,c):1 5 -4
请输入区间([x1,x2])边界:0 10
请输入误差要求(e):0.00001
该方程在区间[0,10]中的解是:0.701561
1.答案
#include <iostream.h>
#include <math.h>
class EQU{
private:
float a,b,c;
double x1,x2,x;
int k;
public:
EQU(float a1,float b1,float c1);
void fun(double xx1,double xx2,double e);
void print();
};
EQU::EQU(float a1,float b1,float c1){
a=a1,b=b1;c=c1;
}
void EQU::fun(double xx1,double xx2,double e){
x1=xx1;x2=xx2; double f;
double f1=a*x1*x1+b*x1+c;
double f2=a*x2*x2+b*x2+c;
if(f1*f2>0) k=0;
else do{
x=(x1+x2)/2;
f=a*x*x+b*x+c;
if(f*f1>0) x1=x;
else x2=x;
}while(fabs(f)>e);
k=1;
}
void EQU::print(){
if(k==1){
cout<<x<<endl;
}
else cout<<"方程在给定区间内无解"<<endl;
}
void main(){
float a
展开阅读全文