西安交大C++程序的设计课外测验作业Word文档格式.docx
《西安交大C++程序的设计课外测验作业Word文档格式.docx》由会员分享,可在线阅读,更多相关《西安交大C++程序的设计课外测验作业Word文档格式.docx(21页珍藏版)》请在冰点文库上搜索。
{
intm,n;
cout<
<
"
请输入正整数m和n(m<
=n):
;
cin>
>
m>
n;
while(m>
n)
{
cout<
您输入有误,m应该小于等于n,请重新输入:
cin>
}
for(intj=m;
j<
=n;
j++)//对于围的正整数逐一判断寻找因子
suyinzi(j);
return0;
}
voidsuyinzi(intx)//寻找并输出x的所有非平凡因子
x<
的非平凡因子为:
for(inti=2;
i<
=x/2;
i++)
if(x%i==0)
{
cout<
"
}
endl;
2.实验结果:
3.问题分析:
此题简单,但当该数没有非平凡因子时,如能够输出:
“x没有非平凡因子!
”而非仅仅输出空白则更好。
为此,需要将非平凡因子个数储存下来,在判断完毕后根据个数是否为0决定是否输出“x的非平凡因子为:
”这句话。
然而这样的代价就是较为麻烦,增加了程序运行的时间,因而没有尝试。
(二)第二题:
编写函数求反正切三角函数值,函数原型:
doublemy_arctg(doublex);
反正切三角函数公式如下:
n=0,1,2,......,要求结果值精确到107,并编写主函数测试。
评分标准,该题共20分:
(1)程序开始执行时显示“Pleaseenterx:
”,开始输入x的值,程序能正确接受该数值(5分);
(2)能够正确计算数据(5分);
(3)能够输出正确的计算结果。
(5分)。
(4)调用系统数学库函数atan(x)检验计算结果是否正确,并输出检测结果(5分)。
#include<
cmath>
doublemy_arctg(doublex);
doublex;
Pleaseenterx:
x;
自定义函数计算结果:
my_arctg(x)<
系统函数计算结果:
atan(x)<
doublemy_arctg(doublex)
doublesum=x;
doubleu=x;
inti;
for(i=1;
u>
0.0000001||u<
-0.0000001;
u=u*(-1)*x*x*(2*i-1)/(2*i+1);
sum=sum+u;
returnsum;
发现当|x|>
1时程序进入死循环无法结束,可能是公式不再适用。
以下对各种情况作以检测:
(1)输入为绝对值小于等于1的正数或负数及0时,能够计算出结果并且准确:
(2)绝对值超过1,无法计算结果:
|x|>
1时则无法输出结果,为了了解是哪里的问题,将程序添加对u的输出语句,并进行了测试,得到以下结果:
由结果分析,应该是无法达到结束循环的条件,此时程序进入死循环,所以无法输出。
因而,应该是公式不再适用。
因此,输入值应该限定在[-1,1]。
所以提出修改意见:
在输入语句后增加判断是否在[-1,1]的程序:
While(x>
1||x<
-1)
Cout<
“您的输入有误,请输入x在[-1,1]围:
\n”;
Cin>
出于原题要求,没有在结果中进行改动。
(三)第三题:
编写程序,用二维数组存储N×
N整数矩阵,判断矩阵是否为对称矩阵(沿主对角线对称,N大于3)?
先输出该矩阵,然后输出判断结果。
再将次对角线上的N个元素加到主对角线上N个元素,保持矩阵的对称性,并再输出该矩阵。
(可以不用函数方法)
评分标准:
该题共20分。
(1)数据定义和产生正确(5分)
(2)判断对称矩阵的控制结构正确(5分)
(3)主对角线与次对角线元素相加正确(5分)
(4)输出结果正确(5分)
voidchuli(intnum[4][4]);
intpanduan(intnum[4][4]);
inta[4][4]={1,2,3,4,
2,3,4,1,
3,4,1,2,
4,1,2,3
};
intb[4][4]={3,4,3,4,
2,3,8,1,
4,4,3,2,
7,1,2,3
chuli(a);
chuli(b);
intpanduan(intnum[4][4])
inti,j,x=0;
4;
for(j=0;
i;
j++)
if(num[i][j]==num[j][i])
x++;
if(x>
5)
return1;
voidchuli(intnum[4][4])
inti,j;
矩阵为:
\n"
for(i=0;
num[i][j]<
if(panduan(num)!
=0)
该矩阵是对称的,改变后结果为:
for(i=0;
num[i][i]=num[i][i]+num[i][3-i];
for(j=0;
cout<
}
else
该矩阵不是对称的\n"
3.问题分析:
对题意的理解不是很明确。
按照自己的理解进行了编写:
定义了两个固定的函数,一个为对称的,另一个不对称;
编写了一个自定义函数判断矩阵是否对称;
然后对这两个矩阵分别进行判断,若不对称则输出不对称,若对称则进一步进行处理将次对角线元素加到主对角线。
(四)第四题:
编写函数,判断任意一个字符串是否为对称字符串,例如:
对称字符串为“IaI”、“POP”、“21++12”。
要求编写主函数加以测试。
判断函数原型如下:
intpanduan(charccc[]);
(1)字符串数据定义和产生正确(5分)
(2)判断函数编写正确(10分)
(3)测试函数编写正确,并输出结果(5分)
//自定义函数判断字符串ccc是否对称
charin[40];
请输入字符:
cin.get(in,39);
if(panduan(in)==1)
您输入的"
in<
是对称字符!
不是对称字符!
intpanduan(charccc[])
intm=strlen(ccc);
//获取字符串长度
inti,x=0;
(m+1)/2;
i++)//逐一判断对称位置字符是否相同
if(ccc[i]==ccc[m-i-1])
x++;
=m/2)//对称位字符全部分别相同时输出是
考虑到奇数个字符、偶数个字符、数字形式字符、字母、以及多种不对称的形式进行检测:
(1)数字:
(2)字母:
(3)首尾字符不对称:
(4)中心字符不对称:
(5)含空格字符串:
五、第五题:
编写函数:
intcount(intm);
该函数完成如下功能:
输入一个整数m,统计并返回m左端连续相同数字的个数。
如:
2220511左端连续相同数字2的个数是3;
-923000左端连续相同数字9的个数是1。
编写主程序,测试该函数。
(1)数据类型、程序控制结构使用正确(5分)
(2)函数的定义和调用方确(5分)
(3)程序结构规、清晰、合理(5分)
(4)运行结果正确(5分)
intcount(intm);
intm;
请输入一个整数:
m;
if(m<
0)
m=-m;
//取绝对值
count(m)<
intcount(intm)//读取得到最高位数字;
判断连续该数字的个数;
输出个数
intn,u=m,num[10];
for(n=0;
=1;
n++)
num[n]=u%10;
u=u/10;
左端连续相同数字"
num[n-1]<
的个数为"
inti=1;
while(num[n-i]==num[n-i-1])
i++;
returni;
(1)正数:
(2)负数:
3、问题分析:
起初没有考虑正负的问题。
六、第六题:
编写程序:
求1-9999之所有递减数的平均数,所谓递减数指该数各位数字从左至右递减排列,例如:
4332211、654321、9955、22222222等都是递减数。
例如:
32768、43987、123498都不是递减数。
假设求出递减数是4个,分别是A、B、C、D,则按下面格式输出结果:
(A+B+C+D)/4=结果值
(1)程序框架完整,结构清晰(5分)
(2)整数中的数字分离正确(5分)
(3)循环控制结构正确(5分)
(4)计算结果正确,输出格式清楚。
1.源程序代码:
intmy(intn);
intm,n=0,sum=0;
intnum[10000];
for(m=0;
m<
=9999;
m++)
if(my(m)!
num[n]=m;
sum=sum+m;
n++;
("
num[0];
+"
num[i];
)/"
n<
="
sum/n<
intmy(intn)
intnum[4];
intu=0,i=0;
do
num[u]=n%10;
n=n/10;
u++;
}while(n>
=1);
while(num[i]<
=num[i+1]&
&
u)
if(i==u-1)
2.实验结果:
共有997个递增数,平均值为5740:
起初将判断是否递减的条件设为个位<
=十位<
=百位<
=千位,这样就将一位数、两位数、三位数全部都否定了,因为它们都有一部分位上都为0,这样则无法满足递减。
(七)第七题:
设有一个有序的整形数组,数据元素从小到大排列,初始时数组中没有元素,用户从键盘输入若干整数,将其插入到数组的合适位置,使数组保持有序,并打印插入后数组的元素。
程序要考虑数组满时的情况处理。
注意每个整数插入时,若采用冒泡排序方法使数组有序则视为错误。
编程要求:
1)程序在开始执行时提示:
“请输入元素个数:
”
2)数组中有序元素是:
”的格式输出
3)程序提示:
“输入插入的整数”,插入后,数组元素仍然有序,并按“数组有序元素是:
(1)程序框架完整,代码规(20%)
(2)数据类型的定义和使用方确(20%)
(3)程序控制结构使用正确(20%)
(4)算确,清晰合理(20%)
(5)运行结果正确(20%)
intm,n,i,a[60],b[30];
请输入一个从小到大排列的数组的数的个数:
请输入每一项:
a[i];
请输入要插入的数的个数:
请输入每一个要插入的数:
b[i];
intj=0,u;
while(b[i]>
a[j]&
m+i)
j++;
for(u=m+i;
j;
u--)
a[u]=a[u-1];
a[j]=b[i];
排序结果是:
m+n;
a[i]<
题目的说法并不明确,难以理解,只能按照自己的理解做:
先要求输入一个递增数组;
再输入要插入的数,然后将要插入项插到正确的位置并输出。