最近在南邮华为俱乐部做了一次小小的交流,讲的内容是“浅谈ACM盲区”,这里我把主要内容整理出来,如果有不正确的地方欢迎指正。
首先我们来谈谈ACM练习的必要性,正如大家所知,ACM可以:
1.提高编程能力(递归、指针、函数、结构……)
2.学习算法(分治、动态规划、回溯……)
3.锻炼思维
……
但是,不得不对ACMer提醒的是,ACM作为一个竞赛,其具有相当的挑战性,亦具有局限性。如若想全面发展,以下的几个ACM盲区是我们所不能忽视的。
(一)界面友好
即使是在Linux中的开发,也是需要界面友好的,更不用提Windows的界面开发(MFC、Java GUI等)。而在ACM中,一般很少有人去考虑界面的设计以及人机交互。在这里,我做一个简单的提示,可以利用main()函数的参数扩展程序功能。
例如:

void main (int arg0, char** arg1)
{if (arg0 == 2 && strcmp (arg1[1], "-help") == 0){showHelpInformation();}//……
}

(二)编程规范
变量和函数的命名规范,一定要用有意义的字符,而且尽量用英文。不能用无意义的字符,或者用拼音。
例如:

double getVariance(int *array,int length);
void encrypt(char *plain,char *key,char cipher);
double stdIcValue,minIcValue;

这里我再举三个例子,来说明变量命名的规范性。例子所实现的功能是对一个三位数的百位、十位、个位进行分解。

int x;
int v=x%10;
int vv=x/10%10;
int vvv=x/100;
printf("%d %d %d ",v,vv,vvv);
int x;
int gw=x%10;
int sw=x/10%10;
int bw=x/100;
printf("%d %d %d ",gw,sw,bw);
int x;
int single=x%10;
int decade=x/10%10;
int hundred=x/100;
printf("%d %d %d ", single,decade,hundred);

显然,第三种写法更符合规范,也让人一目了然。
在这里,我在讲一下变量和函数的命名格式,目前主流的写法是采用驼峰式命名。

//变量:开头字母小写
stdIcValue,textField//函数:开头字母小写
double getVariance(int *array,int length)
View findViewById(int id)
void setOnClickListener(OnClickListener l)//类、结构: 开头字母大写
SQLiteOpenHelper LocationListener//常量: 全大写
#define INFTY 99999
const int INFTY=99999;
final int INFTY=99999;

还有一点非常重要的规范是关于缩进,从逻辑上来讲,我们把相互对应的代码块进行相同的缩进。下面是一个典型的错误范例,其功能是判断一个考分是否及格。

if(score>=0 && score<=100)if(score>=60) printf("pass\n");
else printf("failed\n")

很显然,下面的else应该与第二个if配对,在这里缩进,虽然代码是正确无误的,但是不符合规范。正确的写法应该如下所示:

if(score>=0 && score<=100)
{if(score>=60) printf("pass\n");else printf("failed\n");
}

再下面我讲讲关于注释,一般地,我们尽量用英文来保证兼容性。例如下面的递归的例子:

void solve(int *answer,int step,int currentTotal,int *change,int length,int money)
{//answer is a stack array, step is the level of recursion//currentTotal is the current change numbers//change is a const array ([11,17,5,1]), length is the length of const array (4)//money is a const of total money (20)int cnt,i;if(step>length) return;if(currentTotal>currentMin) return;……
}

同时,我们可以使用/* */来进行小规模或大规模注释,例如在下面的例子中,我们仅仅希望去除函数中最后一个参数的声明:

void recursion(int *answer,int step/*,int *pcnt*/)
{
//  ……recursion(answer,step+1/*,int *pcnt*/);
//  (*pcnt)++;
}void main()
{int *answer=(int*)malloc(20*sizeof(int))/*,cnt=0*/;recursion(answer,0/*,&cnt*/);
//  printf("cnt=%d\n",cnt);
}

最后,关于编程规范,我讲讲程序的可移植性、函数封装与模块耦合,一般函数的封装要保证其逻辑性,并将使用者的权限降至最低。
举个简单的例子吧。

void outputArray(int *array,int length)
{int i;for(i=0;i<length;i++)printf("%d ",array[i]);printf("\n");
}
void main()
{int array[]={1,2,3,4,5};int length=sizeof(array)/sizeof(int);outputArray(array,length);
}

这是一个正确的例子,outputArray()函数实现了对数组的输出,其符合逻辑性。而有些人在实现其输出时,将回车符的输出printf(“\n”)写在main()函数中。虽然这样同样能得到正确的结果,但是输出功能应该属于函数outputArray(),放在main()函数中实为不妥,不符合逻辑性。

(三)非实用性方法
ACM中一些“独特”的方法,例如打表法、O(n)排序法等,在今后的工作岗位中,几乎不可能用到。我的建议是,ACM中用用就好,别太当回事即可。
举个打表法的例子:

NOJ 1025 请在从1到某个整数范围中打印出所有的完数来,所谓“完数”是指一个数恰好等于它的所有不同因子之和。其中输入的数字n(1<n<10000)
样例输入
100
5000

样例输出
100: 6 28
5000: 6 28 496

如果不用打表法,很难在规定时间内得出结果。但是,如果打表,则相当简单,下面我给出核心代码。

if(n>=6) printf(" 6");
if(n>=28) printf(" 28");
if(n>=496) printf(" 496");
if(n>=8128) printf(" 8128");
printf("\n");

(四)实用性编程
关于实用性编程,我的建议是,在熟练玩转ACM的基础上,至少掌握一个。常见的实用性编程包括但不局限于以下:
Linux下的进程、通信、数据库、GNOME(或Qt)编程
Android 开发
C++ MFC
LAMP Web开发体系(Linux、Apache、MySQL、PHP)

(五)面向对象编程
在ACM中,很少接触到面向对象编程。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。对面向对象的介绍,我会在下一个博客中进行简介。同时会举出一个生动的例子,供大家参考。

essay 浅谈ACM盲区(上)相关推荐

  1. 学生专用计算机玩游戏教学,浅谈信息技术课上学生玩游戏的现象

    浅谈信息技术课上学生玩游戏的现象 单位:南昌十七中  姓名:罗奎   邮编330029 内容摘要:在信息技术教学中,学生玩游戏是一个较为普遍现象.学生专注的玩游戏,影响了教师的教学效果,产生了不良影响 ...

  2. 浅谈Bypass Waf - 上(基础篇)

    文章来源|MS08067 Web漏洞挖掘班 第3期 本文作者:Hi2x(Web漏洞挖掘班讲师) 0x00 前言 在了解Bypass Waf之前,我们应该首先了解一些前置知识: 1.Waf是什么 2.W ...

  3. 与gps优缺点_浅谈用于洒水车上的液位传感器和GPS模块

    每天清晨都能看到洒水车工作,正是因为洒水车每天对路面进行洒水,才能保证公路不会因为高温而损害,从而起到良好的除尘效果.但是,在洒水车工作的时候,工作人员是如何知道车罐里面没有水了呢?这就需要用到液位传 ...

  4. 浅谈 TypeScript【上】-- Flow 静态类型检查工具

    文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在[编程语言分类]中,我介绍到JavaScript是一种类型不安全语言,没有明确的数据类型声明,变量的类型可以随意的更改.为了解决这种问题,微软开发 ...

  5. 浅谈网站流量上不去的原因

    为什么我们要花费大量的精力来开发好网站,并在后期花费更多的人力和财力来维护和优化推广?为了通过网站创造一定的利益,为了创造利益,我们必须有一定的流量.也许你坚持每天建立外部链接,也许你坚持每天更新网站 ...

  6. 浅谈中国历史上的四大叛将!

    中国历史上对于臣子推崇忠贞不屈,不能有二心,对于忠臣是歌颂立碑.而对于那些因利善变.反叛的小人是大大的谴责和笔伐.这次就来谈谈中国历史上有名的叛将,本人选出了四位,评选标准,一是要有名气,大家都知道; ...

  7. 浅谈跟美女上床和次贷危机

    有一天,一位其貌不扬的男士,带着一位十分艳丽的OL,来到Causeway Bay一家LV店.他为OL选了一价值6万5千元的LV handbag. 付款时,男士掏出支票本,十分潇洒地签了一张支票.店员有 ...

  8. html语言显示动态当前日期和时间,举一反三 浅谈在网页上显示日期的两种方法-网页设计,HTML/CSS...

    在上网的时候,经常会在一些网页上看到当前的日期,如:"今天是×年×月×日星期×"等字样.为了显示系统当前的日期,一般采用脚本语言vbscript或javascript,两种语言有其 ...

  9. 浅谈中国文学史上的几位奇葩

    先是屈原,在袁版教材上被称作是"一朵奇葩"的人物,一人引领先秦时期的风骚,仅此一朵,便胜却先秦几百年间数人.被胡适之怀疑历史上是否真实存在这个人哈哈哈,我相信他肯定是存在的.你若说 ...

  10. 跑三小时的monkey测试该怎么算_浅谈App测试(下)~带音频

    文 | Vicky 采编|Emily 浅谈App测试(上)-带音频 一.功能测试​ 二.性能测试 (1)耗电量 影响因素:定位.传感器.蓝牙,其中CPU.持续定位是两个平台造成耗电的主要因素. (2) ...

最新文章

  1. 深度|10分钟读懂阿里巴巴高级专家在Flutter Live2018的分享
  2. 搜狗浏览器收藏夹在哪_是时候换个快速安全的浏览器了,这一次它一定不负众望...
  3. 实时光线追踪技术:业界发展近况与未来挑战
  4. DbVisualizer 8 解决中文乱码问题
  5. html的id不能有.吗,html – 哪些DOM元素不能接受id?
  6. [设计模式-结构型]装饰模式(Decorator)
  7. php 给图片加水印
  8. mysql关于连接查询
  9. 快速学习Linux-网络管理
  10. win7用ip查找网络计算机,win7通过ip地址查找计算机名的两种方法(图文教程)
  11. 我要偷偷的学Python,然后惊呆所有人(第六天)
  12. Anno 让微服务、混合编程更简单(Net love Java)
  13. 业务应用数据库压力过大解决方案
  14. 高数 04.03分部积分法
  15. 编码字符串,使得总长度最短
  16. 计算机基础---03Excel篇(入门,身份证筛选出生年月,自动填充功能,表格排序,自动筛选,高级筛选,数据有效性,求和)
  17. 嵌入式linux开发,开机NFS文件系统启动,使用nfs挂载根文件系统
  18. [PC系统软件] 『新版小A』Avast! Premier 高级版 8.0.1483.72 完美破解版【可正常更新病毒库】
  19. 银行存款准备金率数据集(1990-2019年)
  20. “黑客情报官”薛锋:真相只有一个,我们必须找到它

热门文章

  1. 网站变更服务器要重新备案吗,网站更换服务器要重新备案吗
  2. linux 卸载mono,Linux系统(centos7.6)安装mono3.8
  3. 什么是 SEO ??? 对SEO的详细介绍
  4. Android P 隐藏状态栏电池图标
  5. panabit连接控制
  6. idea--Preferences
  7. ModbusRTU协议数据格式
  8. sqlite3:sqlite3_column 函数
  9. 强者的系统:高观点下的人生
  10. 路由器与交换机的区别是什么