求kM算法和匈牙利算法的程序代码

求kM算法和匈牙利算法的程序代码,第1张

我学pascal的。本来我是有程序的。既然你要c的那我只好查给你了。问算法过程的话可以追问匈牙利算法1 #include<stdio.h>

2 #include<string.h>

3 bool g[201][201]

4 int n, m, ans

5 bool b[201]

6 int link[201]

7 bool init()

8 {

9 int _x, _y

10 memset(g, 0, sizeof(g))

11 memset(link, 0, sizeof(link))

12 ans = 0

13 if (scanf("%d%d", &n, &m) == EOF)

14 return false

15 for (int i = 1i <= ni++) {

 散橡 16 scanf("%d", &_x)

17 for (int j = 0j <_xj++) {

18 scanf("%d", &_y)

19 g[i][_y] = true

20 }

21 }

22 return true

23 }

24

25 bool find(int a)

26 {

27 for (int i = 1i <= mi++) {

28 if (g[a][i] == 1 &&!b[i]) {

29 b[i] = true

30 if (link[i] == 0 || find(link[i])) {

31 link[i] = a

32 return true

33 }

34 }

35 }

36 return false

37 }

38

39 int main()

40 {

41 while (init()) {

42 for (int i = 1i <= ni++) {

43 memset(b, 0, sizeof(b))

44 if (find(i))

45 ans++

46 }

47 printf("%d\n", ans)

48 }

49 }KM算法#include <cstdio>

#include <memory.h>

#include <algorithm> // 使用其中的 min 函数

using namespace std

const int MAX = 1024

int n // X 的大小

int weight [MAX] [MAX] // X 到 Y 的映射(权重)

int lx [MAX], ly [MAX] // 标号

bool sx [MAX], sy [MAX] // 是否被搜索过

int match [MAX] // Y(i) 与 X(match [i]) 匹配

// 初始化权重

void init (int size)

// 从 X(u) 寻找冲消旁增广道路,找到桥贺则返回 true

bool path (int u)

// 参数 maxsum 为 true ,返回最大权匹配,否则最小权匹配

int bestmatch (bool maxsum = true)

void init (int size)

{

// 根据实际情况,添加代码以初始化

n = size

for (int i = 0i <ni ++)

for (int j = 0j <nj ++)

scanf ("%d", &weight [i] [j])

}

bool path (int u)

{

sx [u] = true

for (int v = 0v <nv ++)

if (!sy [v] &&lx[u] + ly [v] == weight [u] [v])

{

sy [v] = true

if (match [v] == -1 || path (match [v]))

{

match [v] = u

return true

}

}

return false

}

int bestmatch (bool maxsum)

{

int i, j

if (!maxsum)

{

for (i = 0i <ni ++)

for (j = 0j <nj ++)

weight [i] [j] = -weight [i] [j]

}

// 初始化标号

for (i = 0i <ni ++)

{

lx [i] = -0x1FFFFFFF

ly [i] = 0

for (j = 0j <nj ++)

if (lx [i] <weight [i] [j])

lx [i] = weight [i] [j]

}

memset (match, -1, sizeof (match))

for (int u = 0u <nu ++)

while (1)

{

memset (sx, 0, sizeof (sx))

memset (sy, 0, sizeof (sy))

if (path (u))

break

// 修改标号

int dx = 0x7FFFFFFF

for (i = 0i <ni ++)

if (sx [i])

for (j = 0j <nj ++)

if(!sy [j])

dx = min (lx[i] + ly [j] - weight [i] [j], dx)

for (i = 0i <ni ++)

{

if (sx [i])

lx [i] -= dx

if (sy [i])

ly [i] += dx

}

}

int sum = 0

for (i = 0i <ni ++)

sum += weight [match [i]] [i]

if (!maxsum)

{

sum = -sum

for (i = 0i <ni ++)

for (j = 0j <nj ++)

weight [i] [j] = -weight [i] [j]// 如果需要保持 weight [ ] [ ] 原来的值,这里需要将其还原

}

return sum

}

int main()

{

int n

scanf ("%d", &n)

init (n)

int cost = bestmatch (true)

printf ("%d ", cost)

for (int i = 0i <ni ++)

{

printf ("Y %d ->X %d ", i, match [i])

}

return 0

}

匈牙利命名法

匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的。

举例来说,表单的名称为form,那么在匈牙利命名法中可以简写为frm,则当表单变量名称为Switchboard时,变量全称应该为 frmSwitchboard。这样可以很迅春租容易从变量名看出Switchboard是一个表单,同样,如果此变量类型为标签,那么就应命名成 lblSwitchboard。可以看出,匈牙利森仿命名法非常便于记忆,而且使变量名非常清晰易懂,这样,增强了代码的可读性,方便各程序员之间相互交流代码。

据说这种命名法是一位叫 Charles Simonyi 的匈牙利程序员发明的,后来他在微软呆了几年,于是这种命名法就通过微软的各种产品和文档资料向世界传播开了。现在,大部分程序员不管自己使用什么软件进行开发,或多或少都使用了这种命名法。这种命名法的出发点是把量名变按:属性+类型+对象描述的顺序组合起来,以使程序员作变量时对变量的类型和其它属性有直观的了解,下面是HN变量命名规范,其中也有一些是我个人的偏向:

属性部分

全局变量

g_

常量

c_

c++类成员变量

m_

静态变量

s_

类型部分

指针

p

函数

fn

无效

v

句柄

h

长整型

l

布尔

b

浮点型(有时也指文件)

f

双字

dw

字符串

sz

短整型

n

双精度浮点

d

计数

c(通常用cnt)

字符

ch(通常用c)

整型

i(通常用n)

字节

by

w

实型

r

无符号

u

描述部分

最大

Max

最小

Min

初始化

Init

临时变量

T(或Temp)

源对象

Src

目的对象

Dest

这里顺便写几个例子:

hwnd : h 是类型描述,表示句柄, wnd 是变量对象描述,表示窗口,所以 hwnd 表示窗口句柄;

pfnEatApple : pfn 是类型描述,表示指向函数的指针, EatApple 是变量对象描述,所以它表示

指向 EatApple 函数的函数指亩兆针变量。

g_cch : g_ 是属性描述,表示全局变量,c 和 ch 分别是计数类型和字符类型,一起表示变量类

型,这里忽略了对象描述,所以它表示一个对字符进行计数的全局变量。

上面就是HN命名法的一般规则。

小结:匈牙利命名法

匈牙利命名法

MFC、句柄、控件及结构的命名规范 Windows类型 样本变量 MFC类 样本变量

HWND hWnd; CWnd* pWnd;

HDLG hDlg; CDialog* pDlg;

HDC hDC; CDC* pDC;

HGDIOBJ hGdiObj; CGdiObject* pGdiObj;

HPEN hPen; CPen* pPen;

HBRUSH hBrush; CBrush* pBrush;

HFONT hFont; CFont* pFont;

HBITMAP hBitmap; CBitmap* pBitmap;

HPALETTE hPaltte; CPalette* pPalette;

HRGN hRgn; CRgn* pRgn;

HMENU hMenu; CMenu* pMenu;

HWND hCtl; CState* pState;

HWND hCtl; CButton* pButton;

HWND hCtl; CEdit* pEdit;

HWND hCtl; CListBox* pListBox;

HWND hCtl; CComboBox* pComboBox;

HWND hCtl; CScrollBar* pScrollBar;

HSZ hszStr; CString pStr;

POINT pt; CPoint pt;

SIZE size; CSize size;

RECT rect; CRect rect;

一般前缀命名规范 前缀 类型 实例

C 类或结构 CDocument,CPrintInfo

m_ 成员变量 m_pDoc,m_nCustomers

变量命名规范 前缀 类型 描述 实例

ch char 8位字符 chGrade

ch TCHAR 如果_UNICODE定义,则为16位字符 chName

b BOOL 布尔值 bEnable

n int 整型(其大小依赖于 *** 作系统) nLength

n UINT 无符号值(其大小依赖于 *** 作系统) nHeight

w WORD 16位无符号值 wPos

l LONG 32位有符号整型 lOffset

dw DWORD 32位无符号整型 dwRange

p * 指针 pDoc

lp FAR* 远指针 lpszName

lpsz LPSTR 32位字符串指针 lpszName

lpsz LPCSTR 32位常量字符串指针 lpszName

lpsz LPCTSTR 如果_UNICODE定义,则为32位常量字符串指针 lpszName

h handle Windows对象句柄 hWnd

lpfn callback 指向CALLBACK函数的远指针

前缀 符号类型 实例 范围

IDR_ 不同类型的多个资源共享标识 IDR_MAIINFRAME 1~0x6FFF

IDD_ 对话框资源 IDD_SPELL_CHECK 1~0x6FFF

HIDD_ 对话框资源的Help上下文 HIDD_SPELL_CHECK 0x20001~0x26FF

IDB_ 位图资源 IDB_COMPANY_LOGO 1~0x6FFF

IDC_ 光标资源 IDC_PENCIL 1~0x6FFF

IDI_ 图标资源 IDI_NOTEPAD 1~0x6FFF

ID_ 来自菜单项或工具栏的命令 ID_TOOLS_SPELLING 0x8000~0xDFFF

HID_ 命令Help上下文 HID_TOOLS_SPELLING 0x18000~0x1DFFF

IDP_ 消息框提示 IDP_INVALID_PARTNO 8~0xDEEF

HIDP_ 消息框Help上下文 HIDP_INVALID_PARTNO 0x30008~0x3DEFF

IDS_ 串资源 IDS_COPYRIGHT 1~0x7EEF

IDC_ 对话框内的控件 IDC_RECALC 8~0xDEEF

Microsoft MFC宏命名规范 名称 类型

_AFXDLL 唯一的动态连接库(Dynamic Link Library,DLL)版本

_ALPHA 仅编译DEC Alpha处理器

_DEBUG 包括诊断的调试版本

_MBCS 编译多字节字符集

_UNICODE 在一个应用程序中打开Unicode

AFXAPI MFC提供的函数

CALLBACK 通过指针回调的函数

库标识符命名法 标识符 值和含义

u ANSI(N)或Unicode(U)

d 调试或发行:D = 调试;忽略标识符为发行。

静态库版本命名规范 库 描述

NAFXCWD.LIB 调试版本:MFC静态连接库

NAFXCW.LIB 发行版本:MFC静态连接库

UAFXCWD.LIB 调试版本:具有Unicode支持的MFC静态连接库

UAFXCW.LIB 发行版本:具有Unicode支持的MFC静态连接库

动态连接库命名规范 名称 类型

_AFXDLL 唯一的动态连接库(DLL)版本

WINAPI Windows所提供的函数

Windows.h中新的命名规范 类型 定义描述

WINAPI 使用在API声明中的FAR PASCAL位置,如果正在编写一个具有导出API人口点的DLL,则可以在自己的API中使用该类型

CALLBACK 使用在应用程序回叫例程,如窗口和对话框过程中的FAR PASCAL的位置

LPCSTR 与LPSTR相同,只是LPCSTR用于只读串指针,其定义类似(const char FAR*)

UINT 可移植的无符号整型类型,其大小由主机环境决定(对于Windows NT和Windows 9x为32位);它是unsigned int的同义词

LRESULT 窗口程序返回值的类型

LPARAM 声明lParam所使用的类型,lParam是窗口程序的第四个参数

WPARAM 声明wParam所使用的类型,wParam是窗口程序的第三个参数

LPVOID 一般指针类型,与(void *)相同,可以用来代替LPSTR

--------------------------------------------------------------------------------

抨击匈牙利命名法

匈牙利命名法是一种编程时的命名规范。命名规范是程序书写规范中最重要也是最富争议的地方,自古乃兵家必争之地。命名规范有何用?四个字:名正言顺。用二分法,命名规范分为好的命名规范和坏的命名规范,也就是说名正言顺的命名规范和名不正言不顺的命名规范。好的舞鞋是让舞者感觉不到其存在的舞鞋,坏的舞鞋是让舞者带着镣铐起舞。一个坏的命名规范具有的破坏力比一个好的命名规范具有的创造力要大得多。

本文要证明的是:匈牙利命名法是一个坏的命名规范。本文的作用范围为静态强类型编程语言。本文的分析范本为C语言和C++语言。下文中的匈法为匈牙利命名法的简称。

一 匈牙利命名法的成本

匈法的表现形式为给变量名附加上类型名前缀,例如:nFoo,szFoo,pFoo,cpFoo分别表示整型变量,字符串型变量,指针型变量和常指针型变量。可以看出,匈法将变量的类型信息从单一地点(声明变量处)复制到了多个地点(使用变量处),这是冗余法。冗余法的成本之一是要维护副本的一致性。这个成本在编写和维护代码的过程中需要改变变量的类型时付出。冗余法的成本之二是占用了额外的空间。一个优秀的书写者会自觉地遵从一个法则:代码最小组织单位的长度以30个自然行以下为宜,如果超过50行就应该重新组织。一个变量的书写空间会给这一法则添加不必要的难度。

二 匈牙利命名法的收益

这里要证明匈牙利命名法的收益是含糊的,无法预期的。

范本1:strcpy(pstrFoo,pcstrFoo2) Vs strcpy(foo,foo2)

匈法在这里有什么收益呢?我看不到。没有一个程序员会承认自己不知道strcpy函数的参数类型吧。

范本2:unknown_function(nFoo) Vs unknown_function(foo)

匈法在这里有什么收益呢?我看不到。对于一个不知道确定类型的函数,程序员应该去查看该函数的文档,这是一种成本。使用匈法的唯一好处是看代码的人知道这个函数要求一个整型参数,这又有什么用处呢?函数是一种接口,参数的类型仅仅是接口中的一小部分。诸如函数的功能、出口信息、线程安全性、异常安全性、参数合法性等重要信息还是必须查阅文档。

范本3:nFoo=nBar Vs foo=bar

匈法在这里有什么收益呢?我看不到。使用匈法的唯一好处是看代码的人知道这里发生了一个整型变量的复制动作,听起来没什么问题,可以安心睡大觉了。如果他看到的是nFoo=szBar,可能会从美梦中惊醒。且慢,事情真的会是这样吗?我想首先被惊醒的应该是编译器。另一方面,nFoo=nBar只是在语法上合法而已,看代码的人真正关心的是语义的合法性,匈法对此毫无帮助。另一方面,一个优秀的书写者会自觉地遵从一个法则:代码最小组织单位中的临时变量以一两个为宜,如果超过三个就应该重新组织。结合前述第一个法则,可以得出这样的结论:易于理解的代码本身就应该是易于理解的,这是代码的内建高质量。好的命名规范对内建高质量的助益相当有限,而坏的命名规范对内建高质量的损害比人们想象的要大。

三 匈牙利命名法的实施

这里要证明匈牙利命名法在C语言是难以实施的,在C++语言中是无法实施的。从逻辑上讲,对匈法的收益做出否定的结论以后,再来论证匈法的可行性,是画蛇添足。不过有鉴于小马哥曾让已射杀之敌死灰复燃,我还是再踏上一支脚为妙。

前面讲过,匈法是类型系统的冗余,所以实施匈法的关键是我们是否能够精确地对类型系统进行复制。这取决于类型系统的复杂性。

先来看看C语言:

1.内置类型:int,char,float,double 复制为 n,ch,f,d?好像没有什么问题。不过谁来告诉我void应该怎么表示?

2.组合类型:array,union,enum,struct 复制为 a,u,e,s?好像比较别扭。

这里的难点不是为主类型取名,而是为副类型取名。an表示整型数组?sfoo,sbar表示结构foo,结构bar?ausfoo表示联合结构foo数组?累不累啊。

3.特殊类型:pointer。pointer在理论上应该是组合类型,但是在C语言中可以认为是内置类型,因为C语言并没有非常严格地区分不同的指针类型。下面开始表演:pausfoo表示联合结构foo数组指针?ppp表示指针的指针的指针?

噩梦还没有结束,再来看看类型系统更阿为丰富的C++语言:

1.class:如果说C语言中的struct还可以用stru搪塞过去的话,不要梦想用cls来搪塞C++中的class。严格地讲,class根本就并不是一个类型,而是创造类型的工具,在C++中,语言内置类型的数量和class创造的用户自定义类型的数量相比完全可以忽略不计。stdvectorFoo表示标准库向量类型变量Foo?疯狂的念头。

2.命名空间:boostfilesystemiteratorFoo,表示boost空间filesystem子空间遍历目录类型变量Foo?程序员要崩溃了。

3.模板:你记得std::map<std::string,std::string>类型的确切名字吗?我是记不得了,好像超过255个字符,还是饶了我吧。

4.模板参数:template <class T, class BinaryPredicate>const T&max(const T&a, const T&b, BinaryPredicate comp) 聪明的你,请用匈法为T命名。上帝在发笑。

5.类型修饰:static,extern,mutable,register,volatile,const,short,long,unsigned 噩梦加上修饰是什么?还是噩梦。百度地图

(一)“项目驱动”式教学

目前最纤衫著名、最有影响、应用最广泛的windows、linux和UNIX三个 *** 作系统都是用C语言编写的。0S是计算机系统(由软硬件两个子系统构成)的核心和灵魂,它是软件中最庞大最复杂的系统软件。既然如此庞大复杂的0S都可以用c语言编写,从狭义而言,还有什么系统软件和应用软件不能用c语言编写呢?由此可以肯定的说,c语言是一门十分优秀而又重要的语言。

c语言程序设计是过程性程序设计语言,它的发展贯穿了计算机发展的历程,它蕴含了程序设计的基本思想,囊括了程序设计的基本概念,所以它是理工科高等院校的一门基础课程。

从市面上有关c语言的书籍和高等院校采用的教材来看,它们有一个共性,那就是:脱离了实际应用(全是小打小闹的小例子),纯粹的过程性程序设计,没有软件工程思想的体现,没有一定程序设计风格,仅仅是为了让大家明白什么是c语言而已。

高等院校开设c语言程序设计的目的是让学生对程序设计有个入门,有个直观的理解,同时为其他后续课程作铺垫。但是如果教学仅仅以此为目的,那么教学本身就效果而言是个大大的失败。

大家知道,在商业上讲究唯利是图,“利”是商业追求的目标,离开了“利”经商,则商无动力,其结果是必败无疑。在c语言程序设计教学当中,教师应该把“唯用是图”作为教学的首要目标。如果抛开了实际应用进行程序设计教学,就是纸上谈兵,就是“说明书”式的教学。印度的程序设计课程采用“事件驱动式”教学,我认为在中国的c语言程序设计教学中应该采用“项目驱动式”教学。“项目驱动式”教学就是以项目为目的,以c语言理论教学为过程,最终能用c语言设计项目,实现项目的要求。“项目驱动式”教学的关键在于培养学生“如何做什么”和“可以干什么”。一个项目就是一个工程,在“项目驱动式”教学中,首先应该让学生简单了解什么是软件工程思想,其次在c语言理论教学过程中,让学生懂得面向对象的程序设计的风格,最后引导他们来设计项目。

(二)“项目驱动”式教学应注意的问题

1.c语言程序设计教学要帮助学生树立面向工程的观点

在计算机行业中,软件是通过人们的智力活动、把知识与技术转化成信息的一种产品。软件的设计已经用工程的观念来进行管理。软件设计工作被当作一项系统工程来对待。软件的的生存周期一般可分为以下阶段:问题定义、可行性研究、需求分析、概要设计、详细设计、编码、测试、运行与维护。我们不难看出软件工程的复杂程度是很大的。理工科高等院校把c语言作为一门基础课程,也是为了给社会培养信息技术人才。众所周知,养成一个好的习惯是非常重要的,所以c语言程序设计作为大多数工科院校学生接触的第一门程序设计语言(有的院校讲pascal),就应该让学生树立正确的观点。那么当前的程序设计教学也必须以切合将来软件工程开发的实际需要为第一目标,使学生在学习程序设计的初级阶段就树立正确的软件工程观点。这样做不仅可以为学生将来从事计算机应用设计打下良好的基础,而且有利于培养学生分析问题的完备性,以及统筹全局,协调关系的基本素质。

2.理论教学应从单一的“结构化程序设计”向“结构化与面向对象并举”转变

“结构化程序设计”方法是程序设计的基础,必须让学生掌握得坚实可靠。结构化程序设计的过程是培养学生思维能力的过程,在教学中经常发现有些学生的思维混乱。这些都是缺乏思维训练的结果。结构化程序设计的训练不仅可以让学生养成良好的程序设计习惯,而且可以有效地培养学生思维的条理性和逻辑性。所以在授课过程中要注意讲解结构化程序设计的思想时应突出两点:(1)程序的质量首先取决于它的结构。(2)程序设计的基本方法是自顶向下地逐步求精和模块化。

在c程序教学过程中,越到后面的章节,学生越会产生设计毁穗腔程序逐渐变难的感觉,这是不符合逻辑的一种怪现象。按照常理,C语言学的越多,说明你的程序设计知识越多,设计起程序来应该更加得心应手,那么出现这种现象的原因何在呢?当然该问题的出现的原因是多方面的,但是其中最重要的一点就是长期以来程序设计的观念不是以如何处理好对象为出发点,而是以如何使用好语言为基本点。受这种思想的影响,我们的程序设计教学大多数不是以如何解决好问题为重点,而是以讲解语法规则和语句格式为重点,是“说明书”式的教学。这样做造成的结果就是见到一个程序后学生首先想到是该用哪条语句,而不是思考怎样合理的解析。族拍要切实解决这个问题,首先应该改变程序设计的观念。“面向对象程序设计”思想是目前最为流行、极为实用的一种程序设计方法,但是让学生直接接触“面向对象程序设计”,肯定不能对程序设计打下牢固的基础。“结构化与面向对象并举”是现代计算机程序设计的发展趋势,应该认真探索研究,让学生有一个较为轻松的学习过程。程序设计的实质就是编写处理对象的过程,所以将c与c++有机的融为一体的教材应该是首选教材,在教学过程中,我们应该从社会发展的角度进行探索研究,将目前最为流行又极为实用“面向对象程序设计”思想融合到c语言教学中。

3.c语言教学应培养学生良好的程序设计风格

具有良好的设计风格应该是程序员所具备的基本素质,在实际的项目中程序员往往都有自己的一些编程风格。目前95%以上的程序设计书籍不注重程序设计风格问题,这导致了很多学生没有良好的程序设计风格,在他们刚刚毕业踏入社会时,如果周围的同事没有良好的编程风格,那么很难通过环境来使自己提高这方面的素质,即使有提高也不容易比较全面的提高。因此在学生接触的第一门程序设计语言教学中,就应该培养学生良好的程序设计风格,使他们一进工作环境就具备这个素质。

Pascal设计者N.Writh教授十分重视程序设计风格的养成,他坚信“教给学生们以表达他们思维的语言会深深地影响他们思维和创造发明的习惯,而正是这些语言本身的混乱直接影响着学生们的程序设计的风格”,他这里所指的“这些运用”是当时那些主要用于程序设计教学的计算机语言。对学生来讲,一开始就强调程序设计风格很有必要,良好的程序设计风格不仅有助于提高程序的可靠性、可理解性、可测试性、可维护性和可重用性,而且也能够促进技术的交流,改善软件的质量。所以培养良好的程序设计风格对于初学者来说非常重要。

程序设计风格,实际上是指的是编码风格。在教学过程中应从源程序文档化,数据说明的原则,输入/输出方法这三个方面培养学生的编码风格,进而从编码原则探讨提高程序的可读性、改善程序质量的方法。

(1)源程序文档化。编码的目的是产生程序,但是为了提高程序的可维护性。源代码是需要实现文档化的。源程序文档化包括选择标识符(变量和标号)的名字、安排注释以及标准的书写格式等。

①选择标识符的命名规则。标识符包括模块名、变量名、常量名、标号名、子程序名等。这些名字应能反映它所代表的实际东西,应有一定实际意义,使其能顾名思义。另外在模块名、变量名、常量名、标号名、子程序名中使用下划线是一种风格。使用这一技术的一种广为人知的命名规则就是匈牙利命名法(变量类型由一个或两个字符表示,并且这些字符将作为变量名的前缀)。当然使用匈牙利命名法与否都没有错误,重要的是要保持一致性——在整个程序中使用相同的命名规则。这就是说,如果你在一个小组环境中编程,你和其他小组成员应该制定一种命名规则。并自始至终使用这种规则。如果有人使用了别的命名规则,那么集成的程序读起来将是很费劲的。此外,你还要与程序中用到的第三方库(如果有的话)所使用的风格保持一致。如果可能的话,你应该尽量使用与第三方库相同的命名规则,这将加强你的程序的可读性和一致性。

②注释。程序中的注释是程序设计者与程序阅读者之间通信的重要手段。注释能够帮助读者理解程序,并为后续测试维护提供明确的指导信息。因此,注释是十分重要的,大多数程序设计语言提供了使用自然语言来写注释的环境,为程序阅读者带来很大的方便。注释分为功能性注释和序言性注释。

a.功能性注释。功能性注释在源程序中,用以描述其后的语句或程序段是在做什么工作,也就是解释下面要“做什么”,而不是解释下面怎么做。对于书写功能性注释,要注意以下几点:第一描述一段程序,而不是每一个语句。第二利用缩进和空行,使程序与注释容易区别。第三注释要准确无误。

b.序言性注释。序言性注释通常位于每个程序模块的开头部分,它给出程序的整体说明,对于理解程序具有引导作用。有些软件开发部门对序言性注释做了明确而严格的规定,要求程序编制者逐项列出。有关内容包括:程序标题;有关该模块功能和目的的说明;主要算法;接口说明:包括调用形式,参数描述,子程序清单;有关数据描述;模块位置(在哪一个源文件中,或隶属于哪一个软件包);开发简历:模块设计者、复审考、复审日期。

③用标准的书写格式。源程序清单的书写建议采用以下几点:

a.每行只写一条语句;

b.用分层缩进的写法显示嵌套结构层次,这样可使程序的逻辑结构更加清晰,层次更加分明。

c.书写表达式时适当使用空格或圆括号作隔离符。

d.在注释段周围加上边框;

e.注释段与程序段、以及不同的程序段之间插入字行;

(2)数据说明采用的原则。在编写程序时,要注意数据说明的风格。

数据说明的次序如果规范,将有利于测试,排错和维护。首先说明的先后次序要固定,例如,按常量说明、简单变量类型说明、数组说明用数据块说明、所有的文件说明的顺序说明。当然在类型说明中还可进一步要求,例如按如下顺序排列:整型量说明、实型量说明、字符量说明、逻辑说明。

其次当用一个语句说明多个变量名时,应当对这些变量按字母的顺序排列。

最后对于复杂数据结构,应利用注释说明实现这个数据结构的特点。

(3)输入/输出方法。输入/输出的方式和格式应当尽量避免因设计不当给用户带来的麻烦。这就要求,源程序的输入/输出风格必须满足能否为用户接受这一原则。所以在设计程序时,应考虑以下原则:输入数据时,要使输入的步骤和 *** 作尽可能简单,应允许使用自由格式输入;应允许缺省值;对输入的数据要进行检验,以保证每个数据的有效性。

(三)结束语

在教学过程中,我们让学生设计一个程序模拟体育彩票的销售与对奖的过程,取得了良好的效果。他不仅启发和诱导了学生独立思考、积极思维的主动性,而且充分调动了学生学习的自觉性和积极性,使学生融会贯通地掌握了所学知识,提高了分析问题和解决实际问题的能力。

搞好c程序设计的教学工作涉及的因素很多,如果以项目来驱动教学,首先让学生树立面向工程的思想,其次把教学从单一的“结构化程序设计”向“结构化与面向对象并举”转变,最后特别要培养学生养成良好的编码风格,从而使他们学会能够“干什么”,那么我们认为教学目的就达到了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12426275.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存