西安交大C++程序设计第四章作业2_第1页
西安交大C++程序设计第四章作业2_第2页
西安交大C++程序设计第四章作业2_第3页
西安交大C++程序设计第四章作业2_第4页
西安交大C++程序设计第四章作业2_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西安交通大学实验报告 课程 计算机程序设计 实验名称 结构体 第 1 页 共 29 页 系 别 实 验 日 期 2014 年 4 月 26 日 专业班级 组别 实 验 报 告 日 期 2014 年 4 月 27 日 姓 名 学号 报 告 退 发 订正 重做 同 组 人 教 师 审 批 签 字 一 实验目的 掌握结构体的使用方法 学会用结构体的方法定义变量并对变 量进行处理 掌握枚举法的使用方法 二 实验内容 一 第一题 1 输入某小组 5 个人的姓名 性别 出生年份 等信息 统计男女人数以及 1988 年以后 含 1988 年 出生的人 数 1 源程序代码 输入某小组个人的姓名 性别 出生年份等信息 统计男女人数以及年以后 含年 出生的人数 include using namespace std struct xinxi char name 20 char sex int year 定义结构体xinxi 包含名称 字符串 性别 字符 出生时间 整数 三个变量 int main xinxi cy 5 int i s 0 m 0 for i 0 i 5 i cout 请输入第 i 1 cy i name cout cy i sex cout cy i year cout 您输入的是 n for i 0 i 5 i 显示输入内容 cout cy i name t cy i sex t cy i year endl for i 0 i 1988 m cout 其中男生人数为 s t女生人数为 5 s endl cout 1988年以后 含 出生的的人数为 m endl return 0 2 实验结果 3 问题分析 略 二 第二题 读入五个用户的姓名和电话号码 按照姓名的字典 顺序排列后 输出用户的姓名和电话号码 1 源程序代码 读入五个用户的姓名和电话号码 按照姓名的字典顺序排列后 输出用户的 姓名和电话号码 include include using namespace std struct dianhuabu char name 30 char num 15 定义结构体dianhuabu 包含两个变量 名字和电话号码 由于电话号码较 长又无需对其进行具体处理 故定义为字符串型 int main dianhuabu dhb 5 声明dianhuabu型变量 int i for i 0 i 5 i cout 请输入第 i 1 dhb i name cout dhb i num cout 您输入的信息如下 n for i 0 i 5 i 显示输入信息 cout dhb i name t dhb i num n for i 0 i 5 i 排序 int k i for int j i 1 j 5 j if strcmp dhb j name dhb k name 0 用库函数strcmp比较 字符串大小 k j if k i dianhuabu tmp dhb i 定义dianhuabu型变量tmp作为中间变 量 进行交换 dhb i dhb k dhb k tmp cout 排序结果如下 n for i 0 i 5 i cout dhb i name t dhb i num endl 输出排序后结果 return 0 2 实验结果 1 随机输入名称 2 输入名称长度递增 后者包含前者 用来检验库函数 strcmp 的排序效果 3 问题分析 略 三 第三题 输入两个整型数组 假设数组的大小为 7 的各个 元素 输出不是两个数组共有元素 例如 输入 1 2 3 4 5 6 7 和 5 6 7 8 9 0 输出为 1 2 3 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 using namespace std int main int a 7 b 7 c 14 int i j m 0 cout 请输入数组a的每个元素 n for i 0 i a i cout 请输入数组b的每个元素 n for j 0 j b j for i 0 i 7 i j 0 while a i b j if j 7 c m a i m for i 0 i 7 i j 0 while b i a j if j 7 c m b i m if m 0 cout 没有非共有元素 n return 0 直接结束 不再进行以下内容 cout 共有 m 个非共有元素 n int k for k 0 k m k cout c k 输出 cout endl return 0 2 实验结果 1 全不相同 2 部分相同 3 全相同 3 问题分析 不足之处 题目中说是数组大小为 7 但第二个数组只有六个元素也进行了比 较 而我的作业中没有实现这一点 只能是 7 个元素 四 实验题目四 口袋中有红 黄 蓝 白 黑5种颜色的小球若干个 如果每次都从 口袋中取出3种不同颜色的小球 共有多少种组合 试打印出每种组 合的3种颜色 要求使用枚举类型来表示小球的颜色 1 程序源代码 include using namespace std enum Colors 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 0 i j k for i red i blue i for j 1 i j white j for k j 1 k black k s ys i ys j ys k cout endl cout 总共的组合数为 s endl 2 实验结果 3 问题分析 此题中虽然定义了枚举类型 然而实际过程中 感觉并没有使用到 枚举 它的存在似乎没有意义 不知道是不是方法用错了 五 第五题 5 编写函数 该函数实现任意一个正整数是否为完 全数 再编写函数输出完全数等于各因子之和的式子 最后找出 2 100000 之内所有完全数 所谓完全数是其各因子之和正好等于本 身的数 例如输出格式如下的完全数 6 1 2 3 28 1 2 4 7 14 include using namespace std 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 s n sum sum num n sum最终为各因子之和 if sum i cout i for n 0 n s 1 n cout num n cout num s 1 endl delete num 释放数组空间 int main int i cout 从2到的100000完全数如下 n for i 2 i 100000 i panduan i return 0 2 实验结果 3 问题分析 在做这道题的过程中 起初出现了一个奇怪的现象 如果上限由 100000改为10000 则程序正常运行 但对于100000 会显示出现问 题 后来检查不出问题时 发现了一直以来一个不良习惯 不编写释放 数组空间的语句 试着加上这一语句之后再运行时 发现程序能够 正常进行了 因而认为应该是这句语句的作用 但并不知道具体的 原因 六 第六题 6 必做题 编写一个实现文章 即字符串 单词统 计功能的程序 要求 输入一系列英文单词字符串 即带空格的字 符串 单词间用空格隔开或逗号或句号隔开 请统计该字符串中 单词出现的频率 并按词典顺序输出单词及其频率 必须用结构体 方法实现 1 源程序代码 include include using namespace std struct frequency 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 mu 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 l i 开始循环 从i 0循环到i l 循环内部也会对i进 行增加 因而主循环的i是处理了一些节点 离开单词部分到进入单词部分之间 的字符 char a article i a定义为article第i个字符 if a a a A 判断若已经是字母了的话 就进入循环记录接下来的单词内容 否则继续i增加直到走完非字母字符到达字 母 m 0 k i char b article k while b a 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 记录下单词数目 共有单词mu个 注意到最后j加了 然后将每一个不同的单词储存在danci word里 int s 0 for i 0 i mu i j 0 while j i if j i strcpy danci s word in i a s 至此将所有不同单词依次储存到了danci word中 s为不同单词个数 然后排序 for i 0 i s i k i for j i 1 j s j if strcmp danci j word danci k word 0 k j if k i frequency tmp danci i danci i danci k danci k tmp cout 统计结果为 n for i 0 i s i 逐个判断频率并导入到danci i n中去 danci i n fre danci i word in mu cout 单词 danci i word t频率 danci i n endl 输出 2 实验结果 1 按照题目要求的检验 2 事实上 由于审题失误 我所编写的这个程序 能够对一切 情况进行处理 个人认为这个程序能够实现题目的要求 所以不能 算错 单词之间可以有多个非字母字符 可以有空格 开头也可 以有各种字符 唯一不足的是无法将The和the识别为同一单词 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 源程序代码 include using namespace std struct frequency int m 数字 int n 频率 int main int x 输入的数 cout x int a i j k s x s初始为输入值 后逐渐缩小 用于求解位数 a得到 的是位数 for 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 fre 10 for j 0 j 9 j k 0 for i 0 i a i if j num i k fre j n k fre j m j cout 统计结果如下 n for j 0 j 10 j if fre j n 0 cout fre j m t fre j n endl return 0 2 实验结果 1 开头不是 0 2 开头是 0 由于是输入正整数 所以开头的 0 不考虑 3 问题分析 思路 1 求出整数位数 以便动态分配数组空间 2 依次分离出每一位的数存储下来 3 从 0 到 9 逐个统计个数 4 对于个数为 0 的不输出 大于 0 的输出统计结果 八 第八题 8 选作题 第一将整数翻译程序中翻译千位整数的 函数直接屏幕输出英文改为形成翻译字符串返回给主调函数 第二 将子串个数统计程序改为使用库函数 strncmp 来实现 1 源程序代码 1 include include using namespace std static char gewei one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen static char shiwei twenty thirty forty fi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论