用C语言编一个简单的计算器小程序

用C语言编一个简单的计算器小程序,第1张

你说的是 vc 还是 tc 啊???

其他的运算:

#include <stdioh>

int add(int x,int y) {return x+y;}

int sub(int x,int y) {return x-y;}

int mul(int x,int y) {return xy;}

int div(int x,int y) {return x/y;}

int (func[])()={add,sub,mul,div};

int num,curch;

char chtbl[]="+-/()=";

char corch[]="+-/()=0123456789";

int getach() {

int i;

while(1) {

curch=getchar();

if(curch==EOF) return -1;

for(i=0;corch[i]&&curch!=corch[i];i++);

if(i<strlen(corch)) break;

}

return curch;

}

int getid() {

int i;

if(curch>='0'&&curch<='9') {

for(num=0;curch>='0'&&curch<='9';getach()) num=10num+curch-'0';

return -1;

}

else {

for(i=0;chtbl[i];i++) if(chtbl[i]==curch) break;

if(i<=5) getach();

return i;

}

}

int cal() {

int x1,x2,x3,op1,op2,i;

i=getid();

if(i==4) x1=cal(); else x1=num;

op1=getid();

if(op1>=5) return x1;

i=getid();

if(i==4) x2=cal(); else x2=num;

op2=getid();

while(op2<=4) {

i=getid();

if(i==4) x3=cal(); else x3=num;

if((op1/2==0)&&(op2/2==1)) x2=(func[op2])(x2,x3);

else {

x1=(func[op1])(x1,x2);

x2=x3;

op1=op2;

}

op2=getid();

}

return (func[op1])(x1,x2);

}

void main(void) {

int value;

printf("Please input an expression:\n");

getach();

while(curch!='=') {

value=cal();

printf("The result is:%d\n",value);

printf("Please input an expression:\n");

getach();

}

}

只能 + - /

你确定是到10000吗?16bit的整数会溢出的,32bit绝对没问题的

那可以根据公式来实现1+2+3+……+10000 = 10000(1+10000)/2

所以

#include <stdioh>

int main()

{

int n = 10000;

int sum = 0;

sum = (n+1)n/2;

printf("%d\n",sum);

return 0;

}

// Calcu24cpp : Defines the entry point for the console application

//

/

6-6

24点游戏

/

#include "conioh"

#include "stdlibh"

#include "timeh"

#include "mathh"

#include "stringh"/

从一副扑克牌中,任取4张。

2-10 按其点数计算(为了表示方便10用T表示),J,Q,K,A 统一按 1 计算

要求通过加减乘除四则运算得到数字 24。

本程序可以随机抽取纸牌,并用试探法求解。

/void GivePuzzle(char buf)

{

char card[] = {'A','2','3','4','5','6','7','8','9','T','J','Q','K'}; for(int i=0; i<4; i++){

buf[i] = card[rand() % 13];

}

}

void shuffle(char buf)

{

for(int i=0; i<5; i++){

int k = rand() % 4;

char t = buf[k];

buf[k] = buf[0];

buf[0] = t;

}

}

int GetCardValue(int c)

{

if(c=='T') return 10;

if(c>='0' && c<='9') return c - '0';

return 1;

}

char GetOper(int n)

{

switch(n)

{

case 0:

return '+';

case 1:

return '-';

case 2:

return '';

case 3:

return '/';

} return ' ';

}double MyCalcu(double op1, double op2, int oper)

{

switch(oper)

{

case 0:

return op1 + op2;

case 1:

return op1 - op2;

case 2:

return op1 op2;

case 3:

if(fabs(op2)>00001)

return op1 / op2;

else

return 100000;

} return 0;

}

void MakeAnswer(char answer, int type, char question, int oper)

{

char p[4][3];

for(int i=0; i<4; i++)

{

if( question[i] == 'T' )

strcpy(p[i], "10");

else

sprintf(p[i], "%c", question[i]);

}

switch(type)

{

case 0:

sprintf(answer, "%s %c (%s %c (%s %c %s))",

p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);

break;

case 1:

sprintf(answer, "%s %c ((%s %c %s) %c %s)",

p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);

break;

case 2:

sprintf(answer, "(%s %c %s) %c (%s %c %s)",

p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);

break;

case 3:

sprintf(answer, "((%s %c %s) %c %s) %c %s",

p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);

break;

case 4:

sprintf(answer, "(%s %c (%s %c %s)) %c %s",

p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);

break;

}

}

bool TestResolve(char question, int oper, char answer)

{

// 等待考生完成

int type[5]={0,1,2,3,4};//计算类型

double p[4];

double sum=0;

//

for(int i=0; i<4; i++) //循环取得点数

{

p[i]=GetCardValue(int(question[i]));

} for(i=0;i<5;i++)

{

MakeAnswer(answer,type[i],question,oper); //获取可能的答案

switch(type[i])

{

case 0:

sum=MyCalcu(p[0],MyCalcu( p[1],MyCalcu(p[2], p[3], oper[2]),oper[1]),oper[0]); //A(B(cD))

break;

case 1:

sum=MyCalcu(p[0],MyCalcu(MyCalcu(p[1], p[2], oper[1]),p[3],oper[2]),oper[0]); //A((BC)D)

break;

case 2:

sum=MyCalcu(MyCalcu(p[0], p[1], oper[0]),MyCalcu(p[2], p[3], oper[2]),oper[1]); // (AB)(CD)

break;

case 3:

sum=MyCalcu(MyCalcu(MyCalcu(p[0], p[1], oper[0]),p[2],oper[1]),p[3],oper[2]); //((AB)C)D

break;

case 4:

sum=MyCalcu(MyCalcu(p[0],MyCalcu(p[1], p[2], oper[1]),oper[0]),p[3],oper[2]); //(A(BC))D

break;

}

if(sum==24) return true;

}

return false;

}

/

采用随机试探法:就是通过随机数字产生 加减乘除的 组合,通过大量的测试来命中的解法

提示:

1 需要考虑用括号控制计算次序的问题 比如:( 10 - 4 ) ( 3 + A ), 实际上计算次序的数目是有限的:

A(B(cD))

A((BC)D)

(AB)(CD)

((AB)C)D

(A(BC))D

2 需要考虑计算结果为分数的情况:( 3 + (3 / 7) ) 7

3 题目中牌的位置可以任意交换

/

bool TryResolve(char question, char answer)

{

int oper[3]; // 存储运算符,0:加法 1:减法 2:乘法 3:除法

for(int i=0; i<1000 1000; i++)

{

// 打乱纸牌顺序

shuffle(question);

// 随机产生运算符

for(int j=0; j<3; j++)

oper[j] = rand() % 4; if( TestResolve(question, oper, answer) ) return true;

} return false;

}

int main(int argc, char argv[])

{

// 初始化随机种子

srand( (unsigned)time( NULL ) ); char buf1[4]; // 题目

char buf2[30]; // 解答

printf("\n");

printf("计算24\n");

printf("A J Q K 均按1计算,其它按牌点计算\n");

printf("目标是:通过四则运算组合出结果:24\n");

printf("\n\n");

for(;;)

{

GivePuzzle(buf1); // 出题

printf("题目:");

for(int j=0; j<4; j++){

if( buf1[j] == 'T' )

printf("10 ");

else

printf("%c ", buf1[j]);

} printf("\n按任意键参考答案\n");

getch(); if( TryResolve(buf1, buf2) ) // 解题

printf("参考:%s\n", buf2);

else

printf("可能是无解\n"); printf("按任意键出下一题目,x 键退出\n");

if( getch() == 'x' ) break;

} return 0;

}

将字符串以一维数组存放,用两个指针p1、p2,一前一后,当p1指向第一个结点,p2指向第二个结点,判断p1->data是否与p2->data相等。可以写三个函数0的最大连续次数,1的最大连续次数,还有指针移动的函数,两个计数的……或者直接跟0和1比较,不知是否行的通^-^

一个简单的C语言小程序就可以满足要求,需要用到switch-case语句,先上代码:

#include <stdioh>

int main()

{

double a, b, answer;

/两个数a、b及其计算结果answer,由于下面会有除法,可能使answer出现小数,所以定义double类型变量/

char op; //运算符op 

scanf("%lf%c%lf",&a,&op,&b);

switch(op)

{

case '+': //加法 

answer = a + b;

break;

case '-': //减法 

answer = a - b;

break;

case '': //乘法 

answer = a  b;

break;

case '/': //除法 

answer = a / b;

break;

default:

printf(" *** 作符只接收加减乘除!\n"); //运算符只接收加减乘除 

break;

printf("%lf\n",answer);

return 0;

}

需要注意的地方只有除法的结果可能是小数,所以a,b和answer都需要定义成double类型变量。

下面附上switch-case语句的使用方法:

switch (表达式){ 

case 值1 : 语句1 break; 

case 值2 : 语句2 break; 

 

default : 语句n break; 

}

从表达式值等于某个case语句后的值开始,它下方的所有语句都会一直运行,直到遇到一个break为止。假如任何一个case语句的值都不等于表达式的值,就运行可选标签default之下的语句。

参考资料:

>

以上就是关于用C语言编一个简单的计算器小程序全部的内容,包括:用C语言编一个简单的计算器小程序、用C语言编写一个小程序,要求从1+2+3+……+10000,然后把结果输出.、求几C语言个小游戏代码,简单的,要注释、、谢谢了、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9326372.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存