换个姿势学C语言
上QQ阅读APP看书,第一时间看更新

1.4 找到程序设计的思路

在明确了要开发的软件功能后就要思考如何实现它。有经验的工程师此时会考虑诸如系统架构(包括软件和硬件)、功能模块、内部与外部接口、数据库、系统安全等问题,然后针对这些问题进行概要设计并编写概要设计说明书(概要设计就是概括地说明系统应该如何实现)。初学者因为经验匮乏很难完成全面的概要设计,但下面的工作是必不可少的,也不难做到:

· 划分功能模块;

· 确定程序运行的硬件环境;

· 确定使用C/S结构或B/S结构;

· 选择程序设计语言。

1.4.1 划分功能模块

还以装修公司办公室为例,设计人员会根据人们的习惯将公司办公室划分成不同的区域:办公区、会议室、休闲区、会客区和茶水间等。可以试想一下,办公室如果没有合理划分和布局该会有多么混乱。

同理,在概要设计阶段首先就是对需求分析进行归纳和总结,再把系统划分为若干个功能模块。如果系统比较大,还应划分为几个子系统。随后还要确立模块之间、子系统之间的接口和通信方式与执行机制。

划分功能模块的思路是“自顶至下,逐步求精,分而治之”。这种方式可以将复杂问题分解成一个个独立的子问题,对每个子问题再进一步分解,直到问题简单到可以很容易地解决。

在此阶段不需要写代码,而是使用自然语言来描述和分解问题。以外汇牌价看板程序为例,先用一句话来总结它的功能:

实现显示实时外汇牌价的程序。

接下来对这句话进行细化和分解:

为了实现显示实时外汇牌价,先要获取最新的外汇牌价,然后才能将它们显示出来。

即使没有任何编程经验,也不难写出上面的语句,将其中包含动词的句子简化后就是一个功能模块的名称,例如“获取外汇牌价”和“显示外汇牌价”。可以用一个结构图表示系统的功能模块,图1-3描述了外汇牌价看板的二级功能。

图1-3 外汇牌价看板的二级功能

根据前面的界面原型设计,还可以将“显示外汇牌价”这个功能分解成4个子功能,如图1-4所示。

图1-4 外汇牌价看板的三级功能(部分)

图1-4中的功能还可以进行细分,例如“显示固定的界面内容”可以分为“显示程序标题(外汇牌价看板)”“显示程序副标题(EXCHANGE RATE”。

尽可能地细分每一个功能模块,这样就能搞清楚程序中需要完成的工作。即使这些功能你目前不知道该如何实现,但至少知道自己要解决哪些问题了。

同一个软件系统的功能可以选择不同的技术来实现,接下来要确定技术方案。对于外汇牌价看板项目而言,技术方案的主要内容包括:

· 确定程序运行的硬件环境;

· 确定程序结构;

· 选择程序设计语言。

1.4.2 确定程序运行的硬件环境

在《拓展阅读:重新认识计算机》中介绍了各种类型的计算机。外汇牌价看板程序要在哪种计算机上运行呢?这涉及客户的预算,也决定了开发人员将要采用的技术方案。

1.选择运行外汇牌价看板程序的计算机

外汇牌价看板程序显然不可能选用小型计算机或者大型计算机(太大、太贵),最适合的方案就是选用一台普通的台式计算机(微型计算机)。某些不方便单独摆放一台计算机的场合也可以使用嵌入式系统来显示外汇牌价。

在本教程中,笔者选择使用普通的x86/x64架构的台式计算机或笔记本式计算机来开发和运行“外汇牌价看板”。当今绝大多数的台式计算机和笔记本式计算机都是这种架构的,因此只要你有一台可以运行Windows操作系统的台式计算机或笔记本式计算机,就可以胜任系统的开发。

如果使用的是苹果计算机怎么办?

如果读者使用的是运行mac OS的MacBook笔记本系列或者Mac Mini、Mac Pro台式机,为确保与本书的一致性,可以在使用的苹果计算机上安装Windows操作系统和Visual Studio 2022 Community来编写本书的案例程序。

2.为外汇牌价看板选择显示设备

外汇牌价看板系统运行时需要将汇率数据显示在大厅里。目前人们经常见到的显示方式包括如下三种。

(1)使用LED数码管的专用显示屏。图1-5是使用LED数码管作为显示器件的显示屏。LED数码管只能用于显示数字和小数点(有时也勉强用于显示字母)。

图1-5 使用LED数码管显示的外汇牌价看板

(2)LED大屏幕。LED大屏幕与LED数码管显示屏的显示原理相同,但是可以显示复杂的文字、图形和较丰富的色彩,面积也可以做得很大。图1-6所示就是置于户外的LED大屏幕。

图1-6 LED大屏幕

(3)液晶显示屏(或大屏幕电视机)。液晶显示屏、大屏幕电视机也可以作为外汇牌价看板的输出设备,它们都提供HDMI或者VGA接口,缺点在于受工艺限制导致显示面积不可能做得很大,一般是在室内使用。图1-7是人们日常使用的液晶显示器。

图1-7 液晶显示器

液晶显示器是很常见的显示设备,因此这里选择使用液晶显示器作为外汇牌价看板的显示设备(分辨率最小支持1366像素×768像素即可)

1.4.3 选择程序架构

程序是分成多种类型的,我们需要决定外汇牌价看板采用何种类型。人们经常听说的“C/S(Client/Server,客户机/服务器)架构”和“B/S(Browser/Server,浏览器/服务器架构”就是用于描述程序类型的。

在日常生活中,人们每天都在和各种程序打交道,这些程序运行在手机、计算机中,家里的路由器、电视机、机顶盒、冰箱、空调中也都有程序在运行。根据程序运行机制的不同,可以将应用程序分为如下3种。

· 单机程序;

· 客户机/服务器程序;

· 浏览器/服务器程序。

1.单机程序

全部程序运行在本地计算机,运行时无须与其他设备或计算机通信的应用程序称为“单机应用程序”。例如计算机或手机中的“计算器”程序,它们完全独立地在计算机和手机上运行,并不需要连接网络。

在单机程序中,程序在本地运行,数据也保存在本地,与其他计算机和设备不进行通信。

2.客户机/服务器程序

很多软件系统有与其他计算机交换数据、共享资源的需求,因此,除单机程序外,还有一种被称为“客户机/服务器”架构(简称C/S架构)的程序。

在客户机/服务器程序中,用户首先需要在自己的计算机上安装客户端软件(例如QQ客户端、“王者荣耀”客户端)。客户端软件需要与服务器连接才能正常运行,每一个客户端软件都可以向一个或多个服务器发出请求。数据在服务器上被集中处理、存储和分发,核心业务逻辑也在服务器上处理。客户机/服务器架构如图1-8所示。

图1-8 客户机/服务器架构

我们日常使用的支付宝(手机版)、微信都属于C/S架构,一些需要下载安装的网络游戏也属于C/S结构。C/S架构应用程序的特点是:

· 客户机具备数据输入、数据处理、数据存储、数据输出的能力;

· 客户机上需要安装客户端软件;

· 服务器主要用于处理数据交换、数据存储和核心业务逻辑。

3.浏览器/服务器程序

采用客户机/服务器架构的程序可以在多台计算机之间进行数据交换和资源共享,但需要事先在客户机上安装应用程序。但一些大型的应用程序往往需要花费很长时间进行下载和安装,并会在客户端计算机上占用很多资源(如硬盘空间、CPU);如果这些应用程序需要升级,还需要用户下载和安装补丁程序,有时候甚至需要重新下载整个安装程序。这些特点也给用户数量众多的系统带来很高的运维成本。

浏览器/服务器架构的出现解决了这一问题。采用这种架构的应用程序,客户机上只须安装浏览器即可,打开一个网站就是打开一个应用程序。

在B/S架构应用程序中,所有的程序都存储在服务器上,因此当程序需要升级时只须更新服务器上的程序即可。例如知乎网站(PC版)要改版时并不需要用户下载一个新的程序并安装。

B/S架构的程序有时也称为“Web应用程序”。B/S架构程序的特点是:

· 所有程序都存储在服务器上;

· 一部分用于显示界面和用户交互的程序在使用时由浏览器下载到客户机执行;

· 程序升级不需要客户端进行任何改动,只须将最新的程序部署到服务器上即可;

· 由于程序是通过浏览器运行的,客户端功能受到了一定限制。

4.客户机/服务器与浏览器/服务器对比

目前,主流的应用系统基本上采用客户机/服务器架构或者浏览器/服务器架构。这两种架构的应用程序适用场景和特性不同。

C/S架构的应用程序缺点在于需要在客户端上安装软件,优点是代码可以直接操作硬件,所以性能更好,也可以最大限度地利用客户端的硬件资源;而B/S结构的应用程序无须安装客户端软件,客户端程序通过浏览器就可以运行,但出于安全性考虑B/S程序不能直接操作客户端硬件资源,程序的运行性能相对较差,功能也受到一定限制。

以网络游戏为例,一些视觉效果较好的游戏往往是C/S架构的,同时对客户端硬件配置有较高的要求(例如显卡),因为C/S架构可以最大程度利用客户端的硬件性能来实现游戏特效;而一些不需要较强特效的游戏(例如棋牌类游戏)则可以做成网页版(网页游戏)。

表1-2对比了两种架构程序的优点和缺点。

表1-2 C/S与B/S架构应用程序优缺点对比

5.为外汇牌价看板选择应用程序类型

首先可以确定外汇牌价看板不是一个独立运行的单机程序,因为它需要实时从一个统一的位置获取最新的外汇牌价数据,这个“统一的位置”通常是一台服务器或一个服务器集群。银行和金融机构有专门的服务器提供相关数据,并通过内部网络(例如数字广播卫星地面站、光纤网络等)为其他计算机提供数据服务。

普通用户的计算机不可能连接到银行的专用网络,但在互联网上有金融数据提供商,他们通过互联网为各行业用户提供数据服务。可以在阿里云市场上找到很多提供这些数据的服务商,在购买了服务后他们会提供服务器地址和访问接口,就可以方便地获得这些金融数据。

为了使读者的精力聚焦在“外汇牌价看板”程序的设计与实现上,本书配套网站的服务器提供了一个数据访问接口,因此读者无须购买这些服务商提供的数据服务,通过简单的几行代码就可以获得中行的实时外汇牌价。这些代码将在后面的章节中进行介绍。

确定了外汇牌价看板不是一个单机程序后,再确定它应该采用C/S架构还是B/S架构。由于这是一本讲述C语言的教程,而C语言并不适用于开发一般的B/S架构程序,因此本书选择C/S架构。图1-9所示是外汇牌价看板的系统架构。

图1-9 外汇牌价看板的系统架构

1.4.4 选择程序设计语言

确定了一个系统运行的硬件环境和程序架构之后,接下来将要选择编程语言,这也是初学者首先要面对的问题。在很多时候,程序员们会争论各种语言的优劣(毫无意外几乎所有程序员都坚信自己使用的语言是最好的),但实际上每一种语言都有其适用和不适用的场景。例如用C语言开发前面提到的B/S架构程序就不太适合(开发效率低),而在一些对性能要求比较高的场景,使用C语言是为数不多的选择之一。

如果“外汇牌价看板”是一个正式的商业项目,“思维正常”的软件工程师都不会选择使用C语言。因为相比其他语言而言,C语言的开发效率是较低的。从学习的角度,学习C语言也是最让初学者感到痛苦的。但本书依然选择使用C语言入门,主要考虑如下因素。

1.学习C语言会被迫学习计算机原理

如果初学者在一开始就使用一些很“高级”的语言,是可以快速得到结果并获得一些成就感,然而在整个过程中,初学者并不了解代码到底做了什么,是怎样做的,为什么这样做。当程序遇到问题时很难找到症结,可能只能和经理说:“我是按照例子写的代码,我不知道为什么会出问题”;并且在未来的工作中,换一种工作语言对你来说将是一件很困难的事。