yy_galois
学习编程的几点看法
很多人开始学习一种编程语言,典型的比如C语言,在学习到一定程度以后,比如已经能够熟练应用if else, while , for 等等语句编写程序解决简单的逻辑智力题等等,学着学着突然迷茫了,不知道C语言有什么作用。同样的,在学习Java的时候,心血来潮,把《thinking in Java》从头到位学习了一遍,把上面的练习题全做了一遍,不可谓不刻苦。但是学习完以后,也迷茫了。不知道能用Java做点啥。
进一步的,听到有高手说算法,数据结构很重要,于是又苦读一番算法的书。又听到有高手说Linux内核开源,学会了感觉如何如何酷,于是心痒痒又钻研一番Linux内核源代码。结果愣是啥也没学会。程序没编出几个来,自己感觉自己啥都懂一点,但是啥也不会。也许还继续看看网络编程第二卷,捣鼓捣鼓socket。等等。
看看招聘广告,一般都是这样的。精通C/C++,精通XX数据库,熟悉TCP/IP网络协议..扪心自问,我C++只懂得一些类的概念,C++只编写过几个练习题。C,我倒是很熟悉,但是别人问我精通不,我自己也没底。面试的时候没底气,工作的时候没自信。
其实,这主要是有一个概念没有分清楚。不清楚什么叫做业务,什么叫做手段。
比如,一个人做usb相关的开发,usb的相关知识就叫做业务知识。虽然USB的实现大多是C语言实现,但是那些知识不叫做C语言的知识,C语言只是实现USB相关协议的一种手段。 也可以使用C++, Java或者其它语言来实现。
又比如做路由协议,你要懂路由协议相关的知识。 同样它大多是用C语言实现的。但是这些协议知识,无穷无尽的RFC,都是业务知识。
比如你想自己写一个FTP工具,FTP以及相关的只是就变成了业务知识,至于你想采用C,C++或者其它来实现,那只是一种手段。看你的熟悉程度和业务的需要等具体情况。
知道了这点,应该知道什么叫做懂得C语言了吧。能够一个小时内独立编写一个找出两个字符串的最大子字符串的程序,那么你的C语言就入门了。因为你已经能够熟练的应用if else, while语句,同样,能够编程实现如下这道逻辑推理题,那么你应该知道如何定义结构体,枚举类型等语言知识。并且逻辑思维也不错。可以来做程序员。
顺便想说一点,操作系统是每个程序员都必懂的东西,而且是越多越好,但是是不是每个人都应该去钻研linux内核源代码呢?窃以为,除非你是做内核开发或则内核移植相关的工作,此时内核代码的了解成为你的业务知识,你没必要花太多的时间去研究这个。那些特懂内核的人也没必要太拽,别人或许比你更懂网络知识。每个人都有自己的业务,方向。努力把它学好学精,同时把业务需要的语言,哪怕只有一种语言,学好了。你就是牛人了。
逻辑题:请编程实现,时间一小时。
某天!一家珠宝公司被盗!警方怀疑是甲,乙,丙,丁四个人中的一个,因此对四人进行问话。
甲说:我不是强盗! ,乙说:丁是强盗,丙说:乙是强盗,丁说:我不是强盗
这四个人中只有一人说的是真话。请问谁是强盗!?
yy_galois
我靠,刚才我编了两个小时。。
[quote]
/*filename: who_are_the_robbers.c*/
#include <stdio.h>
#define SUCCESS 0
#define FAILURE 1
typedef enum enStatus
{
STATUS_IS_NOT_ROBBER = 0,
STATUS_IS_ROBBER,
STATUS_MAX
}EN_STATUS;
typedef enum enSpeaking
{
SPEAKING_IS_NOT_TRUTH = 0,
SPEAKING_IS_TRUTH,
SPEAKING_MAX
}EN_SPEAKING;
extern int WhoIsTheRobber();
extern int WhoTellTheTruth(EN_STATUS sta, EN_STATUS stb, EN_STATUS stc, EN_STATUS std);
extern int TypeTheRobbers(EN_STATUS sta, EN_STATUS stb, EN_STATUS stc, EN_STATUS std);
int main(int arc, char *argv[])
{
WhoIsTheRobber();
return SUCCESS;
}
int WhoIsTheRobber()
{
EN_STATUS sta, stb, stc, std;
int totalRobbers;
for (sta = STATUS_IS_NOT_ROBBER; sta < STATUS_MAX; sta++)
{
for (stb = STATUS_IS_NOT_ROBBER; stb < STATUS_MAX; stb++)
{
for (stc = STATUS_IS_NOT_ROBBER; stc < STATUS_MAX; stc++)
{
for (std = STATUS_IS_NOT_ROBBER; std < STATUS_MAX; std++)
{
totalRobbers = sta + stb + stc + std;
/*only one robber in them*/
if (1 == totalRobbers)
{
WhoTellTheTruth(sta, stb, stc, std);
}
}
}
}
}
return SUCCESS;
}
int WhoTellTheTruth(EN_STATUS sta, EN_STATUS stb, EN_STATUS stc, EN_STATUS std)
{
EN_SPEAKING spa, spb, spc, spd;
int totalTruth;
if ((sta >= STATUS_MAX) || (stb >= STATUS_MAX) || (stc >= STATUS_MAX) || (std >= STATUS_MAX))
{
printf("everyone must be a robber or not be/r/n");
return FAILURE;
}
/*a said he is not the robber*/
if (STATUS_IS_NOT_ROBBER == sta)
{
spa = SPEAKING_IS_TRUTH;
}
else
{
spa = SPEAKING_IS_NOT_TRUTH;
}
/*b said d is the robber*/
if (STATUS_IS_NOT_ROBBER == std)
{
spb = SPEAKING_IS_NOT_TRUTH;
}
else
{
spb = SPEAKING_IS_TRUTH;
}
/*c said b is the robber*/
if (STATUS_IS_NOT_ROBBER == stb)
{
spc = SPEAKING_IS_NOT_TRUTH;
}
else
{
spc = SPEAKING_IS_TRUTH;
}
/*d said he is not the robber*/
if (STATUS_IS_NOT_ROBBER == std)
{
spd = SPEAKING_IS_TRUTH;
}
else
{
spd = SPEAKING_IS_NOT_TRUTH;
}
totalTruth = spa + spb + spc + spd;
/*only one tell the truth*/
if (1 == totalTruth)
{
TypeTheRobbers(sta, stb, stc, std);
printf("a = %d, b = %d, c = %d, d = %d/r/n", sta, stb, stc, std);
}
return SUCCESS;
}
int TypeTheRobbers(EN_STATUS sta, EN_STATUS stb, EN_STATUS stc, EN_STATUS std)
{
return SUCCESS;
}
[/quote]
yy_galois
下面这道逻辑题,我写了一部分。
[quote]
主席台的一排座位上坐着六个不同职业的男人
他们穿着不同颜色的礼服,用不同品牌的手机
开不同的小汽车,有不同的爱好。已知:
1、高老庭是老师
2、牛老麟是足球员,他不爱打排球
3、穿灰色礼服的人开保时捷
4、用摩托罗拉手机的人开奥迪,他旁边的人用三星手机
5、靓仔胜用诺基亚手机,开奔驰跑车
6、用索爱手机的人爱上网
7、作家爱看书
8、肥老朱坐在四眼金的右边
9、牛老麟坐在第二位
10、商人坐在宿老俊旁边,他开的是劳斯莱斯
11、用NEC手机的男士旁边的人不穿灰色礼服
12、歌手爱跳舞
13、坐最右边的人穿紫色礼服
14、开法拉利的人坐在穿白色礼服的人旁边
15、蓝色礼服旁边的市长正用飞利浦手机打电话
16、肥老朱穿黑色礼服,他爱打桌球
17、歌手旁边的人既不爱上网,又不爱看书
18、穿红礼服的人不坐在作家旁边
19、坐第四位的人爱下象棋
20、靓仔胜不是歌手
请问谁开宝马?
[/quote]
[quote]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SUCCESS 0
#define FAILURE 1
typedef enum enName
{
NAME_GAO = 0,
NAME_NIU,
NAME_SHENG,
NAME_ZHU,
NAME_JIN,
NAME_SU,
NAME_MAX
}EN_NAME;
typedef enum enVocation
{
VOCATION_TEACHER = 0,
VOCATION_FOOTBALLER,
VOCATION_WRITER,
VOCATION_SINGER,
VOCATION_MERCHANT,
VOCATION_MAYOR,
VOCATION_MAX
}EN_VOCATION;
typedef enum enColor
{
COLOR_RED = 0,
COLOR_GRAY,
COLOR_PURPLE,
COLOR_BLACK,
COLOR_WHITE,
COLOR_BLUE,
COLOR_MAX
}EN_COLOR;
typedef enum enPhone
{
PHNOE_MOTO = 0,
PHNOE_SAMSUNG,
PHNOE_NEC,
PHNOE_SONY,
PHNOE_NOKIA,
PHNOE_PHILLIPS,
PHNOE_MAX
}EN_PHONE;
typedef enum enCar
{
CAR_BENZ = 0,
CAR_AUDI,
CAR_ROLLSROYCE,
CAR_BMW,
CAR_PORSHCE,
CAR_FERRARI,
CAR_MAX
}EN_CAR;
typedef enum enInterest
{
INTEREST_VOLLYBALL = 0,
INTEREST_WEB,
INTEREST_READING,
INTEREST_SNOOKER,
INTEREST_CHESS,
INTEREST_DANCING,
INTEREST_MAX
}EN_INTEREST;
typedef enum enSeat
{
SEAT_ONE = 0,
SEAT_TWO,
SEAT_THREE,
SEAT_FOUR,
SEAT_FIVE,
SEAT_SIX,
SEAT_MAX
}EN_SEAT;
typedef struct tagPerson
{
int name;
int vocation;
int color;
int phone;
int car;
int interest;
int seat;
}PERSON;
extern int SixMenName(PERSON *pa, PERSON *pb, PERSON *pc, PERSON *pd, PERSON *pe, PERSON *pf);
extern int SixMenVocation(PERSON *pa, PERSON *pb, PERSON *pc, PERSON *pd, PERSON *pe, PERSON *pf);
extern int SixMenColor(PERSON *pa, PERSON *pb, PERSON *pc, PERSON *pd, PERSON *pe, PERSON *pf);
extern int SixMenPhone(PERSON *pa, PERSON *pb, PERSON *pc, PERSON *pd, PERSON *pe, PERSON *pf);
extern int SixMenCar(PERSON *pa, PERSON *pb, PERSON *pc, PERSON *pd, PERSON *pe, PERSON *pf);
extern int SixMenInterest(PERSON *pa, PERSON *pb, PERSON *pc, PERSON *pd, PERSON *pe, PERSON *pf);
extern int SixMenSeat(PERSON *pa, PERSON *pb, PERSON *pc, PERSON *pd, PERSON *pe, PERSON *pf);
int main(int argc, char* argv[])
{
PERSON pa = {0};
PERSON pb = {0};
PERSON pc = {0};
PERSON pd = {0};
PERSON pe = {0};
PERSON pf = {0};
SixMenName(&pa, &pb, &pc, &pd, &pe, &pf);
return SUCCESS;
}
int SixMenName(PERSON *pa, PERSON *pb, PERSON *pc, PERSON *pd, PERSON *pe, PERSON *pf)
{
pa->name = NAME_GAO;
pb->name = NAME_NIU;
pc->name = NAME_SHENG;
pd->name = NAME_ZHU;
pe->name = NAME_JIN;
pf->name = NAME_SU;
SixMenVocation(pa, pb, pc, pd, pe, pf);
return SUCCESS;
}
int SixMenVocation(PERSON *pa, PERSON *pb, PERSON *pc, PERSON *pd, PERSON *pe, PERSON *pf)
{
/*高老庭是老师 */
pa->vocation = VOCATION_TEACHER;
/*牛老麟是足球员*/
pb->vocation = VOCATION_FOOTBALLER;
/*c语言的弱点就在这里,排列组合还要程序员自己来实现
而java, python都有序列类型的数据结构,不需要程序员来实现
排列组合
总之,c的枚举类型远远不如python,java的序列好用*/
for (pc->vocation = VOCATION_TEACHER, pc->vocation < VOCATION_MAX, (pc->vocation)++)
{
if ((pc->vocation == pa->vocation) || (pc->vocation == pb->vocation))
{
break;
}
/*靓仔胜不是歌手*/
if (pc->vocation == VOCATION_SINGER)
{
break;
}
for (pd->vocation = VOCATION_TEACHER, pd->vocation < VOCATION_MAX, (pd->vocation)++)
{
if ((pd->vocation == pa->vocation) || (pd->vocation == pb->vocation) || (pd->vocation == pc->vocation))
{
break;
}
for (pe->vocation = VOCATION_TEACHER, pe->vocation < VOCATION_MAX, (pe->vocation)++)
{
if ((pe->vocation == pa->vocation) || (pe->vocation == pb->vocation)
|| (pe->vocation == pc->vocation) || (pe->vocation == pd->vocation))
{
break;
}
for (pf->vocation = VOCATION_TEACHER, pf->vocation < VOCATION_MAX, (pf->vocation)++)
{
if ((pf->vocation == pa->vocation) || (pf->vocation == pb->vocation)
|| (pf->vocation == pc->vocation) || (pf->vocation == pd->vocation)
|| (pf->vocation == pe->vocation))
{
break;
}
SixMenColor(pa, pb, pc, pd, pe, pf);
}
}
}
}
return SUCCESS;
}
int SixMenColor(PERSON *pa, PERSON *pb, PERSON *pc, PERSON *pd, PERSON *pe, PERSON *pf)
{
return SUCCESS;
}
int SixMenPhone(PERSON *pa, PERSON *pb, PERSON *pc, PERSON *pd, PERSON *pe, PERSON *pf)
{
return SUCCESS;
}
int SixMenCar(PERSON *pa, PERSON *pb, PERSON *pc, PERSON *pd, PERSON *pe, PERSON *pf)
{
return SUCCESS;
}
int SixMenInterest(PERSON *pa, PERSON *pb, PERSON *pc, PERSON *pd, PERSON *pe, PERSON *pf)
{
return SUCCESS;
}
int SixMenSeat(PERSON *pa, PERSON *pb, PERSON *pc, PERSON *pd, PERSON *pe, PERSON *pf)
{
return SUCCESS;
}
[/quote]