手機上c語言編譯器寫計算器
1. 自己用c語言寫的計算器程序,怎麼做可以安裝在安卓手機上,就像一個軟體一樣使用
你要裝個安卓開發平台,然後用java語言寫一個計算器軟體
2. 用c語言編寫計算器
#include <stdio.h>
struct s_node
{
int data;
struct s_node *next;
};
typedef struct s_node s_list;
typedef s_list *link;
link operator=NULL;
link operand=NULL;
link push(link stack,int value)
{
link newnode;
newnode=(link) malloc(sizeof(s_list));
if(!newnode)
{
printf("\nMemory allocation failure!!!");
return NULL;
}
newnode->data=value;
newnode->next=stack;
stack=newnode;
return stack;
}
link pop(link stack,int *value)
{
link top;
if(stack !=NULL)
{
top=stack;
stack=stack->next;
*value=top->data;
free(top);
return stack;
}
else
*value=-1;
}
int empty(link stack)
{
if(stack==NULL)
return 1;
else
return 0;
}
int is_operator(char operator)
{
switch (operator)
{
case '+': case '-': case '*': case '/': return 1;
default:return 0;
}
}
int priority(char operator)
{
switch(operator)
{
case '+': case '-' : return 1;
case '*': case '/' : return 2;
default: return 0;
}
}
int two_result(int operator,int operand1,int operand2)
{
switch(operator)
{
case '+':return(operand2+operand1);
case '-':return(operand2-operand1);
case '*':return(operand2*operand1);
case '/':return(operand2/operand1);
}
}
void main()
{
char expression[50];
int position=0;
int op=0;
int operand1=0;
int operand2=0;
int evaluate=0;
printf("\nPlease input the inorder expression:");
gets(expression);
while(expression[position]!='\0'&&expression[position]!='\n')
{
if(is_operator(expression[position]))
{
if(!empty(operator))
while(priority(expression[position])<= priority(operator->data)&&
!empty(operator))
{
operand=pop(operand,&operand1);
operand=pop(operand,&operand2);
operator=pop(operator,&op);
operand=push(operand,two_result(op,operand1,operand2));
}
operator=push(operator,expression[position]);
}
else
operand=push(operand,expression[position]-48);
position++;
}
while(!empty(operator))
{
operator=pop(operator,&op);
operand=pop(operand,&operand1);
operand=pop(operand,&operand2);
operand=push(operand,two_result(op,operand1,operand2));
}
operand=pop(operand,&evaluate);
printf("The expression [%s] result is '%d' ",expression,evaluate);
getch();
}
3. 用C語言怎麼寫個計算器
一、用戶界面是用圖形窗口還是命令行窗口。
如果是命令行窗口它的數據輸入輸出比較簡單。
如果是圖形窗口則要涉及,圖形窗口相同的操作了。這個部分如果你不會,那你需要專門學習一樣。
二、支持哪些計算功能。
除了加減乘除外,是否還支持其他高級的計算功能?
加減乘除的計算精度。
32位系統中,如果計算結果為不大於32位二進制的數。(64位系統則為不大於64位數)你可以直接使用C語言的相應的加減乘除表達式完成。
如果是支持超大數的運算,那就需要採取特殊手段了。
比如32位系統中,計算的數超過32位。比如兩個128位數相加。
需要將128位拆分成4個32位。將每個32位作為整體。在依照數學的多位數加進行計算。
A1 B1 C1 D1
A2 B2 C2 D2
--------------
D1與D2相加(需要檢測是否有進位,也就是計算結構是否有溢出)
C1與C2相加,同樣要檢測進位,並且要加上D1與D2結果的進位。
B1與B2相加,同樣要檢測進位,並且要加上C1與C2結果的進位。
B1與B2相加,同上類推。
在實際程序時,可以將用戶界面與加減乘除程序分離。即用戶界面的代碼要與計算程序的代碼分在不同的函數中。
又用戶界面代碼調用計算函數。計算函數將結果返回給用戶界面代碼。
以命令行界面為例,
用戶界面代碼,只是等待用戶輸入,將相應用戶信息轉換成合適的格式,
然後調用相應計算函數。
計算函數做完計算以後,返回相應數字。
用戶界面代碼,再將返回的數字轉換成適當的格式,顯示在窗口上。
4. 怎樣用c語言編一個簡單的計算器
//簡單計算器,含加減乘除、乘方運算。
#include
#include
#include // malloc()等
#include // INT_MAX等
#include // EOF(=^Z或F6),NULL
#include // atoi()
#include // eof()
#include // floor(),ceil(),abs()
#include // exit()
#include // cout,cin
// 函數結果狀態代碼
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
// #define OVERFLOW -2 因為在math.h中已定義OVERFLOW的值為3,故去掉此行
typedef int Status; // Status是函數的類型,其值是函數結果狀態代碼,如OK等
typedef int Boolean; // Boolean是布爾類型,其值是TRUE或FALSE
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
//***************************************************************************
//棧的儲存結構
typedef struct{
//運算符棧
char *base;
char *top;
int stacksize;
}SqStack1;
typedef struct{
//運算數棧
float *base;
float *top;
int stacksize;
}SqStack2;
//***************************************************************************
//以下是運算符棧的基本操作函數
Status InitStack(SqStack1 &S){
//初始化一個棧
S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack
Status DestroyStack(SqStack1 &S){
//銷毀棧S
free(S.top);
free(S.base);
return OK;
}//DestroyStack
char GetTop(SqStack1 S){
//若棧不空,則返回S的棧頂元素,並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
return *(S.top-1);
}//Gettop
Status Push(SqStack1 &S,char e){
//插入元素e為新的棧頂元素
if(S.top-S.base>=S.stacksize){
//棧滿,追加儲存空間
S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push
Status Pop(SqStack1 &S,char &e){
//若棧不空,則刪除S的棧頂元素,用e返回其值;並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
e=*(--S.top);
return OK;
}//Pop
//***************************************************************************
//以下是運算數棧的基本操作函數
Status InitStack(SqStack2 &S){
//初始化一個棧
S.base=(float *)malloc(STACK_INIT_SIZE*sizeof(float));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack
Status DestroyStack(SqStack2 &S){
//銷毀棧S
free(S.top);
free(S.base);
return OK;
}//DestroyStack
float GetTop(SqStack2 S){
//若棧不空,則返回S的棧頂元素,並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
return *(S.top-1);
}//Gettop
Status Push(SqStack2 &S,float e){
//插入元素e為新的棧頂元素
if(S.top-S.base>=S.stacksize){
//棧滿,追加儲存空間
S.base=(float *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(float));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push
Status Pop(SqStack2 &S,float &e){
//若棧不空,則刪除S的棧頂元素,用e返回其值;並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
e=*(--S.top);
return OK;
}//Pop
//***************************************************************************
//以下是相關的運算符判斷函數
char Precede(char A,char B){
//比較運算符A, B的優先關系,A,B的范圍僅限於'+','-','*','/','^','(',')','='
//返回'>','<','='
switch(A){
case '+':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '-':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '*':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '/':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '^':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '>';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '(':switch(B){
case '+':return '<';
case '-':return '<';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '=';
case '=':printf("表達式錯誤!\n");exit(0);
default:printf("表達式錯誤!\n");exit(0);
}
case ')':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '>';
case '(':printf("表達式錯誤!\n");exit(0);
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '=':switch(B){
case '+':return '<';
case '-':return '<';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':printf("表達式錯誤!\n");exit(0);
case '=':return '=';
default:printf("表達式錯誤!\n");exit(0);
}
default:printf("表達式錯誤!\n");exit(0);
}
}//Precede
Status InOP(char c){
//判斷c是否是運算符,是則返回TRUE,否則返回FALSE
switch(c){
case '+':return TRUE;
case '-':return TRUE;
case '*':return TRUE;
case '/':return TRUE;
case '^':return TRUE;
case '(':return TRUE;
case ')':return TRUE;
case '=':return TRUE;
default:return FALSE;
}
}//InOP
//***************************************************************************
float Operate(float a,char theta,float b){
switch(theta){
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':
if(b==0){
printf("分母不能為0!\n");
exit(0);
}
else return a/b;
case '^':
if(a==0&&b<=0){
printf("0的指數必須大於0!\n");
exit(0);
}
else return (float)pow(a,b);
default:printf("表達式錯誤!\n");exit(0);
}
}//Operate
Status EvaluateExpression(){
//算術表達式求值
char c,x,theta,prec;
//c是每次讀取的字元,x是存放脫括弧後的多餘的括弧,theta是運算符,prec是c的前一個字元
float a,b,result;//a、b是每次從運算數棧中取出的要進行運算的數,result存放最終結果
float cc,flag,ii,minus=1;
//cc存放由字元串轉化而來的浮點數,flag用於標記是否已讀取過小數點,
//ii存放小數部分需要縮小的倍數,minus用於記錄該數前是否有負號
SqStack1 OPTR;
SqStack2 OPND;
InitStack(OPTR);InitStack(OPND);
Push(OPTR,'=');
prec='=';scanf("%c",&c);
while(c!='='||GetTop(OPTR)!='='){
cc=0;flag=0;ii=10;
if(c=='-'&&(prec=='='||prec=='(')){minus=-1;prec=c;scanf("%c",&c);}
//若某「-」前面是「=」(第一個符號就是「-」)或「(」,則此為負號,不是減號
else if(!InOP(c)){
while(!InOP(c)){
if(c>=48&&c<=57){
if(flag==0)cc=cc*10+c-48;//小數點之前
else if(flag==1){cc=cc+(c-48)/ii;ii*=10;}//小數點之後
else {printf("小數點錯誤!\n");exit(0);}//小數點有錯
}
else if(c=='.')flag++;//讀到小數點
else {printf("表達式錯誤!\n");exit(0);}
prec=c;scanf("%c",&c);
}
cc*=minus;minus=1;
Push(OPND,cc);
}//不是運算符則進OPND棧
else
switch(Precede(GetTop(OPTR),c)){
case '<':Push(OPTR,c);prec=c;scanf("%c",&c);break;//棧頂元素優先順序低
case '=':Pop(OPTR,x);prec=c;scanf("%c",&c);break;//脫括弧並接收下一字元
case '>'://退棧並將運算結果入棧
Pop(OPTR,theta);
Pop(OPND,b);Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}
}
result=GetTop(OPND);
printf("%f\n",result);
//DestroyStack(OPTR);
//DestroyStack(OPND);
return OK;
}//EvaluateExpression
void main(){
printf(" **********************\n");
printf(" * 歡迎使用計算器! *\n");
printf(" **********************\n");
printf("請輸入表達式,以「=」結束:\n");
printf("(支持實數間的加(+)、減(-)、乘(*)、除(/)、乘方(^)、單目減(-)運算)\n");
EvaluateExpression();
exit (0);
}
5. 用C語言編寫簡易計算器程序
#include<stdio.h>
#include<math.h>
int main()
{
char ch,op;
double a,b,c;
printf("請按s鍵開始計算,按q退出程序: ");
while(1)
{
while(scanf("%c",&ch),ch!='q')
{
if(ch!='s')
break;
scanf("%lf%c%lf",&a,&op,&b);
switch(op)
{
case '+' :
c=a+b;
break;
case '-' :
c=a-b;
break;
case '*' :
c=a*b;
break;
case '/' :
c=a/b;
break;
}
printf("%.4f ",c);
printf("按s繼續計算 ");
}
if(ch=='q')
break;
}
return 0;
}
6. 手機能否裝C語言編譯器
可以裝,不過需要安卓手機。
安裝步驟如下:
1、我們打開谷歌應用商店。在搜索框里輸入mobile c查找應用程序。下載並安裝好
6、可以看到這里正確的輸出了Hello World字元串。
7. c語言編寫計算器程序
C語言編寫計算器
我們可以用printf和scanf函數輸出結果和獲取用戶的輸入。需要<stdio.h>頭文件。scanf函數在讀取數據的時候不需要再一行上輸入每個數據,只要數據和數據之間留出空白就可以了。先聲明兩個變數number1和number2,operation變數用來存儲運算符。用scanf函數獲取這兩個數字和運算符。分別用%lf %c %lf
8. 如何用C語言編寫一個科學計算器
用棧 就可以辦到了。。。這個很詳細的, lz 隨便輸入一個表達式,中間的計算過程全部輸出了,lz試兩個 就知道怎麼回事了。 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 4000;
typedef struct
{
char data[10];
int top;//頭地址
int base;//基地址
int length;//長度
}Stack;
void init(Stack *st)//初始化棧
{
st->base=0;
st->top=0;
st->length=0;
}
int isEmpty(Stack *st)
{
int n=0,top,base;
top =st->top;
base =st->base;
if(top==base)
{
return 1;
}
return n;
}
int isFull(Stack *st)
{
int n=0,top,base;
top =st->top;
if(top>=4000)
{
return 1;
}
return n;
}
char getTop(Stack *st)// 返回top值,不改變棧的結構
{
char n;
if(isEmpty(st))
{
printf("棧為空\n");
return 0;
}
int positon= st->top-1;
n= st->data[positon];//取出數據;
return n;
}
char pop(Stack *st)// 出棧,返回
{
char n;
if(isEmpty(st))
{
printf("棧為空\n");
return 0;
}
int positon= st->top-1;
n= st->data[positon];//取出數據;
st->top--;
st->length--;
st->data[positon]='\0';//消除數據
return n;
}
void push(char n,Stack *st)//入棧
{
int positon ;
if(isFull(st))
{
printf("棧滿\n");
}
else
{
positon= st->top;//獲取位置
st->data[positon]=n;//存入數據
st->top++;//改變位置
}
}
void show(Stack *m1)//輸出棧中的數據
{
int top,base;
top=m1->top;
base=m1->base;
while(top>base)
{
printf("%c,",m1->data[--top]);
}
printf("\n");
}
int isOperate(char temp)//是否是操作符
{
if(temp=='+'||temp=='-'||temp=='*'||temp=='/'||temp=='('||temp==')'||temp=='#')
{
return 1;
}
return 0;
}
int isValue(char temp)//是否是數值
{
if(temp>='0'&&temp<='9')//
{
return 1;
}
else
{
return 0;
}
}
int isAvail(char temp)//是否有效字元
{
if(isOperate(temp)||isValue(temp))//如果temp既不是操作符和數值的話,則它是非法的
{
return 1;
}
return 0;
}
int detect(char temp)//搜索矩陣位置
{
int i=0;
char oper[7]={'+','-','*','/','(',')','#'};
for(i=0;i<7;i++)
{
if(temp==oper[i])
{
return i;
}
}
}
char Priority(char temp,char optr)//判斷優先順序
{
/**//*
+ - * / ( ) #
1 2 3 4 5 6 7
+ 1 < < < < > > >
- 2 < < < < > > >
* 3 > > < < > > >
/ 4 > > < < > > >
( 5 > > > > > = 0
) 6 < < < < = 0 >
# 7 < < < < > 0 =
*/
int row ,col;
char priority[7][7]={/**//* + - * / ( ) # */
{'<','<','<','<','>','>','>'},
{'<','<','<','<','>','>','>'},
{'>','>','<','<','>','>','>'},
{'>','>','<','<','>','>','>'},
{'>','>','>','>','>','=','>'},
{'<','<','<','<','=','0','>'},
{'<','<','<','<','>','<','='},
};
row = detect(temp);//找出對應的矩陣下標;
col = detect(optr);
// printf("%d,%d",row,col);
//優先順序存儲在一個7x7的矩陣中,對應關繫上圖;
return priority[row][col];
}
char evaluate(int a,int b,char oper)
{
switch(oper)
{
case '+': return a+b+'0';
case '-': return a-b+'0';
case '*': return a*b+'0';
case '/': return a/b+'0';
default : return 0+'0';
}
}
int calculateExpress(char *express)//計算表達式
{
int result=0;
int a,b;
// char oper,result;
Stack OPTR,OPND;//OPTR存儲操作符,OPND操作數值
init(&OPTR);
init(&OPND);
push('#',&OPTR);//默認第一個位'#'
////////////////////-演算法-////////////////////////////
while(*express!='\0')
{
char temp;
temp= *(express);
printf("---------------------------------\n");
printf("當前的符號為%c\n",temp);
if(isAvail(temp))//是否是有效字元
{
if(isOperate(temp) )//輸入的是操作符
{
char oper,result;
char optr = getTop(&OPTR);//棧中top位的操作符
printf("棧頂操作符位:%c\n",optr);
char prior = Priority(temp,optr);//判斷優先順序
switch(prior)
{
case '>':
push(temp,&OPTR);
printf("將符號位%c入棧\n",temp);
express++;
break;
case '<':
//int a,b;
//char oper,result;
a=pop(&OPND)-'0';//存在棧中的都是char字元
b=pop(&OPND)-'0';
oper=pop(&OPTR);
result=evaluate(b,a,oper);//出棧一個操作符,計算結果
//printf("%d",result-'0');
push(result,&OPND);//結果入OPND
printf("%d%c%d結果為:%d\n",b,oper,a,result-'0');
break;
case '=':
//消除括弧
pop(&OPTR);
printf("消除括弧\n");
express++;
break;
}
}
if(isValue(temp))//輸入的是數值
{
push(temp,&OPND);//將數值位入棧;
express++;
printf("將數值%c壓入棧\n",temp);
//show(&OPND);
}
}
else //表達式中有非法字元
{
printf("表達式中有非法字元\n");
exit(-1);//退出程序
}
}
// show(&OPND);
// show(&OPTR);
return getTop(&OPND)-'0';
}
void inputExpress(char *express)//輸入表達式
{
int length=0;
printf("請輸入一個表達式:");
scanf("%s",express);
int len =strlen(express);
express[len]='#';//表達式最後一位默認為'#';
express[len+1]='\0';
}
void output(char *express,int result)//輸出表達式
{
int i=0;
printf("----------------------------------------\n表達式:");
while(express[i]!='#')
{
printf("%c",express[i]);
i++;
}
printf("=%d\n",result);
}
int main()
{
char express[100];//表達式
int result =0;
inputExpress(express);//輸入表達式
result = calculateExpress(express);//計算表達式;
output(express,result); //輸出表達式
//、、、、、、、、、、、、、測試優先順序。
/**//*
char m='7' ;
m=Priority('+','*');
printf("優先順序為%c",m);
int m=evaluate(5,6,'m');
printf("%d",m);
*/
return 0;
}
9. 怎麼用c語言在手機上做編程
可以使用c4droid軟體進行編程。
解決這個問題的方法如下:
1、首先在手機瀏覽器中搜索c4droid軟體。
10. 有沒有能在手機上寫c語言的編譯器
c4droid是款Android設備上的C/C++程序編譯器
,默認以tcc(tiny c
compiler)為編譯器,可以選擇安裝gcc插件(20mb,只有root用戶可以使用),選用gcc後,可以用sdl(簡單直控媒體層庫,需安裝sdl
plugin for c4droid)和qt(nokia官方開發庫,需安裝sdl plugin for
c4droid)。也可以開發native android app(需安裝sdl plugin for c4droid),就像google
ndk一樣。軟體支持代碼高亮,編譯時間隨cpu主頻而定,主頻越高編譯越快。gcc插件版本4.7.2提供了示列程序,包含sdl,android native,qt和命令行測試程序源碼。
最新版為4.03(2013年7月7日更新)。
貼吧已發布5.98版本,英文版及漢化版本,默認使用g++編譯器,sdl及gcc插件也有相應更新,還可以拓展sdl2插件