什么刀切什么菜,那如何选择语言来做编程这道菜?C/C++
半夜,电话铃响,一个朋友从美国打开电话,问编程用什么语言最好。这位朋友在一家世界500强的中国公司任高级副总裁,我完全被他这个问题给问懵了。
“php是世界上最好的语言”,我犹豫了下,答道。他非常兴奋,“是吗,是吗,那你说说好在那里”。“我觉得这话是错的,世界上最好的语言可能是c++吧”。“哦”他有些困惑。我们就这样没头没脑的聊开了,他说那他就招一个C++程序员,问我一个月开多少工资才适合,我说一个月80k吧。他说太高了,我说低于79k你招不来一个真正的C++程序员。最后,我问他要做会什么,他说他要做世界上最好的个人主页。我说这活世界上最好的语言和最好的程序员外加开最高的工资可做不了这活。
这下轮到他瞢了,他说他不怕花钱,就想做一个世界上最好的个人主页。我说你花8k找一个女朋友是美工的php/javascripe程序员完完全全能满足你的要求。
看来,即便是世界500强企业的高级副总裁对编程语言这回事也完全是蒙圈的。
于是,本文整理了下,专为末来的高级副总裁们写了这篇短文章来讨论编程语言的问题,。果你点来此文,恭喜你,你对了,你就是末来的高级副总裁。收藏下,到那一天,你会用得着这些知识点的。
C:最接近汇编的高级语言,最接近机器本质的语言,一般用来设计操作系统,驱动程序等要求性能极致的产品。理论上说,掌握C语言,是一个合格程序员的开始。可惜,大部份程序员都不理解。 C++:C是C++的一个子集,C++保留了C的运行性能,又易于构建大型的工程,C++是为面向对向而设计出来的,用C++,你可以设计出来更好的软件结构,或者说架构。C++适合做专业性极强,对性能要求极高,规模极大的软件项目,如浏览器,Linux 各类库。大型公司做的比较需要极致性能的项目 (如游戏等),或是并发要求比较高的 API 服务等。
即便是在anroid中,如果你要做一款视频播放器,一款大型游戏,你为了秒杀竞争对手,c/c++会是你不得己的选择。
掌握了C++,你可以设计出宇宙中的一切程序,而且设计得最好,当然,你可能要付出巨大的努力。如下,有了下面这些语言的生路。Java: JVM 梦着提供了很好的跨平台支持,但一直没有成功。所以在增加代码重用率上有不错的贡献,但是性能远不如 C++ 所以在一些没那么需要性能的项目中较为常见。如业务逻辑不甚复杂的 Web 后端可以用 Tomcat 之类。
但java有着宏大的类库,简洁的语法,如果你想快速的成为一个程序员,java是很好的选择,可以装逼也足够牛B. 最重要的是,这是android平台,最重要的语言。
Java Client-side :对与互联网来说,JS是最重要的编程语言之一,前几天,阿里暴炒的中秋月饼事件,主解就是 JS,现在,这五位当事人己被捧上了天,没错,他们只是会一点JS而己。
前端 JS 是 ECMA,版本之间的标准相当混乱。前端的浏览器支持也十分鬼畜,不同的浏览器跑同一个 js 代码出截然不同的结果是很正常的事情。前段的 js 遍布各大网站。近年来知名的前端 MVC 框架 Angular, React, Vue 等都是前端 js 框架。
Java Server-side: Joyent 团队利用了 Google 开源的 V8 前端 js 引擎写出了一套能跑在服务器的和 py 差不多的解释性语言。因其底层封装 fiber 和 EventEmitter 对异步的支持做得相当好所以多见于现代 Web 服务器后端。著名框架有 Koa, Express, Sails, Strongloop, Meteor。
Python:近年来上升最快的一门语言,似乎什么它都能做。当高端版计算器用,或是调教一些不太复杂的 GUI 程序。
PHP: 我不知道这个传说是出自那里,PHP 是世界上最好的语言!但php也只能做一些服务器脚本,facebook就是靠它起家的。php更像是一个简化了的c。所以,用php的程序员,应该暗自应幸,他们不是在用c++. Ruby: Python兴起后,它似乎就没以前那么火了。利用 Ruby on Rails 架设一个 Web App 的效率肯定是顶尖的,自带的 Assets Pipeline 和 CSRF CORS 支持和 cli 生成 MVC 要素的 feature 让人玩起来非常爽。
不过生产环境的 Web App 似乎并不多见。不过 Ruby 本身也可以起到类似 Python 的作用然而并没有多少人用。
C#:最初被设计出来是为了对抗JAVA, 之前微软有个不被同门认可的VS,就是visual java ,一气之下,微软亮出亲儿子C#,微软是聪明的,和c扯上关系错不了,C#是一部很好的语言,他重新设计,避免了其它语言在成长过程中沾惹的不好的习惯。当前,C#用于开发基于微软.NET平台的应用程序,有些可惜了。
下面还有几门可能己经消亡的语言COBOL(COmmon Business Oriented Language,通用商业程序设计语言)笔者没有用过,主要用于商业数据处理 FORTRAN(FORmula Translation,公式翻译)主要用于数值计算。
BASIC(Beginner All-purpose Symbolic Instructional Code,初学者通用符号指令码)易于学习和使用 Pascal(以Blaise Pascal命名) 另一种数据库设计语言。 Ada(以Ada lovelace 命名)最神密的语言,美国国防部专用,笔者从末见过。
Visual Basic:很多老程序员的入门语言,很多人用它编取了人生的第一份工资(微软开发的一种类Basic的可视化编程语言)图形用户界面的开发以及应用程序快速开发,学习它的负作用是,再也学不了其它的语言了。 Delphi (Borland公司开发的一种类Pascal 的可视化编程语言)图形用户界面的开发以及应用程序的快速开发,曾经非常火的数据库类软件开发语言。
C语言统计文件中的字符数、单词数以及总行数
统计文件的字符数、单词数以及总行数,包括:
每行的字符数和单词数
文件的总字符数、总单词数以及总行数
注意:
空白字符(空格和tab缩进)不计入字符总数;
单词以空格为分隔;
不考虑一个单词在两行的情况;
限制每行的字符数不能超过1000。
请先看代码:
纯文本复制
#includestdio.h
#includestring.h
int*getCharNum(char*filename,int*totalNum);
intmain(){
charfilename[30];
// totalNum[0]: 总行数 totalNum[1]: 总字符数 totalNum[2]: 总单词数
inttotalNum[3]={0,0,0};
printf("Input file name: ");
scanf("%s",filename);
if(getCharNum(filename,totalNum)){
printf("Total: %d lines, %d words, %d chars\n",totalNum[0],totalNum[2],totalNum[1]);
}else{
printf("Error!\n");
}
return0;
}
/**
* 统计文件的字符数、单词数、行数
*
* @paramfilename 文件名
* @paramtotalNum 文件统计数据
*
* @return成功返回统计数据,否则返回NULL
**/
int*getCharNum(char*filename,int*totalNum){
FILE*fp;// 指向文件的指针
charbuffer[1003];//缓冲区,存储读取到的每行的内容
intbufferLen;// 缓冲区中实际存储的内容的长度
inti;// 当前读到缓冲区的第i个字符
charc;// 读取到的字符
intisLastBlank =0;// 上个字符是否是空格
intcharNum =0;// 当前行的字符数
intwordNum =0;// 当前行的单词数
if((fp=fopen(filename,"rb"))==NULL ){
perror(filename);
returnNULL;
}
printf("line words chars\n");
// 每次读取一行数据,保存到buffer,每行最多只能有1000个字符
while(fgets(buffer,1003,fp)!=NULL){
bufferLen =strlen(buffer);
// 遍历缓冲区的内容
for(i=0;ibufferLen;i++){
c =buffer[i];
if(c==' '||c=='\t'){// 遇到空格
!isLastBlank wordNum++;// 如果上个字符不是空格,那么单词数加1
isLastBlank =1;
}elseif(c!='\n'c!='\r'){// 忽略换行符
charNum++;// 如果既不是换行符也不是空格,字符数加1
isLastBlank =0;
}
}
!isLastBlank wordNum++;// 如果最后一个字符不是空格,那么单词数加1
isLastBlank =1;// 每次换行重置为1
// 一行结束,计算总字符数、总单词数、总行数
totalNum[0]++;// 总行数
totalNum[1]+=charNum;// 总字符数
totalNum[2]+=wordNum;// 总单词数
printf("%-7d%-7d%d\n",totalNum[0],wordNum,charNum);
// 置零,重新统计下一行
charNum =0;
wordNum =0;
}
returntotalNum;
}
在D盘下创建文件demo.txt,并输入如下的内容:
I am Chinese. I love my country. China has 960 square kilometers of territory. China has a population of 1.35 billion. The capital of China is Beijing. By gunge 2014-10-12
运行程序,输出结果为:
Input file name: d://demo.txt line words chars 1 7 26 2 7 39 3 7 33 4 6 27 5 0 0 6 2 7 7 0 0 8 1 10 Total: 8 lines, 30 words, 142 chars
上面的程序,每次从文件中读取一行,放到缓冲区buffer,然后遍历缓冲区,统计当前行的字符和单词数。
fgets()函数用于从文件中读取一行或指定个数的字符,其原型为:
char * fgets(char *buffer, int size, FILE * stream);
参数说明:
buffer为缓冲区,用来保存读取到的数据。
size为要读取的字符的个数。如果该行字符数大于size-1,则读到 size-1 个字符时结束,并在最后补充' \0';如果该行字符数小于等于 size-1,则读取所有字符,并在最后补充 '\0'。即,每次最多读取 size-1 个字符。读取的字符包括换行符。
stream为文件指针。
有的读者问,为什么不使用getc(),每次从文件中读取一个字符,也无需开辟缓冲区。
这样没有问题,但是在处理换行时要注意跨平台问题,因为不同的平台对文本文件换行的处理不一样,Linux以'\n'为换行符,Windows以'\n\r'为换行符,Mac又以'\r\n'为换行符。所以,使用getc()函数处理换行时比较麻烦。
这里去繁就简,通过fgets()读取整行数据,然后再处理每个字符,直接忽略'\n'和'\r'。
注意:由于每行的结尾会有最多2个字节长度的换行符,fgets()还会添加NUL,所以缓冲区的长度至少为1003,才能容纳每行1000个字符,否则strlen()可能返回垃圾值。
请看代码第43行,打开文件出错时,返回NULL,而不是生硬的exit()。这样可以通知主调函数发生了错误,让主调函数做出适当的处理,或者通知用户,提高软件的用户体验。
希望对大家能有所帮助,欢迎大家转发
QQ学习群:459792635
进入阅读原文进入学习
c/c++直播课-每晚21:00-22:00
更多教程,请点击阅读原文加入QQ群一起学习!
关注微信公众号领取更多更好玩的游戏代码
内容转载自公众号
编程语言
了解更多