我的程序是个计算器啊

到百度贴吧首页
新闻   网页   贴吧   知道   MP3   图片   视频   百科
    吧内搜索 | 帮助

我的程序是个计算器啊

1楼

下面是我写的一个计算器程序,请大家赏个脸看一看。
用法很简单,输入式子就可以得到答案。
支持一般的数学符号,有兴趣的可以补充。
如果看得懂得话就给个评价,这很重要。好就表扬一下,不好就批评漫骂都可以,最好是指出缺点,这也很重要。
如果看不懂代码,那么就拿去编译成文件用一用,好还是不好也评价一下。(我觉得读代码很难,特别是不明朗得代码,然而我这次写的代码很不好看.)
感谢大家,我是新来的PT,说明完毕,谢幕,退场

2楼

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

#define UNKNOWN_CHAR 2
#define DIVISOR_IS_ZERO 3
#define FALSE 0
#define TRUE 1

/*定义结构,主要用于GetString函数,可以不管它*/
typedef struct string
{char str;
 struct string *next;
}string;

/*函数声明*/ 

/*可以无限接受字符,输入一个字符就给你个空间,返回一个字符串首地址 . */
/*这个函数可以看成普通的scanf()*/ 
char *GetString();
/*从字符串str第*rank个字符开始分析直到遇到 ')' or ']' or '}' or '\0' . */
/*有错误就把错误代号装在*errorNum中,返回从中计算出的值*/ 
double GetASResultOf(char * str, int *rank, int *errorNum);
/*从字符串str第*rank个字符开始分析直到遇到不符合要求的字符,返回这个单位值.*/
/*如:str="12+sin(30)+[12+cos(60)]"
 GetUnitageOf(str,0,errorNum)=12
 GetUnitageOf(str,3,errorNum)=0.5
 GetUnitageOf(str,11,errorNum)=12.5 */
double GetUnitageOf(char * str, int *rank, int *errorNum);

3楼

/*Are you ready? Let's go!----------------------------------*/
int main()
{
 /*定义变量*/ 
 double value;
 int rank=0;
 int errorNum=TRUE;
 char * str;

 /*接收字符*/
 printf("counter v1.0\n");
 printf("Made by PT\n");
 printf("Date 2005-07-16\n\n");
 printf("Please input your arithmetic:\n");
 str=GetString();

 /*调用处理函数,*/
 value = GetASResultOf(str, &rank, &errorNum);
 
 /*错误处理(没完善)*/
 if (errorNum==TRUE) printf("The result is: %lf\n",value, rank);
 else if (errorNum==UNKNOWN_CHAR) printf("char error!\n");
 else if (errorNum==DIVISOR_IS_ZERO) printf("Divisor could not be 0\n");
 else printf("Other error\n");

 getch();
 return 0;
}


/*0==[=========>无限动态字符接受函数*/
char *GetString()
{
 char *CharToString(string * sHead, int arraySize);
 int arraySize=0; 
 string *s;
 string *sHead;
 
 s = (string *)malloc(sizeof(string));
 sHead = s;
 s->str = getchar();
 arraySize++;
 
 while((s->str)!='\n')
 {
 arraySize++;
 s->next=(string *)malloc(sizeof(string));
 s=s->next;
 s->str=getchar();
 }
 
 return CharToString(sHead, arraySize);
}

char *CharToString(string * sHead, int arraySize)
{
 char *strArray;
 string *s=sHead;
 int i=0;
 strArray = (char*)malloc(arraySize*sizeof(char));
 
 while(i<arraySize)
 {
 if (s->str=='=' || s->str=='\n') break;
 if (s->str!=32) strArray[i++]=s->str;
 s=s->next;
 }
 strArray[i]='\0';
 return strArray;
}

4楼

/*0==[=========> 得到一个单位的值*/
double GetUnitageOf(char * str, int *rank, int *errorNum)
{
 double CharToNum(char * str, int *rank);
 double value; 
 
 /*如果是数字或负号就返回这个数字*/ 
 if ((str[*rank]>=48 && str[*rank]<=57) || (str[*rank]=='-'))
 {if (str[*rank]=='-') {(*rank)++;value = (-1)*GetUnitageOf(str, rank,errorNum);}
 else {value = CharToNum(str, rank);}}
 
 /*如果是括号就用GetASResultOf取得括号里面的值并返回*/
 else if (str[*rank]=='(' ||
 str[*rank]=='[' ||
 str[*rank]=='{' )
 {(*rank)++;
 value = GetASResultOf(str, rank, errorNum);}
 
 /*返回sin(x)*/
 else if (str[*rank]=='s' &&
 str[(*rank)+1]=='i' &&
 str[(*rank)+2]=='n')
 { (*rank)=(*rank)+3;
 value = GetUnitageOf(str, rank, errorNum);
 value = sin(value);
 }
 
 /*返回cos(x)*/
 else if (str[*rank]=='c' &&
 str[(*rank)+1]=='o' &&
 str[(*rank)+2]=='s')
 {*rank=*rank+3;
 value = cos(GetUnitageOf(str, rank, errorNum));}
 
 /*返回tan(x)*/
 else if (str[*rank]=='t' &&
 str[(*rank)+1]=='a' &&
 str[(*rank)+2]=='n')
 {*rank=*rank+3;
 value = tan(GetUnitageOf(str, rank, errorNum));}
 /*还可以加一些的,懒得加了*/ 
 
 /*defult:处理错误*/
 else {*errorNum = UNKNOWN_CHAR;value = 0;}
 
 /*检查errorNum*/
 if (*errorNum==TRUE){return value;}
 else return FALSE;
}

/*0==[=========>这个是把字符转换成数字的函数,只在GetUnitageOf()里用*/
/*数字不能超过15个,其余的将被抹去.*/
double CharToNum(char * str, int *rank)
{
 int j=0;
 double value=0;
 
 while((str[*rank]>=48 && str[*rank]<=57) || (str[*rank]==46))
 {
 if (str[*rank]!='.')
 {if ((j++)<=15) {value = value*10+(str[*rank]-48);}}
 else
 {if (j<=15)
 {
 for ((*rank)++,j=1; (str[*rank]>=48 && str[*rank]<=57 && str[*rank]!='\0'); (*rank)++, j++)
 {value = value+(str[*rank]-48)*pow(0.1,j);}
 return value;
 }
 }
 
 (*rank)++;
 }
 return value;
}

5楼

/*0==[=========>这个函数写的太复杂了,实在不好作解释,反正是在GetPDResultOf
函数和GetUnitageOf函数之间转啊转的*/
/*简单地说就是把str中第一个加减号前的式子算出来放在value变量中.再用函数 
GetPDResultOf算出直到二个加减号前的式子然后与value相加或相减放在
变量value中,以此类推,直到遇上 ')' or ']' or '}' or '\0' */
double GetASResultOf(char * str, int *rank, int *errorNum)
{
 double GetPDResultOf(char * str, int *rank, int *errorNum);
 double value;
 double dwIf_Zero;
 
 /*遇上 ')' or ']' or '}' or '\0' 就返回*/ 
 while (str[*rank]!=')' &&
 str[*rank]!=']' &&
 str[*rank]!='}' &&
 str[*rank]!='\0')
 {
 if ((str[*rank]>=48 && str[*rank]<=57) ||
 str[*rank]=='s' ||
 str[*rank]=='c' ||
 str[*rank]=='t')
 {
 if ((str[*rank-1]==')' ||
 str[*rank-1]==']' || 
 str[*rank-1]=='}') &&
 *rank!=0) 
 {value = value*GetUnitageOf(str, rank, errorNum);} 
 else 
 {value = GetUnitageOf(str, rank, errorNum);} 
 }
 
 else if (str[*rank]=='+')
 {if (str[*rank-1]!= '(' &&
 str[*rank-1]!= '[' &&
 str[*rank-1]!= '{' && (*rank)!=0 )
 {(*rank)++; value = value + GetPDResultOf(str, rank, errorNum);}
 else {*errorNum=UNKNOWN_CHAR;return 0;}}
 
 
 else if (str[*rank]=='-')
 {if (str[*rank-1]!= '(' &&
 str[*rank-1]!= '[' &&
 str[*rank-1]!= '{' && (*rank)!=0 )
 {(*rank)++; value = value - GetPDResultOf(str, rank, errorNum);}
 else {value = GetUnitageOf(str, rank, errorNum);}}
 
 else if (str[*rank]=='*')
 {if (str[*rank-1]!= '(' &&
 str[*rank-1]!= '[' &&
 str[*rank-1]!= '{' && (*rank)!=0 )
 {(*rank)++; value = value * GetUnitageOf(str, rank, errorNum);}
 else {*errorNum=UNKNOWN_CHAR;return 0;}}

 else if (str[*rank]=='/')
 {if (str[*rank-1]!= '(' &&
 str[*rank-1]!= '[' &&
 str[*rank-1]!= '{' && (*rank)!=0 )
 {(*rank)++;
 dwIf_Zero=GetUnitageOf(str, rank, errorNum);
 if (dwIf_Zero==0) {*errorNum=DIVISOR_IS_ZERO;return 0;}
 else value = value /dwIf_Zero;}
 else {*errorNum=UNKNOWN_CHAR;return 0;}}

 else if (str[*rank]== '(' ||
 str[*rank]== '[' ||
 str[*rank]== '{' )
 {if (str[*rank-1]!= '(' &&
 str[*rank-1]!= '[' &&
 str[*rank-1]!= '{' && (*rank)!=0 )
 {(*rank)++; value = value*GetASResultOf(str, rank, errorNum);}
 else {value = GetUnitageOf(str, rank, errorNum);}}


 else {*errorNum=UNKNOWN_CHAR;return FALSE;}


 if (*errorNum!=TRUE) return FALSE;
 }
 (*rank)++;
 return value;
}

double GetPDResultOf(char * str, int *rank, int *errorNum)
{
 double value;
 double dwIf_Zero;
 value = GetUnitageOf(str, rank, errorNum);
 if (str[*rank]=='\0') return value;
 
 while (str[*rank]!='+' &&
 str[*rank]!='-' &&
 str[*rank]!=')' &&
 str[*rank]!=']' &&
 str[*rank]!='}')
 {
 if (str[*rank]=='*') 
 value = value * GetUnitageOf(str, rank, errorNum);
 else if (str[*rank]=='/')
 {
dwIf_Zero= GetUnitageOf(str, rank, errorNum);
if (dwIf_Zero=0) {*errorNum=DIVISOR_IS_ZERO;return 0;}
 else value = value /dwIf_Zero;
}
 else if (str[*rank]=='(' ||
 str[*rank]=='[' ||
 str[*rank]=='{')
 {(*rank)++;
 value = value * GetUnitageOf(str, rank, errorNum);}
 else {*errorNum=UNKNOWN_CHAR;return FALSE;}
 if (*errorNum!=TRUE) return FALSE;
 }
 
 return value;
}

6楼

我在xp下用TC(准确的说是WinTc v1.2)和dev-C++4.9.9.2下通过。
完毕,收工。
又是一个通宵!

7楼

支持原创!支持开源精神,严重支持!
ligeger多多来C吧砌磋~~呵呵

8楼

一醒来就有人回复真令人激动啊,怎么不评价一下!
我也想天天都来和你们切磋啊,可是明天就要上学了,上学就不能天天来了,再说我们高三了,高考可是很麻烦的事啊。
今后1年的时间里玩电脑的机会可是越来越少了,有点可惜

9楼

评价:总体上不错,但是功能不够完善.
才高二就学得这么好,难得!

10楼

功能在GetUnitageOf函数里面
里面有sin(), cos(), tan(),cos(),别的可以按照上面的格式补充

11楼

问题来了:
试试:2+3*4
然后就是实在太乱,用单步执行还不知运行到哪~~~

61.184.62.*

12楼

啊~~~对不起
补丁sp1补丁sp1补丁sp1补丁sp1补丁sp1补丁sp1补丁sp1补丁sp1补丁sp1
说明:修改下面2个问题
 在GetPDResultOf()函数中的while 语句中
 (1)在if (str[*rank]=='*')里面的
 value = value * GetUnitageOf(str, rank, errorNum);前
 加上(*rank)++;
 (2)在else if (str[*rank]=='/')语句中
 dwIf_Zero= GetUnitageOf(str, rank, errorNum);前
 加上(*rank)++;
 还有就是…并把…if (dwIf_Zero=0)改成……
 if (dwIf_Zero==0) …!^^^^sorry!!

没关系,人谁无过,程序谁无BUG,我原谅自己了呵呵
谢谢你了

13楼

才高二就这么厉害,的确不一般。
表扬的大家都说得很多了,我就说一些批评的话吧:
有点粗心,不重视程序的TEST。

一个程序员不是把程序写出来就完事的,
首先要做到程序的正确运行,
再追求它安全、健壮,
再追求它高效、发展。

看得出来你在编程上已经小有心得了,在WIN32 API编程上估计也有些时日,照这样发展下去,应该会成为一个相当了得的程序员。

14楼

assiss也来了啊~

15楼

你能帮我做下面的题目吗?我的邮箱:gaogao099@126.com
 100个经典C语言程序
1、输入初始值,输出100个不能被3整除的数。
2、设计程序,求s=1+(1+2)+(1+2+3)+…………+(1+2+3+……+n)的值
3、设s=1^1*2^2*3^3*……n^n,求s不大于400000时最大的n。(1^1表示1的1次方,依此类推)
4、用1,2,3,4这四个数字可以组成一个4位数,编写程序,打印出所有可能的四位数(四个数字可以相同),并统计所组成的四位数的个数。
5、“水仙花数”是指一个三位数,其各位数的立方和等于该数,如:153=1^3+5^3+3^3(注:3^3表示3的3次方,但是在c语言里面不能这样写。)
6、打印九九乘法表
7、输入一个n,打印n行星号,期中,第一行1个,第二行3个,第三行5个,依此类推。如:n=3时:
*
***
 *****
8、利用c++编写程序,求百鸡百钱问题。
9、从键盘输入10个数,要求按照从小到大的顺序打印到屏幕。
10、从键盘输入20个数,将这20个数按照位置倒置。即第20个数与第1个数互换位置,第19个数与第2个数互换位置……
11,题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
12,题目:八进制转换为十进制,将用户输入的一个八进制数转换成十进制。(带自动检错功能)
13,题目:求0—7所能组成的奇数个数。
14,题目:一个偶数总能表示为两个素数之和。(歌赫巴得猜想)
15,题目:判断一个素数能整除几个9,如3能被9整除,能整除一个9,所以结果为1。11能被99整除,也就是能整除两个9,所以结果为2。
16,题目:两个字符串连接程序。(使用字符串数组)
17,题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。
18,题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下: 
每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
19,题目:取一个整数a从右端开始的4~7位。
20,题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润,求应发放奖金总数?
21,题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
22,题目:输入某年某月某日,判断这一天是这一年的第几天?(闰年且输入月份大于3时需考虑多加一天。)
23,题目:要求输出国际象棋棋盘。(char a=219;用a表示白格棋盘,用空格表示黑格棋盘)
24,题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问20个月后兔子总数为多少?
25,题目:判断101-200之间有多少个素数,并输出所有素数。
26,题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
27,题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
28,题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
29,题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
30,题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
31,题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数 1/1+1/3+...+1/n
32,题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
33,题目:打印出杨辉三角形(要求打印出10行如下图)
34,题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
35,题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
36,题目:打印出如下图案(菱形) (菱形随输入的n不同而不同,输入n=4,得到如下图案:)
 * 
 *** 
 ****** 
 ******** 
 ****** 
 *** 
 *
37,题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
38,题目:求1+2!+3!+...+20!的和
39,题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
40,题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

221.211.69.*

16楼

看不懂,好难啊
202.206.40.*

17楼

我运行了,还是有错误!有一些算式不能计算。如:4+4*4

18楼

把12楼的补丁打上就ok。
202.206.40.*

19楼

还是不行,麻烦你自己试一下,多谢
220.180.184.*

20楼

#include<stdio.h>
main()
{
float a,b,result;
char op;
scanf("%f%c%f",&a,&op,&b);
switch(op)
{
case'+':
result=a+b;
printf("=%f",result);
break;
case'-':
result=a-b;
printf("=%f",result);
break;
case'*':
result=a*b;
printf("%f",result);
break;
case'/':
if(b==0.0)
printf("error!\n");
result=a/b;
printf("=%f",result);
default:
printf("error due to the illegal input!\n");
break;
}
}

220.180.184.*

21楼

能不能出点关于国家三级考试的题目啊!
 拜托!

221.194.116.*

22楼

麻烦你帮一下
用二叉树计算表达式的值
实现+-*/%
以及浮点数
wjh70134@sina.com
万分感激

23楼

你刚刚上了高二就有这样的水平,还可以了,我现在在读大二,C语言过了三级,不过我还要向更高的一层上呀!这是这样,活到老学到老,做人就应该像老牛一样。
221.237.144.*

24楼

1,3,5,7……前20项的和 =?

25楼

我也来说一下,你不是一个好的程序员,好的程序员不是追求结果,是追求完美。

26楼

今天做件大事,把所有精品帖都顶出来````````:)gggf
222.18.140.*

27楼

你高二编程就编得这么好了,真不简单呀,不过你的程序还有一些小错误,你自己在调试一下,不过总的看起来还是不错的,要多努力哦,里面的功能还可以完善一下的,下一下12楼的补丁,小错误就少一些了。

28楼

呵呵,用C来写真方便多了,当初同样的功能用汇编来写,代码一大堆

29楼

打印出杨辉三角形
#include<stdio.h>
#define N 10

void main()
{
int i,j;

int max[N][N];

for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
max[i][0]=1;
max[i][i]=1;
}
}
for(i=2;i<N;i++)
{
for(j=1;j<i;j++)
{
max[i][j]=max[i-1][j-1]+max[i-1][j];
}
}
for(i=0;i<N;i++)

{
for(j=0;j<=i;j++)
{
printf("%5d",max[i][j]);
}
printf("\n");
}
}

219.133.64.*

30楼

#include <stdio.h>

#define N 10

void main()

{
int num[N][N],i,j;


for(j=0;j<N;j++)
{
for(i=0;i<=j;i++)

if((i==0)||(i==j))


num[j][i]=1;


else
{
num[j][i]=num[j-1][i-1]+num[j-1][i];
}

printf("%d\t",num[j][i]);

}

printf("\n");

}
}
我这个直接一些

发表回复

内 容:
用户名:
  
©2010 Baidu 贴吧协议  意见反馈