西安交大C++程序的设计课外测验作业.docx
《西安交大C++程序的设计课外测验作业.docx》由会员分享,可在线阅读,更多相关《西安交大C++程序的设计课外测验作业.docx(21页珍藏版)》请在冰豆网上搜索。
西安交大C++程序的设计课外测验作业
交通大学实验报告
课程__计算机程序设计__实验名称_课外实验题目__第1页共19页
系别__________实验日期2014年4月3日
专业班级____组别_____________实验报告日期2014年4月5日
姓名________学号__报告退发(订正、重做)
同组人_________________________________教师审批签字
一、实验目的
复习巩固本阶段所学的知识,包括数组的使用、函数的使用、循环语句和条件语句的使用等。
二、实验容
(一)第一题:
1、编写一个程序,计算m~n围的每个正整数的全部素因子。
其中的m和n由键盘输入。
评分标准:
(1)程序框架完整,代码规;(20%)
(2)数据类型的定义和使用方确;(20%)
(3)程序控制结构使用正确;(20%)
(4)算确,清晰合理;(20%)
(5)运行结果正确,输入和输出格式如下所示。
(20%)
请输入m和n:
1518
15的非平凡因子:
35
16的非平凡因子:
248
17的非平凡因子:
18的非平凡因子:
2369
1.源程序代码:
#include
usingnamespacestd;
voidsuyinzi(intx);
intmain()
{
intm,n;
cout<<"请输入正整数m和n(m<=n):
";
cin>>m>>n;
while(m>n)
{
cout<<"您输入有误,m应该小于等于n,请重新输入:
";
cin>>m>>n;
}
for(intj=m;j<=n;j++)//对于围的正整数逐一判断寻找因子
{
suyinzi(j);
}
return0;
}
voidsuyinzi(intx)//寻找并输出x的所有非平凡因子
{
cout<";
for(inti=2;i<=x/2;i++)
{
if(x%i==0)
{
cout<
}
}
cout<}
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分)。
1.源程序代码:
#include
#include
usingnamespacestd;
doublemy_arctg(doublex);
intmain()
{
doublex;
cout<<"Pleaseenterx:
";
cin>>x;
cout<<"自定义函数计算结果:
"<cout<<"系统函数计算结果:
"<return0;
}
doublemy_arctg(doublex)
{
doublesum=x;
doubleu=x;
inti;
for(i=1;u>0.0000001||u<-0.0000001;i++)
{
u=u*(-1)*x*x*(2*i-1)/(2*i+1);
sum=sum+u;
}
returnsum;
}
2.实验结果:
发现当|x|>1时程序进入死循环无法结束,可能是公式不再适用。
以下对各种情况作以检测:
(1)输入为绝对值小于等于1的正数或负数及0时,能够计算出结果并且准确:
(2)绝对值超过1,无法计算结果:
3.问题分析:
|x|>1时则无法输出结果,为了了解是哪里的问题,将程序添加对u的输出语句,并进行了测试,得到以下结果:
由结果分析,应该是无法达到结束循环的条件,此时程序进入死循环,所以无法输出。
因而,应该是公式不再适用。
因此,输入值应该限定在[-1,1]。
所以提出修改意见:
在输入语句后增加判断是否在[-1,1]的程序:
While(x>1||x<-1)
{
Cout<<“您的输入有误,请输入x在[-1,1]围:
\n”;
Cin>>x;
}
出于原题要求,没有在结果中进行改动。
(三)第三题:
编写程序,用二维数组存储N×N整数矩阵,判断矩阵是否为对称矩阵(沿主对角线对称,N大于3)?
先输出该矩阵,然后输出判断结果。
再将次对角线上的N个元素加到主对角线上N个元素,保持矩阵的对称性,并再输出该矩阵。
(可以不用函数方法)
评分标准:
该题共20分。
(1)数据定义和产生正确(5分)
(2)判断对称矩阵的控制结构正确(5分)
(3)主对角线与次对角线元素相加正确(5分)
(4)输出结果正确(5分)
1.源程序代码:
#include
usingnamespacestd;
voidchuli(intnum[4][4]);
intpanduan(intnum[4][4]);
intmain()
{
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);
return0;
}
intpanduan(intnum[4][4])
{
inti,j,x=0;
for(i=1;i<4;i++)
{
for(j=0;j
{
if(num[i][j]==num[j][i])
x++;
}
}
if(x>5)
return1;
return0;
}
voidchuli(intnum[4][4])
{
inti,j;
cout<<"矩阵为:
\n";
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
cout<cout<}
if(panduan(num)!
=0)
{
cout<<"该矩阵是对称的,改变后结果为:
\n";
for(i=0;i<4;i++)
num[i][i]=num[i][i]+num[i][3-i];
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
cout<cout<}
}
else
cout<<"该矩阵不是对称的\n";
}
2.实验结果:
3.问题分析:
对题意的理解不是很明确。
按照自己的理解进行了编写:
定义了两个固定的函数,一个为对称的,另一个不对称;编写了一个自定义函数判断矩阵是否对称;然后对这两个矩阵分别进行判断,若不对称则输出不对称,若对称则进一步进行处理将次对角线元素加到主对角线。
(四)第四题:
编写函数,判断任意一个字符串是否为对称字符串,例如:
对称字符串为“IaI”、“POP”、“21++12”。
要求编写主函数加以测试。
判断函数原型如下:
intpanduan(charccc[]);
评分标准:
该题共20分。
(1)字符串数据定义和产生正确(5分)
(2)判断函数编写正确(10分)
(3)测试函数编写正确,并输出结果(5分)
1.源程序代码:
#include
usingnamespacestd;
intpanduan(charccc[]);//自定义函数判断字符串ccc是否对称
intmain()
{
charin[40];
cout<<"请输入字符:
";
cin.get(in,39);
if(panduan(in)==1)
cout<<"您输入的"<"<else
cout<<"您输入的"<"<return0;
}
intpanduan(charccc[])
{
intm=strlen(ccc);//获取字符串长度
inti,x=0;
for(i=0;i<(m+1)/2;i++)//逐一判断对称位置字符是否相同
{
if(ccc[i]==ccc[m-i-1])
{
x++;
}
}
if(x>=m/2)//对称位字符全部分别相同时输出是
return1;
return0;
}
2.实验结果:
考虑到奇数个字符、偶数个字符、数字形式字符、字母、以及多种不对称的形式进行检测:
(1)数字:
(2)字母:
(3)首尾字符不对称:
(4)中心字符不对称:
(5)含空格字符串:
五、第五题:
编写函数:
intcount(intm);该函数完成如下功能:
输入一个整数m,统计并返回m左端连续相同数字的个数。
如:
2220511左端连续相同数字2的个数是3;-923000左端连续相同数字9的个数是1。
编写主程序,测试该函数。
评分标准:
(1)数据类型、程序控制结构使用正确(5分)
(2)函数的定义和调用方确(5分)
(3)程序结构规、清晰、合理(5分)
(4)运行结果正确(5分)
1.源程序代码:
#include
usingnamespacestd;
intcount(intm);
intmain()
{
intm;
cout<<"请输入一个整数:
";
cin>>m;
if(m<0)
m=-m;//取绝对值
cout<return0;
}
intcount(intm)//读取得到最高位数字;判断连续该数字的个数;输出个数
{
intn,u=m,num[10];
for(n=0;u>=1;n++)
{
num[n]=u%10;
u=u/10;
}
cout<<"左端连续相同数字"<inti=1;
while(num[n-i]==num[n-i-1])
{
i++;
}
returni;
}
2.实验结果:
(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)计算结果正确,输出格式清楚。
(5分)。
1.源程序代码:
#include
usingnamespacestd;
intmy(intn);
intmain()
{
intm,n=0,sum=0;
intnum[10000];
for(m=0;m<=9999;m++)
{
if(my(m)!
=0)
{
num[n]=m;
sum=sum+m;
n++;
}
}
inti;
cout<<"("<for(i=1;i{
cout<<"+"<}
cout<<")/"<return0;
}
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]&&i
i++;
if(i==u-1)
return1;
return0;
}
2.实验结果:
共有997个递增数,平均值为5740:
3.问题分析:
起初将判断是否递减的条件设为个位<=十位<=百位<=千位,这样就将一位数、两位数、三位数全部都否定了,因为它们都有一部分位上都为0,这样则无法满足递减。
(七)第七题:
设有一个有序的整形数组,数据元素从小到大排列,初始时数组中没有元素,用户从键盘输入若干整数,将其插入到数组的合适位置,使数组保持有序,并打印插入后数组的元素。
程序要考虑数组满时的情况处理。
注意每个整数插入时,若采用冒泡排序方法使数组有序则视为错误。
编程要求:
1)程序在开始执行时提示:
“请输入元素个数:
”
2)数组中有序元素是:
”的格式输出
3)程序提示:
“输入插入的整数”,插入后,数组元素仍然有序,并按“数组有序元素是:
”的格式输出
评分标准:
(1)程序框架完整,代码规(20%)
(2)数据类型的定义和使用方确(20%)
(3)程序控制结构使用正确(20%)
(4)算确,清晰合理(20%)
(5)运行结果正确(20%)
1.源程序代码:
#include
usingnamespacestd;
intmain()
{
intm,n,i,a[60],b[30];
cout<<"请输入一个从小到大排列的数组的数的个数:
";
cin>>m;
cout<<"请输入每一项:
\n";
for(i=0;icin>>a[i];
cout<<"请输入要插入的数的个数:
\n";
cin>>n;
cout<<"请输入每一个要插入的数:
\n";
for(i=0;icin>>b[i];
for(i=0;i{
intj=0,u;
while(b[i]>a[j]&&jj++;
for(u=m+i;u>j;u--)
{
a[u]=a[u-1];
}
a[j]=b[i];
}
cout<<"排序结果是:
\n";
for(i=0;icout<cout<return0;
}
2.实验结果:
3.问题分析:
题目的说法并不明确,难以理解,只能按照自己的理解做:
先要求输入一个递增数组;再输入要插入的数,然后将要插入项插到正确的位置并输出。