
NO.6-2《C语言程序设计》教案备注第六讲数组及其应用目1.掌握一维数组的定义方法、存储形式、初始化及引用方法;的2.掌握多维数组的定义方法、存储形式、初始化及引用方法;要3.了解字符型数组的概念、初始化及应用;求学时划分3小时讲授+自学+独立作业+上机实作组织形式重1.一维、多维数组的定义、存储、初始化及应用;点2.字符型数组;难点【引题]前面几次课,我们先后研究了C语言的基本组成单位;基本数据类型;各种运算符和表达式以及不同结构的程序设计方法。可以说,这些知识是C语言的核心部分,是使用C语言进行编程的基础知识,希望大家要重点掌握。通过学习,我们的确感受到了关于“程序=数据结构+算法”的说法。可以说,要想对数据通过运行编制的程序进行处理,就必须在编程时确定数据的类型,以便使计算机正确处理。如果处理的数据是变量的话,就必须先对变量进行定义或说明,实施初始化处理,然后才能引用它参与各种运算,否则,就得不到正确的结果。这在上次课计算表达式s=1+2*2+3*3+..+100*100值的例子中已经给了我们启发。由于我们定义s的类型不同(int和float),计算机运行程序的计算结果大相径庭。对于一个大型的程序来说,可能要同时对相同数据类型的若干个变量进行处理,如果对每个变量都进行定义的话,不仅非常繁琐,而且使得程序结构允长,不便于维护。那么,这就给我们提出了这样一个问题:如果要同时对相同数据类型的若干个变量进行处理时,有没有其他的办法来简化对变量的定义?如果有,如何进行定义?又任何进行初始化处理?如何引用它们?这正是我们今天要讨论的问题,即教材中的第四章内容。第四章数组及其应用数组:具有相同数据类型且按一定次序排列的一组变量的集合体
《C 语言程序设计》教案 NO.6-2 第六讲 数组及其应用 备 注 目 的 要 求 1. 掌握一维数组的定义方法、存储形式、初始化及引用方法; 2. 掌握多维数组的定义方法、存储形式、初始化及引用方法; 3. 了解字符型数组的概念、初始化及应用; 学时划分 3 小时 组织形式 讲授+自学+独立作业+上机实作 重 点 难 点 1. 一维、多维数组的定义、存储、初始化及应用; 2. 字符型数组; [引题]前面几次课,我们先后研究了C语言的基本组成单位;基本数 据类型;各种运算符和表达式以及不同结构的程序设计方法。可以说, 这些知识是C语言的核心部分,是使用C语言进行编程的基础知识,希 望大家要重点掌握。通过学习,我们的确感受到了关于“程序=数据 结构+算法”的说法。可以说,要想对数据通过运行编制的程序进行 处理,就必须在编程时确定数据的类型,以便使计算机正确处理。如 果处理的数据是变量的话,就必须先对变量进行定义或说明,实施初 始化处理,然后才能引用它参与各种运算,否则,就得不到正确的结 果。这在上次课计算表达式s=1+2*2+3*3+.+100*100 值的例子中已 经给了我们启发。由于我们定义s的类型不同(int和float),计算机运 行程序的计算结果大相径庭。对于一个大型的程序来说,可能要同时 对相同数据类型的若干个变量进行处理,如果对每个变量都进行定义 的话,不仅非常繁琐,而且使得程序结构冗长,不便于维护。那么, 这就给我们提出了这样一个问题:如果要同时对相同数据类型的若干 个变量进行处理时,有没有其他的办法来简化对变量的定义?如果 有,如何进行定义?又任何进行初始化处理?如何引用它们?这正是 我们今天要讨论的问题,即教材中的第四章内容。 第四章 数组及其应用 数组:具有相同数据类型且按一定次序排列的一组变量的集合体

第六讲数组及其应用NO.6-3数组元素数组名数组种类4.1一维数组二、一维数组的定义(一)定义方式数据类型标识符数组名【元素个数];如:int score[15];(二)注意事项1.数组名命名规则同用户定义标识符;2.元素个数必须且只能用[1括住;3.元素个数是整型常量表达式,不能含变量,且必须大于或等于1:如:下列定义是合法的:如:下列定义是非法的:#defineBUFSIZE512int x;#defineSTACKSIZE1024int weight[x];int token[STACKSIZE];char name(50);int num[-5];char buffer[BUFSIZE];char deptname[x+15];float salary[15+5];4.可以同时定义同一类型的多个数组,之间用“,”隔开:如:floatsum[5],salary[io];5.不能将定义行中的数组视为最后一个元素;如: int score[15];a[0]二、一维数组的存储形式alu(一)存储形式a[2]按下标递增的次序连续存放a[14]如:int a[15];(二)注意事项1.数组名是地址常量,不能对其进行赋值和进行地址运算(&)2.a或&a[0]是存储区域的首地址
第六讲 数组及其应用 NO.6-3 数组元素 数组名 数组种类 4.1 一维数组 一、一维数组的定义 (一)定义方式 数据类型标识符 数组名[元素个数]; 如: int score[15]; (二)注意事项 1.数组名命名规则同用户定义标识符; 2.元素个数必须且只能用[]括住; 3.元素个数是整型常量表达式,不能含变量,且必须大于或等于 1; 4.可以同时定义同一类型的多个数组,之间用“,”隔开; 如:float sum[5],salary[10]; 5.不能将定义行中的数组视为最后一个元素; 如: int score[15]; 二、一维数组的存储形式 (一)存储形式 按下标递增的次序连续存放 如: int a[15]; (二)注意事项 1.数组名是地址常量,不能对其进行赋值和进行 地址运算(&) 2.a 或&a[0]是存储区域的首地址 如:下列定义是合法的: #define BUFSIZE 512 #define STACKSIZE 1024 int token[STACKSIZE]; char buffer[BUFSIZE]; float salary[15+5]; 如:下列定义是非法的: int x; int weight[x]; char name(50); int num[-5]; char deptname[x+15]; a[0] a[1] a[2] . a[14]

NO.6-4《C语言程序设计》教案三、一维数组的引用(一) 形式数组名【下标](二)注意事项1.必须先定义或说明,后引用:注意:2.不能对数组整体进行操作,只能对数组元素进行操作;定义时元素个数不3.注意数组下标范围不能越界;能含变量4.下标可以是常量表达式,也可以是含变量的整型表达式;如:指出下列引用是是否合法:main()int i, a[15];for(i=0;i<7;i++)a[2*i]-2*i;/*合法引用*for(i=0;i<8;i++)/*合法引用*/a[2*i-1]=2*i*i-1;/*非法引用*/printf("%d",a);printf("%d",a[5];/*合法引用*/四、一维数组的初始化(一) 方法1.使用赋值语句如:a[2*i]=2*i;2.定义时初始化形式:数据类型标识符数组名[N]=(值1,值2,*值N]如intx[5]=(3,4,7,8,10];(二)注意事项1.值的个数小于元素个数时,多余元素初始化为0如: int x[5]=[3, 4,7];则: x[0] =3, x[1] =4, x[2]=7, x[3]=0, x[4]=02.可以对数组中的部分元素初始化;
《C 语言程序设计》教案 NO.6-4 三、一维数组的引用 (一)形式 数组名[下标] (二)注意事项 1.必须先定义或说明,后引用; 2.不能对数组整体进行操作,只能对数组元素进行操作; 3.注意数组下标范围不能越界; 4.下标可以是常量表达式,也可以是含变量的整型表达式; 如: 四、一维数组的初始化 (一)方法 1.使用赋值语句 如: a[2*i]=2*i; 2.定义时初始化 形式: 数据类型标识符 数组名[N]={值 1,值 2,.,值 N}; 如: int x[5]={3,4,7,8,10}; (二)注意事项 1.值的个数小于元素个数时,多余元素初始化为 0; 如: int x[5]={3,4,7}; 则:x[0]=3,x[1]=4,x[2]=7,x[3]=0, x[4]=0 2.可以对数组中的部分元素初始化; 注意: 定义时元 素个数不 能含变量 main() { int i, a[15]; for(i=0;i<7;i++) a[2*i]=2*i; /*合法引用*/ for(i=0;i<8;i++) a[2*i-1]=2*i*i-1; /*合法引用*/ printf(“%d”,a); /*非法引用*/ printf(“%d”,a[5]); /*合法引用*/ } 指出下列引用是是否合法:

第六讲数组及其应用NO.6-5如: int x[5]=(,4,,8,10]则:x[0]=0.x[1]=4.x[2=0.x[3]-8.x[4]-103.数组定义中的元素个数可以缺省;如:intx[1=(6.3.4.1.7.8.10)五、应用举例编程实现任意给20个数,按由小到大对其排序,并输出结果算法程序设计输入20个数据#includefor (i=0;in[i])(temp-n[]; n[]]=n[i]; n[]=temp;printf("In");for (i=1;i<20;i++)if(i%5-0)printf("In");printf("%10d",n[i])4.2多维数组二、 多维数组的定义(一)一般形式数据类型标识符数组名[e1][e2]..-(二)说明1.el、e2是整型常量表达式,2.多维数组的元素个数为el*e....3.每维数组的元素的下标从0开始;
第六讲 数组及其应用 NO.6-5 如: int x[5]={,4,8,10}; 则:x[0]=0,x[1]=4,x[2]=0,x[3]=8, x[4]=10 3.数组定义中的元素个数可以缺省; 如: int x[]={6,3,4,1,7,8,10}; 五、应用举例 编程实现任意给 20 个数,按由小到大对其排序,并输出结果 算法 程序设计 4.2 多维数组 一、多维数组的定义 (一)一般形式 数据类型标识符 数组名[e1][e2]. (二)说明 1. e1、e2 是整型常量表达式; 2.多维数组的元素个数为 e1*e2.; 3.每维数组的元素的下标从 0 开始; 输入 20 个数据 for (i=0;i main() { int i,n[20],temp; printf(“\n Enter 20 numbers:”); for (i=1;in[j]) {temp=n[i]; n[i]=n[j]; n[j]=temp;} printf(“\n”); for (i=1;i<20;i++) if (i%5==0) printf(“\n”); printf(“%10d”,n[i]) } } {

NO.6-6《C语言程序设计》教案4.维数组定义注意事项对多维数组也适应如: int x[2][3];元素六个:x[0][0],x[0][1],x[0][2] ,x[1][0],x[][1] ,x[1][2]floaty[2][3][4];有元素24个二、多维数组的存储形式方法:按下标顺序依次存放在内存的连续空间规律:右边的下标先变,左边的下标后变二维数组按先行后列的顺序存放x[01[0]x[0][1]如:intx[2][3];x[0][2]先存放:x[0][0], x[0][1] ,x[0][2] ,x[U[0]x[U[]再存放:x[1][0],x[1][1] ,x[1][2]x[1[2]区域首址:x或&x[0][0]三维数组float y[2][3][4];先存放:y[0][0][0], [0][0][]] ,y[0][0][2],y[][0][3]再存放y[0][1][0], y[0][][1] ,y[0][][2], y[0][][3]最后存放:y[][2][0],y[1][2][] ,y[1][2][2],y[][2][3]区域首址:y或&y[0][0][0]三、多维数组的引用(一)引用形式二维数组:数组名[expr1][expr2];三维数组:数组名[expr1][expr2][expr3](二)说明1.exprl、expr2、expr3是大于或等于0的整型表达式,2.下标中可以含有变量;指出下列引用是是否合法:int i j,z[4][10],a[4][5][7];3.只能对元素引用,不能对整体引用;z[4][10]4.注意下标越界问题:z[1][0],z[]],a[3][1][6]四、多维数组的初始化a[][2*i-1 ][i+3]
《C 语言程序设计》教案 NO.6-6 4.一维数组定义注意事项对多维数组也适应; 如:int x[2][3]; 元素六个:x[0][0], x[0][1] ,x[0][2] ,x[1][0], x[1][1] ,x[1][2] float y[2][3][4];有元素 24 个 二、多维数组的存储形式 方法:按下标顺序依次存放在内存的连续空间 规律:右边的下标先变,左边的下标后变 二维数组 按先行后列的顺序存放 如:int x[2][3]; 先存放:x[0][0], x[0][1] ,x[0][2] , 再存放:x[1][0], x[1][1] ,x[1][2] 区域首址:x 或&x[0][0] 三维数组 float y[2][3][4]; 先存放:y[0][0][0], y[0][0][1] ,y[0][0][2] , y[0][0][3] 再存放:y[0][1][0], y[0][1][1] ,y[0][1][2], y[0][1][3] . 最后存放: y[1][2][0], y[1][2][1] ,y[1][2][2], y[1][2][3] 区域首址:y 或&y[0][0][0] 三、多维数组的引用 (一)引用形式 二维数组: 数组名[expr1][expr2]; 三维数组: 数组名[expr1][expr2][expr3]; (二)说明 1.expr1、expr2、expr3 是大于或等于 0 的整型表达式; 2.下标中可以含有变量; 3.只能对元素引用,不能对整体引用; 4.注意下标越界问题; 四、多维数组的初始化 x[0][0] x[0][1] x[0][2] x[1][0] x[1][1] x[1][2] 指出下列引用是是否合法: int i,j,z[4][10],a[4][5][7]; z[4][10] z[1][0],z[i][j],a[3][1][6] a[i][2*i-1][j+3]

NO.6-7第六讲数组及其应用(一)方法说明:1.把初始值括在0中x[0][0]=1x[0][1]=3如:intx[2][3]={1,3,5,2,4,6];x[0][2]=5x[1][0]=2inty[2][3][4]=(1,2,3,4,5,6,7,8,9,10,11,12x[1][1]=4x[1][2]=613,14,15,16,17,18,19,20,21,22,23,2412.分解为多个一维数组如:二维数组a[2][3]分解为a[0] : a[0][0], a[0][1], a[0][2]说明a[1] : a[1][0] ,a[1][1] ,a[1][2]x[0][0]=]初始化:intx[2][3]={(1,3,5),(2,4,6]);x[1][0|=2(二)说明1.也可以只对部分元素初始化,缺省为0;如:intx[2[3]=1],(2])2.若初始化提供全部初值,第一个Ⅱ中#include的表达式可以缺省,其它不能缺省;main()如:intx[3]=((1,3,5),(2,4,6));1static int a[3][4]=( (1,2,3,4),五、应用举例(5,6,7,8)1.编程序计算二矩阵之积:C=A×B(9,10,11,12));static int b[4][3]-( (11,12,13],(111213(21,22,23),(1234)212223(31,32,33),若:A=5678B=(41,42,43));3132339101112int c[3][3];414243for (i=0i<3;i++)for (j=0;j<3:j++)算法:1c[][]=0;初始化a,bfor (k=0;k<4;k++)for (i=0:i<3;i++)c[][]+=a[][k]*b[k]];for (k=0;i<4;k++)1printf("In c:In");c[][]=0for (i=0;i<3;i++)for (i=0:j<3;j++)( for (i=0;j<3;j++)printf(%12d",c[]i])c[]][]+=a[i][k]*printf("n"),b[k]i]输出
第六讲 数组及其应用 NO.6-7 (一)方法 1.把初始值括在{}中 如:int x[2][3]={1,3,5,2,4,6}; int y[2][3][4]={1,2,3,4,5,6,7,8,9,10,11,12, 13,14,15,16,17,18,19,20,21,22,23,24}; 2.分解为多个一维数组 如: 二维数组 a[2][3]分解为: a[0] : a[0][0], a[0][1], a[0][2] a[1] : a[1][0] ,a[1][1] ,a[1][2] 初始化: int x[2][3]={{1,3,5},{2,4,6}}; (二)说明 1.也可以只对部分元素初始化,缺省为 0; 如:int x[2][3]={{1},{2}}; 2.若初始化提供全部初值,第一个[]中 的表达式可以缺省,其它不能缺省; 如:int x[][3]={{1,3,5},{2,4,6}}; 五、应用举例 1.编程序计算二矩阵之积: = × BAC 若: , ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎝ ⎛ = 12 11 10 9 8 7 6 5 4 3 2 1 A ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ = 43 42 41 33 32 13 23 22 12 13 12 11 B 算法: 说明: x[0][0]=1 x[0][1]=3 x[0][2]=5 x[1][0]=2 x[1][1]=4 x[1][2]=6 说明 x[0][0]=1 x[1][0]=2 #include main() { static int a[3][4]={{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; static int b[4][3]={ {11,12,13}, {21,22,23}, {31,32,33}, {41,42,43}}; int c[3][3]; for (i=0;i<3;i++) for (j=0;j<3;j++) { c[i][j]=0; for (k=0;k<4;k++) c[i][j]+=a[i][k]*b[k][j]; } printf(“\n c:\n”); for (i=0;i<3;i++) { for (j=0;j<3;j++) printf(“%12d”,c[i][j]); printf(“\n”); } } 初始化 a,b for (i=0;i<3;i++) for (j=0;j<3;j++) c[i][j]=0 for (k=0;i<4;k++) c[i][j]+=a[i][k]* b[k][j] 输出

NO.6-8《C语言程序设计》教案2.编程实现,把某年某月的某一天转化为该年的第几天算法:输入年月日#includemainO设置闰年标志leapyearday=daystatic int month_tab[2][13]((0,31,28,31,30,31,30,31,31,30,31,30,31),for (i=1;i<month;i++)(0,31,28,31,30,31,30,31,31,30,31,30,31));int year, month, day,yearday+=int yearday, leapmonth_tab[leap][i]printf("ln Enter year-month-day:");scanf(“%d%d%d"&year,&month,&day)leap=(year%4--0)&&(year%1001=0)(year%400--0));输出yeardayyearday=day,for (i=0;i<month;i++)yearday+=month_tab[leap][i];printf("yearday=%d"yearday)14.3字符型数组与字符串二、字符型数组的概念说明:1. 定义用来保存字符10”数据类型为char的数组2.说明(1)数组定义、引用和存储形式同前:(2)每个数组元素存放一个字符:(3)常用字符型数组来存放字符串:(4)定义数组时,元素个数比字符串位数多1二、字符型数组的初始化(一)方法1.用字符常量如char str[18]={T,h',,'s",'s"a',"'p','r',o',g,r"a",'m","o"];2. 用字符串常量如:charstr[18]=“Thisisaprogram”;
《C 语言程序设计》教案 NO.6-8 2.编程实现,把某年某月的某一天转化为该年的第几天 算法: 4.3 字符型数组与字符串 一、字符型数组的概念 1.定义 数据类型为 char 的数组 2.说明 (1)数组定义、引用和存储形式同前; (2)每个数组元素存放一个字符; (3)常用字符型数组来存放字符串; (4)定义数组时,元素个数比字符串位数多 1; 二、字符型数组的初始化 (一)方法 1.用字符常量 如:char str[18]={‘T’,’h’,’i’,’s’,’’,’i’,’s’,’’,’a’,’’,’p’,’r’,’o’,’g’,’r’, ‘a’,’m’,’\0’}; 2.用字符串常量 如:char str[18]=“This is a program”; 说明: 用来保存 字符’\0’ 输入年月日 设置闰年标志 leap yearday=day for (i=1;i main() { static int month_tab[2][13]= { {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,28,31,30,31,30,31,31,30,31,30,31}}; int year, month, day; int yearday, leap; printf(“\n Enter year-month-day:”); scanf(“%d %d %d”,&year,&month,&day); leap=((year%4==0)&&(year%100!=0)||(year%400==0)); yearday=day; for (i=0;i<month;i++) yearday+=month_tab[leap][i]; printf(“yearday=%d”,yearday); }

第六讲数组及其应用NO.6-9(二)注意事项1..若提供的字符个数多于元素个数,作为语法错误处理2.字符个数少于元素个数,多余的元素赋空格字符3.若用字符常量初始化,能否做字符串处理,关键是末位是否04.对二维字符数组可看作一维字符串数组如charstr[3][6]=("WANG","ZHANG",“SHEN"}三、字符型数组的输入输出(一)输入1.使用getharO和scanfO的%c格式如:charc[15];char c[15]for (i=0;(二)输出1.使用getharO和printfO的%c格式如:charc[15];char c[15]tfor (i=0;<15;i++)for (i=0;i<15;i++)putchar(c[i]);printf("%c",c[i);2.使用printf0的%s格式如:charc[15]=“program";printf("%s",c);四、应用举例编程实现将从键盘上输入的字符串小写变大写后输出
第六讲 数组及其应用 NO.6-9 (二)注意事项 1.若提供的字符个数多于元素个数,作为语法错误处理; 2.字符个数少于元素个数,多余的元素赋空格字符; 3.若用字符常量初始化,能否做字符串处理,关键是末位是否’\0’ 4.对二维字符数组可看作一维字符串数组; 如:char str[3][6]={“WANG”, “ZHANG ”, “SHEN”}; 三、字符型数组的输入输出 (一)输入 1.使用 gethar()和 scanf()的%c 格式 如:char c[15]; char c[15] for (i=0;i (二)输出 1.使用 gethar()和 printf()的%c 格式 如:char c[15]; char c[15] . . for (i=0;i<15;i++) for (i=0;i<15;i++) putchar(c[i]); printf(“%c”,c[i]); 2.使用 printf()的%s 格式 如: char c[15]= “program”; printf(“%s”,c); 四、应用举例 编程实现将从键盘上输入的字符串小写变大写后输出

NO.6-10《C语言程序设计》教案算法:输入一字符串#include main()while(str[i]l="0")char str[25];将小写字母转为大写int i,printf("ln Entera string:");scanf("%s",str),i++i=0,输出字符串while (str[i]="10")1if(str[]>=a'&&str[]<-'z)str[i]--'a'+'A”i++,printf(ln %s",str);3自学内容:教材P119-4.4.2小结1.一维数组(1)定义(2)存储形式(3)引用(4)初始化2.多维数组(1)定义(2)存储形式(3)引用(4)初始化3.字符型数组与字符串独立作业题1.什么是数组?什么是一维数组?多维数组?字符型数组?2.定义数组时应注意哪些问题?
《C 语言程序设计》教案 NO.6-10 算法: 自学内容: 教材 P119-4.4.2 小 结 1.一维数组 (1)定义 (2)存储形式 (3)引用 (4)初始化 2.多维数组 (1)定义 (2)存储形式 (3)引用 (4)初始化 3.字符型数组与字符串 独立作业题 1.什么是数组?什么是一维数组?多维数组?字符型数组? 2.定义数组时应注意哪些问题? 输入一字符串 while (str[i]!=’\0’) 将小写字母转为大写 i++; 输出字符串 #include main() char str[25]; int i; printf(“\n Enter a string:”); scanf(“%s”,str); i=0; while (str[i]!=’\0’) if (str[i]>=’a’&&str[i]<=’z’) str[i]-=’a’+’A’; i++; } printf(“\n %s”,str); } { {

NO.6-11第六讲数组及其应用3.引用数组时,应注意哪些问题?4.如何对数组进行初始化?5.数组在计算机内存中的存储形式如何?6.字符型数组的输入输出方法有哪些?7教材P122-思考与练习1.2.(2)3.7.15上机与实做1.输入教材P120-例4.10程序并运行,看输出结果;2.输入教材P122-练习15.程序并运行,看输出结果与你的读程结果是否一致;3.把作业中要求编程的题在计算机上运行;
第六讲 数组及其应用 NO.6-11 3. 引用数组时,应注意哪些问题? 4. 如何对数组进行初始化? 5. 数组在计算机内存中的存储形式如何? 6. 字符型数组的输入输出方法有哪些? 7.教材 P122-思考与练习 1. 2.(2) 3. 7. 15. 上机与实做 1.输入教材 P120-例 4.10 程序并运行,看输出结果; 2.输入教材 P122-练习 15.程序并运行,看输出结果与你的读程结果 是否一致; 3.把作业中要求编程的题在计算机上运行;