计算机代数系统第6章-程序设计
- 格式:pdf
- 大小:428.57 KB
- 文档页数:35
第 1 章程序设计概述程序设计……。
本章简介1.1 概述1.1.1 程序与程序设计两个概念1.1.2 程序设计语言程序设计语言的历史、发展和分类1.2 算法1.2.1 算法的概念1.2.2 算法的描述方法流程1. 图2. 伪码程序言3. 设计语1.2.3 简单算法举例1.3 程序设计过程1.3.1 解决问题的基本步骤用计算机解决问题的基本步骤1.3.2 C程序的设计过程1.4 C语言简介1.4.1 C语言的字符集与词法符号1. 字符集法符2. 词号(1)标识符(2)关键字(3)运算符(4)分隔符(5)其它符号1.4.2 C语言程序的基本结构1.4.3 C语言程序的书写规则1.5 程序设计方法1.5.1 结构化程序设计1.5.2 面向对象程序设计1.6 开发环境简介1.6.1 启动vc++6.01.6.2 创建工程与文件1.6.3 编辑程序1.6.4 编译与连接1.6.5 运行1.6.6 关闭1.7 案例设计学生成绩管理系统——设计任务、需求分析、功能描述、数据定义本章小结习题第 2 章数据类型、运算符与表达式程序设计案例中用到数据的类型、常量、变量、运算等本章简介2.1 数据类型2.1.1 基本数据类型2.1.2 构造数据类型2.1.3 其他数据类型指1. 针2. 空枚3. 举2.2 常量与变量2.2.1 常量1. 数值常量2. 字符常量3. 字符串常量符常量4. 号2.2.2 变量量的定与初始化1. 变义各型的量2. 种类变2.3 运算符与表达式2.3.1 运算符算算符1. 术运自增自算符2. 减运3. 赋值运算符系算符4. 关运5. 逻辑运算符逗算符6. 号运件算符7. 条运位算符8. 运其算符9. 它运2.3.2 表达式2.3.3 类型转换2.4 标准输入/输出2.4.1 scanf函数2.4.2 printf函数2.4.3 其它输入输出函数2.5 数学函数常用的数学函数2.6 随机数发生器函数随机数发生器函数2.7 案例应用程序设计案例中数据类型、常量、变量、运算等的实现本章小结习题第 3 章程序控制结构程序设计案例中用到的语句以及各种程序控制结构本章简介3.1 程序的基本结构程序的三种基本结构以及相应的流程图3.2 语句3.2.1 声明语句3.2.2 表达式语句3.2.3 复合语句3.2.4 控制语句3.2.5 空语句3.3 顺序结构3.4 选择结构3.4.1 if语句分支1. 单结构分支2. 双结构多分支3. 结构4. if语句的嵌套3.4.2 switch语句3.4.3 程序举例3.5 循环结构3.5.1 while语句3.5.2 do-while语句3.5.3 for语句3.5.4 几种循环的比较3.5.5 循环的嵌套3.5.6 程序举例3.6 转向语句3.6.1 break语句3.6.2 continue语句3.6.3 程序举例3.7 结构化程序设计的方法3.8 案例应用程序设计案例中各种控制结构的具体实现本章小结习题第 4 章函数与预处理程序设计案例中为何要用函数、预处理组织程序本章简介4.1 概述4.1.1 函数的概念4.1.2 函数分类4.2 函数的定义与声明4.2.1 函数的定义4.2.2 函数声明与函数原型4.3 函数调用4.4 函数返回类型与返回值4.5 函数的参数4.5.1 形式参数与实际参数4.5.2 值传递与地址传递4.6 递归4.6.1 递归的概念4.6.2 程序举例4.7 变量作用域4.7.1 内部变量4.7.2 外部变量4.7.3 作用域规则4.8 变量存储类别4.8.1 变量生存期4.8.2 auto变量4.8.3 static变量4.8.4 register变量4.8.5 extern变量4.9 内部函数与外部函数4.9.1 内部函数4.9.2 外部函数4.10 预处理4.10.1 文件包含4.10.2 宏定义4.10.3 条件编译4.11 案例应用程序设计案例中函数和预处理的具体实现本章小结习题第 5 章数组程序设计案例中为何用数组来存放数据本章简介5.1 一维数组5.1.1 一维数组定义与初始化 5.1.2 一维数组元素的引用 5.1.3 一维数组作为函数参数1. 数组元素为数作函实参2. 数组为名作数参函数5.1.4 一维数组应用举例1. 统计2. 排序3. 查找4. 插入5.2 二维数组5.2.1 二维数组定义与初始化、 5.2.2 二维数组数组元素的引用 5.2.3 二维数组应用举例5.3 字符数组5.3.1 字符串与字符数组1. 数组义字符的定与初始化2. 数组字符的引用3. 数组应举字符用例5.3.2 字符串处理函数1. 求长数字符串度函2. 复数字符串制函3. 较数字符串比函4. 连数字符串接函5.3.3 字符串数组5.4 案例应用程序设计案例中数组的具体实现本章小结习题第 6 章指针程序设计案例中为何要用指针来处理数据本章简介6.1 指针的概念6.1.1 地址与指针地址的概念、直接访问与间接访问、指针的概念6.1.2 指针变量的定义与初始化6.1.3 指针的运算基本算1. 运取地址运算符&、间接引用运算符*2. 赋值运算6.2 指针与函数6.2.1 指针作函数的参数6.2.2 函数返回指针6.2.3 指向函数的指针6.3 指针与数组6.3.1 指针对数组元素的访问包含指针的算术运算和关系运算6.3.2 字符指针字符数组、字符串和字符指针的关系6.3.3 指向数组的指针6.3.4 指针数组包含命令行参数6.3.5 指向指针的指针6.4 动态内存分配6.4.1 动态内存分配的含义6.4.2 动态内存分配的步骤6.4.3 常用的动态内存分配函数6.5 案例应用程序设计案例中指针的具体实现本章小结习题第 7 章结构体与共用体程序设计案例中为何要用结构体来处理数据本章简介7.1 结构体类型与结构体变量7.1.1 结构体类型的声明7.1.2 结构体变量的定义与初始化7.1.3 结构体变量的引用7.1.4 指向结构体变量的指针7.1.5 关键字typedef的用法7.2 结构体数组7.2.1 结构体数组的定义7.2.2 结构体数组的应用7.2.3 结构体数组与指针7.3 结构体与函数7.3.1 函数参数为结构体类型7.3.2 返回结构体类型7.4 动态数据结构7.4.1 问题的提出7.4.2 链表的定义7.4.3 链表的的特点及操作原理7.4.4 动态链表的建立7.4.5 链表的删除操作7.4.6 链表的插入操作7.5 共用体7.6 位段7.7 案例应用程序设计案例中结构体的具体实现本章小结习题第 8 章文件操作程序设计案例中为何要用文件来处理数据本章简介8.1 计算机中的流8.2 文件8.2.1 存储设备的使用8.2.2 目录8.2.3 文件格式8.3 基本文件操作8.3.1 基本文件操作函数8.3.2 错误处理8.3.3 程序举例8.3.4 基本文件操作的意义8.4 高级文件操作8.4.1 文件的打开与关闭8.4.2 文件的读写8.4.3 程序举例8.4.4 标准输入与标准输出8.5 案例应用程序设计案例中文件读写的具体实现本章小结习题附录A ASCII表附录B运算符附录C标准库附录D常见编译错误附录E C99标准。
程序设计[chéng xùshèjì]
释义:程序设计是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。
程序设计往往以某种程序设计语言为工具,给出这种语言下的程序。
程序设计过程应当包括分析、设计、编码、测试、排错等不同阶段。
专业的程序设计人员常被称为程序员。
示例图片:
概念辨析:
程序设计步骤:
(1)分析问题
对于接受的任务要进行认真的分析,研究所给定的条件,分析最后应达到的目标,找出解决问题的规律,选择解题的方法,完成实际问题。
(2)设计算法
即设计出解题的方法和具体步骤。
(3)编写程序
将算法翻译成计算机程序设计语言,对源程序进行编辑、编译和连接。
(4)运行程序,分析结果
运行可执行程序,得到运行结果。
能得到运行结果并不意味着程序正确,要对结果进行分析,看它是否合理。
不合理要对程序进行调试,即通过上机发现和排除程序中的故障的过程。
(5)编写程序文档
许多程序是提供给别人使用的,如同正式的产品应当提供产品说明书一样,正式提供给用户使用的程序,必须向用户提供程序说明书。
内容应包括:程序名称、程序功能、运行环境、程序的装入和启动、需要输入的数据,以及使用注意事项等。
相关词条:程序
例题分析与解答:
填空:程序设计是给出解决特定问题程序的( )。
考点:程序设计的定义
答案:过程。
第六章Maple 程序设计前面,我们使用的是Maple 的交互式命令环境.所谓交互式命令环境,就是一次输入一条或几条命令,然后按回车,这些命令就被执行了,执行的结果显示在同一个可执行块中.对于大多数用户来说,利用交互式命令环境解决问题已经足够了,但如果要解决一系列同一类型的问题或者希望利用Maple 编写需要的解决特定问题的函数和程序,以期更加充分地利用Maple 的强大功能,提高大规模问题的计算效率,掌握一定的程序设计是必要的.幸运的是,Maple 自身提供了一套编程工具,即Maple 语言.Maple 语言实际上是由Maple 各种命令以及一些简单的过程控制语句组成的.1编程基础1.1算子所谓算子,是从一个抽象空间到另一个抽象空间的函数.在数学上算子的含义通常是函数到函数的映射.在Maple 中,算子常用“箭头”记号定义(也称箭头操作符):>f:=x->a*x*exp(x);:= f → x a x e x>g:=(x,y)->a*x*y*exp(x^2+y^2);:= g → (),x y a x y e() + x 2y 2另外,函数unapply 也可以从表达式建立算子:>unapply(x^2+1,x); → x + x 21>unapply(x^2+y^2,x,y);→ (),x y + x 2y 2当我们依次把算子f 作用到参数0,a,x^2+a 时即可得平常意义上的函数值:>f:=t->t*sin(t);:= f → t t ()sin t >f(0);>f(a);a ()sin a >f(x^2+a);() + x 2a ()sin + x 2a 上述结果是函数作用的例子.而最后一个结果)sin()(22a x a x ++实际上是算子f 与算子g:=t->t^2+a 复合后再作用到参数x 的结果.从数学上讲,作用与复合是不同的,它们产生的结果是有区别的,但在使用它们时,两者还是有些重叠的.在Maple 中,可以依赖于语法把它们区分开:(1)当复合两个算子时,结果仍是算子,两个算子的定义域必须是相容的;(2)当把一个算子作用于一个参数(参数必须在算子的定义域中)时,结果是一个表达式;(3)在Maple 中,函数作用的语法是使用括号(),如函数f 作用到参数u 写作f(u).而复合算子的符号是@,多重复合时使用符号@@.通过进一步的例子可以清楚区分作用与复合的功能:f 和g 复合的结果是算子))((:t g f t g f ↦�=,而把这个算子作用到参数x 得到表达式f (g (x )).例如,)exp(),sin(u u g t t f ↦↦=+=ϕ,则))sin(exp(:ϕ+=z z g f ↦�是一个算子,而))sin(exp()((ϕ+=x x g f 是一个表达式,因为x 是一个实数.试比较下述两例:>D(g@f);()@()()D g f ()D f >D(g*h);+ ()D g h g ()D h 另外一个应引起注意的问题是算子(函数)与表达式的异同,在第一章2.2.2中曾探讨过函数与表达式的区别,这里再通过几个例子说明其中的微妙差异:>f1:=x^2+1;>f2:=y^2+1;:= f1 + x 21:= f2 + y 21>f3:=f1+f2;:= f3 + + x 22y 2再看下面的例子:>g1:=x->x^2+1;>g2:=y->y^2+1;:= g1 → x + x 21:= g2 → y + y 21>g3:=g1+g2;:= g3 + g1g2与前面例子不同的是,两个算子(函数)g1,g2相加的结果依然是函数名g 3,出现这个问题的主要原因是g1与g2分别为x ,y 的函数,Maple 认为它们的定义域不相容.要得到与前例的结果,只需稍作改动:>g3:=g1(x)+g2(y);:= g3 + + x 22y 2下面的例子想说明生成Maple 函数的两种方式“箭头操作符”及“unapply ”之间微妙的差异:>x:='x':a:=1:b:=2:c:=3:>a*x^2+b*x+c;+ + x 22x 3>f:=unapply(a*x^2+b*x+c,x);:= f → x + + x 22x 3>g:=x->a*x^2+b*x+c;:= g → x + + a x 2b x c由此可见,f 中的a,b,c 已经作了代换,而g 中则显含a,b,c 。
再看下面实验:>f(x);g(x);+ + x 22x 3+ + x 22x 3f 与g 两者相同,再对其微分:>D(f);D(g);→ x + 2x 2→ x + 2a x b再改变常数c 的值,观察f 与g 的变化:>c :=15;:= c 15>f(x);g(x);+ + x 22x 3+ + x 22x 15由此可见,在利用Maple 进行函数研究时,对同一问题应该用不同方法加以校验,而这一切的支撑是数学基础!1.2编程初体验利用算子可以生成最简单的函数—单个语句的函数,但严格意义上讲它并非程序设计,它所生成的数据对象是子程序.所谓子程序,简单地说,就是一组预先编好的函数命令,我们由下面的简单程序来看看Maple 程序的结构:>plus:=proc(x,y)x+y;end;这个程序只有2个参数,在程序内部它的名称是x ,y,这是Maple 最简单的程序结构,仅仅在proc ()和end 中间加上在计算中需要的一条或者多条命令即可,Maple 会把最后一个语句的结果作为整个子程序的返回结果,这一点需要引起注意.再看下例:>P :=proc(x,y)x-y;x*y;x+y;end end::>P (3,4);7显然,尽管程序P 有三条计算命令,但返回的只是最后一个语句x+y;的结果.要想输出所有的计算结果,需要在程序中增加print 语句:>P :=proc(x,y)print(x-y);print(x*y);print(x+y);end::end>P(3,4);-1127再看下面几个例子:>for i from2to6doexpand((x+y)^i);od;x22x y y2+ +x33x2y3x y2y3+ + +x44x3y6x2y24x y3y4+ + + +x55x4y10x3y210x2y35x y4y5+ + + + +x66x5y15x4y220x3y315x2y46x y5y6+ + + + + +>F:=proc(n::integer)if n mod12=0then trueelse falsefiend:>F(123^123),F(1234567890^9);false true,从上面几个简单的例子可以看出Maple子程序主要包含以下一些内容:(i)把定义的子程序赋值给程序名procname,以后就可以用子程序名procname来调用程序;(ii)子程序一律以proc()开头,括号里是程序的输入参数,如果括号中什么都没有,表示这个子程序没有任何输入参数;(iii)子程序中的每一个语句都用分号(或冒号)分开(这一点不是主要的,程序设计时,在可能的时候—过程当中的最后一个语句、for-循环、if 语句中的最后一个语句省略终结标点也是允许的,这并不是为了懒惰,而是因为在终结语句后面插入一个语句产生的影响要比仅仅执行一个新语句产生的影响大);(iv)在定义完子程序之后,Maple 会显示它对该子程序的解释(除非在end 后用冒号结束),它的解释和你的定义是等价的,但形式上不一定完全相同;(v)Maple 会自动地把除了参数以外的变量都作为局部变量(local variable),这就是说,它们仅仅在这个子程序的定义中有效,和子程序以外的任何同名变量无关.在定义了一个子程序以后,执行它的方法和执行任何Maple 系统子程序一样—程序名再加上一对圆括号(),括号中包含要调用的参数,如果子程序没有参数,括号也是不能省略的.除了上面给出的程序设计方法外,在Maple 中还可以直接由“->”(箭头)生成程序,如下例:>f:=x->if x>0then x else -x fi;:= f proc ()end proc x option ;,operator arrow if then else end if < 0x x −x >f(-5),f(5);,55甚至于程序名也可以省略,这种情况通常会在使用函数map 时遇到:>map(x->if x>0then x else -x fi,[-4,-3,-2,0,1]);[],,,,43201如果需要察看一个已经定义好的子程序的过程,用eva evall 命令,查看Maple 中源程序(如factor 函数)使用下述组合命令:interface (verboseproc=2);print (factor);再看一个更为有用的简单程序:代数方程的参数解。
该程序在代数方程f(x,y)=0求解中使用了一个巧妙的代换y=tx 得到了方程的参数解,它的主要用途是用来画图、求积分、求微分和求级数.程序如下:>parsolve:=proc(f,xy::{list(name),set(name)},t::name)local p,x,y;x:=xy[1];y:=xy[2];p:={solve(subs(y=t*x,f),x)}minus{0};map((xi,u,xx,yy)->{xx=xi,yy=u*xi},p,t,x,y)end:调用该程序可以方便求解:>parsolve(u^2+v^2=a^2,[u,v],t);{},{}, = u −a+ 1t 2 = v −t a + 1t 2{}, = u a + 1t 2 = v t a + 1t 2>f:=randpoly([x,y],degree=3,sparse);:= f − + + + + + 53x 85x y 49y 278x 317x y 272y 3>parsolve(f,[x,y],t);= y 12t ()− − + 49t 285t + + + 2401t 423594t 310829t 216536 + + 72t 37817t 2,{{ =x 12− − + 49t 285t + + + 2401t 423594t 310829t 216536 + + 72t 37817t 2}{, = y 1t ()− − − 49t 285t + + + 2401t 423594t 310829t 216536 + + 72t 37817t 2, =x 12− − − 49t 285t + + + 2401t 423594t 310829t 216536 + + 72t 37817t 2}}1.3局部变量和全局变量Maple 中的全局变量,是指那些在交互式命令环境中定义和使用的变量,前面所使用的变量几乎都属于全局变量.而在编写子程序时,需要定义一些只在子程序内部使用的变量,称其为局部变量.当Maple 执行子程序时,所有和局部变量同名的全局变量都保持不变,而不管在子程序中给局部变量赋予了何值.如果要把局部变量定义为全局变量,需要用关键词global 在程序最开始加以声明,而局部变量则用local 声明,虽然这是不必要的,但在程序设计时,声明变量是有一定好处的.下面通过实例演示局部变量与全局变量的不同.为了更清楚地观察子程序对全局变量的影响,在子程序外先设定一个变量a 的值:>a:=1;:= a 1>f:=proc()local a;a:=12345678/4321;evalf(a/2);end;>f();1428.567230>a;1>g:=proc()global a;a:=12345678/4321;evalf(a/2);end;>g();1428.567230>a;123456784321显然,在前一个程序中,由于在子程序外已经赋值给a,a是全局变量,它的值不受子程序中同名局部变量的影响;而在后一个子程序中,由于重新把a定义为全局变量,所以子程序外的a随着子程序中的a值的变化而变化.子程序中的输入参数,它既不是全局的,也不是局部的.在子程序内部,它是形式参数,也就是说,它的具体取值尚未被确定,它在程序调用时会被替换成真正的参数值.而在子程序外部,它们仅仅表示子程序接受的参数的多少,而对于具体的参数值没有关系.1.4变量nargs,args与procname在所有程序中都有三个有用的变量:nargs,args与procname.前两个给出关于调用参量的信息:nargs变量是调用的实际参量的个数,args变量是包含参量的表达式序列, args的子序列通过范围或数字的参量选取.例如,第i个参量被调用的格式为:args[args[i]i]. nargs,args变量通常在含有可选择参量的程序中使用.下面看一个例子:>p:=proc()local i;RETURN(nargs,[seq(i^3,i=args)])end proc:>p(1,2,3,4,5,6,7,8,9,10);,,,,,,,,,182764125216343512729100010[],Maple e函数RETURRETURN N返回了输入参量的个数以及参量序列的立方列表,该程序利用MaplRETURN函数使用时必须在其后加圆括号,即使无结果返回时也得如此。