博文

桌面计算器(2005-09-28 09:02:00)

摘要:程序是一个计算器,有4个部分组成:1.语法分析器(Parser),2.输入函数(input function),3.符号表(symbol table)4.驱动(driver).我是用的vc编译器,1,2,3用头文件,4用.cpp文件。第一部分Parser分析器,parser.h.作用是分析用户输入的语句的语法。用户可以在控制台输入以下内容:program:    END    expr_list ENDexpr_list:    expression PRINT    expression PRINT expr_listexpression:    expression+term    expression-term    termterm:    term*primary     term/primary    primaryprimary    NUMBER    NAME    NAME  = expression        注释:在vc中这中间好像必须有空格,不然不行,过一会再讨论这个    -primary    (expression)这里说明了语法,也可以说是给用户说明了使用规则,比如:你在控制台内输入 12*3 ;,计算器就会显示36,其中不管是什么符号(这里有12,*,3,;四个)都要从primary开始进行分析(具体实现后面说),分析器分析12是NUMBER然后再取*号,向上到term,12附给了term,进行*发运算,primary又要从输入继续取值,于......

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

有理数(运算符重载集锦)(2005-09-15 11:29:00)

摘要:#if!defined(RATIONAL_H)#define RATIONAL_H #include<iostream>#include<stdlib.h>using namespace std;namespace std{ class Rational{ private:  long num,den;  void Standardize(void);  long gcd(long m,long n)const; public:  Rational(long p=0,long q=1);  Rational(double x);    friend istream&operator>>(istream&istr,Rational&x);  friend ostream&operator<<(ostream&ostr,const Rational&x);   Rational operator+(Rational&x)const;  Rational operator-(Rational&x)const;  Rational operator*(Rational&x)const;        Rational operator/(Rational&x)const;   Rational operator-(void)const;   int operator<(Rational&x)const;        int operator<=(Rational&x)const;        int operator=......

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

挑战统计字符串频率最优算法的终极版(2005-09-14 21:44:00)

摘要:#include<iostream> #include<string> #include <algorithm> #include<stdlib.h> using namespace std; void taxis(string&s){          //选择排序   for(int i=0;i<s.size();i++)   {     int min=i;     for(int j=i+1;j<s.size();j++)      if(s[j]<s[min])       min=j;     int temp=s[i];     s[i]=s[min];     s[min]=temp;   } } void main(){     string str;     cout<<"input the string:";     cin>>str; string s=str;     taxis(str);     int *p;     p=new int[str.size()];     for(int i=0,j=0;j<str.size();++i)     {         p[i]=count(str.begin(),str.end(),str[j]);         j+=p[i];  ......

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

metaprogam用法一例(2005-09-14 18:15:00)

摘要:meta progamming(元编程) 是C++中非常有趣的一个功能 计算 1!+2!+3!+4!+ ...+n!, 如果用metaprogam完成则非常的有趣,代码如下: template<size_t n> struct factorial {     enum{ val = n * factorial<n-1>::val }; }; template<> struct factorial<1> {     enum{ val = 1 }; };   #include <iostream> using namespace std; int main( void ) {     cout << factorial<1>::val           + factorial<2>::val           + factorial<3>::val           + factorial<4>::val           + factorial<5>::val << endl;           return 0; }   它和普通的写法有什么区别呢?区别在于普通的写法其结果是在运行时计算的,而metaprogam写法其结果却是在编译时计算的,不会占用任何运行时间. 上面的代码其实就等同于 int main( viod ) {     cout << 153 <......

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

选择排序+折半查找(2005-09-14 18:05:00)

摘要:#include<iostream>using namespace std;const int size=16;void taxis(int score[],int num){          //选择排序 for(int i=0;i<num-1;i++) {  int min=i;  for(int j=i+1;j<num;j++)   if(score[j]<score[min])    min=j;  int temp=score[i];  score[i]=score[min];  score[min]=temp; }}int Res(int score[],int num,int lookup){          //折半查找 int lo=0,  mid,  hi=num-1,  ans=-1; for(;hi-lo>1;) {  mid=(hi-lo)/2+lo;  if(score[mid]==lookup)   ans=mid;  if(score[mid]>lookup)   hi=mid;  else   lo=mid; } if(ans==-1) {  if(score[hi]==lookup)   ans=hi;  if(score[lo]==lookup)   ans=lo; }  return ans;}v......

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

另类fib数列(2005-09-10 20:50:00)

摘要:#include<iostream> #include<iomanip> using namespace std; int fib(int&a,int&b,int n){     int temp=a;     a=b;b=temp+b;     return b; } int fib(int n){ int a=0; int b=1; for(int i=0;i<n-3;i++) fib(a,b,i); return fib(a,b,i); } void main() {     int a=0,b=1;     cout<<setw(6)<<a<<setw(6)<<b;     for(int i=2;i<20;i++)     {         if(i%5==0)cout<<endl;         cout<<setw(6)<<fib(a,b,i)<<setw(6);     }     cout<<endl;     int n;     cin>>n;     cout<<fib(n); } 利用函数重载,第一个演示打印输出,第2个调用第一个函数演示查找......

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

待改良电话卡(2005-09-10 20:39:00)

摘要:#include<iostream>              #include<string> #include<vector> using namespace std; struct phone_book{     string name;     int number;      }; vector<phone_book>phone_books;      bool accept() {         cout<<"Do you want to proceed(y or n)?\n";         char answer=0;         cin>>answer;         switch(answer){         case'y':return true;         case'n':return false;         default:             cout<<"I'll take that for a no.\n";  &n......

阅读全文(3169) | 评论:2

另类最大公约数,最小公倍数(2005-09-10 20:32:00)

摘要:#include<iostream> using namespace std; void main(){     int a,b,c,d;     cin>>a>>b;     c=(a>b)?a:b;     for(int i=c;i>0;i--)         if((!(a%i))&&(!(b%i)))break;     d=(a*b)/i;     cout<<"最大公约数"<<i<<'\n'<<"最小公倍数"<<d<<endl; } 目前关于此问题的通常解法就是碾转相除+递归。     ......

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

词典排序问题(2005-09-10 20:28:00)

摘要:#include<iostream> #include<string> #include<vector> using namespace std; void main(){     vector<string>p;     for(;;)           //连续输入string对象,直到输入一个字母end     {     string str;     cin>>str;     if(str.size()==1)break;     p.push_back(str);     }     bool state;        //冒泡排序,将string对象按词典顺序排序     for(int i=0;i<p.size();i++){         state=true;         for(int j=p.size()-1;j>i;j--){             if(p[j].substr(0,1)<p[j-1].substr(0,1)){               &......

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