[C语言程序设计]算法一程序的灵魂

    选择打赏方式

一个程序主要包括以下两方面的信息:
(1)对数据的描述。在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式。这就是数据结构(data structure)。

(2)对操作的描述。即要求计算机进行操作的步骤,也就是算法(algorithm)。

公式:算法+数据结构=程序


2.1 什么是算法

算法不一定涉及到数值计算,在计算机程序中,解决问题的方法和步骤就可以称为一个算法。

计算机算法可分为两大类别:数值运算算法和非数值运算算法。


比如:

求:1+2+3+......+100

算法即为一个循环结构,让变量从1累加到100,输出结果。

又如:

困扰小学生很久的鸡兔同笼问题

说句实在话,本人数学水平差到不行,也就勉强做一下小学生的题了。

鸡兔.jpg

分析:

题目给定了鸡兔总数是35只,共有94只脚,我们这里默认鸡2腿,兔4腿。求鸡兔分别有多少只?

其实很简单,我们假定笼子里都是兔子的情况,则一共140只腿,但是题目给定鸡兔共94只腿,也就是说,多出来的46只腿一定是鸡,也就是说,可以啪啪啪,(大雾),所以除以鸡兔脚数的差(2)就是鸡的数量,求出来鸡的数量自然知道兔子的数量。

程序设计步骤

1.定义2个变量,i,n,分别存储鸡兔总数和总脚数

2.提示用户输入并接收用户输入数据

3.定义一个包含鸡兔数量的结构体

4.定义一个有2个参数(鸡兔总数,脚数)的函数,返回值为一个包含鸡兔数量的结构体

5.完成对这个函数的编写

6.调用此函数,并将i,n以参数传入

7.调用printf函数,输出结构体中的2个成员(鸡和兔的个数)


鸡兔.gif



还有个恶心的摸球问题,从小学一直恶心到初三。

 我就呵呵了,明明是给计算机穷举的题目啊,这样欺负人真的好吗?

问题:

有16个球,其中白球5个,黑球4个,蓝球7个,如果从其中无返回任意取出10个球,请编写一个程序计算出3种颜色球都有的情况下有多少种颜色搭配,并输出每一种颜色搭配。

分析:

没什么好分析的,初始值都为1,利用计算机去穷举,每次+1直到穷举完所有可能。

第1次 拿1个白球,1个黑球,1个篮球

...

第7次 拿1个白球,1个黑球,7个篮球

然后这些都是不满足条件的,只拿9个球可不行。

第8次 拿1个白球,2个黑球,1个篮球

...

第14次 拿1个白球,2个黑球,7个篮球

满足条件 保留并输出,直到穷举完所有结果。


代码:

摸球问题.png


这就是一个简单的数值算法,当然也有一些隐藏在应用程序里面的数值算法,比如GPS导航,大数据推送广告等等。


非数值算法

比如说一个网站注册机

1.生成随机用户名及密码

2.取出一个邮箱备用

3.获取网站注册页面cookies

4.获取验证码

5.提交打码平台

6.取得返回的验证码

7.写入协议头和提交数据

8.post提交注册

9.取得返回文本

10.判断是否注册成功

11.如成功,将账号密码写出到文本文档

12.循环


这也是一个算法,可能并不涉及到多少数值运算,也可能涉及到JS改写解密等步骤。


2.3 算法的特性

(1)有穷性。一个算法应包含有限的操作步骤,而不能是无限的。

(2)确定性。算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。

这让我想起以前在网上看到的一个段子

大意是程序猿的老婆让程序员买西瓜,如果看到卖西红柿的帮我买两个。

结果程序员买了2个西瓜回来。。。

其实,没问题的啊,因为看到了卖西红柿的,所以要买2个西瓜嘛。

n=1

if see tomato():
n=2
buy_watermelon(n)
计算机不接受这些模棱两可的措辞,必须是两个独立的if语句,分别处理购买事件,然后return home。


(3)有零个或多个输入。所谓输入是指在执行算法时需要从外界取得必要的信息。

这个就很好理解了,比如上面的鸡兔同笼就需要用户输入,摸球也可以改成接收用户输入,不过注册就不用了,因程序功能而定即可。


(4)有一个或多个输出。算法的目的是为了求解,“解”就是输出。

这里的输出并不是说必须printf或者显示出来给用户看,就算挖比特币也会有输出,只不过你不会想看具体细节而已。

如果不输出,算它意义何在?


(5)有效性。算法中的每一个步骤都应当能有效地执行,并得到确定的结果。

得到错误的结果,那发出来干什么?算错题还是注册的时候被网站提示,非法请求?


2.5 结构化程序设计方法


自顶向下

程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。


逐步细化

对复杂问题,应设计一些子目标作为过渡,逐步细化。


模块化

一个复杂问题,肯定是由若干稍简单的问题构成。模块化是把程序要解决的总目标分解为子目标,再进一步分解为具体的小目标,把每一个小目标称为一个模块。


结构化编码

所谓编码就是把已经设计好的算法用计算机语言表示,即根据已经细化的算法正确写出计算机程序。结构化的语言(如 Pascal,C,QBASIC等)都有与三种基本机构对应的语句。




拿一个小程序来说


xjp.png

我在设计这个程序的时候,明确要设计一个端,一个马。

端:

负责接收上下线消息,发布压力测试相关指令,并且提供一个与用户交互的可视化界面。

马:

负责具体的压力测试操作。


封装套接字操作相关的api

如连接服务器,断开连接,发送数据包。


定义一个数据发送规则

比如:

函数名 JOIN

参数_外网IP

参数_内网IP

参数_操作系统

参数_CPU

参数_任务状态


函数名 DDOS

参数_IP

参数_端口

参数_时间

参数_线程

参数_模式




设计木马

连接服务器

定义函数,细化硬件检测,流量监视等。

调用各个检测函数,发送上线数据包


接收服务器发出的数据包,并解析出目标IP地址、端口、线程,压力测试模式等参数。

定义相关的压力测试函数,以便将数据包中的参数解析后传递。


设计端,画一个界面出来。

创建服务器 开启端口

接收连接和数据到达事件


上下线事件由CListControl处理

button被按下后发送相关的数据包


这样就是一个自顶向下的模型

马的系统信息,硬件信息获取,具体到了每一项,兼容各个版本的Windows系统

而具体的发包函数完全独立,端添加了新的模式,就可以在马的接收事件里面接收新的模式,并且定义新的发包函数。






版权声明:若无特殊注明,本文皆为《 8964CN 》原创,转载请保留文章出处。
本文链接:[C语言程序设计]算法一程序的灵魂 http://www.8964cn.net/?post=45
正文到此结束

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗 胜利 不高兴 阴险 乖 酷 滑稽

评论信息框

吃奶的力气提交吐槽中...


既然没有吐槽,那就赶紧抢沙发吧!