C语言复习PPTC习题.ppt_第1页
C语言复习PPTC习题.ppt_第2页
C语言复习PPTC习题.ppt_第3页
C语言复习PPTC习题.ppt_第4页
C语言复习PPTC习题.ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、1,若干个数中找最大最小 一个n位数逐位分解 设计菜单程序 数组各元素分类统计 两个数组对应元素比较大小 插入、逆序存放、排序 查找 二维数组操作,常规解题算法,2,一、若干个数中找最大最小 定义一个变量存放最大值,一个变量存放最小值,循环比较,找出最大最小值。,用简单变量处理 输入第一个数maxmin 循环i=2n 输入一个数a if(amax)max=a; if(amin)min=a; 输出max、min,用数组处理 定义数组a10 输入数组a的各个元素 max=min=a0 循环i=19 if(aimax)max=ai; if(aimin)min=ai; 输出max、min,3,例1:用

2、数组求某班某门课平均成绩、最高、最低。 #define N 10 main( ) int aN, i, max, min; float sum=0; for(i=0; iN; i+) scanf(%d, ,4,max=min=a0; for(i=1; imax) max=ai; if(aimin) min=ai; printf(average=%8.2fn, sum/N); printf(max=%d,min=%dn, max, min); ,5,二、一个n位数k逐位分解 用循环完成分离工作,每次k%10就得到k的最低位的值,k/10就去掉k的最低位,如此循环,直到k=0为止。,6,用变量 m

3、ain( ) long n, d; printf(“Enter a data:”); scanf(“%ld”, ,例2:输入一个最多8位的正整数,将各数按位颠倒输出。,用数组 main( ) long n, d8;int i,k=0; printf(“Enter a data:”); scanf(“%ld”, ,7,三、设计菜单程序 步骤如下: 1 显示菜单项目 2 等待用户输入选择信息 3 判断选择信息,进行分支处理 由于这类问题属于“根据一个变量的不同值进行多路分支”的问题,所以用switch语句比较合适。,8,例3:设计一个简单的菜单选择程序,根据选择可实现a与b的四则运算。 #incl

4、ude “stdio.h” main( ) int a, b; char c1; printf(”1. Addn”); printf(”2. Subtractn”); printf(”3. Multiplyn”); printf(”4. Dividen”); printf(”Enter your choice:”); c1=getchar( );,9,c1=getchar( ); if (c1=1 ,10,四、数组各元素分类统计 字符数组:统计字母、数字字符的个数;A、E、I、O、U、 等出现的次数。 数值数组:统计大于某个数、能被某个数整除、正负数个。 定义数组(如 char str80;i

5、nt numN;) 输入各元素的值 字符数组: 数值数组: 循环 stri!=0 循环 i=0 N-1 stri分类计数 numi符合计数条件? 符合则计数,11,例4:输入一行英文文本(最长80),分别统计文本中字母、数字、空格字符个数及所有字符个数。 #include stdio.h main( ) int i, l, n, s, all; char str80, t; l=n=s=all=0; gets(str); for(i=0; (t=stri)!=0; i+) if(t=A ,12,五、两个数组对应元素比较大小 定义两个数组s1、s2,构造循环,对s1i、s2i进行比较。 两个字符

6、串比较: for(i=0;s1i=s2i;i+) if(s1i=0)break;),13,例5:按标准函数比较规则,自编程实现两字串比较。 #include stdio.h main() static char s110, s210; int i, r; clrscr( ); printf(tInput string 1:); gets(s1); printf(tInput string 2:); gets(s2); for(i=0; s1i=s2i; i+) /*下标变量比较*/ if(s1i=0) break; r=s1i-s2i; printf(ts1=%s,s2=%s,r=%dn, s

7、1, s2, r); getch( ); ,14,六、插入、逆序存放、排序 插入 有序数组中插入一个数,保持数组有序 设数组为a,已有数据。 1 输入要插入的数,存入num; 2 将num与数组元素逐个比较(从a0开始,循环比较),找到插入位置; 3 将插入点后面的各元素逐个后移。,15,例6.1 已有一个排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。习题7.4 插入n: 13 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9,方法1: 1)首先确定插入位置,可从头或尾顺序判断查找; 2)将插入点后的各元素依次后移一个位置;,从头:nai? i: 0,1,2,aj+

8、1=aj; j: 8,7,6i,32,24,17,15,45,13,16,main( ) int a10=7,9,10,12,15,17,24,32,45, i, j,num; printf(Insert number:); scanf(%d, ,17,从尾:nai? i: 8,7,6 假:ai+1=ai;,32,24,17,15,45,13,方法2: 插入n: 13 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9,18,main( ) int a10=7,9,10,12,15,17,24,32,45,i,num; printf(Insert number:); scanf(%d,

9、 ,19,逆序存放 逆序存放就是将第一个元素与最后一个交换,第二个与倒数第二个交换,可设置两个变量i,j,分别记要交换的两个元素的下标,注意i从小增大,j从大减小,直到i=j,停止交换。,20,例6.2 将一个数组中的值按逆序重新存放。习题7.5 main() int a10,i,j,t; for(i=0;i10;i+) scanf(%d,21,排序 排序方法有多种,主要掌握选择法和起泡法。 选择法算法: (设要求从大到小排序) 若有定义:int aN; (N是符号常量) 1)对N个数排序,将数组元素重复N-1轮比较; 2)第一轮首先从数组中找出最大元素,将其与第一个元素交换;第二轮从剩余元素

10、中找出数组次大元素,将其与第二个元素交换;不断重复,直至第N-1轮对最后两个元素比较。,22,起泡法算法: (设要求从大到小排序) 若有定义:int aN; (N是符号常量) 1)对N个数排序,也是将数组元素重复N-1轮比较; 2)每一轮都从a0开始,将相邻两个数比较,大的调到前面, 在第i趟比较中要进行n-i次两两比较(i-1个数已排好序)。第i轮到aN-2-i与aN-1-i比完时结束。此时,aN-1-i中是本轮中最小数。 3)重复上述过程,最后一轮是将a0与a1比较,大的调到a0,a0为最大数。到此,排序过程结束。,23,采用二重循环完成,外循环控制轮次,内循环控制每轮比较次数。 选择法:

11、 for(i=0;iap) p=j; if(p!=i) t=ai; ai=ap; ap=t; 起泡法: for(i=0;iN-1;i+) /* 控制N-1轮比较*/ for(j=0;jN-i;j+) /* 控制每轮次数 */ if(ajaj+1) t=aj; aj=aj+1; aj+1=t; ,24,七、查找 顺序查找: 设要找的数存在num中,采用循环将num与数组元素逐个比较(从头到尾或从尾到头),相等则找到。 折半查找: 每次取区间中点与num比较,相等则找到,否则舍去一半区间,再取剩余区间的中点与num比较如此反复,直到区间起点下标大于终点下标。,25,例7. 有10个数存放在一个数组

12、中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印出“无此数”。习题7.9 步骤: 1)设三个变量l, m, h, 其中l,h存放查找范围第一和最后元素的下标,m存放查找范围中间元素下标 即m=(h+l)/2; 2)判断要查找的数num与am是否相等,相等已找到; 3)若numam, 则查找范围可缩小到后一半;查找前更新l=m+1, 计算新m; 再重复第二步; 4)若numam, 则查找范围可缩小到前一半;查找前更新h=m-1, 计算新m; 再重复第二步;,26,0,图示:若查找50 n a0 a1 a2 a3 a4 a5 a6 a7 a8 a9,9,(

13、h+l)/2=4m:,nam 为真: m+1=5l:,l:,h:,5,9,h:,4,(h+l)/2=7m:,7,nam 为真: m+1=8l:,8,(h+l)/2=8m:,9,h,8,n=am 为真:找到,27,main( ) int a10=2,3,5,6,12,15,23,46,50,100, num; int l=0, m, h=9, mark=-1; /*make找到标志*/ printf(Enter check number:); scanf(%d, ,28,八、二维数组操作(以求和操作为例) 1. 二维数组各元素有行、列下标,循环时要注意取元素的顺序 设数组aMN M、N为符号常量

14、,各列求和: 和存放在最后一行 列下标变化一次, 行下标变化M-1次 for(j=0;iN;i+) aM-1j=0; for(i=0;iM-1;i+) aM-1j+=aij; ,各行求和: 和存放在最后一列 行下标变化一次, 列下标变化N-1次 for(i=0;iM;i+) aiN-1=0; for(j=0;jN-1;j+) aiN-1+=aij; ,29,例9:对三人小组四门课程按人求平均成绩,再按课程求平均成绩。 main( ) int a45, i,j; for(i=0; i=2; i+) /*按行输入成绩*/ for(j=0; j=3; j+) scanf(%d, ,30,for(j=0; j=3; j+) /*求课程平均分*/ a3j=0; /*最后一行清零*/ for(i=0; i=2; i+) a3j=a3j+aij; a3j=a3j/3; for(i=0; i=2; i+) /*按行输出*/ printf(%d:, i+1); /*输出序号*/ for(j=0; j=4; j+) printf(%6d

温馨提示

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

评论

0/150

提交评论