C语言程序课程设计

发布 2022-10-03 03:13:28 阅读 7819

作者:panhongliang

仅供个人学习。

c语言程序设计。

课程设计报告。

完成任务:1. 用二分法求方程根。

2. 矩阵求逆。

3. 链表制作。

4. 二十四点游戏。

5. 学籍管理程序。

专业:计算机科学与技术。

班级:计二班。

学号:0705010225

姓名:李海波。

本人于2024年9月1号在计算机中心6号机房25号机器上完成了本次课程设计。课程设计过程中使用的操作系统是windows 2000,主要开发平台vc++ 6.0.

用二分法求方程f(x)==x3-x-1=0在区间[1.0,1.5]内的一个实根,要求准确到小数点后第2位。

方程在区间[1.0,1.5]上单调并且存在一个根。取区间中点,确定方程的根在左右哪个区间。

或者恰好是区间中点)内,这样一次就可以把区间缩小一半,重复做此步骤直到满足精确度为止。

方程的近似根为区间中点。

取区间中点:

只需用区间的两个端点相加,在除以2即可。

确定根所在位置:

区间[a,b]中,取中点c=(a+b)/2,与a,b构成两个区间:[a,c]与[c,b].而方程的根的位置有三种可能1.

在区间[a,c]中;2.在区间[c,b]中;3.根就是中点c.

若中点就是方程的根,则可以直接输出。若不是这是剩下两种情况。若f(c)*f(a)<0,则根在区间[a,c]中,若f(b)*f(a)<0,则根在区间[b,c]中,两者只有一种情况成立。

验证是否满足精确度:

精确到小数点后两位,就是说0.01..由于是用二分法,所以到了0.

01后,还要继续二分,直到0.01后才能满足精确度。也就是说,区间左右值相减要小于0.

001时,输出区间中点即可。

此程序将涉及三个变量:区间的两个端点,区间中点。由于要精确到小数点后两位,所以必须设置为float类型。

还有一个函数,由于只需要验证返回值的正负,所以只需用int类型就可以了。后来在函数运行**现错误,更改为float类型(具体错误将在“**调试与运行”部分说明).

本程序比较小,原本只用一个main函数就可以完成,可是由于方程的函数每次输入比较麻烦,所以设置了一个简单的函数:

int hanshu(float x)

return x*x*x-x-1。

用它来返回方程函数的带入值。

程序的关键在于不断二分,确定根所在位置的循环算法。此循环**如下:

doif(hanshu(a)*hanshu(f)<0)

b=f。else

a=f。}while(b-a>0.001)。

首先给f赋值为区间中点。若它满足hanshu(f)==0,说明f为方程的根,直接输出f,并用break语句,结束循环。如果不满足,则验证根在哪个区间,并执行相应赋值,形成新的区间,继续执行循环。

循环在执行到满足精确度时结束,即b-a<=0.001,结束循环。

输出方程的根最好区分开此根是近似根还是准确根。所以把输出分为两部分。一部分在循环内,验证区间中点为准确根的时候输出。

若要输出近似根则要循环结束后,所以输出语句在循环结构外面。为了验证循环结束后得到的根f是不是准确根,顾输出语句在if语句内。**如下:

if(b-a<0.01)

printf("方程的近似根为%.2f",f)。

原程序运行时结果出人预料:

方程的根为1.25

注意到1.25恰好是原来区间的中点,而根据输出来看,1.25是方程的精确根。可是经过计算我得到方程的根应该在1.3到1.4之间。

会输出这个结果,也就是说程序执行了。

if(hanshu(f)==0)

printf("方程的根为%.2f",f)。break。}。

为什么会这样?我想起返回函数带入值的函数hanshu()的返回值是int.如果返回值没有整数部分,就会返回0.所以把它更改为float类型,最终得到结果:1.33.

屏幕显示为:

方程的近似根为1.33

每项数据在数据设定时需要细致详细的考虑数据的用途,以及可能出现的错误。注意每种数据的范围以防止程序运行**错。一个简单的程序,也不能保证一次编写毫无错误。

尤其在debuge系统不能检验出错误,但是结果又不是期望值时,必须重新检查程序,任何细小的地方都可能是出错的原因。

本人于2024年9月2号到2024年9月5号在计算机中心6号机房14号机器上尝试了本次课程设计。课程设计过程中使用的操作系统是windows 2000,主要开发平台vc++ 6.0.

由于各种原因至今没有完成,个大函数已经完成,但是在运行**现错误的原因没有找到。

目的与意义。

给定一个8x8的矩阵a,求出它的逆矩阵a-1.

矩阵的元素由键盘中输入,首先判断矩阵是否可逆,若可逆则求出其逆矩阵并在屏幕上用适当格式显示出来。

程序可以把矩阵求逆这一复杂的运算由计算机代替计算,既可以保证结果的准确,又可以高速度的完成复杂的计算。

任务分析。根据线性数学的学习知道,矩阵求逆有两种方法:单位矩阵化归法、伴随矩阵法。

根据指导上的分析,第一种需要三个函数。那就是:行交换、将第n行乘以e、第i行乘以k加到第j行。

这三个函数都不难做,但是如何利用这三个函数,求出逆矩阵我却无从下手。我只好用另外一种方法做。

用伴随矩阵求逆矩阵需要两个函数:求矩阵行列式、计算代数余子式。而这两个函数在使用中又相互使用,也就是相互调用。

利用相互调用,就可以吧求你矩阵所需的的代数余子式和矩阵行列式求出来。

求出矩阵行列式就可以验证矩阵是否存在逆矩阵。

由代数余子式得到矩阵的伴随矩阵,两者相除就可以得到矩阵的逆矩阵了。

数据结构设计。

程序里输入输出都是矩阵,自然用二维数组。矩阵不见得都是整数,所以用float来定义最好。在带入两个函数时需要函数的阶数,这个一定是正整数,用int定义就可以。

两个函数举证的行列式肯定是用float定义。求代数余子式的函数还要传入行数和列数,用int定义就好。

关键算法。程序关键算法就是两个。一是计算方阵的行列式,另一个是计算方阵对于某个元素的代数余子式。

由于两个函数相互调用,所以在函数中会有另一个函数的函数声明。我的求方阵行列式函数声名为float hangleishi(int n,float x[8][8]),其中n表示方阵的阶数。求代数余子式的函数声明为float yuzishi(int n,float x[8][8],int i,int j),其中n表示阶数,i,j表示求方阵对于第i行,第j列的代数余子式。

求方阵行列式的函数**如下:

float hangleishi(int n,float x[8][8])

float h。

int i=0。

float yuzishi(int n,float x[8][8],int i,int j)。/函数声明*/

if (n=2)

h=x[0][0]*x[1][1]-x[0][1]*x[1][0]。

elsefor(i=0。ih=h+x[0][i]*yuzishi(n,x,0,i)。

return h。

函数运用了函数递归的原理。在n>2时,函数执行else 的语句。语句中使用了求代数余子式的函数,是求行列式的一般求法,也是普遍求法。

没有技巧,但是编程简单,算法也容易实现。n=2时,就可以直接算出来,返回h即方阵的行列式。降阶在函数yuzishi()中实现。

求代数余子式的函数如下:

float yuzishi(int n,float x[8][8],int i,int j)

int a=1,c=0,d=0。

float h=0。

float y[8][8]。

for(c=0。c

for(。c

h=hangleishi((n-1),y)。

for(。a<=i+j。a++)

h=-h。return h。

函数大致分为两部分。第一部分把传入的矩阵中的第i行、第j列的元素删除,并把剩下的复制到另外一个矩阵中,然后再求复制完矩阵的行列式。求行列式时用到了求行列式函数,在调用的时,传入n-1,就完成了降阶。

其余的就是矩阵的输入与输出。这个可以在主函数中一起实现。只需要连个循环的嵌套就可以了。

**调试与运行。

程序运行时,会请用户输入所有的64个元素,之后就会开始运算。但是由于错误不管输入什么值,计算的行列式都是0.我无法找出其中的毛病。

因为debuge系统是找不到的,这种问题往往比较难找。时间关系我继续了我的课程设计,没有全部完成这项设计任务。

小结与体会。

程序没有很好的完成,这让我很遗憾。我很想把每个我编的程序都尽量做好,做完善。可是这次我找了很多班里的c语言“大师”,都没有找到错误所在,而且有人的错误竟然和我的一模一样。

我很诧异,也很无奈。

这个程序我之后又反复看了很多次,终究找不到问题出在**,也许这就是水平问题吧。后来,我也只好用残缺也是一种美来安慰自己,把它保存下来。等以后自己能力高些了再来找出问题所在。

本人于2024年9月4号到2024年9月8号在计算机中心6号机房12号机器上完成了本次课程设计。课程设计过程中使用的操作系统是windows 2000,主要开发平台vc++ 6.0.

在屏幕上输出菜单,先从键盘接收整数序列。将这些整数作为链表节点的值,完成链表的创建、节点插入、节点的删除以及整个链表的撤销等操作。

后来觉得程序的使用者很可能修改某个节点,所以添加了节点的修改功能。

使用程序的人可以根据菜单提示,完成最基本的链表操作,完成一个自己需要的整数一维链表。

这是一个比较大的程序,所以必定要分多个函数完成。

首先必定要输出菜单,所以一定有一个菜单函数:caidan();另外根据要求还要有创建函数chuangjian()、插入节点函数charu()、删除节点函数shanchu()、修改节点函数xiugai()、撤销链表函数chexiao()、链表显示函数print(),还要有一个结束选项,于是就有了结束函数jieshu().

C语言程序课程设计

重庆理工大学。课程设计。课程 c语言程序设计课程设计 题目职工信息管理系统设计。院系名称数学与统计学院。班级 110010101 学生姓名杨秋燕学号 11001010128 指导教师陈媛李娅。评阅教师。时间 2011 6 23 1 问题描述。5 1题目一 职工信息管理系统设计。职工信息包括职工号 姓...

C语言程序课程设计

题目 院 系 计算机科学与工程学院。学科专业 网络工程 学生 潘佳伟。学号 090612110 指导教师 梁晨。2009年12月。目录。1课程设计的题目3 2课程设计的目的 设计要解决的问题 3 3概要设计 函数划分 总体设计4 4详细设计 流程图 程序5 5调试结果11 6课程设计总结11 7心得...

C语言程序课程设计

课程设计。课程名称 语言程序课程设计 学生学院福州职业技术学校 专业班级技术工程系 09应用电子 3 班。学号 200902013325 学生姓名郑长树 指导教师刘焕军 2010年12月30日。福州职业技术学院课程设计任务书。题目名称建立一个可以可以随时检索 删除 或增加新记录,保存或取消新的记录的...