跳至正文

计算器的改良 解题报告

  • OI路程

这个题目确实简单(我还是犯了一些比较低级的错误,提交了几次才AC),本来是想用一个链表来保存的,后来发现不需要专门去实现,因为毕竟题目里只有两种情况,即未知数的幂为0或1,用一个数组就可以了,int a[2][2]; 其中a[0]是保存左边的式子,a[1]保存右边的式子,a[x][0] 用来保存式子中的常数之和,a[x][1]保存未知数的系数之和。
比如:5a+1-3+5=-2a-3+4+a,那么a[0][0] = 1 – 3 + 5,(左边式子常数和)a[0][1] = 5,a[1][0] = -3 + 4,a[1][1] = -2 + 1。代码如下:

C语言:

#include <stdio.h>
#include <ctype.h>
struct link{
 int value;
 int count;
};
int a[2][2];
int x;

int chin(void)
{
 int ch;
 do{
 ch = getchar();
 }while(ch == \' \');
 return ch;
}

void getnum(struct link *to)
{
 int ch, k = 1;
 to->value = to->count = 0;
 ch = chin();
 if(ch == \'\\n\' || ch == \'=\'){
 to->count = -1;
 return ;
 }
 switch(ch){
 case \'-\':
 k = -1;
 ch = chin(); //掉了这行 
 break;
 case \'+\': //没考虑这种情况 
 ch = chin();
 break;
 }
 do{
 if(isalpha(ch)){
 x = ch;
 to->count = 1;
 }else{
 to->value *= 10;
 to->value += ch - \'0\';
 }
 ch = chin();
 }while(ch != \'+\' && ch != \'-\' && ch != \'=\' && ch != \'\\n\');
 ungetc(ch, stdin);
 if(to->value == 0){
 to->value = 1;
 }
 to->value *= k;
}

int main(void)
{
 int i = 0; //忘记初始化了 
 struct link t;
 do{
 getnum(&t);
 if(t.count < 0){
 i++;
 }
 switch(t.count){
 case 0:
 a[i][0] += t.value;
 break;
 case 1:
 a[i][1] += t.value;
 break;
 }
 }while(i != 2);
 a[1][0] -= a[0][0];
 a[0][1] -= a[1][1];

 printf(%c=%.3f\\n, x, (float)a[1][0] / a[0][1]); // 顺序写反了 

 return 0;
}

其实这个代码完全有改进的余地,甚至可能还有错误(刚刚写这篇报告的时候就发现了一个错误计算器的改良

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注