计算器的改良
问题描述:
ncl是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托
的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手zl先生。为了很好的完成这个任务,zl先生首先研究了一些
一元一次方程的实例:
4+3x=8
6a-5+1=2-2a
-5+12y=0
zl先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母
及十、一、=这三个数学符号(当然,符号“一”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
问题求解:
编写程序,解输入的一元一次方程,将解方程的结果(精确至小数点后三位)输出至屏幕。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。
样例
输入:
6a-5+1=2-2a
输出:
a=0.750
----------------解决方案--------------------------------------------------------
不困难啊。分别记录变量的系数和和常数项的系数和就可以了嘛。
这个问题就是字符串处理的问题了
----------------解决方案--------------------------------------------------------
不困难啊。分别记录变量的系数和和常数项的系数和就可以了嘛。
这个问题就是字符串处理的问题了
不要想当然,有些事想起来很容易,做起来就不容易了!
----------------解决方案--------------------------------------------------------
本来是打算考完四级再上论坛的,
忍不住又来了,看了这道题,写了下,大体思路跟2楼的差不多,
不过这个程序还不完善,只提供不超过两位数的一次方程。像-5+12y=0这个方程还是解不了的。
写的比较乱,等考完四级再来改吧,
#include "stdio.h"
#include "conio.h"
#include "ctype.h"
typedef struct NODE
{
char ch;
struct NODE *next,*fore;
}node;
int sum[2]={0};
void getequation(node *head,char s[]);
void calculate(node *head);
int chtonum(char ch);
int main()
{
node *head=(node *)malloc(sizeof(node));
char str[100];
gets(str);
head->fore=head->next=NULL;
head->ch='*';
getequation(head,str);
calculate(head);
printf("%g",(float)sum[1]/sum[0]);
getch();
}
void getequation(node *head,char s[])
{
node *p,*q=head;
char fetch;
int i=0;
fetch=s[i++];
while(fetch!='\0')
{
p=(node *)malloc(sizeof(node)); /*这里省去内存申请检验*/
p->ch=fetch;
p->next=NULL;
q->next=p;
p->fore=q;
q=p;
fflush(stdin);
fetch=s[i++];
}
}
void calculate(node *head)
{
node *p=head;
int tag=0;
while(p)
{
p=p->next;
if(p->ch=='=')
tag=1;
if(isalpha(p->ch))
{
if(!tag)
{
if(isdigit(p->fore->ch))
{
switch(p->fore->fore->ch)
{
case '*':
case '+':sum[0]+=chtonum(p->fore->ch);break;
case '-':sum[0]-=chtonum(p->fore->ch);break;
}
}
else
{
if(p->fore->ch=='+'||p->fore->ch=='*') sum[0]++;
if(p->fore->ch=='-') sum[0]--;
}
}
else {
if(isdigit(p->fore->ch))
{
switch(p->fore->fore->ch)
{
case '+':sum[0]-=chtonum(p->fore->ch);break;
case '-':sum[0]+=chtonum(p->fore->ch);break;
}
}
else
{
if(p->fore->ch=='+') sum[0]--;
if(p->fore->ch=='-'||p->fore->ch=='=') sum[0]++;
}
}
}
if(isdigit(p->ch)&&!isalpha(p->next->ch))
{
if(!tag)
{
if(p->fore->ch=='*'||p->fore->ch=='+')
sum[1]-=chtonum(p->ch);
if(p->fore->ch=='-')
sum[1]+=chtonum(p->ch);
}
else
{
if(p->fore->ch=='-')
sum[1]-=chtonum(p->ch);
if(p->fore->ch=='+'||p->fore->ch=='=')
sum[1]+=chtonum(p->ch);
}
}
}
}
int chtonum(char ch)
{
return ch-48;
}
----------------解决方案--------------------------------------------------------
刚开始学,感觉很迷茫.谢谢你们给的回复!努力!努力!
----------------解决方案--------------------------------------------------------
不要想当然,有些事想起来很容易,做起来就不容易了!
我认为在算法上的确没有难度
#include <stdio.h>
#define NMAX 32
/*宏,把缓冲区里面的数字加入x变量*/
#define Add_num(x) x+=getnum(num,numlen)*plus; numlen=0;
double getnum(char *num,int nlen)
{/*把字符串变为相应的数字*/
double ans;
if(!nlen) return 0;
num[nlen]='\0';
sscanf(num,"%lf",&ans);
return ans;
}
void find(char *s)
{/*plus记录当前缓冲区数字符号,a记录变量系数和,b记录常数项系数和*/
/*把式子当作全部移项到左边处理*/
double plus,a,b,ans,fuhao;
char num[NMAX],c;
int numlen;
fuhao=1;plus=1;numlen=0;a=0;b=0;
while(*s){
switch(*s){
case '+':Add_num(b) plus=fuhao ; break;
case '-':Add_num(b) plus=-fuhao; break;
case '=':Add_num(b) fuhao=-fuhao;plus=fuhao;break;
case '.':num[numlen++]=*s; break;
default :
if(*s>='a'&&*s<='z'){
Add_num(a) c=*s;
}
else num[numlen++]=*s;
}
s++;
}
Add_num(b)
ans=-(b/a);
printf("%c=%.3lf\n",c,ans);
}
#define EXPMAX 256
int main()
{
char expr[256];
while(scanf("%s",expr)==1){
find(expr);
}
return 0;
}
----------------解决方案--------------------------------------------------------