C语言——通过分文件编写执行数组的一系列功能

写在前面:完成数组的输入,输出,排序,删除元素,清空的功能;使用的VS2019版本

首先建立好头文件myArray.h用于声明函数以及包含宏定义;建立函数的文件function.c,建立主要的main函数文件myArray,c,如图所示

头文件中的代码如下:

#pragma once//防止头文件重复
#include<stdio.h>
#define MAX 20//无参宏定义数组最大长度
#define TYPE int//无参宏定义数组类型
#define SCANF(a) scanf("%d",&a);//有参宏定义输入
#define PRINT(a) printf("%d",a);//有参宏定义输出
void inputArray(int a);//输入函数
void showArray();//显示函数
void sortArray(int s[], int l, int r);//排序函数
void deleteArr(int elm);//删除函数

通过有参和无参宏定义,定义了数组的大小、类型,以及输入输出。头文件还声明了四个功能函数,函数的实现主要在function.c中实现。我们先来搭建main函数,搭建好之后,完成功能函数即可。

main函数代码如下:

#include"myArray.h"
TYPE arr[MAX] = {0};//数组初始化
int len=0;//数组元素大小
int main()
{
	int select = 0;//定义用户的选择
	while (1)
	{
		printf("\t\t|------------------------------|\n");
		printf("\t\t|------- 欢迎来到MyArray!-----|\n");
		printf("\t\t|-------- 1、输入数组  --------|\n");
		printf("\t\t|-------- 2、显示数组  --------|\n");
		printf("\t\t|-------- 3、数组排序  --------|\n");
		printf("\t\t|-------- 4、删除元素  --------|\n");
		printf("\t\t|-------- 5、清空数组  --------|\n");
		printf("\t\t|-------- 0、退出程序  --------|\n");
		printf("\t\t-------------------------------|\n");
		printf("请输入您的选择:\n");
		SCANF(select);
		switch (select)
		{
		case 1://输入数组
			printf("请输入一个数字:");
			int num = 0;
			SCANF(num);
			inputArray(num);
			printf("输入成功!\n");
			printf("请输入下一个选择:\n");
			system("pause");
			system("cls");
			break;

		case 2://显示数组
			printf("您的输入为:");
			showArray();
			printf("请输入下一个选择:\n");
			system("pause");
			system("cls");
			break;
		case 3://数组排序
			printf("排序前的数组:\n");
			showArray(arr[len - 1]);
			sortArray(arr,0,len-1);
			printf("排序后的数组:\n");
			showArray(arr[len - 1]);
			printf("请输入下一个选择:\n");
			system("pause");
			system("cls");
			break;
		case 4://删除元素
			printf("请输入要删除的元素:\n");
			int elm = 0;
			SCANF(elm);
			deleteArr(elm);
			printf("请输入下一个选择:\n");
			system("pause");
			system("cls");
			break;
		case 5://清空数组
			len = 0;
			printf("清空成功!\n");
			printf("请输入下一个选择:\n");
			system("pause");
			system("cls");
			break;
		case 0://退出程序
			printf("欢迎下次使用!");
			return;
		default:
			printf("输入有误,请重新输入!\n");
			system("pause");
			system("cls");
			break;
		}
	}
	getchar();
	return 0;
}

定义了数组长度以及数组初始化后(全局变量,)搭建选择框架,这里采用的是switch,也可以采用if语句,通过while循环以及清屏操作,使得用户一直停留在界面,为了对用户友好,输入了一些列提示语句。在main函数中1 2 3 4的选择用到了function函数,我们先搭建出框架,随后在function中完成。在这里我们主要完成的是清空数组】退出还有输入其他字符的问题。清空数组:只要使数组长度为0,即清空完成;退出的话return即可,如果用户输入其他字符,我们提示一下,然后结束此次循环,进入重新选择的界面。搭建好之后主要就是完成function.c的文件了!

 

function.c代码如下:

#include"myArray.h"
extern TYPE arr[MAX];//数组初始化
extern int len;//数组元素大小
void inputArray(TYPE a)
{
	arr[len] = a;//一个一个输入数据,每输入一个,长度加一
	len++;
}
void showArray()
{
	if (len <= 0)//显示前先判断是否为空
	{
		printf("数组为空,请重新输入!\n");
		return;
	}
	printf("数组中的元素:");
	for (int i = 0; i < len; i++)
	{
		PRINT(arr[i]);
	}
	printf("\n");
}
void sortArray(int s[], int l, int r)//采用快速排序法排序
{
	int i = l;
	int j = r;
	int point = s[l];
	if (l >= r)return;
	while (i < j)
	{
		while (i<j && s[j]>point)j--;
		if (i < j) { s[i] = s[j]; i++; }
		while (i < j && s[i] < point)i++;
		if (i < j) { s[j] = s[i]; j--; }
	}
	s[i] = point;
	sortArray(s, l, i - 1);
	sortArray(s, j + 1, r);
}
void deleteArr(TYPE elm)
{
	int flag = len;//定义一个flag接收目前数组的长度
	for (int i = 0; i < len; i++)
	{
		if (elm == arr[i])//循环遍历是否存在要删除的元素,假设存在
		{

			if (i == len - 1)//如果元素位于数组的最后一位,数组长度减一返回即可
			{
				len--;
				return;
			}
			for (int j = i; j < len; j++)//如果元素位于非最后一位的位置,用j来接收要删除的元素的位置,将删除元素后的所有元素前移
			{
				arr[j] = arr[j + 1];
			}
			len--;
		}
	}
	if (flag == len)//如果数组长度不变,则说明没有删除
	{
		printf("删除失败,数组中不存在元素%d\n", elm);
	}
	else
	{
		printf("删除成功!\n");
	}
}

首先包含头文件“myArray.arr[MAX],由于要用到数组长度以及数组,在main函数中我们已经定义过,在这里不能重复定义,采用extern来寻找这两个参数。

在输入函数中,将元素一个一个赋值给数组即可,然后长度++;

在显示函数中,先判断一下元素是否为空,再输出。

在排序函数中,采用的是快速排序算法,详情可见往期文章:https://blog.csdn.net/m0_56891548/article/details/115712560?spm=1001.2014.3001.5502

删除函数中,我们要注意的是如果元素在最后一个的话直接数组长度--,此外加一个是否判断成功的语句。

代码完成后,控制台窗口如下:我们输入8601,看看其他功能

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值