编译原理实现一个简单的计算器程序

编译原理实现一个简单的计算器程序
编译原理实现一个简单的计算器程序

《编译原理》实验报告

专业:

学号:

班级:

姓名:

实验题目:设计,实现一个简单的计算器程序实验时间:

指导教师:实验成绩:

1实验目的

1.1实现一个简单计算器

2实验要求

2.1单词的构词规则有明确的定义;

2.2编写的分析程序能够正确识别源程序中的语法符号;

2.3计算器源程序的以.c格式输出

2.4对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误

提示,保证顺利完成整个源程序的词法分析,语法分析;

2.5计算器能够实现加,减,乘,除,混合运算,多项式运算。

3实验环境

3.1Windows XP

3.2Flex词法分析工具

3.3Visual Studio C++ 6.0

4实验原理

4.1多项式计算器的实现,采用后缀表达式来对输入的计算表达式进行计算

4.2对后缀表达式进行符号识别,词法分析,语法分析

4.3编写计算器的源程序,使用Flex工具生成计算器的C语言程序

4.4对生成的程序进行相应的修改,再进行编译,连接,运行,测试得到可以用于进行

多项式运算的源程序。

5软件设计与编程

5.1程序源代码:

5.2新建文件夹

5.3将Flex工具复制到该文件夹下

5.4在DOS环境学生成目标源程序

5.5在Visual Studio C++

6.0环境下进行相应的修改,添加main方法和打开文件的方

6程序测试结果

6.1编写源代码

6.2使用Flex生成C代码:

6.3 在V isual Studio C++6.0上运行生成的”.c”文件

文件:y.ta.h

#ifndef YYTOKENT YPE

# define YYT OKENT YPE

enum yytokentype {

CLEAR = 258,

EXIT = 259,

LIST = 260,

ERASE = 261,

DEC = 262,

HEX = 263,

OCT = 264,

HELP = 265,

NUM = 266,

REG = 267,

ADD = 268,

SUB = 269,

MUL = 270,

DIV = 271,

MOD = 272,

LSHIFT = 273,

RSHIFT = 274,

AND = 275,

OR = 276,

NOT = 277,

LESS = 278,

MORE = 279,

BIT AND = 280,

BITOR = 281,

BITXOR = 282,

BITREV = 283,

SIN = 284,

COS = 285,

T AN = 286,

ABS = 287,

SQRT = 288,

LOG = 289,

RMINUS = 290

};

//前面定义过,此处省略宏定义

#if ! defined (YYST YPE) && ! defined

(YYSTYPE_IS_DECLARED) typedef int YYST YPE;

# define yystype YYSTYPE /* obsolescent; will be withdrawn */

# define YYSTYPE_IS_DECLARED 1

# define YYSTYPE_IS_TRIVIAL 1 #endif

extern YYST YPE yylval;

文件:calc.l 核心程序

%{

#define YYSTYPE double

#define BIGINT long

#include

#include "y.tab.h"

%}

digit [0-9]

xdigit [0-9a-fA-F]

odigit [0-7]

decnum

(0(\.{digit}+)?)|([1-9]{digit} *(\.{digit}+)?)

octnum0{odigit}+

hexnum 0(x|X){xdigit}+ reg [a-zA-Z]

opt1

"+"|"-"|"*"|"/"|"&"|"|"|" %"|"^"|"~"|"!"|"<"|">"

opt2

(&&)|(\|\|)|(\<\<)|(\>\>)

exit

((E|e)(X|x)(I|i)(T|t))|((Q|q)( U|u)(I|i)(T|t))

clear

(C|c)(L|l)(E|e)(A|a)(R|r) list (L|l)(I|i)(S|s)(T|t) erase

(E|e)(R|r)(A|a)(S|s)(E|e)

hex (H|h)(E|e)(X|x)

oct (O|o)(C|c)(T|t)

dec (D|d)(E|e)(C|c) help (H|h)(E|e)(L|l)(P|p) sin

(S|s)(I|i)(N|n) cos

(C|c)(O|o)(S|s)

log

(L|l)(O|o)(G|g)

tan

(T|t)(A|a)(N|n)

abs

(A|a)(B|b)(S|s)

sqrt

(S|s)(Q|q)(R|r)(T|t)

%%

int i ;

BIGINT val;

[" "; \t]{ }

{decnum}

{sscanf(yytext,"%lf",&yyl

val);return(NUM); }

{octnum} {

i=1;v al=0;

while(i

{

val=(val<<3)+yytext[i]-'0';

i++;

}

yylval=val;

return(NUM);

}

{hexnum} {

i=2;v al=0;

while(i

{

if(islower(yytext[i]))

val=(val<<4)+yytext[i]-'a'+10;

else

if(isupper(yytext[i]))

val=(val<<4)+yytext[i]-'A'+10;

else

val=(val<<4)+yytext[i]-'0';

i++;

}

yylval=val;

return(NUM);

}

{reg} {

if(islower(yytext[0]))yylval

=yytext[0]-'a';

else

yylval=yytext[0]-'A';

return(REG);

}

{opt1} {

switch(yytext[0])

{

case

'+':

return ADD;

break;

case

'-':

return SUB;

break;

case

'*':

return MUL;

break;

case

'/':

return DIV;

break;

case

'%':

return MOD;

break;

case

'^':

return BITXOR;

break;

case

'&':

return BITAND;

break;

case

'|':

return BITOR;

break;

case

'<':

return LESS;

break;

case

'>':

return MORE;

break;

case

'!':

return NOT;

break;

case

'~':

return BITREV;

break;

}

}

{opt2} {

switch(yytext[0])

{

case

'&':

return AND;

break;

case

'|':

return OR;

break;

case

'<':

return LSHIFT;

break;

case

'>':

return RSHIFT;

break;

}

}

{sin} {return (SIN);}

{cos} {return (COS);}

{tan} {return (TAN);}

{log} {return (LOG);}

{abs} {return (ABS);}

{sqrt} {return (SQRT);}

{clear} {return(CLEAR);}

{exit} {return(EXIT);}

{list} {return(LIST);}

{erase} {return(ERASE);}

{hex} {return(HEX);}

{oct} {return(OCT);}

{dec} {return(DEC);}

{help} {return(HELP);}

.|\n {return(yytex t[0]);}

文件:y.tab.c

部分代码:

#define YYBISON 1

/* Skeleton name. */

#define YYSKELETON_NAME

"yacc.c"

/* Pure parsers. */

#define YYPURE 0

/* Using locations. */

#define YYLSP_NEEDED 0

/* T okens. */

#ifndef YYTOKENT YPE

# define YYT OKENT YPE

/* Put the tokens into the symbol

table, so that GDB and other

debuggers

know about them. */

enum yytokentype {

前面定义过,此处省略

};

/* Copy the first part of user

declarations. */

#line 1 "calc.y"

//前面定义过,此处省略宏定义

#include

#include

#include

#include

#include "lex.yy.c" //这是词法分

析器生成的文件,必须包含!

YYSTYPE reg[26]={0};

BIGINT ival;

enum Display{DEC_ON, HEX_ON,

OCT_ON};

enum Display dflag=DEC_ON;

int i;

/* Enabling traces. */

#ifndef YYDEBUG

# define YYDEBUG 0

#endif

/* Enabling verbose error messages.

*/

#ifdef YYERROR_VERBOSE

# undef YYERROR_V ERBOSE

# define YYERROR_V ERBOSE 1

#else

# define YYERROR_V ERBOSE 0

#endif

#if ! defined (YYST YPE) && !

defined

(YYSTYPE_IS_DECLARED)

typedef int YYST YPE;

# define yystype YYSTYPE /*

obsolescent; will be withdrawn */

# define

YYSTYPE_IS_DECLARED 1

# define YYSTYPE_IS_TRIVIAL 1

#endif

/* Copy the second part of user

declarations. */

/* Line 214 of yacc.c. */

#line 173 "y.tab.c"

#if ! defined (yyoverflow) ||

YYERROR_V ERBOSE

/* The parser invokes alloca or

malloc; define the necessary

symbols. */

# if YYST ACK_USE_ALLOCA

# define YYST ACK_ALLOC

alloca

# else

# ifndef

YYST ACK_USE_ALLOCA

# if defined (alloca) || defined (_ALLOCA_H)

# define YYST ACK_ALLOC alloca

# else

# ifdef __GNUC__

# define YYST ACK_ALLOC __builtin_alloca

# endif

# endif

# endif

# endif

# ifdef YYST ACK_ALLOC

/* Pacify GCC's `empty if-body' warning. */

# define YYST ACK_FREE(Ptr) do { /* empty */; } while (0)

# else

# if defined (__STDC__) || defined (__cplusplus)

# include /* INFRINGES ON USER NAME SPACE */

# define YYSIZE_T size_t

# endif

# define YYST ACK_ALLOC malloc

# define YYST ACK_FREE free # endif

#endif /* ! defined (yyoverflow) || YYERROR_V ERBOSE */

#if (! defined (yyoverflow) \

&& (! defined (__cplusplus) \

||

(YYSTYPE_IS_TRIVIAL)))

/* A type that is properly aligned for any stack member. */

union yyalloc

{

short yyss;

YYSTYPE yyvs;

};

/* T he size of the maximum gap between one aligned stack and the next. */

# define YYST ACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)

/* The size of an array large to enough to hold all stacks, each with N elements. */

# define YYST ACK_BYT ES(N) \ ((N) * (sizeof (short) + sizeof (YYSTYPE))

\

+

YYST ACK_GAP_MAXIMUM)

/* Copy COUNT objects from FROM to T O. T he source and destination do

not overlap. */

# ifndef YYCOPY

# if 1 < __GNUC__

# define YYCOPY(T o, From, Count) \

__builtin_memcpy (T o, From, (Count) * sizeof (*(From))) # else

# define YYCOPY(T o, From, Count) \

do

\

{

\

register YYSIZ E_T yyi;

\

for (yyi = 0; yyi < (Count); yyi++) \

(T o)[yyi] = (From)[yyi];

\

}

\

while (0)

# endif

# endif /* Relocate ST ACK from its old

location to the new one. The

local variables YYSIZE and

YYST ACKSIZE give the old and

new number of

elements in the stack, and

YYPT R gives the new location of

the

stack. Advance YYPTR to a

properly aligned location for the

next

stack. */

# define

YYST ACK_RELOCATE(Stack)

\

do

{

\

YYSIZE_T yynewbytes;

YYCOPY (&yyptr->Stack,

Stack, yysize);

Stack = &yyptr->Stack;

\

yynewbytes = yystacksize *

sizeof (*Stack) +

YYST ACK_GAP_MAXIMUM; \

yyptr += yynewbytes /

sizeof (*yyptr);

\

}

\

while (0)

#endif

#if defined (__ST DC__) || defined

(__cplusplus)

typedef signed char

yysigned_char;

#else

typedef short yysigned_char;

#endif

/* YYFINAL -- State number of the

termination state. */

#define YYFINAL 2

/* YYLAST -- Last index in

YYT ABLE. */

#define YYLAST 188

/* YYNTOKENS -- Number of

terminals. */

#define YYNT OKENS 40

/* YYNNTS -- Number of

nonterminals. */

#define YYNNTS 5

/* YYNRULES -- Number of rules.

*/

#define YYNRULES 42

/* YYNRULES -- Number of states.

*/

#define YYNST ATES 73

/* YYTRANSLATE(YYLEX) --

Bison symbol number

corresponding to YYLEX. */

#define YYUNDEFTOK 2

#define YYMAXUT OK 290

#define YYTRANSLAT E(YYX)

\

((unsigned int) (YYX) <=

YYMAXUT OK ?

yytranslate[YYX] :

YYUNDEFTOK)

/* YYTRANSLATE[YYLEX] --

Bison symbol number

corresponding to YYLEX. */

static const unsigned char

yytranslate[] =

{

省略数据信息

};

/* YYRHS -- A `-1'-separated list of

the rules' RHS. */

static const yysigned_char yyrhs[] =

{

省略数据信息

};

/* YYRLINE[YYN] -- source line

where rule number YYN was

defined. */

static const unsigned char yyrline[]

=

{省略数据信息

};

#endif

#if YYDEBUG ||

YYERROR_V ERBOSE

/* YYT NME[SYMBOL-NUM] --

String name of the symbol

SYMBOL-NUM.

First, the terminals, then,

starting at YYNT OKENS,

nonterminals. */

static const char *const yytname[] =

{

"$end", "error", "$undefined",

"CLEAR", "EXIT", "LIST",

"ERASE", "DEC",

"HEX", "OCT", "HELP", "NUM",

"REG", "ADD", "SUB", "MUL",

"DIV", "MOD",

"LSHIFT", "RSHIFT", "AND",

"OR", "NOT", "LESS", "MORE",

"BIT AND",

"BITOR", "BITXOR",

"BITREV", "SIN", "COS", "T AN",

"ABS", "SQRT", "LOG",

"RMINUS", "'\\n'", "'='", "'('", "')'",

"$accept", "lines", "statement",

"expr", "cmdline", 0

};

#endif

# ifdef YYPRINT

/* YYT OKNUM[YYLEX-NUM] --

Internal token number

corresponding to

token YYLEX-NUM. */

static const unsigned short

yytoknum[] =

{

省略数据信息

};

# endif

/* YYR1[YYN] -- Symbol number

of symbol that rule YYN derives.

*/

static const unsigned char yyr1[] =

{

省略数据信息

};

/* YYDEF ACT[ST ATE-NAME] --

Default rule to reduce with in state

ST ATE-NUM when YYT ABLE

doesn't specify something else to do.

Zero

means the default is an error.

*/

static const unsigned char yydefact[]

=

{ 省略数据信息

};

/* YYDEFGOT O[NT ERM-NUM].

*/

static const yysigned_char

yydefgoto[] =

{省略数据};

/* YYPACT[ST AT E-NUM] -- Index

in YYT ABLE of the portion

describing

ST ATE-NUM. */

#define YYPACT_NINF -28

static const short yypact[] =

{

省略数据信息

};

/* YYPGOTO[NTERM-NUM]. */

static const yysigned_char yypgoto[]

=

{省略数据信息

};

/*

YYT ABLE[YYPACT[ST ATE-NU

M]]. What to do in state

ST ATE-NUM. If

positive, shift that token. If

negative, reduce the rule which

number is the opposite. If zero,

do what YYDEF ACT says.

If YYT ABLE_NINF, syntax

error. */

#define YYT ABLE_NINF -1

static const unsigned char yytable[]

=

{

省略数据信息

};

#if ! defined (YYSIZ E_T) &&

defined (__SIZE_TYPE__)

# define YYSIZ E_T

__SIZE_TYPE__

#endif

#if ! defined (YYSIZ E_T) &&

defined (size_t)

# define YYSIZE_T size_t

#endif

#if ! defined (YYSIZE_T)

# if defined (__STDC__) || defined

(__cplusplus)

# include /*

INFRINGES ON USER NAME

SPACE */

# define YYSIZ E_T size_t

# endif

#endif

#if ! defined (YYSIZE_T)

# define YYSIZE_T unsigned int

#endif

#define yyerrok (yyerrstatus

= 0)

#define yyclearin (yychar =

YYEMPT Y)

#define YYEMPTY (-2)

#define YYEOF 0

#define YYACCEPT goto

yyacceptlab

#define YYABORT goto

yyabortlab

#define YYERROR goto

yyerrlab1

/* Like YYERROR except do call

yyerror. T his remains here

temporarily

to ease the transition to the new

meaning of YYERROR, for GCC.

Once GCC version 2 has

supplanted version 1, this can go.

*/

#define YYFAIL goto

yyerrlab

#define YYRECOVERING()

(!!yyerrstatus)

#define YYBACKUP(T oken, V alue)

\

do

\

if (yychar == YYEMPT Y &&

yylen == 1)

\

{

\

yychar = (T oken);

\

yylval = (V alue);

\

yytoken = YYTRANSLATE

(yychar);

\

YYPOPST ACK;

\

goto yybackup;

\ }

\ else \

{ \

yyerror ("syntax error: cannot back up");\

YYERROR;

}

\ while (0)

#define YYTERROR 1

#define YYERRCODE 256

/* YYLLOC_DEF AULT -- Compute the default location (before the actions

are run). */

#ifndef YYLLOC_DEF AULT

# define YYLLOC_DEF AULT(Current, Rhs, N) \

Current.first_line = Rhs[1].first_line; \ Current.first_column = Rhs[1].first_column; \ https://www.360docs.net/doc/a013439927.html,st_line = Rhs[N].last_line; \ https://www.360docs.net/doc/a013439927.html,st_column = Rhs[N].last_column;

#endif

/* YYLEX -- calling `yylex' with the right arguments. */

#ifdef YYLEX_PARAM

# define YYLEX yylex (YYLEX_PARAM)

#else

# define YYLEX yylex ()

#endif

/* Enable debugging if requested. */

#if YYDEBUG

# ifndef YYFPRINTF

# include /* INFRINGES ON USER NAME SPACE */

# define YYFPRINTF fprintf

# endif

# define YYDPRINTF(Args)

\

do {

\

if (yydebug)

\

YYFPRINTF Args;

\

} while (0)

# define YYDSYMPRINT(Args)

\

do {

\

if (yydebug)

\

yysymprint Args;

\

} while (0)

# define YYDSYMPRINTF(T itle, T oken, V alue, Location) \

do {

\

if (yydebug)

\ {

\

YYFPRINTF (stderr, "%s ", Title); \

yysymprint (stderr,

\

T oken, V alue);

\

YYFPRINTF (stderr, "\n");

\

}

\

} while (0)

/*-----------------------------------------

-------------------------.

| yy_stack_print -- Print the state

stack from its BOTTOM up to its |

| TOP (cinluded).

|

`-------------------------------------------

-----------------------*/

#if defined (__ST DC__) || defined

(__cplusplus)

static void

yy_stack_print (short *bottom, short

*top)

#else

static void

yy_stack_print (bottom, top)

short *bottom;

short *top;

#endif

{

YYFPRINTF (stderr, "Stack

now");

for (/* Nothing. */; bottom <= top;

++bottom)

YYFPRINTF (stderr, " %d",

*bottom);

YYFPRINTF (stderr, "\n");

}

# define

YY_ST ACK_PRINT(Bottom, T op)

\

do {

\

if (yydebug)

\

yy_stack_print ((Bottom),

(T op)); \

} while (0)

#if defined (__ST DC__) || defined

(__cplusplus)

static void

yy_reduce_print (int yyrule)

#else

static void

yy_reduce_print (yyrule)

int yyrule;

#endif

{

int yyi;

unsigned int yylno =

yyrline[yyrule];

YYFPRINTF (stderr, "Reducing

stack by rule %d (line %u), ",

yyrule - 1, yylno);

/* Print the symbols being

reduced, and their result. */

for (yyi = yyprhs[yyrule]; 0 <=

yyrhs[yyi]; yyi++)

YYFPRINTF (stderr, "%s ",

yytname [yyrhs[yyi]]);

YYFPRINTF (stderr, "-> %s\n",

yytname [yyr1[yyrule]]);

}

# define

YY_REDUCE_PRINT(Rule)

\

do {

\

if (yydebug)

\

yy_reduce_print (Rule);

\

} while (0)

/* Nonzero means print parse trace.

It is left uninitialized so that

multiple parsers can coexist. */

int yydebug;

#else /* !YYDEBUG */

# define YYDPRINTF(Args)

# define YYDSYMPRINT(Args)

# define YYDSYMPRINTF(T itle,

T oken, V alue, Location)

# define

YY_ST ACK_PRINT(Bottom, T op)

# define

YY_REDUCE_PRINT(Rule)

#endif /* !YYDEBUG */

/* YYINIT DEPTH -- initial size of

the parser's stacks. */

#ifndef YYINIT DEPTH

# define YYINIT DEPTH 200

#endif

/* YYMAX DEPT H -- maximum

size the stacks can grow to

(effective only

if the built-in stack extension

method is used).

Do not make this value too large;

the results are undefined if

SIZE_MAX <

YYST ACK_BYT ES

(YYMAXDEPTH)

evaluated with infinite-precision

integer arithmetic. */

#if YYMAX DEPT H == 0

# undef YYMAX DEPTH

#endif

#ifndef YYMAXDEPTH

# define YYMAX DEPTH 10000

#endif

#if YYERROR_VERBOSE

# ifndef yystrlen

# if defined (__GLIBC__) &&

defined (_STRING_H)

# define yystrlen strlen

# else

/* Return the length of YYSTR. */

static YYSIZE_T

# if defined (__STDC__) ||

defined (__cplusplus)

yystrlen (const char *yystr)

# else

yystrlen (yystr)

const char *yystr;

# endif

{

register const char *yys = yystr;

while (*yys++ != '\0')

continue;

return yys - yystr - 1;

}

# endif

# endif

# ifndef yystpcpy

# if defined (__GLIBC__) &&

defined (_STRING_H) && defined

(_GNU_SOURCE)

# define yystpcpy stpcpy

# else

static char *

# if defined (__STDC__) ||

defined (__cplusplus)

yystpcpy (char *yydest, const char

*yysrc)

# else

yystpcpy (yydest, yysrc)

char *yydest;

const char *yysrc;

# endif

{

register char *yyd = yydest;

register const char *yys = yysrc;

while ((*yyd++ = *yys++) != '\0')

continue;

return yyd - 1;

}

# endif

# endif

#endif /* !YYERROR_VERBOSE

*/

#if YYDEBUG

#if defined (__ST DC__) || defined

(__cplusplus)

static void

yysymprint (FILE *yyoutput, int

yytype, YYSTYPE *yyvaluep)

#else

static void

yysymprint (yyoutput, yytype,

yyvaluep)

FILE *yyoutput;

int yytype;

YYSTYPE *yyvaluep;

#endif

{

/* Pacify ``unused variable''

warnings. */

(void) yyvaluep;

if (yytype < YYNTOKENS)

{

YYFPRINTF (yyoutput,

"token %s (", yytname[yytype]);

# ifdef YYPRINT

YYPRINT (yyoutput,

yytoknum[yytype], *yyvaluep);

# endif

}

else

YYFPRINTF (yyoutput,

"nterm %s (", yytname[yytype]);

switch (yytype)

{

default:

break;

}

YYFPRINTF (yyoutput, ")");

}

#endif /* ! YYDEBUG */

/*-----------------------------------------

------.

| Release the memory associated to

this symbol. |

`-------------------------------------------

----*/

#if defined (__ST DC__) || defined

(__cplusplus)

static void

yydestruct (int yytype, YYSTYPE

*yyvaluep)

#else

static void

yydestruct (yytype, yyvaluep)

int yytype;

YYSTYPE *yyvaluep;

#endif

{

(void) yyvaluep;

switch (yytype)

{

default:

break;

}

}

#ifdef YYPARSE_PARAM

# if defined (__STDC__) || defined

(__cplusplus)

int yyparse (void

*YYPARSE_PARAM);

# else

int yyparse ();

# endif

#else /* ! YYPARSE_PARAM */

#if defined (__ST DC__) || defined

(__cplusplus)

int yyparse (void);

#else

int yyparse ();

#endif

#endif /* ! YYPARSE_PARAM */

/* T he lookahead symbol. */

int yychar;

/* T he semantic value of the

lookahead symbol. */

YYSTYPE yylval;

/* Number of syntax errors so far.

*/

int yynerrs;

/*----------.

| yyparse. |

`----------*/

#ifdef YYPARSE_PARAM

# if defined (__STDC__) || defined (__cplusplus)

int yyparse (void *YYPARSE_PARAM)

# else

int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM;

# endif

#else /* ! YYPARSE_PARAM */

#if defined (__ST DC__) || defined (__cplusplus)

int

yyparse (void)

#else

int

yyparse ()

#endif

#endif

{

register int yystate;

register int yyn;

int yyresult;

/* Number of tokens to shift before error messages enabled. */ int yyerrstatus;

/* Lookahead token as an internal (translated) token number. */

int yytoken = 0;

/* Three stacks and their tools:

`yyss': related to states,

`yyvs': related to semantic values,

`yyls': related to locations.

Refer to the stacks thru separate pointers, to allow yyoverflow

to reallocate them elsewhere. */

/* The state stack. */

short yyssa[YYINIT DEPT H]; short *yyss = yyssa;

register short *yyssp;

/* The semantic value stack. */ YYSTYPE

yyvsa[YYINIT DEPT H]; YYSTYPE *yyvs = yyvsa; register YYST YPE *yyvsp;

#define YYPOPST ACK (yyvsp--, yyssp--)

YYSIZ E_T yystacksize = YYINIT DEPTH;

/* The variables used to return semantic value and location from the

action routines. */ YYSTYPE yyval;

/* When reducing, the number of symbols on the RHS of the reduced rule. */

int yylen;

YYDPRINTF ((stderr, "Starting parse\n"));

yystate = 0;

yyerrstatus = 0;

yynerrs = 0;

yychar = YYEMPT Y;

yyssp = yyss;

yyvsp = yyvs;

goto yysetstate; yynewstate:

/* In all cases, when you get here,

the value and location stacks

have just been pushed. so

pushing a state here evens the

stacks.

*/

yyssp++;

yysetstate:

*yyssp = yystate;

if (yyss + yystacksize - 1 <=

yyssp)

{

/* Get the current used size

of the three stacks, in elements. */

YYSIZE_T yysize = yyssp -

yyss + 1;

#ifdef yyoverflow

{

/* Give user a chance to

reallocate the stack. Use copies of

these so that the &'s

don't force the real ones into

memory. */

YYSTYPE *yyvs1 = yyvs;

short *yyss1 = yyss;

/* Each stack pointer

address is followed by the size of

the

data in use in that stack,

in bytes. This used to be a

conditional around just

the two extra args, but that might

be undefined if

yyoverflow is a macro. */

yyoverflow ("parser stack

overflow",

&yyss1, yysize

* sizeof (*yyssp),

&yyvs1, yysize

* sizeof (*yyvsp),

&yystacksize);

yyss = yyss1;

yyvs = yyvs1;

}

#else /* no yyoverflow */

# ifndef YYST ACK_RELOCATE

goto yyoverflowlab;

# else

/* Extend the stack our own

way. */

if (YYMAXDEPT H <=

yystacksize)

goto yyoverflowlab;

yystacksize *= 2;

if (YYMAX DEPT H <

yystacksize)

yystacksize =

YYMAXDEPTH;

{

short *yyss1 = yyss;

union yyalloc *yyptr =

(union yyalloc *)

YYST ACK_ALLOC

(YYST ACK_BYT ES

(yystacksize));

if (! yyptr)

goto yyoverflowlab;

YYST ACK_RELOCATE

(yyss);

YYST ACK_RELOCATE

(yyvs);

# undef YYST ACK_RELOCATE

if (yyss1 != yyssa)

YYST ACK_FREE

(yyss1);

}

# endif

#endif /* no yyoverflow */

yyssp = yyss + yysize - 1;

yyvsp = yyvs + yysize - 1;

YYDPRINTF ((stderr,

"Stack size increased to %lu\n",

(unsigned long

int) yystacksize));

if (yyss + yystacksize - 1 <=

yyssp)

YY ABORT;

}

YYDPRINTF ((stderr, "Entering

state %d\n", yystate));

goto yybackup;

yybackup:

/* Do appropriate processing given

the current state. */

/* Read a lookahead token if we

need one and don't already have one.

*/

/* yyresume: */

/* First try to decide what to do

without reference to lookahead

token. */

yyn = yypact[yystate];

if (yyn == YYPACT_NINF)

goto yydefault;

/* Not known => get a lookahead

token if don't already have one. */

/* YYCHAR is either YYEMPT Y

or YYEOF or a valid lookahead

symbol. */

if (yychar == YYEMPT Y)

{

YYDPRINTF ((stderr,

"Reading a token: "));

yychar = YYLEX;

}

if (yychar <= YYEOF)

{

yychar = yytoken = YYEOF;

YYDPRINTF ((stderr, "Now

at end of input.\n"));

}

else

{

yytoken = YYTRANSLATE

(yychar);

YYDSYMPRINTF ("Next

token is", yytoken, &yylval,

&yylloc);

}

/* If the proper action on seeing

token YYT OKEN is to reduce or to

detect an error, take that

action. */

yyn += yytoken;

if (yyn < 0 || YYLAST < yyn ||

yycheck[yyn] != yytoken)

goto yydefault;

yyn = yytable[yyn];

if (yyn <= 0)

{

if (yyn == 0 || yyn ==

YYT ABLE_NINF)

goto yyerrlab;

yyn = -yyn;

goto yyreduce;

}

if (yyn == YYFINAL)

YYACCEPT;

/* Shift the lookahead token. */

YYDPRINTF ((stderr, "Shifting

token %s, ", yytname[yytoken]));

/* Discard the token being shifted

unless it is eof. */

if (yychar != YYEOF)

yychar = YYEMPTY;

*++yyvsp = yylval;

/* Count tokens shifted since

error; after three, turn off error

status. */

if (yyerrstatus)

yyerrstatus--;

yystate = yyn;

goto yynewstate;

/*-----------------------------------------

------------------.

| yydefault -- do the default action

for the current state. |

`-------------------------------------------

----------------*/

yydefault:

yyn = yydefact[yystate];

if (yyn == 0)

goto yyerrlab;

goto yyreduce;

/*-----------------------------.

| yyreduce -- Do a reduction. |

`-----------------------------*/

yyreduce:

/* yyn is the number of a rule to

reduce with. */

yylen = yyr2[yyn];

/* If YYLEN is nonzero,

implement the default value of the

action:

`$$ = $1'.

Otherwise, the following line

sets YYV AL to garbage.

This behavior is

undocumented and Bison

users should not rely upon it.

Assigning to YYV AL

unconditionally makes the

parser a bit smaller, and it avoids a

GCC warning that YYV AL

may be used uninitialized. */

yyval = yyvsp[1-yylen];

YY_REDUCE_PRINT (yyn);

switch (yyn)

{

case 3:

#line 39 "calc.y"

{printf("--> ");}

break;

case 4:

#line 40 "calc.y"

{yyerrok;printf("\n--> ");}

break;

case 7:

#line 45 "calc.y"

{

if(dflag==DEC_ON)printf(

"\t=%g\n--> " , yyvsp[0] );

else

if(dflag==HEX_ON)printf( "\t=0x%

08X\n--> " , (BIGINT)yyvsp[0] );

else

printf( "\t=0%o\n--> " ,

(BIGINT)yyvsp[0] );

}

break;

case 8:

#line 50 "calc.y"

{

i=(int)yyvsp[-2]; reg[i] = yyvsp[0] ;

if(dflag==DEC_ON)

printf( "\t%c=%g\n--> " ,

'a'+i,reg[i] );

else if(dflag==HEX_ON)

printf( "\t%c=0x%08X\n--> " ,

'a'+i,(BIGINT)reg[i] );

else printf( "\t%c=0%o\n--> " ,

'a'+i,(BIGINT)reg[i] );

}

break;

case 9:

#line 58 "calc.y"

{ yyval = yyvsp[-2] + yyvsp[0] ; }

break;

case 10:

#line 59 "calc.y"

{ yyval = yyvsp[-2] - yyvsp[0] ; }

break;

case 11:

#line 60 "calc.y"

{ yyval = yyvsp[-2] * yyvsp[0] ; }

break;

case 12:

#line 61 "calc.y"

{ yyval = yyvsp[-2] / yyvsp[0] ; }

break;

case 13:

#line 62 "calc.y"

{ yyval = (BIGINT)yyvsp[-2] % (BIGINT)yyvsp[0] ; }

break;

case 14:

#line 63 "calc.y"

{ yyval = (BIGINT)yyvsp[-2] & (BIGINT)yyvsp[0] ; }

break;

case 15:

#line 64 "calc.y"

{ yyval = (BIGINT)yyvsp[-2] | (BIGINT)yyvsp[0] ; }

break;

case 16:

#line 65 "calc.y"

{ yyval = (BIGINT)yyvsp[-2] ^ (BIGINT)yyvsp[0] ; }

break;

case 17:

#line 66 "calc.y"

{ yyval = (BIGINT)yyvsp[-2] << (BIGINT)yyvsp[0] ; }

break;

case 18:

#line 67 "calc.y"

{ yyval = (BIGINT)yyvsp[-2] >> (BIGINT)yyvsp[0] ; }

break;

case 19:

#line 68 "calc.y"

{ yyval = (BIGINT)yyvsp[-2] && (BIGINT)yyvsp[0] ; }

break;

case 20:

#line 69 "calc.y"

{ yyval = (BIGINT)yyvsp[-2] || (BIGINT)yyvsp[0] ; }

break;

case 21:

#line 70 "calc.y"

{ yyval = yyvsp[-2]

break;

case 22:

#line 71 "calc.y"

{ yyval = yyvsp[-2]>yyvsp[0]?1:0; }

break;

case 23:

#line 72 "calc.y"

{ yyval = yyvsp[-1] ; }

break;

case 24: #line 73 "calc.y"

{ yyval = -yyvsp[0] ; }

break;

case 25:

#line 74 "calc.y"

{ yyval =

~((BIGINT)yyvsp[0]); }

break;

case 26:

#line 75 "calc.y"

{ yyval

= !( (BIGINT)yyvsp[0] ) ; }

break;

case 27:

#line 76 "calc.y"

{ yyval = yyvsp[0] ; }

break;

case 28:

#line 77 "calc.y"

{ ival=(int)yyvsp[0];yyval =

reg[ival] ; }

break;

case 29:

#line 78 "calc.y"

{ yyval =sin(yyvsp[0]) ; }

break;

case 30:

#line 79 "calc.y"

{ yyval =cos(yyvsp[0]) ; }

break;

case 31:

#line 80 "calc.y"

{ yyval =tan(yyvsp[0]) ; }

break;

case 32:

#line 81 "calc.y"

{ yyval =log(yyvsp[0]) ; }

break;

case 33:

#line 82 "calc.y"

{ yyval =abs(yyvsp[0]) ; }

break;

case 34:

#line 83 "calc.y"

{ yyval =sqrt(yyvsp[0]) ; }

break;

case 35:

#line 86 "calc.y"

{ exit(0); }

break;

case 36:

#line 87 "calc.y"

{ printf("\033[2J\033[1;1H\n-->

"); }

break;

case 37:

#line 88 "calc.y"

{ dflag=HEX_ON; printf(">>

Hex display mod on!\n--> "); }

break;

case 38:

#line 89 "calc.y"

{ dflag=DEC_ON; printf(">>

Dec display mod on!\n--> "); }

break;

case 39:

#line 90 "calc.y"

{ dflag=OCT_ON; printf(">>

Oct display mod on!\n--> "); }

break;

case 40:

#line 91 "calc.y"

{

for(i=0;i<26;i++)

{

if(dflag==DEC_ON)printf("\t%c=%

g\n",'a'+i,reg[i]);

else

if(dflag==HEX_ON)printf("\t%c=0

x%08X\n",'a'+i,(BIGINT)reg[i]);

else

printf("\t%c=0%o\n",'a'+i,(BIGINT)

reg[i]);

}

printf("--> ");

}

break;

case 41:

#line 100 "calc.y"

{ for(i=0;i<26;i++)reg[i]=0;

printf(">>All registers erased!\n-->

");}

break;

case 42:

#line 101 "calc.y"

{

printf(">>

COMMANDS:\n");

printf(">

help: Display this help section.\n");

printf(">

clear: Clear the screen.\n");

printf(">

dec: Decimal mode to display

numbers or registers.\n");

printf(">

hex: Hexadecimal mode to display

numbers or registers.\n");

printf(">

oct: Octal mode to display numbers

or registers.\n");

printf(">

list: List the values in the 26

registers which are ranged from

'a'/'A' to 'z'/'Z'.\n");

printf(">

erase: Reset all registers to 0.\n");

printf(">

exit: Quit this program.\n");

printf("-->

");

}

break;

}

/* Line 999 of yacc.c. */

#line 1349 "y.tab.c"

yyvsp -= yylen;

yyssp -= yylen;

YY_ST ACK_PRINT (yyss,

yyssp);

*++yyvsp = yyval;

/* Now `shift' the result of the

reduction. Determine what state

that goes to, based on the state

we popped back to and the rule

number reduced by. */

yyn = yyr1[yyn];

yystate = yypgoto[yyn -

YYNT OKENS] + *yyssp;

if (0 <= yystate && yystate <=

YYLAST && yycheck[yystate] ==

*yyssp)

yystate = yytable[yystate];

else

yystate = yydefgoto[yyn -

YYNT OKENS];

goto yynewstate;

/*------------------------------------.

| yyerrlab -- here on detecting error |

`------------------------------------*/

yyerrlab:

/* If not already recovering from

an error, report this error. */

if (!yyerrstatus)

{

++yynerrs;

#if YYERROR_VERBOSE

yyn = yypact[yystate];

if (YYPACT_NINF < yyn

&& yyn < YYLAST)

{

YYSIZ E_T yysize = 0;

int yytype =

YYTRANSLAT E (yychar);

const char* yyprefix;

char *yymsg;

int yyx;

/* Start YYX at -YYN if

negative to avoid negative indexes

in

YYCHECK. */

int yyx begin = yyn < 0 ?

-yyn : 0;

/* Stay within bounds of

both yycheck and yytname. */

int yychecklim =

YYLAST - yyn;

int yyxend =yychecklim

< YYNT OKENS ? yychecklim :

YYNT OKENS;

int yycount = 0;

yyprefix = ", expecting ";

for (yyx = yyx begin; yyx

< yyxend; ++yyx)

i f (yycheck[yyx + yyn]

== yyx && yyx != YYTERROR)

{

yysize += yystrlen

(yyprefix) + yystrlen (yytname

[yyx]);

yycount += 1;

if (yycount == 5)

{

yysize = 0;

break;

}

}

yysize += (sizeof ("syntax

error, unexpected ")

+ yystrlen

(yytname[yytype]));

yymsg = (char *)

YYST ACK_ALLOC (yysize);

if (yymsg != 0)

{

char *yyp =

yystpcpy (yymsg, "syntax error,

unex pected ");

yyp = yystpcpy (yyp,

yytname[yytype]);

if (yycount < 5)

{

yyprefix = ",

expecting ";

for (yyx =

yyx begin; yyx < yyxend; ++yyx)

i f

(yycheck[yyx + yyn] == yyx &&

yyx != YYTERROR)

{

yyp =

yystpcpy (yyp, yyprefix);

yyp =

yystpcpy (yyp, yytname[yyx]);

yyprefix = "

or ";

}

}

yyerror (yymsg);

YYST ACK_FREE

(yymsg);

}

else

yyerror ("syntax error;

also virtual memory exhausted");

}

else

#endif /* YYERROR_V ERBOSE */

yyerror ("syntax error");

}

if (yyerrstatus == 3)

{

/* If just tried and failed to reuse lookahead token after an

error, discard it. */

/* Return failure if at end of input. */

if (yychar == YYEOF)

{

/* Pop the error token. */

YYPOPST ACK;

/* Pop the rest of the stack. */

while (yyss < yyssp)

{

YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);

yydestruct (yystos[*yyssp], yyvsp);

YYPOPST ACK;

}

YY ABORT;

}

YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);

yydestruct (yytoken, &yylval);

yychar = YYEMPTY;

}

/* Else will try to reuse lookahead token after shifting the error

token. */

goto yyerrlab1;

/*-----------------------------------------

-----------.

| yyerrlab1 -- error raised explicitly

by an action. |

`-------------------------------------------

---------*/

yyerrlab1:

yyerrstatus = 3; /* Each real

token shifted decrements this. */

for (;;)

{

yyn = yypact[yystate];

if (yyn != YYPACT_NINF)

{

yyn += YYTERROR;

if (0 <= yyn && yyn <=

YYLAST && yycheck[yyn] ==

YYT ERROR)

{

yyn = yytable[yyn];

if (0 < yyn)

break;

}

}

/* Pop the current state

because it cannot handle the error

token. */

if (yyssp == yyss)

YY ABORT;

YYDSYMPRINTF ("Error:

popping", yystos[*yyssp], yyvsp,

yylsp);

yydestruct (yystos[yystate],

yyvsp);

yyvsp--;

yystate = *--yyssp;

YY_ST ACK_PRINT (yyss,

yyssp);

}

if (yyn == YYFINAL)

YYACCEPT;

YYDPRINTF ((stderr, "Shifting

error token, "));

*++yyvsp = yylval;

yystate = yyn;

goto yynewstate;

/*-------------------------------------.

| yyacceptlab -- YY ACCEPT comes

here. |

`-------------------------------------*/

yyacceptlab:

yyresult = 0;

goto yyreturn;

/*-----------------------------------.

| yyabortlab -- YY ABORT comes

here. |

`-----------------------------------*/

yyabortlab:

yyresult = 1;

goto yyreturn;

#ifndef yyoverflow

/*-----------------------------------------

-----.

| yyoverflowlab -- parser overflow

comes here. |

`-------------------------------------------

---*/

yyoverflowlab:

yyerror ("parser stack overflow");

yyresult = 2;

/* Fall through. */

#endif

yyreturn:

#ifndef yyoverflow

if (yyss != yyssa)

YYST ACK_FREE (yyss);

#endif

return yyresult;

}

#line 115 "calc.y"

int yyerror(char *str)

{

fprintf(stderr,"Error: %s\n",str);

return 1;

}

int yywrap()

{

return 1;

}

int main()

{

yyparse();

}

程序运行截图:

c语言程序设计课程计算器设计报告

课程设计说明书 题目计算器程序设计 起讫日期2006 年7月3日至2006 年8月6日 所在院系软件学院 专业机械+软件班级04-2 学生姓名偶偶哦学号 指导教师 2006年8 月日

摘要 当今社会是信息社会,科技经济高速发展的社会!为了更方便人们的工作生活和加速人们处理信息的速度,计算器应运而生。由于它体积小巧,携带方便,价格便宜,构造简单等诸多的优点成为人们生活中的必备品! 随着科技的发展计算器的种类变得更多,功能变得更强大,体积变得更小!电脑的出现改变人们的生活习惯,很多事情都可以电脑来完成!电脑的更大一个优点就是可以通过软件的应用无限的延伸电脑功能的外延!下面我们将用我们学习的c语言编写一个简易的计算器程序!实现简单的初步的计算功能! 本程序的编写基础是Tubro C2.0汉化版,它在tubro c的原有基础上实现了多汉字的支持方便了我们的使用。生成的程序可移植性强兼容性好稳定!现在只实现了加、减、乘、除、求幂、求模,求平方根,求Sin,求Cos,求Log10,以及一个时钟原代码。这个系统是基于软件发展的生命周期来研制的,它可以直接输入数学表达式,不需要任何转换,就可以直接输出数学四则运算的结果。但是,每次只能运算一个表达式。不能运算多个表达式。在程序里面在添加一组选择函数即可。本论文主要介绍了本课题的开发背景,开发的过程和所要完成的功能。重点的说明了系统设计思想,设计的步骤、难点技术和解决方案。 关键词:C语言T ubro c 2.0汉化版计算器时钟

目录 第一章综述 (1) 1.1 课题的现实意义 (1) 1.2 软件环境 (1) 1.3 硬件环境 (1) 第二章系统设计流程图 (2) 2.1 系统流程图 (2) 2.2 主要功能表 (2) 第三章系统分析和设计 (3) 3.1 图形的绘制和输出 (3) 3.2 文本的输出显示 (3) 3.3 计算函数的调用 (4) 3.4 程序的运行和退出 (5) 第四章系统测试 (6) 4.1 系统测试 (6) 4.2 调试 (6) 4.3 错误原因分析一 (6) 4.4 错误原因分析二 (6) 第五章用户使用说明书 (8) 5.1 运行Turbo C程序进入计算器界面 (8) 5.2 计算器的使用 (9) 5.3 退出程序 (9) 第六章工作总结 (10) 参考文献 (11) 附录: 源代码

模拟简单计算器实训

苏州市职业大学 课程设计说明书 名称___模拟简单计算器_______________ 2011 年12月26 日至2011年12月31 日共1 周 院系__ 计算机工程系 班级10嵌入式 姓名 系主任____李金祥 教研室主任刘文芝 指导教师徐丽华、刘文芝

目录 一.课程设计的目的与要求 (2) 1.课程设计的目的 (2) 2.课程设计的要求 (2) 二.题目说明 (2) 2.1开发背景 (3) 2.2 开发工具介绍 (4) 2.3 小组成员分工 (4) 三.硬件方案 (5) 3.1硬件设计 (5) 3.2电路原理图 (7) 四.软件设计 (8) 4.1 模块划分 (8) 4.2 模块结构图 (9) 4.3 液晶显示模块 (9) 4. 4 定时器模块 (6) 五.运行结果分析与系统改进 (10) 六.遇到的问题和解决方法 (11) 七.课程设计总结 (11) 八.参考文献 (11)

一.课程设计的目的与要求 1.课程设计的目的 《单片机原理与应用》是一门专业技术基础课,是一门实践性很强的课,单片机课程设计要求将所学的理论知识通过实践加强理解和认识,提高学生们对单片机的认识,同时提高同学们的设计能力和实践动手能力。 同时《单片机原理与应用》也是一门应用性很强的专业课,其理论与实践技能是从事嵌入式专业技术工作的人员所不可少的。本次课程设计选择AW60实验板进行模拟应用设计与开发,要求学生掌握使用 C 语言进行单片机程序设计和调试的方法,提高综合运用所学的理论知识独立分析和解决问题的能力。同时也为了提高学生的学习能力,锻炼同学之间的合作能力。 2.课程设计的要求 在本课程设计过程中要求学生:重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;按照课程设计的题目要求,独立地完成各项任务,不允许相互抄袭;按时到机房上机,并接受教师的检查。 认真编写课程设计报告。 课程设计可以由2~4名同学合作完成一个课题。全体成员应共同完成选题,确定设计思想,进行功能模块划分,然后由组长为各成员分配任务。 整个设计期间,组长负责协调工作。各小组成员明确自己的任务后,应独立完成设计、编码和调试。 课题设计完成后,小组成员要理解同组其他成员设计的源程序,熟练操作本组设计,各自完成课程设计说明书。 1、对系统进行功能需求分析; 2、设计合理的模块结构和系统框架; 3、编程简练,程序功能齐全,能正确运行; 4、说明书、流程图要清楚; 5、课题完成后必须按要求提交课程设计报告;

C语言程序设计之简单计算器

攀枝花学院 学生课程设计(论文) 题目:简易计算器 学生姓名:葛肪瑜学号:201010801018 所在院(系):计算机学院 专业:计算机科学与技术 班级:10计本(1)班 指导教师:陈三清职称:讲师 2011年6月25日 攀枝花学院教务处制

攀枝花学院本科学生课程设计任务书 题目计算器的设计 1、课程设计的目的 本课程设计的目的和任务:(1)巩固和加深学生对C语言课程的基本知识的理解和掌握;(2)掌握C语言编程和程序调试的基本技能;(3)利用C语言进行简单软件设计的基本思路和方法;(4)提高运用C语言解决实际问题的能力。 2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等) 一、用C实现如下功能: 使用C语言编写一个类似于Windows附件提供的计算器软件,实现计算器的基本功能,能进行浮点数的加、减、乘、除、乘方和求模运算。 二、撰写课程设计报告或课程设计总结课程设计报告要求:总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。 3、主要参考文献 [1] 潭浩强,《C程序设计》,清华大学出版社 [2] 王声决,《C语言程序设计》,中国铁道出版社 [3] 潭浩强,《C程序设计题解与上机指导》,清华大学出版社 [4] 刘玲等,《C语言程序设计应用教程》,西南师范大学出版社 4、课程设计工作进度计划 第1天完成方案设计与程序框图 第2、3天编写程序代码 第4天程序调试分析和结果 第5天课程设计报告和总结 指导教师(签字)日期年月日 教研室意见: 年月日 学生(签字): 接受任务时间:年月日注:任务书由指导教师填写。

计算器程序设计报告

题目一计算器 1.1 题目简介 用Java语言、MyEclipse工具、设计一个GUI简易计算器,编写计算器的基本运算的程序,用户可以通过鼠标一次输入参加计算的数值,进行加减乘除等混合运算,基本实现计算器的四则运算和三角函数运算功能以及开方和求对数的基本运算。本计算器只适用十进制的运算,不限制十进制的大小。编写本计算器运用java的类得调用和直接在程序中定义类,实现计算器的基本功能,在这个计算器中对于执行的操作可以进行复制和保存以便以后能直接查看运行结果本计算器保存没不得运行结果,只有点清除键是才可以清除每步的结果。 1.2 设计的内容、要求和目标 设计内容:设计一个GUI简易计算器,用户可以通过鼠标一次输入参加计算的数值,进行加减乘除等混合运算。 设计要求:由于现代用户更倾向于由鼠标方便操作的图形用户界面,所以我们采用GUI来实现计算器,并采用Swing组件,AWT事件来处理等实现具体功能。 (1)、应具有相应的界面,可参考下图进行设计:

(2)、操作符号定为:“+”“-”,“*”,“/”等。 (3)、用户通过点击面板中的各种组件输入的表达式,应在上方文本框。 (4)、党用户点击“=”时,文本框中之前的内容应清空,直接显示表达式运算结果。例如:输入表达式“7*8”之后按“=”,显示结果“56”。 (5)、具有菜单栏,内有相应的编辑“复制”、“粘贴”等菜单,提供相应的功能。 设计目标:利用Java语言设计一个简单的计算器,以实现基本的加减乘除功能,还有sin、|cos、tan、log等算术运算;同时实现退格、清零等运算。 1.3总体设计 1)、对计算器面板的整体布局 首先是对计算器的整体面板进行一个简单的设计,整体布局是采用layout (边框布局)布局,对计算器中的一些数字按钮和运算符按钮采用gridlayout 布局(网格布局)。 2)、创建实现程序所需的类 整理思路,确定一个主类CalculatorWindow,然后对Dialog、HandleBack、HandleClear、HandleCos、HandleCot、HandleSin、HandleTan、HandleDigit、HandleDot、HandleDownNumber、HandleEquality、HandleLog、HandleOperation、HandlePOrN、HandlePositiveOrNegative、NumberButton、OperationButton、SelectJTree等类的创建。 3)、对所创建类算法的分析和实现 确定了主类CalculatorWindow,其他类为其所调用。编写各类的实现算法,增加面板所需的按钮,并对程序进行调试运行及分析。

最新计算机模拟试卷操作题答案

模拟卷1 三、简答题: 1、外存存储器有哪些?内存分哪两种?P13、15 答:外存存储器包括软盘、硬盘、光盘、U盘等。内存分只读存储器ROM和随机存取存储器RAM。 2、计算机网络的分类(按网络覆盖的范围)?P230 答:局域网、城域网、广域网和互联网。 3、常见的视频文件格式有哪些(至少四种)?P343-344 答:视频格式有:.avi格式、.mpg格式、.rm格式和.mov格式。 4、Windows操作题目(写出关键步骤) (1)在桌面上建立AA文件夹,在AA文件夹建立一个名为“JSB”的快捷方式,该快捷方式所指向的对象为“记事本”程序。(记事本程序的文件为 “C:\WINDOWS\system32\notepad.exe”) 步骤:在桌面空白处右击—选择新建文件夹,重命名为“AA”,打开“AA”文件夹,右击选择创建快捷方式,在“浏览”中找到 “C:\WINDOWS\system32\notepad.exe”,点下一步,名称输入“JSB”,完成即可。 (2)将CC文件夹中的“Excel”和“Word ”两个文件夹复制到AA文件夹中,并将“Excel”改名为“TEST”,并将其设置为隐藏属性。 步骤:打开“cc”文件夹,按住“ctrl”键选中“excel”和“word”两个文件夹,右击选择“复制”,打开“AA”文件夹,右击粘贴。在“excel”文件上右击,重命名为“TEST”,右击选择属性,在常规选项卡中,将属性改为“隐藏”。 5、WORD操作题目(6分) (1)修改Word文档中的文字字符的字体、颜色、大小,可以使用哪两种不同的方法实现?P90 答:通过“格式”工具栏和通过菜单“格式”—“字体”命令。 (2)修改文档中的首行缩进2个字符,有哪两种方法实现?P91 答:方法一:选中待修改的文档,把窗口上方的标尺左上的那个小三角往右方移动两个字符的距离,即可。 方法二:选中待修改的文档,右击——段落,在对话框内,特殊格式选择首行缩进,度量值输入2字符,即可。 (3)Word中的哪些对象可以图文混排的? 答:图片、图形,艺术字、文本框等(不确定) 6、EXCEL题目(6分) (1)列举几种Excel中的函数?p156 答:有数学(数值计算)函数、统计函数、逻辑函数、日期与时间函数、财务函数、文本函数等。 (2)列举几种对工作表的操作有哪些?p151 答:选择工作表插入工作表删除工作表移动和复制工作表重命名工作表

c面向对象程序设计MFC简单计算器实验报告

计算机与信息工程学院 《程序设计基础》课程设计报告 题目名称:60.编写一个能实现简单功能的计算器学生姓名:刘沛东 学生学号:2011508154 专业班级:电子信息工程(1)班 指导教师:高攀

1 课程设计的题目 编写一个能实现简单功能的计算器 2 题目要求 1. 有一个计算器图形。 2. 能实现加、减、乘、除及乘方的运算。 3. 当输入题目时,屏幕上要在指定位置上显示出相应的题目内容,且相应的数字键要改变颜色 例如:输入数字1 时,在计算器图形上的1键变为红色。 4. 屏幕、图形颜色、形状自定 3 总体设计 3.1 总体框架 图1 系统框架

3.2 系统功能说明 在VC++6.0中绘制计算器界面,各控件的设置 对0~9控件设定相应的ID和其他属性: 图2 “1”控件设置 对“+、-、*、\”控件设定相应的ID和其他属性: 图2 “+”控件设置 对其它控件设定相应的ID和其他属性: 图3 其它控件设置

主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。 4 程序详细设计 4.1系统主调模块 图5 程序流程图

4.2各模块详细设计 4.2.1 建立的变量,控件的命名,对应的消息处理函数对应表 double poz; //保存小数点的位置,初始化为1,表示poz-1个小数点。 double m_Dis; //Edit控件上需要显示的数字 BOOL point_flag; //小数点表示位,判定是否是小数,是小数为1,不是小数为0。 double numfirst; //保存计算过程中的前一个数字, double numsecond;//保存计算过程中的第二个数字 char op;//记录当前的计算符号,可以为’+’,’-’,’*’,’/’,’=’,’c’,’n’ 变量初始化: poz=1; m_Dis = 0.0; numfirst=0; numsecond=0; op=0;

《计算器程序设计》课程设计

成都理工大学 C#计算器 课程设计报告(计算机科学与技术学院) 题目:计算器 班级:XX 姓名:XXX 指导教师:XXX 2013-2014学年度第二学期

目录 1.需求分析 (1) 1.1计算器应用软件的功能分析(二级标题,四号黑体) (1) 1.2计算器软件的功能图 (1) 2.界面设计 (1) 3.功能实现 (2) 3.1计算数字现实的功能代码 (2) 3.2小数点设置的功能代码 (3) 3.3连续运算的功能代码 (3) 3.4实现键盘控制的功能代码 (4) 3.5删除的功能代码 (5) 4.设计总结 (5) 参考文献 (6)

计算器的开发与应用 摘要:计算器的产生和发展是建立在电子计算机基础之上的,现代社会很需要一个健全、高效率的计算器。为了提高自己的实践能力和将来开发一个更实用更全能更智能的计算器,以设计与实现计算器为课题。此次设计的计算器应用软件从visual studio 2012编程环境中开发,是一个简单的窗体应用程序,实现简单的计算器功能。以微软自带的计算器为模板,设计了简单易懂的计算器。这款计算器不仅实现了简单的四则运算的功能,还能连续运算,实现小键盘的操作,光标的转移。虽然这个简单的计算器只能实现这些功能,但是具有简洁的图文外观,即时准确的获得所需要要计算的结果,充分降低了数字计算器的难度和所需要的时间,对人们生活和学习具有有很大的帮助。 关键词:计算器;功能;界面;窗口;事件。 1.需求分析 通过对微软附件计算器软件进行调研、分析,研究,使用。我们了解到了作为一个计算器所应该有的一些简单功能和界面的排版,我们知道了怎样使编写的计算器程序向微软附件计算器靠拢。 1.1计算器应用软件的功能分析 计算器软件的主要功能是: 1)可以显示计算数字 2)可以进行加减乘除四则运算 3)可以实现键盘操控的功能 4)可以进行清零运算 5)可以进行退格键运算 6)可以进行连续计算 1.2计算器软件的功能图 根据以上需求分析,计算器软件功能如图1-1所示。 2.界面设计计算器主界面 显示 计算 数字 连 续 计 算 功 能图1-1计算器功能图 进 行 四 则 运 算 键 盘 操 控 清 零 运 算 退 格 键 功 能

简单计算器c++课程设计讲解

简单计算器 1 基本功能描述 简单计算器包括双目运算符和单目运算符。双目运算符包含基本的四则运算及乘幂功能,单目运算符包含正余弦、阶乘、对数、开方、倒数等运算。可对输入任意操作数包含小数和整数及正数和负数进行以上的所有运算并能连续运算。出现错误会给出提示,同时包含清除、退格、退出功能以及有与所有按钮相对应的菜单项。 2 设计思路 如图1,是输入数据子函数的流程图。打开计算器程序,输入数据,判断此次输入之前是否有数字输入,如果有,则在之前输入的数字字符后加上现有的数字字符;如果没有,则直接使编辑框显示所输入的数字字符。判断是否继续键入数字,如果是,则继续进行前面的判断,如果否,则用UpdateData(FALSE)刷新显示。 如图2,是整个计算器的流程图。对于输入的算式,判断运算符是双目运算符还是单目运算符。如果是双目运算符,则把操作数存入数组a[z+2]中,把运算符存入b[z+1]中;如果是单目运算符,则把字符串转化为可计算的数字,再进行计算。下面判断运算符是否合法,如果合法,则将结果存入a[0],不合法,则弹出对话框,提示错误。结束程序。

输入一个数字 在之前输入的数字字符后面加上现在的数字字符。 Eg :m_str+=”9”。 直接使编辑框显示所输入的数字字符。 Eg :m_str=”9”。 pass3=1表示已有数字输入 开始 之前是否有数字输入? pass3==1? 继续键入数字? 用UpdateData(FALSE)刷新显示 图1 输入数据子函数流程图 Y N Y N

输入开始 双目运算符 是否每一个操作数都存入a[]数组? 把操作数存入a[z+2],把运算符存入b[z+1]。 单目运算符 将字符串转换 为可计算的数进行运算 运算是否合法? 将结果存入a[0] 弹出对话框提示错误 结束Y Y N N 图2 简单计算器总流程图

编译原理

一、选择 1.将编译程序分成若干个“遍”是为了_使程序的结构更加清晰__。 2.正规式 MI 和 M2 等价是指__.M1 和 M2 所识别的语言集相等_。 3.中间代码生成时所依据的是 _语义规则_。 4.后缀式 ab+cd+/可用表达式__(a+b)/(c+d)_来表示。 6.一个编译程序中,不仅包含词法分析,_语法分析 ____,中间代码生成,代码优化,目标代码生成等五个部分。 7.词法分析器用于识别__单词___。 8.语法分析器则可以发现源程序中的___语法错误__。 9.下面关于解释程序的描述正确的是__解释程序的特点是处理程序时不产生目标代码 ___。 10.解释程序处理语言时 , 大多数采用的是__先将源程序转化为中间代码 , 再解释执行___方法。 11.编译过程中 , 语法分析器的任务就是__(2)(3)(4)___。 (1) 分析单词是怎样构成的 (2) 分析单词串是如何构成语句和说明的 (3) 分析语句和说明是如何构成程序的 (4) 分析程序的结构 12.编译程序是一种__解释程序__。 13.文法 G 所描述的语言是_由文法的开始符号推出的所有终极符串___的集合。 14.文法分为四种类型,即 0 型、1 型、2 型、3 型。其中 3 型文法是___正则文法__。 15.一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组 _产生式__。 16.通常一个编译程序中,不仅包含词法分析,语法分析,中间代码生成,代码优化,目标代码生成等五个部分,还应包括_表格处理和出错处理__。 17.文法 G[N]= ( {b} , {N , B} , N , {N→b│ bB , B→bN} ),该文法所描述的语言是L(G[N])={b2i+1│ i ≥0} 18.一个句型中的最左_简单短语___称为该句型的句柄。 19.设 G 是一个给定的文法,S 是文法的开始符号,如果 S->x( 其中 x∈V*), 则称 x 是 文法 G 的一个__句型__。 21.若一个文法是递归的,则它所产生的语言的句子_是无穷多个___。 22.词法分析器用于识别_单词_。 23.在语法分析处理中, FIRST 集合、 FOLLOW 集合、 SELECT 集合均是_终极符集 ___。 24.在自底向上的语法分析方法中,分析的关键是_寻找句柄 ___。 25.在 LR 分析法中,分析栈中存放的状态是识别规范句型__活前缀__的 DFA 状态。 26.文法 G 产生的__句子___的全体是该文法描述的语言。 27.若文法 G 定义的语言是无限集,则文法必然是 __递归的_ 28.四种形式语言文法中,1 型文法又称为 _短语结构文法__文法。 29.一个文法所描述的语言是_唯一的__。 30. _中间代码生成___和代码优化部分不是每个编译程序都必需的。 31._解释程序和编译程序___是两类程序语言处理程序。 32.数组的内情向量中肯定不含有数组的_维数___的信息。 33. 一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组__D___。 34.文法分为四种类型,即 0 型、1 型、2 型、3 型。其中 2 型文法是__上下文无关文法__。 35.一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组 __产生式___。 36.__ BASIC ___是一种典型的解释型语言。 37.与编译系统相比,解释系统___比较简单 , 可移植性好 , 执行速度慢__。 38.用高级语言编写的程序经编译后产生的程序叫__目标程序___。 39.编写一个计算机高级语言的源程序后 , 到正式上机运行之前,一般要经过__(1)(2)(3)__这几步: (1) 编辑 (2) 编译 (3) 连接 (4) 运行 40.把汇编语言程序翻译成机器可执行的目标程序的工作是由__编译器__完成的。 41.词法分析器的输出结果是__单词的种别编码和自身值__。 42.文法 G :S→xSx|y 所识别的语言是_ xnyxn(n≥0)___。 43.如果文法 G 是无二义的,则它的任何句子α__最左推导和最右推导对应的语法树必定相同_。 44.构造编译程序应掌握___源程序目标语言编译方法___。 45.四元式之间的联系是通过__临时变量___实现的。 46.表达式( ┐ A ∨B)∧(C∨D)的逆波兰表示为___ A ┐ B∨CD∨∧__。 47. 优化可生成__运行时间短且占用存储空间小___的目标代码。 48.下列__删除多余运算 ____优化方法不是针对循环优化进行的。 49.编译程序使用__说明标识符的过程或函数的静态层次___区别标识符的作用域。 50.编译程序绝大多数时间花在___表格管理__ 上。 51.编译程序是对__高级语言的翻译___。

my计算器程序设计报告

计算器程序设计报告 计算器是一种在日常生活中很常用的计算工具,它在计算方面给了我们提供很大的方便。本程序的功能包括:(1)加,减,乘,除运算,正弦,余弦,正切,余切,反正切,反余切,反正弦,反余弦,自然对数,以10为底的对数还有阶乘等函数功能。(2)还包括存储清,存储显示,存储相加。 “计算器”是一个关于多种控件,以及控件数组应用的程序,它包含许对字符串的处理,多模块程序设计,数学函数的使用。它所需知识点较多,必须对各个方面都有所了解. 数学模型:主界面 界面:进制转化界面 数学函数代码 代码:存储清代码 进制转化代码 第一步,要编辑计算器界面,如右图, 对于界面上的按钮较多,我们可以分成四组,这就是控件数组的使用,而且每个按钮的属性都一一设置,而且要调入图片.第二个界面如右图 比较简单,只是一些普通的控件. 计算器是一个输入原始数据,运算中间数据和结果数据都显示在窗口顶部的同一个文本框的工具,这就要求我们可以把文本框的内容付给两个不同的变量,对于这一点我们就可以用一个逻辑变量来实现.比如, If not boolean str1=str Else str2=str 计算器的主要功能就是运算,但是任何一个数值的输入都是以字符串的形式进行的,而字符串是无法参与运算的,所以必须用CInt()转换成整形变量,而输出时必须用CStr()转化成字符串的形式输出,更为麻烦的是,在进行进制转换时,两种变量之间的转换更为频繁。在编程过程中要时刻注意!就拿一个简单的程序中的一部分来说吧:

If not boolean then str=str1 Else str=str2 Str=text1.text n=CInt(str) ‘“将其转换成整形变量" ……. t4 =str( ) ‘“ 将返回值转换成字符串" 计算器的功能程序简单易懂,但编制过程极为烦琐,我在编程的过程中,体会最深的就是其过程有重复,但又不得再编,在这里尤其要注意,有些过程虽然相似,但它们却存在着质的区别,就拿删除按扭来说吧, "C","0->M","CE","->"按扭都有删除的功能,在这里我就它们的区别作一下详细介绍: 将"C","CE","->"作为一个控件数组,其程序如下: If not boolean str1=str else str2=str Select Case Index Case 0 str1=" ",str2=" ", Text1.text=" " "C"键 Case1 str=" " "CE"键 Case2 str=Left(str,len(str)-1) "->"键 而"0->M"在另一个数组控件中,其程序的一部分如下: Case0 n4=0: Text1.text="0" 可见它们的代码是存在区别的,这就要求在编程时弄清楚它们的区别,不可想当然把同一种代码复制过来. 这里我再介绍一下小数点的使用 Private Sub Command2_Click(Index As Integer) If Index<10 Then str=str+CStr(Index) "输入数字" Else If InStr(str,".")=0 Then str=str+"." "输入小数点" End If If Len(str)>1 And Left(str,1)="0" And Mid(str,2,1)<>"."Then str=Right(str,Len(str)-1) "删除前面多余的0" End If Text1.text=str "显示输入的数据 " If not boolean Then str1=str Else str2=str "用两个字符串变量存放" End Sub 计算器虽复杂,但大部分还是比较简单的,最难的地方就是进制转换器的编码了,要编好这一部分必须对各进制之间的转换关系了如指掌.其中各个进制都和二进制有着直接的转换关系.而其他三个之间都不可直接进行转换.对于不能直接转化的,可以间接转化,例如,可以将十六进制先转化成十进制然后再转化成八进制. ElseIf Option4 = True Then t4 = "" str = Text1.Text

(完整word版)C语言简易计算器课程设计.doc

C语言课程设计报告书题目:简易计算器 院系: 班级: 学号: 姓名:

摘要 该软件为用户提供在windows 系统上的简易计算器,能进行简单的加、减、 乘、除四则运算与混合运算。目的是为了巩固和加深 C 语言课程的基本知识的理 解和掌握,利用 C语言进行基本的软件设计,掌握 C 语言的编程和程序调试 的基本技能,掌握书写程序设计说明文档的能力,提高运用 C 语言解决实际问 题的能力。 关键词: C; 简易计算器 ; 程序 ; 基本算法;混合运算 SUMMARY the software provides a simple calculator in Windows system for users ,can be a simple add,subtract,multiply,divide.The purpose is to consolidate and deepen the basic knowledge of C language courses to understand and master, The use of C language for software design basic, To master the basic skills of C language programming and program debugging, Master the writing program design documentation ability,improve the ability to use C language to solve practical problems.

C#计算器程序设计

C#计算器程序设计 1)创建项目 ①单击文件-》新建-》项目,弹出如下对话框 ②模板中选择“windows窗体应用程序”-》名称中输入“jsq”-》位置单击“留了”-》选择“J:\新建文件夹”-》单击确定按钮 2)计算器界面设计

①向Form1中添加1个TextBox控件,1个Label控件和27个Button控件,控件布局如图所示 ②修改27个Button控件的Text属性,结果如图 ③Label控件的BorderStyle属性选择“Fixed3D”-》Text属性设置为“”-》Form1的Text属性设置为“计算器”-》Backspace控件、CE控件等的ForeColor属性选择“Red”,结果如图:

3)显示窗口数据对齐方式设置 TextBox控件的TextAlign属性选择“Right”;4)数字键程序设计 ①双击”0”按钮控件-》编写代码如下: if (textBox1.Text != "0")//不能连续多个0出现 { textBox1.Text += "0";//添加“0”数字 } ②双击”1”按钮控件-》编写代码如下: if (textBox1.Text == "0")//数字前面不能出现多个0 { textBox1.Text = "1"; } else { textBox1.Text += "1";//添加“1”数字 } ③双击”2”按钮控件-》编写代码如下: if (textBox1.Text == "0")//数字前面不能出现多个0 { textBox1.Text = "2"; } else { textBox1.Text += "2";//添加“2”数字 } ④双击”3”按钮控件-》编写代码如下: if (textBox1.Text == "0")//数字前面不能出现多个0 { textBox1.Text = "3";

简单计算器编程

计算器程序 包括4个数字按钮,1个小数点按钮,+-*/= 5个计算按钮 不接受键盘输入 计算规则:当前正在输入的数存储到字符串变量 用户输入操作符,存储已经输入的数,作为第一个数,存储操作符 用户输入第二个数 用户输入操作符,与第一个数计算,并存储为第一个数,存储操作符 小数点只能输入一次 1 创建基于对话框的程序 2 打开对话框模板,增加控件: 编辑框1个 按钮4个,文字1-4 按钮1个,文字:小数点 按钮5个,文字:+ - * / = 按钮1个,文字:关闭 3 打开类向导 为编辑框加成员变量,CString m_edit 为所有按钮加消息映射

注意:以上都加再对话框类中。 4 打开对话框类的声明,加成员变量 double m_result; //前面的结果,即第一个数 int m_opt; //前面的操作符,0=,1+,2-,3*,4/ int ,m_dot; //是否输入了小数点 CString m_string; //当前正在输入的数,存为字符串 5 继续在话框类,声明2个函数 void calculation(void); //执行计算 void NumInput(CString x) //执行数字按钮输入 6 打开函数OnInitDialog(),加初始化代码 m_result = 0; m_opt = 0; m_dot = 0; m_string = ""; 6 “关闭按钮”消息映射代码: OnOK(); 8 分别打开数字按钮1-4的消息映射函数,分别输入代码: NumInput("1");

NumInput("2"); NumInput("3"); NumInput("4"); 9 打开小数点按钮的消息映射函数,输入代码: if ( m_dot==0 ) { m_dot = 1; NumInput("."); } 10 分别打开 + - * / 按钮的消息映射函数,分别输入代码: calculation(); m_opt = 0; calculation(); m_opt = 1; calculation(); m_opt = 2; calculation();

基于编译原理的计算器设计与实现

基于编译原理的计算器设计与实现 首先看一下这个计算器的功能: CALC> set a = 1; b = 2 CALC> set c = 3 CALC> calc (10 + pow(b, c)) * sqrt(4) - 1 35.0 CALC> exit 如上所示,这个计算器的功能非常简单: 1.用set命令设置上下文中的变量。 2.用calc命令计算一个表达式的值。 3.用exit命令退出计算器。 我们把编译的重点放在calc命令后面的计算表达式的解析,其它的部分我们可以简单处理(如set命令可以这样简单处理:先按分号分隔得到多个赋值处理,再按等号分隔就可以在上下文中设置变量了,并不需要复杂的编译过程)。 如上的演示例子中,我们使用编译技术处理的部分是(10 + pow(b, c)) * sqrt(4) - 1,其它部分我们只使用简单的文本处理。 麻雀虽小,但五脏俱全,这个计算器包含编译技术中最必要的部分。虽然这次我们只是实现了一个计算器,但所使用的技术足以实现一个简单的脚本语言的解释器了。 这个计算器分为如下几个部分: 词法分析:把表达式的文本,解析成词法元素列表(tokenList)。 语法分析:把tokenList解析成语法树(syntaxTree)。 语义分析:把语法树转成汇编语言的代码(asm) 汇编器:把汇编代码翻译为机器码(字节码)。 虚拟机:执行字节码。 一般的编译步聚中不包含“汇编器”和“虚拟机”,而这里之所以包含这两个部分是因为:通常编译器会直接由中间代码生成机器码,而不是生成汇编代码,而这里我之所以要生成汇编代码的原因是“调试的时候汇编的可读性很好”,如果直接生成目标代码,则会非常难用肉眼来阅读。 自己实现虚拟机的原因是:现有的机器(包括物理机和虚拟机以及模拟器)的指令虽然也很丰富,但似乎都没有直接计算“乘方”或“开方”的指令,自已实现虚拟机可以任意设计计算指令,这样可以降低整个程序的复杂度。 因汇编器与虚拟机并不是编译原理的部分,所以下文中并不会描述其实现细节,但因为计算器代码编译后的目标代码就是汇编代码,所以需要把汇编指令做一下说明(以下把这个汇编语言简称为ASM)。

计算器java课程设计(完整版)

目录 一、课设任务及要求 (1) 二、需求分析 (2) 三、设计思路 (3) 四、详细设计 (4) 五、运行调试与分析讨论 (14) 六、设计体会与小结 (18) 七、参考文献 (19)

一、课设任务及要求 1)课设任务: ⑴、设计的计算器应用程序可以完成加法、减法、乘法、除法以及取余运算(可以进行浮点数和负数的运算); ⑵、有求倒数、退格和清零功能。 2)创新要求: 能进行正切、余弦,以及求平方根、指数(包括对e)、自然对数运算。 3)设计要求 ①设计的计算器应用程序可以完成加法、减法、乘法、除法和取余运算。且有小数点、正负号、求倒数、退格和清零功能。 ②课程设计可选用Eclipse、JBuilder、NetBeans等作为开发平台以提高开发效率,通过资料查阅和学习尽可能熟练掌握其中一种集成开发环境。 ③认真按时完成课程设计报告,课程设计报告内容包括:设计任务与要求、需求分析、设计思路、详细设计、运行调试与分析讨论和设计体会与小结六个部分。

二、需求分析 ⑴、开发的技术及功能 本课程设计是要做一个图形界面的计算器,其界面主要是由swing组件中的控件构成。程序实现了计算器的基本功能有:加、减、乘、除基本算术运算(可以进行浮点和负数运算)和sin、cos、tan等三角函数求值运算,同时能进行指数运算和自然对数运算,还有求倒数、退格和清零功能。 ⑵设计思路 设计这个计算器主要是参考Windows操作系统中自带的计算器,由于编者水平和时间的限制,不能将计算器设计到科学型及其他更复杂的类型,在设计过程中还参考了一些其他的优秀设计。但本计算器除了常用的加减乘除(可以进行浮点和负数运算)这些基本运算外,还有求余、求倒、退格、清零,甚至还能进行一些复杂科学的运算,比如余弦(cos)、正切(tan)、指数运算(pow)、自然对数运算(log)、求平方根(sqrt)以及对e的指数运算(exp),并且还能进行连续运算。总体上说来,本计算器设计简单,代码很少,程序很小,但功能却很强大,这是同类计算器所不具备的。 ⑶设计效果图 设计时先在设计界面中添加按钮等控件,后在按钮的actionPerformed 事件中添加代码完成其功能其中调用了Java类中的Math函数库以及各种字符串操作。设计的界面如下: 图1 计算器运行界面

模拟计算器程序-课程设计

模拟计算器 学生姓名:**** 指导老师:**** 摘要本课程设计的课题是设计一个模拟计算器的程序,能够进行表达式的计算,并且表达式中可以包含Abs()和Sqrt()运算。在课程设计中,系统开发平台为Windows ,程序设计设计语言采用C++,程序运行平台为Windows 或*nix。本程序的关键就是表达式的分离和处理,在程序设计中,采用了将输入的中缀表达式转化为后缀表达式的方法,具有可靠的运行效率。本程序做到了对输入的表达式(表达式可以包含浮点数并且Abs()和Sqrt()中可以嵌套子表达式)进行判定表达式是否合法并且求出表达式的值的功能。经过一系列的调试运行,程序实现了设计目标,可以正确的处理用户输入的表达式,对海量级数据都能够通过计算机运算快速解决。 关键词C++程序设计;数据结构;表达式运算;栈;中缀表达式;后缀表达式;字符串处理;表达式合法判定;

目录 1 引言 (3) 1.1课程设计目的 (3) 1.2课程设计内容 (3) 2 设计思路与方案 (4) 3 详细实现 (5) 3.1 表达式的合法判定 (5) 3.2 中缀表达式转化为后缀表达式 (5) 3.3 处理后缀表达式 (7) 3.4 表达式嵌套处理 (8) 4 运行环境与结果 (9) 4.1 运行环境 (9) 4.2 运行结果 (9) 5 结束语 (12) 参考文献 (13) 附录1:模拟计算器源程序清单 (14)

1 引言 本课程设计主要解决的是传统计算器中,不能对表达式进行运算的问题,通过制作该计算器模拟程序,可以做到快速的求解表达式的值,并且能够判定用户输入的表达式是否合法。该模拟计算器的核心部分就在用户输入的中缀表达式的转化,程序中用到了“栈”的后进先出的基本性质。利用两个“栈”,一个“数据栈”,一个“运算符栈”来把中缀表达式转换成后缀表达式。最后利用后缀表达式来求解表达式的值。该算法的复杂度为O(n),能够高效、快速地求解表达式的值,提高用户的效率。 1.1课程设计目的 数据结构主要是研究计算机存储,组织数据,非数值计算程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。学习数据结构是为了将实际问题中涉及的对象在计算机中表示出来并对它们进行处理。通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。 模拟计算器程序主要利用了“栈”这种数据结构来把中缀表达式转化为后缀表达式,并且运用了递归的思想来解决Abs()和Sqrt()中嵌套表达式的问题,其中还有一些统计的思想来判定表达式是否合法的算法。 1.2课程设计内容 本次课程设计为计算器模拟程序,主要解决表达式计算的问题,实现分别按表达式处理的过程分解为几个子过程,详细的求解过程如下:1 用户输入表达式。 2 判定表达式是否合法。 3 把中缀表达式转化为后缀表达式。 4 求出后缀表达式的结果。 5 输出表达式的结果。通过设计该程序,从而做到方便的求出一个表达式的值,而不需要一步一步进行运算。

单片机简易计算器课程设计

单片机简易计算器课程设计 课程设计 题目名称________________ 简易计算器设计____________ 课程名称_____________ 单片机原理及应用____________ 学生姓名________________

班级学号________________ 2018年6月20日

目录 一设计目的 (2) 二总体设计及功能介绍 (2) 三硬件仿真图 (3) 四主程序流程图 (4) 五程序源代码 (5) 六课程设计体会 (28)

设计目的 本设计是基于51系列单片机来进行的简单数字计算器设计,可以完成计算器的键盘输入,进行加、减、乘、除六位整数数范围内的基本四则运算,并在LED上显示相应的结果。软件方面使用C语言编程,并用PROTUE仿真。 二总体设计及功能介绍 根据功能和指标要求,本系统选用MCS-51 系列单片机为主控机,实现对计算器的设计。具体设计及功能如下: 由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LED显示数据和结果; 另外键盘包括数字键(0?9)、符号键(+、-、x、十)、清除键和等号键,故只需要16个按键即可,设计中采用集成的计算键盘;

执行过程:开机显示零,等待键入数值,当键入数字,通过LED显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LED上输出运算结果。 三硬件仿真图 硬件部分比较简单,当键盘按键按下时它的那一行、那一列的端口为低电平。因此,只要扫描行、列端口是否都为低电平就可以确定是哪个键被按下。

C语言_程序设计_计算器

C语言_程序设计_计算器 课程设计说明书 题目多功能计算器起讫日期 2006 年 7月 3日至 2006 年 8月 6日 所在院系 专业班级 学生姓名学号 指导教师 2006年 8 月 1 日 摘要 当今社会,随着人们物质生活的不断提高,电子产品已经走进家家户户,无论是生活和学习还是娱乐和消遣几乎样样都离不开电子产品,计算器可谓是我们最亲密的电子伙伴之一。 随着科技的发展,人们对计算要求的精确度越来越高,各种不同功能的计算器已经悄悄走进我们的生活和学习中。对于学生来说一个功能齐全的计算器对我们的学习有着莫大的帮助。借着C语言程序设计的机会,我决定自己动手来研究一下计算器。在练习巩固C语言学习的同时又可以从中体会到计算器的强大功能,然而由于学习的内容和时间有限,至今为止我只能实现四则运算加、减、乘、除、平方、立方和开方的一些简单功能,并且在计算器的里面加了一个漂亮的时钟,用来方便我们的学习。在今后的学习中,我会继续研究,争取进一步来完善它的功能。 本系统采用Turbo C语言开发,生成可执行文件在任何系统下都可以执行,具有很好的数据处理能力和稳定性。本论文主要介绍了该课题的开发背景以及过程和

所要完成的功能。并且重点的说明了系统设计思想,设计的步骤、难点技术和解决方案。由于“初来乍到”,这个程序设计还有一些漏洞和缺陷,希望您多多提出~关键字:Turbo c c语言计算器程序四则数值运算 目录 第一章综述...........................................................................1 1(1 课题的现实意义...............................................................1 1(2 软件环境........................................................................1 1(3 硬件环境 (1) 第二章系统设计流程图............................................................2 2(1 系统流程图.....................................................................2 2(2 主要功能表.....................................................................2 第三章系统分析和设计............................................................3 3(1 图形的绘制和输出............................................................3 3(2 文本的输出显示...............................................................3 3(3 计算函数的调用...............................................................4 3(4 程序的运行和退出 (5) 第四章系统测试.....................................................................6 4(1 缺少变量定义,定义位置不正确..........................................6 4(2 语法错误........................................................................6 4(3 注释的位置.....................................................................6 4(4 逻辑错误 (6) 第五章用户使用说明书……………………………………………………8 5(1 运行Turbo C程序进入计算器界面…………………………………8 5(2 计算器的使

相关文档
最新文档