版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、程序设计基础(C),第五章 数组与字符串,本章内容,学生需求2 一维数组 指针概念 学生需求3 字符串 二维数组,批量数据的组织与使用 变量定义/声明 变量初始化 输入和输出 相关运算符 赋值和表达式 常见使用方法,案例需求2,编写学生信息管理程序,实现: 命令行交互方式,提示符为“ST2” 帮助功能,命令符H,显示关于命令的使用说明 退出功能,命令符Q,退出程序 增加功能,命令符A,参数为学号、成绩 删除功能,命令符D,参数为学号 查找功能,命令符F,参数为学号 列表功能,命令符L,按学号升序列表 统计功能,命令符T,平均最大最小等 名次功能,命令符S,按成绩从大到小并排名,运行示例,ST2
2、A 102 89 ST2A 101 78.5 ST2A 103 89 ST2L 101 78.5 102 89.0 103 89.0 ST2T Number=3 Sum=256.5, Ave=85.5 Max=89.0, Min=78.5,ST2A 101 81 ST2F 101 101 81.0 ST2D 102 ST2F 102 Not Found: 102 ST2 xyz Bad Command ST2Q Good-Bye.,一、一维数组,数组与数列 一维数组的定义和引用 非数组数组:输入出、累加和、最大值 数组与函数:ex5-1.c 学生信息程序:ex5-2.c 排序、二分法查找:ex
3、5-3.c 学生信息程序:ex5-4.c,ex5-5.c,数组和数列,数列:x0、x1、xn 数组:x0、x1、xn 数组名下标 相同:通过一个名称和下标表示各个元素 数组:数组名为C标识符,下标总是从0开始,元素个数必须编程时确定,一维数组使用示例,int n; n=5; n+; s+=n; printf(%d,n); scanf(%d,i+),int a5; a0=5; a4+; s+=a1+2; printf(%d,ai); scanf(%d,i+),int a5;定义a0,a1,a2,a3,a4共5个变量,应用输入10个数据,输入单个数据 int n; scanf(%d,输入10个数据
4、 int a10; for (i=0;i10;i+) scanf(%d,下标范围0至9的循环 for (i=0;i=9;i+) for (i=0;i10;i+),应用输出10个数据,输出单个数据 int n; printf(%d,n); 输出10个数据 int a10; printf(%d ,a0); printf(%d ,a1); printf(%d ,a9); printf(n);,输出10个数据 int a10; for (i=0;i10;i+) printf(%d ,ai); printf(n);,应用N个数据的输入与输出,使用预定义(符号常量) #define N 10 int aN
5、; for (i=0;iN;i+) scanf(%d,应用输入10个整数并求和,非数组模式 int s=0,d,i; for (i=0;i10;i+) scanf(%d,数组模式 int s=0,a10,i; for (i=0;i10;i+) scanf(%d,应用求最大值,非数组模式 int a,b,c,max; scanf(%d,输入10个数,求最大值 int a10,max,i; for (i=0;i10;i+) scanf(%d,数组与函数传递数组,使用参数传递数组到函数 数组名与元素个数分别传递 数组的常规函数 void sca(int a,int n); void prt(int
6、a,int n); long sum(int a,int n); int max(int a,int n); int min(int a,int n); 编程示例:输入10个整数,输出这10个整数以及累加和、最大值和最小值,常规函数数组的输入,传递数组名与元素个数,函数从键盘输入n个整数,并通过数组参数返回调用者 void sca(int a, int n) int i; for ( i=0; in; i+ ) scanf(%d, ,常规函数数组的输出,传递数组名与元素个数,函数将n个整数输出到屏幕上 void prt(int a, int n) int i; for ( i=0; in; i
7、+ ) printf(%d , ai); printf( n ); ,常规函数计算数组的累加和,传递数组名与元素个数,计算并返回数组中n个整数的累加和 long sum(int a, int n) long s; int i; s = 0; for ( i=0; in; i+ ) s += ai; return s; ,常规函数求数组的最大值,int max(int a, int n) int x, i; x = a0; for ( i=1; in; i+ ) if ( xai ) x = ai; return x; ,常规函数求数组的最小值,int min(int a, int n) int
8、 m, i; m = a0; for ( i=1; iai ) m = ai; return m; ,常规应用示例(ex5-1.c),#define N 5 main() int aN, x, m; long s; sca(a,N); s=sum(a,N); x=max(a,N); m=min(a,N); printf(Data: ); prt(a,N); printf(Sum=%ldn,s); printf(Max=%d,Min=%dn,x,m); ,程序文件ex5-1.c,函数列表 sca,prt,sum max,min,main 代码:55行 运行示例 30 10 20 50 40 Da
9、ta: 30 10 20 50 40 Sum=150 Max=50,Min=10,#include void sca(int a, int n) int i; for ( i=0; iai ) m = ai; return m; #define N 5 main() int aN, x, m; long s; sca(a,N); s=sum(a,N); x=max(a,N); m=min(a,N); printf(Data: ); prt(a,N); printf(Sum=%ldn,s); printf(Max=%d,Min=%dn,x,m); ,学生管理设计思路(简化版),合理假设:学生数不
10、超过100人 #define N 100 学号:int numN; 学号为0或负,表示没有学生 成绩:int scN; 当前数组元素个数:int n; 初始时为0,0nN 管理方式 增加时,数据存贮到下标n处(空闲空间) 删除时,仅将num数组中相应学号清0,函数列表,命令行常规:prompt,wait,cmdHelp 常规函数:sum, max, min,find 管理功能:cmdAdd, cmdDel, cmdFind, cmdList, cmdTotal 子功能:clean(清理) 主函数:main,帮助命令:cmdHelp,void cmdHelp(void) printf( Stud
11、ent Program 2 Help:n ); printf( A: Addn ); printf( D: Deln ); printf( F: Findn ); printf( L: Listn ); /*printf( T: Totaln );*/ printf( H: Helpn ); printf( Q: Quitn ); ,增加命令:cmdAdd简版,传递学号与成绩数组,输入新数据并贮存到下标n处(该空间空闲),返回新的学生数 int cmdAdd(int num,int sc,int n) if ( n=N ) return n; scanf(%d%d, ,return n+1;,
12、常规函数查找并返回下标,int find(int a, int n, int x) int i; for ( i=0; in; i+ ) if ( ai=x ) return i; return -1; ,删除命令:cmdDel,传递学号数组,输入待删除学号,查找该学号,学号数组相应清0,返回新的学生数 int cmdDel(int num, int n) int x, i; scanf(%d, ,查找命令:cmdFind(顺序查找),传递学号与成绩数组,输入学号,查找该学号并输出相应信息 void cmdFind(int num,int sc,int n) int x, i; scanf(
13、%d, ,列表命令:cmdList(未排序),传递学号与成绩数组,每行一个学生信息 void cmdList(int num,int sc,int n) int i; for ( i=0; in; i+ ) if ( numi!=0 ) printf( %d %dn, numi, sci ); ,命令分支语句,#define N 100 int numN, scN, n=0; char cmd; switch ( cmd ) case A: n=cmdAdd(num,sc,n);break; case D: n=cmdDel(num,n);break; case F: cmdFind(num,
14、sc,n);break; case L: cmdList(num,sc,n); break; case H: cmdHelp(); case n:break; default: printf( Bad Commandn ); ,主函数,#define N 100 main() char cmd; int n=0; int numN, scN; while (1) cmd=prompt(); if (cmd=Q) break; switch ( cmd ) case A: n=cmdAdd(num,sc,n);break; case D: n=cmdDel(num,sc,n);break; ca
15、se F: cmdFind(num,sc,n);break; case L: cmdList(num,sc,n); break; case H: cmdHelp(); case n:break; default: printf( Bad Commandn ); wait(cmd); printf(Good-Bye.n); ,提示符函数,char prompt(void) char cmd; printf( ST2 ); do cmd = getchar(); while ( cmd= ); /*单引号中含空格*/ if ( cmd=a ,程序ex5-2.c,代码:93行 函数:9个 main
16、cmdAdd cmdDel find cmdFind find cmdList cmdHelp prompt wait,#include #define N 100 char prompt(void) char cmd; printf( ST2 ); do cmd = getchar(); while ( cmd= ); /*含空格*/ if ( cmd=a ,代码顺序 #include #define N 100 prompt wait find cmdHelp cmdAdd cmdDel cmdFind cmdList main,运行示例,ST2A 102 89 ST2a 101 78 S
17、T2 A103 89 ST2L 102 89 101 78 103 89 ST2F 102 102 89,ST2D 102 ST2F 102 Not Found: 102 ST2A 101 81 ST2L 101 78 103 89 101 81 ST2Q Good-Bye.,清理子功能,传递学号与成绩数组,消去学号为0的元素,返回清理后的元素个数 遍历循环 查找学号为0的元素,下标i 查找后续中学号非0元素,下标j 下标j搬移到下标I 先复制再清0 如果下标j出界,则 下标i以后学号均为0,下标i以前非0,int clean(int num, int sc, int n) int i, j;
18、 for ( i=0; i= n ) return i; numi = numj; sci = scj; numj = 0; return n; ,需改进,增加命令:缺编辑功能 列表命令:缺排序功能 名次命令:缺 统计命令:缺 数据类型:numlong,scfloat 关于清理功能?,编辑功能:cmdAdd,输入后,先查找同学号元素,再查找已清0元素 int cmdAdd(int num, int sc, int n) int x, s, i; scanf( %d%d, ,输入学号与成绩 查找是否编辑模式 查找是否有空闲位置 任何一种查找到? 未找到且元素个数满 放到下标n处 同时元素个数n递
19、增1 复制数据 返回元素个数,排序与查找,2个数的排序 3个数的排序 N个数的排序 冒泡法的优化 二分法查找 示例程序ex5-3.c 多信息排序 多排序,交换2个数的值,交换a与b两个数的值 临时变量t 逆时针方向依次赋值 int a,b,t; t=a; a=b; b=t;,2个数的交换,比较/交换 int a,b,t; if ( ab ) t=a; a=b; b=t; ,先比较再交换 比较两个数的值 如果与排序顺序相反 则交换两个数的值 运行后ab成立,3个数的排序,任意相邻两数比较并交换 int a,b,c; 第1遍的相邻比较/交换 a与b:比较/交换ab b与c:比较/交换bc,但ab不
20、保证成立 结论:c为a,b,c的最大值 第2遍的相邻比较/交换 a与b:比较/交换ab 结论:b为a,b的最大值,N个数的排序,N-1遍的两两相邻比较/交换 int aN; 第1遍的相邻比较/交换(共N-1次) a0与a1:比较/交换 aN-2与aN-1:比较/交换 第2遍比较/交换(共N-2次) a0与a1:比较/交换 aN-3与aN-2:比较/交换 第N-1遍的比较/交换(共1次) a0与a1:比较/交换,N个数排序核心代码,int aN,i,j,t; for (i=0;iaj+1) t=aj; aj=aj+1; aj+1=t; ,变量定义 共N-1遍 每遍N-1-i次 相邻比较 如果反序
21、则 交换,常规函数:排序,void sort(int a,int n) int i,j,t; for (i=0;iaj+1) t=aj; aj=aj+1; aj+1=t; ,对a数组的n个元素进行排序(从小到大) 简易冒泡法排序 n-1遍 n-1-i次 相邻比较 交换,冒泡法的优化,每一遍比较交换之后判断本遍是否存在过交换,若无,则已排序状态,不必继续循环 使用ct对每遍的交换进行计数 每遍n-1-i次比较的之前,之中与之后,int ct; for ( i=0; iaj+1 ) t=aj; aj=aj+1; aj+1=t; ct+; if ( ct=0 ) break; ,查找的优化:二分法/
22、折半法,在已排序数组中查找某个值 设待查找的下标范围为low至high 初始时,low=0, high=n-1 alow至ahigh,从小到大排序 下标范围取中值并判断 midd=(low+high)/2 中值:amidd 前段:alow至amidd-1 后段:amidd+1至ahigh,二分法查找函数,调用前提:已排序 从小到大 若找到,返回下标 没找到,返回-1,int find2(int a,int n,int x) int low,high,midd; low=0; high=n-1; while ( low=high ) midd = (low+high)/2; if ( amidd
23、=x ) return midd; else if (xamidd) high = midd-1; else low = midd+1; return -1; ,程序示例(ex5-3.c),#define N 10 main() int aN,x,i; sca(a,N); sort(a,N); prt(a,N); scanf(%d, ,输入N个整数,排序后输出,再输入一个数,查找该数在排序后的位置,程序文件ex5-3.c,函数列表 sca,prt,sort find2,main 代码:56行 运行示例 30 80 10 60 20 90 50 40 100 70 10 20 30 40 50
24、60 70 80 90 100 60 a5=60,#include void sca(int a, int n) int i; for ( i=0; iaj+1) t=aj; aj=aj+1; aj+1=t; int find2(int a,int n,int x) int low,high,midd; low=0; high=n-1; while ( low=0 ) printf( a%d=%dn,i,ai); else printf( Not Found: %dn,x); ,按学号升序的交换条件,常规条件:下标j的学号比下标j+1的学号大 numjnumj+1 可选条件:下标j的学号无效
25、numj0 (numjnumj+1 | numj0,学生信息按学号升序:双信息排序,void sort_stu(int num,int sc,int n) int i,j,t; for (i=0;inumj+1 | numj0) t=numj;numj=numj+1;numj+1=t; t=scj; scj=scj+1; scj+1=t; ,传递学号与成绩 比较学号 空学号在后 交换学号与成绩,升序优化,void sort_stu(int num,int sc,int n) int i, j, t, ct; for (i=0;inumj+1 | numj0) t=numj;numj=numj+
26、1;numj+1=t; t=scj; scj=scj+1; scj+1=t; ct+; if ( ct=0 ) break; ,按成绩从大到小排序,同时满足按学号升序与按成绩降序 num数组与sc数组按学号升序 另设s数组为成绩顺序表 s0记录最高成绩所在下标,s1记录次高成绩所在下标,依次类推 则,scs0为最高成绩,scsn-1为最低成绩 比较scsj与scsj+1,第j名与第j+1名的交换条件,第j名的成绩:scsj,第j名的学号:numsj 常规条件:第j名学生成绩不如第j+1名学生成绩 scsj0 (scsj0,学生信息按成绩降序:双排序,void sort_sc(int num,i
27、nt sc,int s,int n) int i,j,t; for (i=0;i0 ) t=sj;sj=sj+1;sj+1=t; ,传递排序数组s 初始i下标为第i名 比较j名与j+1名的成绩 交换j名与j+1名下标,成绩降序的优化,void sort_sc(int num,int sc,int s,int n) int i, j, t, ct; for (i=0;i0 ) t=sj;sj=sj+1;sj+1=t;ct+; if ( ct=0 ) break; ,排名次,void cmdSort(int num,int sc,int s,int n) /*调用前提:成绩降序*/ int i,
28、r; /*r表示名次*/ for ( i=0; i 0 ) printf( %d: %d %dn, r, numsi, scsi ); ,简易清理,int clean(int num, int n) int i; for ( i=n-1; i=0; i- ) if ( numi!=0 ) break; return i+1; ,传递学号数组,消去学号数组中末尾学号无效的元素,返回清理后的元素个数 前提:学号升序后 递减循环 若有效,则退出 下标0至i为有效 个数=i+1,统计功能:cmdTotal,传递成绩数组,统计并输出。调用条件:清理后 void cmdTotal(int sc,int n
29、) long s; float ave; int x, m; s = sum( sc, n ); ave = n0 ? (float)s/n : 0; x = max( sc, n ); m = min( sc, n ); printf( Number=%dn, n ); printf( Sum=%ld, Ave=%.1fn, s, ave ); printf( Max=%d, Min=%dn, x, m ); ,帮助命令:cmdHelp,void cmdHelp(void) printf( Student Program 2 Help:n ); printf( A: Addn ); prin
30、tf( D: Deln ); printf( F: Findn ); printf( L: List By Numn ); printf( S: Sort By Scoren ); printf( T: Totaln ); printf( H: Helpn ); printf( Q: Quitn ); ,函数列表,cmdAdd:增加/编辑命令 sort_stu:按学号升序 sort_sc:按成绩降序 find2:二分法查找 cmdHelp:帮助命令 cmdSort:排名 clean:简易清理 cmdTotal:统计功能,命令分支语句,#define N 100 int numN, scN, s
31、N, n=0; char cmd; switch ( cmd ) case A: n=cmdAdd(num,sc,n);break; case D: n=cmdDel(num,n);break; case F: cmdFind(num,sc,n);break; case L: sort_stu(num,sc,n); cmdList(num,sc,n); break; case S: sort_sc(num,sc,s,n); cmdSort(num,sc,s,n); break; case T: sort_stu(num,sc,n); n=clean(num,n); cmdTotal(sc,n)
32、; break; case H: cmdHelp(); case n:break; default: printf( Bad Commandn ); ,程序集成(ex5-4.c),main prompt wait cmdHelp cmdAdd cmdDel find cmdFind find sort_stu sort_sc clean cmdList cmdSort cmdTotal sum, max, min,代码:198行 函数:17个 sum max min find prompt wait sort_stu sort_sc clean cmdHelp cmdAdd cmdDel cm
33、dFind cmdList cmdSort cmdTotal main,#include #define N 100 long sum(int a, int n) long s; int i; s = 0; for ( i=0; iai ) m = ai; return m; int find(int a, int n, int x) int i; for ( i=0; i ); do cmd = getchar(); while ( cmd= ); /*单引号中含空格*/ if ( cmd=a ,运行示例,ST2A 102 89 ST2a 101 78 ST2 A103 89 ST2L 10
34、1 78 102 89 103 89 ST2F 102 102 89 ST2A 101 81,ST2S 1: 102 89 1: 103 89 3: 101 81 ST2D 102 ST2F 102 Not Found: 102 ST2Q Good-Bye.,类型修改(ex5-5.c),long numN; float scN; int sN; int n=0; float sum(float a, int n); float max(float a, int n); float min(float a, int n); int find(long a, int n, long x); voi
35、d sort_stu(long num,float sc,int n); void sort_sc(long num,float sc,int s,int n); int clean(long num, int n); int cmdAdd(long num,float sc,int n); int cmdDel(long num, int n); void cmdFind(long num,float sc,int n); void cmdList(long num,float sc,int n); void cmdSort(long num,float sc,int s,int n); v
36、oid cmdTotal(float sc,int n);,#include #define N 100 float sum(float a, int n) float s; int i; s = 0; for ( i=0; iai ) m = ai; return m; long find(long a,int n,long x) int i; for ( i=0; i ); do cmd = getchar(); while ( cmd= ); /*单引号中含空格*/ if ( cmd=a ,运行示例,ST2A 102 89.5 ST2a 101 78.5 ST2 A103 89.5 ST
37、2L 101 78.5 102 89.5 103 89.5 ST2F 102 102 89.5 ST2A 101 81,ST2S 1: 102 89.5 1: 103 89.5 3: 101 81.0 ST2D 102 ST2F 102 Not Found: 102 ST2Q Good-Bye.,一维数组注意点,数组初始化 输入n和n个整数 输入直到0时终止 求最大值所在下标 选择法排序,一维数组的初始化,求y年m月的天数 int days13=0,31,28,31, 30,31,30, 31,31,30, 31,30,31; if (y%4=0,应用输入n和n个整数,合理假设:输入的n介于0
38、至100之间 int n,a100,i; /* 空间有可能浪费,也可能溢出 */ scanf(%d, /*数组元素个数不能使用变量*/ ,应用输入直到0时终止,合理假设:输入个数不超过100 int n,a100; /* 空间有可能浪费,也可能溢出 */ for ( n=0; 1; n+ ) /* 条件部分可写为n100 */ /* 可改为while或do-while结构 */ scanf(%d, 则a0至an-1这n个整数为有效输入数据,应用求最大值所在下标,求最大值 int a10,max,i; for (i=0;i10;i+) scanf(%d,求最大值所在下标 int a10,max,
39、i,k; for (i=0;i10;i+) scanf(%d,选择法排序思路,依次求各“最小数” a,b,c,d四个数排序 a与b比较/交换 a与c比较/交换 a与d比较/交换 b与c比较/交换 b与d比较/交换 c与d比较/交换,第一个数a依次与后续几个数(b/c/d)比较/交换,则a为a/b/c/d中最小数。 第二个数b依次与后续几个数(c/d)比较/交换,则b为b/c/d中最小数。 第三个数c与后续数(d)比较/交换,则c为c/d中最小数。 第四个数d为最大值。,【例5.3】选择法排序,#define N 10 main() int aN, i, j, t; for ( i=0; iN;
40、 i+ ) scanf( %d, ,for ( i=0; iaj ) /*如果不是从小到大 */ t=ai; ai=aj; aj=t; ,选择法排序改进,for ( i=0; iaj ) /* 如果发现更小值 */ k = j; /* 使ak指向最小值 */ if ( k != i ) /* 如果ai不是ai至aN-1的最小值 */ /* 则交换ai与ak */ t=ai; ai=ak; ak=t; ,遍历+筛选+输出,编写函数,输出数组a中大于x的元素 void prt_sel(int a,int n,int x) int i; for (i=0;ix) printf(%d ,ai); ,遍
41、历+筛选+生成,将a数组n个元素中大于x的元素按原序保存到数组b中,并返回大于x的元素个数。 int select(int a,int n,int x,int b); 如int a5=30,20,50,10,40,b5; 则k=select(a,5,25,b);运行后 b数组为30,50,40,?,? k=3,筛选函数,int select(int a,int n,int x,int b) int i, k=0; for (i=0;ix) bk = ai; k=k+1; return k; ,k为计数器 +下标 初始为0 若条件成立 保存至b数组 计数增1,bk+=ai;,应用例示,main(
42、) int a10,b10,k,x; long s; sca(a,10); s=sum(a,10); k=select(a,10,s/10,b); x=min(b,k); printf(X=%dn,x); ,输出数组中大于且最接近平均值的元素 输入10个元素 计算累加和 超过平均值b b数组的最小值 输出,案例需求3,编写学生信息管理程序,实现: 命令行交互方式,提示符为“ST3” 命令符改为命令词,命令词不分大小写 增加学生姓名信息(设姓名不超过19个字符) 帮助功能,命令串Help,显示关于命令的使用说明 退出功能,命令串Quit,退出程序 增加功能,命令符Add,参数为学号、姓名、成绩
43、删除功能,命令符Del,参数为学号 查找功能,命令符Find,参数为学号 列表功能,命令符List,按学号升序列表 统计功能,命令符Total,平均最大最小等 名次功能,命令符Sort,按成绩从大到小并排名,二、指针基本概念,变量信息:值和地址 指针:地址 指针变量:值为地址的变量 指针变量定义:变量名前带* int *p; p是一个变量,为指针变量 p的值是一个int类型变量的地址 取址运算符( int *p;,scanf( %d, ,m=n;,指针与一维数组,int a=10,11,12,13,14; int *p; p=,三、字符串,字符串常量 字符串表示数组法 字符串输出 字符串输入
44、常用字符串函数 程序举例,字符串常量,使用双引号:Hello 连续的字符序列 H, e, l, l, o, 0 字符尾部追加0字符 字符串的实质是指针 字符串在内存的首地址 区分A和A,地址为假设,数组表示,char str8=Hello; 字符数组str有8个元素 前5个为字符H、e、l、l、o 第6个为字符串结束符0 后2个为二进制0,str,输入输出函数,char str80; char *p; 输出函数 puts( str );等价于 printf( %sn, str ); puts( p );等价于 printf( %sn, p ); 输入函数 gets( str );相当于 sca
45、nf( %s, str ); gets( p );相当于 scanf( %s, p ); gets输入一行,以回车结束 scanf( %s,) 输入一个单词 以空格、TAB和回车结束 #include ,字符串输出,数组法 char str = Hello, world!; printf( %sn, str ); 或 puts(str);,字符串输入,数组法 char str80; scanf( %s, str ); 或 gets(str); 字符串输入时必须先用数组法开好空间,字符串常用函数(1),#include 计算并返回字符串长度 函数声明:int strlen(char *p); 函
46、数声明:int strlen(char str); 区别 strlen 与 sizeof/计算存贮空间 char str80=Hello; strlen(str)为5,strlen(Hello)为5 sizeof(str)为80,sizeof(Hello)为6,字符串的循环处理,按长度循环 char str80; gets(str); n=strlen(str); for (i=0;in;i+) putchar(stri); putchar(n);,按结束标志循环,0所在下标即为字符串长度 char str80; gets(str); for (i=0;stri!=0;i+) putchar(
47、stri); printf(n);,字符类函数(扩展),#include 函数,参见教程Page 293 判断字母:isupper, islower, isalpha 判断数字:isdigit, isalnum 转换大小写:toupper, tolower 设 char c; if ( islower(c) )等价if (c=a,小写转换为大写,#include main() char a80; int i; gets(a); for (i=0;ai!=0;i+) /* i=a ,筛选小写字符并生成字符串,int i,n; char str80; gets(str); n=strlen(str
48、); for (i=0;in;i+) if (islower(stri) putchar(stri); putchar(n);,char a80,b80; int i,k,n; gets(a); n=strlen(a); k=0; for (i=0;in;i+) if (islower(ai) bk+ = ai; bk=0; puts(b);,字符串常用函数(2),#include 字符串复制(将字符串s2复制到s1中) 函数声明:char *strcpy(char *s1,char *s2); 函数声明:char *strcpy(char s1,char s2); 例如:char str80
49、; strcpy( str, Hello );,字符串常用函数(3),#include 字符串连接(将字符串s2拼接到s1后) 函数声明:char *strcat(char *s1,char *s2); 函数声明:char *strcat(char s1,char s2); 例如:char str80=He; strcat( str, llo );,字符串常用函数(4),#include 字符串比较(字典顺序,s1在后则0) 函数声明:int strcmp(char *s1, char *s2); 函数声明:int strcmp(char s1, char s2); 例如:char a80=A
50、123, b50=A4; 则 strcmp(a,b)0 为真,字符串与整型数使用比较,int m, n; scanf(%d,char a80, b80; scanf(%s,a);或gets(a); printf(%s,a);或puts(a); strcpy(a,Hello); strcpy(b,a); if (strcmp(a,b)0 ) n=strlen(a); strcat(b,a);,例,输入一行字符串,将字符串的所有字符后移5个字符后输出,最后的5个字符移到头部 如输入:Ab12,#$xyzWQ 则输出:xyzWQAb12,#$,输入部分,char a80; int n; gets(a
51、); n=strlen(a); n为字符个数,同时n下标对应0结束符 如输入:Ab12,#$xyzWQ,后移5字符(分段输出法),main() char a80; int n, i; gets( a ); n=strlen(a); for ( i=n-5; i=n-1; i+ ) putchar( ai ); for ( i=0; in-5; i+ ) putchar( ai ); putchar( n ); ,后移5字符(分段生成法),main() char a80,b80; int n,i,k; gets( a ); n=strlen(a); puts( b ); ,k=0; for (i
52、=n-5;i=n-1;i+) bk+=ai; for ( i=0; in-5; i+ ) bk+=ai; bk = 0;,后移5字符(下标计算法),main() char a81,b81; int n,i; gets( a ); n=strlen(a); puts( b ); ,for (i=0;i=n-1;i+) b(i+5)%n=ai; bn = 0; 推导公式: i (i+5)%n 05,16,27 n-7n-2,n-6n-1 n-50,n-41,n-32 n-23,n-14,其它字符串函数,字符串比较,不区分大小写 int stricmp(char s1,char s2); 字符串所有
53、小写转换为大写 char *strupr(char s); 字符串所有大写转换为小写 char *strlwr(char s);,字符串函数的实现代码例,char *my_strupr(char s) int i; for (i=0;si!=0;i+) if (si=a ,命令编码,命令编码,每个命令分配唯一编码 #define CMD_Quit 1 #define CMD_Help 2 #define CMD_Add 3 #define CMD_Del 4 #define CMD_Find 5 #define CMD_List 6 #define CMD_Sort 7 #define CMD
54、_Total 8 #define CMD_Bad 9,char s80; scanf(%s,s); if ( stricmp(s,Quit) =0 ) return CMD_Quit; if ( stricmp(s,Help) =0 ) return CMD_Help; ,命令词解释,提示符函数prompt2 使用stricmp函数 显示提示符 输入命令词 命令词是否Quit? 是则返回CMD_Quit 命令词是否Help? 是则返回CMD_Help 返回CMD_Bad,int prompt2(void) char s80; printf( ST3 ); scanf(%s,s); if (st
55、ricmp(s,Quit)=0) return CMD_Quit; if (stricmp(s,Help)=0) return CMD_Help; if (stricmp(s,Add)=0) return CMD_Add; if (stricmp(s,Del)=0) return CMD_Del; if (stricmp(s,Find)=0) return CMD_Find; if (stricmp(s,List)=0) return CMD_List; if (stricmp(s,Sort)=0) return CMD_Sort; if (stricmp(s,Total)=0) return
56、 CMD_Total; return CMD_Bad; ,附加解释,附加对单命令符的解释 插入到prompt2函数中 命令串Q等同于Quit 命令串H等同于Help 以此类推,if (stricmp(s,Q)=0) return CMD_Quit; if (stricmp(s,H)=0) return CMD_Help; if (stricmp(s,A)=0) return CMD_Add; if (stricmp(s,D)=0) return CMD_Del; if (stricmp(s,F)=0) return CMD_Find; if (stricmp(s,L)=0) return CM
57、D_List; if (stricmp(s,S)=0) return CMD_Sort; if (stricmp(s,T)=0) return CMD_Total;,主函数,cmd为命令编码,整数类型 case使用符号常量 取消wait函数,main() int cmd, n=0; long numN; float scN; int sN; while (1) cmd=prompt2(); if (cmd=CMD_Quit) break; switch ( cmd ) case CMD_Add: n=cmdAdd(num,sc,n);break; case CMD_Del: n=cmdDel(num,n);break; case CMD_Find: cmdFind(num,sc,n);break; case CMD_List: sort_stu(num,sc,n); cmdList(num,sc,n); break; case CMD_Sort: sort_sc(num,sc,s,n); cmdSo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年环保孵化食品安全检测协议
- 脑出血患者的心理康复护理
- 夜总会双十一光棍节活动策划方案范文
- 大堂副理岗位职责标准规范
- 大学生思想政治课旷课原因及其对策研究
- 大学生节水意识调查报告
- 地理 服务业区位因素及其变化练习2025-2026学年人教版高一地理必修二
- 2026年园区供应链基础设施安全知识测试
- 2026年供应链管理岗位测试题
- 2026年药品知识产权专员考核指标
- 《张三测绘法规》课件
- 温室火灾的防控与处理
- 空调安装调试及售后服务方案
- 4.3.1空间直角坐标系市公开课一等奖课件公开课一等奖课件省赛课获奖课件
- 居然之家租赁合同
- 越野试驾活动方案
- 四乙基铅抗爆剂生产技术项目可行性研究报告
- 中考复习之标点符号的使用方法79张课件
- 社会建构主义
- 精神科护理临床实践能力考核表
- GB/T 5137.4-2020汽车安全玻璃试验方法第4部分:太阳能特性试验
评论
0/150
提交评论