博文
桌面计算器(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又要从输入继续取值,于......
有理数(运算符重载集锦)(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=......
挑战统计字符串频率最优算法的终极版(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];
 ......
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 <......
选择排序+折半查找(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......
另类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个调用第一个函数演示查找......
待改良电话卡(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......
另类最大公约数,最小公倍数(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;
}
目前关于此问题的通常解法就是碾转相除+递归。
......
词典排序问题(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)){
&......
