内容正文:
专题7:一维数组的定义和使用(讲义)
《编程语言基础—C语言》专题复习讲练测
[考纲要求]
1:掌握一维数组的定义方法。
2:掌握一维数组元素的引用格式和方法。
3:掌握一维数组初始化的多种方法。
4:掌握一维数组在程序设计中的实际应用。
[课时安排]
2课时
[知识梳理]
1、一维数组的定义
(1)认识“数组”
· 数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。
· 用数组名和下标即可唯一地确定数组中的元素。
· 数组中的每一个元素都属于同一个数据类型。
(2)一维数组的定义方式为:
类型说明符 数组名[常量表达式];
例:
①int a[10];//数组名为a,有10个int型元素
②double scores[50*2];//数组名为scores,有100个double型元素
(3)定义数组的相关知识
数组名的命名规则和变量名相同,遵循标识符命名规则。
在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。
常量表达式中可以包括常量和符号常量,不能包含变量。
数组元素的下标从0开始,用“int a[10];”定义数组,则最大下标值为9,不存在数组元素a[10]。
定义数组时,C语言分配足够的内存来存放所有元素,并且这些元素在内存中是连续存放的,数组名本身表示内存的首地址。
2、一维数组元素的引用
(1)概述
数组定义后即可使用。C语言规定只能逐个引用数组元素,而不能一次引用整个数组。数组元素与一个简单变量的地位和作用相似。
(2)数组元素的表现形式为:
数组名[下标];//下标可以是整型常量或整型表达式
例:
int a [10 ];//10个元素的下标如下所示
(3)注意:
定义数组时用到的“数组名[常量表达式]” 和引用数组元素时用的“数组名[下标]”形式相同,但含义不同。
int a[10];
//前面有int,这是定义数组,指定数组包含10个元素
t=a[6];
//这里的a[6]表示引用a数组中序号为6的元素
(4)举例应用
例题:对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。
3、一维数组的初始化
数组的初始化实际上是对数组元素的初始化,C语言允许多种方式实现初始化。
(1)在定义数组时对全部数组元素赋予初值
int a[10]={0,1,2,3,4,5,6,7,8,9};
将数组中各元素的初值顺序放在一对花括号内,数据间用逗号分隔。花括号内的数据就称为“初始化列表”。
(2)可以只给数组中的一部分元素赋值。
int a[10]={0,1,2,3,4};
定义a数组有10个元素,但花括号内只提供5个初值,这表示只给前面5个元素赋初值,系统自动给后5个元素赋初值为0。
(3)给数组中全部元素赋初值为0。
int a[10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
或int a[10]={0}; //未赋值的部分元素自动设定为0
(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。
int a[5]={1,2,3,4,5};
int a[ ]={1,2,3,4,5};
但是,如果数组长度与提供初值的个数不相同,则方括号中的数组长度不能省略。
4、一维数组的应用
例1:用数组来处理求Fibonacci数列问题。输出Fibonacci数列的前20个数。
分析:可以定义一个长度为20的整型数组a用于存储序列的前20个数。根据Fibonacci数列的规律(每个数等于前面两个数之和),即a[i]=a[i-1]+a[i-2],可以求出每个元素的值。
#include <stdio.h>
int main()
{
int i;
int f[20]={1,1};
//对最前面两个元素f[0]和f[1]赋初值1
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
//先后求出f[2]~f[19]的值
for(i=0;i<20;i++)
{
if(i%5==0) printf("
");
//控制每输出5个数后换行
printf("%12d",f[i]);
//输出一个数
}
printf("
");
}
例2:有10个地区的面积,要求对它们按由小到大的顺序排列。
[真题练讲]
1.(2008年湖南高考真题)程序分析题。
#include <stdio.h>
main()
{ int n=132,i=1,j,k,b[10];
while(n!=0)
{ j=n%6;b[i]=j;
n=n/6;i=i+1; }
for (k=i-1;k>0;k--)
printf("%d",b[k]);}
程序的功能是____________。
【答案】将十进制数132转换成六进制数。
2.(2009年湖南高考真题)运行程序时,若输入52<回车>,则下面程序的运行结果是:___________。
#include "stdio.h"
main()
{int a[8]={6,12,18,42,44,52,67,94};low=0,mid,high=7,x,found=0;
scanf("%d",&x);
while(low<=high && found==0)
{mid=(low+high)/2;
if(x>a[mid]) low=mid+1;
else if(x<a[mid]) high=mid-1;
else {found=1;break;}
}
if(found==1)
printf("find successful! the index is:%d",mid);
else printf("can't search
");
}
【答案】find successful! the index is:5
3.(2018年湖南高考真题)阅读程序,写出运行结果:___________。
#include <conio.h>
#include <stdio.h>
int main( )
{
int a[20],i,m=10,k=8;
for(i=0;m>0;i++){
a[i]=m%k;
m/=k;
}
for(i--;i>=0;i--)
printf("%d", a[i]);
getch();
}
【答案】12
4.(2020年湖南高考真题)7个待测样本中有且仅有一个样本指标超标,为了找到这唯一超标样本,采用3个检测试剂盒进行检测。方法如下:把7个样本按1,2,3,…,7进行编号,并将其编号转换为相应的3位二进制数;把可重复使用的3个检测试剂盒进行编号,分别对应3位二进制数的每一位;如果样本编号3位二进制中的某位为1,就用相应二进制位(编号)的试剂盒进行检测;按上述方法对每一个待测样本进行检测;最后,检测为阳性(设定值为1)试剂盒编号组成的二进制数就是超标样本的编号。下面程序功能就是完成上述检测方法并输出超标样本编号,即:“fag=7”。请补充完整。
#include <stdio.h>
main()
{int sample[8]={0,0,0,0,0,0,0,1};
/*样本编号,第7个数值为1表明其超标*/
int test[3]={0};/*检测试剂盒编号,test[0]对应二进制的最低位,test[2]对应最高位*/
int i,j,k,base=1,flag=0;
for(i=1;i<=7;i++){
________①________;
j=0;
while(______②______){
if(k%2==1)
test[j]=test[j]||sample[i];
________③_________;
j++; } }
for(i=0;i<3;i++){
flag += test[i]*base;
_______④_______; }
printf("flag= %d",flag); }
【答案】①k=i ②k ③k=k/2 ④base*=2 或 base=base*2
5.(2020年湖南高考真题)阅读程序,写出运行结果:___________。
#include <conio.h>
#include <stdio.h>
main()
{
int a[]={118,65,128} ;
int i;
for(i=0;i<3;i++)
printf("%c",(a[i])&(a[i]-1)?'N':'Y');
getch();
}
【答案】NNY
6.(2020年湖南高考真题)阅读程序,写出运行结果:___________。
#include <conio.h>
#include <stdio.h>
main(){
int a[]={89,88,76,70,68,58};
int x=70, mid,pos=-1,find=0,low=0,high=5;
while (!find && low<=high){
mid=(high+low)/2 ;
if(x>a[mid])
high=mid-1 ;
else if(x<a[mid])
low=mid+1;
else{
pos=mid;
find=1;
}}
printf("pos=%d
",pos);
getch();
}
【答案】pos=3
7.(2022年湖南高考真题)阅读程序,写出运行结果:___________。
#include <conio.h>
#include <stdio.h>
main()
{int a[]={12,34,54,32};
int N=sizeof(a)/sizeof(int);
int i,j,p,t;
for(i=0;i<N-1;i++){
p=i;
for(j=i+1;j<N;j++)
if(a[p]>a[j])
p=j;
if(p!=i){
t=a[i];a[i]=a[p];a[p]=t;
}}
for(i=0;i<N;i++)
printf("%d+",a[i]);
getch();
}
【答案】12+32+34+54+
8.(2022年湖南高考真题)程序改错题。下列程序的功能是:从已经排好序的数组中,找出首次满足其和等于给定值的两个数后,即终止查找。程序执行的结果是:“1, 15”。 以下程序只允许修改三行。
L1 #include "stdio.h"
L2 main ()
L3 {
L4 int a[]={1,2,4,5,7,11,12,15};
L5 int sum=16;
L6 int begin=1;
L7 int end=8-1;
L8 while(begin<end){
L9 long currSum;
L10 if(currSum==sum){
L11 printf("%d,%d
",a[begin],a[end]);
L12 continue;
L13 }
L14 else{
L15 if(currSum<sum)
L16 begin++;
L17 else
L18 end--;
L19 }
L20 }
L21 }
【答案】(1) L6 int begin=0;
(2) L9 long currSum=score[begin]+score[end];
(3) L12 break;
[限时练习]
1.(2019年湖南三轮联考题)阅读程序,写出运行结果:___________。
#include <conio.h>
#include <stdio.h>
int main()
{
int a[5]={0};
int i, b[10]={1,2,1,3,2,4,2,1,3,1};
for(i=0;i<5;i++)
a[b[i]]++;
for(i=0;i<5;i++)
printf( "% d",a[i]);
getch(); }
【答案】 0 2 2 1 0
2.(2020年湖南三轮联考题)阅读程序,写出运行结果:___________。
#include <conio.h>
#include <stdio.h>
int main()
{
int i,k,a[10],p[3];
k=5;
for(i=0;i<10;i++)
a[i]=i;
for(i=0;i<3;i++)
p[i]=a[i*(i+1)];
for(i=0;i<3;i++)
k+=p[i] *2;
printf( "%d
",k);
getch(); }
【答案】 21
3.(2016年湖南二轮联考题)阅读程序,运行时输入10,写出运行结果:___________。
#include <conio.h>
#include <stdio.h>
int main()
{
int x,i;
int a[10];
scanf("% d",&x);
for(i=0;x;i++)
{ a[i]=x%2;
x/=2;
}
for(--i;i>=0;i--)
printf( "%d",a[i]);
getch(); }
【答案】 -1-100
4.(2017年湖南三轮联考题)程序改错题。在一个已按升序排列的数组中插入一个数,插入后数组元素仍按升序排列。请改正程序中两处错误,使程序能得到正确的运行结果。
L1 #define N 11
L2 #include <stdio.h>
L3 main()
L4 {int i,j,t,number ,a[N]={1,2,4,6,8,9,12,15,149,156};
L5 printf("please enter an integer to insert in the array:n");
L6 scanf("% d",&number);
L7 printf( "The original array: n");
L8 for(i=0;i<N-1;i++)
L9 printf( "%5d",a[i]);
L10 printf("
");
L11 for(i=N-1;i>=0;i--)
L12 if( number<a[i])
L13 a[i]=a[i+1];
L14 else
L15 {a[i+1]=number;
L16 break; }
L17 if( number<a[0])a[0]=number;
L18 printf( "The result array:
");
L19 for(i=0;i<N;i++)
L20 printf("% 5d",a[i]);
L21 printf("
");
L22 }
【答案】
(1) L13 a[i+1]=a[i];
(2) L16 continue; }
5.(2017年湖南二轮联考题)程序改错题。用起泡法对n个整数进行从小到大排序。下列程序中共有三条错误语句,请改正错误。
L1 #include <stdio.h>
L2 void sort( int x,int n)
L3 { int i,j,k,t;
L4 for(i=0;i<n-1;i++)
L5 for(j=0;j<n-i;j++)
L6 if(x[j]<x[j+1])
L7 {t=x[j];x[j]=x[j+1];x[j+1]=t;|}
L8 }
L9 main( )
L10 {int i,n,a[100];
L11 printf( "please input the length of the array:
");
L12 scanf( "% d",&n);
L13 for(i=0;i<n;i++)
L14 scanf( "% d" ,&a[i]);
L15 sort(a,n);
L16 printf( " output the sorted array:
");
LI7 for(i=0;i<=n-1;i++)
L18 printf("% 5d",a[i]);
L19 printf("
");
L20}
【答案】 (1) L2 void sort( int x[ ],int n) (2) L5 for(j=0;j<n-i-1;j++)
(3) L6 if(x[j]>x[j+1])
6.(2019年湖南三轮联考题)程序改错题。用随机函数产生 100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6, 7,8,9,0的数的个数,即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]..…个位是0的个数存放在x[10]中,并打印出来。以下程序只允许修改两行。
L1 void main( )
L2 { int a[101],x[11],i,p;
L3 for(i=0;i<11;i++)
L4 x[i]=0;
L5 for(i=1;i<=100;i++)
L6 { a[i]=rand( )/100;
L7 printf("%4d",a[i]);
L8 if(i%10==0) printf("
");}
L9 for(i=1;i<=100;i++)
L10 {p=a[i]%10;
L11 if(p==0)p=10;
L12 x[p++];}
L13 for(i=1;i<=10;i++)
L14 { p=i;
L15 if(i==10)p=0;
L16 printf("% d,%d
",p,x[i]);}
L17}
【答案】
(1) L6 { a[i]=rand( )%10;
(2) L12 x[p]++;}
7.(2020年湖南三轮联考题)程序改错题。下列程序的功能是使用冒泡法对输入的10个浮点数从小到大进行排序,排好序的10个数分两行输出。以下程序只允许修改三行。
L1 #include<stdio.h>
L2 main( )
L3 {float a[10],x;
L4 int i,j;
L5 printf( "Input 10 numbers please
");
L6 for(i=0;i<=9;i++)
L7 scanf( "% f",&a[i]);
L8 printf("
");
L9 for(i=2;i<=10;i++)
L10 for(j=0;j<=9-i;j++)
L11 if(a[j]<a[j+1])
L12 { x=a[j];
L13 a[j+1]=a[j];
L14 a[j+1]=x;}
L15 printf( "The sorted 10 numbers;
");
L16 for(i=0;i<=9;i++)
L17 { if(i%5==0)
L18 printf("
");
L19 printf( "%f\t" ,a[i]);}
L20 printf("
");}
【答案】 (1) L9 for(i=2;i<10;i++) (2) L11 if(a[j]>a[j+1])
(3) L13 a[j]=a[j+1];
8.(2020年湖南三轮联考题)程序填空题。将一个数组中的值按逆序重新存放。例如,原来顺序为“1,2,3,4,5,6, 7”,要求改为“7,6,5,4,3,2,1”。请补全程序。
#include<stdio.h>
________(1)_________
void main( )
{ inta[N]={0};
int i,temp;
printf("请输入一维数组的元素值
");
for(i=0;i<N;i++)
scanf("% d" ,&a[i]);
for(_______(2)_________ i++)
{ temp=a[N-1-i];
a[N-1-i]=a[i];
a[i]=temp;
}
for(i=0;i<N;i++)
printf( "%4d
",a[i]);
}
【答案】 (1)#define N 7
(2)i=0;i<7/2;
9.(2016年湖南二轮联考题)程序填空题。下列程序是在一个升序数组中利用折半查找法查找一个数组中是否存在某数,请填空。
#include <stdio.h>
int fun(int a[ ] ,int n,int x)
{ int i,j,m;
i=0;
j=n-1;
m=_____(1)______;
while(i<=j)
if(_____(2)______)
return 1;
if(______(3)______)
j=m-1;
else i=m+1;
m=(i+j)/2;}
return 0;
}
int main( )
{ int a [ ]={22,33 ,55 ,66,11,88,99} ,x;
scanf("% d",&x);
if(fun(a,7,x))
printf("存在");
else printf("不存在");
}
【答案】 (1)(i+j)/2 (2)x==a[m] (3)x<a[m]
10.(2021年湖南一轮联考题)阅读程序,写出运行结果:___________。
#include <conio.h>
#include <stdio.h>
int main( )
{
int s[12]={1,2,3,4,4,3,2,1,1,1,2,3},c[5]={0},i;
for(i=0;i<12;i++)
c[s[i]]++;
for(i=1;i<5;i++)
printf("%d",c[i]);
getch(); }
【答案】 4332
[内容小结]
一、定义一维数组
格式为:数据类型 数组名[数组长度];,例如int arr[5];,这里int是数据类型,arr是数组名,5是数组长度,表示该数组能存储5个int类型的数据。
二、引用一维数组元素
通过数组名[下标]的形式来引用数组元素,下标从0开始。比如对于数组int arr[5];,arr[0]表示第一个元素,arr[4]表示第五个元素。
三、一维数组的初始化
• 全部初始化:如int arr[5] = {1, 2, 3, 4, 5};,将1到5依次赋给arr[0]到arr[4]。
• 部分初始化:如int arr[5] = {1, 2};,此时arr[0] = 1,arr[1] = 2,其余元素(arr[2]、arr[3]、arr[4])自动初始化为0。
• 省略长度初始化:如int arr[] = {1, 2, 3, 4, 5};,系统会根据初始化元素的个数,自动确定数组长度为5。
四、一维数组实际应用举例
比如要统计一个班级5名同学的成绩,并计算平均分。可定义一个int型数组scores[5]存储成绩,然后通过循环输入成绩,再求和计算平均分。
学科网(北京)股份有限公司
$