计算机高级语言程序课程设计.docx_第1页
计算机高级语言程序课程设计.docx_第2页
免费预览已结束,剩余14页可下载查看

下载本文档

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

文档简介

计算机高级语言程序(c+)课程设计报告学 院: 信工学院_专 业: 测绘工程 学 号: 姓 名: 指 导 老 师: 2015年12月20日实习题目一【需求规格说明】编写一个函数实现m行k列矩阵与k行n列矩阵的乘法。设a为m行k列矩阵,b为k行n列矩阵,则c=ab,乘积c为m行n列矩阵。矩阵乘法的规则是:设am,k,bk,n,则cm,n= am,k bk,n。其中(见下述公式):例如: 【算法设计】(1)设计思想:该矩阵的计算是通过a数组每一行的每一个数字分别与b数组每一列的每个数字对应相乘,所得结果累加得到c数组的目的结果。通过构建数组对所得结果进行表示和输出。(2)设计表示:调用函数fun被主函数调用。【调试报告】 需要输入的数组长度不知,若使用平时的数组定义,那么会导致内存的浪费或者元素的表示不完整,这时就需要采取动态内存分配的方法,需要多少,分配多少。 另外,对于多维数组,采用利用指针指向指针型数组的方法,而不是简单地定义指针指向整型数组,否则导致结果的输出有问题。【附录】#include stdafx.h#includeusing namespace std;typedef int* intptr; /类型定义一个int型指针void fun(int m,int n,int k)cout请输入数组amkendl; intptr*pp=new intptr m; /定义一个指向该int指针型数组动态内存空间的指针 for(int e=0;em;e+) ppe=new intk; for(int i=0;im;i+) for(int j=0;jppij; coutendl;cout请输入数组bknendl; /重复上述操作,定义数组b intptr*pp2=new intptr k; for(int f=0;fk;f+) pp2f=new intn; for(int i1=0;i1k;i1+) for(int j1=0;j1pp2i1j1; coutendl; intptr*pp3=new intptr m; /重复上述操作,定义数组c for(int g=0;gm;g+) pp3g=new intn; for(int x=0;xm;x+) for(int y=0;yn;y+) int sum=0; for(int z=0;zk;z+) pp3xy=ppxz*pp2zy; sum+=pp3xy; coutsum ; coutendl; int main() int m,n,k; cout请输入amk,bkn的m,n,kmnk; fun(m,n,k); return 0;输入 实习题目二【需求规格说明】请编写名称为fun的函数,并在主函数中调用该函数,完成以下功能:(1)根据以下公式计算s,计算结果作为函数值返回,n通过形参传入;s=1+1/(12+22)+1/(12+22+32)+1/(12+22+32+n2)(2)编写主函数代码,调用该函数,允许用户手动输入n。【算法设计】(1)设计思想:通过递归对(12+22+.)进行计算,又对s同样以递归方式计算,最后通过主函数输出,即利用2次函数的调用。(2)设计表示:主函数(用于输出s结果)fun函数(用于表示s结果)diao函数(用于表示分母)【调试报告】由于分母表示的结果为整型,因此s结果累加的每一项结果都是0(整数相除结果还是整数),经过更正后,把1变为1.0,解决了这个问题。【附录】#include stdafx.h#include using namespace std;unsigned diao(unsigned x) /对每项的分母构造函数进行递归unsigned y;if(x=0)y=0;elsey=diao(x-1)+x*x;return y;float fun(unsigned m) /对s进行递归float s;if(m=0)s=0;else s=fun(m-1)+1.0/diao(m); /避免整数除以整数的结果为整数产生的错误return s;int main() /对s的结果进行输出unsigned n;cout 输入nn;coutfun(n)endl;return 0;输入n=2,输出s=1.2实习题目三【需求规格说明】编写一个函数,实现如下字符串加密解密功能。并在主函数中添加代码进行调用测试。加密规则:加密后字符原始字符原始字符在原始字符串中位置序号(序号从1开始)。例如:原始字符串:abcdmz 加密后:bdfhrf【算法设计】(1)设计思想: 因为输入的字符串长度未知,采用vector一维数组的表示方法,用户先输入数组长度,并通过s.push_back()对每个字符进行输入(在该程序中我设定了用户只能输入小写字母)。 对于字符的加密,直接通过ascell的加减进行变换,输出的结果仍为字符表示。 针对像z这些加密后超出26个小写字母范围的字符,我采用除以26取余的方法。(2)设计表示:主函数输入字符长度,再输入字符内容使实参对应于lock函数中的形参,通过lock函数运算,得到加密结果。【调试报告】 一开始不知道字符数未知情况下怎么表述,后来在书上看到vector就利用其来解决了问题,发现输入字符的方面十分方便。 对于字符超过26小写字母的特殊情况,首先是想到了循环,但毕竟多次循环太麻烦了,通过改进,得到了取余的解决方案。【附录】#include stdafx.h#include #include /添加vector头文件using namespace std;void lock (vector &s) /对char型数组s进行定义 int num; /定义数组长度的输入值 cinnum; cout请输入任意个小写字母组成的字符串endl; for(int i=0;istr;s.push_back(str); /通过for循环,对字符串内容进行输入 int t=(si+i+1)-a)%26; /进行取余操作char m=t+a; /利用ascell操作直接得到相应的字符coutm ;int main()cout请输入字符串长度的数字endl;vectora; /lock函数的实参定义lock(a);return 0;输入字符串:abcdmz 加密后输出:bdfhrf实习题目四【需求规格说明】编写一个函数,输入一个十六进制数,输出相应的十进制数。并在主函数中添加代码进行调用测试。【算法设计】(1)设计思想: 因为输入的内容包括数字和大小写字母,采用string类型。 通过s.length()得到字符串的长度,得以使用for循环输入。 定义double型的k表示字符计算并转化成ascell码之后的数值。 定义power函数对16的n次方进行计算。(2)设计表示:主函数(用于输出最终结果)tran函数(用于转换字符为数值)power函数(用于求解16n次方)【调试报告】一开始不知道怎么表示字符串的长度,通过查阅百度资料了解到s.length的使用。对于16 的n次方的计算考虑到放到tran函数中看起来较为繁琐,也不利于后期的改进,我选择另外构建函数进行调用。 为了不同类型的字符便于区分,我采用if语句。【附录】#include stdafx.h#include#include / 添加string头文件using namespace std;int power(int x) /构建16 的n次方函数int val=1;while(x-) val=val*16;return val;void tran() /构建转换字符为数值的函数 cout输入你想转化成十进制的十六进制数s; double h=0;int a=s.length(); /求解得到字符串的长度 int b=a-1; for(int i=0;i=0&si=a&si=a&si=f) k=si-a+10; h=h+k*power(b); b-; cout十六进制数转化成的是h=20)。 【基本要求】 (1)数据的表示和存储; (1.1) 累积运算的中间结果和最终的计算结果的数据类型要求是整型这是问本 身的要求; (1.2) 试设计合适的数组,要求每个元素最多存储数据的1位数值。 (2)数据的操作及其实现: 基于设计的存储结构实现乘法操作,要求从键盘上输入n值;在屏幕上显示最终计算结果。【算法设计】(1)设计思想: 设计数据的存储结构:介于阶乘运算的精确性以及实型(double)数据表示的不精确性,本题无法直接采用实 型表示累积运算的中间结果和最终的计算结果,而只能用整型。然而由于普通整型和长整型所能表述数的范围受其字长的限制,无法表示大数阶乘的累积结果,故必须采用数组等合适的构造型结构实现对数据的存储与表示,例如可以让每个元素存储数据的若干位数值。 数据的操作及其实现: (2.1)累积运算的特点是当前的计算结果是下次乘法运算的乘数;(2.2)实现两个数的乘法运算须考虑:a) 乘数的各位数都要与被乘数进行乘法运算;b) 乘法过程中的进位问题及其实现;因每个元素或结点最多存储数据的1位数值,故当元素中的数值大于9,需向前一个元素或结点进位。(2)设计表示:主函数调用fun函数,在主函数中输出结果。【调试报告】一开始不知道怎么对数组长度变化的情况怎么处理,后来通过尝试发现可以先进行更多位数长度的数组定义,后再取用一部分进行运算,不过这样有一个缺点,就是造成内存的浪费,相比下可能动态内存更节省空间,但前者更便于书写和理解,权衡后还是选择这种方法。 进位的运算开始时给我造成了极大的烦恼,后来我通过举实例一步步得到结果的计算方法,采用了while循环。【附录】#include stdafx.h#includeusing namespace std;void fun(int n)int a500=0; /定义一个有500个元素的数组用于存放数字int bit=0;int copy=n;for(int i =0;copy0;+i) /先将输入的数字n用数组的元素表示ai=copy%10;bit=i;copy/=10;while(-n0) /通过while循环对每位元素乘上n, carry=0;for(int i=0;i0) /对于数值大于9的元素进行进位a+bit=carry%10;carry/=10;for(int j=bit;j=0;-j) /输出数组的元素coutaj;int main() cout输入数字n,求阶乘n; fun(n);return 0; 输入n20,n!2432902008176640000 输入n30,n!265252859812191058636308480000000实习题目六【需求规格说明】计算两个日期之间的间隔天数:从键盘输入两个日期(如以year1,month1,day1以及year2,month2,day2的方式来输入它们),而后计算出这两个日期的间隔天数并在屏幕上显示出结果。【算法设计】(1)设计思想:整体思路很简单,第一年所剩天数+相差年份内的天数+最后一年的已过了的天数。但关于闰年、闰月、大小月的表示显得尤为困难,因此我对每个月的天数采用了数组化的处理,对闰与不闰采用了bool判断处理,还有一点值得注意的是我对输入时间的有效性进行了判断,在时间不合法的情况下不会出现所需要的if语句。对于输入的字符串进行atoi字符串转化成数值的处理,并使用substr对相应的时间字符进行定位。(2) 设计表示: isleap函数用于判断是否为闰年、闰月stringtodate函数用于取字符串为时间数值,并判断时间输入是否合法dayinyear函数用于计算当天在该年中的第几天daysbetween2date函数用于计算2天之间相差的天数主函数用于输出天数间隔【调试报告】一开始不知道怎么表示大小月,后来通过比较发现数组表示每个月的天数十分方便,且便于计算。闰年和闰月原本考虑了if语句,但这种形式不够新颖,因此后来采用了bool型判断函数,更简单明了。返回时间的时候return多个数值会有些困难,因此我选择了引用。【附录】#includestdafx.h#include #include #include#includeusing namespace std;bool isleap(int year) /判断一个年份是否为闰年return (year % 4 = 0 | year % 400 = 0) & (year % 100 != 0);/ 用于取出日期中的年月日并判断日期是否合法bool stringtodate(string date, int& year, int& month, int& day) /通过引用返回时间 year = atoi(date.substr(0, 4).c_str();month = atoi(date.substr(5, 2).c_str();day = atoi(date.substr(8, 2).c_str();int day12 = 31,28,31,30,31,30,31,31,30,31,30,31 ;if (isleap(year) /判断是否为闰月day1 = 29;return year = 0 & month 0 & day 0;/根据给定的日期,求出它在该年的第几天int dayinyear(int year, int month, int day)int day12 = 31,28,31,30,31,30,31,31,30,31,30,31 ;if (isleap(year)day1 = 29;for (int i = 0; i day2 ? day1 - day2 : day2 - day1;else if (year1 = year2) /如果年相同int d1, d2;d1 = dayinyear(year1, month1, day1);d2 = dayinyear(year2, month2, day2);return d1 d2 ? d1 - d2 : d2 - d1; /计算2天时间差的绝对值else /年月都不相同if (year1 year2)swap(year1, year2); /swap进行两个值的交换swap(month1, month2);swap(day1, day2);int d1, d2, d3;if (isleap(year1)d1 = 366 - dayinyear(year1, month1, day1); /取得这个日期在该年还余下多少天elsed1 = 365 - dayinyear(year1, month1, day1);d2 = dayinyear(year2, month2, day2); /取得在当年中的第几天d3 = 0;for (int year = year1 + 1; year year2; year+)if (isleap(year) /判断是否为闰年d3 += 366;elsed3 += 365;return d1 + d2 + d3;int main()cout 请输入所求的两个日子,日期的格式是yyyy-mm-dd date1date2;int a = daysbetween2date(date1, date2);cout 相差 a 天;return 0;输入1997-02-02 2015-12-19输出 相差5765240天总结 通过这次课程设计,我熟悉了很多原本只在课

温馨提示

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

评论

0/150

提交评论