报告汇总之c语言数据结构报告篇(二)
简单计算器
代码区
#include <stdio.h>
#include <stdlib.h>
char S[100];
char S2[100];
int i=0;
//用来存储计算对数据
typedef struct sqlist
{
char data[100];
int top;
}s1;
//初始化数据栈
void initSqlist (s1*L)
{
L=(s1*)malloc(sizeof(s1));
L->top=-1;
}
//数据栈进栈
void pushs1 (s1*L,char c)
{
L->top++;
L->data[L->top]=c;
}
//数据栈进栈
int pop (s1*L)
{
int i;
i=L->top;
L->top--;
return L->data[i];
}
//创建运算符栈
typedef struct
{
char op[100];
int top;
} c1;
//初始化运算符栈
void initc1 (c1*P)
{
P=(c1*)malloc(sizeof(c1));
P->top=-1;
}
//运算符压栈
void pushc1 (c1*P,char c)
{
P->top++;
P->op[P->top]=c;
}
//运算符出栈
char popc1 (c1*P)
{
int i=P->top;
P->top--;
return P->op[i];
}
//获得需要处理的式子
void get (char s1[100])
{
int i=0;
scanf("%s",s1);
while (s1[i]!=';')
{
printf("%c",s1[i]);
i++;
}
printf("\n");
}
void changeguohao (char S[100],s1*L,c1*P,int i);
//变换中缀为后缀
void change (char S[100],s1*L,c1*P,int i)
{
get(S);
printf("后缀表达式为:");
char a;
while (S[i-1]!=';')
{
int s=-1;
if (S[i]=='(')
{
s=P->top;
}
if (S[i]=='('||S[i]==')')
{
if (S[i]==')')
{
while (P->top!=s)
{
a=popc1(P);
printf("%c",a);
}
}
i++;
}
if (S[i]>=49&&S[i]<=57)
{
pushs1(L,S[i]);
a=pop(L);
printf("%c",a);
}
if (S[i]==';')
while (P->top!=-1) {
a=popc1(P);
printf("%c",a);
}
if (S[i]=='+'||S[i]=='-')
{
if (S[i-2]=='+'||S[i-2]=='-')
{
a=popc1(P);
printf("%c",a);
}
pushc1(P,S[i]);
}
if (S[i]=='*'||S[i]=='/')
{
pushc1(P, S[i]);
if(S[i+1]!='(')
{
i++;
pushs1(L,S[i]);
a=pop(L);
printf("%c",a);
}
while (P->top!=-1&&S[i+1]!='(')
{
a=popc1(P);
printf("%c",a);
}
//i++;
//pushc1(P,S[i]);
}
i++;
}
}
//变换有括号时的中缀表达式
void changeguohao (char S[100],s1*L,c1*P,int i)
{
char a;
if (S[i]==')')
{
while (P->top!=-1)
{
a=popc1(P);
printf("%c",a);
}
i++;
}
change(S, L, P, i);
}
//计算后缀表达式
int clculate (char S[100],s1*L,c1*P,int i)
{
printf("请输入您需要处理的后缀表达式:");
get(S);
i=0;
char a;
char b;
int c=0;
char d = '0';
L->top=-1;
while (S[i]!=';')
{
if (S[i]>=49&&S[i]<=57)
pushs1(L, S[i]);
//数据压栈
else
{
//对运算符进行判断,进行计算
if (S[i]=='+')
{
a=pop(L);
b=pop(L);
c=(a-'0')+(b-'0');
d=c+'0';
pushs1(L, d);
}
if (S[i]=='-')
{
a=pop(L);
b=pop(L);
c=(b-'0')-(a-'0');
d=c+'0';
pushs1(L, d);
}
if (S[i]=='*')
{
a=pop(L);
b=pop(L);
c=(a-'0')*(b-'0');
d=c+'0';
pushs1(L, d);
}
if (S[i]=='/')
{
a=pop(L);
b=pop(L);
c=(b-'0')/(a-'0');
d=c+'0';
pushs1(L, d);
}
}
i++;
}
return c;
}
int main ()
{
s1 *L;
L=(s1*)malloc(sizeof(s1));
//initSqlist(L);
L->top=-1;
c1 *P;
P=(c1*)malloc(sizeof(c1));
//initc1(* &P);
P->top=-1;
while (1)
{
printf("请输入您需要进行的操作:");
printf("0代表转换为后缀表达式;1代表计算后缀表达式结果\n");
int n;
scanf("%d",&n);
getchar();
switch (n)
{
case 0:
{
printf("中缀表达式为:");
change(S, L, P,i);
printf("\n");
break;
}
case 1:
{
printf ("计算的结果为:%d",clculate(S, L, P, i));
printf("\n");
break;
}
default:
break;
}
}
return 0;
}
报告区
一、 实验内容描述(问题域描述)
编写程序,模拟简单运算器的工作:输入一个算式(没有空格),遇等号“=”说明输入结束,输出结果。假设计算器只能计算加减乘除运算,运算数和结果都是整数。要求完成以下功能:
(1) 从键盘录入中缀表达式,将中缀表达式转换为后缀表达式输出;
(2) 输入后缀表达式,计算后缀表达式的值。
二、实验基本原理与设计(数据结构设计与算法设计)
(1)利用顺序栈进行存储和运算运算符和数字
(2)在读入信息时碰到数字就输出,碰到字符先入栈比较后输出
(3)在进行计算时直接运算,把运算后的结果入栈;直至把最终结果出栈
第二部分:实验调试与结果分析(可加页)
一、 调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
1.调试方法描述
① 输入c程序,并保存;
② 编译c程序,找出程序的语法错误并改正;
③ 输入测试数据,运行c程序;
④ 若有错利用断点一步步运行查错
⑤ 重复②-④步,直到得到正确的运行结果。
2.实验输入/输出数据记录
3.实验过程发现的问题
在进行减法运算的时候我们需要注意是谁减谁,除法运算也一样。开始我并没有注意到这一点,导致后面的结果错误很多。
在把中缀转后缀的过程中我忘记将括号删去导致一开始输出时括号一起输出;带括号的转换
的复杂程度明显高于不带括号所以我将其单独列出便于查看。
二、 实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
1. 结果描述
转换过程和计算过程全部正确;结果输出无误。
2. 实验现象分析
所有程序经调试均符合题目要求。
3.影响因素讨论
4.算法分析(包括时间和空间)
空间复杂度为 Sn=O(100)
时间复杂度为Tn=O(n)
5.结论
经过多次调试,所有程序最终运行都成功了。
三、 实验小结、建议及体会
学习C语音需要有很大的耐心与毅力,对我们的身体的脑力都是一项很大的挑战。敲了快整整一 周的代码,虽然很累,很烦琐,偶尔还会 被题目难倒,压力山大。可当自己将题目一
题一题的解决时,心中更多的是成就感,多了一分慰藉。在接下来的日子里,要更加努力好好学专业基础,稳固提升。在课余时间更加注重劳逸结合,多运动,多锻炼,这样学习更有效率。