C语言课程设计报告矩阵的运算.docx
《C语言课程设计报告矩阵的运算.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告矩阵的运算.docx(22页珍藏版)》请在冰豆网上搜索。
C语言课程设计报告矩阵的运算
序号:
学号:
------------
课程设计
设计课程名称:
C语言课程设计
题目:
矩阵的运算
学生姓名:
**********
学院(系):
*********专业班级:
*********
指导教师:
*******专业技术职务:
设计时间:
****年*月**日****年*月**日
1.矩阵运算任务书……………………………………………3
2.描述及绘制出系统的功能结构框图………………………7
3.C语言程序代码……………………………………………8
4.使用说明……………………………………………………15
5.设计日志及心得体会………………………………………16
"矩阵运算"任务书
一、目的要求
本课程设计任务的目的是要求学生按照分析、设计、编码、调试和测试的软件开发过程独立完成一个矩阵运算子程序集,并能最终实现本系统的功能要求。
二、功能要求
【题目描述】
矩阵运算是大多数科学运算的必要工具。
假定所有矩阵均以文本文件形式保存,试编写程序,处理简单的矩阵运算。
矩阵文件每一行以文本保存矩阵中一行数据每个数据之间以一个或者多个空格隔开。
目前矩阵仅保存整数值。
下面是一个矩阵文件例子:
文件名:
matrix1.txt
1123-4
31-145
20056
56789
1011121413
你的程序需要实现以下功能:
1.矩阵加法。
2.矩阵转置
3.矩阵乘法
【程序要求】
(1)程序正确。
能够严格实现任务书中描述的功能;
(2)界面友好。
尽可能使界面友好、直观、易操作;
(3)风格友好。
源程序应有良好的编码风格,使程序容易阅读。
(4)从文件中读矩阵,将矩阵写入文件,矩阵3个操作均需要以子程序形式编写。
【输入/输出要求】
(1)每项功能在选择后,应提示用户输入源矩阵所在文件名,并检验该文件是否存在,但是并不读取该文件内容。
然后再提示用户输入结果矩阵文件名。
通过子程序读取矩阵数据,将运算结果同时输出到文件和屏幕上。
(2)所有源矩阵均可使用记事本生成。
(3)若main函数带有参数repeat则所有读取矩阵和运算函数操作均需重复10000次。
【课程设计报告内容要求】
(1)封面:
统一采用《常州大学课程设计说明书》封面
(2)内容提要
(3)目录
(4)“课程设计报告”正文格式
1)概述所作系统的主要功能;
2)分析和描述任务书的基本要求与内容;
3)描述及绘制出系统的功能结构框图;
4)C语言程序代码;
5)使用说明;
6)设计日志以及心得体会
三、难点提示
1、输入矩阵没有限定大小,不能采用静态数组来实现,需要使用动态数组技术。
2、main函数参数的检测和使用参见教材相应内容。
3、菜单部分样例代码可参阅网络课堂里相关帮助——顶层菜单设计框架。
概述系统的主要功能
假定矩阵文件每一行以文本形式保存,矩阵中的一行数据中每个数据之间以一个或多个空格隔开,目前矩阵仅保存整数值。
本程序通过文件操作及动态内存分配技术实现简单的矩阵运算,包括矩阵加法(Plus),矩阵转置(Transpose),矩阵乘法(Multiply)。
运行程序时,首先提示用户选择相应功能选项,每项功能在选择后,提示用户输入源矩阵所在文件名,程序检验该文件是否存在,但不读取该文件内容。
然后再提示用户输入结果矩阵所在文件名,通过子程序读取矩阵数据,将运算结果同时输到文件和屏幕上。
描述及绘制出系统的功能结构框图
首先选择相应的功能,打开文件,读取数据,进行各项功能的操作,
输出结果,关闭文件,再次选择相应的功能。
C语言程序代码
#include
#include
#include
voidPlus()
{
FILE*fp1,*fp2,*fp3;
printf("请输入两个源矩阵所在文件名:
\n");
charfilename1[15],filename2[15],filename3[15];
scanf("%s%s",filename1,filename2);
if((fp1=fopen(filename1,"r"))==NULL||(fp2=fopen(filename2,"r"))==NULL)
{
printf("can'topenfile");
exit(0);
}
printf("请输入结果矩阵所在文件名:
\n");
scanf("%s",filename3);
fp3=fopen(filename3,"w");
int*p,C=0,R=0,l=0,r=0,i,j,jk1,jk2,jk3;
printf("\n");
charch;
ch=fgetc(fp1);
while(!
feof(fp1))
{
ch=fgetc(fp1);
if(ch=='')
C++;
if(ch=='\n')
R++;
}
C=C/R+1;
printf("R=%d,C=%d\n",R,C);
rewind(fp1);
ch=fgetc(fp2);
while(!
feof(fp2))
{
ch=fgetc(fp2);
if(ch=='')
l++;
if(ch=='\n')
r++;
}
l=l/r+1;
printf("r=%d,l=%d\n",r,l);
rewind(fp2);fscanf(fp1,"%d",&jk1);
fscanf(fp2,"%d",&jk2);
if(jk1!
=''&&jk1!
='\n')
{
jk3=jk1+jk2;
printf("%d\t",jk3);
fprintf(fp3,"%d\t",jk3);
}
}
printf("\n");
fprintf(fp3,"\n");
}
free(p);
fclose(fp1);
fclose(fp2);
fclose(fp3);
printf("****************按任意键继续*****************\n");
getch();
}
elseexit(0);
}
voidTranspose()
{
FILE*fp1,*fp2;
printf("请输入一个源矩阵所在文件名:
\n");
charfilename1[15],filename2[15];
scanf("%s",filename1);
if((fp1=fopen(filename1,"r"))==NULL)//判断是否能打开文件
{
printf("cannotopenfile");
exit(0);
}
printf("请输入结果矩阵所在名:
\n");
scanf("%s",filename2);
fp2=fopen(filename2,"w");
int**p,C=0,R=0,t=0,i,j,jk1;
printf("\n");
charch;
ch=fgetc(fp1);
while(!
feof(fp1))//算出矩阵的行列数
{
ch=fgetc(fp1);
if(ch=='')
C++;
if(ch=='\n')
R++;
}
C=C/(R+1)+1;
R=R+1;
rewind(fp1);
p=(int**)malloc(R*sizeof(int*));//申请动态内存分配
for(i=0;i{
p[i]=(int*)malloc(C*sizeof(int));
for(j=0;j{
fscanf(fp1,"%d",&jk1);
if((jk1!
='')&&(jk1!
='\n'))
p[i][j]=jk1;
}
}
for(i=0;i{
for(j=0;j{
printf("%d\t",p[j][i]);
fprintf(fp2,"%d\t",p[j][i]);
}
printf("\n");
fprintf(fp2,"\n");
}
for(i=0;i{
free(p[i]);
}
free(p);
fclose(fp1);
fclose(fp2);
printf("****************按任意键继续*****************\n");
getch();
}
voidMultiply()
{
FILE*fp1,*fp2,*fp3;
printf("请输入两个院矩阵所在文件名:
\n");
charfilename1[15],filename2[15],filename3[15];
scanf("%s%s",filename1,filename2);
if((fp1=fopen(filename1,"r"))==NULL||(fp2=fopen(filename2,"r"))==NULL)//判断矩阵是否能打开
{
printf("cannotopenfile");
exit(0);
}
printf("请输入结果矩阵所在文件名:
\n");
scanf("%s",filename3);
fp3=fopen(filename3,"w");
int**p1,**p2,C=0,R=0,l=0,r=0,sum=0,a,i,j,jk1;
printf("\n");
charch;
ch=fgetc(fp1);
while(!
feof(fp1))//算出矩阵的行列数
{
ch=fgetc(fp1);
if(ch=='')
C++;
if(ch=='\n')
R++;
}
C=C/(R+1)+1;
R=R+1;
rewind(fp1);
ch=fgetc(fp2);
while(!
feof(fp2))
{
ch=fgetc(fp2);
if(ch=='')
l++;
if(ch=='\n')
r++;
}
l=l/(r+1)+1;
r=r+1;
rewind(fp2);
p1=(int**)malloc(R*sizeof(int*));//申请动态内存分配
for(i=0;i{
p1[i]=(int*)malloc(C*sizeof(int));
for(j=0;j{
fscanf(fp1,"%d",&jk1);
if((jk1!
='')&&(jk1!
='\n'))
p1[i][j]=jk1;
}
}
p2=(int**)malloc(r*sizeof(int*));
for(i=0;i{
p2[i]=(int*)malloc(l*sizeof(int));
for(j=0;j{
fscanf(fp2,"%d",&jk1);
if((jk1!
='')&&(jk1!
='\n'))
p2[i][j]=jk1;
}
}
for(i=0;i{
for(a=0;a{
sum=0;
for(j=0;jsum+=p1[i][j]*p2[j][a];
printf("%d\t",sum);
fprintf(fp3,"%d\t",sum);
}
printf("\n");
fprintf(fp3,"\n");
}
for(i=0;i{
free(p1[i]);
}
free(p1);
for(i=0;i{
free(p2[i]);
}
free(p2);
fclose(fp1);
fclose(fp2);
fclose(fp3);
printf("****************按任意键继续*****************\n");
getch();
}
voidmain()
{
chari;
loop:
system("cls");
printf("****************************************\n");
printf("╔═══╧╧矩阵运算╧╧════════════╗\n");
printf("║*******请输入运算方式*******║\n");
printf("║※1:
加法║\n");
printf("║※2:
转置║\n");
printf("║※3:
乘法║\n");
printf("║※4:
退出║\n");
printf("╚═════════════════════════════╝\n");
printf("请输入选项[1\\2\\3\\4]:
\n");
while(i=getch())
{
switch(i)
{
case'1':
Plus();gotoloop;
case'2':
Transpose();gotoloop;
case'3':
Multiply();gotoloop;
case'4':
exit(0);
}
}
gotoloop;{
for(j=0;j{
fscanf(fp1,"%d",&jk1);
fscanf(fp2,"%d",&jk2);
if(jk1!
=''&&jk1!
='\n')
{
jk3=jk1+jk2;
printf("%d\t",jk3);
fprintf(fp3,"%d\t",jk3);
}
}
printf("\n");
fprintf(fp3,"\n");
}
free(p);
fclose(fp1);
fclose(fp2);
fclose(fp3);
printf("****************按任意键继续*****************\n");
getch();
}
}
l=l/r+1;
printf("r=%d,l=%d\n",r,l);
rewind(fp2);
if(l==C&&r==R)
{
p=(int*)calloc(R,C*sizeof(int));
for(i=0;i{
for(j=0;j{
fscanf(fp1,"%d",&jk1);
fscanf(fp2,"%d",&jk2);
if(j==C-1)
{
printf("%d",jk1+jk2);
fprintf(fp3,"%d",jk1+jk2);
continue;
}
if(jk1!
=''&&jk1!
='\n')
{
jk3=jk1+jk2;
printf("%d",jk3);
fprintf(fp3,"%d",jk3);
}
}
printf("\n");
fprintf(fp3,"\n");
}
free(p);
fclose(fp1);
fclose(fp2);
fclose(fp3);
printf("****************按任意键继续*****************\n");
getch();
}
else
{printf("两个矩阵不能相加");
exit(0);
}
}
voidTranspose()
{
FILE*fp1,*fp2;
printf("请输入一个源矩阵所在文件名:
\n");
charfilename1[15],filename2[15];
scanf("%s",filename1);
if((fp1=fopen(filename1,"r"))==NULL)
{
printf("can'topenfile");
exit(0);
}
printf("请输入结果矩阵所在名:
\n");
scanf("%s",filename2);
fp2=fopen(filename2,"w");
int**p,C=0,R=0,t=0,i,j,jk1;
printf("\n");
charch;
ch=fgetc(fp1);
while(!
feof(fp1))
{
ch=fgetc(fp1);
if(ch=='')
C++;
if(ch=='\n')
R++;
}
C=C/R+1;
rewind(fp1);
p=(int**)malloc(R*sizeof(int*));
for(i=0;i{
p[i]=(int*)malloc(C*sizeof(int));
for(j=0;j{
fscanf(fp1,"%d",&jk1);
if((jk1!
='')&&(jk1!
='\n'))
p[i][j]=jk1;
}
}
for(i=0;i{
for(j=0;j{
if(j==R-1)
{
printf("%d",p[j][i]);
fprintf(fp2,"%d",p[j][i]);
continue;
}
printf("%d",p[j][i]);
fprintf(fp2,"%d",p[j][i]);
}
printf("\n");
fprintf(fp2,"\n");
}
for(i=0;i{
free(p[i]);
}
free(p);
fclose(fp1);
fclose(fp2);
printf("****************按任意键继续*****************\n");
getch();
}
voidMultiply()
{
FILE*fp1,*fp2,*fp3;
printf("请输入两个源矩阵所在文件名:
\n");
charfilename1[15],filename2[15],filename3[15];
scanf("%s%s",filename1,filename2);
if((fp1=fopen(filename1,"r"))==NULL||(fp2=fopen(filename2,"r"))==NULL)
{
printf("can'topenfile");
exit(0);
}
printf("请输入结果矩阵所在文件名:
\n");
scanf("%s",filename3);
fp3=fopen(filename3,"w");
int**p1,**p2,C=0,R=0,l=0,r=0,sum=0,a,i,j,jk1;
printf("\n");
charch;
ch=fgetc(fp1);
while(!
feof(fp1))
{
ch=fgetc(fp1);
if(ch=='')
C++;
if(ch=='\n')
R++;
}
C=C/R+1;
rewind(fp1);
ch=fgetc(fp2);
while(!
feof(fp2))
{
ch=fgetc(fp2);
if(ch=='')
l++;
if(ch=='\n')
r++;
}
l=l/r+1;
rewind(fp2);
if(C==r)//判断两个矩阵能否相乘
{
p1=(int**)malloc(R*sizeof(int*));
for(i=0;i{
p1[i]=(int*)malloc(C*sizeof(int));
for(j=0;j{
fscanf(fp1,"%d",&jk1);
if((jk1!
='')&&(jk1!
='\n'))
p1[i][j]=jk1;
}
}
p2=(int**)malloc(r*sizeof(int*));
for(i=0;i{
p2[i]=(int*)malloc(l*sizeof(int));
for(j=0;j{
fscanf(fp2,"%d",&jk1);
if((jk1!
='')&&(jk1!
='\n'))
p2[i][j]=jk1;
}
}
for(i=0;i{
for(a=0;a{
sum=0;
for(j=0;jsum+=p1[i][j]*p2[j][a];
if(a==l-1)
{printf("%d\t",sum);
fprintf(fp3,"%d\t",sum);
continue;
}
printf("%d",sum);
fprintf(fp3,"%d",sum);
}
printf("\n");
fprintf(fp3,"\n");
}
for(i=0;i{
free(p1[i]);
}
free(p1);
for(i=0;i{
free(p2[i]);
}
free(p2);
fclose(fp1);
fclose(fp2);
fclose(fp3);
printf("****************按任意键继续*****************\n");
getch();
}
else
{
printf("两个矩阵不能相乘");
exit(0);
}
}
getch();
}
else
{
printf("两个矩阵不能相乘");
exit(0);
}
}
voidmain()
{
char