- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10
例4:输入一行英文文本(最长80),分别统计文本 中字母、数字、空格字符个数及所有字符个数。
#include "stdio.h" main( ) { int i, l, n, s, all; char str[80], t; l=n=s=all=0; gets(str); for(i=0; (t=str[i])!='\0'; i++) { if(t>='A'&&t<='Z'||t>='a'&&t<='z') l++; else if(t>='0'&&t<='9') n++; else if(t==' ') s++; all++; } printf("l=%d,n=%d,s=%d,all=%d\n",l,n,s,all); }
21
起泡法算法: (设要求从大到小排序) 若有定义:int a[N]; (N是符号常量) 1)对N个数排序,也是将数组元素重复N-1轮比较; 2)每一轮都从a[0]开始,将相邻两个数比较,大的 调到前面, 在第i趟比较中要进行n-i次两两比较 (i-1个数已排好序)。第i轮到a[N-2-i]与a[N-1-i] 比完时结束。此时,a[N-1-i]中是本轮中最小数。 3)重复上述过程,最后一轮是将a[0]与a[1]比较,大 的调到a[0],a[0]为最大数。到此,排序过程结束。
20
排序 排序方法有多种,主要掌握选择法和起泡法。
选择法算法: (设要求从大到小排序)
若有定义:int a[N]; (N是符号常量) 1)对N个数排序,将数组元素重复N-1轮比较; 2)第一轮首先从数组中找出最大元素,将其与第 一个元素交换;第二轮从剩余元素中找出数组次 大元素,将其与第二个元素交换;……不断重复, 直至第N-1轮对最后两个元素比较。
15
main( ) {int a[10]={7,9,10,12,15,17,24,32,45}, i, j,num; printf("Insert number:"); scanf("%d",&num); for(i=0;i<=8;i++) /*判断插入位置*/ if(num>a[i]); else break; /*退出时i即为插入位置*/ for(j=8;j>=i;j--) a[j+1]=a[j]; /*从后面依次后移*/ a[i]=num; /*插入*/ for(i=0;i<10;i++) printf("%6d", a[i]); printf("\n"); }
22
采用二重循环完成,外循环控制轮次,内循环控 制每轮比较次数。 选择法: for(i=0;i<N-1;i++) /* 控制N-1轮比较*/ {p=i; for(j=i+1;j<N;j++) /* 控制每轮次数 */ if(a[j]>a[p]) p=j; if(p!=i) { t=a[i]; a[i]=a[p]; a[p]=t; } } 起泡法: for(i=0;i<N-1;i++) /* 控制N-1轮比较*/ for(j=0;j<N-i;j++) /* 控制每轮次数 */ if(a[j]<a[j+1]) 23 {t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
三、设计菜单程序
步骤如下: 1 显示菜单项目 2 等待用户输入选择信息 3 判断选择信息,进行分支处理 由于这类问题属于“根据一个变量的不同值进行 多路分支”的问题,所以用switch语句比较合适。
7
例3:设计一个简单的菜单选择程序,根据选 择可实现a与b的四则运算。 #include “stdio.h” main( ) { int a, b; char c1; printf(”1. Add\n”); printf(”2. Subtract\n”); printf(”3. Multiply\n”); printf(”4. Divide\n”); printf(”Enter your choice:”); c1=getchar( );
}
9
四、数组各元素分类统计
字符数组:统计字母、数字字符的个数;A、E、I、O、U、
等出现的次数。
数值数组:统计大于某个数、能被某个数整除、正负数个。
定义数组(如 char str[80];int num[N];) 输入各元素的值 字符数组: 数值数组: 循环 str[i]!=‘\0’ 循环 i=0 ~N-1 str[i]分类计数 num[i]符合计数条件? 符合则计数
}
4
二、一个n位数k逐位分解
用循环完成分离工作,每次k%10就得到k的 最低位的值,k/10就去掉k的最低位,如此循 环,直到k=0为止。
5
例2:输入一个最多8位的正整数,将各数按位颠倒 输出。 用数组
用变量
main( ) {long n, d[8];int i,k=0; main( ) printf(“Enter a data:”); {long n, d; scanf(“%ld”, &n); printf(“Enter a data:”); while(n!=0) scanf(“%ld”, &n); { d[k++]=n%10; while(n!=0) n=n/10; } { d=n%10; printf(“%d”, d); for(i=0;i<k;i++) n=n/10; } printf(“%d”, d[i]); } } 6
13
六、插入、逆序存放、排序
插入
有序数组中插入一个数,保持数组有序
设数组为a,已有数据。
1 输入要插入的数,存入num;
2 将num与数组元素逐个比较(从a[0]开始,循 环比较),找到插入位置; 3 将插入点后面的各元素逐个后移。
14
例6.1 已有一个排好序的数组,今输入一个数,要求 按原来排序的规律将它插入数组中。习题7.4
插入n: 13
7 9 10 12 15 17 24 24 13 15 17 32 32 45 45
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
从头:n>a[i]? i: 0,1,2… a[j+1]=a[j]; j: 8,7,6…i
方法1: 1)首先确定插入位置,可从头或尾顺序判断查找; 2)将插入点后的各元素依次后移一个位置;
18
逆序存放 逆序存放就是将第一个元素与最后一个交换, 第二个与倒数第二个交换…,可设置两个变量i,j, 分别记要交换的两个元素的下标,注意i从小增 大,j从大减小,直到i>=j,停止交换。
19
例6.2 将一个数组中的值按逆序重新存放。习题7.5 main() {int a[10],i,j,t; for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0,j=9;i<j;i++,j--) / *a数组反序存放 */ {t=a[i];a[i]=a[j];a[j]=t;} for(i=0;i<10;i++) printf("%d ",a[i]); } for(i=0;i<5;i++) {t=a[i];a[i]=a[9-i];a[9-i]=t;}
输入第一个数maxmin 循环i=2~n 输入一个数a if(a>max)max=a; if(a<min)min=a; 输出max、min
定义数组a[10] 输入数组a的各个元素 max=min=a[0] 循环i=1~9 if(a[i]>max)max=a[i]; if(a[i]<min)min=a[i]; 输出max、min
8
c1=getchar( ); if (c1>=‟1‟ && c1<=‟4‟ ) { printf(”Enter a,b:”); scanf(“%d,%d”, &a,&b); switch(c1) { case ‟1‟ : printf(“%d\n”,a+b); break; case ‟2‟ : printf(“%d\n”,a-b); break; case ‟3‟ : printf(“%d\n”,a*b); break; case ‟4‟ : printf(“%f\n”,(float)a/b); } } else printf(“Invalid selsction.”);
七、查找
顺序查找: 设要找的数存在num中,采用循环将num与数 组元素逐个比较(从头到尾或从尾到头),相等 则找到。 折半查找: 每次取区间中点与num比较,相等则找到,否 则舍去一半区间,再取剩余区间的中点与num比 较…如此反复,直到区间起点下标大于终点下标。
24
例7. 有10个数存放在一个数组中,输入一个数,要求用折 半查找法找出该数是数组中第几个元素的值。如果该数不 在数组中,则打印出“无此数”。习题7.9 步骤: 1)设三个变量l, m, h, 其中l,h存放查找范围第一和最后元 素的下标,m存放查找范围中间元素下标 即m=(h+l)/2; 2)判断要查找的数num与a[m]是否相等,相等已找到; 3)若num>a[m], 则查找范围可缩小到后一半;查找前更 新l=m+1, 计算新m; 再重复第二步; 4)若num<a[m], 则查找范围可缩小到前一半;查找前更 新h=m-1, 计算新m; 再重复第二步;