给学习c++的新手,这些书籍都是很经典的。经典中的经典
深度探索C++对象模型
英文版:http://www.nengxia.com/soft.asp?id=5
中文版:http://www.nengxia.com/soft.asp?id=19

Modern C++ Design
http://www.nengxia.com/soft.asp?id=7

c++编程思想
第一卷:
中文版:http://www.nengxia.com/soft.asp?id=1039
英文版: Prentice Hall Bruce Eckel Thinking In C++, Second EditionVolume.1
第二卷:
中文版:http://www.nengxia.com/soft.asp?id=1040
英文版:http://www.nengxia.com/soft.asp?id=1041


c++ Programming language
中文版:http://www.nengxia.com/soft.asp?id=1038
英文版:http://www.nengxia.com/soft.asp?id=368

C++ Primer
第三版中文版:http://www.nengxia.com/soft.asp?id=6
第四版
英文版:http://www.nengxia.com/soft.asp?id=117
中文版:http://www.nengxia.com/soft.asp?id=635
c++ primer 题解
http://www.nengxia.com/soft.asp?id=17


C++ Primer plus 第4版中文:
中文版:http://www.nengxia.com/soft.asp?id=987
英文版:
Third.Editionhttp://www.nengxia.com/soft.asp?id=1037
Special.Edition:http://www.nengxia.com/soft.asp?id=369


Effective C++
中文版:http://www.nengxia.com/soft.asp?id=9
英文版:http://www.nengxia.com/soft.asp?id=1033

More Effective C++
中文版:http://www.nengxia.com/soft.asp?id=8

STL源码剖析
http://www.nengxia.com/soft.asp?id=11


c++ template
英文版:
http://www.nengxia.com/soft.asp?id=1034
简体中文版:
http://www.nengxia.com/soft.asp?id=15
繁体中文版:
http://www.nengxia.com/soft.asp?id=16

Effective STL
http://www.nengxia.com/soft.asp?id=54

c++ 标准库
http://www.nengxia.com/soft.asp?id=47

Exception c++
中文版:http://www.nengxia.com/soft.asp?id=1035
英文版:http://www.nengxia.com/soft.asp?id=18

More Excetption c++
英文版:http://www.nengxia.com/soft.asp?id=20

C++ Coding Standards:
http://www.nengxia.com/soft.asp?id=114

STL轻松入门
http://www.nengxia.com/soft.asp?id=162

c/c++标准函数库 中文版
http://www.nengxia.com/soft.asp?id=641

the design and evolution of c++
英文版:http://nengxia.com/soft.asp?id=1042

高质量C++编程指南
http://www.nengxia.com/soft.asp?id=1043



posted @ 2007-10-24 16:45 c++ 学习 阅读(11440) | 评论 (8)编辑 收藏
 
程序员常常需要实现回调。本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的函数,不包括完全依赖于不同语法和语义规则的类成员函数(类成员指针将在另文中讨论)。

声明函数指针

    回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。要实现回调,必须首先定义函数指针。尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。请看下面的例子:

void f();// 函数原型

上面的语句声明了一个函数,没有输入参数并返回void。那么函数指针的声明方法如下:

void (*) ();

    让我们来分析一下,左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(void)和由边圆括弧中的入口参数(本例中参数是空)。注意本例中还没有创建指针变量-只是声明了变量类型。目前可以用这个变量类型来创建类型定义名及用sizeof表达式获得函数指针的大小:

// 获得函数指针的大小
unsigned psize = sizeof (void (*) ()); 

// 为函数指针声明类型定义
typedef void (*pfv) ();

pfv是一个函数指针,它指向的函数没有输入参数,返回类行为void。使用这个类型定义名可以隐藏复杂的函数指针语法。

指针变量应该有一个变量名:

void (*p) (); //p是指向某函数的指针

    p是指向某函数的指针,该函数无输入参数,返回值的类型为void。左边圆括弧里星号后的就是指针变量名。有了指针变量便可以赋值,值的内容是署名匹配的函数名和返回类型。例如:

void func() 
{
/* do something */

p = func; 

p的赋值可以不同,但一定要是函数的地址,并且署名和返回类型相同。

传递回调函数的地址给调用者

    现在可以将p传递给另一个函数(调用者)- caller(),它将调用p指向的函数,而此函数名是未知的:

void caller(void(*ptr)())
{
ptr(); /* 调用ptr指向的函数 */ 
}
void func();
int main()
{
p = func; 
caller(p); /* 传递函数地址到调用者 */
}

    如果赋了不同的值给p(不同函数地址),那么调用者将调用不同地址的函数。赋值可以发生在运行时,这样使你能实现动态绑定。

调用规范

    到目前为止,我们只讨论了函数指针及回调而没有去注意ANSI C/C++的编译器规范。许多编译器有几种调用规范。如在Visual C++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示其调用规范(默认为_cdecl)。C++ Builder也支持_fastcall调用规范。调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。

    将调用规范看成是函数类型的一部分是很重要的;不能用不兼容的调用规范将地址赋值给函数指针。例如:

// 被调用函数是以int为参数,以int为返回值
__stdcall int callee(int); 

// 调用函数以函数指针为参数
void caller( __cdecl int(*ptr)(int)); 

// 在p中企图存储被调用函数地址的非法操作
__cdecl int(*p)(int) = callee; // 出错


    指针p和callee()的类型不兼容,因为它们有不同的调用规范。因此不能将被调用者的地址赋值给指针p,尽管两者有相同的返回值和参数列。 
posted @ 2006-11-18 13:55 c++ 学习 阅读(202) | 评论 (0)编辑 收藏
 
本题目是懒猪一字一字敲上电脑的,转载请尊重懒猪的劳动成果,注明转自懒猪的窝窝http://spaces.msn.com/davidblogs/,资源共享,谢谢合作。
懒猪稍后给出自己做的参考解答,希望能和大家多多交流。
 
编程环境:VC++6
考试时间:3小时
Problem A.Fibonacci
Input:           fib.in
Output:        Standard Output
Time limit:     5 second
Memory limit: 64 megabytes
Offerd by :   http://spaces.msn.com/davidblogs/
 
The Fibonacci Numbers{0,1,1,2,3,5,8,13,21,34,55...} are defined by the recurrence:
F0=0 F1=1 Fn=Fn-1+Fn-2,n>=2
Write a program to calculate the Fibonacci Numbers.
 
Input
The input file contains a number n and you are expected to calculate Fn.(0<=n<=30)

Output
Print a number Fn on a separate line,which means the nth Fibonacci Number.
 
Example
fib.in       Standard Output
1            1
2            1
3            2
4            3
5            5
6            8
 

Problem B.WERTYU
Input:           wertyu.in
Output:         Standard Output
Time limit:      5 second
Memory limit:  64 megabytes
Offerd by :   http://spaces.msn.com/davidblogs/
 
A common typing error is to place the hands on the keyboard one row to the right of the correct position.So "Q" is typed as "W" and "J" is typed as "K" and so on.You are to decode a message typed in this manner.
 
` 1 2 3 4 5 6 7 8 9 0 - = BackSp
Tab Q W E R T Y U I O P [ ] \
A S D F G H J K L ; ' Enter
Z  X  C  V  B  N  M  ,  .  /
Control Alt  Space  Alt Control
 
Input
The input file consist of several lines of text.Each line may contain digits,spaces,upper case letters(except Q,A,Z),or punctuation shown above(except back-quote(') which is left to the key "1").Keys labelled with words [Tab,BackSp,Control,etc.] are not represented in the input.
 
Output
You are to replace each letter or punctuation symbol by the one immediately to its left on the QWERTY keyboard shown above.Spaces in the input should be echoed in the output.
 
Example
wertyu.in                     Standard Output
O S, GOMR YPFSU/        I AM FINE TODAY.
 
 
Problem C.String Matching
Input:            matching.in
Output:         Standard Output
Time limit:      5 second
Memory limit:  64 megabytes
Offerd by :   http://spaces.msn.com/davidblogs/
 
Finding all occurrences of a pattern in a text is a problem that arises frequently in text-editing programs.Typically,the text is a document being edited,and the pattern searched for is a particular word supplied by the user.
 
We assume that the text is an array T[1..n] of length n and that the pattern is an array P[1..m] of length m<=n.We further assume that the elements of P and T are all alphabets(∑={a,b...,z}).The character arrays P and T are often called strings of characters.
 
We say that pattern P occurs with shift s in the text T if 0<=s<=n and T[s+1..s+m] = P[1..m](that is if T[s+j]=P[j],for 1<=j<=m).
 
If P occurs with shift s in T,then we call s a valid shift;otherwise,we call s a invalid shift.
Your task is to calculate the number of vald shifts for the given text T and pattern P.
 
Input
In the input file,there are two strings T and P on a line,separated by a single space.You may assume both the length of T and P will not exceed 10^6.
 
Output
You should output a number on a separate line,which indicates the number of valid shifts for the given text T and pattern P.
 
Example
matching.in       Standard Output
aaaaaa a            6
abababab abab   3
abcdabc abdc     0
 
Problem D.Exponential Form
Input:            form.in
Output:         Standard Output
Time limit:      5 second
Memory limit:  64 megabytes
Offerd by :   http://spaces.msn.com/davidblogs/
 
Every positive number can be presented by the exponential form.For example,
137 = 2^7 + 2^3 + 2^0
Let's present a^b by the form a(b).Then 137 is presented by 2(7)+2(3)+2(0).
Since 7 = 2^2 + 2 + 2^0 and 3 = 2 + 2^0 , 137 is finally presented by 2(2(2)+2+2(0))+2(2+2(0))+2(0).
 
Given a positive number n,your task is to present n with the exponential form which only contains the digits 0 and 2.
 
Input
The input file contains a positive integer n (n<=20000).
 
Output
You should output the exponential form of n an a single line.Note that,there should not be any additional white spaces in the line.
 
Example
form.in
137
Stardard Output
2(2(2)+2+2(0))+2(2+2(0))+2(0)
form.in
1315
Stardard Output
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
posted @ 2006-03-31 19:16 c++ 学习 阅读(888) | 评论 (0)编辑 收藏
 
我是看了msdn后,感觉还是很简单的,只要知道三个东西
va_arg, va_start, va_end
va_arg:
typeva_arg(
   va_listarg_ptr,
   type
);

va_arg returns the current argument; va_start and va_end do not return values

The va_arg, va_end, and va_start macros provide a portable way to access the arguments to a function when the function takes a variable number of arguments. Two versions of the macros are available: The macros defined in STDARG.H conform to the ANSI C standard, and the macros defined in VARARGS.H are compatible with the UNIX System V definition. The macros are:

The ANSI C standard macros, defined in STDARG.H, are used as follows:

  • All required arguments to the function are declared as parameters in the usual way. va_dcl is not used with the STDARG.H macros.
  • va_start sets arg_ptr to the first optional argument in the list of arguments passed to the function. The argument arg_ptr must have va_list type. The argument prev_param is the name of the required parameter immediately preceding the first optional argument in the argument list. If prev_param is declared with the register storage class, the macro's behavior is undefined. va_start must be used before va_arg is used for the first time.
  • va_arg retrieves a value of type from the location given by arg_ptr and increments arg_ptr to point to the next argument in the list, using the size of type to determine where the next argument starts. va_arg can be used any number of times within the function to retrieve arguments from the list.

The example:

// crt_va.c
/* The program below illustrates passing a variable
 * number of arguments using the following macros:
 *      va_start            va_arg              va_end
 *      va_list             va_dcl (UNIX only)
 
*/


#include 
<stdio.h>
#define ANSI            /* Comment out for UNIX version     */
#ifdef ANSI             
/* ANSI compatible version          */
#include 
<stdarg.h>
int average( int first,  );
#else                   /* UNIX compatible version          */
#include 
<varargs.h>
int average( va_list );
#endif

int main( void )
{
   
/* Call with 3 integers (-1 is used as terminator). */
   printf( 
"Average is: %d\n", average( 234-1 ) );

   
/* Call with 4 integers. */
   printf( 
"Average is: %d\n", average( 57911-1 ) );

   
/* Call with just -1 terminator. */
   printf( 
"Average is: %d\n", average( -1 ) );
}


/* Returns the average of a variable list of integers. */
#ifdef ANSI             
/* ANSI compatible version    */
int average( int first,  )
{
   
int count = 0, sum = 0, i = first;
   va_list marker;

   va_start( marker, first );     
/* Initialize variable arguments. */
   
while( i != -1 )
   
{
      sum 
+= i;
      count
++;
      i 
= va_arg( marker, int);
   }

   va_end( marker );              
/* Reset variable arguments.      */
   
return( sum ? (sum / count) : 0 );
}

#else       /* UNIX compatible version must use old-style definition.  */
int average( va_alist )
va_dcl
{
   
int i, count, sum;
   va_list marker;

   va_start( marker );            
/* Initialize variable arguments. */
   
for( sum = count = 0; (i = va_arg( marker, int)) != -1; count++ )
      sum 
+= i;
   va_end( marker );              
/* Reset variable arguments.      */
   
return( sum ? (sum / count) : 0 );
}

#endif


最主要的是average 函数
开始时申明一个va_list marker
后来调用va_start(marker);
再后来调用va_arg(marker, int)
最后结束时调用va_end(marker):

posted @ 2006-03-21 12:39 c++ 学习 阅读(717) | 评论 (0)编辑 收藏
 

 

给出一个前序遍历,给出一个中序遍历,要求把树输出
给出算法答案如下:
main()
{
Datatype preorder[n], inorder[n];
Struct link
* BT;
if (n  >   0 )
BT 
=  creatBT( 0 , n - 1 0 , n  -   1 );
return (BT);
}


struct  link *  createBT( int  prestart,  int  preend,  int  instart,  int  inend)
{
=  ( struct  link * )malloc( sizeof ( struct  link);
p
-> lchild  =   null ;
p
-> rchild  =   null ;
p
-> data  =  preorder[prestart];
if (prestart  >  preend)

  
for ( int  i  =  instart; inorder[i]  !=  preorder[start]; i ++ );
 
if (i  >  instart)
   p
-> lchild  =  createBT(prestart  +   1 , prestart -  instart  +   1 , instart, i  -   1 );
 
if (i  <  inend)
  p
-> rchild  =  createBT(prestart  -  instart  +  i  +   1 , preend, i  +   1 , inend);        
}
  
 
return  (p):
}

posted @ 2006-03-21 10:55 c++ 学习 阅读(658) | 评论 (0)编辑 收藏
仅列出标题
共3页: 1 2 3