1、程序设计实验报告程序设计方法实验报告 电子与信息工程学院计算机科学与技术专业实验指导老师:徐宏喆 实验地点:计算机教学实验中心 实验结束日期:2006-9-2 实验报告提交日期:2006-9-15实验一:矩阵乘积 已知矩阵 当矩阵A的列数与矩阵B的行数相同时,则A与B可以相乘,其乘积为一个mp的矩阵D: 其中:(i=1,2,.,m; j=1,2,.,p)。简记为D=AB 在线性代数的学习中,我们知道了两个矩阵相乘的条件和法则。本次实验中我们是针对一种特殊的矩阵(稀疏矩阵),并在计算机的环境下,利用矩阵的三元组表示方法,来研究矩阵相乘问题。所谓稀疏矩阵是指矩阵中大多数元素都是零。稀疏矩阵的这种性
2、质使得我们可以方便的利用三元组i,j,a在计算机中进行表示矩阵第i行第j列的元素是a。为此,我们定义一个Matrix类,并通过具体的函数来完成这一操作,其中,构造函数Matrix()用来对矩阵的行和列进行赋制值;成员函数int &operator()用来进行处理元素之间的计算工作;当然最终的结果用show()来显出。由于,本程序是大量的数字乘积以及求和的重复,所以在整个程序设计总体上体现了一种循环的思想。一些关键的思想和注意事项为了方便解释,我们在下面的程序中将用用黑体字具体说明:#include #include #include using namespace std;class Matr
3、ixpublic: int row,col; Matrix(int,int); Matrix(); int &operator()(int,int); const int &operator()(int,int)const; Matrix &operator =(const Matrix &); void show();private: int *m; ;Matrix:Matrix(int row,int col) this-row=row; this-col=col; m=new introw*col; for(int i=0;irow*col;i+) /初始化为0 *(m+i)=0; Ma
4、trix:Matrix() delete m;int &Matrix:operator ()(int r,int c) return (*(m+r*col+c);const int &Matrix:operator ()(int r,int c)const return (*(m+r*col+c);Matrix &Matrix:operator =(const Matrix &Ma) if(this=&Ma) return *this; delete m; m=new intMa.row*Ma.col; for (int i=0;iMa.row*Ma.col;i+) mi=Ma.mi; ret
5、urn *this;void Matrix:show() for(int i=0;irow*col;i+) if(i%col=0) coutendl; coutmi ; coutendl;int main() char a; int x,y,m,n,o,p; /*判断有多少行* ifstream infile(input.txt,ios:in); int HowManyLines=0; if(!infile) cerropen error!endl; return 1; while(!infile.eof() a=infile.get(); if(a=n) HowManyLines+; inf
6、ile.close(); coutThere is totally HowManyLines Linesendl;/*读入数据* ifstream in(input.txt,ios:in); /读入矩阵相关信息 if(!in) cerropen error!xymnop; in.close(); vectorvector Data(HowManyLines, vector(3); for (int i=0;iHowManyLines;i+) for (int j=0;j3;j+) Dataij=0; coutInitialization Finished.xymnop; /定位文件指针 Rea
7、dxymnop; char* TryLine=NULL; char* ReadLine; for(i=0;i Datai0 Datai1 Datai2; Read.getline(ReadLine,50,n); delete TryLine; delete ReadLine; Try.close(); Read.close(); coutShowing Data.endl; for (i=0;iHowManyLines;i+) /显示读入的数据 用于判断读入是否正确 for (int k=0;k3;k+) coutDataik ; coutendl; Matrix A(m,n),B(n,o),
8、C(o,p),D(m,p),E(m,o); for (i=1;iHowManyLines;i+) if(Datai0=0) break; A(Datai0-1,Datai1-1) = Datai2; i+; coutMatrix A is :endl; A.show(); for (;iHowManyLines;i+) if(Datai0=0) break; B(Datai0-1,Datai1-1) = Datai2; i+; coutMatrix B is :endl; B.show(); for (;iHowManyLines;i+) if(Datai0=0) break; C(Datai
9、0-1,Datai1-1) = Datai2; coutMatrix C is :endl; C.show(); for (i=0;iA.row;i+) for(int j=0;jB.col;j+) int temp=0; for(int k=0;kA.col;k+) temp+=A(i,k)*B(k,j); E(i,j)=temp; for (i=0;iE.row;i+) for(int j=0;jC.col;j+) int temp=0; for(int k=0;kE.col;k+) temp+=E(i,k)*C(k,j); D(i,j)=temp; coutMatrix D is :en
10、dl; D.show(); ofstream out(output.txt,ios:out); outD(x-1,y-1); out.close(); return 0; 下面我们的任务就是要完成D=A*B*C的工作。 输入文件: 第一行为:x y (x和y分别代表输出结果所在的行和列); 第二行为m,n,o,p(表示给出的正整数矩阵A为m*n矩阵,B为n*o矩阵,C为o*p矩阵); 第三行及以后各行的数字分别按照三元组的表示方法类推。 例如我们在调试时输入:1 23 4 2 31 1 31 4 52 2 13 1 21 2 22 1 13 1 23 2 41 2 21 3 32 1 12 2
11、 2 我们得到的结果为:12. 经验证,这一结果和我们用数学方法计算的结果相同。 实验二:寻找基数 在学习计算机之前,我们接触的数字计算都是在10进制的前提下进行的。而在现实生活中,为了更方便的解决不同领域的问题,我们往往需要在更多的基数中进行数字处理。现在我们熟悉的基数有10进制,12进制,60进制,2进制,8进制,16进制几种。同一个数因为采取不同的基数而使得表现形式完全不同,例如12用二进制表示是1100,用3进制表示是110,用8进制表示是14。 在本次实验中,我们所编的程序,就是解决了对于一个数对X和Y,找出一个最小的基数,使得这两个数在选择的基数上是一对相等的数的问题。在这里我们提
12、前声明,与X和Y相关联的有效基数值范围是236。 为此,我们定义pot()函数来计算X的Y次方;用dec()函数来将给定的数转化为十进制数;再利用max()函数来返回给定数值中的较大者,并以此循环下去,让它们在不同的基数中寻找到相同的十进制表达形式。具体的要点,我们在下面的程序中给予说明: #include#include/计算X的Y次方long pot(int x,int y) long result=1; int i; for(i=0;iy;i+) result*=x; return result;/将数组a表示的数转换为十进制long dec(int a,int num,int t) i
13、nt done,hh=num; long s=0; for (done=0;donenum;done+) s+=ahh-1*ppo(t,done); hh-; return s;/返回a中最大值int max(int a,int num) int i,m=1; for (i=0;inum;i+) if (mai) m=ai; return m+1;void main() char ch, s20,str18,str28; int i,j,ti,tj,a8=0,b8=0,o,p,q; FILE *fp1,*fp2; if(fp1=fopen(input2.txt,r)=NULL) printf(
14、Cannot open this filen); return; fp2=fopen(output2.txt,w); /扫描出数对的对数 p=0; fgets(s,20,fp1); while(s0!=0) p+; fgets(s,20,fp1); /寻找基数 rewind(fp1); for (q=1;q=0&ch=A&ch=0&ch=A&ch=Z) bj=ch-55; else printf(errorn); str2j=ch; j+; ch=fgetc(fp1); str2j=0; /寻找基数 for (ti=max(a,i);ti=36;ti+) o=0; for (tj=max(b,
15、j);tj=36;tj+) if (otc(a,i,ti)=otc(b,j,tj) fprintf(fp2,%s (base %d) = %s (base %d)n,str1,ti,str2,tj); printf(%s (base %d) = %s (base %d)n,str1,ti,str2,tj); o=1; break; if (o) break; if (!o) fprintf(fp2,%s is not equal to %s in any 2.36n,str1,str2); printf(%s is not equal to %s in any 2.36n,str1,str2)
16、; fclose(fp1); fclose(fp2); 在调试中我们输入两组数:13 823 70 最后一行用0表示输入结束。 运行的结果为:13 (base 5) = 8 (base 9)23 is not equal to 7 in any base 2.36 和实际相符合。 实验三 词汇统计统计输入文件中出现的不同的单词个数以及每个单词出现的频率,并且将这些单词按照词典顺序排列好输出到文件中。输入:以文件形式记录程序中所需要的数据。样例输入文件(word.in)This is a book. Its is name is “C programming”.输出:结果应该存放在一个文件中,该
17、文件中的第一行为不同的单词个数,从第二行开始则为每一个单词和其相应出现的频率单词与频率数之间用空格符分割,单词需要按字典顺序排列。样例输出文件(word.out)8a 1book 1c 1is 1its 1name 1 programming 1this 1此程序对所输入的数据主要采用数组进行存储,但同时为了程序运行的简单方便,我们的程序也用到了指针,因此,我们的程序主要采取顺序存储结构。至于算法,首先我们声明一个STAR类,用来存储输入的单词,并用来记录每个单词出现的次数。然后针对所输入的语句,去掉标点符号并把剩下的单词存入文件中,再将各个单词存入已建立的数组中。把各个字符改成小写字母,并统
18、计各单词出现的次数,再通过对各单词出现次数的比较,采用冒泡排序法将语句中出现的各单词按从小到大的顺序排列。最后,输出所输入语句的单词总数,并输出该语句中出现的单词以及各单词出现的次数。一些具体的细节我们将随着下面的程序进一步说明.include#include#include#include#includeusing namespace std;/类声明class STRpublic: string s; int count; STR(); void show(); ; STR:STR() count=0;void STR:show() couts ; coutcountendl;/函数原型v
19、oid push(STR *,int,int);void ToLower(std:string & );int main() string temp; int total=0,num,n=0;/去掉标点符号并把剩下的单词存入temp.txt中 ifstream in(word.in.txt,ios:in); ofstream outfile(temp.txt,ios:out); char c; while (!in.eof() in.get(c); if(c= ) outfile ;continue; if(c=?) outfile ;continue; if(!isalpha(c) outf
20、ile ;continue; outfiletemp) total+; num=total; STR *sptr; sptr=new STRtotal; ifstream input(temp.txt,ios:in);/读入单词 for(int i=0;isptri.s) sptri.count+;/将字符都改成小写字母 for (i=0;itotal;i+) ToLower(sptri.s);/统计词出现的个数 for(int k=0;knum;k+) for (i=0;inum;i+) for (int j=i+1;jnum;j+) if (sptri.s=sptrj.s) sptri.c
21、ount+=sptrj.count;num-;push(sptr,total,j); /冒泡排序 STR tem; for (i=0;inum;i+) for (int j=i+1;jsptrj.s) tem.count = sptri.count; sptri.count=sptrj.count; sptrj.count=tem.count; tem.s = sptri.s; sptri.s=sptrj.s; sptrj.s=tem.s; /输出 ofstream out(word.out.txt,ios:out); outnumendl; for (i=0;inum;i+) outsptr
22、i.s sptri.countendl; delete sptr; out.close(); coutStatistic Completed.endl; return 0; void push(STR * ptr,int total,int loc) STR temp=ptrloc; for (int i=loc;itotal-1;i+) ptri.s=ptri+1.s; ptri.count=ptri+1.count; ptrtotal-1.count=temp.count; ptrtotal-1.s=temp.s;void ToLower(std:string & s) size_t si
23、ze = s.size(); for (size_t k = 0; k size; +k) s k = tolower(sk); 四 、程序运行结果8a 1book 1c 1is 2its 1name 1programming 1this 1实验四 设计能够计算日期相减的计算器要求:1 使用对话框的形式实现一个可视化的计算器;2 实现+、-、*、/、C、CE、等数学计算功能;3 在文本框中输入格式为yyyy/mm/dd的数据,然后按-运算按钮,在输入一个yyyy/mm/dd的数据,紧接着按=按钮即可得到两个日期之间相差的天数。例如2006/03/20-2006/03/19=12006/03/20-2006/03/21=-1程序设计框架与步骤1、 创建应用程序框架;2、 创建对话资源,在工程工作区定义编辑对话框资源;3、 添加消息处理函数下面是设置各控件的属性的程序void CCalculatorDlg:On1Button() / TODO: Add your control notification handler code here if(start=false) m_edit=1; else if(start=true) m_edit+=1; start=true; UpdateData(false);void CCalculatorDlg:On2Button()
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1