c语言程序设计流程图怎么画具体有什么规范

c语言程序设计流程图怎么画具体有什么规范,第1张

我就个人的经验来谈一下吧:如果你是会编程序而不会画流程图的这种我建议你应该先把自己的程序研究一遍倘若是画主程序流程图的话那就只需看懂主函数的程序就行了按照Main()函数中的具体书写过程来画比如:定义变量--------初始化变量------使用选择或者循环或者顺序结构------调用某一个子函数(可以没有)----------程序结束 以上是最简单的程序流程图画法

倘若你是画某一算法或是某一模块的流程图的话就要把相应的算法或是模块看懂再说分析算法或是模块的具体走法根据此走法就可以画出对应的流程图

如果你是初学者是想根据流程图的画法而去尝试编程的话我建议你就一定要研究好每一个使用到的算法读懂题目再画流程图

1

11符号命名规则

111符号名包括模块名、常量名、标号名、子程序名等。这些名字应该能反映它所代表的实际东西,具有一定的意义,使其能够见名知义,有助于对程序功能的理解。命名采用匈牙利命名法。规则如下:

(1)所有宏定义、枚举常数和const变量,用大写字母命名。在复合词里用下划线隔开每个词。

(2)复合词中每个单词的第一个字母大写。除了规则5111以外,避免使用下划线。

(3)类、类型定义和枚举型名的第一个字母大写。

(4)函数名是复合词的,第一个词采用全部小写,随后每个单词采用第一个字母大写,其它字母小写方式;如果是单个词的,采用全部小写方式。

(5)循环变量可采用i, j, k等,不受上述规则限制。

(6) 类的成员变量应采用m_开头。

(7) 全局变量词头为g_ 。

(8) 临时变量词头为tmp_ 。

(9) 对结构体内的变量命名, 遵循变量的具体含义命名原则

(10)用小写字母的前缀表示变量的类型,前缀的下一个字母用大写。

表 1

词头 类型 词头 类型

ch char l long

i integer u unsigned

b boolean p pointer

f float lp long pointer

d double s string

st structure sz ASCII string

by byte n short int

H handle x,y 分别为x,y坐标

dw DWORD fn function

表 2

词头 变量名 词头 变量名

task task sig signal

sb binary semaphores wd watchdog

sm mutual exclusion tm timer

sc counting semaphores msg message

pipe pipe

例:

#define ARRAY_SIZE 24 /规则5111/

int g_iFlag;

class MyClass /规则5113/

{

};

void someFunc( ) /规则5112和5114/

{

int nArray[ARRAY_SIZE];

unsigned char uchByte;

char szName[ ];

char pszName = szName;

}

(11)有些词头(如p和u)可以和其它词头组合。

例:WDOG_ID wdId;

WDOG_ID g_wdId; /全局watchdog Id,故以g_开头/

112名字的长度一般不要过长或过短。过长的名字会增加工作量,使程序逻辑流程变得模糊;过短的名字无法表达符号的实际意义。约定长度范围:3-31;

12数据和函数说明

121数据说明次序应当规范化,使数据属性容易查找,也有利于测试、排错和维护。说明的先后次序应固定,应按逻辑功能排序,逻辑功能块内建议采用下列顺序:整型说明、实型说明、字符说明、逻辑量说明。

122如果设计了一个复杂的数据结构,应当通过注释对其变量的含义、用途进行说明。

123在函数的声明中使用异常声明。

如:void f() throw(toobig, toosmall, divzero);

在声明一个函数时,将它所抛出的异常列出,便于函数的使用者了解可能会发生哪些异常。

13 程序注释

131程序注释是程序员与日后的程序读者之间通信的重要手段之一,注释分为文件注释、函数注释和功能注释。

132正规程序的注释应注意:

——注释行的数量占到整个源程序的1/3到1/2。

133文件注释位于整个源程序的最开始部分,注释后空两行开始程序正文。它包括:

——程序标题。

——目的、功能说明。

——文件作者、最后修改日期等说明。

例:

/

(空一行)

标题: Democ

功能: 测试VxWorks的各种系统调用

说明:

该程序测试各种VxWorks的系统调用函数。包括任务(taks)的创建、挂起及任务间通过信号灯实现同步,通过消息队列 进行通讯。

程序创建了两个任务:一个高优先级的任务和一个低优先级的任务。两个任务间通过一个二进制的信号灯进行同步,通过消息队列进行通讯。

当前版本: xx

修改信息: 20000605 John, Initial Version

20000705 Tom, Bug xxxx fixed

/

(空2行,开始程序正文)

134 函数注释通常置于每函数或过程的开头部分,它应当给出函数或过程的整体说明对于理解程序本身具有引导作用。一般包括如下条目:

——模块标题。

——有关本模块功能和目的的说明。

——调用格式

——接口说明:包括输入、输出、返回值、异常。

——算法。如果模块中采用了一些复杂的算法。

例:

file://(/注释开头应和上一函数空两行)

(注释开头与上一函数最后一行间隔两行)

/

标题:assignmentComplete

功能:BSC=>MSC消息生成函数,生成assignment_complete指配完成消息(BSMAP消息)

格式:

int assignmentComplete(int iCellId, int iServiceChannnelNum, char pszMSGData) throw(exception1, exception2)

输入:

int iCellId: MS所在的小区识别

iCellId取值:0x00-——0xff

int iServiceChannnelNum:MS所占的业务信道号码

输出:

char pszMSGData:指配完成消息数据

返回值: 0x00正常

异常:exception1异常情况1, exception2异常情况2

/

( 注释后直接开始程序正文,不空行。)

135功能性注释嵌在源程序体中,用于描述其后的语句或程序段做什么工作,也就是解释下面要做什么,或是执行了下面的语句会怎么样。而不要解释下面怎么做,因为解释怎么做常常与程序本身是重复的。

例:

/把 amount 加到 total中/

total = amount + total;

这样的注释仅仅是重复了下面的程序,对于理解它的工作并没有什么作用。而下面的注释,有助于读者理解。

/将每月的销售额amount加到年销售额total中/

total = amount + total;

14 函数编写应尽可能短小精悍,一般不超过两屏,以便于调试和理解。

15语句结构

为保证语句结构的清晰和程序的可读性,在编写软件程序时应注意以下几个方面的问题:

——在一行内只写一条语句,并采用空格、空行和移行保证清楚的视觉效果。

——每一个嵌套的函数块,使用一个TAB缩进(可以设定为4个空格),大括号必须放在条件语句的下一行,单独成一行,便于匹对:

如,有一段程序如下:

for(i=1;i<n-1;i++){ t=1; for(j=i+1;j<n;j++){

if(a[j]<a[t] ) t=j; if(t!=i ){work=a[t];a[t]=a[I];a[I]=work;}}}

应写为

for( i=1; i<n-1; i++)

{

t=1;

for(j = i+1; j<n; j++)

{

if(a[i]<a[j])

t=j;

if(t!=1)

{ 5

Q/ECC/BJ 010—2001

work=a[t];

a[t]=a[i];

a[i]=work;

}

}

}

——文件之中不得存在无规则的空行,比如说连续十个空行。

一般来讲函数与函数之间的空行为2-3行;

在函数体内部,在逻辑上独立的两个函数块可适当空行,一般为1-2行。

——程序编写首先应考虑清晰性,不要刻意追求技巧性而使得程序难以理解。

——每行长度尽量避免超过屏幕宽度,应不超过80个字符。

——除非对效率有特殊要求,编写程序要作到清晰第一,效率第二。

——尽可能使用函数库。

——尽量用公共过程或子程序去代替重复的功能代码段。要注意,这个代码应具有一个独立的功能,不要只因代码形式一样便将其抽出组成一个公共过程或子程序。

——使用括号清晰地表达算术表达式和逻辑表达式的运算顺序。如将 x=ab/cd 写成 x=(ab/c)d可避免阅读者误解为x=(ab)/(cd)。

——避免不必要的转移。

——避免采用过于复杂的条件测试。

——避免过多的循环嵌套和条件嵌套。

——建议不要使用 =,^=, /=等运算符。

——一个函数不要超过200行。一个文件应避免超过2000行。

——尽量避免使用go to语句。

——避免采用多赋值语句,如x = y = z ;

——不鼓励采用: *** 作符,如z = (a>b)a:b;

——不要使用空的if else 语句。如

if(cMychar >= ‘A’)

if(cMychar <= ‘Z’)

printf(“This is a letter \n”);

else

printf(“This is not a letter \n”);

else到底是否定哪个if容易引起误解。可通过加{}避免误解。

——尽量减少使用“否定”条件的条件语句。如:

把 if( !( (cMychar<’0’) || (cMychar>’9’) ) )

改为if( (cMychar>=’0’) && (cMychar<=’9’) )

#include <stdioh>

#include <stdlibh>

int main(void)

{

int a, i = 10;

printf("猜数字游戏,(10到200之间)您只有10次机会猜中哦,请输入\n");

scanf("%d", &a);

while (a!=88 && i>0)

{

if (a>88)

{

printf("你输入的数字过高\n");

}

else

{

printf("你输入的数字过低\n");

}

scanf("%d", &a);

i--;

}

if(a == 88)

{

printf("恭喜你!猜对了!\n");

}

else

{

printf("你的10次机会已经用完了\n");

}

system("pause");

return 0;

}

匈牙利命名法是微软推广的一种关于变量、函数、对象、前缀、宏定义等各种类型的符号的命名规范。匈牙利命名法的主要思想是:在变量和函数名中加入前缀以增进人们对程序的理解。它是由微软内部的一个匈牙利人发起使用的,结果它在微软内部逐渐流行起来,并且推广给了全世界的Windows开发人员。下面将介绍匈牙利命名法,后面的例子里也会尽量遵守它和上面的代码风格。还是那句话,并不是要求所有的读者都要去遵守,但是希望读者作为一个现代的软件开发人员都去遵守它。

a Array 数组

b BOOL (int) 布尔(整数)

by Unsigned Char (Byte) 无符号字符(字节)

c Char 字符(字节)

cb Count of bytes 字节数

cr Color reference value 颜色(参考)值

cx Count of x (Short) x的集合(短整数)

dw DWORD(unsigned long) 双字(无符号长整数)

f Flags (usually multiple bit values) 标志(一般是有多位的数值)

fn Function 函数

g_ global 全局的

h Handle 句柄

i Integer 整数

l Long 长整数

lp Long pointer 长指针

m_ Data member of a class 一个类的数据成员

n Short int 短整数

p Pointer 指针

s String 字符串

sz Zero terminated String 以0结尾的字符串

tm Text metric 文本规则

u Unsigned int 无符号整数

ul Unsigned long (ULONG) 无符号长整数

w WORD (unsigned short) 无符号短整数

x,y x, y coordinates (short) 坐标值/短整数

v void 空

有关项目的全局变量用g_开始,类成员变量用m_,局部变量若函数较大则可考虑用l_用以显示说明其是局部变量。

前缀 类型 例子

g_ 全局变量 g_Servers

C 类或者结构体 CDocument,CPrintInfo

m_ 成员变量 m_pDoc,m_nCustomers

VC常用前缀列表:

前缀 类型 描述 例子

ch char 8位字符 chGrade

ch TCHAR 16位UNICODE类型字符 chName

b BOOL 布尔变量 bEnabled

n int 整型(其大小由 *** 作系统决定) nLength

n UINT 无符号整型(其大小由 *** 作系统决定) nLength

w WORD 16位无符号整型 wPos

l LONG 32位有符号整型 lOffset

dw DWORD 32位无符号整型 dwRange

p Ambient memory model pointer 内存模块指针,指针变量 pDoc

lp FAR 长指针 lpDoc

lpsz LPSTR 32位字符串指针 lpszName

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

lpsz LPCTSTR 32位UNICODE类型常量指针 lpszName

h handle Windows对象句柄 hWnd

lpfn (fn)() 回调函数指针 Callback Far pointer to CALLBACK function lpfnAbort

## part

my $flag=0;

while(<CFILE>)

{

  if(/\{\}/){ 

    # if in one line split or not

  }

  else if(/\s\{()/) // 单行内多个{可以用while判断

  {

    $flag++;

    print OUT ' ' x ($flag4); // 输出空格

    print OUT '{\n';

    print OUT ' ' x (($flag+1)4); // 另起一行,比上一行多4个空格

    print OUT $1;

  }

  else if(/\s\}()/)

  {

    $flag--;

    $tail = $2;

    $tail =~s/\s+$//g; // 去行尾空格

    print OUT ' ' x ($flag4);

    print OUT '}'$tail"\n";

  }

}

; 第一章:缩进格式 Tab是 个字符 于是缩进也是 个字符 有很多怪异的风格 他们将缩进格式定义为 个字符(设置为 个字符!)的深度 这就象试图将PI定义为 一样让人难以接受

理由是:缩进的大小是为了清楚的定义一个块的开始和结束 特别是当你已经在计算机前面呆了 多个小时了以后 你会发现一个大的缩进格式使得你对程序的理解更容易

现在 有一些人说 使用 个字符的缩进使得代码离右边很近 在 个字符宽度的终端屏幕上看程序很难受 回答是 但你的程序有 个以上的缩进的时候 你就应该修改你的程序 总之 个字符的缩进使得程序易读 还有一个附加的好处 就是它能在你将程序变得嵌套层数太多的时候给你警告 这个时候 你应该修改你的程序

第二章:大符号的位置 另外一个C程序编程风格的问题是对大括号的处理 同缩进大小不同 几乎没有什么理由去选择一种而不选择另外一种风格 但有一种推荐的风格 它是Kernighan和Ritchie的经典的那本书带来的 它将开始的大括号放在一行的最后 而将结束大括号放在一行的第一位 如下所示:

if (x is true) { we do y } 然而 还有一种特殊的情况:命名函数:开始的括号是放在下一行的第一位 如下:int function(int x) { body of function } 所有非正统的人会非难这种不一致性 但是 所有思维正常的人明白: (第一) K&R是___对___的 (第二)如果K&R不对 请参见第一条 (: )) 另外 函数也是特殊的 不一定非得一致

需要注意的是结束的括号在它所占的那一行是空的 __除了__它跟随着同一条语句的继续符号 如 while 在do while循环中 或者 else 在if语句中 如下:

do { body of do loop } while (condition); 以及if (x == y) { } else if (x > y) { } else { }

理由: K&R 另外 注意到这种大括号的放置方法减小了空行的数量 但却没有减少可读性 于是 在屏幕大小受到限制的时候 你就可以有更多的空行来写些注释了

第三章:命名系统

C是一种简洁的语言 那么 命名也应该是简洁的 同MODULE 以及ASCAL语言不同的是 C程序员不使用诸如ThisVariableIsATemporaryCounter之类的命名方式 一个C语言的程序员会将之命名为 tmp 这很容易书写 且并不是那么难以去理解

然而 当混合类型的名字不得不出现的时候 描述性名字对全局变量来说是必要的了 调用一个名为 foo 全局的函数是很让人恼火的 全局变量(只有你必须使用的时候才使用它) 就象全局函数一样 需要描述性的命名方式 假如你有一个函数用来计算活动用户的数量 你应该这样命名 count_active_users() 或另外的相近的形式 你不应命名为 cntusr()

有一种称为Hungarian命名方式 它将函数的类型编码写入变量名中 这种方式是脑子有毛病的一种表现 编译器知道这个类型而且会去检查它 而这样只会迷惑程序员 知道为什么Micro$oft为什么会生产这么多 臭虫 程序了把!!

局部变量的命名应该短小精悍 假如你有一个随机的整数循环计数器 它有可能有 i 如果没有任何可能使得它能被误解的话 将其写作 loop_counter 是效率低下的 同样的 tmp 可以是任何临时数值的函数变量

如果你害怕混淆你的局部变量的名字 还有另外一个问题 就是称function growth hormone imbalancesyndrome

第四章:函数 函数应该短小而迷人 而且它只作一件事情 它应只覆盖一到两个屏幕( 一屏) 并且只作一件事情 而且将它做好 (这不就是UNIX的风格吗 译者注)

一个函数的最大长度和函数的复杂程度以及缩进大小成反比 于是 如果你已经写了简单但长度较长的的函数 而且你已经对不同的情况做了很多很小的事情 写一个更长一点的函数也是无所谓的

然而 假如你要写一个很复杂的函数 而且你已经估计到假如一般人读这个函数 他可能都不知道这个函数在说些什么 这个时候 使用具有描述性名字的有帮助的函数

另外一个需要考虑的是局部变量的数量 他们不应该超过 个 否则你有可能会出错 重新考虑这个函数 将他们分割成更小的函数 人的大脑通常可以很容易的记住 件不同的事情 超过这个数量会引起混乱 你知道你很聪明 但是你可能仍想去明白 周以前的做的事情

第 章:注释 注释是一件很好的事情 但是过多的注释也是危险的 不要试图区解释你的代码是注释如何如何的好:你应该将代码写得更好 而不是花费大量的时间去解释那些糟糕的代码

通常情况下 你的注释是说明你的代码做些什么 而不是怎么做的 而且 要试图避免将注释插在一个函数体里:假如这个函数确实很复杂 你需要在其中有部分的注释 你应该回到第四章看看 你可以写些简短的注释来注明或警告那些你认为特别聪明(或极其丑陋)的部分 但是你必须要避免过多 取而代之的是 将注释写在函数前 告诉别人它做些什么事情 和可能为什么要这样做

第六章:你已经深陷其中了 不要着急 你有可能已经被告之 GUN emacs 会自动的帮你处理C的源代码格式 而且你已经看到它确实如此 但是 缺省的情况下 它的作用还是不尽如人意(实际上 他们比随便敲出来的东西还要难看 ainfinite number of monkeys typing into GNU emacs would never make a good program)

于是 你可以要么不要使用GUN emacs 要么让它使用sanervalules 使用后者 你需要将如下的语句输入到你的 emacs文件中 (defun linux c mode() C mode with adjusted defaults for use with the Linux kernel (interactive) (c mode) (c set style K&R ) (setq c basic offset )) 这会定义一个M x Linux c mode的命令 当你hacking一个模块的时候 如何你将 linux c 输入在最开始的两行 这个模式会自动起作用 而且 你也许想加入如下

(setq auto mode alist (cons ( /usr/src/linux / \\ 〖ch〗$ linux c mode) auto mode alist)) 到你的 emacs文件中 这样的话 当你在/usr/src/linux下编辑文件的时候 它会自动切换到linux c mode

但是 假如你还不能让emaces去自动处理文件的格式 不要紧张 你还有一样东西: 缩进

GNU的缩进格式也很死板 这就是你为什么需要加上几行命令选项 然而 这还不算太坏 因为GNU缩进格式的创造者也记得K&R的权威 (GNU没有罪 他们仅仅是在这件事情上错误的引导了人们) 你要做的就只有输入选项 kr i (表示 K&R 缩进 个字符)

缩进 有很多功能 特别是当它建议你重新格式你的代码的时候 你应该看看帮助 但要记住: 缩进 不是风格很差的程序的万灵丹

lishixinzhi/Article/program/net/201311/13283

首先定义一个链表。

struct

node

{

int

id;

struct

node

next;

};

接下来写一些 *** 作的函数(插入,删除等等)。

插入函数:

struct

node

insert(struct

node

pNode,

int

iTemp)

{

//判断

pNode

是否为空。

if(pNode==NULL)

{

//这个节点是空,返回错误。

return

NULL;

}

//

创建一个新的节点。

struct

node

tempNode

=

(struct

node)malloc(sizeof(struct

node));

tempNode->id=

iTemp;

if(pNode->next

==

NULL)

{

pNode->next

=

tempNode;

tempNode->next

=

NULL;

}else

{

struct

node

pNext

=

pNode->next;

pNode->next

=

tempNode;

tempNode->next

=

pNext;

}

return

tempNode;

}

int

main()

{

struct

node

head

=

(struct

node)malloc(sizeof(struct

node));

head->id

=

0;

head->next

=

NULL;

struct

node

ptemp;

ptemp

=

head;

for(

int

i=1;

i<10;

i++)

{

struct

node

temp

=

insert(ptemp,i);

ptemp

=

temp;

}

return

0;

}

以上就是关于c语言程序设计流程图怎么画具体有什么规范全部的内容,包括:c语言程序设计流程图怎么画具体有什么规范、求助:C语言书写规范、C语言 代码 怎么写的规范 把下面的 写的规范等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9693116.html

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

发表评论

登录后才能评论

评论列表(0条)

保存