- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
【题04】计算器改良
【题04】计算器的改良
NCL是一家计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:
4+3X=8
6A-5+1=2-2A
-5+12Y=0
ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母、及+、-、=这三个数学符号(当然,符号“-”既可以作减号,也可以作负号)方程中并没有括号、也没有除号,方程中的字母表示未知数。
编写程序,解输入的一元一次方程,将解方程的结果(精确至小数点后三位)输出至屏幕。你可假设对键入的方程的正确性的判断由另一个程序员在作,或者说可认为键入的一个一元一次方程均为合法的,且有唯一实数解。
样例
输入:
6A-5+1=2-2A
输出:
A=0.750
题解
我们将一元一次方程中位于’=’左端的子表达式称为左表达式,位于’=’右端的子表达式称作右表达式,两个子表达式按照合并同类项的要求相减,常数项的计算结果除以系数项的计算结果取负即为变量的值。例如
6A-5+1=2-2A
6A+2A-5+1-2=8A-6=0
1.合并同类项
设当前子表达式串为s,x为目前系数项的计算结果,y为目前常数项的计算结果,变量名为name。我们通过solve(s,c)过程计算name和x、y,其中参数c为子表达式标志:
注意:如果当前子表达式的首字符非’+’或’-’(第1个操作数为正的简写形式),则子表达式前增加一个’+’,因为处理右表达式时,所有操作数要变号。
procedure solve(s,c); {输入子表达式s和标志c,合并系数项和常数项}
begin
if s[1]{ ’+’,’-’} then s←’+’+s;
while s≠’’ do
begin
u←2; {计算下一个运算符的位置}
while (u≤length(s))∧((s[u]{ ’+’,’-’})) do inc(u);
w←copy(s,1,u-1); {取出操作数}
if(w[length(w)]{ ’0’..’9’}) {若操作数为系数项,记下变量名并删去}
then begin
name←w[length(w)];delete(w,length(w),1);
if(w=’ ’)∨(w=’+’) {记下变量的正负号}
then h←1
else if w=’-’
then h←-1
else val(w,h,k); {将系数串转换为整数}
x←x+h*c; {合并系数项}
end{then}
else begin
val(w,h,k); {将常数串转换为整数}
y←y+h*c; {合并常数项}
end;{else}
delete(s,1,u-1); {将已处理过的操作数删去}
end;{while}
end;{solve}
2.计算方程的解
首先从表达式中截出左表达式sl和右表达式sr,然后通过调用solver(sl,1)和solve(sr,-1)得出系数项的值x和常数项的值y,即为方程的解:
输入方程s;
i←1; {删去方程中的无用空格}
while i≤length(s) do
begin
if s[i]= ’ ’
then delete(s,
文档评论(0)