![西安交大C++程序设计第四章作业2_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/4f314b64-238d-4bf2-9b08-ba8cc40419e4/4f314b64-238d-4bf2-9b08-ba8cc40419e41.gif)
![西安交大C++程序设计第四章作业2_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/4f314b64-238d-4bf2-9b08-ba8cc40419e4/4f314b64-238d-4bf2-9b08-ba8cc40419e42.gif)
![西安交大C++程序设计第四章作业2_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/4f314b64-238d-4bf2-9b08-ba8cc40419e4/4f314b64-238d-4bf2-9b08-ba8cc40419e43.gif)
![西安交大C++程序设计第四章作业2_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/4f314b64-238d-4bf2-9b08-ba8cc40419e4/4f314b64-238d-4bf2-9b08-ba8cc40419e44.gif)
![西安交大C++程序设计第四章作业2_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/4f314b64-238d-4bf2-9b08-ba8cc40419e4/4f314b64-238d-4bf2-9b08-ba8cc40419e45.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、西安交通大学实验报告课程计算机程序设计实验名称结构体 第1页共29页系 别_实 验 日 期2014 年4月26日专业班级_组别 实验报告日期2014 年4月27日姓 名_ 一一学号_ 报 告 退 发(订正、重做)同组人 教师审批签字一、实验目的掌握结构体的使用方法,学会用结构体的方法定义变量并对变 量进行处理;掌握枚举法的使用方法。二、实验内容(一)第一题:1、输入某小组5个人的姓名、性别、出生年份 等信息,统计男女人数以及1988年以后(含1988年)出生的人 数。1. 源程序代码:/输入某小组个人的姓名、性别、出生年份等信息,统计男女人数以及年以后(含 年)出生的人数。#include &
2、lt;iostream>using namespacestd;struct xinxichar n ame20;char sex;int year; /定义结构体xinxi,包含名称(字符串)、性别(字符)、出生时间(整数) 三个变量int main()xi nxi cy5;int i,s=0,m=0;for (i=0;i<5;i+)coutvv"请输入第"<<i+1<<"个成员的信息:n姓名:"cin>>;coutvv"性别(男的输入b”女的输入g ”):";cin&g
3、t;>cyi.sex;coutvv"出生年份:"cin>>cyi.year;coutvv"您输入的是:n"for (i=0;iv5;i+)/ 显示输入内容vv "t" vvcyi.sexvv "t" vvcyi.yearvvendl;for (i=0;iv5;i+)/ 统计男女、之后个数if (cyi.sex= 'b' )s+;if (cyi.year>=1988)m+;coutvv"其中男生人数为:"wsvCt女生人数为:&q
4、uot;vv5-svvendl; coutvv "1988年以后(含)出生的的人数为:"vvmvve ndl; return 0;2. 实验结果:OS C:Win dowssyrtenn32cmd1exe谆触八弟丄个咸员的信息:" 常曹寿r” 女的输入b11?豈赣人兼个成员的信息, 姓名r Ejj的输入F 女的输人bJi: 1V6请筮人第H个成员的信息姓各dzj性别隅的输入 f 以的输入>=»出生年俶1996髄入聲4个成员的信息=性勃隅的输入m的输u吉 岀生年册:1988请锁人鄴个成员的信息.姓名:xiaoli性臥男的输入计女的输人=";
5、a 出生孝粉.198?1? 199ft19 9&a丄 98819873您输八崗杲:brd b cs j b d3j b xlaoning xiaoli a 其中塁吿数知LW毗年以后(含1908 )岀生 请按任意霾继I- - - 3问题分析:略。(二)第二题:读入五个用户的姓名和电话号码,按照姓名的字典顺序排列后,输出用户的姓名和电话号码。1.源程序代码:/读入五个用户的姓名和电话号码,按照姓名的字典顺序排列后,输出用户的姓 名和电话号码。#include <iostream>#inelude <cstring>using namespacestd;struct
6、dia nhuabuchar n ame30;char nu m15; /定义结构体dianhuabu,包含两个变量:名字和电话号码。由于电话号码较 长又无需对其进行具体处理,故定义为字符串型int main()dianhuabu dhb5;/ 声明 dianhuabu 型变量int i;for (i=0;i<5;i+)coutvv"请输入第"<<i+1<<"个用户的信息:t姓名:" cin>>;cout<<" 电话号码: "cin>>dhbi.num
7、;coutvv"您输入的信息如下:n"for (i=0;i<5;i+)/ 显示输入信息vv "t" vvdhbi.numvv "n" ;for (i=0;iv5;i+)/ 排序int k=i;for (int j=i+1;jv5;j+)if (strcmp(,)<0)/ 用库函数 strcmp 比较字符串大小k=j;if (k!=i)dianhuabu tmp=*(dhb+i);/ 定义dianhuabu 型变量 tmp乍为中间变量,进行交换*(dhb+i)
8、=*(dhb+k); *(dhb+k)=tmp;coutvv"排序结果如下:n"for (i=0;iv5;i+) vv "t" vvdhbi.numvvendl; / 输出排序后结果 return 0;2. 实验结果:1)随机输入名称:口 | 回39 匚iwi nd ow55ysterTi 32cmd exe请输入第1个用户的信息:姓名:ewrthr"电话号码:346768=请输入第2个用户的信息:姓名:bhnjt电话号码:4356请输入第3个用户的信息:姓名:nghjhtm电话号码;2346476请输入第4个用户
9、的信見:姓名;bfgdnhg电话号码:32457请输久第5个用户的信息:姓名:bghg.j电话号码】3245637您输入的信息如下:ewrthr 346768bhnjt 435(5nghjhtm 2346476bfgdnhg 32457bghgj 3245637排序结果如下:bfgdnhg 32457bghgj 3245637bhnjt 4356ewrthr 346768 nghjhtm 2346476 请按任意键继续.* |町I”(2)输入名称长度递增,后者包含前者,用来检验库函数 strcmp的排序效果:3B C:' /.indovs-'. 5t#m32cmd请输入第1个用
10、户的信息:姓名:abcdef 电话号码 5446378798请输入第2个用户的信息:姓名:abcdefg 电话号码書54267请输只第3个用户的信息:姓名:abcdefghi 电话号码:5467请输入第4个用户的信息:姓名:abcdefgh 电话号码 545676请输入第3个用户的信息:姓名:abcde 电话号码二456768 您输入的信息如下; abcdef 5446378798 abcdefg 54267 abcdefghi5467abcdefgh545676abcde 456768 排序结果如下: abcde 456768 abcdef 5446378798 abcdefg 54267
11、abcdefgh545676abcdefghi5467请按任意键继续.4 1rpi,3问题分析:略(三)第三题:输入两个整型数组(假设数组的大小为 7)的各个元 素,输出不是两个数组共有元素,例如,输入1,234,5,6,7和5,6,7,8,9,0,输出为 123,4,8,9,0.1. 源程序代码:/ 输入两个整型数组(假设数组的大小为 7)的各个元素,输出不是两个数组共 有元素,/ 例如,输入 1,2,3,4,5,6,7和5,6,7,8,9,0 ,输出为 1,2,3,4,8,9,0.#include <iostream> using namespacestd;int main()
12、int a7,b7,c14;int i,j,m=0;cout«"请输入数组a的每个元素:n"for (i=0;i<7;i+)cin>>*(a+i);cout«"请输入数组b的每个元素:n"for (j=0;j<7;j+)cin>>*(b+j);for (i=0;i<7;i+)j=0;while (*(a+i)!=*(b+j)&&j<7)j+;if (j=7)*(c+m)=*(a+i);m+;for (i=0;i<7;i+)j=0;while (*(b+i)!=*(a
13、+j)&&j<7)j+;if (j=7)*(c+m)=*(b+i);m+;if (m=0)cout<<" 没有非共有元素! n" ;return 0; / 直接结束,不再进行以下内容cout«"共有"mv<个非共有元素:n" int k;for (k=0;k<m;k+) cout<v*(c+k)vv " " ; / 输出 cout«e ndl;return 0;2. 实验结果:(1)全不相同:33 Ciwii nd 口诉叭 sy sts m3 2c md
14、l.wej II 叵 l|w|1 2 3 4 5 6 7请输入数绘b的每个元素:11 12 13 14 15 16 17共有珂个非共有元素;123456711121314151617请按任意键继续.* 1in1pJ 1(2)部分相同:33 CiXind owisy stemS 2Xc请输入数组&的每个元素;1 2 3 4 5 6 7 请输入数组b的每个元素:1 2 3 4 8 9 0 共有6个非共有元素:567890请按任意键继续.* f一I(3)全相同:fCiwind请输入数组a的每个兀素:*n 11 2 3 4 5 6 71_i请输入数组b的每个元素:H 2 3 4 5 6 7没有
15、非共有元素! 请按任意键继续1* I少1*3问题分析:不足之处:题目中说是数组大小为7,但第二个数组只有六个元素也进行了比较。 而我的作业中没有实现这一点,只能是 7个元素.(四)实验题目四:口袋中有红、黄、蓝、白、黑5种颜色的小球若干个,如果每次都从 口袋中取出3种不同颜色的小球,共有多少种组合?试打印出每种组 合的3种颜色,要求使用枚举类型来表示小球的颜色。1.程序源代码#include <iostream>using namespace std;enumColorsred,yellow,blue,white,black;void ys( int i)switch (i)cas
16、e red:cout« "red "break;case yellow:cout« "yellow "break;case blue:cout« "blue "break;case white:cout« "white "break;case black:cout« "black "break;void main()int s=O,i,j,k;for (i=red;i<=blue;i+)for (j=1+i;jv=white;j+)for
17、(k=j+1;k<=black;k+)s+;ys(i);ys(j);ys(k);coutvvendl;coutvv "总共的组合数为:"vvsvvendl;2.实验结果raw 匚A'Windowystein2cnn d.exeredyellowblueAredyellow叶hitmredyellowblackredbluewhiteredblueblackredwhiteblackyellowbluewhite/elLowblueblackyellowwhiteblackbluewhiteblack总共的组含数为!10请按任意犍纟瞬. 4 |irr3. 问题分
18、析 : 此题中虽然定义了枚举类型, 然而实际过程中, 感觉并没有使用到枚 举,它的存在似乎没有意义,不知道是不是方法用错了。五、第五题: 5 、编写函数,该函数实现任意一个正整数是否为完全 数。再编写函数输出完全数等于各因子之和的式子。最后找出 2100000 之内所有完全数。所谓完全数是其各因子之和正好等于本 身的数,例如输出格式如下的完全数: 6=1+2+3,28=1+2+4+7+14。#include <iostream>using namespacestd;void panduan( int i) / 自定义函数,用于判断 i 是不是完全数int m,s=0;int *nu
19、m=new int i; / 动态分配数组空间,虽然仍然大于实际需要值,但 数组大小基本上得到了控制for (m=1;m<=i/2;m+)if (i%m=0)nums=m;s+; /s 最终为因子个数int sum=0;int n;for (n=0;n<s;n+)sum=sum+numn;/sum 最终为各因子之和if (sum=i)cout<<i<< "=" ;for (n=0;n<s-1;n+)cout<<numn<< "+" ;cout<<nums-1<<en
20、dl;delete num; / 释放数组空间int main()int i;cout«"从2到的100000完全数如下:n" for (i=2;i<100000;i+)pan dua n(i);return 0;2.实验结果:3问题分析:在做这道题的过程中,起初出现了一个奇怪的现象:如果上限由100000改为10000,则程序正常运行,但对于100000,会显示出现问题:I Ll H 冃 IS3 f:盯5ytp n $ Arrrd pxf6=B2+328=1+2+4+7+14496=1+2+4+8+16+31+62+124+248 8128=1+2+4+8
21、-16+32+64-127+254-508+1016+2032+4064This application has requested the Runtime to terminar Please contact the application' s support team for more 请按任意键继续.,.后来检查不出问题时,发现了一直以来一个不良习惯: 不编写释放数 组空间的语句。试着加上这一语句之后再运行时, 发现程序能够正常 进行了,因而认为应该是这句语句的作用,但并不知道具体的原因。六、第六题: 6、(必做题)编写一个实现文章(即字符串)单词统 计功能的程序,要求:输入一
22、系列英文单词字符串(即带空格的字符 串),单词间用空格隔开或逗号或句号隔开。请统计该字符串中单词 出现的频率, 并按词典顺序输出单词及其频率。 必须用结构体方法实 现。1. 源程序代码:#include <iostream>#include <cstring>using namespacestd;struct frequencychar word20;int n;danci100; / 定义结构体变量 danci ,它由单词及其频率两个量组成struct wchar a20;in100; / 定义了个元素的字符串组,用于储存输入的句子中的每个单词int fre( cha
23、r nu,w in,int mu)/ 统计每个单词的频率函数int i,pl=0;for (i=0;i<mu;i+)if (strcmp(nu,ini.a)=0)pl+;return pl;void main()char article501;cout<< "输入句子: n" ;cin.get(article,500);int l=strlen(article); / 取其长度,定义为整型数 lint i,j,k,m;for (i=0,j=0;i<l;i+) / 开始循环,从 i=0 循环到 i=l ,循环内部也会对 i 进 行增加,因而主循环的 i
24、 是处理了一些节点:离开单词部分到进入单词部分之间 的字符char a=*(article+i); /a 定义为 article 第 i 个字符,if (a<= 'z' &&a>='a' )|(a<= 'Z' &&a>='A' ) / 判断若已经是字母了的话 就进入循环记录接下来的单词内容,否则继续 i 增加直到走完非字母字符到达字 母 m=0; k=i; char b=*(article+k); while (b<= 'z' &&b&g
25、t;='a' )|(b<= 'Z' &&b>='A' ) / 当它是字母就循 环,若已经不是字母了,就跳出循环inj.am=b;k+; m+; b=*(article+k); / 一直加直到遇到非字母字符时停止 inj.am= '0' ; / 这个单词转录完了之后,将最后一个字符写为 0' 以防乱码j+; / 下一个单词的写入i=k-1; /由于在小循环中k最后一次循环多加了一个,所以在这里扣 除,赋给 i,i 就不再执行单词的中间字母部分,只需对非字母部分判断直到遇到 下一个单词的开头字母/
26、至此,已记录所有单词到 in.a 中。int mu=j; /记录下单词数目,共有单词口个(注意到最后j加了)/ 然后将每一个不同的单词储存在 danci.word 里int s=0;for (i=0;i<mu;i+)j=0;while (j<i&&strcmp(ini.a,inj.a)!=0)j+;if (j=i) strcpy(dancis.word,ini.a); s+;/至此将所有不同单词依次储存到了 danci.word中,s为不同单词个数/然后排序for (i=0;i<s;i+)k=i;for (j=i+1;j<s;j+)if (strcmp(
27、dancij.word,dancik.word)<0)k=j;if (k!=i)freque ncy tmp=*(da nci+i);*(da nci+i)=*(da nci+k);*(da nci+k)=tmp;/cout«"统计结果为:n"for (i=0;i<s;i+)/逐个判断频率并导入到dancii.n中去dan cii. n=fre(da ncii.word,i n,mu);cout«"单词:"<<dancii.word<< "t 频率:"<<dancii
28、.*<endl;/输出2.实验结果:(1)按照题目要求的检验:fsn r:vji nd 0虫W "对a n ? TVrrr-d pvp输入句子;I7 and, vou, are, and, I, am, are? mavbe, you, and, I7 mavbe, are 统计结東为:单词:I频率:3辜率率率率 频频频频顷d p- y U m n r a o aaam y13322请按任意键继续 * .3B C;wi ndtem3 2c md-exeO : eafeL n勺 b b t 斗 ; d y o a s Ftsn aoh rhe 句wh结 入d,计词词词词词词词 喻
29、an绕单单电单雀单<率率率率率率率 频频频频频频频yes, probably.1111111(2) 事实上,由于审题失误,我所编写的这个程序,能够对一切情 况进行处理(个人认为这个程序能够实现题目的要求,所以不能算 错),单词之间可以有多个非字母字符,可以有空格,开头也可以有 各种字符,唯一不足的是无法将The和the识别为同一单词:S3 CAwndoiAis5yi5tern>321,icrnclKexeLEICbJI输入句子;!bs sgb sfg 统计结果为: 单词; 单词 单词 单词bgf bs sfgsgbb 率率率率 sg频频频频sgb sgb bgf请按任意键继续.输入
30、句子豈"Enjoy our short life:"He said, with a 已吐hough he is only twwenty-th"己 ye e cured and there is little time left and the gently blowing yind everyday world for a longer time.统计结果为:But频率:1Enjoy频率:1He频率:1I频率:2We频率:1a频率:2accept频率:1all频率:2although频率:1am频率:1and频率:2be频率:1birds频率:1blowing频
31、率:1can频率:1complex频率:1cured频率:1desires频率:1diaease频率:1司司可司司司司司3问题分析:这道题较难,再加上审题的失误导致我在这道题上做了 更多的工作。可能办法有点笨,但没有深入思考,所以最终程序较为 麻烦。从我最终编写的程序来看,能够实现对各种输入情况下单词数 的统计,实现这一功能主要问题在以下几点:首先说明程序的思路: 输入一个含有各种字符的字符串, 然后将其中的每一个单词依次挑选 出来同时将其储存在用结构体定义好的 一组字符串 中;然后将这些单 词中不同的单词挑出来存到另一二元结构体 单词,频率 的每一项的 “单词”元素中;然后对二元结构体根据“
32、单词”元素进行排序;然 后根据每个“单词”元素在原来储存的所有单词中的出现次数得到 频率并且同时将频率值保存到“频率”元素中并输出。(1)单词的分离过程,这应该是其中几乎最麻烦的过程。由于要将 每个单词识别出来, 分开并且储存下来所以要定义一系列的字符串用 于存储每个单词,为此定义了结构体:struct wchar a20;in100;然后需要判断单词。从第一个字符开始,遇到字母后开始将原字 符串的字符录入到单词字符串, 遇到不是字母的字符时停止, 给末尾 加上' 0'后这一单词的录入便完成, 然后从这个非字母字符开始在 往下判断,遇到下一个字母也就是下一个单词的首字母时子进行
33、下一 个单词的录入,直到完成所有录入。完成以上工作之后,为了进行下一步的统计频率,还需要将其中不同的单词挑出来然后存储到二元结构体的Word元素中,为此进行如下操作:从第一个单词开始, 逐个判断它是不是与前面所有单词都不相同, 若是,则将其存储下来,否则不存储。为此用了库函数 strcmp 进行 两个字符串之间的比较。(2)排序:这一环节比较简单,完全可以仿照作业第二题的方法;(3)频率统计:将存储下来的不同单词依次在所有单词中找出与之 相同的个数即可, 由于之前已经完成, 故可以在记录频率同时输出结 果。(4)不足:用到库函数 strcmp 时,程序有警告,但可以运行,至于 警告的原因,尚不
34、清楚。(七)第七题: 7 、(必做题)任意输入一个正整数,统计输出各个 数位上数字出现的次数。例如输入 312366060,输出 0为2;1为1; 2为 1;3 为 2;6为 3。1.源程序代码:#include <iostream>using namespacestd;struct frequencyint m;/ 数字 int n; / 频率;int main()int x; / 输入的数cout<< "请输入整数: "cin>>x;a得到的int a,i,j,k,s=x; /s 初始为输入值,后逐渐缩小,用于求解位数; 是位数for
35、 (a=0;s>0;a+) s=s/10;int *num=new int a;for (i=0,s=x;i<a;i+) *(num+i)=s%10; s=s/10;frequency fre10;for (j=0;j<=9;j+)k=0;for (i=0;i<=a;i+)if (j=numi)k+;frej.n=k;frej.m=j;cout<< "统计结果如下: n" ;for (j=0;j<10;j+)if (frej.n!=0) cout<<frej.m<< "t" <<
36、;frej.n<<endl;return 0;2. 实验结果:(1)开头不是 0:SB C;wi nd owXsysterni 2c mdl.exe1 Gl 巨 I请输入W: 232323645 统计结果如下:(2)开头是0,由于是输入正整数,所以开头的 0不考虑:6 1 请按任意键继续.2 II GCsind cm 叭5泸怙 m3 2c 叩dl,e<e请输入整数;01245155 统计结果如下;12214 15 3请按任意键继续3问题分析:思路:(1)求出整数位数,以便动态分配数组空间;(2)依次分离出每一位的数存储下来;(3)从0到9逐个统计个数;(4)对于个数为0的不输
37、出,大于0的输出统计结果八、第八题:& (选作题)第一将整数翻译程序中翻译千位整数的函 数直接屏幕输出英文改为形成翻译字符串返回给主调函数;第二将子串个数统计程序改为使用库函数 strncmp() 来实现。1. 源程序代码:(1)#include <iostream>#include <cstring>using staticnamespacestd;char *gewei=T.IlliJ"one " , "two " , "three " , "four ","five
38、","six " , "seven " , "eight " , "nine " , "ten " , "eleven ","twelve ","thirteen " , "fourteen " , "fifteen ","sixteen ","seventeen " , "eighteen " , "nineteen " staticchar *shiwei=IlliJIlliJ"twenty " , "thirty " , "forty ","fifty ","sixty ","seventy " , "eighty "
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度教育培训中心租赁合同范本-@-1
- 二零二五年度木门电商平台合作运营合同
- 2025年全球及中国人体工学靠垫行业头部企业市场占有率及排名调研报告
- 2025-2030全球水处理用复合管行业调研及趋势分析报告
- 2025-2030全球呼吸道药物吸入器行业调研及趋势分析报告
- 二零二五年度内墙保温材料研发与市场推广合作合同
- 二零二五年度驾驶员安全责任保险合同范本
- 合伙房屋买卖合同
- 四川省事业单位聘用合同
- 瓷砖销售买卖合同协议
- 中国储备粮管理集团有限公司兰州分公司招聘笔试真题2024
- 第1课 隋朝统一与灭亡 课件(26张)2024-2025学年部编版七年级历史下册
- 提高金刚砂地坪施工一次合格率
- 【历史】唐朝建立与“贞观之治”课件-2024-2025学年统编版七年级历史下册
- 产业园区招商合作协议书
- 2024年广东省公务员录用考试《行测》真题及答案解析
- 2025新译林版英语七年级下单词默写表
- 盾构标准化施工手册
- 天然气脱硫完整版本
- 中欧班列课件
- 2025届高三数学一轮复习备考经验交流
评论
0/150
提交评论