坚持到底就是胜利

用心去做好这件事情

统计

留言簿(1)

阅读排行榜

评论排行榜

#

dream come true !(2)

count_word:
思想:用一个变量标志单词的开始和结束,也就是说 what i do is to judge where the word begin and where the word end
notes: maybe the interviewer didnot give enough information deliberately,they want me to check this detail,so i should communication with him to check the definition of word.

int  count_word( char   * s)
{
  
if ( null   ==  s)
     
return   0 ;
   
int  count  =   0 ;
   
int  i  =   0 ,flag  =   0 ;
   
while (s[i]  !=   ' \0 ' )
   
{
     
if (isalpha(s[i])  &&  flag  ==   0 )
     
{
        flag 
=   1  ; //  word begin
        count  ++ ;
      }

     
else   if (flag  ==   1 )
      
{
        
if ( ! isalpha(s[i])  &&  s[i]  !=   ' _ ' )
         flag 
=   0 ;
        
else   if (s[i]  ==   ' _ ' )
         
{
           
if ( ! isalpha(s[i + 1 ]))
              flag 
=   0 ;
         }
   
       }

      i
++ ;
    }

  
return  count;
}

posted @ 2006-11-19 21:18 ailab 阅读(118) | 评论 (0)编辑 收藏

dream come true!(1)

question : i love u ->u love i
analysis:
主要思想是 首先整体逆置句子,然后再寻找句子中每个单词 做逆置。
需要分析的是: 单词的定义?空格如何处理?标点符号?
需要注意的地方就是:在需要知道单词的结尾的时候,需要对字符串最后一个字符进行判断,如果仍然处于单词中,这个时候仍然要结束这个单词,去逆置
 1void reverse(char *s,int start,int end)
 2
 3   if(s == null || start > end )
 4       return;
 5   for(int i = start,j = end; i < j;i++,j--)
 6    {
 7      char temp = s[i];s[i] = s[j];s[j] = temp;
 8      }

 9}

10
 1void reverse_word(char *s)
 2{
 3  if(s == null)
 4    return;
 5  int len = strlen(s);
 6  reverse(s,0,len-1);
 7  
 8  int flag = 0;// word doesnot begin
 9  int i = 0,start = 0,end = 0;
10  while(s[i] != '\0')
11  {
12     if(isalpha(s[i]) && flag == 0)
13     {
14        start = i;
15        flag = 1;
16     }

17     else if(flag == 1 && !isalpha(s[i]))
18    {
19      end = i-1;
20      reverse(s,start,end);
21      flag = 0;  
22     }

23     else if(flag == 1 && s[i+1== '\0')
24     {
25         if(isalpha(s[i]))
26           end = i;
27        else 
28            end = i-1;
29        reverse(s,start,end);   
30   }

31   i++;
32   }

33
34}

35

posted @ 2006-11-19 21:01 ailab 阅读(155) | 评论 (0)编辑 收藏

static member function

不能引用非静态成员变量,静态类成员函数不接收指针,可以作为回调(call back)函数。。
#include<iostream>
using namespace std;

class A{
private:
    
static int x;
    
int y;
public:
    A(
int _y):y(_y){}
    
static int getvalue(){return x;}
}
;
int A::x = 1;
//int A::getvalue();
int main(void)
{
    A a(
2);
    
int yy= A::getvalue();

    cout
<<yy<<endl;

    
return 0;


}
由于在C++中使用类成员函数作为回调函数的目的就是为了访问所有的成员变量和成员函数,如果作不到这一点将不具有实际意义。解决的办法也很简单,就是使用一个静态类指针作为类成员,通过在类创建时初始化该静态指针,如pThis=this,然后在回调函数中通过该静态指针就可以访问所有成员变量和成员函数了。这种处理办法适用于只有一个类实例的情况,因为多个类实例将共享静态类成员和静态成员函数,这就导致静态指针指向最后创建的类实例。为了避免这种情况,可以使用回调函数的一个参数来传递this指针,从而实现数据成员共享

posted @ 2006-07-07 17:06 ailab 阅读(475) | 评论 (1)编辑 收藏

sizeof(class)

sizeof(class)总结下:
如果class为空,那么sizeof(class)=1;
如果class 内有虚函数,则要加上一个指针大小
当然class的data member也是要加上的。。。。

posted @ 2006-07-06 20:04 ailab 阅读(437) | 评论 (1)编辑 收藏

inline

转载水木
误解:inline函数没有单独的函数体,也不能取地址。

inline修饰并不会改变函数的通常语义,仍可通过函数指针调用:

inline void f() {}

void g() {
  void (*p)() = f;
  p();
}


------------------------------------------------------------------------


误解:inline一定导致代码膨胀

class Foo {
public:
        int Bar() { return foo; }
private:
        int foo;
};

这样的Foo::Bar inline会让binary变小


------------------------------------------------------------------------


误解: inline函数一定是internal linkage/no linkage的。

inline与函数的linkage无关。inline函数同样可以用static和extern修饰,并具
备同一般函数相同的linkage。标准要求external linkage的inline函数在所有编
译单元中具有相同的地址。external linkage的inline函数内定义的静态变量同
样应在所有编译单元中表现为单一对象,具有相同的地址。


------------------------------------------------------------------------


误解: 如果inline函数包含循环/调用了其他函数/递归调用自己,编译器就无法
      将其展开。

某些早期的编译器有这类限制,但对现代编译器来说它们不再是inline展开的障
碍了。

[insert RoachCock's example here]


------------------------------------------------------------------------


误解:inline和virtual不能同时修饰一个函数。

inline和virtual并不冲突。以下程序编译通过。

#include <iostream>

struct A
{
  inline virtual void f()
  {
    std::cout << "inline virtual" << std::endl;
  }
};


------------------------------------------------------------------------


误解:virtual函数即使声明为inline,由于是late binding,无法判断实际
      调用的版本,编译器也无法展开。

虚函数调用并不总是late binding。

示例:

struct Base
{
  virtual void foo(){cout << "Base::foo" << endl;}
};

struct Derived : Base
{
  void foo(){cout << "Derived::foo" << endl;}
};

void bar(Base& b)
{
  b.foo();  // late binding. if b is a Derived, call Derived::foo
  b.Base::foo();  // early binding. inline
  Derived d;
  d.foo();  // early binding. inline
}

另外,尽管在您的编译器中很可能还没有实现,但即使late binding理论上也是
可以展开的。

posted @ 2006-07-05 20:10 ailab 阅读(395) | 评论 (0)编辑 收藏

review of this month

      从2006年6月1号在无锡南禅市买了《essential c++》之后,发誓要坚持把它给学下去,尽管我每天都在上班,但是我还是利用车上时间,公司少量时间,和晚上的时间,把这本书看完了,自我感觉功力大增,C语言的功底给了我很大的帮助,我不停地上机实践,发现问题,解决问题,收获知识,快速成长,只要自己努力,就一定市可以的。

   “作为一个好的学习者,背景不是重点,重要的是,你是否具备正确的学习态度,起步固然可以从轻松小品开始,但如果碰上大部头巨著就退避三舍、逃之夭夭,面对任何技术只求快餐速成,学语言从来不写程序,那就绝对没有成为高手乃至专家的一天”

     下一个月的目标,是重读effective c++ ,c++编程用法,c++必知必会,最重要的是上机体会,发现问题,解决问题,积累知识。

posted @ 2006-06-29 22:38 ailab 阅读(152) | 评论 (0)编辑 收藏

const类对象

在写程序时,就遇到了这种情况,“只能对const对象调用const 成员函数”
class nocopy{
public:
 nocopy(
int value):_value(value){}
 
int get_value() const {return _value;}
private:
 
int _value;
}
;

void fun(const nocopy &rhs)
{
 rhs.get_value();
}

如果把const去掉,就出现错误,再说明另外一点,为什么使用引用?是因为这样做,不会再调用copy operator,效率高。。。

posted @ 2006-06-29 22:19 ailab 阅读(1662) | 评论 (4)编辑 收藏

reference to pointer

  第六章其中讲到一个二叉排序树的问题,其中使用了reference to pointer,这

个技术很有用,我今天做这个实验的时候,就彻底用了一把。

void my_malloc(char **p)
{
 
*= ( char *)calloc(sizeof(char),1);
}


char *str = NULL;
my_malloc(
&str);
strcpy(str,
"hello");
还有在创建二叉排序树的时候,也非常有用,

编程实在是王道,要不停地去编程,发现问题,解决问题,提高。。。

posted @ 2006-06-28 20:47 ailab 阅读(303) | 评论 (0)编辑 收藏

说明

这几天没来这里,并不代表我没有看C++,我仍然按计划在进行,也就是今天,我完成了第五章的阅读,剩下的这两天,主要是上机实践,这样周一就可以看第六章,一定要按计划在7月份前高质量把书看完做完。。。

posted @ 2006-06-23 20:01 ailab 阅读(155) | 评论 (0)编辑 收藏

今天体会

      上篇是我写的一个关于matrix的类,实现了任意指定行和列,已经基本的运算“+,-,*”,还有拷贝赋值操作,应该可以满足基本的要求。遇到的问题:
在写拷贝赋值等函数的时候,由于丢掉了 &
matrix& operator=(const matrix &rhs);
结果导致了在析构函数无法正常完成,表现的现象free_dbg这个地方出问题,再者,还有地址无法访问,这个其实是由于没有新开空间,我就直接赋值了,所以出现了这个问题。

   在copy assignment operator这个函数的时候,一定要删除掉原来的空间,然后new一个空间,再赋值过去。
  在copy constructor的时候,只要new一个就可以了。
这其实都是对于class内有配置动态内存,需要重写这两个函数。。
matrix(const matrix &rhs);

一切还都是计划进行,第四章还剩下一个关于指针函数的问题,明天搞定,然后18号就按计划进入第15章,还是老话:写程序才能发现问题

posted @ 2006-06-16 19:37 ailab 阅读(113) | 评论 (0)编辑 收藏

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