`
runfeel
  • 浏览: 935795 次
文章分类
社区版块
存档分类
最新评论

别告诉我你懂数组(2)

 
阅读更多

2、整洁的代码

程序1-1的三宗罪,分别是:代码冗长、容易出错和重用效果差。当然罗,现在网络上面最流行找茬,别说三宗,n宗都可以找到。其实无论在网络上还是工作中,找茬都不是问题,问题是找到“茬”之后如何解决之。

【程序变】

应该说,程序1-1的“处理代码”段遵循如下规则:

, szBuf+域起始位置);

[长度s=0s=s+长度;

另外定义一个字符串数组i+1个数据域时,只需将数据拷贝入

处理代码字段可以抽象为:

  1. //第i次循环
  2. strncpy(varData[i],szBuf+s,len[i]);
  3. varData[i][len[i]]=0;
  4. s=s+len[i];

于是,程序可以通过循环方式化简如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #defineLEN7
  4. intmain(intargc,char*argv[])
  5. {
  6. charszBuf[]="9559901010008888888木鸿飞600.0020110630063001230000测试一次";
  7. charvarData[LEN][20];//记载所有数据域的数组
  8. intlen[LEN]={19,8,12,8,8,4,10};
  9. ints=0,i;
  10. /*以下为处理代码*/
  11. for(i=0;i<LEN;i++)
  12. {
  13. strncpy(varData[i],szBuf+s,len[i]);
  14. varData[i][len[i]]=0;
  15. s+=len[i];
  16. }
  17. /*以下为打印代码*/
  18. for(i=0;i<LEN;i++)
  19. {
  20. printf("第%d号域,【%s】\n",i+1,varData[i]);
  21. }
  22. system("PAUSE");
  23. return0;
  24. }

代码1-3

【技巧】

其一、上述程序中使用了宏“#define LEN 7”,利用LEN来代替数字7,这种做法是为了便于程序扩展。假设不使用宏LEN,则代码中必定多次出现数字7(本处为4次),而一旦需求变更,数据域数量增加或是减少,就必须更改代码中的每一次,一旦漏掉了某处,都将给程序代码不可估量的损失。使用宏LEN后,只需一次更改即可。

其二、数字元素本身可以作为数组的下标,比如表达式varData[i][len[i]]中,数组元素len[i]成为了二维数组varData的下标。

【疑问】

需求中要求将各个域数据存入szAccnoszName等数组中,而代码13似乎太过于大胆了,居然私自更改需求,将之存储与另外的字符串数组中,如此行为,是可忍熟不可忍。

【编程浪子曰】

用户的需求是可以引导的。

很多时候,用户并不是特别清楚自己的需求,尤其在某些细节方便。比如本处,开发者完全可以引导客户,比如说:“数据域的存储位置无所谓,只要能够拆分出来就可以了。”

【程序又变】

但是,有的时候,有的客户是很执着的,他认定的需求就是不能更改,此时需求再难也必须不折不扣的完成。

再次回到程序的处理核心,如下:

strncpy(域字符串变量, szBuf + s, len[i]);

域字符串变量[len[i]]=0;

s = s + len[i];

其实,前面已经有了成功方案,就是将一群完全不关联的数据域长度集合到一个整型数组中。既然可以集合整数,当然也可以集合“字符串变量”,要知道字符串变量本质上就是指针,那么完全可以将之集合到一个指针数组之中。

【点子】varP,其元素的类型是字符串指针(

大家千万不要一听说“指针数组”就觉得一个头有两个大,其实很简单,就是一个数组,这数组的每个元素都是一个指针,其定义方式如下:

varP[0] = szAccno;

char * varP[LEN] = {szAccno, szName, szAmt, szDate, szLine, szStatus, szBz};

有关指针数组的详细介绍,等到本书“指针与数组”一章中会有详细介绍,这里还是先看程序的改变结果,如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #defineLEN7
  4. intmain(intargc,char*argv[])
  5. {
  6. charszBuf[]="9559901010008888888木鸿飞600.0020110630063001230000测试一次";
  7. charszAccno[20];//代表"账户"
  8. charszName[9];//代表"姓名"
  9. charszAmt[13];//代表"交易金额"
  10. charszDate[9];//代表"交易日期"
  11. charszLine[9];//代表"交易流水号"
  12. charszStatus[5];//代表"交易状态"
  13. charszBz[11];//代表"交易说明"
  14. charvarData[LEN][20];//记载所有数据域的数组
  15. intlen[LEN]={19,8,12,8,8,4,10};
  16. char*varP[LEN]={szAccno,szName,szAmt,szDate,szLine,szStatus,szBz};
  17. /*以下为处理代码*/
  18. ints=0,i;
  19. for(i=0;i<LEN;i++)
  20. {
  21. strncpy(varP[i],szBuf+s,len[i]);
  22. (varP[i])[len[i]]=0;
  23. s+=len[i];
  24. }
  25. /*以下为打印代码*/
  26. for(i=0;i<LEN;i++)
  27. {
  28. printf("第%d号域,【%s】\n",i+1,varP[i]);
  29. }
  30. system("PAUSE");
  31. return0;
  32. }

代码1-3

【总结】

数组的妙用之一就在于其能化繁杂为简单,将一系列毫无联系的内容集合在一个数组中,就可以通过循环的方式处理之,从而大大的简化程序代码。

作业3

上述程序在设计好之后需求发生变更,报文格式变更如下:

字符串第1位~8位代表了“交易日期”;//位置提前

字符串第9位~20位代表了“交易流水号”;//位置提前,长度加长

字符串第21位~39位代表了“账户”;

字符串第40位~47位代表了“姓名”;

字符串第48位~63位代表了“交易金额”;//长度加长

字符串第64位~71位代表了“传票号//新增域

字符串第72位~75位代表了“交易状态”;

//取消了“备注”域。

字符串实例和变量情况如下:

  1. charszBuf[]="201106300630123456789559901010008888888木鸿飞600.00999912340000";
  2. charszAccno[20];//代表“账户”
  3. charszName[9];//代表“姓名”
  4. charszAmt[17];//代表“交易金额”
  5. charszDate[9];//代表“交易日期”
  6. charszLine[13];//代表“交易流水号”
  7. charszStatus[5];//代表“交易状态”
  8. charszBill[9];//代表“传票”

作业4

上述程序在设计好之后需求发生变更,运行结果要求打印每号域的域说明,比如:

1号域,账号,【9559901010008888888

2号域,户名,【木鸿飞

前一篇 目录 后一篇

PS1:欢迎跟帖,写下自己的作业心得。

PS2:征求名称

本书将讲述数组相关的知识与应用,适用语言:C语言。

描述显示:每次通过一个案例来说明。比如当前为字符串报文解析程序,接下来马上使用音乐演奏程序。

目前考虑的名称有:

(1)数组达人成长之路。

(2)我爱数组

(3)别告诉我你懂数组

(4)数组玩转趣味程序

你觉得那个名称更加吸取眼球,或者你有什么好的建议,欢迎跟帖。

喜欢的同学,请点击“顶”字,可千万别点击“踩”了。

分享到:
评论

相关推荐

    [别告诉我你懂电脑]

    看到别人娴熟的运用电脑,并时不时炫耀着令人惊讶的操作妙招时,是不是总是会有种不可名状的郁闷感?take it easy!本书将帮你重建电脑高手的成就感,教会你150个意想不到的省时实用的电脑操作的秒杀妙招!

    别告诉我你懂电脑

    内容摘要:内容简介《别告诉我你懂电脑:150个意想不到的省时实用电脑操作秒杀秘技》内容简介:看到同事和朋友娴熟地运用着电脑,并时不时炫耀着令人惊讶的操作妙招时,一点都不感至羡慕和嫉妒当别人求助自己解决电脑...

    [别说你懂Excel:500招玩转Excel表格与数据处理].前沿文化.扫描版 part2

    中文名: 别说你懂Excel:500招玩转Excel表格与数据处理(附完整光盘数据) 作者: 前沿文化图书fenlei: 软件 资源格式: PDF 版本: 扫描版 出版社: 科学出版社书号: 9787030371782发行时间: 2013年05月 地区: 大陆 语言:...

    别说告诉我你懂PPT--学习笔记

    标题中的“别说告诉我你懂PPT--学习笔记”暗示了这是一个关于PowerPoint(PPT)制作和技巧的学习资源。从描述中的博文链接可以推测,这可能是一位博主分享的个人学习经验或者技巧总结,旨在帮助读者提升PPT的制作...

    别告诉我你懂Excel:Excel的工作智慧

    赵鑫.扫描版电子书,对于初学者来说是一份不错的学习资料。

    别说你懂ppt

    通过学习《别说你懂PPT》中的这些要点,并结合提供的“别告诉我你懂PPT(完整扫描版)-bbs.pcice.net.pdf”文档,你可以逐步提升自己的PPT制作技能,无论是在学术报告、商务演讲还是个人分享中,都能制作出引人入胜...

    别说你懂iPad2.pdf

    中文名: 别说你懂iPad2 作者: 王毅 资源格式: PDF 版本: 扫描版 出版社: 重庆出版社书号: 9787229042158发行时间: 2011年6月 地区: 大陆 语言: 简体中文 简介: 内容介绍: 要想玩转iPad2,最重要的当然是玩转...

    别说你懂PPT

    标题:“别说你懂PPT”和描述:“入职后如何制作专业翔实的PPT的实用教程以及相关的表述技巧”向我们揭示了制作和表述PPT的重要性,以及如何在职场中有效地使用这一工具。以下详细知识点将围绕PPT制作技巧、内容设计...

    别说你懂Excel:500招玩转Excel表格与数据处理 part1

    中文名: 别说你懂Excel:500招玩转Excel表格与数据处理(附完整光盘数据) 作者: 前沿文化图书fenlei: 软件 资源格式: PDF 版本: 扫描版 出版社: 科学出版社书号: 9787030371782发行时间: 2013年05月 地区: 大陆 语言:...

    请不要告诉我你懂css margin

    介于此我打算写下这篇文章,一来是自己工作中的总结,也是对自己知识的一次梳理。 Margin是什么 CSS 边距属性定义元素周围的空间。通过使用单独的属性,可以对上、右、下、左的外边距进行设置。也可以使用简写的

    别说你懂Excel:500招玩转Excel表格与数据处理(附完整光盘数据).rar

    《别说你懂Excel:500招玩转Excel表格与数据处理》是一本全面介绍Excel在数据管理和分析领域的实用指南。这本书旨在通过500个技巧和实例,帮助读者掌握Excel的各种功能,提升数据处理效率。书中附带的完整光盘数据...

    别说你懂iPad2

    出版社: 重庆出版社 发行时间: 2011年6月 内容介绍: ...第2章 搞定iPad2不可不知的5招 第3章 5分钟玩转App 第4章 趣味娱乐 全家共分享 第5章 常用工具 让iPad更给力 第6章 潮流读客 方寸知天下 ………

    别说你懂Excel:500招玩转Excel表格与数据处理.pdf

    以技巧的形式,主要集中介绍了Office组件中Excel日常办公应用与技巧。内容包括:Excel表格数据输入与编辑技巧,Excel公式与函数应用技巧、Excel数据排序、筛选、分析技巧,Excel图表应用技巧等方面的内容。

    池塘夜降彩色雨

    这是一个用比较简单的方法实现的数据结构课程设计,大量使用了控制标记,只要你懂0和1的逻辑,只要你懂数组和结构体,就能理解代码。代码做出的效果不错,亮点是雨滴,风和雷的动态控制,加上多线程的音效,较为逼真...

Global site tag (gtag.js) - Google Analytics