- 数组的概念
程序设计所涉及和处理的数据类型有:整型、实型、字符型,它们都属于C语言的基本数据类型。但在实际应用中,需要处理的数据往往是复杂多样的,C语言提供了一些更为复杂的数据类型,称为构造类型。数组是最基本的构造类型,可以方便地处理一批具有相同性质的数据的问题。
- 什么地方要用到数组
关于数组我们就可以把它看作是一个类型的所有数据的一个集合,并用一个数组下标来区分或指定每一个数。例如一个班级通常会有几十个人,但是老师来认识他们的时候首先会把他们看作是某某班的成员,然后再利用他们的学号来区分每一个学生,这时候,班级就是一个数组,而学号就是数组的下标,当我们指明是几号学号的时候就找到了这个学生。
同样在编程中,如果有一组相同数据类型的数据,例如有10个数字,这时候如果我们要用变量来存放它们的话,就要分别使用10个变量,而且要记住这10个变量的名字,这会十分的麻烦,这时候就可以用一个数组变量来存放他们。使用数组会让程序变的简单,而且避免了定义多个变量的麻烦。
- 数组的形式
数组有多种形式,通常分为一维数组、二维数组及多维数组。数组的正确定义和引用是我们必须要掌握的知识。利用数组中每个元素的规律变化可以方便的对数组进行操作。
- 实训
第1关:排序问题
任务描述
本关任务:将十个数进行从大到小的顺序进行排列。
编程要求
根据提示,在右侧编辑器Begin-End处补充代码。
输入
输入十个整数。
输出
以从大到小的顺序输出这个十个数。
测试说明
样例输入:
1 2 3 4 5 6 7 8 9 10
样例输出:
10 9 8 7 6 5 4 3 2 1
开始你的任务吧,祝你成功!
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int a[10];
int i,j,t;
for(i=0; i<10; i++)
scanf("%d",&a[i]);
for(j=0; j<9; j++)
for(i=0; i<9-j; i++)
if(a[i]<a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
for(i=0; i<10; i++)
printf("%d ",a[i]);
/*********End**********/
return 0;
}
第2关:查找整数
任务描述
题目描述:给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
编程要求
根据提示,在右侧编辑器Begin-End处补充代码。
输入
第一行包含一个整数n。
第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。
第三行包含一个整数a,为待查找的数。
输出
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。
测试说明
样例输入:
6
1 9 4 8 3 9
9
样例输出:
2
提示:
数据规模与约定。
1 <= n <= 1000
开始你的任务吧,祝你成功!
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int n;
scanf("%d",&n);
int a[n];
int num;
int i;
int flag=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&num);
for(i=0;i<n;i++)
{
if(a[i]==num)
{
flag=1;
printf("%d",i+1);
break;
}
}
if(flag==0)
printf("-1");
/*********End**********/
return 0;
}
第3关:计算数组中元素的最大值及其所在的行列下标值
任务描述
题目描述:按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中m和n的值由用户键盘输入。已知m和n的值都不超过10。
输入
输入数组大小:"%d,%d"
下面输入数组中元素。
输出
输出格式:
数组大小输入提示信息:“Input m, n:”
数组元素输入提示信息:"Input %d*%d array: "
输出格式:“max=%d, row=%d, col=%d”
样例输入
5,5
1 2 3 4 5
4 5 6 100 2
3 2 1 5 6
1 2 3 5 4
3 5 6 4 8
样例输出
Input m, n:Input 5*5 array:
max=100, row=2, col=4
开始你的任务吧,祝你成功!
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int m,n,j,i,max,row,col;
printf("Input m, n:");
scanf("%d,%d",&m,&n);
int a[m][n];
printf("Input %d*%d array:\n",m,n);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
scanf("%d",&a[i][j]);
}
max=a[0][0];
row=1;
col=1;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
if (max< a[i][j])
{
max=a[i][j];
row=i+1;
col=j+1;
}
printf("max=%d, row=%d, col=%d",max,row,col);
/*********End**********/
return 0;
}
第4关:二分查找
任务描述
题目描述:将n个从小到大排序的整数(n<1000000)从1~n进行编号,并一个待查找的整数m,请使用二分法进行查找。
####相关知识(略)
####编程要求
根据提示,在右侧编辑器Begin-End处补充代码。
输入
输入包括3行,第一行为整数n,第二行包括n个整数,以空格分隔,第三行为整数m。
输出
如果能够在序列中找到整数m,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None。
测试说明
样例输入:
10
1 2 4 5 6 7 8 9 10 11
10
样例输出:
9
开始你的任务吧,祝你成功!
#include<stdio.h>
#define N 100
int a[N];
int main(void)
{
/*********Begin*********/
int n, x, i, j, mid;
/* 读入数据 */
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
scanf("%d", &x);
/* 二分查找 */
int ans = -1;
i = 0, j = n - 1;
while(i <= j) {
mid = (i + j) / 2;
if(a[mid] == x) {
ans = mid;
break;
} else if(a[mid] > x)
j = mid - 1;
else if(a[mid] < x)
i = mid + 1;
}
if(ans == -1)
printf("None\n");
else
printf("%d\n", ans + 1);
/*********End**********/
return 0;
}
第5关:鞍点
任务描述
题目描述:找出具有m行n列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10。
编程要求
输入
输入数据有多行,第一行有两个数m和n,下面有m行,每行有n个数。
输出
按下列格式输出鞍点:
Array[i][j]=x
其中x代表鞍点,i和j为鞍点所在的数组行和列下标,我们规定数组下标从0开始。
一个二维数组并不一定存在鞍点,此时请输出None
我们保证不会出现两个鞍点的情况,比如:
3 3
1 2 3
1 2 3
3 6 8
测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。
样例输入:
3 3
1 2 3
4 5 6
7 8 9
样例输出:
Array[0][2]=3
开始你的任务吧,祝你成功!
#include<stdio.h>
#define N 10
int a[N][N], maxa[N], mina[N];
int main(void)
{
/*********Begin*********/
int m, n, i, j;
/* 读入数据 */
scanf("%d %d", &m, &n);
for(i = 0; i < m; i++)
for(j = 0; j < n; j++)
scanf("%d", &a[i][j]);
/* 初始化最值:行的最大值、列的最小值 */
for(i = 0; i < m; i++)
maxa[i] = a[i][0];
for(i = 0; i < n; i++)
mina[i] = a[0][i];
/* 计算最值:行的最大值、列的最小值 */
for(i = 0; i < m; i++)
for(j = 0; j < n; j++) {
if(a[i][j] > maxa[i])
maxa[i] = a[i][j];
if(a[i][j] < mina[j])
mina[j] = a[i][j];
}
/* 找鞍点并且输出结果 */
int flag = 1;
for(i = 0; i < m; i++)
for(j = 0; j < n; j++)
if(maxa[i] == mina[j]) {
flag = 0;
printf("Array[%d][%d]=%d\n", i, j, maxa[i]);
break;
}
if(flag)
printf("None\n");
/*********End**********/
return 0;
}
第6关:删除最大值
任务描述
题目描述:输入10个互不相同的整数并保存在数组中,找到该最大元素并删除它,输出删除后的数组
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充,完成编写删除最大值的小程序。
输入
输入10个互不相同整数
输出
输出删除最大元素后的数组
测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。
样例输入:
1 2 3 4 5 6 7 8 9 0
样例输出:
1 2 3 4 5 6 7 8 0
开始你的任务吧,祝你成功!
#include<stdio.h>
#define N 10
int a[N];
int main(void)
{
/*********Begin*********/
int i;
for(i = 0; i < N; i++)
scanf("%d", &a[i]);
int maxa = a[0], k = 0;
for(i = 1; i < N; i++)
if(a[i] > maxa) maxa = a[i], k = i;
for(i = 0; i < N; i++)
if(i != k)
printf("%d ", a[i]);
printf("\n");
/*********End**********/
return 0;
}
第7关:杨辉三角
任务描述
题目描述:还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充,完成编写杨辉三角的小程序。
测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。
输出
打印出杨辉三角图形的10行。格式见题目描述部分。每个整数后面接一个空格来分隔开整数
开始你的任务吧,祝你成功!
#include<stdio.h>
#include<string.h>
#define N 10
int a[N + 1];
int main(void)
{
/*********Begin*********/
memset(a, 0, sizeof(a));
a[1] = 1;
int i, j;
for(i = 1; i <= N; i++) {
for(j = i; j >= 1; j--)
a[j] += a[j - 1];
printf("%d", a[1]);
for(j = 2; j <= i; j++)
printf(" %d", a[j]);
printf("\n");
}
/*********End**********/
return 0;
}