VC++ C++ C# Algorithm

C++博客 首页 新随笔 联系 聚合 管理
  21 Posts :: 3 Stories :: 31 Comments :: 0 Trackbacks

#

#include  < cassert >
#include 
< cctype >
#include 
< cmath >
#include 
< cstddef >
#include 
< ostream >
#include 
< string >
using  std::allocator;
using
 std::basic_string;
using  std:: string
;
using
 std::char_traits;
using
 std::ostream;
using
 std::tolower;
using
 std::tolower;
class  ichar_traints: public  char_traits < char >

{
public
:
   
static   int  compare( const   char   * str1, const   char   *
str2,size_t n)
   
{
       
for (size_t i = 0 ; i < n; i ++
)
       
{
           
if (str1 == 0
)
               
return   - 1
;
           
else   if (str2 == 0
)
               
return   1
;
           
else   if (toupper( * str1) < toupper( *
str2))
               
return   - 1
;
           
else   if (toupper( * str1) > toupper( *
str2))
               
return   1
;
           assert(tolower(
* str1) == tolower( *
str2));
           str1
++
;
           str2
++
;

       }

       
return   0 ;
   }

}
;
typedef basic_string
< char ,ichar_traints >
 istring;
inline ostream
&   operator << (ostream  & os,istring &
 str)
{
    os
<< string
(str.c_str());
}

int  _tmain( int  argc, _TCHAR *  argv[])
{
      //建立二个字符大小写不同的串
    istring s1
= " qianweifeng "
;
    istring s2
= " QianweiFeng "
;
    std::cout
<<
s1.compare(s2);
    
int
 pause;
    std::cin
>>
pause;
    
return   0
;
}
摘自Thinking in C++
posted @ 2006-12-26 15:20 大熊猫 阅读(604) | 评论 (0)编辑 收藏

今天偶尔看道了计算机体系结构中有关编译器优化对提高Cache性能的影响一节,其中说道如果有数组,假设int a[5000][100],我们写下如下代码,则第一种效率高于第二种。原因是第二个循环以100*4字节的跨距访问存储器,势必造成Cache失效次数增加,增大了访存时间,而第一种循环顺序地访问一个Cache块中地元素,减少了失效次数,提高了Cache性能。
 14-4(a)
 2
for (row=0; row<5000; row++)
 
3{
 
4  for ( col=0; col<100; col++ )
 
5  {
 
6     sum = sum + a[row][col];
 
7  }

 
8}

 
94-4(b)
10
for (col=0; col<100; col++ )
11{
12  for (row=0; row<5000; row++)
13  {
14    sum = sum + a[row][col];
15  }

16}

但我又想起了林锐博士的高质量C++编程手册,其中写到:在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU 跨切循环层的次数。按照他的说法,上面二种写法,后一种比较好,这不就跟体系结构书上说的矛盾了吗?我不知道谁对谁错,也不知道减少CPU 跨切循环层的次数是怎么具体影响效率,大家不知有何看法。
posted @ 2006-12-17 23:14 大熊猫 阅读(1383) | 评论 (4)编辑 收藏

一个程序二个窗口

  1 #include "stdafx.h"
  2 #include <map>
  3 #include "MultiWindow.h"
  4 #define MAX_LOADSTRING 100
  5 using namespace std;
  6 // 全局变量:
  7 HINSTANCE hInst;                                // 当前实例
  8 TCHAR szTitle[MAX_LOADSTRING];                    // 标题栏文本
  9 TCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名
 10 
 11 // 此代码模块中包含的函数的前向声明:
 12 ATOM                MyRegisterClass(HINSTANCE hInstance);
 13 BOOL                InitInstance(HINSTANCE, int);
 14 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
 15 LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 16 using namespace std;
 17 
 18 class CMyWnd;
 19 typedef map<HWND,CMyWnd*> MAPHWND2WND;
 20 MAPHWND2WND  mapHWND2Wnd;
 21 
 22 CMyWnd* tmpMyWnd = NULL;
 23 
 24 class CMyWnd
 25 {
 26 public:
 27     static LRESULT CALLBACK WndProc(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam);
 28 
 29     LRESULT WindowProc(UINT nMessage,WPARAM wParam,LPARAM lParam);
 30 
 31 
 32     CMyWnd()
 33     {
 34         m_hWnd = NULL;
 35     }
 36     bool Create()
 37     {
 38         tmpMyWnd  = this;
 39 
 40         m_hWnd  = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
 41             00100,100, NULL, NULL, hInst, NULL);
 42 
 43         if (!m_hWnd)
 44             return false;
 45 
 46 
 47         return true;
 48     }
 49 
 50     BOOL ShowWindow(int nCmdShow)
 51     {
 52         return ::ShowWindow(m_hWnd,nCmdShow);
 53     }
 54 
 55     BOOL UpdataWindow()
 56     {
 57         return ::UpdateWindow(m_hWnd);
 58     }
 59 
 60     virtual void OnPaint()
 61     {
 62         PAINTSTRUCT ps;
 63         HDC hdc = BeginPaint(m_hWnd, &ps);
 64         ::TextOut(hdc,0,0,"123456",6);
 65         EndPaint(m_hWnd, &ps);
 66 
 67     }
 68 
 69     HWND m_hWnd;
 70 };
 71 
 72 class CMyWnd2 : public CMyWnd
 73 {
 74 public:
 75     virtual void OnPaint()
 76     {
 77         PAINTSTRUCT ps;
 78         HDC hdc = BeginPaint(m_hWnd, &ps);
 79         ::TextOut(hdc,0,0,"6789",4);
 80         EndPaint(m_hWnd, &ps);
 81     }
 82 
 83     string m_str;
 84 };
 85 
 86 class CMyWnd3 : public CMyWnd
 87 {
 88 public:
 89     virtual void OnPaint()
 90     {
 91         PAINTSTRUCT ps;
 92         HDC hdc = BeginPaint(m_hWnd, &ps);
 93         ::TextOut(hdc,0,0,"000000",6);
 94         EndPaint(m_hWnd, &ps);
 95     }
 96 
 97     string m_str;
 98 };
 99 
100 CMyWnd* findCMyWnd(HWND hWnd)
101 {
102     MAPHWND2WND::iterator it = mapHWND2Wnd.find(hWnd);
103     if (it != mapHWND2Wnd.end())
104     {
105         return it->second;
106     }
107     else
108     {
109         mapHWND2Wnd.insert(make_pair(hWnd,tmpMyWnd));
110 
111         tmpMyWnd->m_hWnd = hWnd;
112         return tmpMyWnd;
113         //DebugBreak();
114     }
115     return NULL;
116 }
117 
118 LRESULT CALLBACK CMyWnd::WndProc(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
119 {
120     CMyWnd* pWnd = findCMyWnd(hWnd);
121     if (pWnd != NULL)
122     {
123         return pWnd->WindowProc( nMessage, wParam, lParam);
124     }
125     else
126     {
127         DebugBreak();
128     }
129     return 0;
130 }
131 
132 LRESULT CMyWnd::WindowProc(UINT nMessage,WPARAM wParam,LPARAM lParam)
133 {
134     if (nMessage == WM_PAINT)
135     {
136         OnPaint();
137         return 0;
138     }
139     return ::DefWindowProc(m_hWnd, nMessage, wParam, lParam);;
140 }
141 
142 
143 int APIENTRY _tWinMain(HINSTANCE hInstance,
144                      HINSTANCE hPrevInstance,
145                      LPTSTR    lpCmdLine,
146                      int       nCmdShow)
147 {
148      // TODO: 在此放置代码。
149     MSG msg;
150     HACCEL hAccelTable;
151 
152     // 初始化全局字符串
153     LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
154     LoadString(hInstance, IDC_MULTIWINDOW, szWindowClass, MAX_LOADSTRING);
155     MyRegisterClass(hInstance);
156 
157     // 执行应用程序初始化:
158     if (!InitInstance (hInstance, nCmdShow)) 
159     {
160         return FALSE;
161     }
162 
163     hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MULTIWINDOW);
164 
165     // 主消息循环:
166     while (GetMessage(&msg, NULL, 00)) 
167     {
168         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
169         {
170             TranslateMessage(&msg);
171             DispatchMessage(&msg);
172         }
173     }
174 
175     return (int) msg.wParam;
176 }
177 
178 
179 
180 //
181 //  函数: MyRegisterClass()
182 //
183 //  目的: 注册窗口类。
184 //
185 //  注释: 
186 //
187 //    仅当希望在已添加到 Windows 95 的
188 //    “RegisterClassEx”函数之前此代码与 Win32 系统兼容时,
189 //    才需要此函数及其用法。调用此函数
190 //    十分重要,这样应用程序就可以获得关联的
191 //   “格式正确的”小图标。
192 //
193 ATOM MyRegisterClass(HINSTANCE hInstance)
194 {
195     WNDCLASSEX wcex;
196 
197     wcex.cbSize = sizeof(WNDCLASSEX); 
198 
199     wcex.style            = CS_HREDRAW | CS_VREDRAW;
200     wcex.lpfnWndProc    = CMyWnd::WndProc;
201     wcex.cbClsExtra        = 0;
202     wcex.cbWndExtra        = 0;
203     wcex.hInstance        = hInstance;
204     wcex.hIcon            = LoadIcon(hInstance, (LPCTSTR)IDI_MULTIWINDOW);
205     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
206     wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
207     wcex.lpszMenuName    = (LPCTSTR)IDC_MULTIWINDOW;
208     wcex.lpszClassName    = szWindowClass;
209     wcex.hIconSm        = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
210 
211     return RegisterClassEx(&wcex);
212 }
213 
214 //
215 //   函数: InitInstance(HANDLE, int)
216 //
217 //   目的: 保存实例句柄并创建主窗口
218 //
219 //   注释: 
220 //
221 //        在此函数中,我们在全局变量中保存实例句柄并
222 //        创建和显示主程序窗口。
223 //
224 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
225 {
226   
227 
228    hInst = hInstance; // 将实例句柄存储在全局变量中
229 
230   
231    CMyWnd* pWnd = new CMyWnd3();
232    if(!pWnd->Create())
233        return false;
234    pWnd->ShowWindow(nCmdShow);
235    pWnd->UpdataWindow();
236 
237    pWnd = new CMyWnd2();
238 
239    if (!pWnd->Create())
240        return FALSE;
241    pWnd->ShowWindow(nCmdShow);
242    pWnd->UpdataWindow();
243 
244    return TRUE;
245 }
posted @ 2006-12-15 20:56 大熊猫 阅读(264) | 评论 (0)编辑 收藏

#include  < stdio.h >
#include 
< string .h >
int  main( int  argc,  char   * argv[])  {
 
int  i  =   1
;
 
char  buf[ 4
];
  strcpy(buf, 
" AAAA "
);
  printf(
" %d\n "
, i);
 
return   0
;
}

这是一道C++面试题目,问在x86平台上为什么不能输出想要的结果。
char   * mycopy( char   *  dst, char   *  src)
{
    
char   *  cp =
dst;
    
while ( * cp ++=* src ++
);
    
return
 dst;

}
以上面就是strcpy的实现,其中没有对边界进行检查,可以看到该函数把'0\'也复制到目的串内存中去了,而目的串申请的空间不够,就把'\0'复制到i的内存中去了,x86又是littleedian(低位字节地址小),原来i内存结构是0x01 00 00 00  现在成0x 00 00 00 00,所以输出0了。

注:我在Dev-C++中确实是输出0,在VS2003中出来一个运行时检测错误,说buf附近栈崩了,但输出还是1,不知道是不是VS没做对'\0'的复制。
posted @ 2006-12-13 15:41 大熊猫 阅读(987) | 评论 (2)编辑 收藏

一个在美国IBM工作过2年,在印度公司工作了4年的项目经理与我司资深软件开发经理有这样一段对话。
印方经理问:"你们每月生产多少行代码?"
我方经理掂量了很久,谦虚地说:"人均代码1万多行吧,不到2万行"。
印方经理听后,眼睛瞪得圆圆的:"喔!你们已经远远超过国际最高水平了。"
我方经理惴惴不安地反问:"你们的呢?"
印方经理很认真地回答:"我们公司目前的效率为每人每月300行。"
这是一个真实的故事,我想换了其他人(包括以前的我)也会给出同样的答案。
为什么与软件大国有这么大的差距呢?
首先我们没有生产率的概念。大多数人是这么算的,一天编400行-500行代码还不是小菜一碟。一个月有30天,这样每月1万多行还不是轻松搞掂?
殊不知,这个伟大的假设有两个致命的错误:第一、没有考虑需求分析、概要设计、详细设计、单元测试、集成测试、系统测试的时间,也没有考虑文档的时间,甚至都有可能不知道有这些过程。
这不是笑话,试问:我们有需求分析吗?我们有单元测试吗?我们有编程规范,但我们遵守了吗?
我们的代码花花绿绿,风格千奇百怪――
我们不是有"开发完了,还没有设计文档的经历"吗?
我们不是有"要转中试了,所有人才开始埋头苦干写文档"的经历吗?
我们不是有人在文档中写过,"该软件对人畜没有伤害"吗?
当然,我们更不可能想到有review的时间,根本考虑不到质量控制?
我们最熟悉写程序、系统测试、维护,其他的都是多余。这是典型的小公司游击战的做法,一个人搞一个小软件,不需要任何流程,没有任何质量体系,除了写代码,测试以外,什么都不需要,非常自由,自以为"牛得不行",这很easy,那很容易,"管理是罗嗦,流程是麻烦",但实际的结果是什么样大家都知道。
第二、一天能写400-500行代码,并不表示,你平均每个月能写12000-15000行代码,道理很简单,一个人100米速度是12秒,并不表示他的3000米速度是6分钟。我们不是机器人,写软件需要思考,写嵌入式软件尤其需要质量。
印度工程师是人,中国软件工程师也是人,我们的代码生产率与水平能高到哪里去呢?正如大家都是凡人,你突然说你比子弹还快,一蹦3层楼高。
这真是"无知"者"无畏"?
其实我们的生产率很低,自己不觉得罢了,很多人并不相信我司的公开数字――月产代码才120行?如果算一算所有的人力,所有阶段的时间,我们就不会惊奇这个数据了。不信的话,我们拿一个产品算一算!或许我们的经理自己都不知道在这个产品投了多少人力。华为有职业化的软件开发管理人才吗?目前几乎没有,或许我们真的有月产2万行的编程高手,也有很多自以为能写2万行代码的"泡沫"高手,但我们没有真正专业的软件人才!
目前我们公司的销售情况很好,卖得很火。但这是项目开发成功了吗?不是,可能更多的是市场的成功,以及产品预研立项人员的成功。生命周期内还要花那么多维护费用,这怎么能算成功?如果我们造飞机,我们可能自己都不敢坐。衡量项目成功的标准与要素是什么?很多人并不知道。印度发展最快的Infosys公司告诉我们:衡量项目成功的标准是"质量、成本与进度,达到这一目标的重要条件是"流程、技术、人"。
我们做计划时,只有进度,或许会考虑一下成本,但从来没有考虑过质量。我们知道项目开发的质量活动是什么吗?我们不知道;我们知道我们的质量目标吗?我们也没有;我们知道如何控制我们的质量吗?我们没有干过。
所以我们才无所畏惧,百折不饶。但如果我们知道"折"一次要花100万,我们还会无所畏惧地"百折"吗?再回头看看一些业界标准:某印度合作公司通过了CMM5级,联合开发项目的生产率为每月400行。其中编码阶段,印度工程师每天可以写200至900行代码。
在4个月的联合开发过程中――
在编码速度上,我方优秀工程师与对方差不多,但别人教会了我们如何 保证代码规范以及编程风格的一致;
在阅读协议标准方面,对方的速度是我们的4-5倍;
在设计方面,对方有明显的优势;
在质量控制,我们与他们就没有办法比较了;
在预测方面,对方估计工作量为36人月,我方估计为22人月,实际数为35人月。
通过对比,我的结论是:我们富有,因为我们有很多bug;我们快速,因为我们没有质量体系。
有些人还以为――
会使用配置工具sourcesafe,就知道什么是配置管理;
会画CANTT图/PERT图,就知道项目计划是怎么回事了;
填一下表格就是管理;
吃一顿饭就是沟通。
没有对质量整体的认识,不了解其为什么这么做,大家就根据自己的过去经验"理解"、"推测"、"认识"别人,有这么巨大的认识差距就不足为怪了。
目前,公司在质量体系方面的培训与推行力度的不断加强,印度所经验的不断推广,在很多方面,如流程建设、预测、质量控制、度量系统,我们已经初步了解该怎么做。但我们还要不断地宣传、不停地松土,让所有的人承认自己无知,只有这样,我们才能由"无知"变为"有识"。
"艺低人胆大",今后,我再也不想听这种大胆的豪言壮语?我们每月代码1万行"!
posted @ 2006-11-21 15:28 大熊猫 阅读(225) | 评论 (0)编辑 收藏

仅列出标题
共5页: 1 2 3 4 5