搜档网
当前位置:搜档网 › 数据结构表达式自动计算实验报告

数据结构表达式自动计算实验报告

数据结构表达式自动计算实验报告
数据结构表达式自动计算实验报告

目录

一、设计思想 (03)

二、算法流程图 (04)

三、源代码 (07)

四、运行结果 (22)

五、遇到的问题及解决 (23)

六、心得体会 (23)

一、设计思想

程序代码使用两种算法实现输入表达式的自动计算,准确计算出表达式的值。

第一种方法:将中缀表达式转变为后缀表达式,然后对后缀表达式进行计算。

具体思想:

1、中缀表达式转换为后缀表达式:在主函数中通过gets()方法一次性将输入表达式读

入expression数组中,然后调用ChangeExpression()方法进行表达式的转换。首先,定义一个操作符栈,并将其初始化,定义两个循环变量。利用While循环扫描所输

入的表达式,对所扫描的每个元素进行判断。

(1):若扫描为数字或小数点,则将所扫描元素赋值给字符数组change[]

(2):若扫描为操作符:则先判断操作符栈是否为空,若为空,则直接压入操作符栈。

若不为空,将change[]数组中加个$符号,用于后面计算时扫描整个数字,然后判断

当前所扫描元素是否为右括号,若是右括号,则判断栈顶元素是否为左括号,若是,将左括号弹出操作符栈;若栈顶元素不是左括号,则用While循环将栈顶元素弹出,直到栈顶元素为左括号,然后将左括号弹出操作符栈。若当前所扫描元素不是右括

号,则调用操作符优先级比较函数比较当前所扫描元素与栈顶元素的优先级:如果

所扫描元素的优先级高于栈顶元素时,将所扫描元素直接入栈;如果当前所扫描元

素优先级低于栈顶元素时,判断栈顶元素是否为左括号,若是,当前扫描元素直接

入栈,若不是,则栈顶元素出栈进数组,直到所扫描元素高于栈顶元素的优先级为

止,然后将当前所扫描元素直接入操作符栈。本次循环结束,i++,进行下一次循

环,直到遇见\0,While循环结束。

最后判断操作符栈是否为空,若不为空,则将操作符栈中操作符全部弹出,赋给数

组。

2、后缀表达式计算:定义一个数字栈,并将数字栈初始化为空。定义一个临时存放数

数字的字符型数组str[],定义一个指向临时数组的指针*str,定义循环变量。利用

While循环扫描数组:首先判断当前所扫描元素是否为$符号,若是,则i++;若不

是,则判断当前扫描元素是否为数字或小数点,若是,则循环扫描整个数字,以便

数字为小数时获得一个完整的小数。将扫描数字赋给str[]数组,然后利用st=str令

指针指向临时数组str[],利用atof()函数将字符型转为浮点型,并压入数字栈。若

扫描不是数字或小数点,弹出两个数字一个操作符,调用SymbolCal(float popNum1, float popNum2, char popSymbol2)函数进行计算,将计算结果压入数字栈。注意:判

断当前元素是否为$符号,若是则不进行弹出计算操作。数字栈栈顶元素即为运算

结果,弹出返回。

第二种方法:直接计算法。

具体思想:

在主函数中对Calculate()函数进行声明,然后调用Calculate()函数进行操作。在Calculate()中定义一个expression[MaxSize]数组,获取输入的表达式,利用gets()函数,将表达式一次性获取。定义两个栈,数字栈和操作符栈,并分别初始化为空,定义临时存放数字的数组str[MaxSize]数组,定义指针*str,定义循环变量。利用While循环扫描整个表达

式:当所扫描为数字或小数点时,进行循环扫描,以便可以获取整个数字(尤其是小数),将扫描元素赋给字符数组str[],令指针st指向str[]数组,利用atof()函数,将字符型转换为浮点型,并且压入数字栈。若当前所扫描元素不为数字或小数点(即操作符),判断操作符栈是否为空,若空,则直接入栈。若不为空,判断当前所扫描元素是否为左括号,

若是左括号,则直接入操作符栈。若不为空且当前元素不为左括号,判断当前所扫描元

素是否为右括号,若是右括号,判断栈顶元素是否为左括号,当是左括号时,弹出左括号。若不是左括号,则弹出两个数字,弹出一个操作符进行计算,将结果压入数字栈。直到栈顶元素为左括号,然后弹出左括号。若操作栈不为空、当前元素不为左括号且当前元素不为右括号,调用优先级比较函数StackMatchPre(char entry1,char entry2)比较当前扫描元素与栈顶元素。当优先级高时直接压入操作符栈,当优先级相同或低于栈顶元素的优先级时,判断栈顶元素是否为左括号,若是,则直接入栈。若不是,则弹出两个数字,弹出一个操作符进行计算,将结果压入数字栈,直到当前扫描元素的优先级高于栈顶元素的优先级且操作符栈不为空。本次While循环结束,i++,进行下一次While循环,直到遇见\0,While循环结束。最后判断操作符栈栈顶是否为空,若不为空,则弹出两个数字,弹出一个操作符进行计算,计算结果压入数字栈。直到操作符栈为空。将数字栈栈顶弹出赋值给一个浮点型变量,将此变量返回,即为最终计算结果。

二、算法流程图

1、下面是中缀转后缀表达式的算法流程图

图1:中缀转后缀算法流程图

图2:后缀表达式计算流程图2、直接计算法的流程图

图3:直接计算法算法流程图

三、源代码

1、下面给出的是用中缀转后缀算法实现的程序的源代码:#include

#include

#include

#include

#define MaxSize 100

//定义操作符栈,用来临时存放转后缀表达式的操作符typedef struct stackSymbol

{

int top;

char entry[MaxSize];

}stackSymbol;

//定义数值栈,用来第二次扫描后缀表达式时存放数字typedef struct stackNum

{

int top;

float item[MaxSize];

}stackNum;

//初始化操作符栈

void CreatStackSymbol(stackSymbol *s)

{

s->top=-1;//栈为空时top为-1

}

//初始化数字栈

void CreatStackNum(stackNum *s)

{

s->top=-1;

}

//判断栈是否已满:StackNumIsFull(),StackSymbolIsFull() int StackNumIsFull(stackNum *s)

{

if(s->top==(MaxSize-1))

{

printf("The StackNum is Full\n");

return 0;

}

else

{

return 1;

}

}

int StackSymbolIsFull(stackSymbol *s)

{

if(s->top==(MaxSize-1))

{

printf("\n The StackSymbol is Full\n");

return 0;

}

else

{

return 1;

}

}

//判断栈是否为空:StackNumIsEmpty(),StackSymbolIsEmpty(); int StackNumIsEmpty(stackNum *s)

{

if(s->top==-1)

{

printf("\n The StackNum is Empty\n");

return 0;

}

else

{

return 1;

}

}

int StackSymbolIsEmpty(stackSymbol *s)

{

if(s->top==-1)

{

printf("\n The StackSymbol is Empty\n");

return 0;

}

else

{

return 1;

}

}

//将操作符压入操作符栈

int PushStackSymbol(stackSymbol *s,char entry)

{

if(!StackSymbolIsFull(s))

{

return 0;

}

else

{

s->top++;//先进行++操作,在使用top(-1时为空)

s->entry[s->top]=entry;

return 1;

}

}

//将数字压入数字栈

int PushStackNum(stackNum *s,float item)

{

if(!StackNumIsFull(s))

{

return 0;

}

else

{

s->top++;//先进行++操作,在使用top(-1时为空)

s->item[s->top]=item;

return 1;

}

}

//将符号弹出栈

char PopStackSymbol(stackSymbol *s)

{

if(!StackSymbolIsEmpty(s))

{

return 0;

}

else

{

return s->entry[s->top--];

}

}

//讲数字弹出栈

float PopStackNum(stackNum *s)

{

if(!StackNumIsEmpty(s))

{

return 0;

}

else

{

return s->item[s->top--];

}

}

//定义优先级函数(对每个字符定义不同的优先级)

int StackPre(char entry)

{

switch (entry) //根据不同的字符设置不同的优先级

{

case '+':

return 1;

break;

case '-':

return 1;

break;

case '*':

return 2;

break;

case '%':

return 2;

break;

case '(':

return 3;

break;

case ')':

return 0;

default:

printf("\n The symbol is Error\n");

break;

}

}

//定义优先级的比较函数:StackMatchPre()

int StackMatchPre(char entry1, char entry2)

{

int pre1=StackPre(entry1); //调用stackPre函数,对操作符做出级别的认定

int pre2=StackPre(entry2);

if((pre1-pre2)>0) //根据差值来确定优先级:1表示entry1优先级高;0表示优先级相同;-1表示entry2优先级高

{

return 1;

}

else if((pre1-pre2)==0)

{

return 0;

}

else if((pre1-pre2)<0)

{

return -1;

}

}

//定义表达式转换函数:ChangeExpression()

void ChangeExpression(char expression[], char change[])

{

stackSymbol sSymbol;//定义一个操作符栈

CreatStackSymbol(&sSymbol);//将定义的操作符栈初始化

int i=0;//定义循环变量

int j=0;

while(expression[i]!='\0')//以'\0'为条件,循环控制扫描表达式

{

if(((expression[i]>='0')&&(expression[i]<='9'))||(expression[i]=='.'))//当所扫描元素为数字或小数点时将元素进数组

{

change[j]=expression[i];

j++;

}

else

{

change[j++]='$';//添加'$'作为分隔符,以便扫描小数

if(sSymbol.top==-1)//当所扫描字符为操作符且当前操作符栈为空时,将操作符直接入栈

{

PushStackSymbol(&sSymbol,expression[i]);

}

else

{

if(expression[i]==')') //当是右括号且当前操作符栈不为空,则将操作符栈元素弹出,直到遇到'(',将左括号弹出

{

while(sSymbol.entry[sSymbol.top]!='(')

{

change[j]=PopStackSymbol(&sSymbol);

j++;

}

PopStackSymbol(&sSymbol);//将左括号弹出

}

else

{

int lev=StackMatchPre(expression[i],sSymbol.entry[sSymbol.top]);//比较所扫描元素与栈顶元素的优先级

if(lev==1)//当所扫描元素优先级高于栈顶元素时,所扫描元素直接入栈

{

PushStackSymbol(&sSymbol,expression[i]);

}

else //当所扫描元素优先级低于栈顶元素时,判断栈顶是不是左括号,若是,则所扫描元素入栈,若不是,则栈顶元素出栈进数组,到所扫描元素优先级高于栈顶元素为止

{

while((StackMatchPre(expression[i],sSymbol.entry[sSymbol.top])<=0)&&(sSymbol.top!=-1))

{

if(sSymbol.entry[sSymbol.top]=='(')

{

break;

}

else

{

change[j]=PopStackSymbol(&sSymbol);

j++;

}

}

PushStackSymbol(&sSymbol,expression[i]);//扫描元素压栈

}

}

}

}

i++;

}

while(sSymbol.top!=-1)//将操作符栈中的操作符全部pop出,赋给数组

{

change[j]=PopStackSymbol(&sSymbol);

j=j+1;

}

change[j]='\0';//添加'\0',以便对数组进行第二次扫描

}

//定义根据操作符两两计算的函数:SymbolCal()

float SymbolCal(float popNum1, float popNum2, char popSymbol2)

{

switch(popSymbol2)//根据每个不同的操作符,进行不同操作

{

case '+':

return popNum1+popNum2;

break;

case '-':

return popNum2-popNum1;

break;

case '/':

return popNum2/popNum1;

break;

case '*':

return popNum1*popNum2;

break;

case '%':

return (int)popNum2%(int)popNum1;

break;

default : printf("Please enter correct symbol;");

break;

}

}

//定义后缀表达式的计算函数:Calculate()

float Calculate(char cal[])

{

stackNum sNum; //定义一个数字栈

CreatStackNum(&sNum);//初始化数字栈

char str[MaxSize];//用于临时存储数字的数组

char *st;//指向临时数组的指针

int i=0;//循环变量的定义

int j=0;

while(cal[i]!='\0')//while循环控制扫描整个表达式

{

if(cal[i]=='$')//用$分割扫描每个数字

{

i++;

}

if(((cal[i]>='0')&&(cal[i]<='9'))||(cal[i]=='.'))//判断当前扫描元素是否为数字或小数点,若是,则入数字栈

{

while(((cal[i]>='0')&&(cal[i]<='9'))||(cal[i]=='.'))//循环扫描,当是小数时,可以获得完整的小数

{

str[j]=cal[i];

i++;

j++;

}

str[j]='\0';//变为字符串

j=0;

st=str;

float atofNum=atof(st);//将字符型转换为浮点型

PushStackNum(&sNum,atofNum);//将数字压栈

}

else //根据操作符做相应运算,并将运算结果入栈

{

if(cal[i]!='$')//将$排除,扫描为$时,不进行弹出运算操作

{

float popNum1=PopStackNum(&sNum);//弹出两个数,一个操作符,进行计算

float popNum2=PopStackNum(&sNum);

float calResult=SymbolCal(popNum1,popNum2,cal[i]);

PushStackNum(&sNum,calResult); //将结果压栈

}

i++;

}

}

float result=PopStackNum(&sNum);//栈顶就是最终结果,弹出

return result;

}

//主函数

void main()

{

float Calculate(char cal[]);//进行Calculate()函数的声明

void ChangeExpression(char expression[],char change[]);//进行ChangeExpression()函数的声明char expression[MaxSize];//定义一个expression数组,用于存储表达式

char change[MaxSize];//定义change,用于存储后缀表达式

printf("Please input a expression:");

gets(expression); //获取输入的后缀表达式

ChangeExpression(expression,change);//调用表达式转换函数,将表达式转为后缀表达式printf("后缀表达式:%s\n",change);

printf("计算结果:%f\n",Calculate(change));//输出计算结果

}

2、下面给出的是用直接计算算法实现的程序的源代码:

#include

#include

#include

#include

#define MaxSize 100

//定义两个栈的结构体:数字栈stackNum,符号栈stackSymbol

typedef struct stackNum

{

int top;

float item[MaxSize];

}stackNum;

typedef struct stackSymbol

{

int top;

char entry[MaxSize];

}stackSymbol;

//初始化两个栈:数字栈,符号栈,top赋值为-1

void CreatStackNum(stackNum *s)

{

s->top=-1;

}

void CreatStackSymbol(stackSymbol *s)

{

s->top=-1;

}

//判断栈是否已满:StackNumIsFull(),StackSymbolIsFull()

int StackNumIsFull(stackNum *s)

{

if(s->top==(MaxSize-1))

{

printf("The StackNum is Full\n");

return 0;

}

else

{

return 1;

}

}

int StackSymbolIsFull(stackSymbol *s)

{

if(s->top==(MaxSize-1))

{

printf("\n The StackSymbol is Full\n");

return 0;

}

else

{

return 1;

}

}

//判断栈是否为空:StackNumIsEmpty(),StackSymbolIsEmpty(); int StackNumIsEmpty(stackNum *s)

{

if(s->top==-1)

{

printf("\n The StackNum is Empty\n");

return 0;

}

else

{

return 1;

}

}

int StackSymbolIsEmpty(stackSymbol *s)

{

if(s->top==-1)

printf("\n The StackSymbol is Empty\n");

return 0;

}

else

{

return 1;

}

}

//压栈函数:PushStackNum(),PushStackSymbol()

int PushStackNum(stackNum *s,float item)

{

if(!StackNumIsFull(s))

{

return 0;

}

else

{

s->top++;//先将top值加1,在进行压栈(可以做到以-1为界限)

s->item[s->top]=item;

return 1;

}

}

int PushStackSymbol(stackSymbol *s,char entry)

{

if(!StackSymbolIsFull(s))

{

return 0;

}

else

{

s->top++;//先将top值加1,在进行压栈(可以做到以-1为界限)

s->entry[s->top]=entry;

return 1;

}

}

//弹栈函数:PopStackNum(),PopStackSymbol()

float PopStackNum(stackNum *s)

{

if(!StackNumIsEmpty(s))

{

return 0;

}

else

return s->item[s->top--];//先弹栈,再将top值减一}

}

char PopStackSymbol(stackSymbol *s)

{

if(!StackSymbolIsEmpty(s))

{

return 0;

}

else

{

char c=s->entry[s->top--];//先弹栈,再将top值减一

return c;

}

}

//优先级的函数:StackPre()

int StackPre(char entry)

{

switch (entry) //根据不同的字符设置不同的优先级

{

case '+':

return 1;

break;

case '-':

return 1;

break;

case '*':

return 2;

break;

case '%':

return 2;

break;

case '(': //左括号优先级最高

return 3;

break;

case ')': //右括号优先级最小

return 0;

default:

printf("\n The symbol is Error\n");

break;

}

}

//定义优先级的比较函数:StackMatchPre()

int StackMatchPre(char entry1,char entry2)

{

int pre1=StackPre(entry1); //调用stackPre函数,对操作符做出级别的认定

int pre2=StackPre(entry2);

if((pre1-pre2)>0) //根据差值来确定优先级:1表示entry1优先级高;0表示优先级相同;-1表示entry2优先级高

{

return 1;

}

else if((pre1-pre2)==0)

{

return 0;

}

else if((pre1-pre2)<0)

{

return -1;

}

}

//定义根据操作符两两计算的函数:SymbolCal()

float SymbolCal(float popNum1, float popNum2, char popSymbol2)

{

switch(popSymbol2)//根据每个不同字符做不同的操作

{

case '+':

return popNum1+popNum2;

break;

case '-':

return popNum2-popNum1;

break;

case '/':

return popNum2/popNum1;

break;

case '*':

return popNum1*popNum2;

break;

case '%':

return (int)popNum2%(int)popNum1;

break;

default : printf("Please enter correct symbol;");

break;

}

}

//定义计算表达式的函数:Calculate()

float Calculate()

{

char expression[MaxSize];//定义获得输入表达式的数组

printf("Please input the expression:");

gets(expression);

stackNum sNum;//定义两个栈,数字栈和符号栈

stackSymbol sSymbol;

CreatStackNum(&sNum);//分别将两个栈进行初始化

CreatStackSymbol(&sSymbol);

int i=0;//定义循环变量

int j=0;

char str[MaxSize];//定义临时存储数字的数组

char *st; //定义指向数组的指针

while(expression[i]!='\0')//根据'\0'来扫描整个表达式

{

if(((expression[i]>='0')&&(expression[i]<='9'))||(expression[i]=='.'))//当所扫描为数字时,转换为浮点型,压栈

{

while((expression[i]>='0')&&(expression[i]<='9')||(expression[i]=='.'))//循环扫描整个数字(防止当为小数时被分开扫描)

{

str[j]=expression[i];

i++;

j++;

}

str[j]='\0';

st=str;//令指针指向str

j=0;

float atofNum=atof(st);//调用转换函数,将字符型转换为浮点型

PushStackNum(&sNum,atofNum); //数字压栈

}

else

{

if(sSymbol.top==-1)//当栈为空时,操作符直接进栈

{

PushStackSymbol(&sSymbol,expression[i]);

}

else if(expression[i]=='(')//当操作符为左括号时,直接压栈

{

PushStackSymbol(&sSymbol,expression[i]);

}

else if(expression[i]==')')//当操作符为右括号时,弹出操作符与数字计算,直到栈顶操作符为左括号,将左括号弹栈

{

while(sSymbol.entry[sSymbol.top]!='(')

{

float popNum1=PopStackNum(&sNum);//弹出数字

float popNum2=PopStackNum(&sNum);

char popSymbol2=PopStackSymbol(&sSymbol);//弹出操作符

float calResult=SymbolCal(popNum1,popNum2,popSymbol2);//调用计算函数,计算

PushStackNum(&sNum,calResult);//将结果压栈

}

PopStackSymbol(&sSymbol);//弹出左括号

}

else if((expression[i]!='(')&&(expression[i]!=')'))//当扫描元素既不是左括号,也不是右括号时,执行优先级比较

{

int lev=StackMatchPre(expression[i],sSymbol.entry[sSymbol.top]);//定义变量,获得优先级比较函数的返回值

if(lev==1)//当优先级高时,直接压栈

{

PushStackSymbol(&sSymbol,expression[i]);

}

else if(((lev==0)||(lev==-1))&&(sSymbol.top>=0))//当优先级低或相同时,弹出数字与操作符计算

{

while((StackMatchPre(expression[i],sSymbol.entry[sSymbol.top])!=1)&&(sSymbol.top!=-1))

{

if(sSymbol.entry[sSymbol.top]=='(')//对栈顶是不是左括号做判断,若是,扫描元素直接入栈。若不是,弹出操作符,弹出操作数,计算,将结果压栈,知道满足条件

{

break;

}

float popNum1=PopStackNum(&sNum);//弹出两个数字

float popNum2=PopStackNum(&sNum);

char popSymbol2=PopStackSymbol(&sSymbol);//弹出操作符

float calResult=SymbolCal(popNum1,popNum2,popSymbol2);//调用计算函数,进行计算

PushStackNum(&sNum,calResult); //将所得结果压栈

}

PushStackSymbol(&sSymbol,expression[i]);//直到当满足扫描元素优先级高于栈顶元素或栈为空,直接将操作符压栈

}

}

i++;

}

}

《计算方法》课内实验报告

《计算方法》实验报告 姓名: 班级: 学号: 实验日期: 2011年10月26日

一、实验题目: 数值积分 二、实验目的: 1.熟悉matlab 编写及运行数值计算程序的方法。 2.进一步理解数值积分的基础理论。 3.进一步掌握应用不同的数值积分方法求解给定的积分并给出数据结果及误差分析。 三、实验内容: 1.分别用复合梯形求积公式及复合辛普森求积公式计算积分xdx x ln 10 ? , 要求计算精度达到410-,给出计算结果并比较两种方法的计算节点数. 2.用龙贝格求积方法计算积分dx x x ?+3 021,使误差不超过510-. 3.用3=n 的高斯-勒让德公式计算积分?3 1 sin x e x ,给出计算结果. 4.用辛普森公式(取2==M N ) 计算二重积分.5 .00 5 .00 dydx e x y ? ? - 四、实验结果: 1.(1)复合梯形法: 将区间[a,b]划分为n 等份,分点n k n a b h kh a x k ,2,1,0,,=-=+=在每个区间[1,+k k x x ](k=0,1,2,···n-1)上采用梯形公式,则得 )()]()([2)()(1 11 1 f R x f x f h dx x f dx x f I n n k k k b a n k x x k k ++===∑?∑? -=+-=+ 故)]()(2)([21 1 b f x f a f h T n k k n ++=∑-=称为复合梯形公式 计算步长和划分的区间 Eps=1E-4 h1=sqrt(Eps/abs(-(1-0)/12*1/(2+1))) h1 =0.0600 N1=ceil(1/h1) N1 =17 用复合梯形需要计算17个结点。 复合梯形: function T=trap(f,a,b,n) h=(b-a)/n;

数据结构表达式求值实验报告

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告 篇一:数据结构实验二——算术表达式求值实验报告 《数据结构与数据库》 实验报告 实验题目算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系pb0920603 姓学 邮名:李维谷号:pb09206285箱: liwg@https://www.sodocs.net/doc/d83988373.html,指导教师:贾伯琪 实验时间:20XX年10月10日 一、需要分析 问题描述: 表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。

问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)#

数据结构实验报告格式

《数据结构课程实验》大纲 一、《数据结构课程实验》的地位与作用 “数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: (1)内容丰富,学习量大,给学习带来困难; (2)贯穿全书的动态链表存储结构和递归技术是学习中的重点也是难点; (3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度; (4)隐含在各部分的技术和方法丰富,也是学习的重点和难点。 根据《数据结构课程》课程本身的技术特性,设置《数据结构课程实验》实践环节十分重要。通过实验实践内容的训练,突出构造性思维训练的特征, 目的是提高学生组织数据及编写大型程序的能力。实验学时为18。 二、《数据结构课程实验》的目的和要求 不少学生在解答习题尤其是算法设计题时,觉得无从下手,做起来特别费劲。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。 三、《数据结构课程实验》内容 课程实验共18学时,要求完成以下六个题目: 实习一约瑟夫环问题(2学时)

太原理工大学数值计算方法实验报告

本科实验报告 课程名称:计算机数值方法 实验项目:方程求根、线性方程组的直接解 法、线性方程组的迭代解法、代数插值和最 小二乘拟合多项式 实验地点:行勉楼 专业班级: ******** 学号: ********* 学生姓名: ******** 指导教师:李誌,崔冬华 2016年 4 月 8 日

y = x*x*x + 4 * x*x - 10; return y; } float Calculate(float a,float b) { c = (a + b) / 2; n++; if (GetY(c) == 0 || ((b - a) / 2) < 0.000005) { cout << c <<"为方程的解"<< endl; return 0; } if (GetY(a)*GetY(c) < 0) { return Calculate(a,c); } if (GetY(c)*GetY(b)< 0) { return Calculate(c,b); } } }; int main() { cout << "方程组为:f(x)=x^3+4x^2-10=0" << endl; float a, b; Text text; text.Getab(); a = text.a; b = text.b; text.Calculate(a, b); return 0; } 2.割线法: // 方程求根(割线法).cpp : 定义控制台应用程序的入口点。// #include "stdafx.h" #include"iostream"

心得体会 使用不同的方法,可以不同程度的求得方程的解,通过二分法计算的程序实现更加了解二分法的特点,二分法过程简单,程序容易实现,但该方法收敛比较慢一般用于求根的初始近似值,不同的方法速度不同。面对一个复杂的问题,要学会简化处理步骤,分步骤一点一点的循序处理,只有这样,才能高效的解决一个复杂问题。

数据结构实验二——算术表达式求值实验报告

《数据结构与数据库》 实验报告 实验题目 算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系PB0920603 姓名:李维谷 学号:PB09206285 邮箱:liwg@https://www.sodocs.net/doc/d83988373.html, 指导教师:贾伯琪 实验时间:2010年10月10日 一、需要分析 问题描述:

表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。 问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)# 输出结果:194.4

数据结构实验报告

数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

c 计算器实验报告

简单计算器 姓名: 周吉祥 实验目的:模仿日常生活中所用的计算器,自行设计一个简单的计算器程序,实现简单的计算功能。 实验内容: (1)体系设计: 程序是一个简单的计算器,能正确输入数据,能实现加、减、乘、除等算术运算,运算结果能正确显示,可以清楚数据等。 (2)设计思路: 1)先在Visual C++ 6.0中建立一个MFC工程文件,名为 calculator. 2)在对话框中添加适当的编辑框、按钮、静态文件、复选框和单 选框 3)设计按钮,并修改其相应的ID与Caption. 4)选择和设置各控件的单击鼠标事件。 5)为编辑框添加double类型的关联变量m_edit1. 6)在calculatorDlg.h中添加math.h头文件,然后添加public成 员。 7)打开calculatorDlg.cpp文件,在构造函数中,进行成员初始 化和完善各控件的响应函数代码。 (3)程序清单:

●添加的public成员: double tempvalue; //存储中间变量 double result; //存储显示结果的值 int sort; //判断后面是何种运算:1.加法2.减法3. 乘法 4.除法 int append; //判断后面是否添加数字 ●成员初始化: CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/) : CDialog(CCalculatorDlg::IDD, pParent) { //{{AFX_DATA_INIT(CCalculatorDlg) m_edit1 = 0.0; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); tempvalue=0; result=0; sort=0; append=0; }

数据结构算术表达式求值实验报告

软件技术基础实验报告 实验名称:表达式计算器 系别:通信工程 年级: 班级: 学生学号: 学生姓名: 《数据结构》课程设计报告 题目简易计算表达式的演示 【题目要求】 要求:实现基本表达式计算的功能 输入:数学表达式,表达式由整数和“+”、“-”、“×”、“/”、“(”、“)”组成输出:表达式的值 基本操作:键入表达式,开始计算,计算过程和结果记录在文档中 难点:括号的处理、乘除的优先级高于加减

1.前言 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-*、/、=,用#表示结束。 算法输出:表达式运算结果。 算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。 2.概要设计 2.1 数据结构设计 任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top 指示栈顶元素在顺序栈中的位置,base 为栈底指针,在顺序栈中,它始终指向栈底,即top=base 可作为栈空的标记,每当插入新的栈顶元素时,指针top 增1,删除栈顶元素时,指针top 减1。 2.2 算法设计 为了实现算符优先算法。可以使用两个工作栈。一个称为OPTR ,用以寄存运算符,另一个称做OPND ,用以寄存操作数或运算结果。 1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素; 2.依次读入表达式,若是操作符即进OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为”#”)。 2.3 ADT 描述 ADT Stack{ 数据对象:D={ i a |i a ∈ElemSet,i=1,2,…,n, n ≧0} 数据对象:R1={< 1 ,-i i a a >| 1-i a ,D a i ∈,i=2,…,n}

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include//库头文件-----动态分配内存空间 typedef int elemtype;//定义数据域的类型 typedef struct linknode//定义结点类型 { elemtype data;//定义数据域 struct linknode *next;//定义结点指针 }nodetype; 2)创建单链表

nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"<> d; if(d==0) break;//以0表示输入结束 if(i==1)//建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));//表示指针h h->data=d;h->next=NULL;t=h;//h是头指针 } else//建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t始终指向生成的单链表的最后一个节点

计算方法实验报告格式

计算方法实验报告格式 小组名称: 组长姓名(班号): 小组成员姓名(班号): 按贡献排序情况: 指导教师评语: 小组所得分数: 一个完整的实验,应包括数据准备、理论基础、实验内容及方法,最终对实验结果进行分析,以达到对理论知识的感性认识,进一步加深对相关算法的理解,数值实验以实验报告形式完成,实验报告格式如下: 一、实验名称 实验者可根据报告形式需要适当写出. 二、实验目的及要求 首先要求做实验者明确,为什么要做某个实验,实验目的是什么,做完该实验应达到什么结果,在实验过程中的注意事项,实验方法对结果的影响也可以以实验目的的形式列出. 三、算法描述(实验原理与基础理论) 数值实验本身就是为了加深对基础理论及方法的理解而设置的,所以要求将实验涉及到的理论基础,算法原理详尽列出. 四、实验内容 实验内容主要包括实验的实施方案、步骤、实验数据准备、实验的算法以及可能用到的仪器设备. 五、程序流程图 画出程序实现过程的流程图,以便更好的对程序执行的过程有清楚的认识,在程序调试过程中更容易发现问题. 六、实验结果 实验结果应包括实验的原始数据、中间结果及实验的最终结果,复杂的结果可以用表格

形式列出,较为简单的结果可以与实验结果分析合并出现. 七、实验结果分析 实验结果分析包括对对算法的理解与分析、改进与建议. 数值实验报告范例 为了更好地做好数值实验并写出规范的数值实验报告,下面给出一简单范例供读者参考. 数值实验报告 小组名称: 小组成员(班号): 按贡献排序情况: 指导教师评语: 小组所得分数: 一、实验名称 误差传播与算法稳定性. 二、实验目的 1.理解数值计算稳定性的概念. 2.了解数值计算方法的必要性. 3.体会数值计算的收敛性与收敛速度. 三、实验内容 计算dx x x I n n ? += 1 10 ,1,2,,10n = . 四、算法描述 由 dx x x I n n ? += 1 10 ,知 dx x x I n n ?+=--101110,则

算术表达式语法检查实验报告

中南民族大学计算机科学学院本科课程设计 任务书 设计名称:算术表达式语法检查 指导教师:下达时间: 2015-5-8 学生姓名:学号: 专业: 一、课程设计的基本要求 根据所学知识,编写指定题目的C++语言程序,并规范地完成课程设计报告。通过课程设计,加深对《C++面向对象程序设计》课程所学知识的理解,熟练掌握和巩固C++语言的基本知识和语法规范,掌握C++语言的基础知识,理解面向对象系统的封装性、继承性和多态性;熟练使用C语言中的函数、数组、指针、链表和字符串等基本知识;掌握类的定义、标准String类和向量;理解掌握友元函数和重载操作符,动态数组;理解掌握继承和多态性;掌握模版的使用;能够进行程序调试过程中的异常处理;进一步掌握利用C++进行类的定义和操作方法;进一步掌握类的继承和派生方法;进一步理解虚函数和多态;综合利用上述知识,学习设计并编写面向对象的C++简单应用程序;培养解决复杂任务功能分解方法(自顶向下逐步求精、模块化设计、信息隐藏等)。 学会编制结构清晰、风格良好、数据结构适当的C++语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力。 具体要求如下: 1、采取模块化方式进行程序设计,要求程序的功能设计、数据结构设计及整体结构设计合理。学生也可根据自己对题目的理解增加新的功能模块(视情况可另外加分)。 2、系统以菜单界面方式(至少采用文本菜单界面,如能采用图形菜单界面更好)工作,运行界面友好,演示程序以用户和计算机的对话方式进行。 3、程序算法说明清晰,理论分析与计算正确,运行情况良好,实验测试数据无误,容错性强(能对错误输入进行判断控制)。 4、编程风格良好(包括缩进、空行、适当注释、变量名和函数名见名知意,程序容易阅读等); 5、写出规范的课程设计报告,具体要求见相关说明文档。

数据结构实验报告模板

2009级数据结构实验报告 实验名称:约瑟夫问题 学生姓名:李凯 班级:21班 班内序号:06 学号:09210609 日期:2010年11月5日 1.实验要求 1)功能描述:有n个人围城一个圆圈,给任意一个正整数m,从第一个人开始依次报数,数到m时则第m个人出列,重复进行,直到所有人均出列为止。请输出n个人的出列顺序。 2)输入描述:从源文件中读取。 输出描述:依次从显示屏上输出出列顺序。 2. 程序分析 1)存储结构的选择 单循环链表 2)链表的ADT定义 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,3,…n,n≧0} 数据关系:R={< a i-1, a i>| a i-1 ,a i∈D,i=1,2,3,4….,n} 基本操作: ListInit(&L);//构造一个空的单链表表L ListEmpty(L); //判断单链表L是否是空表,若是,则返回1,否则返回0. ListLength(L); //求单链表L的长度 GetElem(L,i);//返回链表L中第i个数据元素的值; ListSort(LinkList&List) //单链表排序 ListClear(&L); //将单链表L中的所有元素删除,使单链表变为空表 ListDestroy(&L);//将单链表销毁 }ADT List 其他函数: 主函数; 结点类; 约瑟夫函数 2.1 存储结构

[内容要求] 1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59 页图2-9 2.2 关键算法分析 结点类: template class CirList;//声明单链表类 template class ListNode{//结点类定义; friend class CirList;//声明链表类LinkList为友元类; Type data;//结点的数据域; ListNode*next;//结点的指针域; public: ListNode():next(NULL){}//默认构造函数; ListNode(const Type &e):data(e),next(NULL){}//构造函数 Type & GetNodeData(){return data;}//返回结点的数据值; ListNode*GetNodePtr(){return next;}//返回结点的指针域的值; void SetNodeData(Type&e){data=e;}//设置结点的数据值; void SetNodePtr(ListNode*ptr){next=ptr;} //设置结点的指针值; }; 单循环链表类: templateclass CirList { ListNode*head;//循环链表头指针 public: CirList(){head=new ListNode();head->next=head;}//构造函数,建立带头节点的空循环链表 ~CirList(){CirListClear();delete head;}//析构函数,删除循环链表 void Clear();//将线性链表置为空表 void AddElem(Type &e);//添加元素 ListNode *GetElem(int i)const;//返回单链表第i个结点的地址 void CirListClear();//将循环链表置为空表 int Length()const;//求线性链表的长度 ListNode*ListNextElem(ListNode*p=NULL);//返回循环链表p指针指向节点的直接后继,若不输入参数,则返回头指针 ListNode*CirListRemove(ListNode*p);//在循环链表中删除p指针指向节点的直接后继,且将其地址通过函数值返回 CirList&operator=(CirList&List);//重载赋

数据结构课程设计_表达式求值问题

实验表达式求值问题 1.问题描述 表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:11+22*(7-4)/3.中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀表达式(如:11 22 7 4 - * 3 / +)和前缀表达式(+ 11 / * 22 - 7 4 3)。后缀表达式 和前缀表达式中没有括号,给计算带来方便。如后缀表达式计算时按运算符出现的先后进行计算。本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。 2.数据结构设计 (1)顺序栈类定义:首先应在类中定义成员函数,以此来完成顺序栈的相关操作,如下: class SqStack { private: T *base; //栈底指针 int top; //栈顶 int stacksize; //栈容量public: SqStack(int m); //构建函数 ~SqStack(){delete [] base;top=0;stacksize=0;} //析构函数 void Push(T x); //入栈 T Pop(); //出栈 T GetTop(); //获取栈顶元素

int StackEmpty(); //测栈空 void ClearStack(); //清空栈 void StackTop(); //返回栈顶指针 void StackTranverse(); //显示栈中元素 }; (2)顺序栈类实现:对顺序栈进行初始化,初始化的首要操作就是创建一个空顺序栈。 Step1:申请一组连续的存空间为顺序栈使用: base=new T[m]; i f(base==NULL) { cout<<"栈创建失败,退出!"<

四则运算表达式求值实验报告

HUNAN UNIVERSITY 课程实习报告 题目:四则运算表达式求值 学生姓名: 学生学号: 专业班级: 指导老师: 完成日期:

一、需求分析 四则运算表达式求值,将四则运算表达式用中缀表达式表示,然后转换为后缀表达式,并计算结果。 本程序要求利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结果来求解后缀表达式的值。 在字符界面上输入一个中缀表达式,回车表示结束。如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。 测试数据 输入: 21+23*(12-6) 输出: 21 23 12 6 -*+ 二、详细设计 输入和输出的格式 输入 本程序可以将输入的四则运算表达式(中缀表达式)转换为后缀表达式 输出 后缀表达式为://输出结果的位置 表达式的值为://输出结果的位置 三、调试分析 本次实验的难点主要是在建立二叉树的问题上。关于如何把中缀表达式存入二叉树中,我参考了网上的一些方法,成功实现了目标,但是却遇到了一个问题,那就是不能处理小数,甚至两位或两位以上的整数。因为如果采用字符数组来存储操作数,运算符合一位整数还可以处理,但对于两位数就就会出问题,最后我改进采用字符串数组来存储操作数,成功解决了问题。 另外在处理输入的非法表达式问题中,我也费了很大功夫,但总体问题不大。 四、测试结果 五、用户使用说明(可选) 1、运行程序时 提示输入四则运算表达式 本程序可以将中缀表达式转化为后缀表达式,并计算结果 请输入四则运算表达式: 输出 后缀表达式为: 表达式的值为: 程序源代码(c++) #include #include #include #include

计算方法实验报告 拟合

南京信息工程大学实验(实习)报告 一、实验目的: 用最小二乘法将给定的十个点拟合成三次多项式。 二、实验步骤: 用matlab编制以函数为基的多项式最小二乘拟合程序,并用于对下列数据作三次多项式最小二乘拟合(取权函数wi=1) x -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 y -2.30 -1 -0.14 -0.25 0.61 1.03 1.75 2.75 4.42 6.94 给定直线方程为:y=1/4*x3+1/2*x2+x+1 三、实验结论: 最小二乘法:通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。 一般地。当测量数据的散布图无明显的规律时,习惯上取n次代数多项式。 程序运行结果为: a = 0.9731 1.1023 0.4862 0.2238 即拟合的三次方程为:y=0.9731+1.1023x+0.4862*x2+0.2238*x3

-2.5 -2-1.5-1-0.5 00.51 1.52 2.5 -4-20246 81012 x 轴 y 轴 拟合图 离散点 y=a(1)+a(2)*x+a(3)*x.2+a(4)*x.3 结论: 一般情况下,拟合函数使得所有的残差为零是不可能的。由图形可以看出最小二乘解决了残差的正负相互抵消的问题,使得拟合函数更加密合实验数据。 优点:曲线拟合是使拟合函数和一系列的离散点与观测值的偏差平方和达到最小。 缺点:由于计算方法简单,若要保证数据的精确度,需要大量的数据代入计算。

数据结构表达式求值代码

//代码部分: #include using namespace std; #define MAXSIZE 100 typedef char ElemType;//定义栈 typedef struct{ char a[MAXSIZE]; int top;//栈顶指针 }SqStack; char op[8]={'+','-','*','/','(',')','#'};//运算符集 char ch[7][7]={ //运算符优先关系集{'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=',' '}, {'>','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='} }; void InitStack(SqStack &s) { for(int i=0;i

ElemType Pop(SqStack &s,ElemType &e) { if (s.top==0) { cout<<"Stack is empty!"<

表达式求值实验报告

淮海工学院计算机工程学院 课程设计报告 设计名称:数据结构课程设计 选题名称:表达式求值 姓名:学号: 专业班级: 系(院):计算机工程学院 设计时间: 设计地点:软件工程实验室、教室 指导教师评语: 成绩: 签名: 年月日

1.课程设计目的 1、训练学生灵活使用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。 2.课程设计任务和要求: 任务 根据教材《数据结构-C语言描述》(耿国华主编)和参考书《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择使用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。 设计题目从任务书所列选题表中选取,每班每题不得超过2人。 学生自选课题 学生原则上可以结合个人爱好自选课题,要求课题有一定的深度和难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识。学生自选课题需在18周前报课程设计指导教师批准方可生效。 要求: 1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备和否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。 2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。 3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释; 4、每位同学需提交可独立运行的程序; 5 、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算); 6、课程设计实践作为培养学生动手能力的一种手段,单独考核。 3.课程设计说明书

数据结构实验报告及心得体会

2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨

实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。

三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1;

数据结构课程设计_表达式求值【完整版】

XXXXXX大学《数据结构》课程设计报告 班级: 学号: 姓名: 指导老师:

目录 一算术表达式求值 一、需求分析 二、程序的主要功能 三、程序运行平台 四、数据结构 五、算法及时间复杂度 六、测试用例 七、程序源代码 二感想体会与总结

算术表达式求值 一、需求分析 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 二、程序的主要功能 (1)从键盘读入一个合法的算术表达式,输出正确的结果。 (2)显示输入序列和栈的变化过程。 三、程序运行平台 Visual C++ 6.0版本 四、数据结构 本程序的数据结构为栈。 (1)运算符栈部分: struct SqStack //定义栈 { char *base; //栈底指针 char *top; //栈顶指针 int stacksize; //栈的长度 }; int InitStack (SqStack &s) //建立一个空栈S { if (!(s.base = (char *)malloc(50 * sizeof(char)))) exit(0); s.top=s.base; s.stacksize=50; return OK; } char GetTop(SqStack s,char &e) //运算符取栈顶元素 { if (s.top==s.base) //栈为空的时候返回ERROR { printf("运算符栈为空!\n"); return ERROR; } else e=*(s.top-1); //栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK

C语言程序设计实验报告实验数据类型运算符和表达式

凯里学院C 语言程序设计实验报告 ×××××专业××年级××班,学号××××××姓名××成绩 合作者实验日期年月日 指导教师评阅日期年月日 实验二数据类型、运算符和表达式 一、实验目的: (1)掌握C 语言数据类型,熟悉如何定义一个整型、字符型、实型变量、以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。 (2)学会使用C 的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(――)运算符的使用。 (3)掌握C 语言的输入和输出函数的使用 (4)进一步熟悉C 程序的编辑、编译、连接和运行的过程,学会使用stepbystep 功能。 (5)认真阅读教材数据类型,算术运算符和表达式,赋值运算符和表达式部分内容。 二、实验内容: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; c2='b'; 装 订 线 装 订 线

printf("%c%c\n",c1,c2); } (2)按习题3.7的要求编程序并上机运行 该题的要求是: 要将“China”译成密码,密码规律是:用原来字母后面的第4个字母代替原来的字母。 例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre"。 请编一程序,用赋初值的方法使。cl,c2,c3,c4,c5五个变量的值分别为‘C’、‘h’、‘i’、‘n’、‘a’,经过运算,使cl,c2,c3,c4,c5分别变为‘G’、‘l’、‘m’、‘r’、‘e’,并输出。 三、实验步骤: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; c2='b'; printf("%c%c\n",c1,c2); } ①运行此程序。 程序结果为:

相关主题