东南大学533:C++(上)上机题选编

近几年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,显示 2
2*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);}   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值