educoder程序设计基础C语言实训 一维数组和二维数组

  1. 数组的概念

程序设计所涉及和处理的数据类型有:整型、实型、字符型,它们都属于C语言的基本数据类型。但在实际应用中,需要处理的数据往往是复杂多样的,C语言提供了一些更为复杂的数据类型,称为构造类型。数组是最基本的构造类型,可以方便地处理一批具有相同性质的数据的问题。

  1. 什么地方要用到数组

关于数组我们就可以把它看作是一个类型的所有数据的一个集合,并用一个数组下标来区分或指定每一个数。例如一个班级通常会有几十个人,但是老师来认识他们的时候首先会把他们看作是某某班的成员,然后再利用他们的学号来区分每一个学生,这时候,班级就是一个数组,而学号就是数组的下标,当我们指明是几号学号的时候就找到了这个学生。
同样在编程中,如果有一组相同数据类型的数据,例如有10个数字,这时候如果我们要用变量来存放它们的话,就要分别使用10个变量,而且要记住这10个变量的名字,这会十分的麻烦,这时候就可以用一个数组变量来存放他们。使用数组会让程序变的简单,而且避免了定义多个变量的麻烦。

  1. 数组的形式

数组有多种形式,通常分为一维数组、二维数组及多维数组。数组的正确定义和引用是我们必须要掌握的知识。利用数组中每个元素的规律变化可以方便的对数组进行操作。

  1. 实训

第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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值