C语言系列(11)——数组应用

  • 一、一维数组最值(最大值max、最小值mix)
  • 二、一维数组逆序
  • 三、一维数组中出现频率最高的元素
  • 四、删除指定值。
  • 五、新增元素
  • 六、排序:将一个乱序数组,升序排序

一、一维数组最值(最大值max、最小值mix)

思路:

  • 定义一个变量比如max,赋值为数组第一个元素。max=arr[0];
  • 循环遍历数组。
  • 判断max和arr[i]的值,如果arr[i]大于max,则max=arr[i];
  • 直至循环结束,打印max的值。

图示:

代码: 求数组最大值

int arr[10] = { 1,6,3,99,55,66,13,64,200,111 };
int max = arr[0];// 赋值为数组第一个元素。
int i = 0;
//sizeof(arr)/sizeof(arr[0]) 获取数组元素个数
for (i = 1; i < sizeof(arr)/sizeof(arr[0]); i++)
{if (arr[i] > max) // 如果arr[i]大于max,则max=arr[i];{max = arr[i];}
}

printf(“Max:%d\n”, max);
打印结果:Max:200

那如何得到数组中最小值呢?

二、一维数组逆序

思路:

  • 定义两个变量,一个赋值为下标0,一个赋值为最大下标值(元素个数-1)。
  • 循环进行收尾交换。
  • 循环次数为(数组元素个数/2)。

图示:

代码:

int arr[10] = { 1,2,3,4,5,11,12,13,14,15 };
int i = 0, j = 0;
int tmp = 0;
int size = sizeof(arr) / sizeof(arr[0]);
j = size - 1;//最大小标
for ( i = 0; i < size / 2; i++,j--)
{//首位交换tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;
}
// 循环打印数组中的值
for ( i = 0; i < size; i++)
{printf("%d  ", arr[i]);
}

打印结果:15 14 13 12 11 5 4 3 2 1

三、一维数组中出现频率最高的元素

思路:

  • 用每一个元素都从头到尾与所有元素进行比较,出现相同的则count+1。
  • 用max记录最大的那个count,用number记录出现频率最高的值。
  • 需要使用到双层嵌套循环,第一层循环控制元素值;
  • 第二层循环计算元素出现次数;

图示:


依次类推循环

代码:

int arr[10] = { 1,4,8,3,6,8,9,9,1,8 };
int i, j;
int tmp, count = 0;//临时记录每一轮的值和每一轮的值出现的次数
Int max = 0;//记录最高次数
int number = 0;//记录最高次数出现的值
int size = sizeof(arr) / sizeof(arr[0]);
for ( i = 0; i < size; i++)
{tmp = arr[i];//控制每一轮计算个数的元素值。count = 0;//每轮开始前计数器清零for ( j = 0; j < size; j++){//将tmp与数组中每一个元素比较并进行count计数if (tmp == arr[j]){count++;//相同则计数器+1}}if (max < count)//记录最高次数{max = count;//记录出现多少次number = tmp;//记录最多的数字}
}printf("number:%d,出现了%d次\n", number, max);

打印结果:number:8,出现了3次

四、删除指定值。

如:

int arr[10] = {11,20,2,5,98,11,101,55,6,10};
int number =  11; // 指定被删除的值上述数组中又两个11,删除后:
arr元素最终为:20,2,5,98,101,55,6,10

注意:数组大小不会变,即使11被删除,但是数组元素个数还是有10个。

思路: 循环变量数组,遇到与number相同的,就再循环将后面的元素前移动覆盖 。
图示:

代码:

int arr[10] = { 11,20,2,5,98,11,101,55,6,11 };
int number = 11;
int i = 0, j = 0;
int size = sizeof(arr) / sizeof(arr[0]);
for ( i = 0; i < size; i++)
{if (number == arr[i])//找到了要删除的元素{//后面的元素往前移动for ( j = i; j < size-1; j++){arr[j] = arr[j+1];//注意,这里会将数字范围外的不确定的元素赋值过来}arr[size - 1] = -1;//每移动一次,可以将最后一个位置重新赋值。}
}
//循环打印
for (i = 0; i < size; i++)
{printf("%d  ", arr[i]);
}

打印结果:20 2 5 98 101 55 6 -1 -1 -1

五、新增元素

将一个给定的值,新增到一个有序数组中(前提,数组空间足够,不考虑越界)。

如:int arr[10] = {1,2,5,6,8,10,15,17,18}; // 10个空间,9个值,留一个新增
int insert =  9;新增后arr则为:1 2 5 6 8 9 10 15 17 18

思路:

  • 先找到要插入的位置(下标)。
    将insert值,一一比较,找到下标

  • 将目标位置(下标)往后的所有值,集体往后移动一个位置
    移动要注意覆盖问题,所以要从最后一个元素往后移动。

代码:

int arr[10] = { 1,2,5,6,8,10,15,17,18 };
int insert = 9;
int i = 0;
int size = sizeof(arr) / sizeof(arr[0]);
Int flag = size-1;//默认插入到最后面
//先找到9应该插入到哪个位置,为了防止越界,预留出一个位置
for ( i = 0; i < size-1; i++)
{if (insert <= arr[i])//如果找到了位置,则记录{flag = i;break;}//如果没有找到位置,表示insert是已有序列中最大值,则插入到最后面
}
if (flag == size-1)//插入到最后就直接赋值
{arr[flag] = insert;
}
else
{//先将目标位置空出来,后面的序列往后移动for ( i = size-1; i >= flag; i--){arr[i] = arr[i - 1];}arr[flag] = insert;//空出来之后再赋值
}
//循环打印
for ( i = 0; i < size; i++)
{printf("%d  ", arr[i]);
}

打印结果:1 2 5 6 8 9 10 15 17 18

六、排序:将一个乱序数组,升序排序

  1. 冒泡排序: 两个数比较大小,较大的数下沉,较小的数冒起来。
  • 比较相邻的两个数据,如果第二个数小,就交换位置;
  • 从后向前两两比较,一直到比较最前两个数据。最终最小数被交换到起始的位置,这样一轮下来最小的值就交换到了数组的一个位置。
  • 继续重复上述过程,依次将第2.3…n-1个最小数排好位置。

图示:

代码:

int arr[8] = { 42,20,17,13,28,14,23,15 };
int size = sizeof(arr) / sizeof(arr[0]);
int i, j, tmp;
for ( i = 0; i < size-1; i++)//需要冒泡的次数,每次冒泡出最小的值
{for (j = size-1; j > i; j--)//注意循环次数,冒泡出去的元素就不用再比较了{if (arr[j] < arr[j-1])//后一个比前一个小,就交换{tmp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = tmp;}}
}
//循环打印
for (i = 0; i < size; i++)
{printf("%d  ", arr[i]);
}

打印结果:13 14 15 17 20 23 28 42

  1. 选择排序: 选择最小的一个与目标位置进行交换。
  • 在长度为N的无序数组中,第一次遍历n-1个数,找到最小的数值与第一个元素交换
  • 第二次遍历n-2个数,找到最小的数值与第二个元素交换;
  • 第n-1次遍历,找到最小的数值与第n-1个元素交换,排序完成。

图示:

int arr[8] = { 42,20,17,13,28,14,23,15 };
int size = sizeof(arr) / sizeof(arr[0]);
int i, j, tmp, minIndex;
for ( i = 0; i < size-1; i++)
{minIndex = i;for ( j = i+1; j < size; j++){if (arr[i] > arr[j])//找到最小下标的位置{minIndex = j;}}if (minIndex != i)//如果最小的下标不是当前的下标,则交换{tmp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = tmp;}
}
//循环打印
for (i = 0; i < size; i++)
{printf("%d  ", arr[i]);
}

打印结果:13 14 15 17 20 23 28 42

  1. 插入排序:
    在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

图示:

int arr[8] = { 42,20,17,13,28,14,23,15 };
int size = sizeof(arr) / sizeof(arr[0]);
int i, j, tmp;
for ( i = 0; i < size-1; i++)
{for ( j = i+1; j > 0; j--){if (arr[j] < arr[j-1]){tmp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = tmp;}else//注意:如果后一个比前一个不小,不用再继续循环,因为前面都是有序的{break;}}
}
//循环打印
for (i = 0; i < size; i++)
{printf("%d  ", arr[i]);
}

打印结果:13 14 15 17 20 23 28 42

总结:数组应用旨在训练童鞋们对数组的熟练运用,在脑海中要有一个空间思维,想象着各个元素之间的交换,移动,覆盖等;并注意访问越界问题。
上示例若能理解清楚并实现,表示对数组的理解已经达到了一定的高度。

练习:

1、从键盘中输入一个字符串,统计其字母(a~z ,A~Z)和数字(0~9)的个数。
2、从键盘中输入一个字符串(全数字),将其转换为整数后输出,“123”->123。
3、输入两个字符串,进行比较,如果字符全一致则输出相等,否则输出第一个不同字符的差。
4、他手里握着一叠扑克牌:A,2,....J,Q,K 一共13张。他先自己精心设计它们的顺序,然后正面朝下拿着,开始表演。只见他先从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是A;然后再从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是2;......如此循环直到手中只有一张牌,翻开放桌子上,刚好是K。这时,桌上牌的顺序是:A,2,3,4,5,6,7,8,9,10,J,Q,K (可用0表示10)请你计算一下,小明最开始的时候手里牌的顺序是怎样的。

C语言系列(11)——数组(02)相关推荐

  1. javascript学习系列(11):数组中的findIndex方法

    最好的种树是十年前,其次是现在.歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主  放弃很容易但是坚持一定很酷     我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的 ...

  2. 多维数组的索引与切片_「GCTT 出品」Go 系列教程——11. 数组和切片

    Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获! Go 系列教程是非常棒的一套初学者教程,入门就它了. 「GCTT 出品」Go 系列教程--1. 介绍与安装 「GCTT 出品」 ...

  3. 趣味C语言系列 02——绘制圆

    趣味C语言系列 02--绘制圆 前言:一起来感受编程之美吧!

  4. c语言用数组直接填充结构体,C语言第11题:结构体数组的定义与使用 + 结构体数组排序...

    C语言第11题:结构体数组的定义与使用 + 结构体数组排序 C语言第11题:结构体数组的定义与使用 + 结构体数组排序 注意: 一下赋值是不能使用的 但是在结构体中是可以直接进行赋值操作的 st[1] ...

  5. 数组02 - 零基础入门学习C语言24

    第六章:数组02 让编程改变世界 Change the world by program 一维数组元素的引用 [codesyntax lang="c"] #include < ...

  6. 「学点C语言系列」02 判断年份是否为闰年

    写在前面:「学点C语言系列」是新开的专栏,博主电子信息工程专业毕业后,从事了4年硬件工程师,最近一次接触C语言还是4年前的毕设,想重新系统的学习一下C语言,从最基本的Hello World开始. 上一 ...

  7. 面向初学者的 MQL4 语言系列之3——技术指标和内置函数

    简介 这是"面向初学者的 MQL4 语言"系列的第三篇文章.在前两篇文章中, 我们学习了 MQL4 的基础知识,它们是进一步开发的基石.现在我们将学习使用内置 函数和用于技术指标的 ...

  8. c语言中void arrout,c语言学习笔记(数组、函数

    <c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...

  9. C语言系列:6、结构

    C语言系列:6.结构 文章目录 C语言系列:6.结构 1. 结构的基本知识 2. 结构和函数 3. 结构数组 4. 指向结构的指针 5. 自引用结构 6. 表查找 7. 类型定义 8. 联合 9. 位 ...

最新文章

  1. 金额阿拉伯数字转换为中文大写
  2. 建立于因果推理与机器学习共识的稳定学习
  3. 阿里云企业邮箱收费吗
  4. OSChina 周一乱弹 —— 抱着漂亮袜子就亲了一口
  5. linux命令find
  6. 【weblogic】部署jfinal编写的应用
  7. 万兆以太网测试仪应该具备的测试功能
  8. 【深度学习】Batch Normalization详解
  9. ssh连接服务器协议错误,Xmanager发生SSH协议错误怎么办
  10. com词根词缀_英语词根字典 - 词根词缀大全 - 优词英语词根表
  11. Apache 绿色版本官方版本下载
  12. 国家地区代号与英文名对应表
  13. MyBatis批量插入几千条数据,请慎用foreach
  14. python是跨平台语言吗_python可以跨平台么
  15. 用WinDbg探索CLR世界 [4] 方法的调用机制
  16. hal系统命令 android,动态可用的 HAL  |  Android 开源项目  |  Android Open Source Project...
  17. java跳转页面后再跳回前一个页面_js中实现页面跳转(返回前一页、后一页)
  18. linux看网卡百兆千兆,查看网卡是百兆还是千兆
  19. FCN学习:Semantic Segmentation(摘自知乎)
  20. wd 文件服务器客服电话,wd 云服务器

热门文章

  1. linux 下DSP音频处理
  2. 论文阅读——Segment Medical Image Using U-Net Combining Recurrent Residuals and Attention
  3. linux安装软件时/usr/lib/python2.7/site-packages/urlgrabber/grabber.py文件异常
  4. 个人永久性免费-Excel催化剂功能第21波-Excel与Sqlserver零门槛交互-执行SQL语句篇...
  5. 半监督学习之伪标签(pseudo label,entropy minimization,self-training)
  6. RT-Thread 01线程调度与管理
  7. 直接利用Android手机破解微信加密数据库EnMicroMsg.db
  8. 第五---七章 交换机和路由器的基本配置
  9. JavaSE-day01
  10. 唐山校友会会长苏伟与徐飞校长的一次短信交流