近几年C++(上)上机题选编
第一部分 编程题
一、编程题
用π/4=1-1/3+1/5-1/7+……公式求π的近似值,直到最后一项的绝对值小于10-6为止。
#include <iostream>
#include <math.h>
using namespace std;
int main(){
double t=1.0;
double flag=1;
double result=0;
while(fabs(flag/t)>=1e-6){
double s=flag/t;
result=result+s;
t+=2.0;
flag*=-1;
}
cout<<"pi="<<4*result<<endl;
return 0;
}
二、编程题
从键盘读入一组数据形成一个二维数组,将每列元素之和以及它的所有因子输出到屏幕上。因子为含1而不含该数本身。
执行本程序时,从键盘输入下列数据:
4 11 10
7 8 3
5 9 12
#include <iostream>
#include <math.h>
using namespace std;
int main(){
int a[3][3];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
cin>>a[i][j];
}
}
int col[sizeof(a[0])/sizeof(int)]={0};
int k=0;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
col[k]+=a[j][i];
}
k++;
}
for(int i=0;i<k;i++){
cout<<"col["<<i<<"]="<<col[i]<<endl;
for(int j=1;j<=col[i];j++){
if(col[i]%j==0&&j!=1&&j!=col[i]){
cout<<j<<" ";
}
}
cout<<endl;
}
return 0;
}
三、编程题
利用级数展开式计算x的幂级数。
sin(x)=
要求:
(1) 定义函数long f(long n)用于计算阶乘n!。
(2) 定义函数double sn(double x, int n),用于计算sin(x)级数展开式前n项的和值并返回结果。
(3) 主函数负责输入输出。从键盘输入x(1<|x|<5)值; 调用函数sn( )计算当n=12时的sin(x)近似值,返回后输出计算结果。
(4) 输出格式为sin(<x值>) = <结果值>。
#include <iostream>
#include <math.h>
using namespace std;
long f(long n){
long result=1;
long i=1;
for(;i<=n;i++){
// cout<<"i="<<i<<endl;
result*=i;
}
return result;
}
double sn(double x, int n){
double result=0;
double flag=1;
for(int i=1;i<=n;i++){
// cout<<"i="<<i<<endl;
double fm=(double)f(2*i-1);
// cout<<"fm="<<(2*i-1)<<"!="<<fm<<endl;
result+=(flag/fm)*pow(x,2*i-1);
// cout<<"result="<<result<<endl;
// cout<<"flag="<<flag<<endl;
flag*=-1;
// cout<<endl;
}
return result;
}
int main(){
double x=0;
int n=0;
cout<<"x=";
cin>>x;
cout<<"n=";
cin>>n;
cout<<endl;
cout<<"sin("<<x<<")级数形式的前"<<n<<"项和为:"<<sn(x,n)<<endl;
}
四、编程题
要求:
(1)设计一个函数Max(…),参数为三个整型变量a、b和c,功能是求出并返回这三者中的最大值。
(2)在主函数中试建立一个4行N列的二维整型数组data,并赋初值给第0行、第1行和第2行,其中N是宏定义的标识符,其值不小于5。
(3)调用函数Max(…)求各列三个元素中的最大值,将结果存入第3行该列的变量中。
(4)按4行N列的格式输出数组data的数据,并控制每列数据对齐。
#include <iostream>
#include <math.h>
#define N 5
using namespace std;
int Max(int a,int b,int c){
if(a<b){
return b<c?c:b;
}else{
return a<c?c:a;
}
}
int main(){
int data[4][N]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{0,0,0,0,0}};
for(int k=0;k<N;k++){
data[3][k]=Max(data[0][k],data[1][k],data[2][k]);
}
cout.setf(ios::left);
for(int i=0;i<4;i++){
for(int j=0;j<N;j++){
cout.width(8);
cout<<data[i][j];
}
cout<<endl;
}
return 0;
}
五、编程题
要求
(1)设计一个函数ComDivisor(…),参数为两个整型变量a和b,功能是计算a和b的最大公约数,并返回计算结果。
(2)在主函数中试建立一个3行N列的二维整型数组data,并赋初值给第0行和第1行,其中N是宏定义的标识符,其值不小于5。
(3)调用函数ComDivisor (…)求各列两个元素的最大公约数,将结果存入第2行该列的变量中。
(4)按3行N列的格式输出数组data的数据,并控制每列数据对齐。
#include <iostream>
#include <math.h>
#define N 5
using namespace std;
int ComDivisor(int x,int y){
int z = y;
while(x%y!=0)
{
z = x%y;
x = y;
y = z;
}
return z;
}
int main(){
int data[3][N]={{1,2,3,4,5},{2,3,4,5,6},{0,0,0,0,0}};
for(int k=0;k<N;k++){
data[2][k]=ComDivisor(data[0][k],data[1][k]);
}
cout.setf(ios::left);
for(int i=0;i<3;i++){
for(int j=0;j<N;j++){
cout.width(8);
cout<<data[i][j];
}
cout<<endl;
}
return 0;
}
六、编程题
要求:
1.定义一个函数int digit(int x),功能是分别取x的最高位数字a,和x的最低位数字b,然后交换a和b的位置(如:对3568处理得到8563)。先检查x值,若x为4位数则返回处理结果,否则返回0。
2.主函数负责测试。从键盘输入5个各不相同的4位正整数,调用函数digit 对数据进行处理。若返回结果非0,则屏幕输出返回的结果信息,若返回0则提示重新输入一个数进行处理。
3.输出格式为:Swap(<x值>) = <结果值>。
#include <iostream>
#include <math.h>
using namespace std;
int digit(int x){
if(x/10000==0&&x/1000!=0){
int left=x/1000;
int right=x%10;
x=x-left*1000+right*1000-right+left;
return x;
}else{
return 0;
}
}
int main(){
int k=1;
while(k<=5){
cout<<"第"<<k<<"个数为:";
int t;
cin>>t;
if(digit(t)==0){
cout<<"Error! Input Again!"<<endl;
}else{
cout<<"Swap("<<t<<")="<<digit(t)<<endl;
k++;
}
}
return 0;
}
七、编程题
设计程序,输入10个大于1的整数,放到一数组中,设计函数实现判断数组的数据是否素数,如果不是,置为0。主函数中,输出所有这些素数的乘积,否则,输出“没有素数!“。
提示:
(1) 判断素数的函数is_element( int a[10])形参是整个数组,函数的功能是把非素数数据的值变为0,不返回任何值。
(2) 主函数中,设计for循环进行乘积统计,并输出乘积,若乘积为0则输出“没有素数。”
(3) 判断是否素数的函数中,只要判断从2开始到数据的开方根间的数都不能整除该数据就能判断其是素数。而要使用开方根函数sqrt() ,必须在程序开始位置,包含头文件<math.h>
#include <iostream>
#include <math.h>
using namespace std;
int ss(int t){
int tag=1;
for(int i=2;i<=sqrt(t);i++){
if(t%i==0){
tag++;
}
}
if(tag==1){
return 1;
}else{
return 0;
}
}
void is_element(int a[10]){
for(int i=0;i<10;i++){
if(ss(a[i])==0){
// cout<<"原值:"<<a[i]<<" ";
a[i]=0;
// cout<<"现值:"<<a[i]<<endl;
}
}
}
int main(){
int a[10]={1,2,3,4,5,6,7,8,9,10};
is_element(a);
int result=1;
int flag=-1;
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
if(a[i]!=0){
flag=1;
result*=a[i];
}
}
cout<<endl;
if(flag==-1){
cout<<"没有素数!"<<endl;
}else{
cout<<"所有素数之积为:"<<result<<endl;
}
return 0;
}
八、编程题
设计程序,读入一组整数到一个一维数组中(输入0结束),找出其中最大的偶数和最大的奇数,若这组数中没有偶数(奇数)时应给出"此数组中没有偶数(奇数)"的提示。
提示:
1.编写主函数main( ),建一个数组x[100],设计一个for循环读入数组元素并判断所读入元素的值,当读入元素为0时跳出循环。
2.再设计一个for循环判断第一个for循环读入元素的奇偶性并找出其中偶数(奇数)的最大值。
3.可设两个变量k,l用来纪录偶数(奇数)的最大值和判定没有偶数(奇数)。
#include <iostream>
#include <math.h>
using namespace std;
int main(){
int x[100];
int cnt=0;
fill(x,x+100,-1);
cout<<"初始数组为:"<<endl;
for(int i=0;i<100;i++){
cout<<x[i]<<" ";
}
cout<<endl;
cout<<"Begin:"<<endl;
for(int i=0;i<100;i++){
int t;
cin>>t;
if(t==0){
break;
}else{
x[i]=t;
cnt++;
}
}
cout<<"操作后数组为:"<<endl;
for(int i=0;i<100;i++){
cout<<x[i]<<" ";
}
cout<<endl;
int ji=0,ou=0;
int I,K;
for(int i=0;i<cnt;i++){
if(x[i]%2==0){
if(ou==0){
K=x[i];
}
if(K<x[i]){
K=x[i];
}
ou++;
}else{
if(ji==0){
I=x[i];
}
if(I<x[i]){
I=x[i];
}
ji++;
}
}
cout.setf(ios::left);
cout.width(15);
cout<<"奇数个数为:";
cout.width(15);
cout<<ji<<endl;
cout.width(15);
cout<<"偶数个数为:";
cout.width(15);
cout<<ou<<endl;
cout.width(15);
cout<<"最大奇数为:";
cout.width(15);
cout<<I<<endl;
cout.width(15);
cout<<"最大偶数为:";
cout<<K<<endl;
return 0;
}
九、编程题
编写一个程序,并请编写函数countvalue( ),它的功能是:求n以内(不包括n)能被3或7整除的所有自然数之和的平方根,并作为函数值返回。
提示:
(1)如输入20,因为3+6+9+12+15+18+7+14=84,则函数返回84的平方根为9.16515。如输入30,因为3+6+9+12+15+18+21+24+27+7+14+28=177,则返回177的平方根为13.5647。
(2)在main函数里通过输入流cin读取一个整数,并调用该函数进行计算,最后将函数返回的结果输出。
#include <iostream>
#include <math.h>
using namespace std;
double countvalue(long n){
long sum=0;
long i=1;
for(;i<n;i++){
if(i%3==0){
sum+=i;
cout<<i<<"可被3整除。"<<endl;
}else if(i%7==0){
sum+=i;
cout<<i<<"可被7整除。"<<endl;
}else{
cout<<i<<"不可被3或7整除。"<<endl;
continue;
}
}
cout<<"sum="<<sum<<endl;
return sqrt((double)sum);
}
int main(){
cout<<"Input n=";
long n;
cin>>n;
cout<<"countvalue("<<n<<")="<<countvalue(n)<<endl;
return 0;
}
十、编程题
定义一个含有60个整型元素的数组a,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组b中,并按每行4个元素输出数组b。试编程。
#include <iostream>
using namespace std;
int main(){
int a[60]={};
double b[12]={};
int k=0;
for(int i=0;i<60;i++){
a[i]=2*(i+1);
// cout<<"a["<<i<<"]="<<a[i]<<endl;
}
for(int i=0;i<60;i++){
if((i+1)%5==0){
double t=(double)(a[i]+a[i-1]+a[i-2]+a[i-3]+a[i-4]);
// cout<<"t="<<t<<endl;
// cout<<t/5.0<<endl;
b[k]=(t/5.0);
// cout<<"b["<<k<<"]="<<b[k]<<" ";
cout.setf(ios::left);
cout.width(5);
cout<<b[k];
k++;
if(k%4==0){
cout<<endl;
}
}else{
continue;
}
}
return 0;
}
第二部分 改错题
一. 改错题
【题目】
编一函数用选择排序法将下列整形数据从小到大排列
12,45,3,19,5,21,8,-4,17,20
编写函数用折半查找算法查找21,输出“折半查找算法找到21!”,
并在主函数输出选择排序算法的结果和折半查找的结果。
【要求】
(1) 只允许在原语句上进行修改,可以增加个别说明语句,但不能增加或删除整条程序语句或修改算法。
(2) 程序文件命名为“学号f1.cpp”存放在学号文件夹中。
含有错误的源程序如下:
#include<iostream.h>
#include<iomanip.h>
void sort(int f[10])
{ int i,j,k;
for(i=0;i<9;i++){
for(j=i;j<9;j++){
if(f[i]<f[j])
{k=f[i];f[i]=f[j];f[j]=k;}
}
}
}
void research(y[10]) {
int i,n,m;
n=0;m=9; i=(n+m)/2;
while(n<=m&&y[i]!=21)
{ if(y[i]<21) n=i+1;
if(y[i]>21) m=i-1;
i=(n+m)/2; }
if(y[i]=21) cout<<"折半查找算法找到21!"; }
void main(void)
{
int f[10]={12,45,3,19,5,21,8,-4,17,20},i;
sort(f[10]);
cout<<"选择排序算法的结果为:\n";
for(i=0;i<10;i++)
cout<<setw(5)<<f[i];
cout<<'\n';
research(f);
cout<<endl;
}
正确代码为:
#include<iostream>
#include<iomanip>
using namespace std;
void sort(int f[10])
{ int i,j,k;
for(i=0;i<9;i++){
for(j=i;j<9;j++){
if(f[i]<f[j])
{k=f[i];f[i]=f[j];f[j]=k;}
}
}
}
void research(int y[10]) {
int i,n,m;
n=0;m=9; i=(n+m)/2;
while(n<=m&&y[i]!=21)
{
if(y[i]<21) n=i+1;
if(y[i]>21) m=i-1;
i=(n+m)/2;
}
if(y[i]=21)
cout<<"折半查找算法找到21!";
}
int main()
{
int f[10]={12,45,3,19,5,21,8,-4,17,20},i;
sort(f);
cout<<"选择排序算法的结果为:\n";
for(i=0;i<10;i++)
cout<<setw(5)<<f[i];
cout<<'\n';
research(f);
cout<<endl;
return 0;
}
二.改错题
【题目】
下面程序用于求(1!)2 + (2!)2 + (3!)2 +(4!)2 + (5!)2的值,其中函数f1()用来求阶乘,函数f2( )调用函数f1( )用来求阶乘的平方,则程序正确的运行结果是:15017。
【要求】
(1) 只允许在原语句上进行修改,可以增加个别说明语句,但不能增加或删除整条程序语句或修改算法。
(2) 程序文件命名为“学号f1.cpp”存放在学号文件夹中。
含有错误的源程序如下:
#include <iostream>
int f1(int m)
{
int i,c=1;
for(i=1,i<=m,i++)
c=c*i;
return c;
}
int f2(n)
{
int r;
r=f1(n);
return r*r;
}
void main(void)
{
int i,s;
for(i=1;i<5;i++)
s=s+f2(i);
cout<<"s="<<s<<endl;
}
正确代码为:
#include <iostream>
using namespace std;
int f1(int m)
{
int i,c=1;
for(i=1;i<=m;i++)
c=c*i;
return c;
}
int f2(int n)
{
int r;
r=f1(n);
return r*r;
}
int main()
{
int i,s;
for(i=1;i<5;i++)
s=s+f2(i);
cout<<"s="<<s<<endl;
return 0;
}
三、改错题
【题目】
对输入的字符串进行简单加密处理,并输出加密后的字符串。
方法:首先建立一个长度为50的字符数组。随后通过输入流cin读入一个字符串。加密的规则如下:对输入的字符进行判断,如果是数字或者字符,则用其后的一个数字或者字母进行替换。但如果输入的字符是9,Z或者z,则分别用0,A和a代替;如果输入的字符不是数字或者字母,则保持不变。如输入的字符串为”09AZaz!”,则加密后输出的字符串为”10BAba!”。程序如下,请修改其中的错误,并用”09AZaz!”为输入的例子验证。
【要求】
(1) 只允许在原语句上进行修改,可以增加个别说明语句,但不能增加或删除整条程序语句或修改算法。
(2) 程序文件命名为“学号f1.cpp”存放在学号文件夹中。
含有错误的源程序如下:
#include <iostream.h>
void main(void)
{
char s[50];
cout<<"请输入一个字符串:\n";
cin>>s;
for(int i=0;s[i];i++)
{
if ((0<=s[i]<=8)||('a'<=s[i]<='y')||('A'<=s[i]<='Y'))
s[i]++;
else if(s[i]==9)
s[i]=0;
else if(s[i]=='z')
s[i]='a';
else if(s[i]=='Z')
s[i]='A';
}
}
正确代码为:
#include <iostream>
using namespace std;
int main()
{
char s[50];
cout<<"请输入一个字符串:\n";
cin>>s;
for(int i=0;s[i];i++)
{
cout<<"当前处理字符为:"<<s[i]<<endl;
if (('0'<=s[i]&&s[i]<='8')||('a'<=s[i]&&s[i]<='y')||('A'<=s[i]&&s[i]<='Y')){
s[i]++;
cout<<s[i]<<endl;
}else if(s[i]=='9'){
s[i]='0';
cout<<s[i]<<endl;
}
else if(s[i]=='z'){
s[i]='a';
cout<<s[i]<<endl;
}
else if(s[i]=='Z'){
s[i]='A';
cout<<s[i]<<endl;
}
}
cout<<s;
return 0;
}
**
四、改错题
【题目】
任一整数是一些质因子的乘积,例如:
27=333 ,11=11 15=35,20=225
下面程序是求2到30之间内所有整数的质因子(如对20,显示 22*5).
【要求】
(1) 只允许在原语句上进行修改,可以增加个别说明语句,但不能增加或删除整条程序语句或修改算法。
(2) 程序文件命名为“学号f1.cpp”存放在学号文件夹中。
含有错误的源程序如下:
#include<iostream>
void findfact(int n)
{ int i,j;
for(int i=2;i<=n;i++)
if(n%i=0)
{
j=n/i;
if(j=1)cout<<i<<endl;
else {cout<<i<<’*’; findfact(j);}
return;
}
}
void main( )
{ for(int j=2;j<=30;j++)
{ cout<<j<<’=’; findfact(int j);}
}