课程 计算机程序设计
系 别__ 专业班级__ 姓 名_
_
实验名称 结构体 第1页共29页
_____ 实 验 日 期2014 年4月26日
_ __组别 _______________ 实验报告日期2014 年4月27日
_ 报 告 退 发(订正、重做)
— 一一 学号_
同组人 ______________________________________ 教师审批签字
一、 实验目的
掌握结构体的使用方法,学会用结构体的方法定义变量并对变 量进行处理;掌握枚举法的使用方法。
二、 实验内容
(一)第一题:1、输入某小组5个人的姓名、性别、出生年份 等信息,统计男女人数以及1988年以后(含1988年)出生的人 数。
1. 源程序代码:
//输入某小组个人的姓名、性别、出生年份等信息,统计男女人数以及年以后(含
年)出生的人数。
#include using namespacestd; struct xinxi { char n ame[20]; char sex; int year; }; //定义结构体xinxi,包含名称(字符串)、性别(字符)、出生时间(整数) 三 个变量 int main() { xi nxi cy[5]; int i,s=0,m=0; for (i=0;i<5;i++) { coutvv\"请输入第\"<>cy[i].name; coutvv\"性别(男的输入b”女的输入g ”):\"; cin>>cy[i].sex; coutvv\"出生年份:\"; cin>>cy[i].year; } coutvv\"您输入的是:\\n\"; for (i=0;iv5;i++) // 显示输入内容 coutvvcy[i].namevv \"\\" vvcy[i].sexvv \"\\" vvcy[i].yearvvendl; for (i=0;iv5;i++) // 统计男女、之后个数 { if (cy[i].sex== 'b' ) s++; if (cy[i].year>=1988) m++; } coutvv\"其中男生人数为:\"wsvCt女生人数为:\"vv5-svvendl; coutvv \"1988年以后(含)出生的的人数为:\"vvmvve ndl; return 0; } 2. 实验结果: OS C:W^in dows\\syrtenn32\\cmd1exe 谆触八弟丄个咸员的信息: \" 常曹寿r” •女的输入b ______________________ 11? 豈赣人兼个成员的信息, 姓名r的输入F ■女的输人b Ji: 1^V6 Ejj 请筮人第H个成员的信息’ 性别隅的输入 f 以的输入《>=» 出生年俶1996 髄入聲4个成员的信息= 性勃隅的输入m的输u吉 岀生年册:1988 请锁人鄴个成员的信息. 姓名:xiaoli 性臥男的输入计•女的输人=\";a 出生孝粉.198? 您输八崗杲: brd b cs j b d3j b 1??^ 199ft xlaoning xiaoli A 其中塁吿△数知 19 9& a 丄 LW毗年以后(含988 1908 )岀生 请1987 按任意霾继I- - 3 - ■ 姓各dzj 3•问题分析:略。 (二)第二题: 读入五个用户的姓名和电话号码,按照姓名的字典 顺序排列后,输出用户的姓名和电话号码。 1.源程序代码: //读入五个用户的姓名和电话号码,按照姓名的字典顺序排列后,输出用户的姓 名 和电话号码。 #include char n ame[30]; char nu m[15]; }; //定义结构体dianhuabu,包含两个变量:名字和电话号码。由于电话号码较 长 又无需对其进行具体处理,故定义为字符串型 int main() dianhuabu dhb[5]; // 声明 dianhuabu 型变量 int i; for (i=0;i<5;i++) { coutvv\"请输入第\"<>dhb[i].name; cout<<\" 电话号码: \"; cin>>dhb[i].num; } coutvv\"您输入的信息如下:\\n\"; for (i=0;i<5;i++) // 显示输入信息 { coutvvdhb[i].namevv \"\\" vvdhb[i].numvv \"\\n\" ; } int k=i; for (int j=i+1;jv5;j++) if (strcmp(dhb[j].name,dhb[k].name)<0) for (i=0;iv5;i++) // 排序 { // 用库函数 strcmp 比较 字符串大小 k=j; if (k!=i) { dianhuabu tmp=*(dhb+i); // 定义dianhuabu 型变量 tmp乍为中间变 量,进行交换 *(dhb+i)=*(dhb+k); *(dhb+k)=tmp; } } coutvv\"排序结果如下:\\n\"; for (i=0;iv5;i++) coutvvdhb[i].namevv \"\\" vvdhb[i].numvvendl; // 输出排序后结果 return 0; } 2. 实验结果: 1)随机输入名称: 39 匚i^wi nd ow5\\5ysterTi 32\\cmd ^exe 口 | 回 请输入第1个用户的信息:姓名:ewrthr 电话号码:346768 请输入第2个用户的信息:姓名:bhnjt 电话号码:4356 \" = 请输入第3个用户的信息:姓名:nghjhtm 电话号码;23476 请输入第4个用户的信見:姓名;bfgdnhg 电话号码:32457 请输久第5个用户的信息:姓名:bghg.j 电话号码】3245637 您输入的信息如下: ewrthr 346768 bhnjt 435(5 nghjhtm 23476 bfgdnhg 32457 bghgj 3245637 排序结果如下: bfgdnhg 32457 bghgj 3245637 bhnjt 4356 ewrthr 346768 nghjhtm 23476 请按任意键继续. * | 町■ I ” ( 2)输入名称长度递增,后者包含前者,用来检验库函数 strcmp的 排序效果: 3B C:' /.indo^vs-^'. 5t#m32\\cmd 请输入第1个用户的信息:姓名:abcdef 电话号码< 46378798 请输入第2个用户的信息:姓名:abcdefg 电话号码書267 请输只第3个用户的信息:姓名:abcdefghi 电话号码:67 请输入第4个用户的信息:姓名:abcdefgh 电话号码’ 5676 请输入第3个用户的信息:姓名:abcde 电话号码二456768 您输入的信息如下; abcdef 46378798 abcdefg 267 abcdefghi 67 abcdefgh 5676 abcde 456768 排序结果如下: abcde 456768 abcdef 46378798 abcdefg 267 abcdefgh 5676 abcdefghi 67 请按任意键继续・・・. 4 1 rpi , 3•问题分析:略 (三)第三题:输入两个整型数组(假设数组的大小为 7)的各个元 素,输出不是两个数组共有元素,例如,输入 5,6,7,8,9,0,输出为 123,4,8,9,0. 1. 源程序代码: // 输入两个整型数组(假设数组的大小为 7)的各个元素,输出不是两个数组共 有元 1,234,5,6,7和 素, // 例如,输入 1,2,3,4,5,6,7 和5,6,7,8,9,0 ,输出为 1,2,3,4,8,9,0. #include { int a[7],b[7],c[14]; 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++; } } j=0; while (*(b+i)!=*(a+j)&&j<7) j++; if (j==7) { for (i=0;i<7;i++) { *(c+m)=*(b+i); m++; } } cout<<\" 没有非共有元素! \\n\" ; return 0; // 直接结束,不再进行以下内容 if (m==0) { } cout«\"共有\"《mv<个非共有元素:\\n\"; int k; for (k=0;k (1)全不相同: 33 Ci\\wii nd 口诉叭 sy sts m3 2\\c mdl.we j II 叵 l|w| (2)部分相同: 1 2 3 4 5 6 7 □ 请输入数绘b的每个元素: 11 12 13 14 15 16 17 共有珂个非共有元素; 1 2 3 4 5 6 7 11 12 13 14 15 16 17 请按任意键继续・・.. * 1 in 1 p J 1 33 CiX^ind owi\\sy stemS 2Xc 请输入数组&的每个元素; 1 2 3 4 5 6 7 请输入数组b的每个元素: 1 2 3 4 8 9 0 共有6个非共有元素: 5 6 7 8 9 0请按任意键继续. * f ——一I (3)全相同: f Ci\\wind 请输入数组a的每个兀素: 1 2 3 4 5 6 7 请输入数组b的每个元素: H 2 3 4 5 6 7 没有非共有元素! 请按任意键继续・•・■ 少 1 * I 3•问题分析: * n 1_1 * 不足之处: 题目中说是数组大小为7,但第二个数组只有六个元素也进行了比较。 而我的作业中没有实现这一点,只能是 7个元素. (四)实验题目四: 口袋中有红、黄、蓝、白、黑5种颜色的小球若干个,如果每次都从 口袋中取出3种不同颜色的小球,共有多少种组合?试打印出每种组 合的3种颜色,要求使用枚举类型来表示小球的颜色。 1.程序源代码 #include enumColors{red,yellow,blue,white,black}; void ys( int i) { switch (i) { case 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 (k=j+1;k<=black;k++) { s++; ys(i); ys(j); ys(k); coutvvendl; } coutvv \"总共的组合数为:\"vvsvvendl; } 2.实验结果 raw 匚A'Window red red red red red ystein^2\\cnn d.exe A yellow blue yellow 叶hitm yellow black blue white blue black □ red white black yellow blue white /elLow blue black yellow white black blue white black 总共的组含数10 请按任意犍纟瞬. 4 | ■ ■ ■ irr 3. 问题分析 : 此题中虽然定义了枚举类型, 然而实际过程中, 感觉并没有使用到枚 举,它的存在似乎没有意义,不知道是不是方法用错了。 五、第五题: 5 、编写函数,该函数实现任意一个正整数是否为完全 数。再编写函数输出完全数等于各因子之和的式子。最后找出 2~100000 之内所有完全数。所谓完全数是其各因子之和正好等于本 身的数,例如输出格式如下的完全数: 6=1+2+3,28=1+2+4+7+14。 #include void panduan( int i) // 自定义函数,用于判断 i 是不是完全数 { int m,s=0; int *num=new int [i]; // 动态分配数组空间,虽然仍然大于实际需要值,但 数 组大小基本上得到了控制 for (m=1;m<=i/2;m++) { if (i%m==0) { num[s]=m; s++; //s 最终为因子个数 } } int sum=0; int n; for (n=0;n { cout<cout< 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,会显示出现问 题: ■ S3 f:\\盯」5y^tp n $ Arrrd PXF I Ll H 冃 I 6=B2+3 28=1+2+4+7+14 496=1+2+4+8+16+31+62+124+248 8128=1+2+4+8-16+32+^-127+2-508+1016+2032+40 This application has requested the Runtime to terminar Please contact the application' s support team for more 请按任意键继续.,. 后来检查不出问题时,发现了一直以来一个不良习惯: 不编写释放数 组空间的语句。试着加上这一语句之后再运行时, 发现程序能够正常 进行了,因而认为 应该是这句语句的作用,但并不知道具体的原因。 六、第六题: 6、(必做题)编写一个实现文章(即字符串)单词统 计功能的程序,要求:输入一系列英文单词字符串(即带空格的字符 串),单词间用空格隔开或逗号或句号隔开。请统计该字符串中单词 出现的频率, 并按词典顺序输出单词及其频率。 必须用结构体方法实 现。 1. 源程序代码: #include { char word[20]; int n; }danci[100]; // 定义结构体变量 danci ,它由单词及其频率两个量组成 struct w { char a[20]; }in[100]; // 定义了个元素的字符串组,用于储存输入的句子中的每个单词 int fre( char nu[],w in[], int mu)// 统计每个单词的频率函数 { int i,pl=0; for (i=0;i if (strcmp(nu,in[i].a)==0) pl++; } return pl; } void main() { char article[501]; cout<< \"输入句子: \\n\" ; cin.get(article,500); int l=strlen(article); // 取其长度,定义为整型数 l int i,j,k,m; for (i=0,j=0;i { 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>='a' )||(b<= 'Z' &&b>='A' )) // 当它是字母就循 环,若已经不是字母了,就跳出循环 { { in[j].a[m]=b; k++; m++; b=*(article+k); }; // 一直加直到遇到非字母字符时停止 in[j].a[m]= '\\0' ; // 这个 单词转录完了之后,将最后一个字符写为 ‘\\0' 以防乱码 j++; // 下一个单词的写入 i=k-1; //由于在小循环中k最后一次循环多加了一个,所以在这里扣 除,赋给 i,i 就不再执行单词的中间字母部分,只需对非字母部分判断直到遇到 下一个单词的开头字母 } }// 至此,已记录所有单词到 in[].a 中。 int mu=j; //记录下单词数目,共有单词口个(注意到最后j加了) // 然后将每一个不同的单词储存在 danci[].word 里 int s=0; for (i=0;i j=0; while (jj++; if (j==i) { strcpy(danci[s].word,in[i].a); s++; }//至此将所有不同单词依次储存到了 danci.word中,s为不同单词个数 } //然后排序 for (i=0;i for (j=i+1;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 cout«\"单词:\"< 输出 } } 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 频辜1 频率3 频率3 频率2 顷率2 请按任意键继续・• * . d p- y U m n r a o aaam y 3B C;\\wi ndtem3 2\\c md-exe 入斗绕・单计句单词电词结单词雀词勺单词词■词喻anO : eafeL n b b t ; d y o a s Ftsn aoh rhe wh ........... d, yes, probably. 频率频率频率频率频率频率频率1 1 1 1 1 1 1 < (2) 事实上,由于审题失误,我所编写的这个程序,能够对一切情 况进行处理(个人认为这个程序能够实现题目的要求,所以不能算 错),单词之间可以有多个非字母字符,可以有空格,开头也可以有 各种字符,唯一不足的是无法将The和the识别为同一单词: S3 CAwndoiAis\\5yi5tern>321,icrnclKexe LEICBJI sgb sgb bgf 输入句子; !bs sgb sfg sgb 频统计结果为: bgf 单词; 单词 bs 单词 单词sfg 频率频率频率率 b sg请按任意键继续. 输入句子豈 \"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 频率:1 Enjoy 频率:1 He 频率:1 I频率:2 We 频率:1 a频率:2 accept 频率:1 all 频率:2 although 频率:1 am 频率:1 司and 频率:2 司be 频率:1 birds 频率:1 可blowing 频率:1 司can 频率:1 司频率:1 司complex 司cured 频率:1 司desires 频率:1 diaease 频率:1 3•问题分析:这道题较难,再加上审题的失误导致我在这道题上做了 更多的工作。可能办法有点笨,但没有深入思考,所以最终程序较为 麻烦。从我最终编写的程序来看,能够实现对各种输入情况下单词数 的统计,实现这一功能主要问题在以下几点: 首先说明程序的思路: 输入一个含有各种字符的字符串, 然后将其中的每一 个单词依次挑选 出来同时将其储存在用结构体定义好的 一组字符串 中;然后将这些单 词中不同的单词挑出来存到另一二元结构体 {单词,频率} 的每一项的 “单词”元素中;然后对二元结构体根据“单词”元素进行排序;然 后根据每个“单词”元素在原来储存的所有单词中的出现次数得到 频率并且同时将频率值保存到“频率”元素中并输出。 (1)单词的分离过程,这应该是其中几乎最麻烦的过程。由于要将 每个单词识别出来, 分开并且储存下来所以要定义一系列的字符串用 于存储每个单词,为此定义了结构体: struct w { char a[20]; }in[100]; 然后需要判断单词。从第一个字符开始,遇到字母后开始将原字 符串的字符录入到单词字符串, 遇到不是字母的字符时停止, 给末尾 加上' 0'后这一单词的录入便完成, 然后从这个非字母字符开始在 往下判断,遇到下一个字母也就是下一个单词的首字母时子进行下一 个单词的录入,直到完成所有录入。 完成以上工作之后,为了进行下一步的统计频率,还需要将其中 不同的单词挑出来然后存储到二元结构体的 如下操作: Word元素中,为此进行 从第一个单词开始, 逐个判断它是不是与前面所有单词都不相同, 若是,则将其存储下来,否则不存储。为此用了库函数 strcmp 进行 两个字符串之间的比较。 (2) 排序:这一环节比较简单,完全可以仿照作业第二题的方法; (3) 频率统计:将存储下来的不同单词依次在所有单词中找出与之 相同的个数即可, 由于之前已经完成, 故可以在记录频率同时输出结 果。 (4) 不足:用到库函数 strcmp 时,程序有警告,但可以运行,至于 警告的原因,尚不清楚。 (七)第七题: 7 、(必做题)任意输入一个正整数,统计输出各个 数位上数字出现的次数。例如输入 312366060,输出 0为2;1为1; 2为 1;3 为 2;6为 3。 1.源程序代码:sum=sum+num[n];//sum 最终为各因子之和 if (sum==i)k=i;if (strcmp(danci[j].word,danci[k].word)<0) k=j;dan ci[i]. n=fre(da nci[i].word,i n,mu);
Copyright © 2019- haog.cn 版权所有 赣ICP备2024042798号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务