卢正刚与王朝华:哪位高手帮忙?关于一个C程序的设计

来源:百度文库 编辑:中科新闻网 时间:2024/05/06 02:33:37
最近老师布置了一道数据结构的课程设计题目,没有思路,望哪位高手指点一二。
题目要求,通过一个双向循环链表来实现一个任意位数的运算器(+,-,*,没有/),一个节点存放一位数,通过读取文件获得数据源(同样一个文件放一位数)。
急啊!谁能帮帮我?
运算器
问题描述:加减乘运算器。
要 求:使用给定文件进行输入输出,必须采用双向链表实现任意位数的正负整数或小数的加法、减法和乘法运算。每个结点存储一位数字。算出的结果若是小数,整数部分的高位若为0要去掉,小数部分的低位若为0要去掉,若0085.56700,最后结果应为85.567。
文件说明:给定的文件a*.txt为第一个数,b*.txt为第二个数,要求加法产生的结果存储在add*.txt中,减法产生的结果存储在sub*.txt中,乘法产生的结果存储在mul*.txt中,*为对应的一组数据,
下面第2个朋友提供的程序未能实现负数和小数,哪位高手再来帮忙把它完善一下.谢谢了.

首先定义结构体数组建立链表,然后FOR循环读取数据源的同时赋值,再开始计算,计算应该不难吧,先*后- +,可以先侦察符号,然后按运算先后顺序逐渐消除符号,运算所得的结果往下一个位置存储,同时改变指针值。
我的建议:可以将一个数以及它后面的符号存放到同一个接点,最后一个数无符号表示算式结束,再FOR循环首先侦察*,将该数马上乘以下一个数放在一起...再做- +
比如————
数据源:1+2*3+4*5*7-8+9
存储:[1+][2*][3+][4*][5*] [7-] [8+] [9 ]
——>:[1+] [6+] [20*][7-] [8+] [9 ]
——>:[1+] [6+] [140-][8+] [9 ]
——>:[1+] [6+] [132+][9 ]
——>: [148 ]
输出:148

12.14---说明:
本程序只实现了+运算,其-和*运算可按同理进行.
(本程序经过测试,运行完全正确)不过,还没有实现负数进行的加法!调试了2个小时,累了,改天再写,睡觉~~@_@~~
需要手工在程序目录下建立2个文件,如1.txt和2.txt,然后分别在这文件里写入一些数字如12213123,等等,输出文件为结果文件.运行结果可以查看该目录下的结果文件.

===========
12.15---
今天继续写减法函数.
减法比加法更加复杂了,(乘法会更比减法复杂,除法就根本没的写了,不知道有多复杂,)已经写成功了,等代码优化后再传上来
===========
****不得不说,这个问题确实是个好程序,值得一编写,哎,大概又费了几亿个脑细胞了 -_-|||
#include<stdio.h>
#include<iostream.h>

//---------------------------------------------------------------------------

#pragma argsused
struct number
{
struct bit
{
int data;
bit *next;
bit *prev;
};
bit *head;
void init();
void read2file(char *filename);//从一个文件读一个数。
void write2file(char *filename);//写入结果到一个文件
void myAdd(number *x1,number *x2);
void mySub(number *x1,number *x2);
void myMul(number *x1,number *x2);
};
int main(int argc, char* argv[])
{
char f1[20];
char f2[20];
char f3[20];
cout<<"2个数的加法加法"<<endl;
cout<<endl;
cout<<"请输入存储第一个数的文件名:";
cin>>f1;
number *n1=new number;
n1->init();
n1->read2file(f1);

cout<<"请输入存储第二个数的文件名:";
cin>>f2;
number *n2=new number;
n2->init();
n2->read2file(f2);

cout<<"请输入存储结果的文件名:";
cin>>f3;
number *n3=new number;
n3->init();
n3->myAdd(n1,n2);
n3->write2file(f3);

return 0;
}
//---------------------------------------------------------------------------
void number::init()
{
head=NULL;
// head->next =NULL;
// head->prev =NULL;
}
void number::read2file(char *filename)
{
FILE *f;
if ((f = fopen(filename, "rt")) == NULL)
{
fprintf(stderr, "Cannot open input file.\n");

exit(0);
}

char c;

while(!feof(f)) //压堆栈操作
{
c=fgetc(f);
if(c<'0'||c>'9')
break;
bit *temp=new bit;
temp->data =(int)c-48;
temp->next =head;
head=temp;
if(temp->next)
temp->next->prev =head;
}
fclose(f);
}

void number::write2file(char *filename)
{
FILE *f;
if ((f = fopen(filename, "wt")) == NULL)
{
cout<<"Cannot open input file.\n";
exit(0);
}
bit *temp =new bit;
temp=head;
while(1)
{
fputc((char)(temp->data+48),f);
if(temp->next)
temp=temp->next;
else
break;
}
fclose(f);
}
void number::myAdd(number *x1,number *x2)
{
int tmp;
int carry/*进位*/=0;
int orbit/*原位*/=0;
tmp=x1->head->data +x2->head->data;
carry=tmp/10;
orbit=tmp%10;//如果产生如:5+8=13,则carry=1,orbit=3
bit *tx1=new bit;
bit *tx2=new bit;
tx1=x1->head;
tx2=x2->head;
do
{
bit *temp=new bit;
temp->data =orbit;
temp->next =head;
head =temp;
if(temp->next)
temp->next->prev =head;
if(tx1) //如果到达末尾,则不再移动指针
tx1=tx1->next;
if(tx2)
tx2=tx2->next;
if(tx1&&tx2)
{
tmp=tx1->data +tx2->data+carry;
carry=tmp/10;
orbit=tmp%10;
}
else if(tx1!=NULL&&tx2==NULL)
{
tmp=tx1->data+carry;
carry=tmp/10;
orbit=tmp%10;
}
else if(tx1==NULL&&tx2!=NULL)
{
tmp=tx2->data+carry;
carry=tmp/10;
orbit=tmp%10;
}
else if(tx1==NULL&&tx2==NULL)
break;

}while(1);

delete tx1;
delete tx2;

}