Educoder-程序设计基础:函数与数组

第1关:汽车销量排序

​ 本关任务:需要对2019年主要汽车集团全球的汽车销量进行统计,编写一个程序,按从大到小的顺序对销量进行排序

#include <stdio.h>
void carSort(long car[]);  //排序函数
int main()
{
    int i;
    long car[10];
    printf("输入2019年汽车销量:\n");
    for (i = 0; i < 10; i++)
    {
        printf("car[%d]=", i);
        scanf("%ld", &car[i]);
    }
    /*********begin *******/
    //调用排序函数
    carSort(car);
    /*********end *******/
    printf("2019年汽车销量排名如下:\n");
    for (i = 0; i < 10; i++) {
        printf("%ld\t", car[i]);
        if (i == 4)
            printf("\n");
    }
    return 0;
}
/*********begin *******/
//定义排序函数
void carSort(long car[])
{
    int i, j;
    long t = 0;
    for (i = 0; i < 9; i++)
    {
        for (j = i + 1; j < 10; j++)
        {
            if (car[j] > car[i])
            {
                t = car[j];
                car[j] = car[i];
                car[i] = t;
            }
        }
    }
}
/*********end *******/

第2关:回文

#include<stdio.h>
#include<string.h>

#define SIZE 100

int isPalindrome(char arr[], int len);
/**** 输入字符串,调用函数isPalindrome判断是否为回文串,然后输出结果 *******/
int main() {
	char arr[SIZE]; int len;
	scanf("%s", &arr);	//注意是%s, %s用在字符串 %c用在字符
	len = strlen(arr);	//获取数组长度
	if (isPalindrome(arr, len))		//if (isPalindrome(arr, len)==1)
		printf("yes");
	else
		printf("no");

	return 0;
}
/**** 在下面编写满足任务要求的递归函数isPalindrome,是回文返回1,不是返回0 *******/
int isPalindrome(char arr[], int len) {
	int i ,j;
	for (i = 0, j = len - 1; i < j && arr[i] == arr[j]; i++, j--);	//满足i<j同时arr[i]==arr[j]条件才会继续循环
	if (i > j)
		return 1;
	else
		return 0;
}

第3关:二维数组周边元素和

​ 本关任务:请编写函数fun(),函数的功能是:求出某个二维数组(如55列)的周边元素值之和,作为函数值返回。

输入: 第一行为一个整数n,代表数组维数。 第二行开始为二维数组赋值。

输出: 周边元素之和。

/********** Begin **********/
#include<stdio.h>
void abc(int a[][100], int n)
{
	int i, j, sum = 0;
	for (i = 0; i < n; i++)
		sum = sum + a[i][0] + a[i][n - 1];		//求左右
	for (j = 0; j < n; j++)
		sum = sum + a[0][j] + a[n - 1][j];		//求上下	
	sum = sum - a[0][0] - a[0][n - 1] - a[n - 1][n - 1] - a[n - 1][0];		//去掉四角重复
	printf("%d", sum);
}
int main()
{
	int n, a[100][100], i, j;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
			scanf("%d", &a[i][j]);
	}
	abc(a, n);
	return 0;
}
/********** End **********/

第4关:矩阵转置

​ 本关任务:求矩阵转置。矩阵转置在数学上的定义为:设A为m×n阶矩阵(即m行n列的矩阵),其第i行第j列的元素是a(i,j),定义A的转置为这样一个n×m阶矩阵B,满足:B=a(j,i)

#include <stdio.h>
#define SIZE 20 //预定义要进行转置的矩阵最大大小为 20*20
void outputMatrix(int b[][SIZE], int n, int m);
void inputMatrix(int a[][SIZE], int n, int m);
void matrixTransport(int a[][SIZE], int b[][SIZE], int row, int column);
//矩阵的输入函数
void inputMatrix(int a[][SIZE], int n, int m)//二维数组参数下标必须要确定
{
    /**********  Begin ***********/
    int i, j;
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
            scanf("%d", &a[i][j]);
    /**********  End  **********/
}
//矩阵的输出函数
void outputMatrix(int b[][SIZE], int n, int m)
{
    /**********  Begin ***********/
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
            printf("%d ", b[i][j]);
        printf("\n");
    }
    /**********  End  **********/
}

//矩阵的转置运算
void matrixTransport(int a[][SIZE], int b[][SIZE], int row, int column)
{
    /**********  Begin ***********/
    int i, j;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < column; j++)
            b[j][i] = a[i][j];
    }
    /**********  End  **********/
}

int main()
{
    //定义数组并初始化
    int a[SIZE][SIZE] = { 0 };
    int b[SIZE][SIZE] = { 0 };//定义数组,注意要初始化
    int row, column;

    //矩阵行,列数的确定
    printf("请输入您要进行转置的矩阵的行数(2~20) : row =  ");
    scanf("%d", &row);
    printf("\n请输入您要进行转置的矩阵的列数(2~20) : column = ");
    scanf("%d", &column);

    //函数调用及主功能实现
    printf("请输入一个 %d X %d 的矩阵 \n", row, column);
    inputMatrix(a, row, column);
    matrixTransport(a, b, row, column);
    printf("转置后的矩阵是 :\n");
    outputMatrix(b, column, row);
    return 0;
}

!第5关:巧排螺旋数阵

螺旋数阵指的是将自然数1,2,3,4,…,nX(n-1),nn,共nXn个数,按有小到大,由外到内、顺时针或逆时针方向,排成一个nXn的螺旋形状的方阵。 顺时针方向螺旋阵 4*4

#include <stdio.h>
void rotation_clockwise(int a[][20], int n)
{
    int i, j, sum;
    sum = 1;
    for (i = 1; i <= n / 2; i++)
    {
        for (j = 1; j <= n; j++)//向右
        {
            if (a[i][j] == 0)
                a[i][j] = sum++;
        }
        for (j = i; j <= n; j++)//向下
        {
            if (a[j][n - i + 1] == 0)
                a[j][n - i + 1] = sum++;
        }
        for (j = n - i + 1; j >= i; j--)//向左
        {
            if (a[n - i + 1][j] == 0)
                a[n - i + 1][j] = sum++;
        }
        for (j = n - i + 1; j >= i; j--)//向上
        {
            if (a[j][i] == 0)
                a[j][i] = sum++;
        }
    }
} //顺时针螺旋
void rotation_anticlockwise(int a[][20], int n)
{
    int i, j, sum;
    sum = 1;
    for (i = 1; i <= n / 2; i++)
    {
        for (j = 1; j <= n; j++)
        {
            if (a[j][i] == 0)
                a[j][i] = sum++;

        }
        for (j = i; j <= n; j++)
        {
            if (a[n - i + 1][j] == 0)
                a[n - i + 1][j] = sum++;
        }
        for (j = n - i + 1; j >= 1; j--)
        {
            if (a[j][n - i + 1] == 0)
                a[j][n - i + 1] = sum++;

        }
        for (j = n - i + 1; j >= 1; j--)
        {
            if (a[i][j] == 0)
                a[i][j] = sum++;

        }
    }

} //逆时针螺旋

int main()
{
    int i, j, n, a[20][20] = { 0 }, z;
    char* s[2] = { "顺时针方向螺旋阵", "逆时针方向螺旋阵" };
    while (1)
    {
        printf("\n\n输入行数n(1到19):\n");
        scanf("%d", &n);
        if (n < 1 || n>19)
            break;
        printf("\n\n选择螺旋方向:1.顺时针 2.逆时针\n");
        scanf("%d", &z);
        printf("\n");

        /******begin  *******/
        //调用函数
        if (z == 1)
            rotation_clockwise(a, n);
        else if (z == 2)
            rotation_anticlockwise(a, n);
        /******end  *******/

        printf("\t%s\n\n", s[z - 1]);
        for (i = 1; i <= n; i++) {
            for (j = 1; j <= n; j++)
                printf("%4d", a[i][j]);
            printf("\n");
        }
    }
    return 0;
}

posted @ 2021-07-21 18:51  颜骏  阅读(915)  评论(0编辑  收藏  举报