有个C++的计算24的程序,想把他转为C#的命令行程序,可遇到问题
这个程序我是这样想的:我想利用一个指针数组,其中的每个元素都是一个指向函数的指针,这样加减乘除运算我就可以通过循环来改变顺序了,可C#没指针(偶刚学C#不久,不知道这么说对吗?)但我有不想重新改变算法,我想知道C#中有什么能代替函数指针的东西,也就是说我不想改太多代码就想弄出一个计算24的C#命令行程序来.我的程序如下:
#include<iostream.h>
#include<stdlib.h>
int val[4]={0};
float temp[4];
float plus(float a,float b)
{
return (float)(a+b);
}
float minus(float a,float b)
{
return (float)(a-b);
}
float time(float a,float b)
{
return (float)(a*b);
}
float divide(float a,float b)
{
if(b == 0)
return 0.0;
else
return (float)(a/b);
}
void count(float (* symbol[4])(float,float),char signal[4],float data[4],int &flag)
{
int i,j,k;
float temp1,temp2,temp3;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
for(k=0;k<4;k++)
{
if(flag==1)
{
temp1=(* symbol[i])(data[0],data[1]);
temp2=(* symbol[j])(temp1,data[2]);
temp3=(* symbol[k])(temp2,data[3]);
if(temp3 == 24.0)
{
flag=0;
cout<<endl<<"计算方法为: ";
cout<<'['<<'('<<data[0]<<signal[i]<<data[1]<<')'<<signal[j]<<data[2]<<']'<<signal[k]<<data[3]<<"=24"<<endl<<endl;
}
if(flag==1)
{
temp1=(* symbol[i])(data[0],data[1]);
temp2=(* symbol[j])(data[2],data[3]);
temp3=(* symbol[k])(temp1,temp2);
if(temp3 == 24.0)
{
flag=0;
cout<<endl<<"计算方法为: ";
cout<<'('<<data[0]<<signal[i]<<data[1]<<')'<<signal[k]<<'('<<data[2]<<signal[j]<<data[3]<<')'<<"=24"<<endl<<endl;
}
if(flag==1)
{
temp1=(* symbol[i])(data[1],data[2]);
temp2=(* symbol[j])(temp1,data[3]);
temp3=(* symbol[k])(data[0],temp2);
if(temp3 == 24.0)
{
flag=0;
cout<<endl<<"计算方法为: ";
cout<<data[0]<<signal[k]<<'['<<'('<<data[1]<<signal[i]<<data[2]<<')'<<signal[j]<<data[3]<<']'<<"=24"<<endl<<endl;
}
if(flag==1)
{
temp1=(* symbol[i])(data[1],data[2]);
temp2=(* symbol[j])(data[0],temp1);
temp3=(* symbol[k])(temp2,data[3]);
if(temp3 == 24.0)
{
flag=0;
cout<<endl<<"计算方法为: ";
cout<<'['<<data[0]<<signal[j]<<'('<<data[1]<<signal[i]<<data[2]<<')'<<']'<<signal[k]<<data[3]<<"=24"<<endl<<endl;
}
if(flag==1)
{
temp1=(* symbol[i])(data[2],data[3]);
temp2=(* symbol[j])(data[1],temp1);
temp3=(* symbol[k])(data[0],temp2);
if(temp3 == 24.0)
{
flag=0;
cout<<endl<<"计算方法为: ";
cout<<data[0]<<signal[k]<<'['<<data[1]<<signal[j]<<'('<<data[2]<<signal[i]<<data[3]<<')'<<']'<<"=24"<<endl<<endl;
}
}
}
}
}
}
}
}
}
}
void change(float (* symbol[4])(float,float),char signal[4],float data[4],int &flag,int i)
{
for(int j=0;j<4;j++)
{
if(val[j]==0)
{
val[j]=1;
temp[i]=data[j];
if(i==3)
count(symbol,signal,temp,flag);
else
change(symbol,signal,data,flag,i+1);
val[j]=0;
}
}
}
void main()
{
int flag,i;
char signal[4],goon='y',method;
float (* symbol[4])(float,float),data[4];
symbol[0]=plus;
symbol[1]=minus;
symbol[2]=time;
symbol[3]=divide;
signal[0]='+';
signal[1]='-';
signal[2]='*';
signal[3]='/';
while(goon=='y'||goon=='Y')
{
goon='n';
flag=1;
for(i=0;i<4;i++)
{
cout<<"请输入要计算的第"<<i+1<<"个数! (数值范围不要超过±99)"<<endl;
cin>>data[i];
if(data[i]>100 || data[i]<-100)
{
cout<<"输入数字错误!"<<endl;
exit(0);
}
}
cout<<endl<<"输入的四个数在计算时顺序是否可以交换?(Y/N)"<<endl;
cin>>method;
if(method=='n'||method=='N')
count(symbol,signal,data,flag);
else if(method=='y'||method=='Y')
change(symbol,signal,data,flag,0);
else
exit(0);
if(flag == 1)
cout<<endl<<"您输入的4个数字不能通过简单四则运算得到24"<<endl<<endl;
cout<<"是否要重新输入数字?(Y/N)"<<endl;
cin>>goon;
cout<<endl;
}
}
希望大家能帮我改改,如果觉得麻烦,就请告诉我要实现这个功能应该用什么来代替指针?
问题点数:20、回复次数:9Top
1 楼windinwing(潇笑)回复于 2005-02-22 22:10:24 得分 0
用代理就可以,这个转换其实很简单啊 建一个代理数据,替换函数指针Top
2 楼doubon(DB.NET)回复于 2005-02-22 22:38:22 得分 0
顶!Top
3 楼sssa2000()回复于 2005-02-23 02:18:02 得分 0
用 委托, 委托=函数指针,而且委托很安全,虽然慢了一点,呵呵呵Top
4 楼windinwing(潇笑)回复于 2005-02-23 16:33:14 得分 0
笔误,应该是委托,看楼上的Top
5 楼lcrystal623(小水晶)回复于 2005-02-24 12:45:36 得分 0
谢谢各位,我会查询委托的用法的,不过请大家给我举个使用委托的简单的例子.谢了先Top
6 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2005-02-24 12:56:17 得分 10
class A
{
delegate int Method ( int a, int b )
int plus ( int a, int b )
{
return a + b;
}
float minus(float a,float b)
{
return (float)(a-b);
}
Method method = new Method ( plus );
int Compute( int a , int b )
{
return method( a, b )// 等效于 return plus( a, b);
}
}Top
7 楼lcrystal623(小水晶)回复于 2005-02-24 18:26:32 得分 0
那我是不是可以这样?:Method[] method = new Method();
method[1] = plus;
method[2] = minus;Top
8 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2005-02-24 18:32:48 得分 10
Method[] method = new Method[] {new Method( plus ), new Method( minus )};
数组的元素是固定的,忘了?
还有就是委托实例必须用 new 委托名 ( 方法名 );来创建。
但在C# 2.0中,可以用你上面的简写。。。。Top
9 楼lcrystal623(小水晶)回复于 2005-02-24 21:53:50 得分 0
谢谢Top




