【文档说明】C语言实例教程-应用数组程序设计.ppt,共(45)页,2.775 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-2253.html
以下为本文档部分文字说明:
应用数组程序设计nonamet1t2t3t4avgsickl_eabsentf_escoregrade1刘延运8060806096.085.62孙燕95959080186.085.63王珊珊9598908095
.093.34刘斌9095959975.583.25王一山9695999964.577.66胡志民9890908591.591.27张瑜9895999089.591.98李冰95959080155.067.09张珊8599999989.591.910陈明明9590959090.091.0成绩管理中
数据的批量存储、计算与排序假设学生成绩表如下:成绩管理中数据的批量存储、计算与排序编写程序,对所有学生,定义一个二维数组tasks[10][4],存放通过键盘输入的每次任务成绩t1,t2,t3,t4。计算每个学生
的任务平均分,定义一个一维数组avg[10]存放每个学生的任务平均分,对avg数组中存放的平均成绩降序排列并输出。成绩管理中数据的批量存储、计算与排序对于一维数组avg中排列好的数据,怎么能知道哪个分数是哪个学生的?想想
办法!1.双重循环按行键盘输入数据至二维数组tasks,不要用初始化赋值;2.双重循环计算二维数组tasks每行数据的平均值并将其存入一维数组avg;3.双重循环对一维数组avg中的数据进行降序排列(尽
量使用几种不同的方法);4.输出一维数组avg中经过排序的数据。1.能够应用数组管理数据。2.能够对数组数据元素进行访问(输入与输出)和处理(统计、查找、排序等)。3.能够掌握一些有关数组的编程技巧。4.培养数据处理的逻
辑思维能力。一维数组1二维数组2字符数组和字符串3技能训练46.1一维数组6.1.1一维数组的定义格式:类型名数组名1[常量表达式1],数组名2[常量表达式2],…,数组名n[常量表达式n];例如:inta[10];定义了一个数组a
,元素个数为10,数组元素类型为整型。6.1一维数组6.1.1一维数组的定义(1)数组名:按标识符规则。本例a就是数组名。(2)常量表达式:表示数组元素个数(数组的长度)。可以是整型常量或符号常量,不允许用变量。整型常量表达式在说明数组元素个
数的同时也确定了数组元素下标的范围,下标从0开始~整型常量表达式-1(注意不是1~整型常量表达式)。6.1一维数组6.1.1一维数组的定义C语言不检查数组下标越界,但是使用时,一般不能越界使用,否则结果难以预料。本例数组a中有a[0],a[1],a[2],…a[9]10个整数。不能有如下定义
:inta[n];其中n是变量一般定义为:#defineN100……inta[N];6.1一维数组6.1.1一维数组的定义(3)类型说明:指的是数据元素的类型,可以是基本数据类型,也可以是构造数据类型。类型说
明确定了每个数据占用的内存字节数。本例数组元素是整型,每个元素占2个字节,因为有10个数组元素,所以占用20字节。(4)C编译程序为数组分配了一片连续的空间。(5)C语言还规定,数组名是数组的首地址。6.1一维数组
数组初始化常见的几种形式:(1)对数组所有元素赋初值,此时数组定义中数组长度可以省略。例如:inta[5]={1,2,3,4,5};或inta[]={1,2,3,4,5};(2)对数组部分元素赋初值,此时数组长度不能
省略。例如:inta[5]={1,2};a[0]=1,a[1]=2,其余元素为编译系统指定的默认值0。(3)对数组的所有元素赋初值0。例如:inta[5]={0};6.1.2一维数组的初始化6.1一维数组6.1.2一维数组的引用数组元素的引用形式:数组名[下标表达式]注意
:数组元素引用时,下标为整型的表达式,可以使用变量。一般访问形式:for(i=下标下界;i<下标上界;i++){a[i]};例如:求和定义:inta[8],i,s=0;输入:for(i=0;i<8;i
++)scanf(“%d”,&a[i]);计算:for(i=0;i<8;i++)s=s+a[i];输出:for(i=0;i<8;i++)printf(“%d”,a[i]);6.1一维数组6.1.2一维数组的
引用(1)引用数组元素时,下标可以是整型常数、已经赋值的整型变量或整型表达式。(2)数组元素本身可以看作是同一个类型的单个变量,因此对变量可以进行的操作同样也适用于数组元素。也就是数组元素可以在任何相同类型变量可以使用的位置引用。(3)引用数
组元素时,下标不能越界,否则结果难以预料。6.1一维数组例6.1:编写程序,定义一个含有30个元素的整型数组,按顺序分别赋予从2开始的偶数,然后按每行10个数据输出。#include<stdio.h>main(){inta[30],i,k=2;for(i=0;i<30;i
++){a[i]=k;k+=2;printf(“%4d”,a[i]);if((i+1)%10==0)printf(“\n”);}}6.1一维数组例6.2:在歌手大奖赛中,输入10名选手成绩,求最高分和最低分。#include
<stdio.h>main(){inta[10],i,min,max;for(i=0;i<10;i++)scanf(“%d”,&a[i]);min=max=a[0];for(i=1;i<10;i++){if(a[i]<min)min
=a[i];if(a[i]>max)max=a[i];}printf(“Maxinumvalueis%d\n”,max);printf(“Mininumvalueis%d\n”,min);}6.1一维数组例6.3:选择法排序,对任意输入的10个整数按由小到大的顺序排序。选择
法排序思路:从n个数中找最小的数据跟第一个交换,再从后面的n-1个数据中找最小的跟第二个数交换,依次进行,进行n-1次。为了便于算法的实现,考虑使用一个一维数组存放这10个整型数据,排序的过程中数据始终在这个数组中(原地操作,不占用额外的空间),算法结束后
,结果也在此数组中。6.1一维数组#include<stdio.h>#defineN10main(){intb[N],i,j,t,min,k;for(i=0;i<N;i++)scanf(“%d”,&b[
i]);printf(“Beforesorted:\n”);for(i=0;i<N;i++)printf(“%4d”,b[i]);for(i=0;i<N-1;i++){min=b[i];k=i;for(j=i+1;j<N;j++)
if(b[j]<min){min=b[j];k=j;}if(i!=k){t=b[i];b[i]=b[k];b[k]=t;}}printf(“\nAftersorted:\n”);for(i=0;i<N;i++)printf(“%4d”,b[i]);}6
.2二维数组6.2.1二维数组的定义类型名数组名[常量表达式1][常量表达式2],…;(1)二维数组中的每个数组元素都有两个下标,且必须分别放在单独的“[]”内。(2)二维数组定义中的第1个下标表示该数组具有的行数,第2个下标表示该数组具有的列数,两个下标之积是该数组具有的数组元
素的个数。(3)二维数组中的每个数组元素的数据类型均相同。二维数组的存放规律是“按行排列”。(4)二维数组可以看作是数组元素为一维数组的数组。例如:inta[3][4];6.2二维数组6.2.2二维数组初始化二维数组的初始
化的几种常见形式:(1)分行给二维数组所有元素赋初值例如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};(2)不分行给二维数组所有元素赋初值例如:inta[
3][4]={1,2,3,4,5,6,7,8,9,10,11,12};6.2二维数组6.2.2二维数组初始化(3)给二维数组所有元素赋初值,二维数组第一维的长度可以省略。例如:inta[][4]={1,2,3,4,5,6,7,8};或:inta[][
4]={{1,2,3,4},{5,6,7,8}};(4)对部分元素赋初值,其他元素补0或’\0’例如:inta[2][4]={{1,2},{5}};6.2二维数组6.2.3二维数组的引用格式:数组名[下标表达式1][下标表达式2]说明:下标
表达式的值应为整型;保证下标不越界例如:inta[3][4];赋值:a[0][0]=0;a[0][1]=0;a[0][2]=0;a[0][3]=0;a[1][0]=0;a[1][1]=0;a[1][2]=0;a[1][3
]=0;a[2][0]=0;a[2][1]=0;a[2][2]=0;a[2][3]=0;一般访问形式:(按行)或(按列)。6.2二维数组6.2.3二维数组的引用例6.4:设有一个3行4列放入二维数组a,编写程序,通过键盘输入数组元素,然后计算每行元素的平均值并输出。编程要点
:(1)使用二重循环,进行数组元素的输入;(2)每行的平均值可以存放在另一个一维实型数组ave[3]中。#include<stdio.h>main(){inta[3][4],i,j,s;floatave[3]={0};printf(“Inputdata:\n”);for(i=0;i<
3;i++)/*0,1,2行*/for(j=0;j<4;j++)/*0,1,2,3列*/scanf(“%d”,&a[i][j]);6.2二维数组6.2.3二维数组的引用for(i=0;i<3;i++){s=0;fo
r(j=0;j<4;j++)s=s+a[i][j];ave[i]=s/(float)4;}printf(“Arraya::\n”);for(i=0;i<3;i++){for(j=0;j<4;j++)printf(“%6d”,a[i][j]);printf(“\n”);}pri
ntf(“Average::\n”);for(i=0;i<3;i++)printf(“%6.2f”,ave[i]);}6.3字符数组和字符串字符数组是存放字符型数据的数组。其中每个数组元素存放的值都是单个字符。字符数组分为一
维字符数组和多维字符数组。一维字符数组常常存放一个字符串,二维字符数组常用于存放多个字符串,可以看作是一维字符串数组。(1)初值个数等于数组元素charc[10]={‘I’,’’,’a’,’m’,’’,’h’,’a’,’p’,’p’,’y’};(2)初值少于
数组元素,后面自动补空字符’\0’charc[10]={‘h’,’e’,’l’,’l’,’o’};(3)赋初值定义数组大小charc[]={‘I’,’’,’a’,’m’,’’,’h’,’a’,’p’,’p’,’y’};等价于charc[10]={‘I’,’
’,’a’,’m’,’’,’h’,’a’,’p’,’p’,’y’};6.3字符数组和字符串6.3.1字符数组char数组名[常量表达式],…;6.3字符数组和字符串6.3.1字符数组与一般数组相同。格式:数组名[下标表达式]说明:下标表达式的值应为整型;保证下标不越界。
C语言没有提供字符串变量(存放字符串的变量),对字符串的处理常常采用字符数组实现。因此也有人将字符数组看作为字符串变量。C语言许多字符串处理库函数既可以使用字符串,也可以使用字符数组。6.3字符数组和字符串6.3.2字符串(1)字符型一维数组:‘\0’为结束标志,不计入长度;(2)字
符串常量:”Happy”,自动在末尾加’\0’;(3)字符串常量的值是地址;(4)字符数组与字符串的区别:字符串末尾有’\0’,这样的一维字符型数组可看成字符串变量。6.3字符数组和字符串6.3.2字符串(1)字符数组加结束标志charc[10]={‘I’,’’,’a’,’m’,
’’,’h’,’a’,’\0’}(2)用双引号括起来的一串字符。charc[10]={"happy"};字符串末尾自动加’\0’也可以:charc[10]="happy";说明:以字符串常量形式对字符数组初始化,系统会自动在该字符串的
最后加入字符串结束标志;以字符常量形式对字符数组初始化,系统不会自动在最后加入字符串结束标志。例:字符串的输入和输出#include<stdio.h>main(){chara[10]=”happy”;inti=0;
while(a[i]!='\0'){putchar(a[i]);/*printf("%c",a[i]);*/i++;}}6.3字符数组和字符串6.3.3字符串的输入/输出采用“%c”格式说明或putch
ar、getchar函数6.3字符数组和字符串6.3.3字符串的输入/输出采用“%s”格式符(1)整串输入例如:charc[10];scanf(“%s”,c);注意:不用加&,回车、空格、跳格符结束,自动加’\0’(2)整串输出charc[
]=“China”;printf(“%s”,c);6.3字符数组和字符串6.3.3字符串的输入/输出从地址c开始依次输出存储单元中的字符,直到遇到第一个’\0’为止。’\0’是结束标志,不在输出字符之列。输出结束后不自动换行。说明:①用%s格式符输入字符串时,空格
和回车符都作为数据的分隔符而不能被读入。②若输入字符串的长度超过字符数组所能容纳的字符个数时,系统并不报错。6.3字符数组和字符串6.3.3字符串的输入/输出例6.8:多个字符串输入输出#include<stdio.h>main
(){chara[10],b[15];printf("Inputstring:\n");scanf("%s%s",a,b);printf("%s\n%s\n",a,b);}运行结果:Inputstring:Hello!HelloWorld!Hello!Hello6.3字符数
组和字符串6.3.3字符串的输入/输出格式:gets(str)str:字符数组名,字符指针变量,字符数组元素的地址说明:包括空格,换行结束,系统自动将’\n’转换成’\0’,存入数组。例如:charstr[20];gets(str);6.3字符数组和字
符串6.3.3字符串的输入/输出格式:puts(str)str:输出字符串的起始地址值(字符串常量,字符数组名,字符指针变量,字符数组元素的地址)说明:遇第一个’\0’结束,系统自动将’\0’转换成’\n’,即输出换行符。例如:charstr[20];puts(str);运
行结果:Inputstringaandb:Hello!HelloWorld!Hello!HelloWorld!6.3字符数组和字符串6.3.3字符串的输入/输出例:用函数gets输入字符串数组,用函数puts输出字符串数组。#include<stdio.h>m
ain(){chara[10],b[15];printf("Inputstringaandb:\n");gets(a);gets(b);puts(a);puts(b);}6.3字符数组和字符串6.3.4字符串处理函数格式:strlen
(str)功能:计算str为起始地址的字符串长度(字符个数,不包括’\0’),函数返回整数值。例:求字符串的长度。#include<stdio.h>#include<string.h>main(){charstr[81]="error:\0Declarationsyntaxerror"
;intn1,n2;n1=strlen(str);n2=strlen("ABCDE");printf("n1=%d,n2=%d\n",n1,n2);}6.3字符数组和字符串6.3.4字符串处理函数格式:strcpy(str1,str2)功能:将str2所指字符串的内容复制到str1所指
的存储空间中,函数返回str1的地址值。例如:charstr1[10],str2[]=“China“;strcpy(str1,str2);例:复制字符串#include<stdio.h>#include<string.h>main(){chars1[50]="1234
5",s2[]="abcd";strcpy(s1,s2);puts(s1);strcpy(s1,"goodmoring");puts(s1);puts(strcpy(s1,"hello"));}运行结果:abcdgoodmoringhello6.3字符数组和字符串6.3.4字
符串处理函数6.3字符数组和字符串6.3.4字符串处理函数格式:strcat(str1,str2)功能:str2连接到str1的后面,自动覆盖str1末尾的’\0’,函数返回str1的地址值。#include<stdio.h>#include<str
ing.h>main(){chars1[50]="error,",s2[]="retry";strcat(s1,s2);puts(s1);strcat(s1,"12345");puts(s1);puts(strcat(strcpy(s1,"abcd")
,"6789"));}6.3字符数组和字符串6.3.4字符串处理函数运行结果:error,retryerror,retry12345abcd6789例:字符串连接,注意数组定义的长度要足够长。6.3字符数组和字符串6.3.4字符串处理函数格式:strcmp(s1,s2
)功能:若s1>s2,函数返回整数值大于0,s1=s2,函数返回整数值0,s1<s2,函数返回整数值小于0。6.3字符数组和字符串6.3.4字符串处理函数if(strcmp(s1,s2)>0)printf("s
1>s2\n");elseif(strcmp(s1,s2)==0)printf("s1=s2\n");elseprintf("s1<s2\n");}例6.16:字符串长度的比较。#include<stdio.h>#include<string.h>main(){chars1[20],s2[20
];gets(s1);gets(s2);数组是程序设计中非常重要的数据组织形式,数组的使用很有规律,一般和循环联合使用,一维数组操作通常由一重循环来实现,二维数组操作通常由二重循环来实现。这一章还要理解一维数组、二
维数组和字符串的概念以及在内存中的存储表示,掌握数组的下标变化规律,注重典型例题中如排序、查找、求最大最小值等知识点的理解,在实际应用中灵活运用数组管理数据或处理结果可以使问题很容易实现。全国二级C考试大纲本模块主要考查数组的基础知识和字符串的应用,包括一维数组的
应用、二维数组的应用、字符数组和字符串的应用等。通过对历年试卷内容的分析,本章属于重点考查内容。无论在笔试还是上机考试中,都占有很大的比率。上机考试中的考核频率也越来越高,三种题型均有体现。考试要点1.一维数组的定义与引用。2.二维数组的存
储顺序与引用。3.字符数组与字符串。不断学习,贵在坚持C语言程序设计案例引导教程