C语言 字符串和数组

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
五、数组和字符串
例:求5名学生某门功课的平均成绩. main ( ) { float s1, s2, s3, s4, s5, avg; printf ( "Enter the 5 scores :"); scanf("%f%f%f%f%f", &s1,&s2,&s3,&s4,&s5 ); avg = s1 + s2 + s3 + s4 + s5; avg = avg/5.; printf ("average score is %6.2f\n", avg ); }
2. 选择法:
选择法排序的基本思想是:
通过比较找到最小数,如不是第1个数,则与第1
个数交换,再在余下的数中找到最小数,如不是第 2 个数,则与第 2 个数交换位置,再在余下的数中 找到最小数,如不是第 3 个数,则与第 3 个数交换 位置,依此进行,n 个数经过 n-1 轮比较即可完成 排序。
• 冒泡法1: 从第n个数开始,依次比较相邻两个数,即第n个与
第n-1个、第n-1个与第n-2个、…,每次比较,若不 满足由小到大的顺序,则两者对调位置,通过一轮 比较,参加比较的数中的最小数就“上升”到它们 中 最前面的位置,下一轮再把余下的数依次比较,这
样,通过n-1轮比较,就完成了全部n个数的升序排
列。在第i轮比较时,从第 n个位置开始向前已排序
定位了i-1个数,余下n-i+1个数,需两两比较n-i次。
#define N 10 main ( ) { int s[10], i, j, t ; for ( i=0; i < N; i++ ) scanf ("%d", &s[i]); for ( i=0; i < N-1; i++ ) /* 依次把最大数右移 */ for ( j=0; j < N-1-i; j++ ) if ( s[j] > s[j+1]) { t = s[j]; s[j] = s[j+1]; s[j+1] = t; } for ( i=0; i < N; i ++ ) /* 输出排序结果 */ printf ("%d%c", s[i], i!=N-1 ? ',' : ' \n'); }
【例5.2】从键盘输入日期(yyyy-mm-dd),计算并 输出该日期那天是该年的第几天。 分析: • 基本算法:将1月至m-1月的各月天数累加,再加 上给定的日d。 • 每月的天数可用一个一维数组存放,初始化为平 年的天数,然后再根据y年是否为闰年来修正2月 份的天数。 • 闰年的条件是符合下面两条件之一: ⑴ 能被4整除,但不能被100整除; ⑵ 能被400整除 ;
例2:输入一行字符, 以回车表示结束。问输入各数 码的个数。 # include <stdio.h> main ( ) { char s[80], c; int i, nd[10]; for ( i=0; i<10; i ++) nd[i] = 0; i = 0; while ((c=getchar ( ))!='\n') s[i++] = c; s[i]='\0'; /* 补结尾标记*/ for ( i=0; s[i]!='\0'; i++) if (s[i]>='0'&&s[i]<='9') nd[s[i]-'0']++; /*各数码计数*/ for ( i=0; i<10; i++ ) printf ("nd[%d]=%d\n", i, nd[i]); }
}
5.1.3 程序举例
【例5.3】输入10个整数,按从小到大的顺序输出。 这是一个数据排序问题。排序算法有很多种,下 面结合上述实例介绍3种常用的简单排序算法:冒泡 法、选择法和插入法。 1. 冒泡法 冒泡法排序的基本思想是:依次逐个比较相邻的 两个数,如不符合顺序要求,就交换这两个数的位 置。通过一轮比较,就能排定一个数的位置,对于n 个数,进行n-1轮比较即可完成排序
• 用字符串常量作为初值 char c[6]={"China"}; 或 char c[6]="China"; 注意:编译系统自动在字符串常量的最后加'\0' • 可以不指定数组长度 int a[ ]={0, 2, 4, 6, 8}; 相当于 int a[5]={0, 2, 4, 6, 8}; char c[ ]= "China"; 相当于 char c[6]= "China"; • 允许只给部分元素赋初值 (其余元素初始化为0 ) int a[80]={0}; char b[10]={'C','h','i','n','a'}; • 未指定初始化的数组,各元素的值是随机的未知值 但全局数组和静态数组则会自动初始化为0。
• 冒泡法2: 从第1个数开始,依次比较相邻两个数,即第1个与
第2个、第2个与第3个、… ,每次比较,若不满足
由小到大的顺序, 则两者对调位置, 通过一轮比 较,参加比较的数中的最大数就 “ 下沉 ” 到它们 中 最后面的位置,下一轮再把余下的数依次比较,这
样,通过n-1轮比较,就完成了全部n个数的升序排
case case case case casBaidu Nhomakorabea case case case
8: 7: 6: 5: 4: 3: 2: 1:
days+=31; days+=31; days+=30; days+=31; days+=30; days+=31; days +=m2; days +=31;
} printf ("n=%d\n", days);
main( ) { int i, n, count, score[50]; float avg; printf("Input the student the number:\n"); scanf("%d", &n); /* 输入学生数n */ printf("Input %d score:\n", n); for (avg=0, i=0; i<n; i++) /* 输入成绩并累加 */ { scanf("%d", &score[i]); avg+=score[i]; } avg/=n; /* 计算平均成绩 */ for (count=i=0; i<n; i++) /* 统计高于平均成绩的人数 */ if (score[i]> avg) count++; printf("Average=%.1f Number=%d\n", avg, count); }

2. 一维数组元素的引用 数组不能以整体形式参加数据处理,参加数据处 理的只能是数组元素。数组元素的引用方法有两种: • 下标法 引用的一般形式为:数组名[下标] 其中的下标为整型常量或整型表达式,可以包含 变量,它表示了元素在数组中的顺序号即位置 • 指针法(第7章中介绍) 【例5.1】输入学生数n(不大于50)及n个学生某门 课程的成绩,计算并输出平均成绩(保留1位小数) 和高于平均成绩的人数。
5.1.2 一维数组的初始化
数组初始化 是在定义数组时对数组元素赋予初值。 一般形式为: 类型说明符 数组名[常量表达式]={值1,值2,…,值n}; • {}中的各值为将依次赋予各对应元素的初值,必须 是常量或常量表达式,且类型应与数组的类型一致 int a[10]={2, 4, 6, 8, 10, 12, 14, 16, 18, 20}; • 用单个字符作为初值 char b[5]={'C','h','i','n','a'};
数组名 ( 如 a ) 表示该数组中第一个元素 ( 如 a[0] )
的地址,即a和&a[0]同值。数组名是地址常量。 经过定义的数组,编译后,会分配到一段连续的 内存单元。其首地址即数组名(如 a); 数组定义后,编译时无越界保护; a,a[0] a[1] 数组定义中的常量表达式中不能包 含变量。如以下定义方法是不允许的:a[2] int n, m=10; float a[n], b[m]; a[9] 同类型数组可一起定义,用逗号隔开。 如:int a[10], b[20]; …
• 数组是按序排列的同类型变量的集合,是一组具有 相同名字, 不同下标的下标变量。 • 下标变量形式 数组名[下标] 如 s[0]、s[2]、s[3]、s[6]、s[10] • 数组名表示整个数组,如:s • 下标变量又称数组元素 • 下标指出某个数组元素在数组中的位置 下标可以用常量表示,也可以用变量表示 • 有1个下标的下标变量所组成的数组称为一维数组; 有2个下标的下标变量所组成的数组称为二维数组; 如:x[1]、y[5] 数组x和y都是一维数组 a[1][2]、b[2][3] 数组a和b都是二维数组
列。在第i轮比较时,从第 1个位置开始已排序定位
了i-1个数,余下n-i+1个数,需两两比较 n-i次。
冒泡法1流程:
输入s各元,i=0 i<9?
T
F
输出s
i++
F
j=9
j>i?
T
j-F
s[j]<s[j-1]?
T
s[j],s[j-1]互换
#define N 10 main ( ) { int s[N], i, j, t ; for ( i=0; i < N; i++ ) scanf ( "%d", &s[i] ); for ( i=0; i< N-1; i ++ ) /* 依次把最小数左移 */ for ( j = N-1; j>i; j-- ) if ( s[j]<s[j-1] ) { t = s[j]; s[j] = s[j-1]; s[j-1] = t; } for ( i=0; i < N; i++ ) printf ("%d ", s[i]); /* 输出排序结果*/ printf("\n"); }
5.1 一维数组
5.1.1 一维数组的定义和引用
1. 一维数组的定义 • 定义形式: 数据类型 数组名[常量表达式]; 如: int a[10]; 数据类型 说明该数组中每个元素的数据类型 数组名 数组的名称,命名规则同变量名 常量表达式 表示该数组具有的元素个数, 也称为数组的长度。 • 说明: 数组中的第一个元素的下标从0开始。
运行结果: Input the date(yyyy-mm-dd): 2004-9-12↓ 256
另一种方法是不用数组来存放每月的天数和循 环结构累加各月天数,而是用switch结构直接给出 各月天数并实现累加。
main( ) /* 用switch结构 */ { int y, m, d, days, m2=28; do { printf("Input the date(yyyy-mm-dd):\n"); scanf("%d-%d-%d", &y, &m, &d); a[2]=28+(y%4==0&&y%100!=0||y%400==0); } while ( m<1||m>12||d<1||d>a[m] ) ; days=d; switch(m-1) { case 11: days+=30; case 10: days+=31; case 9: days+=30;
使用数组,上例程序可改写为: main ( ) { float s[5], avg=0; int i; for (i = 0; i <5; i++) { scanf ("%f", &s[i] ); avg += s[i]; } avg = avg/5.; printf (" average score is %6.2f\n", avg ); }
main( ) { int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int y, m, d, i, days; do { printf("Input the date(yyyy-mm-dd):\n"); scanf("%d-%d-%d", &y, &m, &d); a[2]=28+(y%4==0&&y%100!=0||y%400==0); } while ( m<1||m>12||d<1||d>a[m] ) ; for( i=1, days=d; i<m; i++) days+ =a[i]; printf ("%d\n", days); } }
相关文档
最新文档