第2章算法--C语言程序设计(谭浩强第三版)
13
2.3.2 用流程图表示算法
流程图:用一些约定的几何图形来描述算法。用某种图框表示 某种操作,用箭头表示算法流程。 美国国家标准化协会ANSI(American National Standard Institute)处理框
输入/输出框
注释框
流向线
连接点
n
n 1
100
3、计算机算法可分为两大类别: 数值运算算法:求数值解,例如求方程的根 非数值运算算法:包括的面十分广泛,如图书检索、人事 5 管理、行车调度管理等。
2.2 算法的特性
(1)有穷性。一个算法应包含有限的操作步骤,不能是无限的。 (2)确定性。算法中的每一个步骤都应当是确定的,而不应当是 含糊的、模棱两可的。对于相同输入必须得到相同结果。 (3)有零个或多个输入。所谓输入是指在执行算法时需要从外界 取得必要的信息。 (4)有一个或多个输出。算法的目的是为了求解,“解”就是输 出。 (5)有效性。算法中的每一个步骤都应当能有效地执行,并得到 确定的结果。
31
例 2.20 将例2.16表示的算法(求 5!)用C语言表示。
#include <stdio.h> void main( ) { int i,t; t=1; i=2; while (i<=5) { t=t*i; i=i+1; } printf(“%d\n”,t); }
32
2.4 结构化程序设计方法
解决办法:必须限制箭头的滥用,即不允许无规律地使流程随意 16 转向,只能顺序地进行下去,改进为:只有三种基本结构的流程图
2.三种基本结构 1966年,Bohra和Jacopini提出了以下三种基本结构: 顺序结构、 选择结构、 循环结构 用这三种基本结构作为表示一个良好算法的基本单元。
现在:任何复杂的算法都是由这三种基本结构按一定 规律组成。
23
2.3.4 用N-S流程图表示算法
1973年美国学者I.Nassi和B.Shneiderman提出了一种 新的流程图形式。在这种流程图中,完全去掉了带箭头的 流程线。全部算法写在一个矩形框内,在该框内还可以包 含其它的从属于它的框,或者说,由一些基本的框组成一 个大的框。这种流程图又称N--S结构化流程图。
结构化程序设计方法强调程序设计风格和程序结构的规范化,提 倡 清晰的结构。
一个复杂的问题,难以一下子写出一个层次分明、结构清晰、算 法正确的程序。 结构化程序设计方法的基本思路是:把一个复杂的问题的求解过 程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理 的范围内。 为保证程序满足结构化程序设计,可以采取如下方法: 自顶向下
当p1 A
A 直到p2
26
用三种N-S流程图中的基本框,可以组成复杂的N-S流程图。 图中的A框或B框,可以是一个简单的操作,也可以是三个基本 结构之一。
A框可以是一个选择结构
B框可以是一个循环结构
27
例2.11
求5!算法用N-S图表示
28
2.3.5 用伪代码表示算法
• 用伪代码表示算法(常常用于算法设计) • 用传统流程图、N-S图表示算法,直观易懂,但绘制比较 麻烦,在设计一个算法时,可能要反复修改,而修改流 程图是比较麻烦的,因此,流程图适合表示算法,但在 设计算法过程中使用不是很理想。为了设计算法方便, 常使用伪代码工具。 • 伪代码是用介于自然语言和计算机语言之间的文字和符 号来描述算法。伪代码不用图形符号,书写方便,格式 紧凑,便于向计算机语言算法过渡。
8
[例2.1]求1×2×3×4×5 算法1: 步骤1:先求1×2,得到结果2。 步骤2:将步骤1得到的乘积2再乘以3,得到结果6。 步骤3:将6再乘以4,得24。 步骤4:将24再乘以5,得120。 如果要求1×2×…×1000,则要写999个步骤 算法2:上述算法太繁琐,我们找一种通用的表示方法。 s1:设变量p,代表被乘数,p=1; s2:设变量i, 代表乘数,i=2; s3:使p×i,乘积仍放在被乘数变量p中,可表示为:p× i p; s4:使i的值加1,即i+1 i; s5:如果i不大于5,返回重新执行步骤s3以及其后的s4、s5;否则, 9 算法结束。最后得到的p就是5!的值。
6
2.3 算法的表示
为了表示一个算法,可以用不同的方法。归纳为两大类: (1)文字 (2) 图形(符号) 常用的方法有: 自然语言 传统流程图 N-S流程图 伪代码 PAD图等。
7
2.3.1 用带序号的自然语言直接表示算法 (例2.1-例2.5)
自然语言就是人们日常使用的语言,可以是汉语或英语 或其它语言。用自然语言表示通俗易懂,但文字冗长,容易 出现“歧义性”。
1
第二章 算法
算法的概念 算法的特性
算法的表示方法 结构化程序设计方法
2
引言:
一、一个程序应包括两个方面的内容:
• 对数据的描述:数据结构(data structure)
• 对操作的描述:算法(algorithm)
著名计算机科学家沃思提出一个公式: 数据结构 + 算法 = 程序
描述数据的类型、 数据的组织形式 完整的程序设计应该是: 描述对数据的 操作步骤
12
[例2.4]求1-1/2+1/3-1/4+…+1/99-1/100 算法如下: S1:sign=1;//作为加数符号 S2:sum=1 ;//sum作为累加变量 S3:deno=2; //作为加数分母 S4:sign=(-1)*sign S5:term=sign*(1/deno)// term作为加数 S6:sum=sum+term S7:deno=deno+1 S8:若deno100返回S4;否则算法结束。
数据结构+算法+程序设计方法+语言工具
程序设计方法:结构化程序设计方法 语言工具:c语言
3
二、简单的程序设计一般包括:
1、确定数据结构
2、确定算法
3、编码 4、调试程序 5、整理并写出文档资料
4
2.1 算法的概念
1、算法定义:广义地说,为解决一个问题而采取的方法和步 骤,就称为“算法”。 例如:描述太极拳动作的图解,就是太极拳的算法。 一首歌曲的乐谱,也可以称为该歌曲的算法。 2、对同一个问题,可以有不同的解题方法和步骤。算法决定 事情的成败、效率和代价的高低。 算法的时空效率 选择既运算快、内存开销小的算法 高斯算法
29
例2.16 求5!。用伪代码表 示算法:
也可以写成以下形式: BEGIN{算法开始} 1t 2 i while i≤5 {t×i t i+1 i} print t END{算法结束}
开始 置t的初值为1 置i的初值为2 当i<=5,执行下面操作: 使t=t×i 使i=i+1 {循环体到此结束} 输出t的值 结束
14
[例2.6]将例2.1求5!的算法用流程图表示
用图框来表示各种算法:灵 活、自由、直观、形象、直 观,可表示任何算法。
15
2.3.3 三种基本结构和改进的流程图 1.传统流程图的弊端 传统流程图用流程线指出各框的执行顺序,对流程线 的使用没有严格限制。因此,使用者可以毫不受限制地 使流程随意地转向,使流程图变得毫无规律。如图:
17
三种基本结构的图示:
顺序结构
18
菱形代表条 件判断 分段函数 int max(int x , int y) { if(x>y)
z=x;
else z=y; } 选择结构
19
循环结构的图示:
当型(While型)循环结构
直到型(Until型)循环
20
三种基本结构,有以下共同点: (1)只有一个入口:不得从结构外随意转入结构中某点。 (2)只有一个出口:不得从结构内某个位置随意转出(跳出)。 (请注意:一个菱形判断框有两个出口,而一个选择结构只有一 个出口。不要将菱形框的出口和选择结构的出口混淆。) (3)结构中的每一部分都有机会被执行到。(没有“死语句”) (4)结构内不存在“死循环”(无终止的循环)
11
[例2.3]判定2000-2500年中的每一年是否是闰年 闰年的条件是:(1)能被4整除,但不能被100整除的年份是 闰年,如1996年、2004年;(2)能被400整除的年份是闰年,如 1600年、2000年。 设y为被检测的年份。可采用以下步骤: S1:2000y S2:若y不能被4整除,则输出 “y不是闰年”。然后转到S6 S3:若y能被4整除,不能被100整除,则输出 “y是闰年”。然 后转到S6 S4:若y能被400整除,输出 “y是闰年”,然后转到S6 S5:输出 “y不是闰年” S6:y+1y S7:当y2500时,转S2继续执行,否则算法停止。
10
[例2.2]有50个学生,要求将他们之中成绩在80分以上的学号和 成绩输出
ni代表第i个学生学号。gi代表第i个学生成绩,算法如下: S1:1i S2:如果gi>80,则输出ni和gi;否则不输出 S3:i+1i S4:如果i50,返回S2,继续执行;否则,算法结束。
本例中,变量i作为下标,用它来控制序号(第几个学生, 第几个成绩)。当 i超过50时,表示已对50个学生的成绩处理 完毕,算法结束。
逐步细化
模块化设计 结构化编码
33
对于一个具体问题一般有两种方法 自顶向下、逐步细化 自下而上、逐步积累 例如:写文章、建造房屋 提倡采用自顶向下、逐步细化的程序设计方法,其过程是将 问题求解由抽象逐步具体化的过程。 特点:考虑周全,结构清晰,层次分明,作者容易写,读 者容易看。如果发现某一部分中有一段内容不妥,需要修 改,只需找出该部分修改有关段落即可,与其它部分无关。 注意:用这种方法便于验证算法的正确性,在向下一层展 开之前应仔细检查本层设计是否正确,只有上一层是正确 的才能向下细化。
求 1×3×5×7×9 ×11 • – 上述算法稍作改动: • s1: 1 p; • s2: 3 i; • s3: p ×i p; • s4: i+2 i • s5: 若i11,返回s3;否则, 结束。
C程序设计第三版(谭浩强) 第二章 程序的灵魂-算法
2.4.6 用计算机语言代码表示算法
A
图 2.25 分支结构
当P1成立 A
A 直到p1成立
图 2.26 当型循环
图 2.27 直到型循环
A 成立 B 图 2.24
p ≥100 不成立 A r =0.06 r =0.08 当n ≤10 B p×(1+r) => p × 图 2.28 A本身是一个分支结构,B是一个循环结构 本身是一个分支结构, 是一个循环结构 本身是一个分支结构
2.2简单算法举例
例2.1 求1×2 ×3 ×4 ×5 ×
算法: 算法: s1: p=1; s1:使p=1; i=2; s2: 使i=2; 乘积放在变量p 表示p=p s3: 使p ×i ,乘积放在变量p中,表示p=p × i; 的值加1 s4: 使i的值加1,即i+1 i; s5: 如果不大于5,返回重新执行步骤s3和s5;否则算法 如果不大于5 返回重新执行步骤s3和s5;否则算法 s3 结束。 结束。 p=5
x= 0 x = x+1 打印x 打印 x≥5 Y 图 2.19 N
以上2个框图的 作用是打印5个 数
只有一个入口; 只有一个入口; 只有一个出口; 只有一个出口; 注意:菱形框有2个出口, 注意:菱形框有2个出口,选择结构的 出口只有一个; 出口只有一个; 结构内的每一部分都有机会被执行到; 结构内的每一部分都有机会被执行到; 结构内不存在“死循环” 结构内不存在“死循环”;
题目: 题目:1×3 ×5 ×7 ×9 ×11 算法: 算法: s1:1 p s2:3 i s3:p× s3:p× i p s4:i+2 i s5:若i≤11,返回s3;否则,结束。 返回s3 s5:若i≤11,返回s3;否则,结束。 s5:若i<11,返回 返回s3? 结果会怎样? s5:若i<11,返回s3? 结果会怎样?
C语言程序设计(第三版)谭浩强著 各章习题答疑
以八、 /* 以八、十六进制输出 */
} ???? 是对应的带符号短整数。 输出结果是八进制整数 十六进制整数
2
3.9 计算某个表达式的值。 通用程序清单如下: stdio.h” #include ”stdio.h stdio.h void main() { ?????? x; 计算表达式值存入x x=( 表达式 );/* 计算表达式值存入x */ printf(”% printf( %?\n”,x); ,x); } ?????? 表达式对应的数据类型符(需事先判断) ? 表达式为整型,则为d 表达式为实型,则为f 3
第七章习题答疑(二)
折半查找法在排序数组中查找某个数。 上课时已有提示。 7.13 字符串连接(b[]中字符串连接到a[]中字符串后) 设:a[10]=”12 ,b[]=”abc 12”, abc” 12 abc (1)找到a串的’\0’的下标(i=2) ’ (2)j=0; 当型循环(b[j]!=’\0’) ’\ ’ a[i]=b[j],i++,j++ (3)a[i]=’\0’ \ 7.15 字符串复制(b[]中字符串复制到a[]中) 设:a[10]=”12”,b[]=”abc” (1)i=0; 当型循环(b[i]!=’\0’) a[i]=b[i],i++ (2)a[i]=’\0’ 7.9
18
第十章习题答疑(一)
输入3个整数,按照由小到大顺序输出。 int x,y,z,*px=&x,*py=&y,*pz=&x; 用以前的程序,其中的x、y、z换成*px、*py、*pz 10.3 输入10个整数存入一维数组a[10],将其中最小数与第1 个数交换,最大数与最后一个数交换。 要求编3个函数: 10 10 输入10个整数、交换、输出交换后的10个整数。 输入函数: void in(int *p,int n) 输出函数: void out(int *p,int n) 交换函数: void change(int *p,int n) 其中寻找最大最小数的方法: int *q,*max,*min; for (max=min=p,q=p+1;q<p+n;q++) { if(*max<*q) max=q; if(*min>*q) min=q; } 19 交换的方法:*p和*min,*(p+n-1)和*max 10.1
《C程序设计》谭浩强第三版知识概括 (1)
说明:以下的内容是对《C程序设计(第三版谭浩强著)》知识点的概括,主要是提取全书详细的知识点。
我所呈现给大家的内容绝大部分是图表的形式,结构清晰、层次分明。
一些上机操作易出错的细节也在具体内容中作了强调,其中包含了本人的一些上机实践经验。
对于要参加国家二级计算机C语言等级考试的学生特别有帮助。
对初学C语言的人可作为工具书来参考。
另外我对原书中3到6 章的知识点顺序稍作调整重组。
值得注意的是,《C程序设计(第三版谭浩强著)》书中对C编译系统并未指定,而以下内容完全是按照Visual C++6.0的编译系统来写的,所以涉及的具体的情况均是按Visual C++6.0的编译系统给出的。
这也正是特别适用参加国家二级计算机C语言等级考试学生的一个原因。
我写这个知识总结与大家分享,是想对学C的童鞋有些帮助,当然也是自己学习C的一个总结。
当然本人也是刚学习C一学期的新手,出现错误和纰漏在所难免,希望大家谅解。
也非常欢迎有兴趣的朋友致邮572009833@进行相关的讨论。
@竹林~幻影2012-08-25 于沈阳I目录第一章 C语言的特点 (1)第二章算法 (2)第三章数据类型 (4)第四章四种基本运算 (7)第五、六章程序的三种基本结构 (11)第七章数组 (19)第八章函数 (24)第九章预处理命令 (33)第十章指针 (35)第十一章结构体与共用体 (45)第十二章位运算 (53)第十三章文件 (57)附录 C 语言的运算符和结合性 (60)II一种语言之所以能存在和发展,并具有较强的生命力,总是有其独特之处。
C 语言的主要特点概括如下:(1)语言简洁、紧凑,使用方便、灵活。
(2)运算符丰富。
(3)数据类型丰富。
(4)具有结构化的控制语句。
用函数作为程序的模块单位,便于实现程序的模块化。
(5)语法限制不太严格,程序设计自由度大。
(6)C允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。
C语言程序设计(谭浩强版)第二章
不应是中断程序的执行,而应是返回一个
表示错误或错误性质的值,以便在更高的
抽象层次上进行处理。
算法设计的原则
4.高效率与低存储量需求
通常,效率指的是算法执行时间; 存储量指的是算法执行过程中所需 的最大存储空间, 两者都与问题的规模有关。
算法设计的原则
算法的时间复杂度
第二章 程序的灵魂——算法
2.1 算法的概念 2.2 算法的简单举例
2.3 算法的特性 2.4 怎样表示一个算法 2.5 结构化程序设计方法
算法的概念
计算机应用: 提取数学模型—设计算法— 编程—测试—应用
程序设计=数据结构+算法
数据结构:对数据的描述 算法:对操作的描述 除此之外程序设计还包括:程序设计方法, 和程序设计语言
怎样表示一个算法
例4的伪代码表示法如下 开始 读入整数n 置sum的初值为0 置k的初值为1 执行下面的操作: 如果k为奇数,置item=1/k 如果k为偶数,置item=-1/k sum=sum+item 直到k>n 打印sum的值 结束
算法设计的原则
算法设计的原则
设计算法时,通常应考虑达到以下目标: 1.正确性 2.可读性 3.健壮性 4.高效率与低存储量需求
从算法中选取一种对于所研究的问题 来说是 基本操作 的原操作,以该基 本操作 在算法中重复执行的次数 作 为算法运行时间的衡量准则。
结构化程序设计方法
采用结构化算法写成的计算机程序是结构 化程序。要编写出结构化程序,经常采用 的方法是结构化程序设计方法。这种方法 的基本思路是: 把给定的问题按层次(纵方向)、分阶段 (横方向)分解为一系列易于编程解决的 小问题,然后对应着这些分解的小问题, 设计结构化的算法,最后采用语言将算法 描述出来。这样一种程序设计方法就是结 构化程序设计方法。
第2章算法--C语言程序设计(谭浩强第三版)概要
本例中,变量i作为下标,用它来控制序号(第几个学生, 第几个成绩)。当 i超过50时,表示已对50个学生的成绩处理 完毕,算法结束。
描述对数据的 操作步骤
完整的程序设计应该是:
数据结构+算法+程序设计方法+语言工具
程序设计方法:结构化程序设计方法
3
语言工具:c语言
二、简单的程序设计一般包括: 1、确定数据结构 2、确定算法 3、编码 4、调试程序 5、整理并写出文档资料
4
2.1 算法的概念
1、算法定义:广义地说,为解决一个问题而采取的方法和步 骤,就称为“算法”。
34
模块设计的方法 是一种“分而治之”的思想,把一个大任务分为若干个子
任务,每一个子任务就相对简单了。 拿到一个程序模块以后,根据程序模块的功能将它划分为
若干个子模块,如果这些子模块的规模还嫌大,还再可以 划分为更小的模块。这个过程采用自顶向下方法来实现。
子模块一般不超过50行。 划分子模块时应注意模块的独立性,即:使一个模块完成 一项功能,耦合性愈少愈好。 结构化编码 将设计好的算法用计算机语言来实现,实现时使用的是与 三种基本结构对应的语句。
取得必要的信息。 (4)有一个或多个输出。算法的目的是为了求解,“解”就是输
出。 (5)有效性。算法中的每一个步骤都应当能有效地执行,并得到
确定的结果。
6
2.3 算法的表示
为了表示一个算法,可以用不同的方法。归纳为两大类: (1)文字 (2) 图形(符号)
常用的方法有: 自然语言 传统流程图 N-S流程图 伪代码 PAD图等。
C语言程序设计课后习题答案谭浩强
第1章程序设计和C语言1什么是计算机程序1什么是计算机语言1语言的发展及其特点3最简单的C语言程序5最简单的C语言程序举例6语言程序的结构10运行C程序的步骤与方法12程序设计的任务141-5 #include <>int main ( ){ printf ("**************************\n\n"); printf(" Very Good!\n\n");printf ("**************************\n"); return 0;}1-6#include <>int main(){int a,b,c,max;printf("please input a,b,c:\n");scanf("%d,%d,%d",&a,&b,&c);max=a;if (max<b)max=b;if (max<c)max=c;printf("The largest number is %d\n",max); return 0;}第2章算法——程序的灵魂16什么是算法16简单的算法举例17算法的特性21怎样表示一个算法22用自然语言表示算法22用流程图表示算法22三种基本结构和改进的流程图26用N S流程图表示算法28用伪代码表示算法31用计算机语言表示算法32结构化程序设计方法34习题36第章最简单的C程序设计——顺序程序设计37顺序程序设计举例37数据的表现形式及其运算39常量和变量39数据类型42整型数据44字符型数据47浮点型数据49怎样确定常量的类型51运算符和表达式52语句57语句的作用和分类57最基本的语句——赋值语句59数据的输入输出65输入输出举例65有关数据输入输出的概念67用printf函数输出数据68用scanf函数输入数据75字符数据的输入输出78习题823-1 #include <>#include <>int main(){float p,r,n;r=;n=10;p=pow(1+r,n);printf("p=%f\n",p);return 0;}3-2-1#include <>#include <>int main(){float r5,r3,r2,r1,r0,p,p1,p2,p3,p4,p5; p=1000;r5=;r3=;r2=;r1=;r0=;p1=p*((1+r5)*5); #include <> #include <>int main(){float d=300000,p=6000,r=,m;m=log10(p/(p-d*r))/log10(1+r);printf("m=%\n",m);return 0;}3-4#include <>int main(){int c1,c2;c1=197;c2=198;printf("c1=%c,c2=%c\n",c1,c2);printf("c1=%d,c2=%d\n",c1,c2);return 0;3-5#include <>int main(){int a,b;float x,y;char c1,c2;scanf("a=%d b=%d",&a,&b);scanf("%f %e",&x,&y);scanf("%c%c",&c1,&c2);printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%c\n",a,b,x,y,c1,c2); return 0;}3-6#include <>int main(){char c1='C',c2='h',c3='i',c4='n',c5='a';c1=c1+4;c2=c2+4;c3=c3+4;c4=c4+4;c5=c5+4;printf("passwor is %c%c%c%c%c\n",c1,c2,c3,c4,c5);return 0;}#include <>int main (){float h,r,l,s,sq,vq,vz;float pi=;printf("请输入圆半径r,圆柱高h∶");scanf("%f,%f",&r,&h); #include <> int main(){ int x,y;printf("输入x:");scanf("%d",&x);if(x<1) /* x<1 */{ y=x;printf("x=%3d, y=x=%d\n" ,x,y);}else if(x<10) /* 1=<x<10 */{ y=2*x-1;printf("x=%d, y=2*x-1=%d\n",x,y);}else /* x>=10 */{ y=3*x-11;printf("x=%d, y=3*x-11=%d\n",x,y);}return 0;}#include <>int main(){int x,y;printf("enter x:");scanf("%d",&x);y=-1;if(x!=0)if(x>0)y=1;elsey=0;printf("x=%d,y=%d\n",x,y); return 0;}4-7-2#include <>int main(){int x,y;printf("please enter x:"); scanf("%d",&x);y=0;if(x>=0)if(x>0) y=1;else y=-1;printf("x=%d,y=%d\n",x,y); return 0;}4-8#include <>int main(){ float score;char grade;printf("请输入学生成绩:"); scanf("%f",&score);while (score>100||score<0) {printf("\n 输入有误,请重输"); scanf("%f",&score);}switch((int)(score/10)){case 10:case 9: grade='A';break;case 8: grade='B';break;case 7: grade='C';break;case 6: grade='D';break;case 5:case 4:case 3:case 2:case 1:case 0: grade='E';}printf("成绩是 %,相应的等级是%c\n ",score,grade); return 0;}4-9#include <>#include <>int main(){int num,indiv,ten,hundred,thousand,ten_thousand,place;位,万位和位数printf("请输入一个整数(0-99999):");scanf("%d",&num);if (num>9999)place=5;else if (num>999)place=4;else if (num>99) .=%d\n",sn);return 0;}5-6#include <>int main(){double s=0,t=1;int n;for (n=1;n<=20;n++){t=t*n;s=s+t;}printf("1!+2!+...+20!=%\n",s);return 0;}5-7#include <>int main(){int n1=100,n2=50,n3=10;double k,s1=0,s2=0,s3=0;for (k=1;k<=n1;k++) /*计算1到100的和*/{s1=s1+k;}for (k=1;k<=n2;k++) /*计算1到50各数的平方和*/ {s2=s2+k*k;}for (k=1;k<=n3;k++) /*计算1到10的各倒数和*/ {s3=s3+1/k;}printf("sum=%\n",s1+s2+s3);return 0;}5-8#include <>int main(){int i,j,k,n;printf("parcissus numbers are ");for (n=100;n<1000;n++){i=n/100;j=n/10-i*10;k=n%10;if (n==i*i*i + j*j*j + k*k*k)printf("%d ",n);}printf("\n");return 0;}5-9-1#define M 1000 /*定义寻找范围*/ #include <>int main(){int k1,k2,k3,k4,k5,k6,k7,k8,k9,k10;int i,a,n,s;for (a=2;a<=M;a++) /* a是2-1000之间的整数,检查它是否完数 */{n=0; /* n用来累计a的因子的个数 */s=a; /* s用来存放尚未求出的因子之和,开始时等于a */ for (i=1;i<a;i++) /* 检查i是否a的因子 */if (a%i==0) /* 如果i是a的因子 */{n++; /* n加1,表示新找到一个因子 */s=s-i; /* s减去已找到的因子,s的新值是尚未求出的因子之和 */ switch(n) /* 将找到的因子赋给k1...k9,或k10 */{case 1:k1=i; break; /* 找出的笫1个因子赋给k1 */case 2:k2=i; break; /* 找出的笫2个因子赋给k2 */case 3:k3=i; break; /* 找出的笫3个因子赋给k3 */case 4:k4=i; break; /* 找出的笫4个因子赋给k4 */case 5:k5=i; break; /* 找出的笫5个因子赋给k5 */case 6:k6=i; break; /* 找出的笫6个因子赋给k6 */case 7:k7=i; break; /* 找出的笫7个因子赋给k7 */case 8:k8=i; break; /* 找出的笫8个因子赋给k8 */case 9:k9=i; break; /*找出的笫9个因子赋给k9 */case 10:k10=i; break; /* 找出的笫10个因子赋给k10 */}}if (s==0){printf("%d ,Its factors are ",a);if (n>1) printf("%d,%d",k1,k2); /* n>1表示a至少有2个因子 */if (n>2) printf(",%d",k3); /* n>2表示至少有3个因子,故应再输出一个因子 */if (n>3) printf(",%d",k4); /* n>3表示至少有4个因子,故应再输出一个因子 */if (n>4) printf(",%d",k5); /* 以下类似 */if (n>5) printf(",%d",k6);if (n>6) printf(",%d",k7);if (n>7) printf(",%d",k8);if (n>8) printf(",%d",k9);if (n>9) printf(",%d",k10);printf("\n");}}return 0;}5-9-2#include <>int main(){int m,s,i;for (m=2;m<1000;m++){s=0;for (i=1;i<m;i++)if ((m%i)==0) s=s+i;if(s==m){printf("%d,its factors are ",m); for (i=1;i<m;i++)if (m%i==0) printf("%d ",i); printf("\n");}}return 0;}5-10#include <>int main(){int i,n=20;double a=2,b=1,s=0,t;for (i=1;i<=n;i++){s=s+a/b;t=a,a=a+b,b=t;}printf("sum=%\n",s);return 0;}5-11#include <>int main(){double sn=100,hn=sn/2;int n;for (n=2;n<=10;n++){sn=sn+2*hn; /*第n次落地时共经过的米数*/ hn=hn/2; /*第n次反跳高度*/}printf("第10次落地时共经过%f米\n",sn); printf("第10次反弹%f米\n",hn);return 0;}5-12#include <>int main(){int day,x1,x2;day=9;x2=1;while(day>0){x1=(x2+1)*2; /*第1天的桃子数是第2天桃子数加1后的2倍.*/ x2=x1;day--;}printf("total=%d\n",x1);return 0;}5-13#include <>#include <>int main(){float a,x0,x1;printf("enter a positive number:");scanf("%f",&a);x0=a/2;x1=(x0+a/x0)/2;do{x0=x1;x1=(x0+a/x0)/2;}while(fabs(x0-x1)>=1e-5);printf("The square root of % is %\n",a,x1); return 0;}5-14#include <>#include <>int main(){double x1,x0,f,f1;x1=;do{x0=x1;f=((2*x0-4)*x0+3)*x0-6;f1=(6*x0-8)*x0+3;x1=x0-f/f1;}while(fabs(x1-x0)>=1e-5);printf("The root of equation is %\n",x1); return 0;}5-15#include <>#include <>int main(){float x0,x1,x2,fx0,fx1,fx2;do{printf("enter x1 & x2:"); scanf("%f,%f",&x1,&x2);fx1=x1*((2*x1-4)*x1+3)-6; fx2=x2*((2*x2-4)*x2+3)-6; }while(fx1*fx2>0);do{x0=(x1+x2)/2;fx0=x0*((2*x0-4)*x0+3)-6; if ((fx0*fx1)<0){x2=x0;fx2=fx0;}else{x1=x0;fx1=fx0;}}while(fabs (fx0)>=1e-5); printf("x=%\n",x0);return 0;}5-16#include <>int main(){int i,j,k;for (i=0;i<=3;i++){for (j=0;j<=2-i;j++)printf(" ");for (k=0;k<=2*i;k++)printf("*");printf("\n");}for (i=0;i<=2;i++){for (j=0;j<=i;j++)printf(" ");for (k=0;k<=4-2*i;k++)printf("*");printf("\n");}return 0;}5-17#include <>int main(){char i,j,k; /*是a的对手;j是b的对手;k是c的对手*/ for (i='x';i<='z';i++)for (j='x';j<='z';j++)if (i!=j)for (k='x';k<='z';k++)if (i!=k && j!=k)if (i!='x' && k!='x' && k!='z')printf("A--%c\nB--%c\nC--%c\n",i,j,k); return 0;}第6章利用数组处理批量数据142怎样定义和引用一维数组142怎样定义一维数组143怎样引用一维数组元素144一维数组的初始化145一维数组程序举例146怎样定义和引用二维数组148怎样定义二维数组149怎样引用二维数组的元素150二维数组的初始化151二维数组程序举例152字符数组154怎样定义字符数组154字符数组的初始化155怎样引用字符数组中的元素155字符串和字符串结束标志156字符数组的输入输出159使用字符串处理函数161字符数组应用举例165习题1686-1#include <>#include <>int main(){int i,j,n,a[101];for (i=1;i<=100;i++)a[i]=i;a[1]=0;for (i=2;i<sqrt(100);i++) for (j=i+1;j<=100;j++) {if(a[i]!=0 && a[j]!=0) if (a[j]%a[i]==0)a[j]=0;}printf("\n");for (i=2,n=0;i<=100;i++) { if(a[i]!=0){printf("%5d",a[i]);n++;}if(n==10){printf("\n");n=0;}}printf("\n");return 0;}6-2#include <>int main(){int i,j,min,temp,a[11];printf("enter data:\n");for (i=1;i<=10;i++){printf("a[%d]=",i);scanf("%d",&a[i]);}printf("\n");printf("The orginal numbers:\n"); for (i=1;i<=10;i++)printf("%5d",a[i]);printf("\n");for (i=1;i<=9;i++){min=i;for (j=i+1;j<=10;j++)if (a[min]>a[j]) min=j;temp=a[i];a[i]=a[min];a[min]=temp;}printf("\nThe sorted numbers:\n");for (i=1;i<=10;i++)printf("%5d",a[i]);printf("\n");return 0;}6-3#include <>int main(){int a[3][3],sum=0;int i,j;printf("enter data:\n");for (i=0;i<3;i++)for (j=0;j<3;j++)scanf("%3d",&a[i][j]);for (i=0;i<3;i++)sum=sum+a[i][i];printf("sum=%6d\n",sum);return 0;}6-4#include <>int main(){ int a[11]={1,4,6,9,13,16,19,28,40,100}; int temp1,temp2,number,end,i,j;for (i=0;i<10;i++)printf("%5d",a[i]);printf("\n");printf("insert data:"); scanf("%d",&number);end=a[9];if (number>end)a[10]=number;else{for (i=0;i<10;i++){if (a[i]>number){temp1=a[i];a[i]=number;for (j=i+1;j<11;j++) {temp2=a[j];a[j]=temp1;temp1=temp2;}break;}}}printf("Now array a:\n"); for (i=0;i<11;i++)printf("\n");return 0;}6-5#include <>#define N 5int main(){ int a[N],i,temp;printf("enter array a:\n");for (i=0;i<N;i++)scanf("%d",&a[i]);printf("array a:\n");for (i=0;i<N;i++)printf("%4d",a[i]);for (i=0;i<N/2;i++) n",number);; printf("continu or not(Y/N)");scanf(" %c",&c);if (c=='N'||c=='n')flag=0;}return 0;}6-10#include <>int main(){int i,j,upp,low,dig,spa,oth;char text[3][80];upp=low=dig=spa=oth=0;for (i=0;i<3;i++){ printf("please input line %d:\n",i+1);gets(text[i]);for (j=0;j<80 && text[i][j]!='\0';j++){if (text[i][j]>='A'&& text[i][j]<='Z')upp++;else if (text[i][j]>='a' && text[i][j]<='z') low++; else if (text[i][j]>='0' && text[i][j]<='9') dig++; else if (text[i][j]==' ')spa++;elseoth++;}}printf("\nupper case: %d\n",upp);printf("lower case: %d\n",low);printf("digit : %d\n",dig);printf("space : %d\n",spa);printf("other : %d\n",oth);return 0;}#include <>int main(){ char a[5]={'*','*','*','*','*'}; int i,j,k;char space=' ';for (i=0;i<5;i++){ printf("\n");printf(" ");for (j=1;j<=i;j++)printf("%c",space);for (k=0;k<5;k++)printf("%c",a[k]);}printf("\n");return 0;}6-12a-c#include <>int main(){ int j,n;char ch[80],tran[80];printf("input cipher code:");gets(ch);printf("\ncipher code :%s",ch);while (ch[j]!='\0'){ if ((ch[j]>='A') && (ch[j]<='Z')) tran[j]=155-ch[j];else if ((ch[j]>='a') && (ch[j]<='z')) tran[j]=219-ch[j];elsetran[j]=ch[j];j++;}n=j;printf("\noriginal text:");for (j=0;j<n;j++)putchar(tran[j]);printf("\n");return 0;}6-12b#include <>int main(){int j,n;char ch[80];printf("input cipher code:\n");gets(ch);printf("\ncipher code:%s\n",ch);while (ch[j]!='\0'){ if ((ch[j]>='A') && (ch[j]<='Z'))ch[j]=155-ch[j];else if ((ch[j]>='a') && (ch[j]<='z')) ch[j]=219-ch[j];elsech[j]=ch[j];j++;}n=j;printf("original text:");for (j=0;j<n;j++)putchar(ch[j]);printf("\n");return 0;}6-13#include <>int main(){ char s1[80],s2[40];int i=0,j=0;printf("input string1:");scanf("%s",s1);printf("input string2:");scanf("%s",s2);while (s1[i]!='\0')i++;while(s2[j]!='\0')s1[i++]=s2[j++];s1[i]='\0';printf("\nThe new string is:%s\n",s1); return 0;}6-14#include <>int main(){ int i,resu;char s1[100],s2[100];printf("input string1:");gets(s1);printf("\ninput string2:");gets(s2);i=0;while ((s1[i]==s2[i]) && (s1[i]!='\0'))i++; if (s1[i]=='\0' && s2[i]=='\0')resu=0;elseresu=s1[i]-s2[i];printf("\nresult:%d.\n",resu);return 0;}6-15#include <>#include <>int main(){ char s1[80],s2[80];int i;printf("input s2:");scanf("%s",s2);for (i=0;i<=strlen(s2);i++)s1[i]=s2[i];printf("s1:%s\n",s1);return 0;}第7章用函数实现模块化程序设计170为什么要用函数170怎样定义函数172为什么要定义函数172定义函数的方法173调用函数174函数调用的形式174函数调用时的数据传递175函数调用的过程177函数的返回值178对被调用函数的声明和函数原型179函数的嵌套调用182函数的递归调用184数组作为函数参数192数组元素作函数实参193数组名作函数参数194多维数组名作函数参数197局部变量和全局变量199局部变量199全局变量200变量的存储方式和生存期204动态存储方式与静态存储方式204局部变量的存储类别205全局变量的存储类别208存储类别小结212关于变量的声明和定义214内部函数和外部函数215内部函数215外部函数215习题2187-1-1#include <>int main(){int hcf(int,int);int lcd(int,int,int);int u,v,h,l;scanf("%d,%d",&u,&v);h=hcf(u,v);printf("",h);l=lcd(u,v,h);printf("",l);return 0;}int hcf(int u,int v){int t,r;if (v>u){t=u;u=v;v=t;}while ((r=u%v)!=0){u=v;v=r;}return(v);}int lcd(int u,int v,int h) {return(u*v/h);}7-1-2#include <>int Hcf,Lcd;int main(){void hcf(int,int); void lcd(int,int);int u,v;scanf("%d,%d",&u,&v); hcf(u,v);lcd(u,v);printf("",Hcf);printf("",Lcd); return 0;}void hcf(int u,int v) {int t,r;if (v>u){t=u;u=v;v=t;}while ((r=u%v)!=0) {u=v;v=r;}Hcf=v;}void lcd(int u,int v) {Lcd=u*v/Hcf;}7-2#include <>#include <>float x1,x2,disc,p,q;int main(){void greater_than_zero(float,float);void equal_to_zero(float,float);void smaller_than_zero(float,float);float a,b,c;printf("input a,b,c:");scanf("%f,%f,%f",&a,&b,&c);printf("equation: %*x*x+%*x+%=0\n",a,b,c); disc=b*b-4*a*c; printf("root:\n");if (disc>0){greater_than_zero(a,b);printf("x1=%f\t\tx2=%f\n",x1,x2);}else if (disc==0){equal_to_zero(a,b);printf("x1=%f\t\tx2=%f\n",x1,x2);}else{smaller_than_zero(a,b);printf("x1=%f+%fi\tx2=%f-%fi\n",p,q,p,q);}return 0;}void greater_than_zero(float a,float b) {x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);}void equal_to_zero(float a,float b){x1=x2=(-b)/(2*a);}void smaller_than_zero(float a,float b) {p=-b/(2*a);q=sqrt(-disc)/(2*a);}7-3#include <>int main(){int prime(int);int n;printf("input an integer:");scanf("%d",&n);if (prime(n))printf("%d is a prime.\n",n);elseprintf("%d is not a prime.\n",n); return 0;}int prime(int n){int flag=1,i;for (i=2;i<n/2 && flag==1;i++)if (n%i==0)flag=0;return(flag);}7-4#include <>#define N 3int array[N][N];int main(){ void convert(int array[][3]); int i,j;printf("input array:\n");for (i=0;i<N;i++)for (j=0;j<N;j++)scanf("%d",&array[i][j]);printf("\noriginal array :\n"); for (i=0;i<N;i++){for (j=0;j<N;j++)printf("%5d",array[i][j]);printf("\n");}convert(array);printf("convert array:\n"); for (i=0;i<N;i++){for (j=0;j<N;j++)printf("%5d",array[i][j]); printf("\n");}return 0;}void convert(int array[][3]) {int i,j,t;for (i=0;i<N;i++)for (j=i+1;j<N;j++){t=array[i][j];array[i][j]=array[j][i]; array[j][i]=t;}}#include <>#include <>int main(){void inverse(char str[]); char str[100];printf("input string:");scanf("%s",str);inverse(str);printf("inverse string:%s\n",str);return 0;}void inverse(char str[]){char t;int i,j;for (i=0,j=strlen(str);i<(strlen(str)/2);i++,j--){t=str[i];str[i]=str[j-1];str[j-1]=t;}}7-6#include <>int main(){void concatenate(char string1[],char string2[],char string[]); char s1[100],s2[100],s[100];printf("input string1:");scanf("%s",s1);printf("input string2:");scanf("%s",s2);concatenate(s1,s2,s);printf("\nThe new string is %s\n",s);return 0;}void concatenate(char string1[],char string2[],char string[]) {int i,j; for (i=0;string1[i]!='\0';i++)string[i]=string1[i];for(j=0;string2[j]!='\0';j++)string[i+j]=string2[j];string[i+j]='\0';}7-7#include <>int main(){void cpy(char [],char []);char str[80],c[80];printf("input string:");gets(str);cpy(str,c);printf("The vowel letters are:%s\n",c);return 0;}void cpy(char s[],char c[]){ int i,j;for (i=0,j=0;s[i]!='\0';i++)if (s[i]=='a'||s[i]=='A'||s[i]=='e'||s[i]=='E'||s[i]=='i'||s[i]=='I'||s[i]=='o'||s[i]=='O'||s[i]=='u'||s[i]=='U') {c[j]=s[i];j++;}c[j]='\0';}7-8#include <>#include <>int main(){char str[80];void insert(char []);printf("input four digits:");scanf("%s",str);insert(str);return 0;本文档下载自360文档中心,更多营销,职业规划,工作简历,入党,工作报告,总结,学习资料,学习总结,PPT模板下载,范文等文档下载;转载请保留出处。
c程序设计(第三版)第2章_算法
C程序设计(第三版) 程序设计(第三版) 程序设计 8
C程序设计(第三版) 程序设计(第三版) 程序设计
4
2.1 算法的概念
广义地说,为解决一个问题而采取的方 法和步骤,就称为"算法". 对同一个问题,可有不同的解题方源自和步骤100例: 求
∑
n
方法1:1+2,+3,+4,一直加到100 加99次 方法2:100+(1+99)+(2+98)+…+(49 +51)+50 = 100 + 49×100 +50 加51次
C程序设计(第三版) 程序设计(第三版) 程序设计 18
2.4 算法的表示
可以用不同的方法表示算法,常用的有: –自然语言 –传统流程图 –结构化流程图 –伪代码 –PAD图
C程序设计(第三版) 程序设计(第三版) 程序设计
C程序设计(第三版) 程序设计(第三版) 程序设计 6
2.2 简单算法举例
例2.1: 求1×2×3×4×5 × × × ×
步骤1:先求1×2,得到结果2 步骤2:将步骤1得到的乘积2再乘以3,得到结果6 步骤3:将6再乘以4,得24 步骤4:将24再乘以5,得120
第二章
本章要点
算法的概念 算法的表示 结构化程序设计方法
主要内容
2.1 算法的概念 2.2 简单算法举例 2.3 算法的特性 2.4 怎样表示一个算法 2.5 化程序设计方法
C语言程序设计 第三版 部分习题 (谭浩强 著) 清华大学出版社 课后答案
【习题1】一、简答题(在课本中寻找答案,略)1.1 C程序的基本结构包括哪些内容?1.2 如何定义标识符?1.3 输入格式、输出格式的组成包括哪些内容?1.4 C语言函数分为哪两类?1.5 计算表达式的值应该考虑哪些方面?1.6 上机调试程序的步骤如何?二、判断并改错1.7 C程序执行的入口是main()函数,所以main函数必须放在程序的开头。
错误:main函数可以放在程序的任何位置。
并不限定在程序的开头。
1.8 定义一个函数包括数据说明部分和执行语句部分,两者可以交叉出现。
错误:不可以交叉出现,数据说明部分在执行语句部分的前面。
1.9 编辑与编译不是一回事。
错误:不是一回事。
编辑完成源程序的输入和修改;编译是对源程序进行语法检查,如果无语法错误,则生成目标程序。
1.10 scanf("%d,%d",&x,&y);的正确输入格式:3,4<回车>。
正确1.11 注释内容太多会影响程序的执行效率。
错误:不会影响程序的执行效率。
因为在编译时,编译系统将注释内容删除或用空格代替,所以注释内容不会编译到目标程序中。
1.12 所有的数学公式可以直接出现在源程序中。
错误:数学公式需要转换成C语言能够接受的公式才能出现在源程序中。
三、编程题1.13 在屏幕上输出自己名字的拼音。
提示:中文名字叫“张三”,对应的拼音为“Zhang San”,输出用printf()函数。
1.14 输入圆的半径,求圆的周长,并将结果保留两位小数输出到屏幕上。
提示:定义圆的半径r,圆的周长:2*3.14*r,输出结果保留2位小数可以用%.2f1.15 输入两个整数,输出其中最大者。
提示:模仿例1.31.16 输入三个整数,输出其中最小者。
提示: min(min(a,b),c);【习题2】一、简答题(在课本中寻找答案,略)2.1 常量与变量的区别?2.2 C语言中的标识符的定义规则?2.3 变量为什么要“先定义,后使用”?2.4 字符常量'a'与字符串常量"a"有何区别?2.5 大小写字母转换的规则是什么?2.6 变量的具有哪三种属性?二、单项选择题2.7 C语言中,int型数据在内存中的存储形式是(D)。
C语言程序设计第三版谭浩强课后习题答案完整版
C语言程序设计第三版谭浩强课后习题答案完整版第一章1.5请参照本章例题,编写一个C程序,输出以下信息:**************************Very Good!**************************解:mian(){printf(“**************************”);printf(“\n”);printf(“Very Good!\n”);printf(“\n”);printf(“**************************”);}1.6 编写一个程序,输入a、b、c三个值,输出其中最大值。
解:mian(){int a,b,c,max;printf(“请输入三个数a,b,c:\n”);scanf(“%d,%d,%d”,&a,&b,&c);max=a;if(max<b)max=b;if(max<c)max=c;printf(“最大数为:“%d”,max);}第三章3.6写出以下程序运行的结果。
main(){char c1=’a’,c2=’b’,c3=’c’,c4=’\101’,c5=’\116’;printf(“a%cb%c\tc%c\tabc\n”,c1,c2,c3);printf(“\t\b%c %c”,c4,c5);}解:aaㄩbbㄩㄩㄩccㄩㄩㄩㄩㄩㄩabcAㄩN3.7要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.例如,字母"A"后面第4个字母是"E"."E"代替"A"。
因此,"China"应译为"Glmre"。
请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。
谭浩强c语言程序设计第三版课后习题答案
谭浩强c语言程序设计第三版课后习题答案【篇一:谭浩强--c语言程序设计(第二版)习题答案】ss=txt>第一章1.请参照本章例题,编写一个c程序,输出以下信息:**************************very good!**************************解:#includestdio.hvoid main(){printf(**************************);printf(\n);printf(very good!\n);printf(\n);printf(**************************);}2.编写一个c程序,输入a、b、c三个值,输出其中最大值。
解: #includestdio.hvoid main(){int a,b,c,max;printf(请输入三个数a,b,c:\n);scanf(%d,%d,%d,a,b,c);max=a;if(maxb) max=b;if(maxc) max=c;printf(最大数为: %d,max);}第二章1.假如我国国民生产总值的年增长率为10%,计算10年后我国国民生产总值与现在相比增长多少百分比。
计算公式为p=(1+r)^n,r为年增长率;n为年数;p为与现在相比的百分比。
解:#includestdio.h#includemath.hvoid main(){double p, r=0.1, n=10;p=pow((1+r), n);printf(%lf\n, p);}3.请编程序将china译成密码,译码规律是用原来字母后面的第4个字母代替原来的字母。
例如,字母a后面第4个字母是e, e代替a。
因此,china应译为glmre。
请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为c、h、i、n、a,经过运算,使c1、c2、c3、c4、c5分别变为g、l、m、r、e,并输出。
