周围太安静了,安静到现在就算有一根针掉地上也能听到清脆的一声响。
我抬头看了看大哥,大哥,生气了。
——纹路

数组运算

数组运算

数组的集成初始化

int 

这次对数组的赋值很上次有明显的不同,这次并没有在方括号里给出数组的大小,而是直接在大括号里给出了数组中每一个变量所该取的值。其实,数组的大小,我们可以让计算来帮我们数。下面,我们来看一下这样的一个初始化,编译器会给我们带来什么样的结果。

int 

写在大括号里的内容,会依次初始化数组中的每一个单元。如果我们只对一个数组中的单元赋值,却没对别的数组单元赋值,那么剩下的数组单元会全部默认为0。(看下面代码和运行结果)

int 

当然,我们也可以根据需要,对一大堆数组单元中的特定单元进行赋值,代码如下:

int 

这段代码的意思就是:第一个单元

那么6在2后面当然就是赋值给
的了,其余的单元依然默认地赋值为0。

这样的赋值有点离散数学的味道~~(因为数据比较稀松)

但是!!!注意了,这种写法只有C99才有效!!

还有一个问题:在没给数组大小的情况下,如何让编译器数出数组的大小?

我们可以用sizeof

  • sizeof给出整个数组占据的内容的大小,单位是字节

我们把sizeof用于代码里

int 

52好像跟我们的数据没什么关系。我们再加一样东西

int 

我们发现52÷4好像就是我们要的答案!!

没错,确定一个数组的大小,我们就是通过写入

sizeof

这样写有一个好处,就是当我们要修改数组的时候,不用重新再确定数组的大小了,如下面这段代码

int 

数组的赋值

int 

上面这样的赋值方法是大错特错的!!!!

数组变量本身不能被赋值(原因,我们下下周说),如果想把一个数组的数据也交给另一个数组,我们需要做遍历,也就是说,我们需要做循环!如下面这个代码

for

遍历数组通常都是使用for循环来遍历,让循环从变量i从0到<数组的长度,这样循环体内最大的i正好是数组最大的有效下标。

常见的错误是:

  • 循环结束条件是<=数组长度
  • 离开循环后,继续用i的值来做数组元素的下标!

一小段总结:

  • 数组作为函数的参数时,往往必须再用另一个参数来传入数组的大小
  • 数组作为函数的参数时,不能在[]中给出数组的大小;不能再利用sizeof来计算数组的元素个数!

为什么不能这样做的原因我们要在讲指针的位置,来说明。

数组的作用:提高程序的运行效率!(估计在机器学习里也会用到,因为我们需要提高运算效率)

数组例子:素数

在函数那一篇文章里,我们通过调用isPrime函数来判断素数

int 

在后面的判断里,我们要循环n-1遍,这样的话就太耗时了,我们来看用数组怎么写

int 

需要注意其中这一段代码

if

prime[count++]=i做了2件事,1:把i赋给了prime[count];2:通过++使cnt指向了下次i所放的位置。如图

这是一种常见的套路。我们用这样一个变量来表达我们在数组当中接下去要写进去的位置,写进去后,指针又往后移一位,下一次它要写到下一个位置上去。

我们很想看看这个程序运行过程中,这个prime的变化,这些count,i,这些变量的变化是不是如我们想象的那样。

我们可以在程序适当的地方加一些输出语句,

int 

在上面我们平白无故的加了这样一对大括号,目的是为了做调试。

{

你看,这对大括号的好处是什么呢?在括号里,我可以有自己的变量i,我的这个i和外面的i按照我们在函数那一节所学的知识,它们是没有关系的。这里的i就是我自己的i,在定义这个i之前,我们还可以把外面的那个i输出。

除了上面判断素数的方法外,我们还有一种方法——构造素数表

  • 欲构造n以内的素数表
  1. 令x为2
  2. 将2x、3x、4x直至ax<n的数标记为非素数
  3. 令x为下一个没有被标记为非素数的数,重复2;直到令所有的数都已经尝试完毕

我们先写出下面这个伪算法出来

  1. 开辟prime[n],初始化其所有元素为1,prime[x]为1,表示x是素数
  2. 令x=2
  3. 如果x是素数,则对于(i=2;xi<n;i++)令prime[i*x]=0
  4. 令x++,如果x<n,重复3,否则结束
#include 

所以,算法不一定和人的思考方式相同。

线性搜索

搜索

  • 在一个数组中找到某个数的位置(或确认是否存在)
  • 基本方法:遍历
#include 

在这么简单的一个程序里,有这样2个细节。

  1. 我们用了ret来代表了一个返回值。如果我们不用ret,单用一个-1代表没找到,1代表找到,此时就不符合我们前面所说的单一出口的原则,这会使我们后期修改程序时带来很多麻烦。用了ret这个变量,后期我们在修改时,只需要单看这个出口就行了,这会使我们的结构变得很清晰。
  2. 假设有人把上面的代码进行了修改,改为了下面这样的代码
int 

这个代码看起来似乎很“聪明”,利用了i和len之间的关系。但是呢,它也违背了我们的一个原则——一个变量承担了两个责任。这个变量i既是循环遍历用的变量,又用来表示它到底找没找到这样的一个东西。

一专多能是不好的代码。

搜索的例子

在美元里,每一个硬币都是有名字的,比如1分对应的penny;5分对应的nickel;10分对应的dime;25分对应的quarter;50分对应的half-dollar;

有一个数字对应有一个英文单词。如果我们来写一个程序,来做一个搜索,你输入一个数字,程序要给出所对应的英文单词。在数据结构里面,有一种散列表(hash table)。用hash表很适合来做这个事情。我们用数字来作为一个Key,然后存到hash表里去,对应的value,就是我们要的答案。

#include 

上面的代码用了两组数组,其实这并不好。在将来我们会有些不满意,因为它是割裂的两个数组。这两个割裂的数组会带来什么问题呢?在未来,也许我们会遇到一种叫“cache”的东西。这样的一种结构,对于cache来说是不友好的(至于为什么不友好,我也想在未来的某天会在某些书里某些知识点遇到)。那么更好的做法是什么呢?

#include 

这种做法,把值(数字)和字符串(名字)放到了一起。这种做法是对cache的一种更友好的做法。

二分搜索

线性搜索最大的问题是效率的问题,因为他需要把大部分数组走一遍。如果你有几百万个数据,有可能就需要搜半天。现在有另一种方法,假设某一个数组是排好序的,比如从小到大,在排好序的前提下,我们有另一种快速搜索的方案:规定最左边的数组下标为left,最右边的数组下标为right,让mid=(left+right)/2,如果数组下标为mid的数大于我们要找的数,此时则让right=mid-1,left还为原来的值;反之,如果数组下标为mid的数小于我们要找的数,我们就让left=mid+1,right不变。这样一来就能在线性搜索的基础上提高不少效率。

来看下面的代码

#include 

二分搜索的最大好处就是它的效率,对于有n个数的那么一个数组来说,我要在这里找到一个东西,或者确定找不到一个东西,我所确定的搜索的次数是

。也就是说,我有100个东西,我搜7次就可以了,我有1000个东西,我搜10次就可以了。当你要搜的数量很大时,我要搜的次数并不高。所以,

二分法最大的好处就是效率

选择排序

上面用的二分搜索对应的数组是排好序的,如果没有排好序怎么办?那就需要用排序的算法对他进行排序。那怎么排序?

我们这样做:从一个数组中,找出最大的那个数,把它放到数组的最右边,接着找第二个大的数,放在倒数第二个位置上……经过这样一个循环,顺序也就随之排好了。

#include 

c语言prime函数怎么用_C语言入门——第六周笔记——数组运算相关推荐

  1. c语言prime函数怎么用_C语言 要发就发

    点击上方"蓝字"关注我们 愉快的一天,不得不做的三件事: 种田,锄地,整代码!!! [题目] "1898--要发就发".请将不超过1993的所有素数从小到大排成 ...

  2. c语言prime函数怎么用_C语言教程_v20201106

    编程基础 1.1    通俗地理解什么是编程语言 1.2    C语言究竟是一门怎样的语言? 1.6    初中毕业能学会编程吗? 1.7    C和C++到底有什么关系? 1.8    学了 C 语 ...

  3. c语言srand函数怎么用_C语言的main函数到底该怎么写

    前言 从开始学习C语言到现在,我们似乎看到了很多个版本的main函数,那么哪一种才是正确的呢?我们先来看看目前有哪些版本. main函数版本 第一种,没有返回值,没有入参: main() 在C89标准 ...

  4. c语言string函数的用法_C语言基础| 指针和函数

    点击蓝字关注我们 指针和函数 栈帧:当函数被调用时,系统会在stack空间上申请一块内存,用来给函数提供空间,存储形参和局部变量(定义在函数内部的变量). 当函数调用结束时,这块内存空间会被自动释放( ...

  5. C进阶_C语言_函数与指针_C语言指针进阶

    上一篇博客http://t.csdn.cn/GYCiM 我们了解了指针相关知识,今天来了解函数和指针的关系. 目录 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 qsort 冒泡排序模拟实 ...

  6. c语言程序 中断函数示例,单片机_C语言函数_中断函数(中断服务程序)

    c语言中的中断函数注意事项 单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统. 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该 ...

  7. java跨函数跳转_C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行的技巧...

    1.方法一 要对绝对地址0x100000赋值,我们可以用 (unsigned int  * ) 0x100000 = 1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做? ...

  8. c语言atoll函数怎么用_C ++中带有示例的atoll()函数

    c语言atoll函数怎么用 C ++ Atoll()函数 (C++ atoll() function) atoll() function is a library function of cstdli ...

  9. c语言gets,getc,C++_C语言的getc()函数和gets()函数的使用对比,C语言getc()函数:从流中读取字 - phpStudy...

    C语言的getc()函数和gets()函数的使用对比 C语言getc()函数:从流中读取字符头文件: #include 函数getc()用于从流中取字符,其原型如下: int getc(FILE *s ...

最新文章

  1. python 打印数组变量_使用Python将数组的元素导出到变量中(unpacking)
  2. 输入和学生成绩的输出
  3. 在Eclipse中导入dtd和xsd文件,使XML自动提示
  4. EMNLP2021 “Transformer+预训练”再下一城,港科大开源高效的多模态摘要总结网络...
  5. 漫谈Servlet(一)
  6. Metal:对开发者和用户来说意味着什么
  7. mysql添加字段自动记录加入时间、更新时间
  8. 【ElasticSearch】Es 源码之 快照 RepositoriesModule RepositoriesService 源码解读
  9. Mac目录映射到docker容器ubuntu目录
  10. FP-growth发现频繁项集
  11. Python抠图程序源码
  12. pb模型多batch_介绍Modern Batch和计算密集型编程模型
  13. dplayer + m3u8+ p2p加速
  14. 第一章第六天Java基础语法 嵌套循环
  15. 易周金融 | 邮惠万家银行开业;微信公众号叫停四类金融营销宣传
  16. iOS代码质量要求_图片压缩(iOS)
  17. FPGA ISE PROMs下载程序问题
  18. 数据明明不多,为什么表占用很大
  19. 基于ssm快递取件及上门服务微信小程序
  20. java的depot类有什么方法_HP-UNIX depot软件安装方法

热门文章

  1. [DP魔炼][DP] DP随练随学(疯狂A题训练——DP基础篇 题解 下)
  2. Shell脚本完全说明
  3. 如何处理浏览器的断网情况?
  4. 风华是一指流砂,苍老了一段年华
  5. 什么耳机戴着舒服耳朵不疼?五款久戴不疼的骨传导耳机推荐
  6. 编译型语言、解释型语言,特点、区别
  7. c语言判断是文件还是文件夹
  8. 用arduino对stm32编程(二)
  9. 为什么谐振时电抗为0_谐波和谐振的关系
  10. android 回车键、换行检索