jw0716 on 五月 15th, 2012

徐少春,金蝶集团创始人。

从他身上看到了湖南人直爽豪迈的个性。

在青春年少的时候,痴迷于文学小说,极富想象力。

两面墙的藏书,可以看出来他是一个爱读书的人。

最喜欢的小说是《约翰克里斯多夫》,并用书中的一句话作为自己奋斗的座右铭:

人生所有的欢乐都是创造的欢乐:爱情、天才、行动–全靠这团火喷射出来。–罗曼·罗兰

参考文学作品中主人翁的生活,浪漫的规划自己的美好未来。

踏踏实实的去奋斗。

在创业初期,骑车去推销自己的产品。销售额突破百万。可以想见,他不仅仅在计算机编程上很牛,同时还是一个杰出的销售人员。

在创业中,遇到合作伙伴叛离后另起炉灶,他能够毫不手软的将对方弄死。个性强势。

浪漫主义和英雄主义相结合,极富个人魅力的企业家。

jw0716 on 五月 14th, 2012

思路分析:

1、最简单的方式是调用系统函数int atoi(const char *nptr)把字符转换为整型数。

2、自己实现:第一个字符需要判断一下,为空则返回0;是负号,则要记录下来;

3、char型的BIT4、BIT5置为零即为对应整数;或者减去字符’0′即为对应数字;

4、从头到尾逐步扫描,直到’\0′结束,将前面的计算结果放大十倍,加上当前值。

Source Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
int String_To_Integer(char *p)
{
    int sign, result, tmp;
 
    if( *p == NULL)    return 0;
 
    if( *p == '-')
    {
        sign = -1;
        p++;
    }
    else
    {
        sign = 1;
    }
 
    result = 0;
    while( *p )
    {
        //char型的BIT4、BIT5置为零即为对应整数
        tmp = *p & (~0x30);
        //多位数情况,第一次是乘1,此后是放大10倍
        result *= 10;
        result += tmp;
        p++;
    }
 
    return result*sign;
}
 
int main(int argc, char* argv[])
{
 
    printf("%d\n", String_To_Integer("1234789"));
 
    printf("%d\n", String_To_Integer(""));
 
    printf("%d\n", String_To_Integer("-1234589"));
 
    return 0;
}

思路分析:

将字符串的首地址传到处理函数中,从头到尾扫描一遍,直到’\0′结束

小写字母和大写字母的ASCII相差32,也即是0×20

将小写字母的BIT5清零即为对应的大写字母,反之亦然。

Source Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//String_Covert_Upper将一个字符串中的字符从小写转为大写
void String_Covert_Upper(char *p)
{
    while(*p)
    {
        if(*p >= 'a' && *p <= 'z')
        {
            //置BIT5为0
            *p = *p & ~0x20;
        }
        p++;
    }
}
 
//String_Covert_Lower将一个字符串中的字符从大写转为小写
void String_Covert_Lower(char *p)
{
    while(*p)
    {
        if(*p >= 'A' && *p <= 'Z')
        {
            //置BIT5为1
            *p = *p | 0x20;
        }
        p++;
    }
}
 
int main(int argc, char* argv[])
{
    char string1[] = "hello,WORLD";
    printf("%s\n",string1);
 
    String_Covert_Upper(string1);
    printf("%s\n",string1);
 
    String_Covert_Lower(string1);
    printf("%s\n",string1);
 
    return 0;
}

 

jw0716 on 五月 14th, 2012

运行如下程序,输出结果是什么?
Source Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
char* GetString1()
{
    char p[] = "GetString1";
    return p;
}
 
char* GetString2()
{
    char *p = "GetString2";
    return p;
}
 
int main(int argc, char* argv[])
{
    printf("GetString1 :%s. \n", GetString1());
    printf("GetString2 :%s. \n", GetString2());
    return 0;
}

运行结果分析:

1、编译提示:warning C4172: returning address of local variable or temporary

GetString1()中的p[]数组是GetString1()的局部变量,会在函数的栈空间上分配内存
当函数运行结束,内存空间会被释放。所以返回数组首地址p的时候,会显示乱码。

2、GetString2()中的*p是一个指针,指向的是字符常量区的一个常量字符串。并不会
在GetString2()退出的时候被释放掉。因此会显示GetString2

jw0716 on 五月 12th, 2012

题目:文件中有一组整数,写出完整代码将其排序后输出到另一个文件中

思路:
1、想办法从文件中将数据读入内存;fopen、fscanf、fprintf的正确调用

2、文件大小未知,所以要注意可增长数组的应用;malloc、realloc的正确调用

3、排序可以调用qsort系统函数。

Source Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "stdafx.h"
#include <stdlib.h>
 
//升序排列,从小到大
int comp_ascending(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
 
//降序排列,从大到小
int comp_descending(const void *a,const void *b)
{
    return *(int *)b-*(int *)a;
}
 
int main(int argc, char* argv[])
{
    int i;
    int data_count;                //统计整数的个数
 
    int MAX = 10;
    int *data_buffer = (int *)malloc(MAX * sizeof(int));
    int *b;
 
    FILE *src;
    FILE *dest;
 
    //1.文件名 2.打开模式
    src = fopen("data.txt", "r");
    if(src == NULL)
    {
        printf("error1");
        exit(-1);
    }
 
    dest = fopen("output.txt", "w");
    if(dest == NULL)
    {
        printf("error2");
        exit(-1);
    }
 
    i= 0;
    data_count = 0;
    //1.文件流指针 2.格式串 3.缓冲数组
    while(fscanf(src, "%d", &data_buffer[i]) != EOF)
    {        
        i++;
        data_count++;
        if(i >= MAX)
        {
            MAX *= 2;
            //数组动态增长 1.数组名 2.大小
            b = (int *)realloc(data_buffer,MAX * sizeof(int));
            if(b == NULL)
            {
                printf("error3");
                exit(-1);
            }
            data_buffer = b;
        }        
    }
 
    printf("before sort:\n");
    for(i = 0; i < data_count; i++)
    {
        printf("%d\n", data_buffer[i]);
    }
 
    //1.数组名 2.元素个数 3.元素占用空间大小 4.自定义比较函数
    qsort(data_buffer, data_count, sizeof(data_buffer[0]), comp_ascending);
 
    printf("\nafter sort:\n");
    for(i = 0; i < data_count; i++)
    {
        printf("%d\n",data_buffer[i]);
    }
 
    for(i = 0; i < data_count; i++)
    {
        //1.指向所要写的文件指针 2.格式串 3.输出数据
        fprintf(dest, "%d\n", data_buffer[i]);
    }
 
    fclose(src);
    fclose(dest);
 
    return 0;
}
jw0716 on 五月 10th, 2012

昨天YWW去面百度了,回来后,我找他聊了一会儿。他告诉我,这次百度非常的重视数据结构和算法的考察。在技术笔试的时候碰了《编程之美》上面关于链表操作的一道原题。在面试现场,更是直接让他在白纸上写出两个有序链表的去重合并。

给我的启示:夯实基本功,多看多思多练,勤记录!

strcpy函数原型,是T、B、MS喜欢考察的。先写下来,后面还要回头复习。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*    strcpy函数原型    */
 
// strDest是目的字符串,strSrc是源字符串
char *strcpy(char *strDest, const char *strSrc)
{
    //有一个指向NULL
    if (strDest == NULL || strSrc == NULL)
        return NULL;
    //已经指向同一个位置,直接返回头指针
    if (strDest == strSrc)
        return strDest;
    //先记录下头指针的位置,因为后面strDest++会移动改变指向
    char *strhead = strDest;
    //表达式(*strDest++ = *strSrc++)的值就是*strDest,
    //所以可以和'\0'直接比较
    while( (*strDest++ = *strSrc++) != '\0' );
 
    return strhead;
}

注意:
1、两个 if 特殊情况的考虑;
2、指针为空的判断,否则程序会出错。
3、两个串已经相等,就不需要再复制操作了,这在串比较长的时候,可以节省很多时间。

jw0716 on 五月 7th, 2012

在工具栏空白处点击右键,选择“自定义”,然后在打开的“自定义”窗口中选择“命令”选项卡,在“类别”列表框中选择“格式”,在其右侧的列表中即可找到“删除线”,将“删除线”按钮用鼠标左键按住,拖拽到工具栏就可以了。

参考:http://zhidao.baidu.com/question/9342639.html

jw0716 on 五月 4th, 2012

字符串反转在面试过程中经常被涉及。所以需要熟练的掌握正确的写法,并能够在面试现场写出代码。

Source Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int string_reverse_first()
{
    char* src = "hello,world";
    int len = strlen(src);
    char* dest = (char*)malloc(len+1);
        //+1是为\0分配一个空间
    char* d = dest;
    char* s = &src[len-1];
    while( len-- != 0)
        *d++=*s--;//重新开辟一个新的空间,逐一拷贝
    *d = '\0';//串尾需要手工添加结束符            
    printf("%s\n",dest);
    free(dest);
    return 0;
}
 
int string_reverse_second()
{
    char src[] = "hello,world";
    int len = strlen(src);
    char tmp;    
    for(int i=0; i<len/2; i++)
    {
        tmp = src[i];
        src[i] = src[len-i-1];//在原地进行左右交换
        src[len-i-1] = tmp;
    }
    printf("%s\n",src);
    return 0;
}

1、string_reverse_first思路是重新开辟一个空间,扫描原来的串,逐个拷贝过来。容易遗漏的是要为\0分配空间,并在串尾添加\0。

2、string_reverse_second思路是首先计算出串的长度,然后串头和串尾元素分别交换,一直扫描到串中间位置停止。和方法一相比空间和时间复杂度都要低,所以高效。

 

昨晚临睡洗脚的时候在翻看俞敏洪的《从容一生》,看完这篇演讲致辞,很受鼓舞,引发了自己的一些反思。

今天和QT在一起聊俞敏洪的故事,他告诉我说有人评价俞敏洪并不是特别的厉害,倒是他能够将一帮聪明的人聚集在一起干大事,最后成功的办成了新东方。我想,能够团结这些有能力的人,本身就是一个优秀领导者的卓越风范和个人魅力的体现。

相对于俞敏洪的大学同学来说,他在学习成绩上并不是特别的突出,毕竟北大是国内的一流学府,而他相对于其他学校的人,智商上还是不一般的。但是,作为班级上的落伍者,他保持着向优秀同学学习的态度,尤其是他的班长王强,读书癖好正是效仿王强的。并持续不断的追赶,像蜗牛一样,每天比其他同学多学习一两个小时,慢慢的往上爬。最后,到达了金字塔的顶端。而某些自负有天赋的人,忘了后天努力的重要,反而却被自己的锋芒所刺到,而碌碌无为。

他大学五年期间读了八百多本书,可见接收的知识有多么的渊博。这一点北大做的很好,学校里面有良好的学习氛围,同学们之间在相互“攀比”着看书。而如今,时代变迁,电子产品泛滥,我的身边能够静下心来看本书的同学已经寥寥无几,很多人是泡在了互联网上,漫无目的的接收一些碎片式的信息。大学期间没有工作和生活的压力,可以有时间和精力来构建自己的知识库,是一件多么美好的事情。很遗憾,他们并没有意识到。

八十年代是中国现代诗歌浪潮的一个鼎盛时期,俞敏洪也是在这波人之中,他说自己在生病住院的一年中写了六百多首诗,有着丰富的内心情感,自谦表达能力并不强,所以都没有发表。他虽然没做成诗人,可是读诗和写诗这一样高尚的精神活动,让他如今依然散发着浪漫主义情怀的气质。

人要立志,心怀远大的理想,渴望穿越地平线,看到一番别样新奇的风景,所以需要不断努力的奋斗。同时,还要有分享精神,能够将自己的财富、思想、感情拿出来和身边的同学朋友家人一起分享。恰恰是大学四年期间帮宿舍人打了四年的水,这样一种行动,感染了他最初的创业伙伴,并答应回国和他一起创业。

把每天平凡的日子过好,踏踏实实的做事学习,不敢说伟大的人生,至少是有所作为的一生。当回首往事的时候,热泪盈眶的为自己曾经所付出的努力而感动。人唯有勤奋求知,先感动自己,才会感动别人,最后感动上天。所谓自助者,天助之,终会成就自己有意义的一生。

jw0716 on 四月 25th, 2012

在《编程之美》的书评中发现了一个关于宏操作的小题目。

写一个简单的宏,来判断一个无符号数是否属于:{ 0, 1, 2, 4, 8, 16, …2^n}。

参考网络上的解法,发现他的答案其实有问题。

思路:
将数用2进制展开,如果满足是2的幂,其中必然有一位是1,其他都是0。
在这个1的前面都是0,后面也都是0。此时,如果对这个数减1,排在1前面仍都是0,1后面的所有位都变成了1。于是将它和减1的结果执行与操作,结果必然是0。

结论:
用位与运算,如果这个整数位与比它小1的结果为0的话,它就是2的n次幂,否则不是。

程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define Judge_ND(C) ((C&(C-1)) == 0 ? 1 : 0)
 
//用位与运算,如果这个整数位与比它小1的结果为0的话,它就是2的n次幂,否则不是
 
int main(int argc, char* argv[])
{
    for(unsigned int j=0; j<= 1000000; j++)
    {
        if(Judge_ND(j))
        {
            printf("%d\n",j);
        }                
    }
    return 0;
}

运行结果:
0
1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288