程序设计实验报告.docx

上传人:b****5 文档编号:12014096 上传时间:2023-04-16 格式:DOCX 页数:48 大小:104.24KB
下载 相关 举报
程序设计实验报告.docx_第1页
第1页 / 共48页
程序设计实验报告.docx_第2页
第2页 / 共48页
程序设计实验报告.docx_第3页
第3页 / 共48页
程序设计实验报告.docx_第4页
第4页 / 共48页
程序设计实验报告.docx_第5页
第5页 / 共48页
点击查看更多>>
下载资源
资源描述

程序设计实验报告.docx

《程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《程序设计实验报告.docx(48页珍藏版)》请在冰豆网上搜索。

程序设计实验报告.docx

程序设计实验报告

程序设计方法实验报告

电子与信息工程学院计算机科学与技术专业

 

实验指导老师:

徐宏喆

实验地点:

计算机教学实验中心

实验结束日期:

2006-9-2

 

实验报告提交日期:

2006-9-15

 

实验一:

矩阵乘积

已知矩阵

 

  当矩阵A的列数与矩阵B的行数相同时,则A与B可以相乘,其乘积为一个m×p的矩阵D:

  其中:

(i=1,2,...,m;j=1,2,...,p)。

简记为D=A·B

在线性代数的学习中,我们知道了两个矩阵相乘的条件和法则。

本次实验中我们是针对一种特殊的矩阵(稀疏矩阵),并在计算机的环境下,利用矩阵的三元组表示方法,来研究矩阵相乘问题。

所谓稀疏矩阵是指矩阵中大多数元素都是零。

稀疏矩阵的这种性质使得我们可以方便的利用三元组〈i,j,a>在计算机中进行表示矩阵第i行第j列的元素是a。

为此,我们定义一个Matrix类,并通过具体的函数来完成这一操作,其中,构造函数Matrix()用来对矩阵的行和列进行赋制值;成员函数int&operator()用来进行处理元素之间的计算工作;当然最终的结果用show()来显出。

由于,本程序是大量的数字乘积以及求和的重复,所以在整个程序设计总体上体现了一种循环的思想。

一些关键的思想和注意事项为了方便解释,我们在下面的程序中将用用黑体字具体说明:

#include

#include

#include

usingnamespacestd;

classMatrix{

public:

introw,col;

Matrix(int,int);

~Matrix();

int&operator()(int,int);

constint&operator()(int,int)const;

Matrix&operator=(constMatrix&);

voidshow();

private:

int*m;

};

Matrix:

:

Matrix(introw,intcol)

{

this->row=row;

this->col=col;

m=newint[row*col];

for(inti=0;i

*(m+i)=0;

}

Matrix:

:

~Matrix()

{

deletem;

}

int&Matrix:

:

operator()(intr,intc)

{

return(*(m+r*col+c));

}

constint&Matrix:

:

operator()(intr,intc)const

{

return(*(m+r*col+c));

}

Matrix&Matrix:

:

operator=(constMatrix&Ma)

{

if(this==&Ma)return*this;

deletem;

m=newint[Ma.row*Ma.col];

for(inti=0;i

m[i]=Ma.m[i];

return*this;

}

voidMatrix:

:

show()

{

for(inti=0;i

{

if(i%col==0)cout<

cout<

}

cout<

}

intmain()

{

chara;

intx,y,m,n,o,p;

//*********************判断有多少行***********************

ifstreaminfile("input.txt",ios:

:

in);

intHowManyLines=0;

if(!

infile)

{

cerr<<"openerror!

"<

return1;

}

while(!

infile.eof())

{

a=infile.get();

if(a=='\n')HowManyLines++;

}

infile.close();

cout<<"Thereistotally"<

//*********************读入数据*********************

ifstreamin("input.txt",ios:

:

in);//读入矩阵相关信息

if(!

in)

{

cerr<<"openerror!

"<

return1;

}

in>>x>>y>>m>>n>>o>>p;

in.close();

vector>Data(HowManyLines,vector(3));

for(inti=0;i

for(intj=0;j<3;j++)

Data[i][j]=0;

cout<<"InitializationFinished..."<

ifstreamTry("input.txt",ios:

:

in);//用于判断

ifstreamRead("input.txt",ios:

:

in);//用于读取数据

Try>>x>>y>>m>>n>>o>>p;//定位文件指针

Read>>x>>y>>m>>n>>o>>p;

char*TryLine=NULL;

char*ReadLine;

for(i=0;i

{

TryLine=newchar[50];

ReadLine=newchar[50];

Try.getline(TryLine,50,'\n');

if(TryLine[0]=='\r')//如果是空行

{

Read.getline(ReadLine,50,'\n');

}

else

{

Read>>Data[i][0]>>Data[i][1]>>Data[i][2];

Read.getline(ReadLine,50,'\n');

}

deleteTryLine;

deleteReadLine;

}

Try.close();

Read.close();

cout<<"ShowingData..."<

for(i=0;i

{for(intk=0;k<3;k++)

cout<

cout<

}

MatrixA(m,n),B(n,o),C(o,p),D(m,p),E(m,o);

for(i=1;i

{

if(Data[i][0]==0)break;

A(Data[i][0]-1,Data[i][1]-1)=Data[i][2];

}

i++;

cout<<"MatrixAis:

"<

A.show();

for(;i

{

if(Data[i][0]==0)break;

B(Data[i][0]-1,Data[i][1]-1)=Data[i][2];

}

i++;

cout<<"MatrixBis:

"<

B.show();

for(;i

{

if(Data[i][0]==0)break;

C(Data[i][0]-1,Data[i][1]-1)=Data[i][2];

}

cout<<"MatrixCis:

"<

C.show();

for(i=0;i

for(intj=0;j

{inttemp=0;

for(intk=0;k

temp+=A(i,k)*B(k,j);

E(i,j)=temp;

}

for(i=0;i

for(intj=0;j

{inttemp=0;

for(intk=0;k

temp+=E(i,k)*C(k,j);

D(i,j)=temp;

}

cout<<"MatrixDis:

"<

D.show();

ofstreamout("output.txt",ios:

:

out);

out<

out.close();

return0;

}

下面我们的任务就是要完成D=A*B*C的工作。

输入文件:

第一行为:

xy(x和y分别代表输出结果所在的行和列);

第二行为m,n,o,p(表示给出的正整数矩阵A为m*n矩阵,B为n*o矩阵,C为o*p矩阵);

第三行及以后各行的数字分别按照三元组的表示方法类推。

例如我们在调试时输入:

123423

113

145

221

312

122

211

312

324

122

133

211

222

我们得到的结果为:

12.经验证,这一结果和我们用数学方法计算的结果相同。

 

实验二:

寻找基数

在学习计算机之前,我们接触的数字计算都是在10进制的前提下进行的。

而在现实生活中,为了更方便的解决不同领域的问题,我们往往需要在更多的基数中进行数字处理。

现在我们熟悉的基数有10进制,12进制,60进制,2进制,8进制,16进制几种。

同一个数因为采取不同的基数而使得表现形式完全不同,例如12用二进制表示是1100,用3进制表示是110,用8进制表示是14。

在本次实验中,我们所编的程序,就是解决了对于一个数对X和Y,找出一个最小的基数,使得这两个数在选择的基数上是一对相等的数的问题。

在这里我们提前声明,与X和Y相关联的有效基数值范围是2—36。

为此,我们定义pot()函数来计算X的Y次方;用dec()函数来将给定的数转化为十进制数;再利用max()函数来返回给定数值中的较大者,并以此循环下去,让它们在不同的基数中寻找到相同的十进制表达形式。

具体的要点,我们在下面的程序中给予说明:

 

#include

#include

//计算X的Y次方

longpot(intx,inty)

{longresult=1;

inti;

for(i=0;i

result*=x;

returnresult;

}

//将数组a[]表示的数转换为十进制

longdec(inta[],intnum,intt)

{intdone,hh=num;

longs=0;

for(done=0;done

{s+=a[hh-1]*ppo(t,done);

hh--;}

returns;

}

//返回a[]中最大值

intmax(inta[],intnum)

{inti,m=1;

for(i=0;i

if(m

m=a[i];

returnm+1;

}

voidmain()

{charch,s[20],str1[8],str2[8];

inti,j,ti,tj,a[8]={0},b[8]={0},o,p,q;

FILE*fp1,*fp2;

if((fp1=fopen("input2.txt","r"))==NULL)

{

printf("Cannotopenthisfile\n");

return;

}

fp2=fopen("output2.txt","w");

//扫描出数对的对数

p=0;

fgets(s,20,fp1);

while(s[0]!

='0')

{p++;

fgets(s,20,fp1);

}

//寻找基数

rewind(fp1);

for(q=1;q<=p;q++)

{//将数存入a[]

i=0;

ch=fgetc(fp1);

while(ch!

='')

{if(ch>='0'&&ch<='9')

a[i]=ch-48;

elseif(ch>='A'&&ch<='Z')

a[i]=ch-55;

str1[i]=ch;

i++;

ch=fgetc(fp1);

}

str1[i]='\0';

//将数存入b[]

j=0;

ch=fgetc(fp1);

while(ch!

='\n')

{if(ch>='0'&&ch<='9')

b[j]=ch-48;

elseif(ch>='A'&&ch<='Z')

b[j]=ch-55;

elseprintf("error\n");

str2[j]=ch;

j++;

ch=fgetc(fp1);

}

str2[j]='\0';

//寻找基数

for(ti=max(a,i);ti<=36;ti++)

{o=0;

for(tj=max(b,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,"%sisnotequalto%sinany2...36\n",str1,str2);

printf("%sisnotequalto%sinany2...36\n",str1,str2);

}

}

fclose(fp1);

fclose(fp2);

}

在调试中我们输入两组数:

138

237

0

最后一行用0表示输入结束。

运行的结果为:

13(base5)=8(base9)

23isnotequalto7inanybase2..36

和实际相符合。

实验三词汇统计

统计输入文件中出现的不同的单词个数以及每个单词出现的频率,并且将这些单词按照词典顺序排列好输出到文件中。

输入:

以文件形式记录程序中所需要的数据。

样例输入文件(word.in)

Thisisabook..Itsisnameis“Cprogramming”.

输出:

结果应该存放在一个文件中,该文件中的第一行为不同的单词个数,从第二行开始则为每一个单词和其相应出现的频率单词与频率数之间用空格符分割,单词需要按字典顺序排列。

样例输出文件(word.out)

8

a1

book1

c1

is1

its1

name1

programming1

this1

此程序对所输入的数据主要采用数组进行存储,但同时为了程序运行的简单方便,我们的程序也用到了指针,因此,我们的程序主要采取顺序存储结构。

至于算法,首先我们声明一个STAR类,用来存储输入的单词,并用来记录每个单词出现的次数。

然后针对所输入的语句,去掉标点符号并把剩下的单词存入文件中,再将各个单词存入已建立的数组中。

把各个字符改成小写字母,并统计各单词出现的次数,再通过对各单词出现次数的比较,采用冒泡排序法将语句中出现的各单词按从小到大的顺序排列。

最后,输出所输入语句的单词总数,并输出该语句中出现的单词以及各单词出现的次数。

一些具体的细节我们将随着下面的程序进一步说明.

include

#include

#include

#include

#include

usingnamespacestd;

////////////////////////////////////////////////////////////////////

////类声明

classSTR{

public:

strings;

intcount;

STR();

voidshow();

};

STR:

:

STR()

{

count=0;

}

voidSTR:

:

show()

{

cout<

cout<

}

///////////////////////////////////////////////////////////////////

////函数原型

voidpush(STR*,int,int);

voidToLower(std:

:

string&);

intmain(){

stringtemp;

inttotal=0,num,n=0;

//去掉标点符号并把剩下的单词存入temp.txt中

ifstreamin("word.in.txt",ios:

:

in);

ofstreamoutfile("temp.txt",ios:

:

out);

charc;

while(!

in.eof())

{

in.get(c);

if(c==''){outfile<<"";continue;}

if(c=='?

'){outfile<<"";continue;}

if(!

isalpha(c)){outfile<<"";continue;}

outfile<

}

in.close();

outfile.close();

ifstreamfin("temp.txt",ios:

:

in);

while(fin>>temp)

total++;

num=total;

STR*sptr;

sptr=newSTR[total];

ifstreaminput("temp.txt",ios:

:

in);

//读入单词

for(inti=0;i

if(input>>sptr[i].s)sptr[i].count++;

//将字符都改成小写字母

for(i=0;i

ToLower(sptr[i].s);

//统计词出现的个数

for(intk=0;k

for(i=0;i

for(intj=i+1;j

if(sptr[i].s==sptr[j].s){sptr[i].count+=sptr[j].count;num--;push(sptr,total,j);}

//冒泡排序

STRtem;

for(i=0;i

for(intj=i+1;j

if(sptr[i].s>sptr[j].s){tem.count=sptr[i].count;

sptr[i].count=sptr[j].count;

sptr[j].count=tem.count;

tem.s=sptr[i].s;

sptr[i].s=sptr[j].s;

sptr[j].s=tem.s;

}

//输出

ofstreamout("word.out.txt",ios:

:

out);

out<

for(i=0;i

out<

delete[]sptr;

out.close();

cout<<"StatisticCompleted..."<

return0;

}

voidpush(STR*ptr,inttotal,intloc)

{

STRtemp=ptr[loc];

for(inti=loc;i

{ptr[i].s=ptr[i+1].s;

ptr[i].count=ptr[i+1].count;

}

ptr[total-1].count=temp.count;

ptr[total-1].s=temp.s;

}

voidToLower(std:

:

string&s)

{

size_tsize=s.size();

for(size_tk=0;k

{

s[k]=tolower(s[k]);

}

}

四、程序运行结果

8

a1

book1

c1

is2

its1

name1

programming1

this1

 

实验四设计能够计算日期相减的计算器

要求:

1.使用对话框的形式实现一个可视化的计算器;

2.实现+、-、*、/、C、CE、等数学计算功能;

3.在文本框中输入格式为yyyy/mm//dd的数据,然后按‘-’运算按钮,在输入一个yyyy/mm//dd的数据,紧接着按‘=’按钮即可得到两个日期之间相差的天数。

例如

2006/03/20-2006/03/19=1

2006/03/20-2006/03/21=-1

程序设计框架与步骤

1、创建应用程序框架;

2、创建对话资源,在工程工作区定义编辑对话框资源;

3、添加消息处理函数

下面是设置各控件的属性的程序

voidCCalculatorDlg:

:

On1Button()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

if(start==false)

m_edit="1";

elseif(start==true)

m_edit+="1";

start=true;

UpdateData(false);

}

voidCCalculatorDlg:

:

On2Button()

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1