还剩9页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第章数组6第一单元学习指南本章教学目标
1.掌握一维数组和二维数组的定义与引用;深刻理解数组的特点和优势;理解处理二维数组时行优先顺序与列优先顺序的区别
2.掌握擂台法、选择法排序、数组平移、统计整数个数等典型算法
3.学会用一维数组和二维数组编写一般难度的批量数据处理程序,并能上机调试运行学习方法建议
1.着重研究实用的常规程序,避免研究实用性不强、稀奇古怪的非常规程序
2.仔细阅读本章示例程序,正确理解每条语句的功能,尤其是引用数组元素的语句;着手编写一般难度的数组应用程序在编写程序时,按照从局部到整体、从具体到一般的原则,逐步构造出程序例如,在编写选择法排序程序时,首先写出求n个数中最大数的单重循环,再写出求n个数中的第二大数的单重循环,依次类推,直至写出求n个数中第n-1大数的单重循环;最后再将这n-1个单重循环合并为一个双重循环
3.上机调试运行本章示例程序,并调试运行自己编写的程序,进一步体会数组处理语句的功能fori=l;i=10;i++,scanf%d”a[i];也是错误的应改为int a
[10]i;zfori=0;i=9;i++,scanf%d”a[i];
5.给数组元素整体赋值只能在初始化时给数组元素整体赋值,而不能在一般赋值语句中给数组元素整体赋值例如:;int a
[10]a
[10]={l,2,3,4,5,6,7,8,9,10};是错误的因为此处的a
[10]看作是一个数组元素,同时也存在下标越界的问题又例如;int a
[10]a={l,2,3,4,5,6,7,8,9,10;也是错误的因为按照C语言的语法规定,此处的数组名a是地址常量,故不能进行赋值正确的写法应该是int a
[10]={1,2,3,4,5,6,7,8,9,10};
6.输入数组元素的值不正确在C语言中,通常采用单重循环来输入一维数组元素的值例如int a
[10],i;,scanf%d”a[i];是错误的因为此处的变量i未赋值,故运行时将会出错不过,即使变量i已经赋值,也只能输入一个数组元素的值,而不会输入全部数组元素的值又例如int a
[10];n nscanf%d,a;也是错误的因为此处试图用一条scanf语句给整个数组输入数据,也是不可行的正确的写法应该是int a
[10]i;zfori=0;i10;i++,scanf%d”a[i];
7.输出数组元素不正确在C语言中,通常采用单重循环来输出一维数组元素的值例如int a
[10]={l,2,3,4,5,6,7,8,9,10},i;n nprintf%d a[i];z是错误的因为此处的变量i未赋值,故运行时将会出错不过,即使变量i已经赋值,也只能输出一个数组元素的值,而不会输出全部数组元素的值又例如int a
[10]={l,2,3,4,5,6,7,8,9,10},i;printf%d,a;也是错误的因为此处试图用一条printf语句将整个数组数据输出,也是不可行的正确的写法应该是int a
[10]={l,2,3,4,5,6,7,8,9,10},i;for i=0;i10;i++,nprintf%d”a[i];
4.对于语法错误,采取与前面相同的应对措施着重检查是否误将实型数据用作数组的下标
5.对于逻辑错误,着重检查循环中对数组元素的处理是否正确在定位出错位置时,可以在循环体中添加临时性的输出语句,用来输出相关数组元素的值,对比观察这些元素值的变化是否符合预期
6.记录总结在调试程序的过程中发现的错误以及改正的方法,不断积累编写数组应用程序的直接经验第二单元重点与难点解析
1.使用数组有什么优势?【解析】数组是一组类型相同的数据的集合,使用数组的优势就是便于使用循环结构处理大批量的数据
2.在什么情况下需要使用数组?【解析】在程序中有大批量性质相同的数据需要存储时比如超过5个,就可以考虑使用数组
3.定义数组时其长度可以是变量吗?【解析】从C99标准后可以了,在以前的标准如C89中是不可以的如下面的程序在支持C99标准的Dev-C++
5.11中是可以运行的,但在不支持C99标准的VC++
6.0中是错误的【示例6-1]#include stdio.h intmain{int n,i;printf请输入n的值100:\n〃;scanf〃%d〃,n;int a[n];〃请注意此行代码for i=0;in;i++{a[i]=i;〃赋值printf〃a[%ld]=%d\n〃,i,a[i];//输出}return0;图6-1是在VC++
6.0中编译时出现的错误error C2143syntax errormissing before1tyerrorC2065aundeclared identifiersubscriptrequires arrayor pointerterror C2109二‘left operandmust be1-value subscripterror C2106requires arrayor pointerterrorC2109图6-1【木例程序6-1]在VC++
6.0中的运行结果味输入的值n«100图6-2【示例程序6-1]在dev-C++
5.11中的运行结果
4.在什么情况下,定义数组时可以省略数组的长度?【解析】对于一维数组,如果在定义时进行了初始化,而且赋值个数与数组的长度相等,此时可以不指定数组的长度例如,int a[]={l,2,3,4,5;此时,系统可以自动判断出数组的长度是5oo对于二维数组,在初始化时行数可以缺省,但列数不能缺省例如,int a[]
[3]={{l,2,3},{4,5,6}};此时,系统可以按照初值的个数来确定二维数组的行数是
25.如果希望数组元素的下标从1到10而不是从0到9该如何办呢?【解析】将数组的长度定义为11即可,如inta[ll]这样就可以使用a⑴到a
[10]这10个元素啦,当然a
[0]有点浪费,尽量还是使用a
[0]到a
[9]更加符合C语言的习惯
6.考虑到程序的通用性,数组的大小有可能需要改变,是不是使用符号常量来表示数组的大小比较方便呢?【解析】是的正如下面的程序所示,如果需要改变数组的大小,只需要修改宏定义命令#define N10,程序中凡是使用N的语句自动就会改好,真的是很方便【示例6-2]#include stdio.httdefine N10〃宏定义Nint main{int a[N],i;fori=0;i=N-l;i++//第5行{a[i]=2*i+l;printf〃a[%d]=%d\t〃,i,a[i];}return0;运行结果如下所示a[O]=l a[l]=3a
[2]=5a
[3]=7a
[4]=9a
[5]=ll a
[6]=13a
[7]=15a
[8]=17a
[9]=19012nJnJnJ
7.c语言对数组的下标会进行越界检查吗?如果越界了,会怎样?【解析】c语言对数组的下标不会进行越界检查,如果越界了会出现不可预知的结果比如在【示例6-2】中,如果把第5行中for语句中的i〈二N-1误写成i〈=N,a
[10]的值可能不是21而是一个很大的数,如下所示a
[0]=l a[l]=3a
[2]=5a
[3]=7a
[4]=9a
[5]=ll a
[6]=13a
[7]=15a
[8]=17a
[9]=19a
[21]=6356820【注意】a
[10]的值是个随机的数,因为我们没有给它赋过值所以使用数组时一定注意不能越界引用数组元素
8.表达式sizeof a/sizeof a
[0]能计算出数组a的长度吗?【解析】是的因为sizeof a的值是数组a所占的总字节数,而sizeof a
[0]是数组元素a
[0]所占的字节数,两者相除的商自然是数组的长度
9.如何将一个数组的值全部复制到另一个数组中?【解析】一般是一个元素一个元素地赋值,从而实现整个数组的复制【示例6-3]ttinclude stdio.h^define N10〃宏定义Nint main{int a[N],b[N],i;for i=0;iN;i++{a[i]=2*i+l;printf Cza[%d]=%d\t,z,i,a[i];//输出printf〃\n〃;〃换行输出数组b的元素值fori=0;iN;i++{b[i]=a[i];〃将数组a的元素值逐个赋给数组b相应元素printf,b[%d]=%d\t,/,i,b[i];//输出return0;运行结果如下所示a
[0]=l a[l]=3a
[2]=5a
[3]=7a
[4]=9a
[5]=ll a
[6]=13a
[7]=15a
[8]=17a
[9]=19b
[0]=l b[l]=3b⑵=5b
[3]=7b
[4]=9b
[5]=ll b
[6]=13b
[7]=15b
[8]=17b
[9]=19可以看到已经将数组a的元素值全部复制给了数组b
10.函数memcpy的作用是什么?如何使用?【解析】merncpy是内存拷贝函数,功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中例如memcpyb,a,sizeof a的作用是将数组a的内容复制到数组b中使用此函数时应包含头文件〈string.h【示例6-4]#include stdio.h#include string.h^define N10〃宏定义Nint main{int a[N],b[N],i;fori=0;iN;i++{a[i]=2*i+l;printf//a[%d]=%d\t//,i,a[i];//输出memcpyb,a,sizeof a;〃将数组a的内容复制到数组bprintf〃\n〃;〃换行输出数组b的元素值fori=0;iN;i++printf z/b[%d]=%d\tz,,i,b[i];〃输出return0;}运行结果同【示例6-31的运行结果
11.数组元素a[i][j]可以写成a[i,j]吗【解析】不可以因为i,j是一个逗号表达式,它的结果是j,所以a[i,j]在c语言中会认为是是j]O
12.如何把两个一维数组中的数据合并到一个数组中?【解析】可以使用逐个元素赋值的方法比如将数组a与b的元素值合并到数组c中,首先使用函数memcpy将数组a的元素值全部复制到数组c中,然后把数组b中的元素逐个复制到数组c中【示例6-5]ttinclude stdio.h^include string.h〃包含函数memcpy4define M5〃数组a的大小ttdefine N6〃数组b的大小int mainvoid{int aEM{l,2,3,4,5},b[N]={6,7,8,9,10,11};int c[M+N],i,len;memcpy c,a,sizeof a;//将数组a的内容复制到数组c中len=sizeof a/sizeof a
[0];〃计算数组a的元素个数for i=0;iN;i++c[len+i]=b[i];〃将数组b的元素逐个复制到数组c中原有元素之后for i=0;isizeof c/sizeof c[Oj;i++//输出数组c的内容printf z,c[%d]=%d\t,z,i,c[i];return0;运行结果如下所示c[O]=l c
[1]=2c
[2]=3c
[3]=4c
[4]=5c
[5]=6c
[6]=7c
[7]=8c
[8]=9c
[9]=10c
[10]=ll
13.如何在数组中查找某个数?【解析】可以使用最简单的顺序查找法,即逐个元素与要查找的数进行比较如果两个数相等,则认为找到了;如果一直比对到最后一个元素都没有相等的,则认为没有找到请参考【示例6-61o【示例6-6源程序如下】#include stdio.httdefine N10〃数组a的大小int mainvoid{int a[N]={l,2,3,4,5,6,7,8,9,10};int i,num;printf〃请输入要查找的数num:\n〃;scanf〃%d〃,num;fori=0;iN;i++//顺序查找ifnum-a[i]〃如果找到了就结束循环break;if i==N〃表示没有找到要查找的数numprintf查无此数!〃;elseprintf〃您要查找的数%d是该数组中的第%€1个数\n〃,num,i;return0;}运行结果如下所示1请输入要查找的数num:7您要查找的数7是该数组中的第6个数2请输入要查找的数num:99查无此数!
14.如何在一个已经排好序的数组中再插入一个数,而且插入后仍然是有序的?【解析】第一步,首先定位,也就是寻找要插入的位置;第二步,移动元素,将该位置空出来;第三步,插入该元素最后元素总个数加1,请参考【示例6-71【示例6-7源程序如下】ttinclude stdio.h^define N11〃数组a的大小int mainvoid{int a[N]={l,3,5,7,9,11,13,15,17,19;int i,j,num;printf〃插入前数据如下\n〃;fori=0;iN-l;i++printf/z%d〃,a[i];printf〃\n〃;printf〃请输入要插入的数num:\n〃;scanf〃%d〃,num;for i=0;iN-l;i++〃定位i fnuma[i]〃如果找到了合适位置就停止查找break;forj=N-l;ji;j—〃移位,将后边的元素依次往后移动一位a[j]=a[j-l];a[i]=num;〃插入数据printf〃插入后数据如下\n〃;for i=0;iN;i++printf〃%d〃,a[i];return0;}运行结果如下所示插入前数据如下135791113151719请输入要插入的数num:2插入后数据如下1235791113151719【说明】对于插入的数小于第一个数及大于最后一个数的情况,以及与原数组中某个数相等的情况,程序也是正确的
15.如何删除数组中的某个数?【解析】第一步,查找该数请参考第12个问题;第二步,将其后面的元素依次前移覆盖该数,即可达到删除该数的目的,最后将元素总个数减1,请参考【示例6-81【示例6-8源程序如下#include stdio.httdefine N10〃数组a的大小int mainvoid{int a[N]={l,3,5,7,9,11,13,15,17,19;int i,j,num;printf删除前数据如下\n〃;for i=0;iN;i++printf〃%d〃,a[i];printf〃\n〃;printf〃请输入要删除的数num:\n〃;scanf〃%d〃,num;for i=0;iN;i++//定位ifnum=a[i]〃如果找到了欲删除的数就停止查找break;ifiN〃欲删除的数据找到了{forj=ijN-l;j++//移位,将后边的元素依次往前移动一位a[j]=a[j+l];printf〃删除后数据如下\n〃;for i=0;iN-l;i++//数据总个数减1printf〃%d〃,a[i];}else〃没找到欲删除的数printf〃抱歉,没有找到您欲删除的数!\n〃;return0;}运行结果如下所示1删除了某个数的运行情况删除前数据如下I35791113151719请输入要删除的数num:II删除后数据如下13579131517192欲删除的数据没有找到的情况删除前数据如下135791113151719请输入要删除的数num:999抱歉,没有找到您欲删除的数!
16.为什么通常用外循环控制行号,用内循环控制列号?【解析】因为c语言的数组是按照行优先的顺序来存放数据的,所以处理数组中的数据时一般也是按照行的顺序来进行的,即先行后列,所以通常用外循环控制行号,用内循环控制列号第三单元典型错误解析
1.定义数组时,数组名与其他变量同名在同一个作用域中,数组名不能与其他变量同名例如int a,b,a
[10],b
[10];将导致语法错误可改为int x,y,a
[10]b
[10];z
2.定义数组时,未指定数组的长度定义数组时,必须指定数组的长度否则,将导致编译系统无法为数组分配内存单元只有在以下两种情况下可以不指定数组长度1在定义数组的同时给数组赋初值,即初始化数组时;2数组名用作形参时例如int a[];是错误的可改为int a
[100];
3.定义动态数组在C语言中,不允许定义动态数组即数组的长度不能是变量或含有变量的表达式b例如int n=30;表示数组长度的表达式中,不能包含变量int a[n];/**/是错误的应改为int a
[30];
[10];/*a
[0],a[l]a
[9]*/;a
[10]=60是错误的应改为int a
[11];;a
[10]=60又例如int a
[10],i;。
个人认证
优秀文档
获得点赞 0