上几天帮同学搞了一个随机数生成器,首先在网上搜索了一下,发现网上有的做的也比较的简单,但是功能还是比较全的。

而且发现自己学的东西刚好可以写一个随机数生成器。当然还有些预备知识没有学,所以现学现用了。

计时器的有关知识我已经了解了,首先要用到创建字体,然后是创建父窗口控件,然后就是利用RGB的颜色的变化了。

看了几天的书,终于写出来了。下面是代码:

include <windows.h>

include <stdio.h>

include <stdlib.h>

include <time.h>

include <string.h>

define ID_TIMER    1

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

                    PSTR szCmdLine, int iCmdShow)

{

     static TCHAR szAppName[] = TEXT ("Beeper1") ;

     HWND         hwnd ;

     MSG          msg ;

     WNDCLASS     wndclass ;

     

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;

     wndclass.lpfnWndProc   = WndProc ;

     wndclass.cbClsExtra    = 0 ;

     wndclass.cbWndExtra    = 0 ;

     wndclass.hInstance     = hInstance ;

     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;

     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;

     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;

     wndclass.lpszMenuName  = NULL ;

     wndclass.lpszClassName = szAppName ;

     

     if (!RegisterClass (&wndclass))

     {

          MessageBox (NULL, TEXT ("Program requires Windows NT!"),

                      szAppName, MB_ICONERROR) ;

          return 0 ;

     }

     

     hwnd = CreateWindow (szAppName, TEXT ("随机数生成器1.00版本"),

                          WS_OVERLAPPEDWINDOW,

                          CW_USEDEFAULT, CW_USEDEFAULT,

                          CW_USEDEFAULT, CW_USEDEFAULT,

                          NULL, NULL, hInstance, NULL) ;

          

     ShowWindow (hwnd, iCmdShow) ;

     UpdateWindow (hwnd) ;

          

     while (GetMessage (&msg, NULL, 0, 0))

     {

          TranslateMessage (&msg) ;

          DispatchMessage (&msg) ;

     }

     return msg.wParam ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

     static BOOL fFlipFlop = FALSE ;

     static DWORD color_green = 255;

     static DWORD color_blue = 255;

     static DWORD color_red = 255;

     LOGFONT lf;

     HFONT   hFont ;

     TEXTMETRIC tm ;

     TCHAR szBuffer [40];

     static int cxChar, cyChar, sum;

     DWORD a, iLength;

     DWORD ownrand[40] = {31,24,17,11,5,22,4,7,1,32,15,39,29,3,27,21,38,25,12,33,9,23,36,2,13,18,30,16,26,34,37,10,8,28,19,6,14,20,35};

     TCHAR str[256], type_height[10], type_width[10];

     HBRUSH      hBrush ;

     HDC         hdc ;

     PAINTSTRUCT ps ;

     RECT        rc ;

     HWND hwndButton;

     switch (message)

     {

     case WM_CREATE:

          SetTimer (hwnd, ID_TIMER, 50, NULL) ;

         cxChar = LOWORD (GetDialogBaseUnits ()) ;

         cyChar = HIWORD (GetDialogBaseUnits ()) ;

               hwndButton = CreateWindow ( TEXT("button"),

                                   TEXT("开始"),

                                   WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,

                                   cxChar + 420, cyChar _ (1 + 2 _ 1)+300,

                                   20 _ cxChar, 7 _ cyChar / 4,

                                   hwnd, (HMENU) 1,

                                   ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;

               hwndButton = CreateWindow ( TEXT("button"),

                                   TEXT("暂停"),

                                   WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,

                                   cxChar + 420 , cyChar _ (1 + 2 _ 1)+350,

                                   20 _ cxChar, 7 _ cyChar / 4,

                                   hwnd, (HMENU) 2,

                                   ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;

          return 0 ;

     case WM_TIMER :

          sum++;  

          InvalidateRect (hwnd, NULL, FALSE) ;

          return 0 ;

          

     case WM_PAINT:

        

          hdc = BeginPaint (hwnd, &ps) ;

          GetClientRect (hwnd, &rc) ;

          hBrush = CreateSolidBrush (RGB(color_red,color_green,color_blue));

            

          if (sum<=39)

                _itow(ownrand[sum],str,10);

          else{

                sum=0;

                _itow(ownrand[sum],str,10);

          }

          color_red -= 10;                              //颜色变化的实现

          color_green -= 5;

          color_blue -= 1;

          sum++;

          FillRect (hdc, &rc, hBrush) ;

          hdc = GetDC(hwnd);

          GetTextMetrics(hdc,&tm);

          cxChar = tm.tmAveCharWidth;

          cyChar = tm.tmHeight + tm.tmExternalLeading;

          iLength = wcslen(str);

          SetTextColor(hdc,RGB(255-color_red,255-color_green,255-color_blue));

          //SetTextColor(hdc,RGB(250,0,0));

           //设置字体

          lf.lfHeight = 200;

          lf.lfWeight = 170;

          lf.lfWeight = 700;

          lf.lfUnderline = 0;

          lf.lfStrikeOut = 0;

          hFont = CreateFontIndirect(&lf);

          SelectObject(hdc, hFont);

          //GetTextMetrics (hdc, &tm);

          //_itow(tm.tmHeight,type_height,10);

          //_itow(tm.tmAscent,type_width,10);

          //TextOut(hdc, 0, 0, type_height, wcslen(type_height));

          //TextOut(hdc, 50, 0, type_width, wcslen(type_width));

          DeleteObject (hFont);

          SetBkColor (hdc, GetSysColor(COLOR_WINDOW));

          TextOut(hdc, cxChar+400, cyChar+100, str, iLength);

        

          ReleaseDC(hwnd, hdc);

          EndPaint (hwnd, &ps) ;

          DeleteObject (hBrush) ;

          return 0 ;

     case WM_COMMAND:

         if (2 == wParam){

             KillTimer (hwnd, ID_TIMER) ;

             //MessageBox(hwnd, TEXT("恭喜您"),TEXT("congratulations"),MB_OK);

         }

         if (1 == wParam){

            SetTimer (hwnd, ID_TIMER, 50, NULL) ;

         }

         break;

     case WM_DESTROY :

          KillTimer (hwnd, ID_TIMER) ;

          PostQuitMessage (0) ;

          return 0 ;

     }

     return DefWindowProc (hwnd, message, wParam, lParam) ;

}

关于随机数产生的问题,本来想用rand(time(0))来实现的,但是通过测试发现精度不够高,当timer调用每100毫秒更新一次的时候就已经显现出伪随机特性了。

本来想自己写一个随机数生成算法的,但是由于滚动的总数量不是很多,所以请教了华哥,自己开了一个数组,在里面随机写了30个数字。

关于颜色的变化的实现,关键代码其实也比较简单的,每次调用计时器的时候改变RGB的值,但是改变的值不一样,这样就加长了循环周期。

整个代码只是基本实现了效果,没有过多的功能,自己如果以后学了·鼠标键盘等一些其他东西的话还能把这些东西也加进去,做一个改进版本。

最近闲来无事,想在fedora下面换个主题玩玩。下面说一下具体步骤

首先安装   gnome tweak tool

在终端输入  yum search gnome tweak tool 

搜索一下看到 gnome-tweak-tool.noarch : A tool to customize advanced GNOME 3 options

然后我们安装一下 sudo yum install gnome-tweak-tool.noarch

安装成功后 ,如果是中文字体,在应用程序里搜索一下可以看到   “高级设置”  (如下图所示)

这里面还有很多gnome功能,大家有兴趣可以去玩玩 。这里我先添加主题。

以下主题可通过sudo  yum  install 主题名 安装,安装您喜欢的即可。

gnome-shell-theme-atolm.noarch

gnome-shell-theme-dark-glass.noarch

gnome-shell-theme-gaia.noarch

gnome-shell-theme-orta.noarch

gnome-shell-theme-smooth-inset.noarch

再添加一个链接,这里有一些非官方的主题。

http://blog.51osos.com/linux/five-gnome-shell-themes/

解压的文件夹复制粘贴到/home/USERNAME/.themes目录。(这里特别注意:文件夹是  .theme,千万别忘了前面那个点,如果找不到这个文件夹的话可以在编辑–>视图中将显示隐藏和备份文件这个选项打勾就可以显示了)

您刚才复制的主题要以THEME_NAME/gnome-shell目录形式,这是非常重要的的,因为,GNOME Shell扩展User-Theme默认从~/.themes/THEME_NAME/gnome-shell目录中加载主题。

最后,启动GNOME Tweak Tool,浏览到“主题”菜单。

现在你就可以轻松的管理和设置你的主题了

注意一下,在最新内核版本的ferora16中,tweak tool里面的shell theme不能正常显示,我还没有找到解决方法,不过主题还是能正常显示的。

今天开始认认真真仔仔细细地看windows编程的书本了,所以做下笔记。

全局根的定义       

路径名的限制(MAX_PATH 个字符)260,但是通过转义序列指定非常长的名称

LPCTSTR = Long Point Constant T_(宏) STRing    (以后理解了每个字母缩写的意思得话,记忆会方便很多)

lpsz = long point string sero (指向以零结尾的字符串的长指针)

关于长指针  近指针 空指针的概念 

http://hi.baidu.com/fcwyz/blog/item/af764044c204b687b2b7dc86.html &nbsp; (参考文献   空指针的用法)

随机访问和顺序访问 

http://bbs.chinaunix.net/thread-585605-1-1.html  &nbsp; (参考文献 储存中提到的随机访问和顺序访问)

内核句柄    (什么是 内核句柄)

http://hi.baidu.com/%B7%B3%B2%BB%B7%B3/blog/item/fde05e17170c134120a4e932.html

stdafx.h  (stand Application Framework Extensions)  .pch 预编译头文件

http://baike.baidu.com/view/1344257.htm

TCHAR WCHAR (wchar_c)

TCHAR 的预编译机制

http://baike.baidu.com/view/2901835.htm

最近在看《wndows编程启示录》,这里面写到了很多windows用户界面设置时候的很多解决矛盾的艺术。其中看到几个比较好玩的东西给大家分享一下。

最小化所有窗口”的快捷键是”windows+d“,                显示桌面"的快捷键是“windows+ m”

取消所有最小化窗口的快捷键是”windows+shift+d“

那么这两者之间的区别是什么呢?

首先最小化所有窗口的原理就是相当于 每个窗口都点了一下最小化那个按钮,而显示桌面则是将最小化窗口以后更进了一步。在进行了最小化所有窗口以后,将桌面窗口上升到窗口堆栈的顶部,(topmost窗口还是会覆盖在桌面窗口的上面)。

但是当你恢复到正常状态以后或者取消最小化所有窗口或显示桌面命令以后,窗口堆栈的顺序与原来是不一样的,那为什么会这样呢?

这是因为如果某个窗口响应得非常慢(你肯定遇到过这种状况),那个如果windows还要按照原来的堆栈方式排列的话,资源管理器也会被挂起,

但是现在windows将这个响应得很慢的窗口暂时放下不管,这样资源管理器也就不会挂起了,虽然顺序打乱了,但是保证了操作能够快速地执行了

其实这本书里面还有很多有趣的东西,比如说同时打印很多文件的话并不是你期望的按照顺序来的,很有可能是按照文本的大小来的,因为所有的文件同事竞争一个打印机的话,文本小的文件竞争能力肯定是最强的。呵呵,先写到这里吧,还有很多东西自己慢慢看好了





LINUX命令行小结

安装fedora16大概也有一个月了,虽然说安装了双系统以后还是经常会在windows上跑,但是毕竟还是快速地浏览了一下linux命令行一本比较基础的书。虽然没有深入,但是覆盖了几乎所有的命令行。

所以现在是时候总结一下学到的东西了。

1.安装命令

rpmyum命令(yum业已经取代rpm成为从在线仓库安装rpm包的不二选择)

yumlist

yumsearch

yuminstall (注意提权)

yumupdate

yumremove

yumclean

rpm-ivh(安装软件包)

rpm-Uhv(升级软件包)

rpm-e (删除软件包)

rpm-q rsunc(查询版本号)

2.使用shell

history5 (列出历史)

!!(运行上一个命令)

!997(运行第997个历史命令)

!ls(运行上一个历史命令)

<tab>命令行补全

<tab><tab>自动列出所有有关命令

输出重定向

ls/tmp /tmpp > output.txt

标准错误流

ls/tmp /tmpp >2 errors.txt

追加至某个文件而不是覆盖

ls/tmp /tmpp >> output.txt

位元桶文件

ls/tmp 2> /dev/null

管道的使用

输出重定向到进程

ls/tmp | sort

aliascp=’cp -i’

监视命令watch’cat /proc/loadavg’ (监视系统平均负载)

获得超级用户权限

su

使用sudo授权sudo

shell设定环境变量

set |less

简单的

bash编程

硬链接和符号链接的概念

命名管道和套接字

创建空白文件

touch/tmp/newfile.txt

> /tmp/newfile.txt

创建目录mkdir

mkdir-p /tmp/a/b/c/new

mkdir-m 700 /tmp/new2

-表示文件(硬链接也是如此)

l表示链接(符号链接)

p表示管道(pipe)

s表示套接字(socket

c字符设备

b块设备

drwxrwxrwx

文件类型指示符 用户 用户组其他用户

可读 可写 可执行

4 2 1

使用chmod更改权限

1.使用八进制数字

chmod0700

如果原来是任意的话将变成 drwx——

2.使用字母更改权限

a表示所有组

u表示用户

g表示用户组

o表示其他组

+增加

-除去

例如

chmod g+w (增加用户组的可写权限)

-R能递归执行

粘滞位的目录

umask0066

设定文件何目录创建时的权限

chown

chgrp

切换目录cd

cd切换至用户主目录

cd$HOME

切换至用户主目录

cd~

切换至用户主目录

cd~francois

切换至francois的主目录

cd-

切换至前一个工作目录

cd..

当前目录的上一层目录

cd/usr/bin

根目录下的bin

cdusr/bin

当前目录下的bin

pwd显示当前目录

复制文件

cp-i index.html /var/www/html/

-il硬链接

-a保留所有权限设定

-R递归分配当前时间戳

ddif=/dev/zero of=/tmp/mynullfile count=1

搜索文件

locate-i(不区分大小写)

可以使用正则表达式来查找

find

列出文件信息

ls

处理文本

1.使用正则表达式

2.catmyfile.txt(查看文本文件)

3.grep搜索文本

sed替换文本

diff检查文件差异

文本文件的格式转换

unix2dos< myunixfile.txt > mydocfile.txt

多媒体的处理

ogg123播放器

mpg123mpg321

转换音频文件sox

soxhead.wav tail.wav output.wav

图像处理

identifyp1.jpg

converttree.jpg tree.qng

利用创建缩略图(这个很有效啊,可以自己diy头像,不用什么复杂的ps,一个命令行搞定)

convert-rotate 270

翻转

convert-sepia-tone 75% house.jpg oldhouse.png (棕褐色调)

-charcoal

(炭笔画)

-colorize175

(指定颜色值)

其实我对这个还是比较感兴趣的,有兴趣的大家可以上网搜一下,如果能稍微记住几个的话那就无敌了,完胜ps有木有啊

批量转换图像

管理文件系统

ext3增加了日志功能

使用fdisk进行分区

这个在我安装gentoo的时候纠结了好长时间,所以对于这个命令印象十分深刻啊。

复制分区表

sfdisk-d /dev/sda > sda-table

使用parted(

使用后会立即生效,所以慎用)

格式化文件系统

mkfs-t ext3 /dev/sdb1

挂载tune2fs-c 31 /dev/sda1

mount手工挂载

umount命令卸载文件系统

检查文件系统badblocks

检查raid磁盘

查看文件系统使用情况

df-h

显示/home目录的磁盘空间使用情况

du-h /home/

du -sch /home /var

LVM

备份何可移动存储介质

tar表示归档,归档以后文件后缀名为.tar

压缩的话有好几种方式

bz2(使用bzip2压缩) gzgzip压缩)

lzolzop

压缩)

bzip2压缩用时多压缩比相对lzop提高一倍

速度从快到慢,压缩率从低到高依次为

lzop gzip bzip2

由于tar命令的话比较古老,故不用连字符

-

tarc *.txt | grip -c > myfiles.tar.gz

解压缩解包

gunzip-c myfiles.tar.gz |tar x

使用压缩工具

tarcjvf myfiles.tar.bz2 *.txt

关于链接

ftp的步骤

lftp-u ftp网址

我是一个linux新手,最近安装了fedora16以后一直在玩命令行。

刚刚安装好以后自然是有很多东西要下载的。所以我经常会用到yum命令。

但是我在使用yum命令的时候,经常会遇到这样的情况:

首先我先搜索一下是否存在我需要寻找的软件(这里比如说搜索一个IRC聊天室),使用如下命令:

yum search irssi

已加载插件:langpacks, presto, refresh-packagekit

============================== N/S Matched: irssi ==============================

irssi-devel.i686 : Development package for irssi

irssi-otr.i686 : Off-The-Record messaging plugin for irssi

irssi-xmpp.i686 : XMPP plugin into irssi

irssi.i686 : Modular text mode IRC client with Perl scripting

  Name and summary matches only, use "search all" for everything.

然后当我选择第一个irssi-devel.i686,并且输入命令安装的时候会出现如下的问题:

sudo yum install irssi-devel.i686

这个时候会出现下面这样的情况:

另外一个程序锁定了 yum;等待它退出……

  另一个应用程序是:PackageKit

    内存: 38 M RSS ( 64 MB VSZ)

    已启动: Thu Dec  1 15:24:30 2011 – 05:37之前

    状态  :睡眠中,进程ID:2857

那么这么进程ID是什么呢?肯定是和yum有关的进程嘛,我们通过列出进程列表找到这个进程的有关信息:

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD

4 S     0  2857  2854  0  90  10 – 16315 poll_s ?        00:00:01 yumBackend.py

由于yum命令一次只能下载一个软件,所以当你需要下载第二个软件包的时候,系统会用进程锁锁定yum,(关于进程锁的概念我还不是很了解,大家不要见笑)。

所以我使用

kill -9 2857

来杀死这个进程(虽然说强杀容易产生很多问题,但是作为新手我目前就先这样做吧。注意这个操作必须进行提权,否则会不能执行)

现在直接使用上面的  install 就可以安装了

这里我还有一个问题不是很明白,我只是用yum搜索了一下,搜索以后为什么yum 的进程还存在呢?那我使用yum  下载的时候应该说是第一次下载啊,为什么会出现程序锁呢?请知道的朋友多加指点,谢谢大家了~~~~

下面的文章转自一个大二学生的问题和杨中科老师的回答,我看了以后还是蛮有收获的。

先介绍我的情况 普通本科大二学生,,之前一直在练acm的题,也获得了一些大赛的奖项,有一天有个人问我,叫我做一个小软件,我发现我不会。。更惨的就是我好像什么软件都不会做(这里指的是基于c/c++的开发),,除了console的一些算法题,,然后我和自己说练acm够了,应该开始学开发工具的运用和一些库类(函数)的使用了,,这样2个星期下来,我翻了很多关于商业程序开发资料,我发现商业程序代码真的很少涉及到高效算法和一些特殊的数据结构,而且我也问了几个现在在公司上班的师兄,他们也说工作中真正用到acm的知识是很少很少的。现在一系列的ACM比赛又差不多开始了,我现在一直没准备。。

    老师我想问的就是 以你多年的工作经验来看,具有ACM背景的人的优势在哪,,还有优势大吗?还有假如我如果现在(大二)拿ACM的获奖证书和带上之前开发一些小软件的实例 去找工作的话,,人家会很轻易的接受我吗?其实我大一的时候就获得了金山软件公司的实习邀请,,不过他说等到我大三暑假的时候才让我去,但是我家的经济深受这次金融风暴的打击,,所以我想大二读完的时候就出去找工作帮轻下家里负担,,我很期望您的回答。。

               还有我补充下我的个人简历,,我跟过一老师做基于.net的关于某公安局的项目,,英语四级,,是学生干部,,学习成绩80分以上,但是我看了看就业形势真的太差了,,我一直在担心公司为什么要我个大学都没毕业的。。

              最后我还想问下 我除了专业领域获过一些奖项,我在其他的专业课程上也获过奖的,例如 一个全国性的营销比赛 ,这对我找技术方面的工作有优势吗。。。还有我之前我看到您大学的时候投过稿,不知道这对你找工作的时候会有优势吗,因为我一直也想投稿到一些杂志和报纸。但因时间太紧。。一直未能如愿。

                谢谢。。。

你说的“商业程序代码真的很少涉及到高效算法和一些特殊的数据结构”这是实际情况,因为并不是所有的公司的产品都是理论性很强的产品,就像造山寨手机的人不需要懂太多芯片设计等方面的知识,只要会把大公司制造的手机芯片拼装起来,然后装一个外壳就可以了。“高效算法和一些特殊的数据结构”已经由IBM、微软等大公司解决了,制造成了一些类库、应用服务器、数据库服务器之类的“零件”,商业程序开发者只要把这些零件按照需要拼装起来就可以了。在大公司工作的人是少数的,所以你问的师兄估计也都不是在这些大公司工作的,所以他们说“工作中真正用到acm的知识是很少很少的”也是可以理解的。

ACM被誉为计算机界奥林匹克,每年的获奖者都几乎被google、微软、IBM、百度等大公司哄抢一空,很多大公司赞助ACM赛事的目的就是“近水楼台”,能够比其他竞争对手笼络更多的人才。

ACM可以看做是“聪明者的游戏”,在ACM题目研究深入的人通常有非常高的数学素养、计算机算法素养以及非常强的分析问题、解决问题以及动手的能力,能够处理各种高精尖的难题,这是各大公司哄抢ACM人才的主要原因。

ACM的程序开发和开发商业软件的不同点就在于写ACM程序是研究(Research),而写商业程序是开发(Development),这就是研发(Research&Development)两个字的含义,“研发”就是“研究开发”,像微软、IBM等这样的公司都将研发人才分为两种:研究性人才和开发性人才。以微软为例,在中国,微软设立了微软亚洲研究院,同时微软亚洲研究院下设微软亚洲工程院,微软亚洲研究院中的人主要的工作就是出paper(论文),根据微软总部下达的研究方向进行核心技术的研究,然后将研究成果转换为可以实施的方案,由微软亚洲工程院的工程师进行实际的开发,简单的讲就是微软亚洲研究院的人负责研究课题,然后由微软亚洲工程院的工程师根据研究结果开发出实际可用的商业化产品。因此微软亚洲研究院的人都是拥有很强科研实力的人,而微软亚洲工程院的人

则是有很强开发能力的人。像google、IBM等大公司也有类似的部门职位划分。对于一些次一级的大公司来说,比如百度、网易等,也在职位上进行着类似的划分。

他们的区别就像研究动力学的人和设计汽车的人的差别一样,研究动力学的人只负责从研究一些理论,不负责实际的汽车设计,而是由专门的汽车设计工程师来负责根据研究成果进行实际的产品设计。比如对于做搜索引擎来说,研究性人才负责研究检索方面的理论,得出一些公式、算法、理论,然后由开发性人才负责根据这些研究成果写程序,然后变成可以实际使用的搜索引擎。

研究性人才对智商要求比较高,处于人才金字塔的顶端,因此收入、待遇各方面都更高一些,职业发展就是“科学家”;而开发性人才的优势则在于理论转化为产品的能力,因此开发性人才中独立创业的比例更高。

看了公司的职位划分你就能明白白商业化软件开发和写ACM题的区别在哪里了,你就知道做ACM题背景的人和掌握商业程序开发技能的人的不同定位了。如果ACM成绩非常好,那么进入这些国际性大公司的概率会非常高,哪怕去不了大公司,中小型公司也非常欢迎这种基础理论扎实的人才,因为他们可以解决别人解决不了的难题,但是这类人才通常要价比较高,很多中小型公司难以承受,同时中小型公司并没有独立的研究部门,所以这类人才进入公司以后通常都是兼有研究和开发两重责任,当然也是处于公司人才金字塔的顶端,享受特殊待遇;开发性人才则是各个类型的公司都需要的,相对来说选择面广一些,但是初始阶段的收入会比研究性人才低一些。你需要根据你的情况来给自己定位,如果是做研究性人才,那么就继续把ACM弄好,多参加ACM大赛,特别是正式的国际性ACM大赛,争取拿奖,同时做好进行研究生学习的的准备(ACM成绩好的话一般都会被科研院所免试录取),在研究生阶段进行进一步的理论研究和培养自己的科研能力,这种方向的话**不需要管什么java

web开发、Windows程序开发这类的实现性技术**,只需要把算法、模式识别等理论课程学好即可;如果你的定位是开发性人才则把主要精力放到java web开发、Windows程序开发等上边来,如果从事这个方向,因为你已经有一定的ACM的基础了,所以应付面试笔试中的那些算法难题不在话下,那么就在把一部分精力继续投入在ACM的学习上的同时,把更多的精力投入到这些商业程序开发的技术上去。

至于你提到的“公司为什么要我个大学都没毕业的”,你可以看这几篇文章:

http://www.rupeng.com/index.php/viewthread-514

http://www.rupeng.com/index.php/viewthread-431

http://www.rupeng.com/forum/thread-1211-1-1.html

要多看如鹏首页的内容(http://www.rupeng.com/

“一个全国性的营销比赛 ,这对我找技术方面的工作有优势吗”,你可以参加这方面的比赛,但是不要牵扯太多的精力,这方面的比赛可以提升的软实力,但是同样削弱了你在主业方面的投入;“投过稿,不知道这对你找工作的时候会有优势吗”,这些优势都不是量化的,而是一种软实力,投过稿、写过书,那么你分析问题、表述问题的时候会更加条理化,对工作、个人发展都有好处,这都是软实力的提升,企业需要软实力非常强的人才。

如鹏出几个开发性人才高手是我的期望,出几个研究性人才、ACM高手则是我的奢求,呵呵。

今天在做题目的时候碰到一个很奇怪的现象。先看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include&lt;stdio.h&gt;
#include&lt;string.h&gt;

int main()
{


char a[100];
int i,len;

scanf(&amp;quot;%s&amp;quot;,a);
len = strlen(a);
printf(&amp;quot;%dn&amp;quot;,len);

a[100] = &#039;0&#039;; //请注意a[100]

printf(&amp;quot;%d&amp;quot;,len);

return 0;
}

我在定义的时候定义的是a[100],其实是从a[0]到a[99]。运行这个程序的结果是

输入123

输出3

        48

这个48正是0的ASCII值,这个时候问题就暴露出来了。那么为什么len的值会发生改变呢?

其实想要回答这个问题,必须先搞清楚变量在内存中的分配方式。在main函数里面定义的变量是存放在栈中的(其实这种说法也不是很准确,还跟类型有关,比如常量的话就不是这种情况了)。所以未初始化定义的变量是按照先后顺序依次存入堆里,这里可以用指针查看具体变量的地址,这样可以更加清楚的看到内存的连续分配情况。(注意一个整形占4个字节,而一个字符占1个字节)。

值得说明的是,如果定义的是全局变量,这个时候内存使用的是堆的存储方式,这个时候内存分配的空间不再连续,而是类似于链表的形式。

每一C 程序都必须有一main()函数, 可以根据自己的爱好把它放在程序的某

个地方。有些程序员把它放在最前面, 而另一些程序员把它放在最后面, 无论放

在哪个地方, 以下几点说明都是适合的。

1. main() 参数

在Turbo C2.0启动过程中, 传递main()函数三个参数: argc, argv和env。

  • argc: 整数, 为传给main()的命令行参数个数。

  • argv: 字符串数组。

在DOS 3.X 版本中, argv[0] 为程序运行的全路径名; 对DOS 3.0

以下的版本, argv[0]为空串("") 。

argv[1] 为在DOS命令行中执行程序名后的第一个字符串;

argv[2] 为执行程序名后的第二个字符串;

argv[argc]为NULL。

*env: 安符串数组。env[] 的每一个元素都包含ENVVAR=value形式的字符

串。其中ENVVAR为环境变量如PATH或87。value 为ENVVAR的对应值如C:DOS, C:

TURBOC(对于PATH) 或YES(对于87)。

Turbo C2.0启动时总是把这三个参数传递给main()函数, 可以在用户程序中

说明(或不说明)它们, 如果说明了部分(或全部)参数, 它们就成为main()子程序

的局部变量。

请注意: 一旦想说明这些参数, 则必须按argc, argv, env 的顺序, 如以下

的例子:

main()

main(int argc)

main(int argc, char *argv[])

main(int argc, char _argv[], char _env[])

其中第二种情况是合法的, 但不常见, 因为在程序中很少有只用argc, 而不

用argv[]的情况。

以下提供一样例程序EXAMPLE.EXE, 演示如何在main()函数中使用三个参数:

/_program name EXAMPLE.EXE_/

include<stdio.h>

include<stdlib.h>

main(int argc, char _argv[], char _env[])

{

int i;

printf("These are %d command- line arguments passed to main:nn", argc);

for(i=0; i<=argc; i++)

printf("argv[%d]:%sn", i, argv[i]);

printf("nThe environment string(s) on this system are:nn");

for(i=0; env[i]!=NULL; i++)

printf(" env[%d]:%sn", i, env[i]);

}

运行EXAMPLE.EXE:

C:example first_argument "argument with blanks" 3 4 "last but

one" stop!

注意: 可以用双引号括起内含空格的参数, 如本例中的: " argument

with blanks"和"Last but one")。

结果是这样的:

The value of argc is 7

These are the 7 command-linearguments passed to main:

argv[0]:C:TURBOEXAMPLE.EXE

argv[1]:first_argument

argv[2]:argument with blanks

argv[3]:3

argv[4]:4

argv[5]:last but one

argv[6]:stop!

argv[7]:(NULL)

The environment string(s) on this system are:

env[0]: COMSPEC=C:COMMAND.COM

env[1]: PROMPT=$P$G /_视具体设置而定_/

env[2]: PATH=C:DOS;C:TC /_视具体设置而定_/

env[] 获得的信息等同于Linux下env命令的结果

其实这几个参数在 linux上用得比较广泛,比如说像-m -s等等的参数,利用这几个参数可以直观的看出来。然后最后一个*env好像是c里面所特有的,是用来显示指向各种path值的指针。

学习过转义字符以后,大家都明白 例如          t (横向跳格)    n(换行)     (输出一个)      ‘ (输出一个 ‘)     " (输出 ")    ddd (ASCIi为八进制所代表的字符)  

xhh  (ASCII为十六进制所代表的字符)

说到这里,我碰到了一个问题,如何输出%呢?

如果直接 printf("%");在执行的时候是没有任何输出的,即使printf("%");也是一样的。

这是因为%所代表的是格式字符,比如printf("%d",n); 

所以这里要特别注意如果想输出%,必须用%%,即 printf("%%");   才能达到效果