① 如何用C語言數據結構的格式實現簡單的算術表達式求值程序
用棧把中綴表達式(輸入簡渣的式子)按優先順序轉為後綴表達式(逆波蘭式,即運算符在前,操作數在後),再利用棧變計算邊保存結果用於下一步計算,高咐神最後算出式子的答案
以下代碼輸入一個式子(以
=
作為輸入結束標志),輸出結果,負數如-3用0-3表示,支持高位運算
#include
<stdio.h>
#include
<戚虧stdlib.h>
#include
<math.h>
#include
<malloc.h>
#define
OK
1
#define
ERROR
-1
typedef
char
SElemType;
typedef
char
Status;
#define
STACK_INIT_SIZE
100000
#define
STACKINCREMENT
2
struct
SqStack
{
SElemType
*base;
SElemType
*top;
int
stacksize;
};
struct
SqStack1
{
int
*base;
int
*top;
int
stacksize;
};
SqStack
OPTR;
SqStack1
OPND;
char
Precede(char
c1,char
c2)
{
if(c1=='+'
||
c1=='-')
{
if(c2=='+'
||
c2=='-'
||
c2==')'
||
c2=='=')
return
'>';
else
return
'<';
}
else
if(c1=='*'
||
c1=='/')
{
if(c2=='(')
return
'<';
else
return
'>';
}
else
if(c1=='(')
{
if(c2==')')
return
'=';
else
return
'<';
}
else
if(c1==')')
return
'>';
else
if(c1=='=')
{
if(c2=='=')
return
'=';
else
return
'<';
}
else
return
'\0';
}
int
In(char
c)
{
if(c=='+'
||
c=='-'
||
c=='*'
||
c=='/'
||
c=='('
||
c==')'
||
c=='=')
return
1;
else
return
0;
}
int
Operrate(int
m,char
b,int
n)
{
switch(b)
{
case
'+':return
m+n;
case
'-':return
m-n;
case
'*':return
m*n;
case
'/':return
m/n;
}
return
0;
}
//操作數
int
InitStack1(SqStack1
&S)
{
S.base=(int
*)malloc(STACK_INIT_SIZE*sizeof(int));
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return
OK;
}
int
Push1(SqStack1
&S,int
e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(int
*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
S.top=S.base+S.stacksize;
S.stacksize=S.stacksize+STACKINCREMENT;
}
*S.top++=e;
return
OK;
}
int
Pop1(SqStack1
&S,int
&e)
{
if(S.top==S.base)
return
ERROR;
e=*
--S.top;
return
OK;
}
int
GetTop1(SqStack1
S)
{
if(S.top==S.base)
return
ERROR;
return
*(S.top-1);
}
//算符
int
InitStack(SqStack
&S)
{
S.base=(SElemType
*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return
OK;
}
int
Push(SqStack
&S,SElemType
e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType
*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
S.top=S.base+S.stacksize;
S.stacksize=S.stacksize+STACKINCREMENT;
}
*S.top++=e;
return
OK;
}
int
Pop(SqStack
&S,SElemType
&e)
{
if(S.top==S.base)
return
ERROR;
e=*
--S.top;
return
OK;
}
Status
GetTop(SqStack
S)
{
if(S.top==S.base)
return
ERROR;
return
*(S.top-1);
}
int
Calculate()
{
char
c,theta,p;
int
a,b,i=0,ans,x;
InitStack(OPTR);
Push(OPTR,'=');
InitStack1(OPND);
c=getchar();
while(c!='='
||
GetTop(OPTR)!='=')
{
if(!In(c)
&&
c>='0'
&&
c<='9')
{
Push1(OPND,c-'0');
c=getchar();
while(c>='0'
&&
c<='9')
{
Pop1(OPND,x);
Push1(OPND,x*10+c-'0');
c=getchar();
}
}
else
if(In(c))
{
switch(Precede(GetTop(OPTR),c))
{
case
'<':
Push(OPTR,c);
c=getchar();
break;
case
'=':
Pop(OPTR,p);
c=getchar();
break;
case
'>':
Pop(OPTR,theta);
Pop1(OPND,b);
Pop1(OPND,a);
ans=Operrate(a,theta,b);
Push1(OPND,ans);
break;
}
}
else
{
c=getchar();
}
}
return
GetTop1(OPND);
}
int
main()
{
int
ans;
ans=Calculate();
printf("%d\n",ans);
return
0;
}
② 誰能幫我用c語言里的if-else-if結構編個簡單的計算器,實現兩個整數的四則運算
直接輸入算式而得到結果的程序思路如下:
統計所輸洞做入的算式里到底包括哪一晌顫此種運算符,比方說
for (i=0;i<=a;i++) //這里宴迅a表示所輸入的字元總長度
{
if inp[i]="+" //這里inp表示你字元存儲的數組名
tt=1;
if inp[i]="-"
tt=2;
if inp[i]="*"
tt=3
if inp[i]="/"
tt=4;
}
if tt=1
{將符號兩邊的數進行加法運算
}
………後面的自己寫
不過這種好像不算好。提供第二種思路:
這次是要求輸入一個數,然後選擇運算符號,再輸第二個數
scanf(%d,a); // scanf的用法好像是這樣的吧?忘記了
printf("請選擇要進行的運算:1 for +;2 for -; 3 for * ; 4for /");
scanf(%d,b);
printf("input the second number,please);
scanf (%d,c);
if (b==1)
{ 做加法運算} //自己寫出代碼
else if (b==2) ………後面的自己寫吧。
好了,寫了這么多,給我加點分吧!!!
如果還不會,QQ我:408899168
演算法的描述方式有:自然語言,流程圖,偽代碼等。
1、自然語言的優勢:自然語言即人類語言,描述的演算法通俗易懂,不用專門的訓練,較為靈活。
2、流程圖的優勢:流程圖描述的演算法清晰簡潔,容易表達選擇結構,不依賴於任何具體的計算機和計算機程序設計語言,從而有利於不同環境的程序設計。
3、偽代碼的優勢:迴避了程序設計語言的嚴格、煩瑣的書寫格式,書寫方便,同時具備格式緊湊,易於理解,便於向計算機程序設計語言過渡的優點。
(3)如何用程序的構造方法描述算式擴展閱讀:
演算法使用偽代碼的目的是使被描述的演算法可以容易地以任何一種編程語言實現。
因此,偽代碼必須結構清晰、代碼簡單、可讀性好,並且類似自然語言。 介於自然語言與編程語言之間,以編程語言的書寫形式指明演算法職能。
偽代碼只是像流程圖一樣用在程序設計的初期,幫助寫出程序流程。簡單的程序一般都不用寫流程、寫思路,但是復雜的代碼,還是需要把流程寫下來,總體上去考慮整個功能如何實現。
④ 編寫一個循環結構的程序,使之能計算下面各算式:. 1+2+3…+99+100= 1+3+6+9+…+297+300=
FOR…NEXT語句
FOR…NEXT的語句格式為:
FOR <循環變數>=<初值> TO <終值> STEP <步長>
<循環體>
NEXT <循環變數>
For…Next語句運行的流程如圖3-6.2所示。
圖3-6.2 循環結構程序流程圖
例如,下面是一個求1+2+3+…+99+100的簡單程序:
Dim counter,nSum
nSum=0
For counter=1 to 100 Step 1
nSum = nSum + counter
Next counter
程序運行的結果是,變數nSum的值變為5050,變數counter的值變為101.
FOR與NEXT是一對語句,必須成對出現,循環變數用於控制循環體的循環,循環的次數由初值、終值與步長決定。整個循環的過程如下:
①、 把初值賦給循環變數
②、 判斷循環變數是否超過終值,如果超過則執行第⑥步,否則執行第③步
③、 執行循環體
④、 循環變數加上步長再賦值給循環變數
⑤、 重復執行第②步
⑥、 離開循環,繼續執行循環語句後面的語句
下面就利用For…Next語句來製作飛機飛行的程序,操作步驟如下:
步驟1:新建一個工程。
步驟2:在窗體上新建一個Image控制項,用於顯磨者手示飛機,名稱為Image1。
步驟3:在窗體上新建三個CommandButton控制項,將它們的Caption屬性分別改為「復位」、「起飛」、「退出」。
步驟4:編寫程序代碼。
對「起飛」按鈕Command2的Click事嫌陸件編寫如下代碼:
Private Sub Command2_Click()
For i = 1 To 3300
For j = 1 To 50000
Next
nLeft = nLeft + 2
nTop = nTop + 1
Image1.Left = nLeft
Image1.Top = nTop
Next
End Sub
在上面的程序中,使用了如下語句:
For j = 1 To 50000
Next
它的作用是控制飛機瞎嫌的飛行速度。將循環的終值減小,飛機就飛得快;增大,飛機就飛得慢。
在循環語句中執行 Exit For 語句,可以退出循環,使程序跳到Next之後的語句繼續執行
⑤ JAVA構造方法
構造方法必須滿足以下語法規則:
(1) 方法名必須與類名相同。
(2)不要聲明返回類型。
(3)不能被static、final、synchronized、abstract和native修飾。構造方法不能被子類繼承,所以用final和
abstract修飾沒有意義。構造方法用於初始化一個新建的對象,所以用static修飾沒有意義。多個線程不會同時創建內存地址相同的同一個對象,因此用synchronized修飾沒有必要。此外,Java語言不支持native類型的構造方法。
例:
public class Sample {
private int x;
public Sample() { // 不帶參數的構造方法
this(1);
}
public Sample(int x) { //帶參數的構造方法
this.x=x;
}
public int Sample(int x) { //不是構造方法
return x++;
}
}
拓展資料:
構造方法的訪問級別
構造方法可以處於public、protected、默認和private這四種訪問級別之一。本節著重介紹構造方法處於private級別的意義。
當構造方法為private級別,意味著只能在當前類中訪問它:在當前類的其他構造方法中可以通過this語句調用它,此外還可以在當前類的成員方法中通過new語句調用它。
在以下場合之一,可以把類的所有構造方法都聲明為private類型。
(1)在這個類中僅僅包含了一些供其他程序調用的靜態方法,沒有任何實例方法。其他程序無需創建該類的實例,就能訪問類的靜態方法。例如 java.lang.Math類就符合這種情況,在Math類中提供了一系列用於數學運算的公共靜態方法,為了禁止外部程序創建Math類的實例, Math類的惟一的構造方法是private類型的:
private Math(){}
abstract類型的類也不允許實例化。也許你會問,把Math類定義為如下abstract類型,不是也能禁止Math類被實例化嗎?
public abstract class Math{…}
如果一個類是抽象類,意味著它是專門用於被繼承的類,可以擁有子類,而且可以創建具體子類的實例。而JDK並不希望用戶創建Math類的子類,在這種情況下,把類的構造方法定義為private類型更合適。
(2)禁止這個類被繼承。當一個類的所有構造方法都是private類型,假如定義了它的子類,那麼子類的構造方法無法調用父類的任何構造方法,因此會導致編譯錯誤。把一個類聲明為final類型,也能禁止這個類被繼承。這兩者的區別是:
1)如果一個類允許其他程序用new語句構造它的實例,但不允許擁有子類,那就把類聲明為final類型。
2)如果一個類既不允許其他程序用new語句構造它的實例,又不允許擁有子類,那就把類的所有構造方法聲明為private類型。
由於大多數類都允許其他程序用new語句構造它的實例,因此用final修飾符來禁止類被繼承的做法更常見。
(3)這個類需要把構造自身實例的細節封裝起來,不允許其他程序通過new語句創建這個類的實例,這個類向其他程序提供了獲得自身實例的靜態方法,這種方法稱為靜態工廠方法。
參考資料:java 構造函數
⑥ 用c或c++編寫一個具有計算器功能的程序,要求一次性輸入一行要求算式,輸入「=」輸出結果,有什麼好的思路
可以用2叉樹寫。
定義運算式結構體類型,比如:
typedefstructyunsuan
{
//如果是單一運算,比如1+2,那麼num1=1;num2=2;
intnum1;//左兒子運算符為0的時候直接取該值
intnum2;//右兒子運算符為0的時候直接取該值,為NULL說明只有一個數值運算
structyunsuan*father;//父親:如果上層還有運算式,指向上層
structyunsuan*brother;//兄弟:如果同級還有其他運算式,指向該運算式結構
//如果是復合運算,為其創建左兒子,右兒子,指向兒子,並讓兒子指向父扒春親
structyunsuan*left;//左兒子
structyunsuan*right;//右兒子
charfh;//運算符號
}YS;
根據優先順序解析多運算符的式子,比如2^2+(√4-1)。
從運算順序最低的運算符號開始先找到'+',創建樹頂點結構體,fh='+';father=NULL;brother=NULL;left=(2^2)的結構體;right=(√4-1)的結構體;
(2^2)的結構體:fh='^';num1=2;num2=2;father=最頂端的結構體;brother=(豎此敏√4-1)的結構體;left=新建節點fh置0;right=新建節點fh置0;
(√4-1)的結構體:fh='-';num2=1;father=最頂端的結構體;brother=(2^2)的結構體;left=√4的結構體;right=新余枝建節點fh置0;
√4的結構體:fh='√';num1=4;father=(√4-1)的結構體;brother=NULL;left=新建節點fh置0;right=NULL;
依次類推,以上只是說明樹形結構建立。
你解析字元串,從運算順序最後的字元開始拆分並創建樹的最頂層節點,然後依次往下建立樹。
最後可以用遞歸函數或循環,遍歷樹各節點進行運算。
⑦ 如何用c語言實現:輸入一個算式,然後在程序中使用。
程序是激蠢不帶高認算式蠢鉛尺的。你只能把它變為系數輸入才可以。如ax*x+bx+c,你輸入a,b,c。直接輸算式沒意義。歸根到底,程序只能做你設計好的事情。想讓它認算式,你要把你的算式歸納成只有系數的東西,或者其它有規律的東西。