哎,累死了.
#include
#include
#include
char num[10][6] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
int parse(char * input)//就3中操作数 要么是+号,要么是=号 要么是要运算的数据【英文标示的】
{
\x09int i = 0; int match = 0;
\x09for (i = 0; i
{
\x09\x09match = strcmp(input, num[i]);//比较用户输入和 num数组中的值 比如 three 是第3个元素, 输入three 刚好能返回3
\x09\x09if (match == 0) return i;
\x09}
\x09return -1;
}//+,=返回-1 数据返回对应的十进制数
struct TStack //栈的结构体定义
{
\x09int data;
\x09struct TStack * next;
};
struct TStack * root = 0; //全局变量,栈的根节点
void stack_push(int data)//元素入栈
{
\x09struct TStack * x = (struct TStack *)malloc(sizeof(struct TStack)); //实例化一个节点
\x09x->data = data; //给节点赋值
\x09x->next = root; //新节点指向根
\x09root = x; //根从新赋值为根 保证跟都指向最后一个元素
}
int stack_pop(int * data) //弹出栈顶元素 并用data返回 ,栈非空返回1 否则返回0
{
\x09struct TStack * x = root; //x=跟节点
\x09if (!x) return 0;//如果栈为空就返回0
\x09root = x->next ; //出栈后 栈顶指针下移
\x09*data = x->data ;//用data返回栈顶元素的值
\x09free(x);//释放栈顶元素的内存空间
\x09return 1;//返回操作成功
}
int SumFromStack(void)//把栈内所有的英文数据换成一个十进制数据.
{
\x09int x = 0, y = 0, z = 0, sum = 0;
\x09int tens[] = {1, 10, 100, 1000, 10000};
\x09do
{
\x09\x09x = stack_pop(&y);// y得到栈顶元素,x为返回状态
\x09\x09if (x == 0) break;//栈中元素为空,就退出
\x09\x09sum += y * tens[z++]; //sum 用来得到一个操作数 例如 three five =35
\x09}while(z
\x09return sum;
}
void print(int C) //给定一个数值 返回对应的英文形式 如: 256-->two five sxi
{
\x09char str[256]=""; size_t i = 0;
\x09sprintf(str, "%d", C);//c的%d形式存到str中 比如 C=258 那么 str[0]='2',str[1]='5',str[2]='8'
\x09for (i = 0; i
printf("%s ", num[str[i] - '0']);//根据字符与‘0’的距离 打印出数字对应的num中的字符串.
\x09printf("\n");
}
int main(void)
{
\x09char str[256] = ""; int A = 0, B = 0, x = 0;//A,B用来记录2个要加的数的十进制 x 用来记录输入的是数据还是+,=号
\x09do
\x09{
\x09\x09A = 0; B = 0; root = 0; x = 0;
\x09\x09for(;;)
\x09\x09{
\x09\x09\x09str[0] = 0;
\x09\x09\x09scanf("%s", str);//获取字符串的输入
\x09\x09\x09x = parse(str);//根据输入的字符串转换成对应进制数
\x09\x09\x09if (x
\x09\x09\x09{
\x09\x09\x09\x09if (str[0] == '+') A = SumFromStack();//遇到+号,那么肯定+左边的数据全入栈,可以用A得到一个翻译成十进制的运算数
\x09\x09\x09\x09if (str[0] == '=')
\x09\x09\x09\x09{
\x09\x09\x09\x09\x09B = SumFromStack();// 遇到=号那么肯定第二个家数也全部入栈了,B得到一个翻译成10进制的元算数据
\x09\x09\x09\x09\x09break;
\x09\x09\x09\x09}
\x09\x09\x09}
\x09\x09\x09else //否则是运算数据那么就入栈
\x09\x09\x09{
\x09\x09\x09\x09stack_push(x);
\x09\x09\x09}
\x09\x09}
\x09\x09if (A || B) print(A + B);//如果A,B不同时为0,那么用print函数打印A+B对应的 特殊编码字符 如234->tow three four
\x09}while(A || B);//一旦A,B同时为0 就退出
\x09system("pause");
\x09return 0;
}
流程图中写出了详细的函数调用和程序思路.
楼主如果不给出程序的话,我自己动手写还方便点.人家的代码看着蛋疼.好在他的思路还是清晰好理解的. 流程图附下,楼主赶紧去准备课程设计吧.
【楼主好好珍惜啊,注释也是一句一句写的,流程图一个一个在visio里面话的,看着你是真的想学东西,所以我弄的很详细.不是为了你的分数来的,而是我对程序的 兴趣】