C万年历和矩阵.doc_第1页
C万年历和矩阵.doc_第2页
C万年历和矩阵.doc_第3页
C万年历和矩阵.doc_第4页
C万年历和矩阵.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

程序设计基础大作业姓 名:学 号:班 级:成 绩:信息科学与工程学院2010年7月9日一、 设计一个万年历1.1需求陈述 现如今万年历在人们生活中成为不可或缺的东西,人们可以用它查寻某年、某月、某日的具体情况,使人们能够和李安排自己的时间。1.2需求分析功能函数判断是否是闰年int Year()输出万年历void output()主函数int main()1.3程序结果1、运行程序得到目录:2、选择1,得到:3、如果输入2000,得到:如果输入-2000,则得到:4、选择2,得到:5、如果输入2000 4,得到:如果输入-2000 4,则得到:6、选择3,得到:7、如果输入2000 4 4,得到:如果输入-2000 4 4,则得到:8、如果选择4,得到:1.4技术约束本函数的测试系统已在code blocks下编译通过。具体程序如下:#includeint Year(int year)if(0 = year % 400 | (year % 4 = 0 & year % 100 != 0)return 1;elsereturn 0;void output(int year,int month,int day,char week10,int dayofmonth13,int sign)int i,j=1,w;for(i = 0;i 7;i+)printf(%st,weeki);if(sign)w = day % 7;else w = (8 - (day % 7)%7;putchar(n);for(i =1 ;i =w;i+)printf(t);for(i;j0) ye=year; while(1 year) day = day + dayofyearYear(-year); for(i=1;i13;i+) Printf(公元%d年%d月n*n,ye,i); day += dayofmonthYear(year)i-1; output(ye,i,day+1,week,dayofmonth,1); else ye=year; while(year 0) day = day + dayofyearYear(year+); for(i=1;i0) mo=month; ye=year; printf(公元%d年%d月n*n,ye,mo); while(month 1) day += dayofmonthYear(year)-month; while(year 1) day += dayofyearYear(-year); output(ye,mo,day+1,week,dayofmonth,1); else mo=month; ye=year; printf(公元前%d年%d月n*n,-ye,mo); while(month 13) day += dayofmonthYear(year)month+; while(year 0) printf(公元%d年%d月n*n,year,month); mo=month; ye=year; while(month 1) day += dayofmonthYear(year)-month; while(year 1) day += dayofyearYear(-year); output(ye,mo,day+1,week,dayofmonth,1); else printf(公元前%d年%d月n*n,-year,month); mo=month; ye=year; while(month 13) day += dayofmonthYear(year)month+; while(year -1) day += dayofyearYear(+year); output(ye,mo,day,week,dayofmonth,0); break;一、设计一套矩阵运算C函数库1.1需求陈述矩阵运算广泛地应用于实践当中,但是由于矩阵运算涉及较多高等数学的知识,而且运算繁琐枯燥,所以没有软件的帮助人们很难应对这类运算问题。为尝试解决这个问题,我们专门设计一套C函数库用于矩阵的计算,实现矩阵的各种计算功能,同时把矩阵的行列和矩阵的元素封装在一起,使关于矩阵的各种信息更加方便被用户运用。为了方便函数的测试,我们还专们设计了一个测试系统,对每一个设计好的函数进行测试,使得函数测试更加具有针对性和说服力。1.2需求分析1.2.1功能分析表1 函数库功能分析项目功能函数往文件中写入矩阵int matrixwrite()从文件中读取已有的矩阵Matrix *matrixread_1()矩阵的显示int printmatrix()初始化矩阵为全零阵Matrix *matrixInitzero()矩阵的加法运算Matrix *matrixadd()矩阵的减法运算Matrix *matrixsub()矩阵的乘法运算Matrix *matrixmul()矩阵的转置Matrix *matrixTranspose()矩阵的行列式double matrixdet()矩阵数据的输入Matrix *scanfmatrix()1.2.2技术约束本函数库的测试系统已在code blocks下编译通过1.3. 程序设计思想1.3.1 数据类型矩阵采用静态的二维整型数组来表示,将矩阵的行数、列数和二维数组封装在一个结构体中。矩阵的上限可用符号常量“MAX_MAX”来表示,实际的行和列的项数由结构体中表示行和列的数据项控制。矩阵的具体定义为:typedef struct int cols; /列数 int rows; /行数double mMAXMAX; /矩阵数据Matrix; /静态矩阵1.3.2函数库设计A矩阵的初始化1初始化矩阵为全零阵函数原型:Matrix *matrixInitzero(Matrix *a)功能:用一个m行n列的二维数组a来初始化一个矩阵,把所有的元素初始化为0,形成一个0矩阵。实现思路:矩阵的行数初始化为二维数组的行数,矩阵的列数初始化为二维数组的列数,矩阵的元素初始化为二维数组的元素。且每个元素都为0。2初始化为单位矩阵函数原型:Matrix *matrixInit(Matrix *a)功能:创建一个m行m列的单位矩阵,将该矩阵作为返回值,返回值的类型为一个结构体类型。实现思路:矩阵的行和列初始化为相同值,矩阵的对角线元素初始化为1,其余元素初始化为0。返回初始化后的矩阵。B矩阵的运算1 矩阵加法、减法和乘法函数原型:Matrix *matrixadd(Matrix *a,Matrix *b)/加 Matrix *matrixsub(Matrix *a,Matrix *b)/减 Matrix *matrixmul(Matrix *a,Matrix *b)/乘功能:把指针a所指示的存储空间内的矩阵与指针b所指示的存储空间内的矩阵向加(减、乘),结果放入c所指示的存储空间内,返回值为存储结果的地址。实现思路:实现矩阵的加法时,若两矩阵为空矩阵或对应行列不相等,则不能相加,返回空指针NULL,否则,对应元素相加,结果放入c中,返回c;实现矩阵的乘法时,若两矩阵为空矩阵或a的列数和b的行数不相等,则不能相乘,返回空指针NULL,否则,a的行数为乘积矩阵的行数,b的列数为乘积矩阵的列数,a的第i行和b的第j列的对应元素的乘积的和为乘积矩阵的i行j列的元素。乘积放入c中,返回乘积矩阵的地址c。2 求矩阵的转置函数原型:Matrix *matrixTranspose(Matrix *a)功能:求矩阵a的转置,结果放入a所指示的存储空间内,返回转置矩阵。实现思路:把a的元素关于对角线互换,结果放入a所指示的存储空间内,返回转置矩阵。3 求行列式的值函数原型:double matrixdet(Matrix *a)功能:在能求行列式的值时,计算行列式的之值并返回结果。实现思路:若矩阵为空矩阵或矩阵不是方阵,则不能求行列式的值,返回0。运用递归方法,将矩阵行列互换得到第一行第一列为非零数的矩阵(否则返回0),再用这个数去乘其代数余子式(低一阶的行列式),得到行列式的值。C矩阵的文件操作1 从文件读出矩阵和向文件写入矩阵函数原型:int matrixwrite(FILE *fp,Matrix *a)Matrix *matrixread_1(FILE *fp,Matrix *a)功能:写一个矩阵通过程序读入到文件中,当用时从文件fp中读取一个m行n列的矩阵,存入指针a所指示的存储空间内;向文件fp写入指针a所指示的存储空间内的矩阵;返回值均为实际读出(写入)的矩阵元素数目、若不能读或写则返回0。实现思路:从文件读出矩阵时,打开文件,不能读时返回0,否则读出m*n个元素,矩阵的行为m,矩阵的列为n,返回值为元素的个数。向文件写入矩阵时,不能写返回0,否则向文件写入m*n个元素,每n个为一行,共m行,返回值为元素的个数。D矩阵的显示1 显示矩阵函数原型:int printmatrix(Matrix *a)功能:将矩阵中的元素以平时常见的形式显示出来,方便考察测试结果。 实现思路:利用for循环和适时的换行实现。1.3.3测试系统设计1.运行程序得到主界面:2.根据自己的需要进行选择:2.1)、选择1:此时matrix文本文档中的内容为:2.2)、选择2:2.3)、选择3:2.4)、选择4:当行数不等于列数时当行数等于列数时2.5)、选择5:2.6)、选择6:当矩阵A的行数等于的B行数,并且A的列数等于B的列数时,得:当上边的条件不成立时:2.7)、选项7:当矩阵A的行数等于的B行数,并且A的列数等于B的列数时,得:当上边的条件不成立时:2.8)、选择8:当矩阵A的列数等于的B行数时,得:当上式不成立时:2.9)、选择9:当输入的行数不等与列数(既不是方阵时),得:当行数等于列数(即为方阵)时,得:2.10)、选择0:2.11)、输入其它数时,得:1.4具体程序#include#include#include#define MAX 100typedef struct int cols; /列数 int rows; /行数double mMAXMAX; /矩阵数据Matrix; /静态矩阵int count=1;/* *往文件中写入矩阵,成功返回写入的矩阵不成功返回0* */int matrixwrite(FILE *fp,Matrix *a)int i,j;if (fp=NULL)return 0;elsefprintf(fp,t%dt%d,a-rows,a-cols);fprintf(fp,n);for (i=0;irows;i+)for (j=0;jcols;j+)fprintf(fp,t%lf,a-mij);fprintf(fp,n);return (a-rows*a-cols);/* *从文件中读取已有的矩阵* */Matrix *matrixread_1(FILE *fp,Matrix *a)int i,j;if (fp=NULL)return NULL;elsefscanf(fp,%d%d,&a-rows,&a-cols);for (i=0;irows;i+)for (j=0;jcols;j+)fscanf(fp,%lf,&a-mij);return a;/* *矩阵的显示* */int printmatrix(Matrix *a)int i,j;if (a=NULL)printf(nnt对不起,您的操作有误!n);return 0;elseprintf(nnnt矩阵的%u行数是:%u,列数是:%un,count+,a-rows,a-cols);printf(t矩阵的元素:nn);for (i=0;irows;i+)for (j=0;jcols;j+)printf(t%lf ,a-mij);printf(n);return (1);/* *初始化矩阵为全零阵* */Matrix *matrixInitzero(Matrix *a)int i,j;for (i=0;irows;i+)for (j=0;jcols;j+)a-mij=0;return a;/* *初始化单位阵* */Matrix *matrixInit(Matrix *a)int i,j;if (a-cols!=a-rows)return NULL;elsefor (i=0;irows;i+)for (j=0;jcols;j+)if (i=j)a-mii=1;elsea-mij=0;return a;/* *矩阵的加法运算* */Matrix *matrixadd(Matrix *a,Matrix *b)Matrix x;Matrix *c=&x;int i,j;if (a-rows!=b-rows | a-cols!=b-cols)printf(nnt对不起,你的输入有误!n);printf(t请按回车结束!n);getch();return NULL;elsec-rows=a-rows;c-cols=a-cols;for (i=0;irows;i+)for (j=0;jcols;j+)c-mij=a-mij+b-mij;return c;/* *矩阵的减法运算* */Matrix *matrixsub(Matrix *a,Matrix *b)Matrix x;Matrix *c=&x;int i,j;if (a-rows!=b-rows | a-cols!=b-cols)printf(nnt对不起,你的输入有误!n);printf(t请按回车结束!n);getch();return NULL;elsec-rows=a-rows;c-cols=a-cols;for (i=0;irows;i+)for (j=0;jcols;j+)c-mij=a-mij-b-mij;return c;/* *矩阵的乘法运算* */Matrix *matrixmul(Matrix *a,Matrix *b)Matrix x;Matrix *c=&x;int i,j,k;double sum=0;if (a-cols!=b-rows)printf(nnt对不起,你的输入有误!n);printf(t请按回车结束!n);getch();return NULL;elsec-rows=a-rows;c-cols=b-cols;for (i=0;irows;i+)for (j=0;jcols;j+)for (k=0;kcols;k+)sum=sum+a-mik*b-mkj;c-mij=sum;return c;/* *矩阵的转置* */Matrix *matrixTranspose(Matrix *a)Matrix x;Matrix *b=&x;int i,j;b-cols=a-rows;b-rows=a-cols;for (i=0;irows;i+)for (j=0;jcols;j+)b-mji=a-mij;return b;/* *矩阵的行列式* */double matrixdet(Matrix *a)int i,j,k;double t,det=1,x;if (a-cols!=a-rows)printf(nnnt对不起,您输入的数据不是方阵,没有行列式!n);printf(t请按回车键结束!n);getch();return -1;elsefor(i=0;irows;i+)for(k=0;krows;k+)if(k!=i)if (a-mii!=0)t=a-mki/a-mii;for(j=0;jrows);j+)x=a-mij*t;a-mkj=a-mkj-x;elsereturn 0;for(i=0;irows;i+)det=det*a-mii;return (det);/* *矩阵数据的输入* */Matrix *scanfmatrix(Matrix *a)int i,j;printf(nt请输入矩阵的行数和列数:n);scanf(%d%d,&a-rows,&a-cols);if (a-cols=0 | a-rows=0)printf(n对不起,您输入的数据有误!n);printf(请按回车键结束!);getch();return NULL;elseprintf(t请输入矩阵的元素:n);for (i=0;irows;i+)for (j=0;jcols;j+)scanf(%lf,&a-mij);return a;/* *目录* */int main()int choice;FILE *fpr,*fpw;Matrix a,b,c;Matrix *p1=&a,*p2=&b,*p3=&c;printf( 1: 写入矩阵文件n); printf( 2: 读取矩阵文件n); printf( 3: 初始化矩阵(全零阵)n); printf( 4: 初始化矩阵(单位阵)n);printf( 5: 矩阵的转置n);printf( 6: 矩阵的加法n);printf( 7: 矩阵的减法n);printf( 8: 矩阵的乘法n);printf( 9: 方阵的行列式的值n);printf( 0: 退出nnn); printf(请输入您的选择: n); scanf(%d,&choice);switch (choice)case 1:system(cls); /将矩阵写入文件fpw=fopen(matrix.txt,a);printf(nn);p1=scanfmatrix(p1);if (p1=NULL)break;matrixwrite(fpw,p1); break;case 2: /将矩阵从文件中读出system(cls);fpr=fopen(matrix.txt,r);for(;)p2=matrixread_1(fpr,p1);if (!feof(fpr)printmatrix(p2);elsebreak; break;case 3: /初始化矩阵为全零阵system(cls);printf(nnnt请输入矩阵的行数和列数:n);scanf(%d%d,&p1-rows,&p1-cols);p2=matrixInitzero(p1);printf(nt初始化为全零阵后:nn);printmatrix(p2); break;case 4: /初始化矩阵为单位阵system(cls);printf(nnnt请输入矩阵的行数和列数:n);scanf(%d%d,&p1-rows,&p1-cols);p2=matrixInit(p1);printf(nt初始化为单位阵后:n);printmatrix(p2); break;case 5: /矩阵的转置system(cls);printf(nnnt请输入矩阵A的数据:n);p1=scanfmatrix(p1);if (p1=NULL)break;p2=matrixTranspose(p1);printf(nt进行完转置后:n);printmatrix(p2); break;case 6: /矩阵的加法运算system(cls);printf(

温馨提示

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

评论

0/150

提交评论