资源简介 (共34张PPT)C 语言程序设计2023翻转课堂实用教程7.1 一维数组1234导入数组导入案例数组的定义引用初始化存储方式知识点数组的使用案例案例分析练习数组的使用练习题导入案例(1)案例7.1.1:输入5个整数,分别表示5名应届毕业生的月薪,计算并输出这5名应届毕业生的平均月薪(小数点后保留2位小数)。解决步骤:(1)采用循环求和方式计算出总和,(2)然后除以个数就可以得到平均值。注意:在计算平均数时建议用实数类型保存和,这样在用和除以个数时得到的均值也是实数。导入案例(1)#includeint 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高于平均月薪的工资数为:700071007000运行结果案例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个整型数据的数组arrayint array[10] ;//定义一个含有20个双精度浮点型数据的数组numdouble num[20];//定义一个含有30个字符型数据的数组strchar 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 97.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。如何给全部元素赋初值为0int 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 94、一维数组的存储方式系统根据每个元素的数据类型、元素的个数在内存中分配一块连续的内存空间用于存放该数组。数组名便是这块连续内存空间的首地址/起始地址。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 94、一维数组的存储方式系统根据每个元素的数据类型、元素的个数在内存中分配一块连续的内存空间用于存放该数组。数组名便是这块连续内存空间的首地址/起始地址。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个字节,若首地址为80004、一维数组的存储方式系统根据每个元素的数据类型、元素的个数在内存中分配一块连续的内存空间用于存放该数组。数组名便是这块连续内存空间的首地址/起始地址。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 endAmark[beginA]~mark[endA]赋值为1beginB endBB循环判断mark[beginB]~mark[endB]中的值是否有1的情况#includeint 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置为1break;}}if(flag ==1) //通过flag的值来判断B是否可能被感染printf("B有可能被感染!");elseprintf("B暂无可能被感染!");return 0;}运行结果1:50 68 3 45B暂无可能被感染!运行结果2:23 45 34 90B有可能被感染!运行结果案例7.1.4程序代码数组的下标还可以有其他的含义,比如坐标点。解决某些实际问题时,好好利用下标,会简化问题的求解。7.1.2一维数组案例分析#includeint 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置为1break;}}if(flag ==1) //通过flag的值来判断B是否可能被感染printf("B有可能被感染!");elseprintf("B暂无可能被感染!");return 0;}运行结果1:50 68 3 45B暂无可能被感染!运行结果2:23 45 34 90B有可能被感染!运行结果案例7.1.4程序代码数组的下标还可以有其他的含义,比如坐标点。解决某些实际问题时,好好利用下标,会简化问题的求解。7.1.2一维数组案例分析案例7.1.5:在一系列数据中删除第k个数据要求:输入10个整数,将其保存到数组中。再输入一个要删除数据的下标index(从0开始),若该index值合法(0~9),则将该位置的数据从数组中删除,不合法则不执行任何操作。问题分析:定义长度为10的arr数组来保存10个数据, i作为数组的下标,index来保存要删除数据的下标值,删除了该下标处的数据后,该位置后面的数据要往前移动。7.1.2一维数组案例分析#includeint 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 21 2 3 4 5 6 7 8输出:3 4 5 6 7 8 1 27.1.3一维数组练习题课堂练习题7.1.1:两个一维数组相加先输入一个整数n,随后输入两行数据,每行n个整数,试计算这两行数据对应位置的和,并输出所有的和。举例:输入:51 2 3 4 56 7 8 9 0输出7 9 11 13 5课堂练习题7.1.2:输出某个大学生程序设计大赛中,最高的得分和最低的得分先输入一个整数n表示参加程序设计大赛的选手人数,随后给出n个整数表示每位参赛者的得分,用空格隔开。请输出这n位参赛者中最高的得分和最低的得分。谢谢观看程序设计基础 展开更多...... 收起↑ 资源预览