Ⅰ 怎麼用C++編譯一個簡單的計算器
我借鑒了別人的某計算器,因為你沒有說多簡易...我就找了個差不多的...
/*
程序名稱:表達式計算器
編譯環境:Microsoft Visual C++ 6.0
作者:吉林大學 計算機科學與技術學院 2006 羅泗勇
時間:200801
*/
/*
說明:
採用樹形結構處理表達式,按優先順序運算結果,一個加,減,乘,除或數值為一個節點
優先順序如下:
函數:4
括弧:3
乘除:2
加減:1
*/
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;
const char NUM[]={'0','1','2','3','4','5','6','7','8','9','.'};
const char OPERATION[]={'+','-','*','/'};
const double PI=3.14159265358979;
const double EE=2.71828182818281;
class Fun //處理系統數學函數的類
{
public:
Fun(string o,int t,double l=0.0,double r=0.0):op(o),type(t),lvalue(l),rvalue(r){}
static string FUN[];
double calc();
private:
int type; //666 0 1 sin90 2 3! 3 3C2
string op; //函數類型
double lvalue; //函數左邊的值
double rvalue; //函數右邊的值
static int FunNum;
};
int Fun::FunNum=8;
string Fun::FUN[]={"!","sin","cos","tan","log","ln","C","A","^"};
/*
函數說明:
1:log是以10為底的工程對數
2:ln 是以e為底的自然對數
3:C 計算組合數 輸入規則 如計算 3取2的組合 輸入表達式 3C2
4:A 計算排列數 輸入規則 如計算 3取2的排列 輸入表達式 3A2
5:! 計算階乘
6:^ x的y次方 輸入 x^y
*/
int factorial(int n) //階乘函數
{
int i,s=1;
for(i=1;i<=n;i++)
s*=i;
return s;
}
int C(int a,int b)
{
return factorial(a)/(factorial(b)*factorial(a-b));
}
int A(int a,int b)
{
return factorial(a)/factorial(b);
}
double Fun::calc() //計算系統函數的值
{
if(type==0)
return lvalue;
else
{
if(op=="!")
return factorial(lvalue);
if(op=="sin")
return sin(rvalue/180*PI);
if(op=="cos")
return cos(rvalue/180*PI);
if(op=="tan")
return tan(rvalue/180*PI);
if(op=="log")
return log10(rvalue);
if(op=="ln")
return log10(rvalue)/log10(EE);
if(op=="C")
return C(lvalue,rvalue);
if(op=="A")
return A(lvalue,rvalue);
if(op=="^")
return pow(lvalue,rvalue);
else
{
string err="暫時沒有函數"+op;
MessageBox(NULL,err.c_str(),"錯誤",MB_OK);
return 0;
}
}
}
struct Unit //雙向鏈表保存運算單元
{
Unit(int p,char o,string c,double v,int t,Unit * pr=NULL,Unit * n=NULL)
:PRI(p),Operation(o),Code(c),value(v),Type(t),Pre(pr),Next(n){}
int PRI; //優先順序
char Operation; //操作符
string Code; //原始代碼
double value; //數據
int Type; //類型 操作符0 數據1 函數2
Unit * Pre; //構成雙向鏈表
Unit * Next;
};
class Node //表達式樹狀結構的節點
{
public:
Node(char o,int p,int e=1,double v=0,Node * ph=NULL,Node * pl=NULL,Node * pr=NULL)
:Operation(o),PRI(p),Expression(e),value(v),Head(ph),Left(pl),Right(pr){}
Node * Head; //節點的根,左樹枝,右樹枝
Node * Left;
Node * Right;
double GetValue();
char GetOperation() const {return Operation;}
int GetPri() const {return PRI;}
int IsExp() const {return Expression;}
private:
char Operation; //操作符
int PRI; //優先順序
int Expression; //記錄該節點是否是表達式0 1
double value; //該節點的值
};
double Node::GetValue() //運算該節點的值
{
if(IsExp()) //該節點的值還未算出來
{
double lvalue,rvalue;
lvalue=Left->GetValue();
rvalue=Right->GetValue();
Expression=0;
char op=GetOperation();
switch(op)
{
case '+':
return lvalue+rvalue;
case '-':
return lvalue-rvalue;
case '*':
return lvalue*rvalue;
case '/':
return lvalue/rvalue;
default:
return 0;
}
}
else
return value;
}
bool Isnum(char c)
{
for(int i=0;i<sizeof(NUM);i++)
{
if(c==NUM[i])
return true;
}
return false;
}
bool Isoperation(char c)
{
for(int i=0;i<sizeof(OPERATION);i++)
{
if(c==OPERATION[i])
return true;
}
return false;
}
Unit * Analyse(string exp) //分析表達式並生成鏈表
{
int pri=0; //當前優先順序
int stat=-1; //當前的讀入狀態 括弧 0 數據 1 運算符 2
Unit * head=NULL,* p=NULL;
int i=0,explen;
explen=exp.size();
for(i=0;i<explen;i++)
{
char c=exp.at(i);
if(c=='(')
{
pri+=3;
stat=0;
}
else if(c==')')
{
pri-=3;
stat=0;
}
else if(Isoperation(c)) //操作符不會出現在表達式開頭
{
Unit * temp=p;
int add_pri; //自身增加的優先順序
if(c=='+' || c=='-')
add_pri=1;
else
add_pri=2;
p->Next=new Unit(pri+add_pri,c," ",0,0);
p=p->Next;
p->Pre=temp;
}
else //其他的當做函數處理
{
string function="";
while(i<explen && (c=exp.at(i),! Isoperation(c)) && c!=')')
{
function+=c;
i++;
}
i--;
if(head==NULL)
{
p=new Unit(pri,' ',function,0,2);
head=p;
}
else
{
Unit * temp=p;
p->Next=new Unit(pri,' ',function,0,2);
p=p->Next;
p->Pre=temp;
}
}
}
return head;
}
Unit * Calc(Unit * head) //計算雙向鏈表基本單元的值
{
Unit * p=head;
while(p!=NULL)
{
if(p->Type!=0) //非操作符
{
string temp=p->Code;
string op;
double lvalue=0,rvalue=0;
int l_point=0,r_point=0;
int i=0,type=0;
char ch;
while(i<temp.size() && (ch=temp.at(i),Isnum(ch)))
{
if(ch=='.')
{
l_point++;
i++;
continue;
}
if(! l_point)
lvalue*=10;
lvalue+=(ch-'0')*pow(10,-l_point);
i++;
if(l_point)
l_point++;
}
while(i<temp.size() && (ch=temp.at(i),! Isnum(ch)))
{
op+=ch;
type=1;
i++;
}
while(i<temp.size() && (ch=temp.at(i),Isnum(ch)))
{
if(ch=='.')
{
r_point++;
i++;
continue;
}
if(! r_point)
rvalue*=10;
rvalue+=(ch-'0')*pow(10,-r_point);
i++;
if(r_point)
r_point++;
}
Fun * f=new Fun(op,type,lvalue,rvalue);
p->value=f->calc();
}
p=p->Next;
}
return head;
}
Node * Tree(Unit * head) //生成表達式樹
{
Node * root=NULL,* proot=NULL,* pbranch=NULL;
Unit * p=head;
int now_pri; //當前優先順序
bool hadop=false;
while(p!=NULL)
{
if(p->Type==0) //如果是一個操作符
{
hadop=true;
if(root==NULL)
{
proot=new Node(p->Operation,p->PRI,1);
root=proot;
pbranch=root;
now_pri=p->PRI;
proot->Left=new Node(' ',0,0,p->Pre->value);
proot->Right=new Node(' ',0,0,p->Next->value);
}
else
{
if(p->PRI<=now_pri) //優先順序低於當前優先順序,樹根方向 //最初寫的 if(p->PRI<now_pri),9/3/3=9,錯的
{
proot=new Node(p->Operation,p->PRI,1); //新的樹根
proot->Left=root; //根的變換
proot->Right=new Node(' ',0,0,p->Next->value);
root=proot;
pbranch=proot; //右樹枝的變換
//pbranch->Right=new Node(' ',0,0,p->Pre->value); //樹枝右邊取值
}
else
{
Node * temp;
temp=new Node(p->Operation,p->PRI,1);
pbranch->Right=temp;
temp->Head=pbranch;
pbranch=pbranch->Right;
pbranch->Left=new Node(' ',0,0,p->Pre->value);
pbranch->Right=new Node(' ',0,0,p->Next->value);
}
now_pri=p->PRI;
}
}
p=p->Next;
}
if(! hadop)
root=new Node(' ',0,0,head->value);
return root;
}
int main()
{
string exp;
//ifstream infile("test.txt",ios::in);
while(! getline(cin,exp).eof())
{
if(exp=="")
continue;
Unit * h=Analyse(exp);
h=Calc(h);
Node * root=Tree(h);
cout<<exp<<"="<<root->GetValue()<<endl;
}
return 0;
}
Ⅱ 運用c++編寫一個小程序,手動輸入年利率,貸款金額,貸款年限,自動輸出月還款額!!!
#include"stdio.h"
double count(int a,int b)
{
double c=a-b-3500;
if(c<=0)
c=0;
else if(c<=1500)
c=c*0.03;
else if(c<=4500)
c=c*0.1-105;
else if(c<=9000)
c=c*0.2-555;
else if(c<=35000)
c=c*0.25-1005;
else if(c<=55000)
c=c*0.3-2755;
else if(c<=80000)
c=c*0.35-5505;
else
c=c*0.45-13505;
return c;
}
void main()
{
int chose;
while(1)
{
printf("\t\t個人所得稅計算器\n");
printf("1.計算個人所得稅\n");
printf("2.退出\n");
printf("請輸入選項(1或2):");
scanf("%d",&chose);
if(chose==2)
break;
else if(chose==1)
{
int pay,baoxian;
printf("\n輸入你的月收入:");
scanf("%d",&pay);
printf("\n輸入你的三險一金:");
scanf("%d",&baoxian);
printf("你的個人所得稅為:%0.2f",count(pay,baoxian));
}
else
{
printf("\n\t\t>>>注意:請輸入1或2<<<\n");
}
}
}
分享
本回答專業性由電腦網路分類達人 趙麗麗認證
舉報| 2012-12-16 19:32
#「行家成長訓練營」,雙重獎勵等你拿!#
提問者採納
根據2011年9月1日起調整後的7級超額累進稅率設計,調試通過
#include"stdio.h"
double count(int a,int b)
{
double c=a-b-3500;
if(c<=0)
c=0;
else if(c<=1500)
c=c*0.03;
else if(c<=4500)
c=c*0.1-105;
else if(c<=9000)
c=c*0.2-555;
else if(c<=35000)
c=c*0.25-1005;
else if(c<=55000)
c=c*0.3-2755;
else if(c<=80000)
c=c*0.35-5505;
else
c=c*0.45-13505;
return c;
}
void main()
{
int chose;
while(1)
{
printf("\t\t個人所得稅計算器\n");
printf("1.計算個人所得稅\n");
printf("2.退出\n");
printf("請輸入選項(1或2):");
scanf("%d",&chose);
if(chose==2)
break;
else if(chose==1)
{
int pay,baoxian;
printf("\n輸入你的月收入:");
scanf("%d",&pay);
printf("\n輸入你的三險一金:");
scanf("%d",&baoxian);
printf("你的個人所得稅為:%0.2f",count(pay,baoxian));
}
else
{
printf("\n\t\t>>>注意:請輸入1或2<<<\n");
}
}
}
Ⅲ 求助,用c語言程序編寫下面題目,貸款計算器。
現在改好,看到變化的地方:
#包括中
無效的主要(無效)
{
持股量A,B,面積;/ *應被宣布為float * /
:浮動get_area(浮動,浮動,浮動);/ *正常申報的法律,有正式的和實際參數不能相同的名稱* /
printf的(「請輸入一個梯形的上底:\ n」);
scanf的(「%f」,&A);
輸出(「請輸入一個梯形下底:\ n」);
scanf的(「%f」,及b); printf的(「請輸入梯形的高
:\ n」);
scanf的(「%f」,&H);/ *變化* /
面積= get_area(A,B,H);
printf(「請梯形面積是%f \ n 「,區);
}
的持股量get_area(浮動a_x,b_x浮,浮H_X)
{
回報1/2.0 *(a_x + b_x)* H_X; / * 2更改為2.0,因為1/0,1/2 = 2.0 = 0.5,這是想法?C * /
}
Ⅳ c語言設計一個簡單的計算器程序
#include<stdio.h>//計算器
voidmenu()//自定義的菜單界面
{
printf("--------------------\n");
printf("請輸入你的選擇\n");
printf("1.+\n");
printf("2.-\n");
printf("3.*\n");
printf("4./\n");
printf("--------------------\n");
}
intmain()
{
inti=0;
intj=0;
intnum=0;//計算結果存放在nun
intselect=0;//選擇的選項存放在select
do//do-while先執行再判斷循環條件,即可實現重復計算功能
{
menu();//列印出菜單界面
scanf("%d",&select);//輸入你的選項
printf("請輸入計算值:");
scanf("%d%d",&i,&j);//輸入要計算的數值
switch(select)
{
case1:
printf("%d+%d=%d\n",i,j,num=i+j);//實現加法功能
break;
case2:
printf("%d-%d=%d\n",i,j,num=i-j);//實現減法功能
break;
case3:
printf("%d*%d=%d\n",i,j,num=i*j);//實現乘法功能
break;
case4:
printf("%d-%d=%d\n",i,j,num=i/j);//實現除法功能
break;
default:
printf("輸入有誤重新選擇");
break;
}
}while(select);
return0;
}
運行結果:
return表示把程序流程從被調函數轉向主調函數並把表達式的值帶回主調函數,實現函數值的返回,返回時可附帶一個返回值,由return後面的參數指定。
return通常是必要的,因為函數調用的時候計算結果通常是通過返回值帶出的。如果函數執行不需要返回計算結果,也經常需要返回一個狀態碼來表示函數執行的順利與否(-1和0就是最常用的狀態碼),主調函數可以通過返回值判斷被調函數的執行情況。
Ⅳ 用c++編寫一個關於房貸的程序要求選擇貸款方式(商業貸款或公積金貸款)
#include<iostream>
#include<cmath>
#include<iomanip>
usingnamespacestd;
intmain()
{
doublecapital=0;//本金
doubletotalInterest;//總利息
doubleinterestRate;//利率
doublemonthRepayment;//月還款額
doubletotalRepayment;//還款總額
intn,years=0;//還款期限
intchoice=0;//貸款方式
do
{
cout<<"請輸入貸款總額x(x>=1,單位:萬元):";
cin>>capital;
}while(capital<1);
capital*=10000;//萬元轉化為元
do
{
cout<<"請輸入還款期限y(1<=y<=30,單位:年):";
cin>>years;
}while(years<1||years>30);
n=years*12;//年轉化為月
cout<<"請選擇貸款方式(1:商業貸款,2:公積金貸款,其他:退出):";
cin>>choice;
switch(choice)
{
case1://商業貸款年利率(%)
interestRate=years>5?4.9:(years>=1?4.75:4.35);
break;
case2://公積金貸款年利率(%)
interestRate=years>5?3.25:2.75;
break;
default:
exit(0);
break;
}
interestRate/=1200;//將年利率轉化為月利率,並將百分點轉化為小數點
//計算月還款額
monthRepayment=capital*interestRate*pow(1+interestRate,n)/(pow(1+interestRate,n)-1);
totalRepayment=monthRepayment*n;//還款總額
totalInterest=totalRepayment-capital;//總利息
cout<<"您貸款的詳情如下: 本金:"<<std::fixed<<setprecision(2)<<capital<<
"元 還款年限:"<<years<<"年 月還款額:"<<monthRepayment<<
"元 還款總額:"<<totalRepayment<<"元 總利息:"<<totalInterest
<<"元"<<endl;
return0;
}
Ⅵ 有關銀行貸款還貸的c語言程序
你的錯誤實在太多了。看代碼王的程序簡潔易懂#include<stdio.h>#include<math.h>int main(){ double z,k,x,monthPay,allMoney,temp=0; int n,i; printf("輸入借款總額、貸款年限、年利率: "); //貸款總和最好不要用int型的,int的最大值是32767,那你豈不是超了 scanf("%lf%d%lf",&z,&n,&k); //計算n年後要還的總的錢數 pow(x,y)是在頭文件math.h中的函數計算x^y allMoney = z*pow((1+k/12),12*n); //式子∑x(1+k/12)^i (i=0,1,2,..,n*12-1)將x提出到前面計算 temp=∑(1+k/12)^i for(i=0; i<12*n; i++) temp += pow((1+k/12),i); //根據等式z(1+k/12)^(12*n) = ∑x(1+k/12)^i (i=0,1,2,..,n*12-1) 得x=allMoney/temp; x = allMoney/temp; printf("每月應還款:%lf", x);}Ⅶ java簡易貸款計算機
你也不說計算公式,不知道怎麼計算,我去網上找了一個月支付款的計算公式,不知道和你題目的要求是否一樣,如果不一樣你就改下公式就行。 java代碼如下: public class Loan { public static void main(String[] args){ double rate ;//利率 int year ; //年數 double money ; //貸款總額 double monthpay ;//月付款 Scanner sc = new Scanner(System.in); System.out.println("輸入月利率:"); rate = sc.nextDouble(); System.out.println("輸入年數:"); year = sc.nextInt(); System.out.println("輸入貸款總額:"); money = sc.nextDouble(); //計算月付款 monthpay = (money * rate)/Math.abs(1 - (1 / (1 + rate ) * year * 12 )); System.out.println("每月應該還貸款:" + monthpay); }}