C语言程序设计中数组的有效运用
周亚辉
(荆州教育学院,湖北荆州434000)
摘要:随着人工智能和计算机技术的不断发展,C语言因其独特优势一直被广泛应用。数组是C语言中常用的数据类型之一,本文介绍了C语言在程序设计中数组的有效运用,首先文章从数组的排序、插入、删除和应用四个方面介绍了数组的各类应用和编程方法,然后介绍了数组和指针的关系,并以处理转置矩阵为例介绍了数组和指针的联合应用是如何解决实际问题的。本文所做研究对C语言的数组的学习和应用提供了一定的指导意义。
关键词:C语言;数组;应用
中图分类号:TP311文献标识码:A
文章编号:1009-3044(2020)35-0209-02开放科学(资源服务)标识码(OSID):
1引言
自1972年C语言作为一种独立的面向过程的开发语言问世以来,一直作为适应于底层开发的通用设计语言。因其编译方式简单,低级存储器便可处理编译工作,不需要任何其他编译环境,且支持高校程序设计,多年来一直被广大开发者热衷[1]。其跨平台输出的特点,决定了C语言程序可在嵌入式处理器等平台中被编译和使用。与C++和JAVA等面向对象编程的语言不同,C语言的主要目标是实现简易编译、适应低级存储器,高编译效率[2]。
C语言主要的数据类型包括:整数型、字符型、实型、浮点型、枚举型、数组类型、结构体类型、共用体类型、指针类型和空类型。数组是一组有序的元素组合序列,为了方便计算机进行数据处理[3],把无序的元素按照一定的次序有序组织起来。从数据处理角度讲,数组能够方便解决各类复杂的数据处理问题。元素是构成数组的基本单位,不同元素通过顺序号将其顺序标识。根据数组中元素的类型可以分为字符型数组、数值型数组、指针数组和结构数组等[4]。
虽然C语言中数组类型定义比较简单,但因其由于范围广,在进行排序、字符串处理、计算函数处理等过程中,都离不开数组[5]。本文介绍C语言设计过程中,数组的有效运用,对其在解决实际问题过程中的方法进行总结。对于数组的应用,首先要掌握其基本操作,如变量定义、赋值和使用。一般数组的应用可以分为五大类:排序、插入、删除、合并、查询,还可来存储大数据。
2数组的应用
2.1排序
排序是程序设计中最常见的一种算法,对于数组的排序也是C语言编程中的一类重要内容,排序规则也是其他应用开发的基础。排序是将无规则的数据或者字符串等元素,按照固定规则和顺序进行大小排列,常见的排序防范有插入法排序、冒泡排序、交换排序法等,其中冒泡排序法是排序的最常用方式。针对a[0]-a[9]10个数字采用冒泡排序法进行排序,应用案例如下:
1)数组元素输入;a[0]-a[9];
2)数组中相邻元素两两比较,数值大者往前冒泡,数值小者往后冒泡;
3)第一轮比较结束后,用相同方式再进行循环比较。若数组中元素个数有N个,则N-1轮便可将数组按照从大到小的顺序排好。
若此排序要求,不按照冒泡等排序算法进行而用常规变量解决,需定义10个变量,且无法再排序过程中借助循环法解决此问题。
2.2插入
冒泡排序代码c语言抽象类和接口项目针对已经做好排序工作的数组,若要在数组中增加新元素,并且按照原有排序规则重新组合新数据,是常见的一类数组操作。数组插入元素的基本操作步骤如下。
比较待插入元素X和数组中末尾元素的大小,若末尾元素大于X,则将X直接插入至数组末尾,若末尾元素小于X,则一次比较a[0]-a[n-1],直至a[i]>X是,将X插入a[i-1]之后,a[i]之前,同时将其后的元素逐一后移,增加其序号值。
在数组元素插入过程中,常见问题是会出现数组index越界问题,发生此类问题的主要原因在于数组在定义之初,未充分考虑元素插入问题,插入新元素后其容量比原有数组定义元素数量数值大。还有常见问题是,当出现比X大的数组元素时,未进行中段操作,致使插入错误。
2.3删除
数组删除和数组插入类似。数组删除分两种情况,一类是未排序数组的元素删除,一类是已排序数组的元素删除。两类数组元素的删除逻辑相同,具体步骤如下:
1)在键盘中输入数组中要删除的元素;
收稿日期:2020-10-15
作者简介:周亚辉(1980—),男,湖北仙桃人,本科(学士),讲师,荆州教育学院,研究方向为单片机。
2)所输入元素在数组中是否存在,如果存在则执行删除操作,如果不存在则忽略此元素;
3)若数组本身是已排序数组,则在数组删除元素位置进行依次递补,数组元素总数减1。
在删除数组元素过程中,元素漏删现象较多,一旦输入元素在数组中连续出现时,为了保证删除动作正常进行,应该在程序中一次删除多个元素。其程序逻辑图如图1
所示。
图1数组数据删除操作程序图
2.4合并
数组的合并是对两个已经实现排序的数组重新合并后组成新数组的过程,合并完成后的数组仍然要有序。2.5查询
常规的数组元素查询方法一般是根据输入元素从数组中每个元素逐一查,直至查询到元素为止,若数组中查不到被查元素,则程序结束。此种查方式查询效率较低,假设数组中存在500个元素且被查元素在数组末尾,则需要进行499次比较才能得到最终结果。按照概率计算,数组元素的搜索至少需要250次方可完成比较。折半法是常用的数组元素查方法,其查效率比正常查效率高、速度快。例如存在数组,其元素数量为9,分别为1,2,3,7,11,16,18,19,22,若输入3,查3是否在数组中,步骤如下:
1)首先出数组中位置居中的数,由于数组已经按照从小到大顺序排序。中位数为11。
2)比较3和11的大小,若前者小于后者,则在全班段中(即a[1]-a[5]中)寻与3相同的元素。
3)根据以上逻辑继续在a[1]-a[5]中寻,再次取中位数,a [3],恰好a[3]=3,因此,通过两步便得到了最终想要的结果。在查效率上有了很大提升。若数组中数组元素的含量为int (log2n)+1。
3数组与指针
数组和指针在C 语言中是联系最紧密的两种数据类型,对于数组的处理,往往借助指针的手段实现。在具体程序设计中,数组和指针的关系很容易被混淆。具体来讲,指针是用来存放具体变量之地址的变量。变量中保存了其他变量的地址,根据对变量地址的访问间接实现对变量的访问。3.1指针和一维数组
可借助数组元素的指针实现指针和一维数组的关联,也就是通过定义数组元素的指针,并将其指向一维数组的第一个元素。假设p 是已经被定义的指向整形数组的指针,且已被赋值,使其指向数组元素的第一个元素,则p+1便指向数组的第
二个元素。3.2指针和多维数组
多维数组和指针的关系比较复杂,其使用方法也相对灵
活,这样在一定程度上增加了编程的复杂性。本文以二维数组为例,介绍指针和其关系。首先定义int b[3][4]={{0,2,4,6},{1,3,5,7},{7,8,10,11}},由于二维数组是指由两个一维数组组合而成的,a 数组含有3个行和4个列,其三个行可以分别表示为a[0],a [1],a[2],每个一维数组又含有4个子元素。另外,二维数组在存储过程中是按照行的主顺序方法占据一连串存储空间的,因此C 语言通过建立二维数组和指针的关系,除使用指针指向数组元素外,还可采用数组指针和指针数组两种方式。
(1)数组的指针。数组的指针可以是一个指向多维或者一维的指针,定义数组指针后,可以对其复制,并以此在数组和指针之间建立起关联关系。例如int(*)p[4]=a ,定义了p 为数组指针,并将其赋值为数组a 。
(2)指针数组。数组的元素可以为整数,也可以为浮点型数据或字符类数据。故数组的元素种类可以是多种多样的,因此数组的元素类型也可以为指针类型。例如定义int*p[3]={b [0],b[1],b[2]},此种形式表示定义了包含有3个整数型指针的数组。
具体应用过程中,为了不断优化C 语言的程序,进而提升程序的运转效率,在程序中会充分利用数组和指针的关系,借助指针实现对数组元素的间接访问。例如通过C 语言编程的方式实现对4*4矩阵的转置操作等。在C 语言中可借助二维数组实现对矩阵的存储,并可采用相关算法实现矩阵的转置。使用指针实现对数组元素的引用首先需要将数组和指针之间建立起关联关系。具体程序实现如下所示:
#include<stdio.h>void main(){
void move(int(*q)[3];//对move 函数进行定义,并声明其参数类型为数组指针
int i,a[3][3]={1,2,3,4,5,6,7,8,9};
int (*p)[3]=a;//定义数组类型的指针move (p);
for(int i=0;i<3;i++)//将转至矩阵输出printf(“%d %d %d\n ”,a[i][0],a[i][1],a[i][2]);}
pyqt5炫酷界面void move (int (*q)[3]){
int j,k,n;
for(j=0;j<3;j++){for(k=0;k<3;k++){n =*(*(q+j)+k);
*(*(q+j)+k)=*(*q+k)+j);*(*q+k)+j)=n;}}}
综上所述,move 函数主要是通过变量n 实现矩阵中对角线元素的两两置换,这种置换方式是C 语言中经常使用的编程方法,如数组排序中也经常被使用。因篇幅限制,move 函数的具
(下转第224页)
所示。
图8灌溉流程图
4结语
本系统通过光照自动跟踪,提高了能量的收集能力。通过环境温度和土壤湿度检测,综合判断灌溉水量,起到了对水资源合理有效利用的目的。本实验装置主要针对小型灌溉系统,是对智能灌溉系统设计的一种有效探索。
参考文献:
[1]盛会,郭辉,张学军,等.浅谈智能灌溉技术应用现状[J].新疆
农机化,2016(1):23-27.
[2]高峰,孙成权,刘全根.太阳能开发利用的现状及发展趋势[J].
世界科技研究与发展,2001,23(4):35-39.
[3]刘俊岩,张海辉,胡瑾,等.基于ZigBee的温室自动灌溉系统设
计与实现[J].农机化研究,2012,34(1):111-114,118.
腾讯云入口[4]吴世海.立柱式双轴全自动太阳能光伏跟踪控制系统的研究
[D].西安:西安理工大学,2017.
[5]陆建章,杨天宇,马小斌,等.基于单片机的双轴太阳光追踪器
设计[J].科技创新与应用,2016(2):27-28.
[6]张玉燕,刘勇,温银堂,等.基于STM32的太阳自动追踪系统[J].光学精密工程,2016,24(10):415-420.
[7]曹靖,宋娇红,王冰.农业水肥一体化智能灌溉控制系统开发
与应用[J].中国农业信息,2019(6):116-122.
[8]王应海.土壤含水量(土壤湿度)数据在智能灌溉决策系统中
ppt图片透明度的应用研究[J].节水灌溉,2017(4):99-100,105.
【通联编辑:唐一东】
(上接第210页)
体实现方式不再赘述。指针和数组是C语言学习过程的重中之重,也是C语言学习过程中的难点之一,若不能充分理解数组和指针的相互关系,便无法充分借助C语言便利的编程方法解决实际问题,C语言的实际效能便大打折扣。
4结论
随着人工智能和计算机技术的飞速发展,各类芯片被不断开发出来,随之嵌入式应用也越来越被广泛应用,C语言作为开发的最基础类语言,引起具有开发简便、编译速度快、入门快且对编译器的存储能力要求不高等问题,也越来越被受到重视。
数组作为C语言中应用最为广泛的数据类型之一,和链表、指针等关系紧密,因其具有数据规律性存储的特点,其在编程中时长被用到。本文总结了C语言数组的各类数据处理方式和C语言中数组和指针的关系,介绍了数组和指针的关系,为C语言学习过程中数组的应用提供了借鉴和指导意义。
参考文献:
[1]沈逸飞,任春龙,胡云飞,等.浅析C语言、Java、Python的数组
合并方法[J].电脑知识与技术,2020,16(3):78-82. [2]马振婴.C语言程序设计课程指针的教学设计[J].科教导刊, 2019(7):111-112.
[3]常欢,罗奇鸣,李薛剑,等.Alias Analysis Algorithm for C Pro⁃grams Based on a Stack Memory Model[J].小型微型计算机系统,2019,40(2):353-358.
[4]张乐,杨立.基于问题引导法的C语言一维数组插入算法教
学过程分析[J].现代计算机(专业版),2018,621(21):64-67+71.
[5]李凌.C语言的教学设计——基于布卢姆教育目标分类理论
视角[J].柳州职业技术学院学报,2018,18(4):76-80.
【通联编辑:李雅琪】
(上接第221页)
参考文献:
[1]Tang LX,Liu JY,Rong AY,Yang ZH.A multiple traveling salesman problem model for hot rolling sche
duling in Shang⁃hai Baoshan Iron&Steel Complex[J].European Journal of Op⁃erational Research,2000,124:267-282.
[2]张涛,王梦光,杨建夏.不确定计划数的轧制批量计划的模型
和算法[J].系统工程学报,2000,15(1):54-60.
[3]刘士新,宋健海,周山长.热轧带钢轧制批量计划优化模型及
算法[J].控制理论与应用,2007,24(2):243-248.
[4]宁树实,王伟.热轧批量计划编制模型及其算法[J].系统仿真
北京源码资本投资有限公司学报,2007,19(3):691-694.
[5]李铁克,郭冬芬.基于约束满足的热轧批量计划模型与算法[J].控制与决策,2007,22(4):389-393,398.
【通联编辑:代影】
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论