华中科技大学c++第5次上机作业Word文件下载.docx
- 文档编号:19767695
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:19
- 大小:41.30KB
华中科技大学c++第5次上机作业Word文件下载.docx
《华中科技大学c++第5次上机作业Word文件下载.docx》由会员分享,可在线阅读,更多相关《华中科技大学c++第5次上机作业Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
q<
qq<
return0;
}
运行上述的程序,并解释每个输出结果。
解释:
1.指针变量*p指向a的地址,所以直接输出a的值。
2.指针变量*q指向ch的地址,所以输出ch的值。
3.指针变量*qq指向数组str的首地址,故只输出首个数据
4.因为a的类型为int,所以输出了a的地址
5.有一个元素的字符数组,没有\0,所以直接输出时不能停止,只能输出乱码,而字符串可以直接输出是因为它会自动添加\0,输出时遇到\0停止,所以可以正常输出;
6.用字符数组给指针初始化,所以qq相当于str,而字符数组可以整体输出
2)#include<
{intage;
charname[11];
cin>
>
age;
cin.getline(name,11);
age<
name<
运行上述的程序,其结果是否正确,如不确请修改正确,并解释原因。
错误:
1.cin>
age后面的分号为中文
2.cin.getline会将输入的回车作为其结束的标志,故直接跳过了输入字符数组这一步骤。
只需要用cin.get吸收这个回车即可。
修改后的程序:
#include<
age;
cin.get();
}
3)#include<
cstring>
intmain()
{
charrstr[10]="
abcdefgh"
dstr[10];
char*p=rstr,*q=dstr;
strcpy(dstr,rstr);
"
输出字符串rstr:
rstr<
输出字符串dstr:
dstr<
输出字符串p:
输出字符串q:
return0;
阅读上述程序并运行,分析其结果。
若将上述程序修改如下,重新运行,结果如何?
请解释原因。
char*rstr="
*dstr;
上述程序的功能是将字符串rstr复制到目标串dstr中,运行该程序结果是否正确,如不正确请修改正确,并解释原因。
原程序的结果:
Srtcpy将rstr中的数据复制到了dstr中,所以会输出abcdefgh,输出p和q相当于间接输出,也可以输出abcdefgh。
第二个程序:
此程序无法运行,原因是指针*rstr和*dstr未指向安全的位置。
更改会使程序无法运行。
修改:
chara[10]="
b[10];
char*rstr=a,*dstr=b;
将指针指向安全的位置即可。
2.编程题
1)编写两个函数,分别求两个整数的最大公约数和最小公倍数,在主函数中调用这两个函数,计算两个数的最大公约数和最小公倍数并输出结果。
要求:
1)程序原代码。
(直接粘贴在此)
intgys(int,int);
intgbs(int,int);
inta,b;
请输入两个正整数"
a>
b;
最大公约数为"
gys(a,b)<
最小公倍数为"
gbs(a,b)<
intgys(inta,intb)
inti,n,m;
if(a>
=b)
n=a;
else
n=b;
for(i=2;
i<
=n;
i++)
{
if(a%i==0&
&
b%i==0)
m=i;
returnm;
intgbs(inta,intb)
inti,n,m,s;
s=a*b/m;
returns;
2)解决本题的算法思路描述
编写计算最小公倍数的函数
编写计算最大公约数的函数
在主函数中使用这两个函数
得出结果
3)调试过程的记载(包括出现的错误,以及修改)
函数声明方式错误
4)归纳本题应用的知识点或算法
计算最大公约数和最小公倍数的方法
函数的声明与使用
2)编写程序随机生成50个100-200之间的随机整数,找出其中的素数。
要求判断素数的功能利用函数实现,在main函数中调用该函数输出所有的素数。
#include<
cstdlib>
ctime>
intss(int);
inta[50],i,t=0,j;
srand(time(0));
a[0]=(rand()%100+100);
for(i=1;
50;
t=0;
a[i]=(rand()%100+100);
for(j=0;
j<
i;
j++)
if(a[i]==a[j])
t=1;
if(t==1)
i--;
生成的50个随机数为:
for(i=0;
a[i]<
"
;
if((i+1)%5==0)
其中的素数为:
for(i=0,j=0;
if(ss(a[i]))
cout<
j++;
if(j%5==0)
cout<
intss(intb)
inta=1,n;
for(n=2;
n<
n++)
if(b%n==0)
{
a=0;
break;
}
returna;
编写一个求素数的函数
主函数中定义一个含50个元素的数组
当该变量的值位于100到200之间时,将该变量的值赋给数组中的元素,并与前面所有值进行比较,若重复,则重新赋值。
不断循环,直到数组中的每个数都被赋值
输出数组中的各个数,依次用求素数的函数判断该数组中的元素是否为素数,是则输出。
编写求素数的函数时,i从0开始,导致循环无法实现。
For循环,break语句的使用
函数的调用
生成随机数函数的使用
if语句及数组
3)编写一个函数实现将一个十六进制整数转换为一个十进制整数。
例如,输入”A2”转换为162。
提示:
循环对读入的每个字符转换成对应的十进制数字,比如’1’的值为1,’A‘为10,’F’为15,将转换后得到的数字进行计算处理。
函数的原型可以声明为:
intfunChange(chars[]);
//函数的功能是将s数组存放的字符串转换为十进制数值返回,参数应采用数组名传递方式,即形参数组与实参数组共用同一地址空间。
intfunchange(chars[])
inti,m,b[100],sum=0;
for(i=0;
s[i]!
=0;
i++)
if(s[i]>
='
0'
s[i]<
9'
)
b[i]=(int(s[i])-48);
elseif(s[i]>
a'
f'
b[i]=int(s[i])-87;
elseif(s[i]>
A'
F'
b[i]=int(s[i])-55;
m=i;
m;
sum=sum*16+b[i];
returnsum;
chars[20];
请输入要转换的十六进制数字"
cin.getline(s,20);
转化成十进制为:
funchange(s)<
用一个字符数组记录该十六进制数
将该数的每一位分别转换为十进制数并用数组b[100]记录,
用一重循环对其进行求和即可
3)调试过程的记载(包括出现的错误,以及修改?
头文件的intfunchange(chars[])括号中忘记加chars[];
数组的使用,if-else语句的使用,for循环的使用,函数的调用
4)编写函数验证哥德巴赫猜想,任意一个充分大的偶数均可表示成两个素数之和。
要求定义两个函数,一个函数判断一个整数是否是素数,另一个函数验证哥德巴赫猜想,即将一个偶数分解为两个素数,并返回这两个素数。
利用函数的嵌套调用完成(即在验证哥德巴赫猜想的函数中调用判断素数函数)。
例如8=3+5这样的显示信息在主函数中完成。
intsu(inta)
intm,n=1,i;
m=(a%i);
if(m==0)
n=0;
returnn;
voidgede(intb,int*c,int*d)
inti,k=0;
for(i=1;
if(su(i)&
su(b-i))
k=1;
if(k==1)
*c=i;
*d=b-i;
intb,c,d;
请输入一个偶数"
cin>
gede(b,&
c,&
d);
b<
="
c<
+"
d<
定义一个函数判断数据是否为素数
定义函数检验哥德巴赫猜想,从1开始循环,看是否存在两个素数使得其和为该偶数
通过指针变量和引用返回这两个素数
输出
在指针变量和引用的时候出现错误
函数的定义调用
函数的嵌套
循环语句
求素数的方法
5)编写函数,求出任意一个一维数组元素中的最大值和最小值的下标。
要求在主函数中输入数组元素的值,输出最大值和最小值。
本题要求将一维数组的元素传入到函数进行处理,对于大量的数据的传递,最好的方式是使用数组名作为实际参数传递,在这种情况下,形参可以是指针也可以是数组,通过形参能直接对实参数组的数据进行处理。
本题的问题是获取数组元素的最大值和最小值,在函数中有两个值需要返回到主函数,因此不能用return语句,需使用指针或引用参数进行回传。
voidfunMaxMin(inta[],intn,int*max,int*min)//函数的功能获取数组元素的最大值和最小值下标。
voidfunMaxMin(inta[],intn,int*max,int*min)
inti,j;
*max=0;
*min=0;
for(i=0;
n;
if(a[i]>
a[*max])
*max=i;
if(a[j]<
a[*min])
*min=j;
请输入所需要判断的数字的个数"
intn,i,a[100],max,min;
请输入数组元素"
cin>
a[i];
funMaxMin(a,n,&
max,&
min);
最大值为"
a[max]<
最小值为"
a[min]<
编写函数分别将每一个数与最大值和最小值比较,将较大的数的下标给*max较小的数的下标给*min
定义一个一维数组,输入数组的值,引用第一个函数,求得最大值和最小值的下标
通过下标输出最大值和最小值。
开始时求最大值和最小值的下标时出现错误。
函数的定义与调用
函数需要返回多个值的做法
数组的相关知识
6)编写一个递归函数,统计任意位正整数的位数,并在主函数中输入这个整数和输出统计的结果。
intws(inta)
=0&
a<
10)
return1;
return1+ws(a/10);
inta;
请输入一个整数"
该整数的位数为"
ws(a)<
定义ws函数,通过整除10来求得整数的位数
Main函数中调用ws函数求得位数
输出位数
未出现错误
计算整数位数的方法
7)编写程序要求能对10个字符串排序,然后用折半查找的方法查询需查找的字符串。
要求①排序、②查找和③两字符串的交换分别用自定义函数实现。
是否找到的信息只能在主函数中输出显示。
voidswap(chara[],charb[]);
voidpaixu(chara[][50]);
intsearch(chara[][50],charsearchname[]);
inti;
charsearchname[50],aa[10][50];
请输入十个字符串"
10;
aa[i];
请输入要查找的字符串名称"
searchname;
if((search(aa,searchname)==0))
未查找到该字符串"
该字符串存在"
voidswap(chara[],charb[])
charc[50];
strcpy(c,a);
strcpy(a,b);
strcpy(b,c);
voidpaixu(chara[][50])
intmin,i,j;
min=i;
for(j=i;
if(strcmp(a[min],a[j])>
0)
swap(a[min],a[j]);
intsearch(chara[][50],charsearchname[])
paixu(a);
intlow=0,high=9,mid,m;
mid=(low+high)/2;
while(low<
=high&
strcmp(a[mid],searchname)!
=0)
if(strcmp(a[mid],searchname)<
low=mid+1;
else
high=mid-1;
if(strcmp(a[mid],searchname)==0)
m=mid+1;
m=0;
编写排序的函数
编写交换的函数
编写查找的函数
主函数
折半查找
排序
对字符数组的处理
三、对本次实验内容及方法、手段的改进建议,以及实验心得
实验心得包括:
1)哪些知识点已掌握
基本掌握字符型数组的使用
循环语句的使用
指针传递
函数的声明和调用
排序算法
递归算法
2)哪些知识点有困难
折半查找不熟练
3)对讲课的建议
多进行算法的举例
4)对没有掌握知识的补救建议
多加练习关于折半查找方面的问题
对常用算法进行总结【下载本文档,可以自由复制内容或自由编辑修改内容,更多精彩文章,期待你的好评和关注,我将一如既往为您服务】
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华中科技大学 c+ 上机 作业