c语言-求助这个程序到底哪里的问题?

问题描述

求助这个程序到底哪里的问题?

#include
#include
#define thestacksize 100
#define stackincrement 10
#define overflow -1
#define ok 1
#define error 0
typedef struct{
char top;
char *base;
int stacksize;
}sqstack;
int initstack(sqstack s){
s.base=(char
)malloc(thestacksize*sizeof(char));
if(!s.base)exit(overflow);
s.top=s.base;
s.stacksize=thestacksize;
return ok;
}
int gettop(sqstack s){
char e;
if(s.top==s.base)return error;
e=*(s.top-1);
return ok;
}
int push(sqstack s,char e){
if(s.top-s.base>=s.stacksize){
s.base=(char*)realloc(s.base,(s.stacksize+stackincrement)*sizeof(char));
if(!s.base)exit(overflow);
s.top=s.base+s.stacksize;
s.stacksize+=stackincrement;
}
s.top++=e;
return ok;
}
int pop(sqstack s,char e){
if(s.top==s.base)return error;
e=
--s.top;
return ok;
}
char precede(char p1,char p2){
char p[7][7] = {{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'<', '<', '<', '<', '<', '=', ' '},
{'>', '>', '>', '>', ' ', '>', '>'},
{'<', '<', '<', '<', '<', ' ', '='}};
int r,l;
switch(p1){
case'+':
r=1;
break;
case'-':
r=2;
break;
case'*':
r=3;
break;
case'/':
r=4;
break;
case'(':
r=5;
break;
case')':
r=6;
break;
case'#':
r=7;
break;
default:
break;
}
switch(p2){
case'+':
l=1;
break;
case'-':
l=2;
break;
case'*':
l=3;
break;
case'/':
l=4;
break;
case'(':
l=5;
break;
case')':
l=6;
break;
case'#':
l=7;
break;
default:
break;
}
return (p[r][l]);
}
int ifoptr(char c){
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')return ok;
else return error;
}
int operate(int a,char p,int b){
if(p=='+')return(a+b);
else if(p=='-')return(a-b);
else if(p=='*')return(a*b);
else return(a/b);
}
int evaluateexpression(){
char p,c;
int a,b;
sqstack optr;
sqstack opnd;
initstack(optr);
initstack(opnd);
push(optr,'#');
c=getchar();
while(c!='#'||gettop(optr)!='#'){
if(!ifoptr(c)){push(opnd,c);c=getchar();}
else
switch(precede(gettop(optr),c)){
case'<':
push(optr,c);
c=getchar();
break;
case'=':
pop(optr,p);c=getchar();
break;
case'>':
pop(optr,p);
pop(opnd,a);
pop(opnd,b);
push(opnd,operate(a,p,b));
break;
default:
break;
}
}
return gettop(opnd);
}
int main() {
char e;
printf("input an expression (end with '#'):n");
e=evaluateexpression();
printf("result:n");
printf("%dn",e);
}

表达式求值的程序,编译可以通过,运行后就项目停止运行了,看了很久到底哪里除了问题??求教,谢谢各位了~

解决方案

直接设置断点,编译器单步跟踪,调试一下。刚好可以提高自己分析能力

解决方案二:

代码都不能编译

while (c != '#' || gettop(optr) != '#')

gettop只有一个参数

status gettop(sqstack s, char e)
这里函数定义明明有两个

解决方案三:

程序错误太多了,比如
int initstack(sqstack s)
这里你调试下就会发现,根本没法初始化,得修改成
int initstack(sqstack& s)
修改了以后
int r, l;
以及下面的switch
根本没有给r赋值,结果数组又越界了。

别的不看了。

就想说一点常识性的问题。
程序必须保持随时可调试可运行的状态,写一块就要看这一块对不对,这样才能每次排错只要检查新写的代码就行了,大部分问题就在这个范围内。
而不是闷头写了一大篇,才想到要调试。这种程序几乎没法调试。
另一个作为常识的是,变量一定要在定义的时候初始化,你根本没有这个习惯。
还有代码要写得简单易读,而不是炫技
*s.top++=e; 这种代码不是自己折磨自己么?
另外,要学习调试程序,调试程序比写程序更重要,如果你不会调试程序,就不要往下学新的编程的知识,先学怎么调试。
初学者一定要把习惯养好。

解决方案四:

如楼上所言,感觉重要的不是这个程序的错误在哪,而是怎么找出程序的错误。编译器单步跟踪,或者二分法加打印语句~定位错误位置~

解决方案五:

有邮箱吗,我给你发一个求表达式值的源程序,学习数据结构的时候写的。

解决方案六:

一步一步调试,这样提高能力。

时间: 2024-08-03 18:51:44

c语言-求助这个程序到底哪里的问题?的相关文章

c语言-请问这个程序到底出了什么问题???

问题描述 请问这个程序到底出了什么问题??? /*The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 600851475143 ?求最大质因数*/ #include int ifprime(int x){//判断是否是质因数 int i; if(x<=1) return 0; else if(x==2) return 1; else{ for(i=2;i<=

c语言-C语言求助!!!写了一个返回结构体指针的函数,编译时总是提醒没有初始化q,但是初始化了。

问题描述 C语言求助!!!写了一个返回结构体指针的函数,编译时总是提醒没有初始化q,但是初始化了. 下面是源码下载:http://pan.baidu.com/s/1dDhplwH 程序是用C语言写的,VS2013编译. 这是其中使用结构体的定义 这是哈夫曼函数的定义 解决方案 创建的时候可以 -- ,*q = NULL; malloc 之后 memset(q, 0 , sizeof(--)): 解决方案二: 创建的时候可以 -- ,*q = NULL; malloc 之后 memset(q, 0

编程c语言 c语言-求助C语言编程............

问题描述 求助C语言编程............ 编写程序,实现从键盘输入一行字符串,将该字符串中所有的apple换成orange.如:I have an apple.Do you like apple? 变为I have an orange.Do you like orange? 解决方案 给我时间写,我想一想,写好了再上传给你看 解决方案二: 百度上,Google上,字符串替换的源码很多.. 解决方案三: 自己写一个字符串处理函数呗 很简单的 遍历这个字符串 和要替换的单词比对 如果一样 就

c语言-C语言求助,统计出一个字符串中的单词数

问题描述 C语言求助,统计出一个字符串中的单词数 /*7.编写一个函数,统计出一个字符串中的单词数, 将每个单词存起来,并且返回最长单词. 函数原型定义如下:char * word ( char * str ) ;*/ #include #include char *word(char *str) { int i=0,maxi,j=0,k=0,flag=0; int s,t; char *p[100]; while(str[j]!='') { if(str[j]==' ') { str[j]='

各位大神,请问vs性能调试工具是仅仅能对c#语言编写的程序调试吗?

问题描述 各位大神,请问vs性能调试工具是仅仅能对c#语言编写的程序调试吗? 最近写了一个c++程序,但耗内存特别大,所以想做一下性能分析,看看到底是那个 地方占了内存,刚好vs有一个性能分析工具,请问vs的性能分析工具是不是可以分析 所有语言程序写的代码? 解决方案 我试过,可以对c++ 进行性能调试的,应该是可以的

设计-学生在线答疑排队模拟C语言版的程序代码有木有呢?

问题描述 学生在线答疑排队模拟C语言版的程序代码有木有呢? 程序设计思路: 1.主函数main( ),打印输出主控程序菜单选项,并接收用户的选择项 2.定义学生信息(学号.姓名)的数据存储结构 3.设计学生在线答疑排队模拟程序的功能函数EnQueue( ),处理新学生加入排队的情况 4.设计学生在线答疑排队模拟程序的功能函数AnsQ( ),处理队列中第一个学生出队列答疑的情况 5.设计功能函数PrintQ( ),输出队列中所有正在排队的学生信息. 6.当用户退出答疑程序时,检查队列是否为空.如仍

c语言-C语言的一个程序,求大神

问题描述 C语言的一个程序,求大神 三.实验内容 1.实验题目:手动输入10个0~100之内的整数,按从小到大排列输出.: (1)要求 排序算法: 使数组从小到大排序的规则如下: ⑴ 设数组为a[0],a[1],-,a[n-1],构造i循环从0,1,-,n-2变化,构造j循环从i+1,i+2,-,n-1变化,即j>i. ⑵ 对于任何一个a[i],如果a[i]>a[j],表面前面有一个元素a[i]比它后面的元素a[j]大,a[i]应该在后面,a[j]应该在前面,交换a[i]与a[j]. ⑶ 对于

c语言-C语言怎样编写程序运行完后,不自动结束,而是返回程序的开始的主菜单?

问题描述 C语言怎样编写程序运行完后,不自动结束,而是返回程序的开始的主菜单? 我的程序运行完一个功能后按任意键就退出了,而不是返回主菜单 代码如下,应该怎么改?(具体一点,菜鸟一个)多谢! #include #include #include #include #include #define LENTEL sizeof(tel) #define ID struct tel struct tel { char name[15]; char tele[11]; char style[15]; c

用BASIC语言写智能手机程序

前言 时下,智能手机越来越贴近我们的生活,越来越多的教师朋友,学生朋友都会用智能手 机,因为她们功能齐全,在手机上运行的软件应有尽有,QQ.在线游戏,音乐影视--.. 对于大学生朋友,广大教师朋友,能够在自己的手机有一个动态的课程表程序,一来可以合理安 排空余时间,二来又不会误了学习工作的时间,是一件非常不错的事.本文,以微软公司的移动手机 平台 WindowsMobile2003为基础,简单实现手机上的课表程序. 程序在 WindowsMobile2003 dopod818手机上测试通过.程序