必胜高考网_全国高考备考和志愿填报信息平台

必勝高考網 > 計算機類 > 計算機等級 > 資訊 >

計算機等級考試四級上機編程修養(中)

時間: 家輝2 資訊

  *

  * 文件名:network.c

  *

  * 文件描述:網絡通訊函數集

  *

  * 創建人: Hao Chen, 2003年2月3日

  *

  * 版本號:1.0

  *

  * 修改記錄:

  *

  *

  ************************************************************************/

  而對于函數來說,應該也有類似于這樣的注釋:

  /*================================================================

  *

  * 函 數 名:XXX

  *

  * 參 數:

  *

  * type name [IN] : descripts

  *

  * 功能描述:

  *

  * ..............

  *

  * 返 回 值:成功TRUE,失敗FALSE

  *

  * 拋出異常:

  *

  * 作 者:ChenHao 2003/4/2

  *

  *

  ================================================================*/

  這樣的描述可以讓人對一個函數,一個文件有一個總體的認識,對代碼的易讀性和易維護

  性有很大的好處。這是好的作品產生的開始。

  2、縮進、空格、換行、空行、對齊

  ————————————————

  i) 縮進應該是每個程序都會做的,只要學程序過程序就應該知道這個,但是我仍然看過不 縮進的程序,或是亂縮進的程序,如果你的公司還有寫程序不縮進的程序員,請毫不猶豫 的開除他吧,并以破壞源碼罪起訴他,還要他賠償讀過他程序的人的精神損失費。縮進, 這是不成文規矩,我再重提一下吧,一個縮進一般是一個TAB鍵或是4個空格。(最好用TAB 鍵)

  ii) 空格。空格能給程序代來什么損失嗎?沒有,有效的利用空格可以讓你的程序讀進來更加賞心悅目。而不一堆表達式擠在一起。看看下面的代碼:

  ha=(ha*128+*key++)%tabPtr->size;

  ha = ( ha * 128 + *key++ ) % tabPtr->size;

  有空格和沒有空格的感覺不一樣吧。一般來說,語句中要在各個操作符間加空格,函數調用時,要以各個參數間加空格。如下面這種加空格的和不加的:

  if ((hProc=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid))==NULL){

  }

  if ( ( hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid) ) == NULL ){

  }

  iii) 換行。不要把語句都寫在一行上,這樣很不好。如:

  for(i=0;i’9’)&&(a[i]<’a’||a[i]>’z’)) break;

  我拷,這種即無空格,又無換行的程序在寫什么啊?加上空格和換行吧。

  for ( i=0; i if ( ( a[i] < ’0’ || a[i] > ’9’ ) &&

  ( a[i] < ’a’ || a[i] > ’z’ ) ) {

  break;

  }

  }

  好多了吧?有時候,函數參數多的時候,最好也換行,如:

  CreateProcess(

  NULL,

  cmdbuf,

  NULL,

  NULL,

  bInhH,

  dwCrtFlags,

  envbuf,

  NULL,

  &siStartInfo,

  &prInfo

  );

  條件語句也應該在必要時換行:

  if ( ch >= ’0’ || ch <= ’9’ ||

  ch >= ’a’ || ch <= ’z’ ||

  ch >= ’A’ || ch <= ’Z’ )

  iv) 空行。不要不加空行,空行可以區分不同的程序塊,程序塊間,最好加上空行。如:

  HANDLE hProcess;

  PROCESS_T procInfo;

  /* open the process handle */

  if((hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid)) == NULL)

  {

  return LSE_MISC_SYS;

  }

  memset(&procInfo, 0, sizeof(procInfo));

  procInfo.idProc = pid;

  procInfo.hdProc = hProcess;

  procInfo.misc |= MSC***A_PROC;

  return(0);

  v) 對齊。用TAB鍵對齊你的一些變量的聲明或注釋,一樣會讓你的程序好看一些。如:

  typedef struct _pt_man_t_ {

  int numProc; /* Number of processes */

  int maxProc; /* Max Number of processes */

  int maxProc; /* Max Number of processes */

  int numEvnt; /* Number of events */

  int maxEvnt; /* Max Number of events */

  HANDLE* pHndEvnt; /* Array of events */

  DWORD timeout; /* Time out interval */

  HANDLE hPipe; /* Namedpipe */

  TCHAR usr[MAXUSR];/* User name of the process */

  int numMsg; /* Number of Message */

  int Msg[MAXMSG];/* Space for intro process communicate */

  } PT_MAN_T;

  怎么樣?感覺不錯吧。

  這里主要講述了如果寫出讓人賞心悅目的代碼,好看的代碼會讓人的心情愉快,讀起代碼也就不累,工整、整潔的程序代碼,通常更讓人歡迎,也更讓人稱道。現在的硬盤空間這么大,不要讓你的代碼擠在一起,這樣它們會抱怨你虐待它們的。好了,用“縮進、空格、換行、空行、對齊”裝飾你的代碼吧,讓他們從沒有秩序的土匪中變成一排排整齊有秩序的正規部隊吧。

  i) 對于行注釋(“//”)比塊注釋(“/* */”)要好的說法,我并不是很同意。因為一些老版本的C編譯器并不支持行注釋,所以為了你的程序的移植性,請你還是盡量使用塊注釋。

  ii) 你也許會為塊注釋的不能嵌套而不爽,那么你可以用預編譯來完成這個功能。使用“# if 0”和“#endif”括起來的代碼,將不被編譯,而且還可以嵌套。

  4、函數的[in][out]參數

  ———————————

  我經常看到這樣的程序:

  FuncName(char* str)

  {

  int len = strlen(str);

  .....

  }

  char*

  GetUserName(struct user* pUser)

  {

  return pUser->name;

  }

  不!請不要這樣做。

  你應該先判斷一下傳進來的那個指針是不是為空。如果傳進來的指針為空的話,那么,你的一個大的系統就會因為這一個小的函數而崩潰。一種更好的技術是使用斷言(assert),這里我就不多說這些技術細節了。當然,如果是在C++中,引用要比指針好得多,但你也需要對各個參數進行檢查。

  寫有參數的函數時,首要工作,就是要對傳進來的所有參數進行合法性檢查。而對于傳出的參數也應該進行檢查,這個動作當然應該在函數的外部,也就是說,調用完一個函數后,應該對其傳出的值進行檢查。

  當然,檢查會浪費一點時間,但為了整個系統不至于出現“非法操作”或是“Core Dump”的系統級的錯誤,多花這點時間還是很值得的。

  5、對系統調用的返回進行判斷

  ——————————————

  繼續上一條,對于一些系統調用,比如打開文件,我經常看到,許多程序員對fopen返回的指針不做任何判斷,就直接使用了。然后發現文件的內容怎么也讀出不,或是怎么也寫不進去。還是判斷一下吧:

  fp = fopen("log.txt", "a");

  if ( fp == NULL ){

  printf("Error: open file error\n");

  return FALSE;

  }

  其它還有許多啦,比如:socket返回的socket號,malloc返回的內存。請對這些系統調用返回的東西進行判斷。

55479 主站蜘蛛池模板: 锤式粉碎机,医药粉碎机,锥式粉碎机-无锡市迪麦森机械制造有限公司 | RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 专业的压球机生产线及解决方案厂家-河南腾达机械厂 | 聚丙烯酰胺PAM-聚合氯化铝PAC-絮凝剂-河南博旭环保科技有限公司 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 金属波纹补偿器厂家_不锈钢膨胀节价格_非金属伸缩节定制-庆达补偿器 | 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 吸污车_吸粪车_抽粪车_电动三轮吸粪车_真空吸污车_高压清洗吸污车-远大汽车制造有限公司 | 上海刑事律师|刑事辩护律师|专业刑事犯罪辩护律师免费咨询-[尤辰荣]金牌上海刑事律师团队 | 破碎机锤头_合金耐磨锤头_郑州宇耐机械工程技术有限公司 | 特种电缆厂家-硅橡胶耐高温电缆-耐低温补偿导线-安徽万邦特种电缆有限公司 | 【甲方装饰】合肥工装公司-合肥装修设计公司,专业从事安徽办公室、店面、售楼部、餐饮店、厂房装修设计服务 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 工业PH计|工业ph酸度计|在线PH计价格-合肥卓尔仪器仪表有限公司 济南画室培训-美术高考培训-山东艺霖艺术培训画室 | 代理记账_公司起名核名_公司注册_工商注册-睿婕实业有限公司 | ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 骁龙云呼电销防封号系统-axb电销平台-外呼稳定『免费试用』 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 焦作网 WWW.JZRB.COM| 万博士范文网-您身边的范文参考网站Vanbs.com | 暖气片十大品牌厂家_铜铝复合暖气片厂家_暖气片什么牌子好_欣鑫达散热器 | 四川成人高考_四川成考报名网| 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | 拉曼光谱仪_便携式|激光|显微共焦拉曼光谱仪-北京卓立汉光仪器有限公司 | UV-1800紫外光度计-紫外可见光度计厂家-翱艺仪器(上海)有限公司 | 智能监控-安防监控-监控系统安装-弱电工程公司_成都万全电子 | 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 北京遮阳网-防尘盖土网-盖土草坪-迷彩网-防尘网生产厂家-京兴科技 | 铝镁锰板厂家_进口钛锌板_铝镁锰波浪板_铝镁锰墙面板_铝镁锰屋面-杭州军晟金属建筑材料 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | UV固化机_UVLED光固化机_UV干燥机生产厂家-上海冠顶公司专业生产UV固化机设备 | 岩棉板|岩棉复合板|聚氨酯夹芯板|岩棉夹芯板|彩钢夹芯板-江苏恒海钢结构 | 档案密集架_电动密集架_移动密集架_辽宁档案密集架-盛隆柜业厂家现货批发销售价格公道 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 贴板式电磁阀-不锈钢-气动上展式放料阀-上海弗雷西阀门有限公司 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 滤芯,过滤器,滤油机,贺德克滤芯,精密滤芯_新乡市宇清流体净化技术有限公司 | 威客电竞(vk·game)·电子竞技赛事官网 | 隧道窑炉,隧道窑炉厂家-山东艾瑶国际贸易 | 全自动面膜机_面膜折叠机价格_面膜灌装机定制_高速折棉机厂家-深圳市益豪科技有限公司 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 |