| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1966 人关注过本帖, 1 人收藏
标题:一个计算器程序题,大家共同研究研究,使之更加完善!
只看楼主 加入收藏
xiaomiking
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:230
专家分:130
注 册:2009-4-2
结帖率:100%
收藏(1)
 问题点数:0 回复次数:24 
一个计算器程序题,大家共同研究研究,使之更加完善!
/*
(1)-4编写一程序实现以下功能: 7分
编写一个简单计算器程序,输入格式为:data1 op data2。
其中data1和data2是参加运算的两个数
(data1、data2为int,但二者相加可能超出int能表示的范围),
op为运算符,它的取值只能是+、-、*、/、%。
考查点:较复杂输入、基本输出,if或switch语句的使用,数据类型的正确使用。
*/
/*
测试数据:
30000+20000=50000
30000-20000=10000
30000*20000=600000000
30000%20000=10000
30000/20000=1.50
30000/0,结果:Error! chu shu wei 0.
*/

#include <stdio.h>
#include <stdlib.h>

void main ()
{
    int data1, data2;
    long result;
    char op;
    float res;/*res存除法的结果*/
    
    printf("\nPlease input data1 op data2:");
    scanf("%d %c %d", &data1, &op, &data2);
    
    switch (op)
    {
        case '+':
            result = (long)data1 + (long)data2;
            break;
        case '-':
            result = data1 - data2;
            break;
        case '*':
            result = (long)data1 * (long)data2;
            break;
        case '%':
            if (0 == data2)/*注意除数为0的情况*/
            {
                printf("\nError! chu shu wei 0.");
                exit(0);
            }
            else
            {
                result = data1 % data2;
            }
            break;
        case '/':
            if (0 == data2)/*注意除数为0的情况*/
            {
                printf("\nError! chu shu wei 0.");
                exit(0);
            }
            else
            {
                res = (float)data1 / (float)data2;
                printf("\n%d%c%d=%.2f", data1, op, data2, res);
                return;/*返回,则不再执行最下面的printf语句*/
            }
    }
    
    printf("\n%d%c%d=%ld", data1, op, data2, result);
}
搜索更多相关主题的帖子: 共同进步 
2009-08-19 17:47
曼珠沙华
Rank: 2
来 自:广东
等 级:论坛游民
帖 子:121
专家分:98
注 册:2009-5-21
收藏
得分:0 
lz你可以考虑加入小数的运算啊

走过了,却留下了痕迹。伤过了,却是一种无奈。人生只不过是一种擦肩而过的过程。
2009-08-19 18:20
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
条条大路通罗马,达到目地就行了。

要完善的话就要加容错的部份进去。假如我输入的不是“+、-、*、/、%”,而是别的符号呢。这是一个,如果还有别的呢
再有就是美化输入界面,完成这两项就差不多了。

努力—前进—变老—退休—入土
2009-08-19 18:21
lcq12345
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2009-5-5
收藏
得分:0 
简单的计算器写了也没什么意思!功能比不上系统的计算器.你用scanf函数做输入不好,应用getch()函数来实现,这函数可以接收键盘的各个功能键和数字字母.......有回显功能.

做计算器,没这个函数,功能不强大.!!
在软件运行,输入键盘任意键就可看到,各个建值.
#include <stdio.h>
void main()
{
    int key;  //存储键值
    key = getch();
    while( key != 27 )  //键入值不为 ESC
    {
        printf("%d\n", key);
        key = getch();
    }
}

如方向键的值为:
上:72
下:80
左:75
右:77
2009-08-19 22:40
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:0 
回复 4楼 lcq12345

你这叫什么??

生命不熄,战斗不止.
2009-08-21 19:52
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
lex&yacc

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2009-08-21 20:23
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:0 
把linux的东西贴这里是什么意思?

生命不熄,战斗不止.
2009-08-21 20:45
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:0 
程序代码:
%{
#include <alloca.h>
#include <math.h>
#include <stdlib.h>
#include <stddef.h>
#include <ctype.h>
#define YYSTYPE double
double calcfact();
double reg[99];
double ans;
char format[20];
%}
%token NUMBER SPACE MOD RIGHTSHIFT LEFTSHIFT SEMICOLON SIN EOLN PIVAL
%token PLUS MINUS DIV MUL POW OPENBRACKET CLOSEBRACKET UNARYMINUS
%token COS TAN ASIN ACOS ATAN FACT INC DEC LAND OR COMPLEMENT
%token NOT XOR ASSIGN IOR AND OPENREG CLOSEREG REGA ANS FIX SCI ENG
%token CONST
%left PLUS MINUS
%left MUL DIV
%left UNARYMINUS
%left LAND OR XOR NOT AND IOR
%left LOG
%%
list: /* nothing */
| list EOLN
| list expr EOLN
{ printf( format , (double) $2 ); ans=$2; }
;
expr: conditional_expr
;
conditional_expr: logical_or_expr
;
logical_or_expr: logical_and_expr
| logical_or_expr OR logical_and_expr
{ $$ = (int) $1 || (int) $3; }
;
logical_and_expr: inclusive_or_expr
| logical_and_expr LAND inclusive_or_expr
{ $$ = (int) $1 && (int) $3; }
;
inclusive_or_expr: exclusive_or_expr
| inclusive_or_expr IOR exclusive_or_expr
{ $$ = (int) $1 | (int) $3; }
;
exclusive_or_expr: and_expr
| exclusive_or_expr XOR and_expr
{ $$ = (int) $1 ^ (int) $3; }
;
and_expr: shift_expr
| and_expr AND shift_expr
{ $$ = (int) $1 & (int) $3; }
;
shift_expr: pow_expr
| shift_expr LEFTSHIFT pow_expr
{ $$ = (int) $1 << (int) $3; }
| shift_expr RIGHTSHIFT pow_expr
{ $$ = (int) $1 >>(int) $3; }
;
pow_expr: add_expr
| pow_expr POW add_expr { $$ = pow($1,$3); }
;
add_expr: mul_expr
| add_expr PLUS mul_expr { $$ = $1 + $3; }
| add_expr MINUS mul_expr { $$ = $1 - $3; }
;
mul_expr: unary_expr
| mul_expr MUL unary_expr { $$ = $1 * $3; }
| mul_expr DIV unary_expr { $$ = $1 / $3; }
| mul_expr MOD unary_expr { $$ = fmod($1,$3); }
;
unary_expr: assign_expr
| MINUS primary %prec UNARYMINUS { $$ = -$2; }
| INC unary_expr { $$ = $2+1; }
| DEC unary_expr { $$ = $2-1; }
| NOT unary_expr { $$ = !$2; }
| LOG unary_expr { $$ = log($2); }
;
assign_expr: postfix_expr
| REGA OPENREG expr CLOSEREG ASSIGN postfix_expr
{ reg[(int)$3]=$6; $$=$6; }
| REGA OPENREG expr CLOSEREG
{ $$=reg[(int)$3]; }
| REGA
{ int i;
for(i=0;i<100;i++)
if (reg[i]!=0)
printf("%02d = %.2fn",i,reg[i]);
$$=0;
}
;
postfix_expr: primary
| postfix_expr INC { $$ = $1+1; }
| postfix_expr DEC { $$ = $1-1; }
| postfix_expr FACT
{ $$ = calcfact((unsigned long int)$1); }
;
primary: NUMBER { $$ = $1; }
| PIVAL { $$ = M_PI; }
| OPENBRACKET expr CLOSEBRACKET { $$ = $2; }
| ANS { $$ = ans; }
| CONST OPENBRACKET expr CLOSEBRACKET { $$ = constval($3); }
| set_format
;
set_format: function_call
| FIX OPENBRACKET expr CLOSEBRACKET
{ sprintf(format,"%%.%dfn",(int)$3); $$=0; }
| FIX { sprintf(format,"%%fn"); $$=0; }
| SCI OPENBRACKET expr CLOSEBRACKET
{ sprintf(format,"%%.%dgn",(int)$3); $$=0; }
| SCI { sprintf(format,"%%gn"); $$=0; }
| ENG OPENBRACKET expr CLOSEBRACKET
{ sprintf(format,"%%.%den",(int)$3); $$=0; }
| ENG { sprintf(format,"%%en"); $$=0; }
;
function_call: SIN OPENBRACKET expr CLOSEBRACKET
{ $$ = (cos($3)*tan($3)); }
| COS OPENBRACKET expr CLOSEBRACKET
{ $$ = cos($3); }
| TAN OPENBRACKET expr CLOSEBRACKET
{ $$ = tan($3); }
| ASIN OPENBRACKET expr CLOSEBRACKET
{ $$ = asin($3); }
| ACOS OPENBRACKET expr CLOSEBRACKET
{ $$ = acos($3); }
| ATAN OPENBRACKET expr CLOSEBRACKET
{ $$ = atan($3); }
;
%%
#include <stdio.h>
#include <ctype.h>
char *progname;
double yylval;
main( argc, argv )
char *argv[];
{
progname = argv[0];
strcpy(format,"%gn");
yyparse();
}
yyerror( s )
char *s;
{
warning( s , ( char * )0 );
yyparse();
}
warning( s , t )
char *s , *t;
{
fprintf( stderr ,"%s: %sn" , progname , s );
if ( t )
fprintf( stderr , " %sn" , t );
}

生命不熄,战斗不止.
2009-08-21 20:49
soler
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:181
专家分:1077
注 册:2005-7-16
收藏
得分:0 
以下是引用wxjeacen在2009-8-21 20:49的发言:%{#include #include #include #include #include #define YYSTYPE doubledouble calcfact();double reg[99];double ans;char format[20];%}%token NUM ...
赶紧看书去,,,
2009-08-21 23:56
多多关照
Rank: 2
等 级:论坛游民
帖 子:42
专家分:51
注 册:2009-8-22
收藏
得分:0 
晕,8楼前辈太专业了,我们这些初学者都看不懂,最多也就写一个楼主写的那个程序<br>唉,亟待学习呀

[ 本帖最后由 多多关照 于 2009-8-22 11:39 编辑 ]
2009-08-22 11:37
快速回复:一个计算器程序题,大家共同研究研究,使之更加完善!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018102 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved