C++二级上机编程题
- 格式:doc
- 大小:115.50 KB
- 文档页数:20
上机编程题1、请补充完整程序fun(int i),使程序完成以下功能:如果i=5,则输出如下5行井号。
###############注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
#include <iostream.h>void fun(int i){}int main(){fun(5);return 0;}【答案】for(int j=0;j<i;j++) //行循环{for(int k=0;k<=j;k++) //列循环cout<<"#"; //输出"#"cout<<endl;}【审题分析】(1)该程序功能是输出5行井号。
它的解题思路,两层循环,外循环为行,内循环为列。
第一行为1列,第二行为两列,同理类推,第n行为n列。
(2)从已给部分源程序的main主函数开始入手,核心函数fun(int i)中的i参数为i行#。
【解题思路】(1)首先,利用for循环进行外层循环,要输出的i行。
(2)然后,利用for循环进行内层循环,输出对应i行的i列。
2、完成函数fun(char* s,int a[]),其功能是把s中出现的数字转换成数字存储在a[]中,然后返回转换的个数。
例如:s="1234abcdef567";则:a[]中存储着1234567返回:7注意:不能修改程序的其他部分,只能修改fun()函数。
#include <iostream.h>int fun(char* s,int a[]){}int main(){int a[1024];int len=fun("1234abcdef567",a);for(int i=0;i<len;i++){cout<<a[i]<<' ';}cout<<endl;cout<<i<<endl;return 0;}【答案】int j=0;for(int i=0;s[i]!=0;i++) //字符串内循环{if(s[i]>='0'&&s[i]<='9') //判断字符是否为0~9的字符{a[j++]=s[i]-'0'; //如果为0~9的字符,转换为整型}}return j; //返回数字个数【审题分析】(1)该程序功能是把字符串中出现的数字转换成数字存储在数组中,然后返回转换的个数。
其中,字符和整型的ASCII差为96,即为'0'的ASCII码值。
(2)从已给部分源程序的main主函数开始入手,核心函数fun实现题目中要求的功能,其中int fun(char* s,int a[])中的s为要转换的字符串,a为存放转换为数字的数组,返回值为转换的个数。
【解题思路】(1)j变量用来记录转换的个数,首先初始化为0。
(2)然后利用for循环对每一个当前字符进行判断是否为数字字符。
(3)如果为数字字符,就将其减去字符'0',即实现字符和整型的转换。
并且,将j的变量值加1。
3、完成fun()函数,其功能是:求出M行N 列二维数组每行元素中的最小值,并计算它们的和值。
和值通过形参传回主函数输出。
注意:不能修改程序的其他部分,只能修改fun()函数。
#include <iostream.h>#define M 2#define N 4void fun(int a[M][N],int *sum){}void main(){int x[M][N]={7,6,5,2,4,2,8,3};int s;fun(x,&s);cout<<s<<endl;return;}【答案】int i,j,k,s=0;for(i=0;i<M;i++) //外循环{k=0;for(j=1;j<N;j++)if(a[1][k]>a[i][j])k=j; //求得每一行的最小值s+=a[i][k]; //最小值求和}*sum=s; //返回求和值【审题分析】(1)该程序功能是求二维数组每行元素中的最小值,并计算它们的和值。
本题解题思路基本可以分为两重循环,外重循环为对二维数组的所有行进行循环,内重循环为对每一行内进行列循环,求出每一行中的最小值。
最后求出这些最小值的和。
(2)从已给部分源程序的main主函数开始入手,核心函数void fun(int a[M][N],int *sum)中的a参数为二维数组,sum为要求得的和。
【解题思路】(1)依次访问每一行的元素。
(2)在对每一行的访问过程中选出最小数。
(3)将选出的最小数求和。
4、请完成函数fun(int i),实现以下功能:当i等于5时,则打印如下内容。
###############注意:不能修改程序的其他部分,只能修改fun()函数。
#include <iostream.h>void fun(int n){}void main(){int n;cout<<"请输入打印的行数: "<<endl;cin>>n;if( n < 1){cout<<"输入的行数必须大于0"<<endl;return;}fun(n);return;}【答案】int i;for(i=0;i<n;i++) //外层循环,要打印的行数{int j;for(j=0;j<n-i-1;j++) //循环打印空格{cout<<' ';}for(;j<n;j++) //循环打印#{cout<<"#";}cout<<endl; //打印每一行的回车}【审题分析】(1)该程序功能是打印题目中要求的#字形状。
它的解题思路,在不显示#字地方,用空格占位。
(2)从已给部分源程序的main主函数开始入手,核心函数void fun(int n)中的n参数为输入的要打印的行数。
【解题思路】(1)外层循环打印每一行。
(2)内层循环,分为打印空格和打印#。
打印空格由第一个位置到第n-i-1。
打印#,是由打印完空格开始一直到行结束。
(3)最后在外循环中打印每一行的结束。
5、完成fun()函数,其功能是:将两个从小到大有序数组a和b,复制合并出一个有序整数序列c,其中形参n和m分别是数组a和b的元素个数。
注意:不能修改程序的其他部分,只能修改fun()函数。
#include <iostream.h>void fun (int a[],int n,int b[],int m,int *c){}void main(){int A[]={3,5,7,9,11,18,21};int B[]={6,15,19,21,39};int C[25], i;for(i=0;i<25;i++) C[i] = 0;cout << "A[]=";for (i=0; i<7; i++)cout << A[i] << ',';cout << endl;cout << "B[]=";for (i=0; i<5; i++)cout << B[i] << ',';cout << endl;fun(A,7,B,5,C);cout << "C[]=";for (i=0; i<12; i++)cout << C[i] << ',';cout << endl;return;}【答案】int i,j;for(i=j=0;i<n&&j<m;){*c++=a[i]<b[j]?a[i++]:b[j++]; //比较两个数组中元素大小}while(i<n)*c++=a[i++];while(j<m)*c++=b[j++];【审题分析】(1)该程序功能是将两个从小到大有序数组a和b,复制合并出一个有序整数序列c。
它的解题思路,因为要合并的数组是有序数组,所以在循环中依次比较两个数组中的元素大小,如果它比另一个数组的元素小,那么将其拷贝到c,并将其向后移动,直到数组结尾。
(2)从已给部分源程序的main主函数开始入手,核心函数void fun (int a[],int n,int b[],int m,int *c)中的a,b 参数为要合并的数组,n和m为两个数组的大小,c为合并的结果。
【解题思路】(1)首先都指向数组的第一个元素。
(2)然后利用for循环对要合并的两个数组中的元素进行比较,直到两个数组结束。
(3)取比较结果小的元素,并将指向这个数组的位置向后移动一位。
6、完成函数fun(int a[],int n),实现递归函数fun(int a[],int n)的返回值是数组a[]的前n个元素之和。
注意:不能修改程序的其他部分,只能修改fun()函数。
#include <iostream.h>int fun(int a[],int n){}void main(){int A[]={1,2,3,4};cout<<fun(A,sizeof(A)/sizeof(int))<<endl;return;}【答案】if(n>0)return a[n-1]+fun(a,n-1); //递归求n项的和return 0; //项数小于等于0,返回求和值0 【审题分析】(1)该程序功能是利用递归实现数组前n项的和。
函数的递归是在调用一个函数的过程中出现直接或间接调用该函数本身。
(2)从已给部分源程序的main主函数开始入手,核心函数int fun(int a[],int n)中调用该函数本身,利用递归调用实现计算结果,其中参数a为数组名,n为要求和的项数。
【解题思路】(1)如果要计算的项数小于等于0,那么直接返回0。
(2)否则调用递归语句"a[n-1]+fun(a,n-1)",实现0到第n项的和。
7、完成空出的函数fun(int a[], int* index),使函数输入n(<100)个整数到指定数组,求该数组中最大元素的值和此元素的下标,最大元素值以函数值返回,此元素的下标通过指针形参带回调用函数。