一道简单的C语言程序设计题,我们是大一的!刚学!在100行之间!
发布网友
发布时间:2022-07-29 21:34
我来回答
共4个回答
热心网友
时间:2024-11-18 02:27
你们都不是学生吧....这么问的还好啊
你看看这个行不
我们刚学的,一个表达式求值的小程序
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "stdlib.h"
typedef struct symbal //运算符
{
char s;
struct symbal *next;
}Node_sym,*Link_sym;
typedef struct number //操作数
{
float n;
struct number *next;
}Node_num,*Link_num;
//*******************************************************************************
void initsym(Link_sym &L); //初始化符号栈
int pushsym(Link_sym &L,char c); //运算符进栈
int popsym (Link_sym &L,char c); //运算符出栈
int emptysym(Link_sym L); //判栈空
int gettopsym(Link_sym L,char &c); //取栈顶
int prior(char a); //确定运算符的优先级
void initnum(Link_num &L); //初始化操作数栈
int pushnum(Link_num &N,float c); //操作数进栈
int popnum (Link_num &N,float &num); //操作数出栈
int emptynum(Link_num L); //判栈空
int gettopnum(Link_num L,int n); //取栈顶
float calculate(char numb[]);
int disp(Link_num L); //查看符号栈
//*******************************************************************************
void initsym(Link_sym &L)
{
L=new Node_sym;
L->s='#';
L->next=NULL;
}
void initnum(Link_num &N)
{
N=NULL;
}
int pushsym(Link_sym &L,char c)
{
Link_sym p;
if ((p=new Node_sym)==NULL)return 0;
p->s=c;
p->next=L;
L=p;
return 1;
}
int pushnum(Link_num &N,float c)
{
Link_num p;
p=new Node_num;
p->n=c;
p->next=N;
N=p;
return 1;
}
int popsym (Link_sym &N,char c)
{
if (emptysym(N)==0)
{
//printf ("栈空");
return 0;
}
Link_sym p;
p=N->next;
c=N->s;
N=p;
return 1;
}
int popnum (Link_num &N,float &num)
{
if (emptynum(N)==0)
{
// printf ("栈空");
return 0;
}
num=N->n;
N=N->next;
return 1;
}
int emptysym(Link_sym L)
{
if (L==NULL)return 0;
else return 1;
}
int emptynum(Link_num L)
{
if (L==NULL)return 0;
else return 1;
}
int gettopsym(Link_sym L,char &c)
{
if (emptysym(L)==0)
{
// printf ("栈空");
return 0;
}
c=L->s;
return 1;
}
int disp(Link_num L)
{
if (L==NULL)
{
// printf("栈空");
return 0;
}
Link_num p=L;
while (p!=NULL)
{
printf ("%f",p->n);
p=p->next;
}
return 1;
}
void transform(char s[],char numb[]) //转化为后缀表达式
{
int i=0,j=0,n=0;
char temp;
Link_sym L;
initsym(L);
while(s[i]!=0)
{ //printf("\n当前遇到的是:%c\n",s[i]);
if(s[i]>='0'&& s[i]<='9'||s[i]=='.')//是数字 //或者是小数点
{numb[j++]=s[i];
// printf ("进入后缀式\n");
i++;
continue;}
numb[j++]=' '; //*********************每两个数字之间用空格隔开
//是运算符
switch(s[i]){
case '(': pushsym(L,'('); break;
case ')': gettopsym(L,temp);
while( temp!='('){
numb[j++]=temp;
popsym(L,temp);
gettopsym(L,temp);
}
break;
default: while(gettopsym(L,temp)&&prior(temp)>=prior(s[i]))
{
if(temp!='#')numb[j++]=temp;
popsym(L,temp);
}
if(s[i]!='#')pushsym(L,s[i]);
}//else
i++;
// printf("当前的后缀式是:");
// for(n=0;n<j;n++)putchar(numb[n]);
// putchar('\n');
// printf("当前的运算符栈是:");
// disp(L);
// getch();
}
numb[j]='\0';
}
int prior(char a) //返回运算符优先级
{
if(a=='+'||a=='-') return 1;
if(a=='#') return -1;
if(a=='*'||a=='/') return 2;
if(a=='(') return 0;
}
float calculate (char numb[])
{
int flag=0;
float num1,num2,temp;
float sum;
Link_num num;
initnum(num);
int i=0;
while (numb[i]!=0)
{
if (numb[i]>='0'&&numb[i]<='9'||numb[i]=='.')
{
flag=0;
sum=0;
while (numb[i]>='0'&&numb[i]<='9'||numb[i]=='.')
{
if (numb[i]=='.'){flag=1;i++;continue;}
if (flag==0)
{
sum=sum*10+(numb[i]-48);
}
else
{
sum=sum*10+(numb[i]-48);
flag++;
}
i++;
}
while (flag>1)
{
sum=sum/10.0;
flag--;
}
pushnum(num,sum);
}
if (numb[i]=='+'||numb[i]=='-'||numb[i]=='*'||numb[i]=='/')
{
popnum(num,num2);
popnum(num,num1);
char sym=numb[i];
switch(sym)
{
case '+': temp=num1+num2;pushnum(num,temp);break;
case '-': temp=num1-num2;pushnum(num,temp);break;
case '*': temp=num1*num2;pushnum(num,temp);break;
case '/': temp=num1/num2;pushnum(num,temp);break;
}
}
i++;
}
popnum(num,temp);
return temp;
}
main ()
{
float result;
int i,j=0;
char temp;
char c;
char s[100],numb[100];
do
{
system("cls");
int b;
printf("\n\n\n\n\t\t\t\t*表达式计算(链栈)*\n");
printf("\n\t\t\t 1.将表达式转化为后缀表达式计算\n");
printf("\n\t\t\t 2.退出\n");
printf("\n\t\t\t 请选择(1/2):");
while (1)
{
scanf("%d",&b);
if (b>2||b<1)
{
printf ("序号错误,重新输入:");
scanf("%d",&b);
}
if (b==1||b==2)break;
}
if (b==2)return 0;
fflush(stdin);
printf ("请输入表达式:");
gets(s);
i=strlen(s);
s[i]='#';
s[i+1]=0;
transform(s,numb);
result=calculate(numb);
s[i]=0;
system("cls");
for (i=0;i<100;i++)
{
printf ("计算中,请稍后\n%d%",i);
// delay(100);
system("cls");
}
puts(s);
printf ("的计算结果是:%f ^_^",result);
getch();
}while (1);
}
这个原来我写的
不过好长时间了,估计现在让我弄都已经弄不明白了 呵呵o(∩_∩)o...
热心网友
时间:2024-11-18 02:27
下回问问题把你问的问题说清楚!!!! 随便发上来一个程序,你是让人给你改错还是让人给你标注释还是要修改功能啊? 这样既耽误别人时间,也不利于帮助你解答问题!
热心网友
时间:2024-11-18 02:28
不明白你在求什么。。。
热心网友
时间:2024-11-18 02:29
你的代码是个链表的例子
你想要问什么?