第4章数组和字符串
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3
1.数组的定义
按序排列的同类数据元素的集合就称为数组。 从概念上来说,数组是一组变量,这组变量应该满
足下列条件:
具有有相同的名字 具有相同的数据类型 在存储器中连续存放。
按数组元素类型的不同,数组又可分为
数值型数组 字符型数组 指针型数组 结构体型数组
4
2.数组的数据类型
数组的数据类型可以是各种基本数据类型
C语言的数组可以是多维的,但一般常用的是一维数 组和二维数组。
6
4.2一维数组
4.2.1一维数组的定义 4.2.2一维数组的初始化 4.2.3一维数组的引用
7
4.2.1一维数组的定义
一维数组定义的语法格式如下:
类型说明符 数组名 [数组长度];
其中:
(1)“类型说明符”可以是任何一种基本数据类型或构 造数据类型。例如:
int data[5];
/*整型数组data,有5个元素。*/
char string[20]; /*字符型数组string,有20个元素 */
(2)“数组名” 命名规则和变量命名规则相同。
(3)数组名后的“数组长度”表示数组中数据元 素的个数,数组长度只能是一个整型常量。
8
(4)一个数组定义语句中可以只定义一个 数组,也可以定义多个数组,还可以同时 定义数组和变量。例如:
/*错误
*/
…
}
10
一组red整数
11
定义整型数组red
16位
数组red有13个元素,下标为0~12 注意:没有red[13]。
12
4.2.2一维数组的初始化
初始化是指在数组定义时给数组元素赋予初值。 格式:
类型说明符 数组名[常量表达式]={数据值1, 数据值2,…,数据值n};
注意:
分析: 本题要使用三个平行的一维数组。 两个数组的第i个元素分别记录了一个学生的期中成绩 和期末成绩。 第三个数组的第i个元素由另两个数组的第i个元素计算 得到。
31
score1
80 70 80 ……
score2
90 80 60 ……
final-Score
87 77 66 ……
期中成绩
期末成绩
scanf("%d",&data[i]);
min_allo=0;
/*假设第0个元素最小 */
for (i=1;i<SIZE;i++)
{
if (data[i]<data[min_allo]) /*若第i个元素小于当前最小
元素,记录新的最小元素的位置 */
min_allo=i;
}
printf("Min is %5d,Alloction is %5d",data[min_allo],min_allo);
#include<stdio.h> main() {
int i,m[8]; for(i=0;i<8;)
m[i++]=2*i+2; for(i=0;i<=7;i++)
printf("%d ",m[i]); }
程序的最后运行结果如下: 2 4 6 8 10 12 14 16
17
一维数组应用举例
18
例1:用数组方式读入5个整数,并求和。
21
例3: 输入100个整数,求出最小的数以及第一 个最小的数在数组中的下标。
分析: 用一个变量min_allo记住最小元素的下标 开始时,假设第0的元素最小,min_allo=0 循环从第一个元素开始,到第99个元素结束 判断该元素是否比下标为min_allo的元素还要
小,如果是,就让min_allo记住这个新的最小 元素的位置。
14
4.2.3一维数组的引用
格式:
数组名[下标表达式]
其中:
数组下标可以是整型变量或整型表达式, 任何一个数组元素的引用都可以看成是一个变量的使用。 下标从0开始,不能大于[数组长度-1]
例如: data[4]、data[i+j]、data[i++]
都是合法的引用方式。
15
【例4.1】数组m[8]存储其下标值,反向输出m的值。
/*
sum of 5 interger
*/
#include "stdio.h"
void main()
{ int i,data[5],sum=0;
printf("\nPlease enter 5 integer:");
for (i=0;i<5;i++)
scanf("%d", &data[i] );
for (i=0;i<5;i++)
9 888 8 8 8 955 5 5 5 594 4 4 4 449 2 2 2 222 9 0 0 000 0 9
第 第第第 第 结
1 次
234 5 次次次 次
果
第一趟
85 58 44 22 00
5 55 4 44 8 22 2 80 0 08
第 第 第 第结 1 2 3 4果 次次 次次
第二趟
float b[10],c[20],f; 定义了:
单精度浮点型数组b,有10个元素; 单精度浮点型数组c,有20个元素; 浮点型变量f。
9
例如:
程序段一:
#define Size 5
main()
{ int a[Size],b[Size+10]; /*正确
*/
…
} 程序段二:
main()
{
int n=5; int data[n];
/*初始化 */
printf("\n"); for (i=2;i<20;i++)
fib[i]=fib[i-1]+fib[i-2] ;
for (i=1;i<=20;i++)
{ printf("%10d",fib[i-1]); if (i%5==0) printf(“\n”);
个*/
/*每行输出5
} }
}
23
例4: 输入10个整数,从小到大排列并输出 。
何为冒泡排序法
算法:(从小到大)将两个相邻的数比较,将小的调换 到前头 .每一趟把最大的数放到正确的位置。
Leabharlann Baidu为选择排序法
算法:每次找到最小的数,再和相应位置的数调换 位置。
24
1、用冒泡法对10个数进行升序排序
算法:(从小到大)将两个相邻的数比较,将小的调换 到前头 .每一趟把最大的数放到正确的位置。
数组初始化是在编译阶段进行的,由可执行语句完成 的,因此不能将初始化的“=”与赋值号混淆。
规定:
可以只给部分元素赋初值。没有赋初值的元素:对于 数值型数组,自动赋初值为0;对字符型数组,自动赋 初值为空字符。 例如:
13
int red[13]={1,2,3,4};
则red[4]~red[12]的初值都为0。
步
•……
•第k步、在m-k+1个数中找出最小
数,然后和第k个数交换,前k个
数已经排好序。
•这样一直到第m-1步结束。
000 0 0 822 2 2 554 4 4 445 5 5 288 8 8 999 9 9
第第 第 第 结
23 步步
4 步
5 步
果
交换过程
28
选择法程序:
作业:请画出选择排序法 的流程图。并分析两种
printf(“the sorted numbers:\n”); for(i=1;i<11;i++)
printf(“%4d”,a[i]); }
将n个数送入a[1]~a[n] for(j=1 to n-1)
for(i=1 to n-j)
a[i]>a[i+1]
T
F
a[i]a[i+1] 输出a[1]~a[n]
a=1;b=1; printf("%10d%10d",a,b); for( j=3;j<=20; j++) {
f=a+b; a=b; b=f; printf("%10d",f); if (j%5==0) printf("\n"); } }
20
#include "stdio.h" void main() { int i, fib[20]={1,1} ;
#include<stdio.h>
main()
{
int i,m[8];
for(i=0;i<=7;i++)
m[i]=i;
for(i=7;i>=0;i--)
printf("%d ",m[i]);
}
程序的运行结果如下:
76543210
16
➢ 允许用表达式表示下标。
【例4.2】在数组m[8]中存储偶数并输出。
第4章数组和字符串
1
第4章 数组和字符串
4.1 数组的概念 4.2 一维数组 4.3 二维数组 4.4 字符串与字符函数
2
4.1 数组的概念
问题的提出:
第一个问题:输入100个学生的“C程序设 计”课程的成绩,将这100个分数从小到大 输出。
第二个问题:输入100个学生的“C程序设 计”课程的期中和期末成绩,算出总评成绩, 总评成绩为“30%×期中成绩+70%×期 末成绩”,计算总评成绩的分数段情况。
25
26
冒泡法程序 main() {int a[11], i,j,t;
printf(“input 10 number:\n”); for(i=1;i<11;i++)
scanf(“%d”,&a[i]); printf(“\n”); for(j=1;j<=9;j++)
for(i=1;i<=10-j;i++) if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1]; a[i+1]=t;}
22
#include "stdio.h"
#define SIZE 100
void main()
{
int i,data[SIZE];
int min_allo;
/*记录最小元素的下标 */
printf("\nPlease input %d int:",SIZE);
for (i=0;i<SIZE;i++)
27
2、用选择法对10个数进行升序排序。 算法:每次将最小的数放到正确的位置。
思路:
9
•设有m个数,排序过程分为m-1 个步骤:
•第1步、在m个数中找出最小数, 然后和第一个数交换,前1个数已 经排好序。
8 5 4 2 0
•第2步、在m-1个数中找出最小数, 第
然后和第2个数交换,前2个数已 1
经排好序。
只能给元素逐个赋值,不能给数组整体赋值。
例如:给数组red中的13个元素全部赋值“2”只能用以下形式来 表示: int red[13]={2,2,2,2,2,2,2,2,2,2,2,2,2};
而不能为了方便写成如下的形式: int red[13]=2;
初始化数组时,允许省略数组的长度。
例如: int red[13]={1,2,3,4,5,6,7,8,9,10,11,12,13}; 可写为: int red[ ]={1,2,3,4,5,6,7,8,9,10,11,12,13};
总评=
期中成绩×30%+期末成绩×70%
剪不断,理还乱!有没有更好的方法?请看二维数组!
32
4.3 二维数组
4.3.1 二维数组的定义 4.3.2 二维数组的初始化 4.3.3 二维数组的引用
33
4.3.1二维数组的定义
语法:
类型说明符 数组名[行数][列数]
其中
“行数”表示第一维下标的长度 “列数”表示第二维下标的长度。
sum=sum+data[i];
printf("Sum is %d\n",sum);
}
19
例2: 用数组方式解决Fibonacci数列问题,求出 Fibonacci数列的前20项存储在数组中,并将数 组内容输出。
前一章的程序:用迭代思想 #include "stdio.h" void main() { int a,b,j,f;
printf(“the sorted numbers:\n”);
for(i=0;i<10;i++) printf(“%4d”,a[i]);
printf(“\n”);}
29
思考
用冒泡法和选择法如何解决第一个问题:输 入100个学生的“C程序设计”课程的成绩, 将这100个分数从小到大输出?
30
用一维数组解决第二个问题:输入100 个学生的“C程序设计”课程的期中和 期末成绩,算出总评成绩,总评成绩为 “30%×期中成绩+70%×期末成 绩”,计算总评成绩的分数段情况。
main()
排序法的区别。
{int a[10], i,j,t,k;
for(i=0;i<10;i++) scanf(“%d”,&a[i]);
printf(“\n”);
for(i=0;i<9;i++)
{ k=i;
for(j=i+1;j<10;j++)
if(a[j]<a[k]) k=j;
t=a[k];a[k]=a[i];a[i]=t;}
如int、float、double、char、long等 。
还可以是:
指针型 结构体型 共用体型 枚举型 (以上类型后续章节介绍)
同一数组中的所有元素必须是相同类型的。
5
3.数组的维数
一维数组
元素有一个下标,如a[1]
二维数组
元素有两个下标,如a[1][1]
三维数组
三个下标,如a[1][1][1]
1.数组的定义
按序排列的同类数据元素的集合就称为数组。 从概念上来说,数组是一组变量,这组变量应该满
足下列条件:
具有有相同的名字 具有相同的数据类型 在存储器中连续存放。
按数组元素类型的不同,数组又可分为
数值型数组 字符型数组 指针型数组 结构体型数组
4
2.数组的数据类型
数组的数据类型可以是各种基本数据类型
C语言的数组可以是多维的,但一般常用的是一维数 组和二维数组。
6
4.2一维数组
4.2.1一维数组的定义 4.2.2一维数组的初始化 4.2.3一维数组的引用
7
4.2.1一维数组的定义
一维数组定义的语法格式如下:
类型说明符 数组名 [数组长度];
其中:
(1)“类型说明符”可以是任何一种基本数据类型或构 造数据类型。例如:
int data[5];
/*整型数组data,有5个元素。*/
char string[20]; /*字符型数组string,有20个元素 */
(2)“数组名” 命名规则和变量命名规则相同。
(3)数组名后的“数组长度”表示数组中数据元 素的个数,数组长度只能是一个整型常量。
8
(4)一个数组定义语句中可以只定义一个 数组,也可以定义多个数组,还可以同时 定义数组和变量。例如:
/*错误
*/
…
}
10
一组red整数
11
定义整型数组red
16位
数组red有13个元素,下标为0~12 注意:没有red[13]。
12
4.2.2一维数组的初始化
初始化是指在数组定义时给数组元素赋予初值。 格式:
类型说明符 数组名[常量表达式]={数据值1, 数据值2,…,数据值n};
注意:
分析: 本题要使用三个平行的一维数组。 两个数组的第i个元素分别记录了一个学生的期中成绩 和期末成绩。 第三个数组的第i个元素由另两个数组的第i个元素计算 得到。
31
score1
80 70 80 ……
score2
90 80 60 ……
final-Score
87 77 66 ……
期中成绩
期末成绩
scanf("%d",&data[i]);
min_allo=0;
/*假设第0个元素最小 */
for (i=1;i<SIZE;i++)
{
if (data[i]<data[min_allo]) /*若第i个元素小于当前最小
元素,记录新的最小元素的位置 */
min_allo=i;
}
printf("Min is %5d,Alloction is %5d",data[min_allo],min_allo);
#include<stdio.h> main() {
int i,m[8]; for(i=0;i<8;)
m[i++]=2*i+2; for(i=0;i<=7;i++)
printf("%d ",m[i]); }
程序的最后运行结果如下: 2 4 6 8 10 12 14 16
17
一维数组应用举例
18
例1:用数组方式读入5个整数,并求和。
21
例3: 输入100个整数,求出最小的数以及第一 个最小的数在数组中的下标。
分析: 用一个变量min_allo记住最小元素的下标 开始时,假设第0的元素最小,min_allo=0 循环从第一个元素开始,到第99个元素结束 判断该元素是否比下标为min_allo的元素还要
小,如果是,就让min_allo记住这个新的最小 元素的位置。
14
4.2.3一维数组的引用
格式:
数组名[下标表达式]
其中:
数组下标可以是整型变量或整型表达式, 任何一个数组元素的引用都可以看成是一个变量的使用。 下标从0开始,不能大于[数组长度-1]
例如: data[4]、data[i+j]、data[i++]
都是合法的引用方式。
15
【例4.1】数组m[8]存储其下标值,反向输出m的值。
/*
sum of 5 interger
*/
#include "stdio.h"
void main()
{ int i,data[5],sum=0;
printf("\nPlease enter 5 integer:");
for (i=0;i<5;i++)
scanf("%d", &data[i] );
for (i=0;i<5;i++)
9 888 8 8 8 955 5 5 5 594 4 4 4 449 2 2 2 222 9 0 0 000 0 9
第 第第第 第 结
1 次
234 5 次次次 次
果
第一趟
85 58 44 22 00
5 55 4 44 8 22 2 80 0 08
第 第 第 第结 1 2 3 4果 次次 次次
第二趟
float b[10],c[20],f; 定义了:
单精度浮点型数组b,有10个元素; 单精度浮点型数组c,有20个元素; 浮点型变量f。
9
例如:
程序段一:
#define Size 5
main()
{ int a[Size],b[Size+10]; /*正确
*/
…
} 程序段二:
main()
{
int n=5; int data[n];
/*初始化 */
printf("\n"); for (i=2;i<20;i++)
fib[i]=fib[i-1]+fib[i-2] ;
for (i=1;i<=20;i++)
{ printf("%10d",fib[i-1]); if (i%5==0) printf(“\n”);
个*/
/*每行输出5
} }
}
23
例4: 输入10个整数,从小到大排列并输出 。
何为冒泡排序法
算法:(从小到大)将两个相邻的数比较,将小的调换 到前头 .每一趟把最大的数放到正确的位置。
Leabharlann Baidu为选择排序法
算法:每次找到最小的数,再和相应位置的数调换 位置。
24
1、用冒泡法对10个数进行升序排序
算法:(从小到大)将两个相邻的数比较,将小的调换 到前头 .每一趟把最大的数放到正确的位置。
数组初始化是在编译阶段进行的,由可执行语句完成 的,因此不能将初始化的“=”与赋值号混淆。
规定:
可以只给部分元素赋初值。没有赋初值的元素:对于 数值型数组,自动赋初值为0;对字符型数组,自动赋 初值为空字符。 例如:
13
int red[13]={1,2,3,4};
则red[4]~red[12]的初值都为0。
步
•……
•第k步、在m-k+1个数中找出最小
数,然后和第k个数交换,前k个
数已经排好序。
•这样一直到第m-1步结束。
000 0 0 822 2 2 554 4 4 445 5 5 288 8 8 999 9 9
第第 第 第 结
23 步步
4 步
5 步
果
交换过程
28
选择法程序:
作业:请画出选择排序法 的流程图。并分析两种
printf(“the sorted numbers:\n”); for(i=1;i<11;i++)
printf(“%4d”,a[i]); }
将n个数送入a[1]~a[n] for(j=1 to n-1)
for(i=1 to n-j)
a[i]>a[i+1]
T
F
a[i]a[i+1] 输出a[1]~a[n]
a=1;b=1; printf("%10d%10d",a,b); for( j=3;j<=20; j++) {
f=a+b; a=b; b=f; printf("%10d",f); if (j%5==0) printf("\n"); } }
20
#include "stdio.h" void main() { int i, fib[20]={1,1} ;
#include<stdio.h>
main()
{
int i,m[8];
for(i=0;i<=7;i++)
m[i]=i;
for(i=7;i>=0;i--)
printf("%d ",m[i]);
}
程序的运行结果如下:
76543210
16
➢ 允许用表达式表示下标。
【例4.2】在数组m[8]中存储偶数并输出。
第4章数组和字符串
1
第4章 数组和字符串
4.1 数组的概念 4.2 一维数组 4.3 二维数组 4.4 字符串与字符函数
2
4.1 数组的概念
问题的提出:
第一个问题:输入100个学生的“C程序设 计”课程的成绩,将这100个分数从小到大 输出。
第二个问题:输入100个学生的“C程序设 计”课程的期中和期末成绩,算出总评成绩, 总评成绩为“30%×期中成绩+70%×期 末成绩”,计算总评成绩的分数段情况。
25
26
冒泡法程序 main() {int a[11], i,j,t;
printf(“input 10 number:\n”); for(i=1;i<11;i++)
scanf(“%d”,&a[i]); printf(“\n”); for(j=1;j<=9;j++)
for(i=1;i<=10-j;i++) if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1]; a[i+1]=t;}
22
#include "stdio.h"
#define SIZE 100
void main()
{
int i,data[SIZE];
int min_allo;
/*记录最小元素的下标 */
printf("\nPlease input %d int:",SIZE);
for (i=0;i<SIZE;i++)
27
2、用选择法对10个数进行升序排序。 算法:每次将最小的数放到正确的位置。
思路:
9
•设有m个数,排序过程分为m-1 个步骤:
•第1步、在m个数中找出最小数, 然后和第一个数交换,前1个数已 经排好序。
8 5 4 2 0
•第2步、在m-1个数中找出最小数, 第
然后和第2个数交换,前2个数已 1
经排好序。
只能给元素逐个赋值,不能给数组整体赋值。
例如:给数组red中的13个元素全部赋值“2”只能用以下形式来 表示: int red[13]={2,2,2,2,2,2,2,2,2,2,2,2,2};
而不能为了方便写成如下的形式: int red[13]=2;
初始化数组时,允许省略数组的长度。
例如: int red[13]={1,2,3,4,5,6,7,8,9,10,11,12,13}; 可写为: int red[ ]={1,2,3,4,5,6,7,8,9,10,11,12,13};
总评=
期中成绩×30%+期末成绩×70%
剪不断,理还乱!有没有更好的方法?请看二维数组!
32
4.3 二维数组
4.3.1 二维数组的定义 4.3.2 二维数组的初始化 4.3.3 二维数组的引用
33
4.3.1二维数组的定义
语法:
类型说明符 数组名[行数][列数]
其中
“行数”表示第一维下标的长度 “列数”表示第二维下标的长度。
sum=sum+data[i];
printf("Sum is %d\n",sum);
}
19
例2: 用数组方式解决Fibonacci数列问题,求出 Fibonacci数列的前20项存储在数组中,并将数 组内容输出。
前一章的程序:用迭代思想 #include "stdio.h" void main() { int a,b,j,f;
printf(“the sorted numbers:\n”);
for(i=0;i<10;i++) printf(“%4d”,a[i]);
printf(“\n”);}
29
思考
用冒泡法和选择法如何解决第一个问题:输 入100个学生的“C程序设计”课程的成绩, 将这100个分数从小到大输出?
30
用一维数组解决第二个问题:输入100 个学生的“C程序设计”课程的期中和 期末成绩,算出总评成绩,总评成绩为 “30%×期中成绩+70%×期末成 绩”,计算总评成绩的分数段情况。
main()
排序法的区别。
{int a[10], i,j,t,k;
for(i=0;i<10;i++) scanf(“%d”,&a[i]);
printf(“\n”);
for(i=0;i<9;i++)
{ k=i;
for(j=i+1;j<10;j++)
if(a[j]<a[k]) k=j;
t=a[k];a[k]=a[i];a[i]=t;}
如int、float、double、char、long等 。
还可以是:
指针型 结构体型 共用体型 枚举型 (以上类型后续章节介绍)
同一数组中的所有元素必须是相同类型的。
5
3.数组的维数
一维数组
元素有一个下标,如a[1]
二维数组
元素有两个下标,如a[1][1]
三维数组
三个下标,如a[1][1][1]