博文

四则运算表达式求值(2006-05-05 21:09:00)

摘要:int Calc(int a, int b, char oprt)
{
 switch(oprt)
 {
 case '+':
  return a+b;
 case '-':
  return a-b;
 case '*':
  return a*b;
 case '/':
  return a/b;
 }
} int expr(char a[])
{
 char  ch, last_oprt;
 int   c, d;
 CStack<int>  oprd;
 CStack<char> oprt;  while(ch=*a++)
 {
  if(ch == '(')
  {
   oprt.Push(ch);
  }
  else if(ch == ')')
  {
   while(oprt.IsEmpty() == false)
   {
    last_oprt = oprt.Pop();
    if(last_oprt == '(') // 遇到匹配的左括号退出
     break;
    d = oprd.Pop();
    c = oprd.Pop();
    oprd.Push(Calc(c, d,......

阅读全文(3553) | 评论:1

求字符串长度的函数(2006-05-05 21:07:00)

摘要:/* Return the length of the null-terminated string STR.  Scan for
the null terminator quickly by testing four bytes at a time.  */
size_t StrLen (const char *str)
{
 const char *char_ptr;
 const unsigned long int *longword_ptr;
 unsigned long int longword, magic_bits, himagic, lomagic;
 
 /* Handle the first few characters by reading one character at a time.
 Do this until CHAR_PTR is aligned on a longword boundary.  */
 for (char_ptr = str; ((unsigned long int) char_ptr
  & (sizeof (longword) - 1)) != 0; ++char_ptr)
  if (*char_ptr == '\0')
   return char_ptr - str;
  
   /* All these elucidatory comments refer to 4-byte longwords,
  but the theory applies equally well to 8-byte longwords.  */
  
  longword_ptr = (unsigned long int *) char_ptr;
  
  /* Bits 31......

阅读全文(6136) | 评论:0

求一个浮点数的倒数的近似值(2006-05-05 21:02:00)

摘要:// 奇怪的方法,希望有人可以解释一下  float InvFloat(float p)
{                    
    long _i = 2 * 0x3F800000 - (*(int *)&(p));
    float r  = *(float *)&_i;
    r = r * (2.0f - (p) * r);  return r;
}
......

阅读全文(3394) | 评论:0

求一个浮点数的平方根的倒数的近似值(2006-05-05 21:01:00)

摘要:// 很奇怪的程序,不知道有没有人可以解释一下 float InvSqrt (float x)
{
    float xhalf = 0.5f*x;
    int i = *(int*)&x;
    i = 0x5f3759df - (i >> 1);
    x = *(float*)&i;
    x = x*(1.5f - xhalf*x*x);
    return x;
}
......

阅读全文(3179) | 评论:0

堆和栈的区别  (2006-05-05 20:48:00)

摘要:堆和栈的区别
(http://zhidao.baidu.com/question/6415859.html) 一般认为在c中分为这几个存储区
1栈 - 有编译器自动分配释放
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静
态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
- 程序结束释放
4另外还有一个专门放常量的地方。 - 程序结束释放
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分
配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪
里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,
不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,
函数中的"adgfdf"这样的字符串存放在常量区。
比如:
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc";栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"12345
6"优化成一块。
}
还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。
栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和
递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有
的栈空间。栈是由编译器自动管理的......

阅读全文(6217) | 评论:0

模拟烟花爆炸较果(2006-04-18 11:04:00)

摘要:http://www.programfan.com/club/showbbs.asp?id=157474......

阅读全文(3019) | 评论:0

开关问题(2006-02-16 21:07:00)

摘要:题目: 有十个开关等间距排成一线,每个开关对应其上方的一盏灯(十盏灯也排成一线)。每按动一下开关,可以使对应的灯改变状态(原来亮着的将熄灭,原来熄灭的将被点亮)。
但是,由于开关之间的距离很小,每次按动开关时,相邻的一个开关也将被按动。例如:按动第5个开关,则实际上第4、5、6个开关都被按动。而按动靠边的第1个开关时,第1、2个开关都被按动。并且,无法只按动最靠边的一个开关。
现在给出十盏灯的初始的状态和目标状态,要求计算:从初始状态改变到目标状态所需要的最少操作次数。
函数接口:
int MinChange(const int Start[],const int End[]);
其中:Start表示了初始状态,End表示了目标状态。表示状态的数组(Start和End)中,若某元素为0表示对应的灯亮着,否则表示对应的灯没有亮。调用函数时保证Start和End数组长度均为10,并保证有解。
【解答1】http://www.programfan.com/club/showbbs.asp?id=140389 #include<cstdio>

int fnd(int *p,int &n)
{
    do{
       if(p[n]) return 1;                    
      }while(++n < 10);
     return 0;  
}
void presskey(int *q,int &t)
{
     t = t%10;
     if(t =......

阅读全文(3508) | 评论:1

筛选素数(2005-12-09 18:26:00)

摘要:本程序改编自intfree写的pascal程序。 #include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h> __int64 maxn = 1000000000L;
const long maxlen = 100000;
long m = 5;
const long dots = 80;
BYTE  *mask;
long  primes[maxlen+2], mprimes[maxlen+2], ans[maxlen+2];
long  bits[256];
long  len, r;  
void solve(long a, long b, long c, long &x, long &y)
{
 if(a == 0)
 {
  x = 0;
  y = c/b;
 }
 else
 {
  solve(b%a, a, c, y, x);
  x -= b/a*y;
 }
} // primes数组从下标1开始存放素数,例如primes[1]为2
void init()
{
 long   p, k;
 
 k = 2;
 len = 0;
 
 // 求待求范围的平凡根范围内的素数
 do
 {
  ++len;
  primes[len] = k;
  
  do
  {
   ++k......

阅读全文(6719) | 评论:6

破解求pi的怪异程序(2005-12-09 11:38:00)

摘要:
Cong Wang
25th November,2005


Institute of Post and Telecommunication, Xi'an, PRC China
Network Engineering Dep.


引言
  网上流传着一个怪异的求pi程序,虽然只有三行却能求出pi值连小数点前共800位。这个程序如下:

/*某年Obfuscated C Contest佳作选录:*/
#include < stdio.h>
long a=10000, b, c=2800, d, e, f[2801], g;
main(){
for(;b-c;)f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);
}

/* (本程式可算出pi值连小数点前共800位)
(本程式录自sci.math FAQ,原作者未详)*/

咋一看,这程序还挺吓人的。别慌,下面就告诉你它是如何做到的,并且告诉你写怪异C程序的一些技巧。^_^

展开化简
  我们知道,在C语言中,for循环和while循环可以互相代替。

  for(statement1;statement2;statement3){
    statements;
  }

上面的for语句可以用下面的while语句来代替:

  statement1;
  while(statement2){
    statements;
    statement3;
  }

而且要写怪异的C程序,逗号运算符无疑是一个好的助手,它的作用是:
从左到右依次计算各个表达式的值,并且返回最右边表达式的值。
把它嵌入for循环中是写怪异代码的常用技巧之一。所以,......

阅读全文(3213) | 评论:1

完美的C++:C++/CLI(2005-11-23 14:39:00)

摘要:转自:http://community.csdn.net/Expert/topic/4412/4412531.xml?temp=.6810572 《完美的C++:C++/CLI》 什么是C++/CLI呢?C++当然指的是Bjarne Stroustrup在BELL实验室发明的C++语言,它实现了运行时取得速度和尺寸最佳化的静态对象模型,然而它除了堆分配外不支持程序的动态修改,它准许无限地接近底层设备,但在程序运行过程中几乎无法操作活动类型,也无法操作与程序相关联的底层结构。Herb Sutter,C++/CLI的主要构造者之一,称C++是一门“混凝土”式的语言。   CLI指的是通用语言结构,一种支持动态组件编程模型的多重结构,在许多情况下,这代表了一个与C++对象模型完全颠倒了的模式。一个时实的软件层,有效地执行系统,在底层操作系统与程序之间运行。操作底层的设备受到一定的限制,操作执行程序中的活动类型及与程序相关联的下部结构得到了支持。反斜杠(/)代表C++和CLI的捆绑,这个捆绑带来的细节问题是本文主要讨论的问题。   所以,“什么是C++/CLI”问题的最初、最接近答案是:它是静态C++对象模型到CLI的动态组件对象编程模型的捆绑。简而言之,它就是你如何用C++在.NET中编程,而不是C#或Visual Basic.NET。象C#和CLI本身一样,C++/CLI正在ECMA(欧洲计算机制造商协会)主持下进行标准化,以最终符合ISO标准。   实时通用语言(CLR)是CLI的微软版本,它非常适用于微软的Windows操作系统,相似地,Visual C++2005是C++/CLI的实现。   作为第二个近似的答案,我认为C++/CLI是.NET编程模式与C++的结合,正如以前将模板与C++结合起来产生的泛型编程。所有这种结合中,企业所拥有的C++的投资以及开发人员使用C++的经验将得到保存,而这恰恰是使用C++/CLI进行开发的重要基础。   阅读导航   学习C++/CLI的方法
  在设计C++/CLI语言中涉及三个方面问题,这同样贯彻于所有的其他程序开发语言:一是语言级的语法向底层通用类型系统(简称CTS)的映射;二是向程序开发人员提供的CLI的底层细节结构的级别选择;三是超越CLI的直接支持,提供额外的功能性函数的选择。   从......

阅读全文(2558) | 评论:0