7.1 一维数组 课件(共34张PPT)-《C语言程序设计》同步教学(西安电子科技大学出版社)

资源下载
  1. 二一教育资源

7.1 一维数组 课件(共34张PPT)-《C语言程序设计》同步教学(西安电子科技大学出版社)

资源简介

(共34张PPT)
C 语言程序设计
2023
翻转课堂实用教程
7.1 一维数组
1
2
3
4
导入数组
导入案例
数组的定义
引用
初始化
存储方式
知识点
数组的使用案例
案例分析
练习数组的使用
练习题
导入案例(1)
案例7.1.1:输入5个整数,分别表示5名应届毕业生的月薪,计算并输出这5名应届毕业生的平均月薪(小数点后保留2位小数)。
解决步骤:
(1)采用循环求和方式计算出总和,
(2)然后除以个数就可以得到平均值。
注意:在计算平均数时建议用实数类型保存和,这样在用和除以个数时得到的均值也是实数。
导入案例(1)
#include
int main(){
int i,salary;
double average, sum = 0;
for( i = 0; i <5 ; i++ ){
scanf ( "%d", &salary );
sum = sum + salary;
}
average = sum / 5;
printf("%.2f",average);
return 0;
}
输入数据:
7000 8100 7500 6900 7300
输出数据:
7360.00
运行结果
案例7.1.1程序代码
导入案例(2)
案例7.1.2:输入5个整数,分别表示5名应届毕业生的月薪,计算并输出这5名应届毕业生的平均月薪(小数点后保留两位小数),以及高于平均月薪的工资数。
本例题要求输出所有大于平均月薪的工资数,此时就需要保存输入的所有月薪,等平均值月薪计算出来后,再将高于平均月薪的工资数输出。
导入案例(2)
int main(){
int i,salary1,salary2,salary3,salary4,salary5;
double average, sum = 0;
scanf ( "%d", &salary1);
scanf ( "%d", &salary2 );
scanf ( "%d", &salary 3);
scanf ( "%d", &salary 4);
scanf ( "%d", &salary 5);
sum = sum + salary1+ salary2+ salary3+ salary4+ salary5;
average = sum / 5;
printf("平均月薪为:%.2f\n",average);
printf("高于平均月薪的工资数为:");
if(salary1>average)
printf("%d\n",salary1);
if(salary2>average)
printf("%d\n",salary2);
if(salary3>average)
printf("%d\n",salary3);
if(salary4>average)
printf("%d\n",salary4);
if(salary5>average)
printf("%d\n",salary5);
return 0;
}
输入:
7000 6500 7100 6800 7000
输出:
平均月薪为:6880.00
高于平均月薪的工资数为:
7000
7100
7000
运行结果
案例7.1.2程序代码
如果此时应届毕业生人数由5名变为10名、100名,如何解决?
7.1.1一维数组知识点
数组:若干相同类型的数据的集合
数组中每一个数据叫做数组元素。
元素均具有相同的数据类型,具有统一的变量名即数组名,并用不同编号来区分每个元素。
数组的概念可以等同于班级中的小组,假如小组1有10名学生,为这10名学生依次编号为0、1、2...9,用小组1的0号学生、小组1的1号学生…小组1的9号学生就可以找到这10名学生。
1、一维数组的定义
一维数组的定义方式为:
数据类型名 数组名[数组长度];
举例:
//定义一个含有10个整型数据的数组array
int array[10] ;
//定义一个含有20个双精度浮点型数据的数组num
double num[20];
//定义一个含有30个字符型数据的数组str
char str[30];
7.1.1一维数组知识点
每个元素的类型
整型常量,指出元素个数,称为数组长度
合法标识符
在定义数组时,[]方括号中的数值是数组中元素的个数
2、一维数组的引用
一维数组中各个元素的引用方式:
数组名[元素的下标];
7.1.1一维数组知识点
(1) 先定义,再引用。
(2) 数组中按照元素的顺序,从0开始为每个元素进行编号,这个编号称为下标,合理的下标取值依次为:0、1...(数组长度-1),分别对应着数组中第一个元素、第二个元素...最后一个元素。
(3) 下标也可以为整型表达式,其取值范围为[0,数组长度-1],不在这个范围内的下标值为越界,越界会导致溢出。上溢或者下溢会导致程序出现不可预料的错误。
(4) 只能逐个引用数组元素,不能一次性引用整个数组。对数组元素的引用是自由的,通过数组名和元素下标即可唯一确定一个数组元素。
在引用时,[]方括号中数值给出了将要引用的元素的下标值。
7.1.1一维数组知识点
以下关于数组的说法,不正确的选项为:
引用数组元素时,数组下标可以是整形常量或者整形表达式
2、一维数组的引用
一维数组中各个元素的引用方式:
数组名[元素的下标];
7.1.1一维数组知识点
举例:
int array[10] ;
array[0]、array[1]、array[2]、array[3]、array[4]、array[5]、array[6]、array[7]、array[8]、array[9]
0 1 2 3 4 5 6 7 8 9
7.1.1一维数组知识点
现定义了一维数组 int a[4];
关于数组元素的引用,正确的选项为:
3、一维数组的初始化
(1)在定义数组时初始化
数据类型名 数组名[数组长度]={元素初值表};
7.1.1一维数组知识点
在定义数组时,根据元素初值表中给出的元素的个数,分三种情况为数组进行初始化:
①元素初值表给出所有元素值
② 元素初值表只给出部分元素值
③没有元素初值表
3、一维数组的初始化
(1)在定义数组时初始化
数据类型名 数组名[数组长度]={元素初值表};
7.1.1一维数组知识点
①元素初值表给出所有元素值
赋值的原则为:将初始表中给出的初值依次赋值给全部数组元素。
举例:
int array[10] = {1,2,3,4,5,6,7,8,9,10};
等价于
a[0]=1,a[1]=2,a[2]=3,a[3]=4, a[4]=5,a[5]=6,a[6]=7,a[7]=8,a[8]=9,a[9]=10。
若对所有元素赋值,可以省略数组长度,但不建议省略
元素初值表中的初值个数不能超过数组长度。
3、一维数组的初始化
(1)在定义数组时初始化
数据类型名 数组名[数组长度]={元素初值表};
7.1.1一维数组知识点
② 元素初值表只给出部分元素值
赋值的原则为:将初始表中给出的初值依次赋值给数组元素,其余元素自动赋值为0。
举例:
int num[10] = {1,2,3};
等价于
num[0] = 1,num[1] = 2, num[2] = 3, num[3]~num[9]均为0。
如何给全部元素赋初值为0
int num[10] = {0};
3、一维数组的初始化
(1)在定义数组时初始化
数据类型名 数组名[数组长度]={元素初值表};
7.1.1一维数组知识点
③没有元素初值表
分两种情况:
普通数组
int grade[10]; //动态数组,所有元素的值是一个随机值。
定义时加上static关键字的静态数组
static int grade[10]; //若没有对静态数组元素赋初值,所有元素自动被赋初值0。
3、一维数组的初始化
(2)在定义数组后,单独对数组元素赋值
7.1.1一维数组知识点
赋值的原则为:此时需要挨个为数组元素赋值。
举例:
① int grade[10];
grade[0] = 80,grade[1]=90, grade[2] = 85,grade[3]=75;
其他没有赋值的元素,其值为随机值。
② for( i = 0; i <10 ; i++ )
scanf ( "%d", &grade[i] );
//是否正确?
int score[20];
score[20] = {80, 90};
4、一维数组的存储方式
系统根据每个元素的数据类型、元素的个数在内存中分配一块连续的内存空间用于存放该数组。数组名便是这块连续内存空间的首地址/起始地址。
7.1.1一维数组知识点
举例
int array[10] = {1,2,3,4,5,6,7,8,9,10};
4、一维数组的存储方式
系统根据每个元素的数据类型、元素的个数在内存中分配一块连续的内存空间用于存放该数组。数组名便是这块连续内存空间的首地址/起始地址。
7.1.1一维数组知识点
举例
int array[10] = {1,2,3,4,5,6,7,8,9,10};
内存单元
下标 0 1 2 3 4 5 6 7 8 9
4、一维数组的存储方式
系统根据每个元素的数据类型、元素的个数在内存中分配一块连续的内存空间用于存放该数组。数组名便是这块连续内存空间的首地址/起始地址。
7.1.1一维数组知识点
举例
int array[10] = {1,2,3,4,5,6,7,8,9,10};
内存单元 1 2 3 4 5 6 7 8 9 10
下标 0 1 2 3 4 5 6 7 8 9
4、一维数组的存储方式
系统根据每个元素的数据类型、元素的个数在内存中分配一块连续的内存空间用于存放该数组。数组名便是这块连续内存空间的首地址/起始地址。
7.1.1一维数组知识点
举例
int array[10] = {1,2,3,4,5,6,7,8,9,10};
数组引用 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
内存单元 1 2 3 4 5 6 7 8 9 10
下标 0 1 2 3 4 5 6 7 8 9
整形数据在内存中占4个字节,若首地址为8000
4、一维数组的存储方式
系统根据每个元素的数据类型、元素的个数在内存中分配一块连续的内存空间用于存放该数组。数组名便是这块连续内存空间的首地址/起始地址。
7.1.1一维数组知识点
举例
int a[10] = {1,2,3,4,5,6,7,8,9,10};
数组引用 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
内存单元 1 2 3 4 5 6 7 8 9 10
下标 0 1 2 3 4 5 6 7 8 9
地址信息 8000 8084 8088 8092 8096 8100 8104 8108 8112 8116
整形数据在内存中占4个字节,若首地址为8000
案例分析
一维数组的编程方法
7.1.4分析一维世界中新冠病毒感染情况
7.1.5在一系列数据中删除第k个数据
演示数组中每个元素的赋值和输出方法
演示查找某个数据,并删除数组中元素的方法。
下标作为循环变量,采用循环结构对数组进行操作
巧用数组下标,简化问题解决。演示下标的其他用处,如坐标点。
7.1.2一维数组案例分析
7.1.3放射加密方法对一系列数据进行加密
案例7.1.3:用放射加密方法对一系列数据进行加密,并输出加密后的数据。
要求:输入10个数据,保存到数组中,并采用放射加密法对每个数据进行加密,最后输出加密后的10个数据。
加密的公式:加密后数据 = (7*数据+21)%26。
问题分析:定义整型数组num保存这10个数据,数组长度定为10,定义i作为数组的下标,并将数组的下标i作为循环变量,通过循环变量i从0变到n-1,来逐个访问数组中的a[0]到a[n-1],并对其进行相应的操作。
7.1.2一维数组案例分析
#include
#define N 10 /*定义符号常量N为10,后续代码N的地方*/
int main (void){
int i; /*i既作为数组下标,又作为循环变量*/
int num[N] = {50,34,40,68,60,45,39,47,51,30};
for(i=0;inum[i] = (7*num[i]+21)%26;
}
printf("放射加密后的数据为:\n");
for(i=0;iprintf("%d ",num[i]);
}
return 0;
}
放射加密后的数据为:
7 25 15 3 25 24 8 12 14 23
运行结果
案例7.1.3程序代码
7.1.2一维数组案例分析
案例7.1.4:分析一维世界中新冠病毒感染情况
要求:从2019年12月开始,新冠病毒在全球传播开来,该病毒传染性极强,只要某人与携带了该病毒的感染者在活动范围内有交集,则有被感染的可能。为了简化运算,假设人生活在一维世界中,Ta到过的地方为一个区间[begin,end],其中0≤begin≤end≤200。
假设有二个人,A、B,其中A为新冠病毒感染者,B为健康者,依次给出4个整数beginA endA beginB endB,分别为这A、B二人的活动区间,请分析B是否有被感染的可能。
7.1.2一维数组案例分析
案例7.1.4:分析一维世界中新冠病毒感染情况
问题分析:在一维世界中,人的活动范围为[0,200],共201个点,定义int mark[201] = {0}来记录这201点是否为感染者的活动点。假设0≤i≤200,若mark[i] = 0,表示i这个点不是感染者的活动点,若mark[i] = 1,表示i这个点是感染者的活动点。
7.1.2一维数组案例分析
O
感染者A的活动范围
beginA endA
mark[beginA]~mark[endA]赋值为1
beginB endB
B
循环判断mark[beginB]~mark[endB]中的值是否有1的情况
#include
int main(){
int n,m,i,j,flag = 0; //flag为0表示未被感染
int beginA,endA,beginB,endB;
int mark[201] = {0}; //用于在0到200这些坐标点标记
scanf("%d %d %d %d",&beginA,&endA,&beginB,&endB);
//标记A活动过的坐标点
for(i=beginA;i<=endA;i++){
mark[i] = 1; //表示i这个坐标点为A感染者的活动点。
}
for(j=beginB;j<=endB;j++){
/*若j这个坐标点已经被标记为1,说明B的活动点j是A感染者活动的点*/
if(mark[j] == 1){
flag = 1; //可能被感染时flag置为1
break;
}
}
if(flag ==1) //通过flag的值来判断B是否可能被感染
printf("B有可能被感染!");
else
printf("B暂无可能被感染!");
return 0;
}
运行结果1:
50 68 3 45
B暂无可能被感染!
运行结果2:
23 45 34 90
B有可能被感染!
运行结果
案例7.1.4程序代码
数组的下标还可以有其他的含义,比如坐标点。
解决某些实际问题时,好好利用下标,会简化问题的求解。
7.1.2一维数组案例分析
#include
int main(){
int n,m,i,j,flag = 0; //flag为0表示未被感染
int beginA,endA,beginB,endB;
int mark[201] = {0}; //用于在0到200这些坐标点标记
scanf("%d %d %d %d",&beginA,&endA,&beginB,&endB);
//标记A活动过的坐标点
for(i=beginA;i<=endA;i++){
mark[i] = 1; //表示i这个坐标点为A感染者的活动点。
}
for(j=beginB;j<=endB;j++){
/*若j这个坐标点已经被标记为1,说明B的活动点j是A感染者活动的点*/
if(mark[j] == 1){
flag = 1; //可能被感染时flag置为1
break;
}
}
if(flag ==1) //通过flag的值来判断B是否可能被感染
printf("B有可能被感染!");
else
printf("B暂无可能被感染!");
return 0;
}
运行结果1:
50 68 3 45
B暂无可能被感染!
运行结果2:
23 45 34 90
B有可能被感染!
运行结果
案例7.1.4程序代码
数组的下标还可以有其他的含义,比如坐标点。
解决某些实际问题时,好好利用下标,会简化问题的求解。
7.1.2一维数组案例分析
案例7.1.5:在一系列数据中删除第k个数据
要求:输入10个整数,将其保存到数组中。再输入一个要删除数据的下标index(从0开始),若该index值合法(0~9),则将该位置的数据从数组中删除,不合法则不执行任何操作。
问题分析:定义长度为10的arr数组来保存10个数据, i作为数组的下标,index来保存要删除数据的下标值,删除了该下标处的数据后,该位置后面的数据要往前移动。
7.1.2一维数组案例分析
#include
int main(){
int arr[10] ={0};
int index,i;
for(i=0;i<=9;i++)
scanf("%d",&arr[i]);
scanf("%d",&index);
if(index>=0 && index <=9){
//先输出最开始的数组
printf("原始数组为:\n");
for(i=0;i<=9;i++)
printf("%d ",arr[i]);
printf("\n");
for(i=index;i<9;i++) //从index开始,i位置数据等于i+1,实现数据前移
arr[i] = arr[i+1];
printf("删除一个数据,新的数组为:\n");
for(i=0;i<=8;i++)
printf("%d ",arr[i]);
}else{
printf("the index is wrong!");
}
return 0;
}
运行结果1:
0 1 2 3 4 5 6 7 8 9↙
0↙
原始数组为:
0 1 2 3 4 5 6 7 8 9
删除下标0的元素,新的数组为:
1 2 3 4 5 6 7 8 9
运行结果2:
0 1 2 3 4 5 6 7 8 9↙
9↙
原始数组为:
0 1 2 3 4 5 6 7 8 9
删除下标9的元素,新的数组为:
0 1 2 3 4 5 6 7 8
运行结果
案例7.1.5程序代码
7.1.2一维数组案例分析
课堂练习题7.1.3:一维数组的循环左移
先输入一个整数n和m,n表示元素的个数,m表示左移的位置,随后输入n个整数。请依次输出左移m位后的数组中所有的元素。举例:
输入:
8 2
1 2 3 4 5 6 7 8
输出:
3 4 5 6 7 8 1 2
7.1.3一维数组练习题
课堂练习题7.1.1:两个一维数组相加
先输入一个整数n,随后输入两行数据,每行n个整数,试计算这两行数据对应位置的和,并输出所有的和。举例:
输入:
5
1 2 3 4 5
6 7 8 9 0
输出
7 9 11 13 5
课堂练习题7.1.2:输出某个大学生程序设计大赛中,最高的得分和最低的得分
先输入一个整数n表示参加程序设计大赛的选手人数,随后给出n个整数表示每位参赛者的得分,用空格隔开。请输出这n位参赛者中最高的得分和最低的得分。
谢谢观看
程序设计基础

展开更多......

收起↑

资源预览