范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

C语言之一维数组

  C语言数组
  当我们处理大量数据值时,我们需要任意数量的不同变量。随着变量数量的增加,程序的复杂性也会增加,因此程序员会对变量名称感到困惑。在某些情况下,我们需要处理大量类似的数据值。为了使这项工作更容易,C编程语言提供了一个名为"数组"的概念。数组是一种特殊类型的变量,用于一次存储多个相同数据类型的值。数组是存储在具有单个名称的连续内存位置中的类似数据项的集合。数组声明
  在C语言中,当我们想要创建一个数组时,我们必须知道要存储在该数组中的值的数据类型以及要存储在该数组中的值的数量。创建一个数组语法: 类型 数组名[size]创建具有大小和初始值的数组的语法:类型 数组名[size]={value1,value2,…};创建没有大小和初始值的数组的语法:类型 数组名[ ]={value1,value2,…};
  在上面的语法中,数据类型指定我们存储在该数组中的值的类型,size指定可以存储在该数组中的最大值数。
  示例代码
  int a [3] ;
  这里,编译器使用单个名称"a"分配6个字节的连续内存位置,并告诉编译器将三个不同的整数值(每个内存为2个字节)存储到该6个字节的内存中。对于上述声明,内存组织如下:
  在上面的内存分配中,所有三个内存位置都有一个通用名称"a"。因此无法直接访问单个内存位置。编译器不仅分配内存,还为数组的每个单独的内存位置分配一个数字引用值。该参考编号称为"索引"或"下标"。以上示例的索引值如下,数组下标从0开始,故最大下标是 size-1
  不同的初始化方式
  int arr[8]; //不初始化
  int arr[8]=0; //error 数组初始化需要代扣好的初始值设定项列表(大括号初始化)
  int arr[8]={0}; //true 告诉编译器,所有的都按一个方式初始化
  int arr[8]={6}; //true 只有第一个为6,剩下的元素都自动初始化为0
  int arr[8]={1,2,3,4,5,6}; //true
  int arr[8]={0,1,2,3,4,5,6,7,8}; //error 初始值太多,超出了数组的存储范围
  int arr[8]={,,,5,2,0}; //error 初始化只从从左到右,前面和中间都不能省略
  int arr[]={1,2,3,4,5}; //true 数组里有几个元素?未指定数组大小,编译器会自动推导出来
  int arr[]; //error 既不告诉编译器要多大内存,也不说有几个元素,编译器并不知道改怎么分配内存
  数组的遍历通常通过循环操作,如下代码#include  int main()  {   int arr[5] = { 1,2,3,4,5 };   int length = 5;   printf("------数组打印-------- ");   for (int i = 0; i < length; i++)   {     printf("%d ", arr[i]);   }   printf(" ");   printf("------用户输入-------- ");   for (int i = 0; i < length; i++)   {     int result=scanf("%d", &arr[i]);   }   printf("------数组打印-------- ");   for (int i = 0; i < length; i++)   {     printf("%d ", arr[i]);   }   printf(" ");   return 0; }
  数组输入可以采用换行作为数据间隔,也可以用空格作为数据间隔,运行结果如下:一维数组常规操作
  插入数据
  数组的插入主要场景有以下几种:从零无序插入从零有序插入,需要调整数据有数据按序号插入,需要挪动数组
  示例程序| 从零无序插入数组,输入一组数据,-1作为结束
  数组在做任何插入前都需要考虑满的状态,数组充当一个容器,插入数据只需要计数变量count改变,并且充当数组下标,整体操作比较简单,图示如下:
  示例代码实现如下:#include  int main()  {   int array[20] = { 0 };   const int max = 20;   int count = 0;   int value, data;   while (1)    {     value = scanf("%d", &data);     if (data == -1)      {       break;     }     if (count == max)      {       printf("已满!");       break;     }     array[count++] = data;   }   for (int i = 0; i < count; i++)    {     printf("%d ", array[i]);   }   printf(" ");   return 0; }
  运行效果如下:
  示例程序| 从零插入数组,输入一组数据,实现数据从小到大存储,-1作为结束
  可以在上述代码的基础上进行改进,增加排序的功能,当插入第一个元素的时候,默认有序,后面插入的元素,只需要和前面的元素比较,如果小于前面的元素就进行交换,调整到第一次小于插入元素的位置,或者调整到下标为0的位置。图示如下:
  示例代码实现如下:#include  int main()  {   int array[20] = { 0 };   const int max = 20;   int count = 0;   int value, data;   while (1)    {     value = scanf("%d", &data);     if (data == -1)      {       break;     }     if (count == max)      {       printf("已满!");       break;     }     array[count++] = data;     for (int k = count - 1; k > 0; k--)      {       if (array[k] < array[k - 1])       {         int temp = array[k];         array[k] = array[k - 1];         array[k - 1] = temp;       }       else         break;     }    }   for (int i = 0; i < count; i++)    {     printf("%d ", array[i]);   }   printf(" ");   return 0; }
  运行效果如下:
  示例程序| 给定已有数组,在指定第几个元素的位置插入指定数据
  需要注意的问题就是第几个元素和序号的区别 ,序号是从0开始的,第几个元素是从1开始的。编写代码时候需要考虑序号的有效性,然后唯一要做的就是腾出一个位置,然后插入元素即可,或者先插入到数组最后面,然后一次挪动元素到指定位置也可以。实现示意图如下:
  示例代码实现如下:#include  int main()  {   int array[20] = { 555,567,666,999,888 };   const int max = 20;   int count = 5;   int value = 0;   int index = 0;   int insertData = 0;   value=scanf("%d%d", &index,&insertData);   if (count == max)    {     printf("已满无法插入! ");     return 0;   }   if (index<1 || index>count)    {     printf("序号有误,无法插入! ");     return 0;   }   array[count++] = insertData;   for (int k = count - 1; k >= index; k--)    {     int temp = array[k];     array[k] = array[k - 1];     array[k - 1] = temp;   }   for (int i = 0; i < count; i++)    {     printf("%d ", array[i]);   }   printf(" ");   return 0; }
  运行效果如下:
  查找数据
  查找数据相对于来说比较简单,一般是遍历数据直接if比较即可,当然还有一种有序数据的查找可以采用二分法查找提高查找效率。
  示例程序| 给定已有数组,查找指定数据的数组下标#include  int main()  {   int array[20] = { 555,567,666,999,888 };   const int max = 20;   int count = 5;   int pos = -1;   int value = 0;   int searchData = 0;   value=scanf("%d", &searchData);   for (int i = 0; i < count; i++)    {     if (array[i] == searchData)      {       pos = i;       break;     }   }   if (pos == -1)    {     printf("未找到指定数据! ");   }   else    {     printf("指定数组下标是:%d ", pos);   }   return 0; }
  上述代码中的pos初始值为-1 ,因为数组下标也有0下标,作为未找到的的判定 ,所以初始值是-1。
  运行效果如下:
  示例程序| 给定已有有序数组,采用二分法查找指定数据的数组下标#include  int main() {   int array[10] = { 1,2,3,4,5,6,7,8,9,10 };   int left = 0;   int right = 9;   int mid = 0;   int value, searchData = 0;   int pos = -1;   value = scanf("%d", &searchData);    while (left < right)   {     mid = (left + right) / 2;     if (array[mid] > searchData)     {       right = mid - 1;     }     else if (array[mid] < searchData)     {       left = mid + 1;     }     else     {       pos = mid;       break;     }   }   if (pos == -1)   {     printf("未找到指定数据! ");   }   else   {     printf("指定数组下标是:%d ", pos);   }   return 0; }
  运行效果如下:
  删除数据
  要注意的就是数组的删除是伪删除,只要找到指定数据,然后把后面的元素往前移动即可,然后计数变量做减一操作即可,整体难度不大,当然数组的删除也有按照第几个元素删除,也有删除指定数据的方式。实现示意图如下:
  示例程序| 给定已有数组,删除指定的第几个元素。#include int main() {    int array[10] = { 555,567,666,999,888 };   const int max = 10;   int count = 5;   int index, value = 0;   value = scanf("%d", &index);   if (index<1 || index>count)    {     printf("索引有误,无法删除! ");     return 0;   }   for (int i = index-1; i < count-1; i++)    {     array[i] = array[i + 1];   }   count--;    //数组真正的删除   for (int i = 0; i < count; i++)   {     printf("%d ", array[i]);   }   printf(" ");   return 0; }
  运行效果如下:
  示例程序| 给定已有数组,删除指定数据。#include int main() {    int array[10] = { 555,567,666,999,888 };   const int max = 10;   int count = 5;   int index=-1, value = 0;   int data = 0;   value = scanf("%d",&data);   //先查找到序号,剩下的处理方案和序号删除类似   for (int i = 0; i < count; i++)    {     if (array[i] == data)      {       index = i;       break;     }   }   if (index == -1)   {     printf("未找到指定数据,无法删! ");   }   else    {     for (int i = index; i < count - 1; i++)     {       array[i] = array[i + 1];     }     count--;    //数组真正的删除   }   for (int i = 0; i < count; i++)   {     printf("%d ", array[i]);   }   printf(" ");   return 0; }
  运行效果如下:
  修改数据
  修改数据相对于来说比较简单,一种是通过输入序号进行修改,注意序号有效性, 实际下标是序号减一即可,还有一种就是查找数据进行修改。
  示例程序| 给定已有数组,修改指定序号下的数据#include int main() {    int array[10] = { 555,567,666,999,888 };   const int max = 10;   int count = 5;   int index=0, value = 0;   int data = 0;   value = scanf("%d",&index);   //先查找到序号,剩下的处理方案和序号删除类似   if (index<1 || index>count)   {     printf("序号有误,无法修改!");   }   else    {     value=scanf("%d", &array[index]);   }   printf(" ");   return 0; }
  示例程序| 给定已有数组,修改指定数据为新的数据#include int main() {    int array[10] = { 555,567,666,999,888 };   const int max = 10;   int count = 5;   int index=-1, value = 0;   int data = 0;   value = scanf("%d",&data);   //先查找到序号,剩下的处理方案和序号删除类似   for (int i = 0; i < count; i++)    {     if (array[i] == data)      {       index = i;       break;     }   }   if (index == -1)   {     printf("未找到指定数据,无法修改! ");   }   else    {     array[index] = data;   }   for (int i = 0; i < count; i++)   {     printf("%d ", array[i]);   }   printf(" ");   return 0; }
  数组简单排序
  示例程序| 冒泡排序
  冒泡排序算法思想是相邻的两个元素进行比较,不满足要求规则进行交换,第一次冒泡决定了第一大元素,故第二次冒泡可减少笔记次数一次。外循环给予每个元素有冒泡机会,内循环描述比较次数,代码实现如下:#include int main() {    int array[] = { 0,1,2,9,3,4,5,6,7,8 };   int arrayNum = 10;   for (int i = 0; i < arrayNum - 1; i++)   {     for (int j = 0; j < arrayNum - 1 - i; j++)     {       if (array[j] > array[j + 1])       {         int temp = array[j];         array[j] = array[j + 1];         array[j + 1] = temp;       }     }   }   for (int i = 0; i < arrayNum; i++)    {     printf("%d ", array[i]);   }   printf(" ");   return 0; }
  示例程序| 选择排序
  选择排序算法思想是填坑思想,第一个位置,选择最小的填进去,第二个位置选择剩余元素最小的填充第二个位置,
  依次类推,外循环用来遍历每一个坑位,内循环去找剩余元素最小的,找到和当前坑元素交换即可。代码实现如下:int minIndex;   int temp;   for (int i = 0; i < arrayNum; i++)    {     minIndex = i;       //从剩下的元素中找最小的     for (int j = i + 1; j < arrayNum; j++)      {       if (array[j] < array[minIndex])        {         minIndex = j;       }     }     //和选出来的那个元素进行交换     temp = array[i];     array[i] = array[minIndex];     array[minIndex] = temp;   }
  示例程序| 插入排序
  插入排序算法思想是插队思想,第一个元素当做有序数据,后续数据插在最后面,依次和前面元素比较,类似有序插入数据,比较到第一次小于插入元素的位置,或者比较到0的位置即可,外循环遍历每个数据,内循环描述插入过程,代码实现如下:#include int main() {    int array[] = { 0,1,2,9,3,4,5,6,7,8 };   int arrayNum = 10;   int preIndex, current;   for (int i = 1; i < arrayNum; i++)   //把第一个元素当做是有序序列   {     preIndex = i - 1;        //第一个元素的序号     current = array[i];        //暂时存储,腾出一个位置     while (preIndex >= 0 && array[preIndex] > current)     {       array[preIndex + 1] = array[preIndex];       preIndex--;     }     array[preIndex + 1] = current;   }   for (int i = 0; i < arrayNum; i++)    {     printf("%d ", array[i]);   }   printf(" ");   return 0; }客观请留步
  如果阁下正好在学习C/C++,看文章比较无聊,不妨关注下关注下小编的视频教程,通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势。

给你的一封信你好。为心中时时出现的那个影子,为了安慰我的灵魂,原谅我,写了这封信。我首先请你能原谅我我私下认为,如果我多次的信件你都看了的话,那在你的心里已是最大的不快了。原谅我吧。我有时常常相互的思念,便是量子纠缠人的思念是会有磁场感应的。当人的思念达到极致的时候,而恰好对方也在深刻的想念着你的话,你们之间会产生一种巨大的磁场,而在这个磁场之间,你们相互之间是能够感应到对方的存在的,而我们通关于海的文案头条创作挑战赛UU哈喽艾瑞巴蒂,这里是柴柴爱情不是一起去森林,也不是喜欢大海。大海也许是个收藏家收藏过太多人的喜怒哀乐。海鸥不再眷恋大海,可以飞更远。日界线和海岸线终会相遇,我们也我第一次爱的人第一次爱一个人是什么感受如果能回到十年前你会做什么呢你认为属于你的幸福是什么人生若只如初见,何事秋风悲画扇。我跟艾娜是小学同学,从刚入学那天我就注意到她。羊角辫,长着一双会说话的眼清荷札记时间识人,岁月鉴心作者清荷札记十月,我把秋风,装进行囊,不嗔,不怨,做世间最美的自己。逐渐懂得,青春,是一段不可追不可等待的时光,流年寂静,月光,在词章里游走,落下一笔温良题记风拂暗香,千重相思,只心定则万事定,心乱则万事乱心定则万事定,心乱则万事乱,把心安顿好,比什么都重要。人生无常,日子如常,面朝大海,春暖花开。明天和意外根本不知道哪个先会到来,世事难料,心安便是归处。心浮了,走到哪里,都是空无一异性间的暧昧,大多是从这三个互动开始的文森屿鹿林感情里,好的恋爱,一定是相互的。你喜欢她,而她也爱着你,彼此之间相互动情,相互付出,共同成为了更好的人。或许,刚开始认识对方的时候,你们并没有什么感情,后来彼此之间的互动早安心语文案图片正能量句子没有所谓的运气,只有绝对的努力有一种姿态,让自己活得无可替代,没有所谓的运气,只有绝对的努力。早安,加油!在我们人生的每一个阶段,真正重要的不是你身处何处而是你要往何处走,有些路走起来艰涩坎坷,有些路看过去毫无善良的人,不用鞭策善良的人,不用鞭策,从骨子里就是善良的人,无论任何人和事情怎么糟蹋他,哪怕那一分钟,他想着以后在不做好事情,但下一分钟,别人需要帮助,他仍然会伸出援助之手,不遗余力去帮助他,哪怕别那山那海月仙离开后,恒水尽被算计!老丈人不再信他,磨难多多很多时候,看不透一些事不明白一些人,是自身的问题是自身的观念问题!倘若过去的思维认知已经无法满足客观日益更新的外界环境的需要,是否也该补充些新鲜认知以对当下的外部环境有个接近准确的情深不寿,第一次看到这个词我哭了情深不寿,还是第一次知道这个词,查了手机才知道他出自金庸大师的笔下,也难怪,我从来没看过金庸的文章。但是,情深不寿,仅仅这四个字却震撼到我。被我深埋内心已久的伤又被无情的掏出来,泪
太阳喜讯,绿军遭重创,科尔为布朗发声,独行侠做出决定NBA季后赛激战正酣,东西部半决赛步步惊心,具体战况为太阳队22独行侠队,灰熊队12勇士队,76人队22热火队,凯尔特人队12雄鹿队。随着赛季的深入,伤病问题依然限制着一些球队的想羽毛球汤姆斯杯小组赛中国胜法国5月9日,中国队选手陆光祖在比赛中庆祝得分。他在男单比赛中以2比1战胜法国队选手克里斯托波波夫。新华社发(拉亨摄)当日,在泰国曼谷举行的2022汤姆斯杯羽毛球团体赛小组赛中,中国队正式确定!曝CBA大牌外教替代雅尼斯,成为北京首钢主教练CBA休赛期开启之后,多支球队主教练接连下课,更多还是因为战绩糟糕的原因。目前浙江青岛四川等队的主教练都陆续确定下来,因为五月底各支球队就要开始训练,没有确定主教练对于球队的集训非CBA三消息广东双将转会福建,莫兰德发文报喜,郭昊文即将赴美爱国篮,爱CBA,我是洛姐,小伙伴们看完记得点赞!这个赛季福建队是联盟中的一支鱼腩球队,这也符合球迷们在赛季前的预期,毕竟福建队在去年休赛期的时候将球队中的核心球员王哲林交易去了上利好!NBA西部球队有意张镇麟除了篮球之外的目的姚明或出手帮忙目前,CBA还处于休赛期,今年的休赛期是很令人期待的,首先休赛期中国男篮将迎来重要的赛事,本阶段的世预赛和亚洲杯决赛的赛程也是含金量挺高,也是检验周琦时代中国男篮水平的一个机会,所专家视野5G新通话能否开启运营商视频时代的新未来?(特约记者马继华)4月26日,中国电信中国联通宣布,率先在深圳杭州郑州天津等城市开通基于双方共建共享5G网络并实现互联互通的5G新通话超清视频语音通话服务(VoNR)。两家运营商表理想L9埃尔法日本卖30万,国内敢卖100万,我卖50万不过分吧?新势力的胃口越来越大,一般的二三十万定价已经满足不了他们了。果然是资本出身,上来就挑肥羊薅羊毛,全新理想L9的定价从底层上暴露了新势力欲求上位的运营手段,通过装裱软装上的优越性,来中兴Axon40Ultra发布,正面无挖孔,这才是真正的全面屏手机今天中兴举行了中兴Axon40系列发布会,带来了两款新机,作为之前早早就对外宣布了真机以及配置的机型,大家最关注的自然还是中兴Axon40Ultra这款采用屏下摄像头设计的手机了,罗晋唐嫣再被传婚变后,85后小花感情状况惹争议要全军覆没?这段时间,疫情严重,在疫情区居住的明星们也被迫停工,配合防疫。有网友做核酸的时候遇见了罗晋,不仔细看压根认不出来!有人索要签名合照,罗晋也和耐心配合,没有半点明星架子。据悉,罗晋唐张亮14岁儿子被曝早恋,和漂亮女友亲吻互动,张亮发长文回应2013年,一档亲子真人秀爸爸去哪儿热播,而节目中,张亮厨艺精湛情商高,儿子天天可爱懂事,父子俩以抢眼的表现,受到了无数观众的喜欢。当年张亮儿子天天(张悦轩)才6岁,一转眼如今已经周杰伦再次升级父亲,大方晒出三胎正脸照,并高调对昆凌示爱近日,昆凌如愿以偿,顺利产下了三胎。周杰伦虽然儿女双全,都已经第三次升级为父亲了,还是难掩内心激动喜悦之情,罕见在社交平台晒出宝宝的正面照。刚出生的宝宝正安静地睡着,皮肤白晰,完全