#include<stdio.h>
#include<string.h>
void fun(char *a,int left ,int right , int *b ,int *c) // int fun(字符数组 上界 下界 常数 系数)
{
int f; // 符号位
int sum ; //数字位
int i; // 循环变量
f=1;
sum=0;
for (i=left; i<= right ; i++)
{ if(a[i] == '-') f=-1;
if (a[i] =='+') f=1;
if(a[i] >='0' && a[i] <= '9')
{
sum=10*sum + a[i] - '0' ;
}
if(a[i]>='a' && a[i]<='z')
*c=sum;
else *b=sum;
}
}
// 函数 用来在a[left] -- a[right]中 得出a常数,b系数。
int main( int argc, char *argv[])
{
char *a; //字符串
int dy; // 等于号的位置;
int z; // 字符数组总共元素
int b,c; // b为常数 c为系数
int d,e; // d为常数 e为系数
int i; //循环变量
int jie; //方程的解
int zm ; //字母
a=NULL;
dy=0;
scanf("%s",a);
z=strlen(a);
for(i=1;i<=z;i++)
{
if (a[i] == '==' )
{z=i;
break;
}
}
for(i=1;i<=z;i++)
{
if ( a[i] <= 'z' && a[i] >='a')
{
zm=a[i];
break;
}
}
a=0;b=0;
fun(a,1,dy,&b,&c);
fun(a,dy,z,&d,&e);
jie=(d-b)/(e-c);
printf("%c = %d",zm,jie);
getch();
return 0;
}
1、这是我的程序,一读入就出错,找不到错。。另外请问一下对于这种编译能通过 但是运行出错的问题该如何去查找?
2.附上原题, NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:
4+3x=8
6a-5+1=2-2a
-5+12y=0
ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数
关于算法编程题(C语言实现)
答案:3 悬赏:80
解决时间 2021-04-21 12:23
- 提问者网友:话酸浅沫
- 2021-04-21 04:43
最佳答案
- 二级知识专家网友:放肆的依賴
- 2021-04-21 05:07
char *a; //字符串 改为 char a[20];//存放字符串的字符数组
int jie; //方程的解 改为 double jie;
dy = 0; 删去 dy=0;
两处的 for(i=1;i<=z;i++) 都改为 for(i = 0; i < z; i++)
if (a[i] == '==' ) 改为 if (a[i] == '=' )
{z=i; 改为 {dy = i;
a=0;b=0; 删去 a=0;b=0;
fun(a,1,dy,&b,&c); 改为 fun(a, 0, dy - 1, &b, &c);
fun(a,dy,z,&b,&c); 改为 fun(a, dy + 1, z - 1, &b, &c);
jie=(d-b)/(e-c); 改为 jie=((double)(d-b))/(e-c);
printf("%c = %d",zm,jie); 改为 printf("%c = %f",zm,jie);
int jie; //方程的解 改为 double jie;
dy = 0; 删去 dy=0;
两处的 for(i=1;i<=z;i++) 都改为 for(i = 0; i < z; i++)
if (a[i] == '==' ) 改为 if (a[i] == '=' )
{z=i; 改为 {dy = i;
a=0;b=0; 删去 a=0;b=0;
fun(a,1,dy,&b,&c); 改为 fun(a, 0, dy - 1, &b, &c);
fun(a,dy,z,&b,&c); 改为 fun(a, dy + 1, z - 1, &b, &c);
jie=(d-b)/(e-c); 改为 jie=((double)(d-b))/(e-c);
printf("%c = %d",zm,jie); 改为 printf("%c = %f",zm,jie);
全部回答
- 1楼网友:零负荷的放任
- 2021-04-21 07:15
if (a[i] == '==' ) // '==' 应该改为 '='
for(i=1;i<=z;i++)
应该改为:
for(i=0;i<z;i++)
a=0;b=0; // a 是 char 指针,a=0 这样赋值不妥。
另外,方程的解应该是 float 型的。
- 2楼网友:瘾与深巷
- 2021-04-21 06:19
我修改的程序都是把s[0] t[0]转换为strlen(s) strlen(t)函数来实现的
为什么不把strlen(s),strlen(t)分别赋予s[0],t[0],害怕覆盖原来的数据吗?没有必要,他们原本就是来存储这个数据的,君不见,它们都不参与匹配!他们的初始化应该在这个函数之外完成,在每次数组长度改变后,就及时设置,换句话说,在调用这个函数之前,应该保证他们已经设置正确,
在打印时,应该从第二个元素s[1]或t[1]开始,因为s[0],t[0]不再是数组的实际内容
不知道我有没有表述清楚,
一般,数组的第一个元素存放实际的内容,而你这里并不是这样,数组的第一个元素不再是数组的实际内容,而是数组长度
==================================================================
补充;
比较大小时s[0]的值不就变成了整形的ascii码值了么?
1.整数就是整数,没有ascii码,ascii码是针对字符的
2.在c中,整数赋予字符变量是合法的
2.在c中,字符与整数的关系运算也是合法的,当你要把一个字节的数解释成字符的时候,它就是字符,可他存储的还是数啊,就把它当整数用吧,毕竟我们没有打算打印它,当然它能表示的整数太少了,所以数组长度受到限制
如果你要以字符显示它,那它当然是那个整数所对应的字符,如果那是可打印字符的话
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯