知识点汇总及必练习题:数组
2.6、数组
数组的声明并不是声明一个个单独的变量,比如number0、number1、...、number99,而是声明一个数组变量,比如numbers,然后使用numbers[0]、numbers[1]、...、numbers[99]来代表一个个单独的变量。数组中的特定元素可以通过索引访问。
数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
2.6.1 声明数组
在C 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:
type arrayName [ arraySize ];
这叫做一维数组。arraySize必须是一个大于零的整数常量,type可以是任意有效的C数据类型。例如,要声明一个类型为double的包含 10个元素的数组balance,声明语句如下:
double balance[10];
现在balance是一个可用的数组,可以容纳10个类型为 double 的数字。
2.6.2 初始化数组
在C中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
大括号{ } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。
如果您省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果:
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
您将创建一个数组,它与前一个实例中所创建的数组是完全相同的。下面是一个为数组中某个元素赋值的实例:
balance[4] = 50.0;
2.6.3 访问数组
数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。例如:
double salary = balance[9];
上面的语句将把数组中第10个元素的值赋给salary变量。下面的实例使用了上述的三个概念,即,声明数组、数组赋值、访问数组:
#include <stdio.h>
int main ( )
{
int n[ 10 ]; /* n 是一个包含 10 个整数的数组 */
int i,j;
/* 初始化数组元素 */
for ( i = 0; i < 10; i++ )
{
n[ i ] = i + 100; /* 设置元素 i 为 i + 100 */
}
/* 输出数组中每个元素的值 */
for (j = 0; j < 10; j++ )
{
printf("Element[%d] = %d\n", j, n[j] );
}
return 0;
}
结果
Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
查看本章更多知识点
https://www.nowcoder.com/tutorial/10002/1ed43c516adf4c60b5e4cc92d6c7d09b?from=Ccz
2.6.4习题库
【习题1】逆序输出
题目描述
输入10个整数,要求按输入时的逆序把这10个数打印出来。逆序输出,就是按照输入相反的顺序打印这10个数。
输入描述
一行,输入10个整数(范围-231~231-1),用空格分隔。
输出描述
一行,逆序输出输入的10个整数,用空格分隔。
示例1
题目解析
用数组把10个整数都存储下来,然后反向输出。
参考代码
#include<stdio.h>
int main( ){
int a[10],i;
for(i=0;i<10;i++){
scanf("%d",&a[i]);
}
for(i=9;i>-1;i--){
printf("%d ",a[i]);
}
}
【习题2】有序序列判断
题目描述
输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序。
输入描述
第一行输入一个整数N(3≤N≤50)。
第二行输入N个整数,用空格分隔N个整数。
输出描述
输出为一行,如果序列有序输出sorted,否则输出unsorted。
示例1
输出
Sorted
示例2
输出
unsorted
题目解析
分别记录数组中从第二个位置开始当前数字比前一个数大(小)的数量,最终判断是否等于n-1即可。
参考代码
#include <stdio.h>
#include <stdlib.h>
int main( )
{
int n,i,j,s=0,z=0;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
{
if(a[i+1]>=a[i]) s++;
}
for(i=0;i<n-1;i++)
{
if(a[i]>=a[i+1]) z++;
}
if(s==n-1||z==n-1) printf("sorted\n");
else printf("unsorted\n");
return 0;
}
题目描述
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。
输入描述
第一行输入一个整数(0≤N≤50)。
第二行输入N个整数,输入用空格分隔的N个整数。
第三行输入想要进行删除的一个整数。
输出描述
输出为一行,删除指定数字之后的序列。
示例1
题目解析
用数组存储下来序列,输出的时候对于指定的数字不输出即可。
参考代码
#include <stdio.h>
int main( ){
int k[51];
int a;
int x;
scanf("%d",&a);
for(int i=0;i<a;i++){
scanf("%d",&k[i]);
}
scanf("%d",&x);
for(int i=0;i<a;i++){
if(k[i]!=x){
printf("%d ",k[i]);}
}
return 0;
}
【习题4】序列中整数去重
题目描述
输入n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的整数,只保留该数第一次出现的位置,删除其余位置。
输入描述
输入包含两行,第一行包含一个正整数n(1 ≤ n ≤ 1000),表示第二行序列中数字的个数;第二行包含n个整数(范围1~5000),用空格分隔。
输出描述
输出为一行,按照输入的顺序输出去重之后的数字,用空格分隔。
示例1
输入
5
10 12 93 12 75
输出
10 12 93 75
题目解析
枚举每个数,然后枚举这个数往后的位置的数,如果相等就把后面的数置为0,最终输出的时候不是0的数即可。
参考代码
#include<stdio.h>
int main( )
{
int n;
scanf("%d",&n);
int a[n],i,j;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
for(j=0;j<i;j++)
if(a[i]==a[j])
a[i]=0;
for(i=0;i<n;i++)
if(a[i]!=0)
printf("%d ",a[i]);
return 0;
}
【习题5】有序序列合并
题目描述
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
输入描述
输入包含三行,
第一行包含两个正整数n, m(1 ≤ n,m ≤ 100),用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。 第二行包含n个整数(范围1~5000),用空格分隔。 第三行包含
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专刊由牛客官方团队打造,从一个入门者的角度写下这篇C语言自学指南,内容丰富详实,每一道例题也都是精挑细选,不管是C语言小白抑或是“老司机”,都能在本刊中有所收获。 本专刊购买后即可解锁所有章节,故不可以退换哦~

查看3道真题和解析