用程序編譯代碼計算函數
① C程序 編譯!
exit();這個函數就是直接沒商量的退出整個程序。
如果想條件退出,那就條件調用這個函數。
② 編譯程序怎樣編譯一個函數
找本大學教材看看《編譯原理》
這個好難,但是很有用!!!!!!!!!
可以讓你寫程序或者讀程序時更加有信息。
③ 使用C++編寫遞歸函數和用庫函數編寫發牌程序
/*
2。利用c++語言提供的庫函數編寫一個發牌程序,每次從一副撲克牌中隨機發三張牌。
(提示:抽出的三張牌是不允許重復的)。
Microsoft Visual C++ .NET編譯通過.
*/
#include "stdafx.h"
#include "iostream"
#include "time.h"
#include "string"
#include "sstream"
using namespace std;
const int TOTAL = 52;
int _tmain(int argc, _TCHAR* argv[])
{
srand((unsigned)time(NULL));
string tostring(int);
list<int> cards;
for (int i=0;i<TOTAL;i++)
{
cards.push_back(i);
}
list<int>::iterator _ptr;
int random;
int choose=1;
int n=1;
while(choose==1){
cout<<"第"<<n<<"輪發牌:\n";
n++;
for (int i=0;i<3;i++)
{
if (cards.size()<1)
{
cout<<"牌已發完.\n";
exit(0);
}
_ptr=cards.begin();
random=rand()%(int)cards.size();
for(int j=0;j<random;j++)
{
_ptr++;
}
cout<<tostring(*_ptr)<<endl;
cards.erase(_ptr);
}
cout<<"按 1 繼續發牌,按其他鍵加回車退出:";
cin>>choose;
if (cin.fail()) exit(1);
}
return 0;
}
string tostring(int card)
{
ostringstream mystream;
string s="";
int num=0;
if (card%4==0)
{
//方片
s+="方塊 ";
if (card==0)
{
s+="13";
}
else
{
num=card/4;
mystream<<num;
s+=mystream.str();
}
}
if (card%4 ==1)
{
//黑桃
s+="黑桃 ";
num=card/4+1;
mystream<<num;
s+=mystream.str();
}
if (card%4==2)
{
//紅心
s+="紅心 ";
num=card/4+1;
mystream<<num;
s+=mystream.str();
}
if (card%4==3)
{
//梅花
s+="梅花 ";
num=card/4+1;
mystream<<num;
s+=mystream.str();
}
return s;
}
④ c語言中,程序調用函數是怎麼實現的
當程序編譯後link,講函數地址保存在段寄存器中,代碼段內,當某處調用此函數時(匯編代碼CALL),將此地址壓入棧中,並且根據指令地址寄存器(程序計數器內)中保存的值計算到該函數地址的偏移量,隨後通過__cdecl等調用方式將參數和局部變數壓入棧中。具體的過程比較復雜,具體應該參照PE結構等。比較深入,我也只是粗略了解
可以參考計算機組成與設計一書
⑤ 用C語言編譯一個簡單計算器的程序,要求其中有括弧和冪函數
既然大家都沒發程序,I am coming.
說明:由於冪的運算應該比括弧低比乘除要高,所以為避免混淆用冪運算時用括弧括起來,比如2+9/3^2-5表示2+(9/3)^2-5,要是想要9除以3^2,這樣輸入:2+9/(3^2)-5,以免引起歧義。
程序功能強大代碼簡練。可以對任意數值類型計算,這里全部按double型處理,程序還可以使用大括弧{}中括弧[]小括弧()三種括弧,當然優先順序是小括弧>中括弧>大括弧>運算符。
要是只想結果取整,將所有double類型改為int即可,不過不主張這樣做,既然是計算器,當然要精確計算。
一個完整的c程序如下,程序在win-tc和Dev-c++下都調試通過。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
char s[201];/*全局變數s[]與i分別表示算術表達式字元串以及其當前位置指針變數*/
int i=0;
double proc1(char ch);
void proc2(double *a,char *c);
void str_read(double *a,char *c) /*讀取下一個操作數*/
{ int j=0;
char s1[30];
while ((s[i]!='\0')&&(s[i]!='+')&&(s[i]!='-')&&(s[i]!='(')&&(s[i]!=')')
&&(s[i]!='=')&&(s[i]!='^')&&(s[i]!='*')&&(s[i]!='/')&&(s[i]!='[')&&(s[i]!=']')
&&(s[i]!='{')&&(s[i]!='}')) /*操作數結束標志*/
s1[j++]=s[i++];
s1[j]='\0';
*a=atof(s1);
*c=s[i++];
}
void input_str() /*表達式接收模塊*/
{ int j,k,t=0;
char c,s1[80];
printf("\n請輸入任一算術表達式:\n");
while (!t)
{ gets(s);
j=k=0; t=1;
while ((s[j]!='=')&&(s[j]!='\0')&&(t)) /*判斷括弧配對*/
{if ((s[j]=='(')||(s[j]=='[')||(s[j]=='{'))
switch(s[j])
{ case '(':s1[k++]=')';break;
case '[':s1[k++]=']';break;
case '{':s1[k++]='}';
}
else if ((s[j]==')')||(s[j]==']')||(s[j]=='}'))
if (s1[--k]!=s[j])
{ printf("輸入出錯!請重新輸入(直接回車退出):\n");
t=0;
}
j++;
}
if ((k!=0)&&(t))
{printf("輸入出錯!請重新輸入(直接回車退出):\n");
t=0;
}
}
}
void proc2(double *a,char *c)
/*算術運算符之後只有兩種情況:要麼是各種左括弧,要麼是操作數*/
{ char ch;
if ((s[i]=='(')||(s[i]=='[')||(s[i]=='{'))
{ switch(s[i])
{ case '(':ch=')';break;
case '[':ch=']';break;
case '{':ch='}';
}
++i;
*a=proc1(ch);
/*計算從當前左括弧開始到與其相對應的右括弧結束這段表達式的值*/
*c=s[i++]; /*跳過右括弧*/
}
else str_read(a,c); /*讀取一個操作數*/
}
double proc1(char ch)
/*該過程對算術表達式s從當前位置s[i]開始到表達式結束或s[i]==ch這部分進行求值*/
{ double a1=0,a2,a=0;
char c1='+',c='+',c2='+';
/*給表達式前面加上"0+"(第一操作數與第一操作符)*/
while((c!='=')&&(c!='\0')&&(c!=ch))
{ proc2(&a,&c); /*讀取第二操作數與第二操作符.*/
while (c=='^' || c=='*' || c=='/')
{ proc2(&a2,&c2); /*讀取第三操作數與第三操作符.*/
switch (c) /*對第二操作符進行運算*/
{ case '*':a=a*a2; break;
case '/':a=a/a2; break;
case '^':a=pow(a,a2);
}
c=c2; /*把第三操作符賦給第二操作符變數*/
}
switch (c1) /*對第一操作符進行運算*/
{ case '+':a1=a1+a;break;
case '-':a1=a1-a;
}
c1=c; /*把第二操作符賦給第一操作符變數*/
}
return(a1); /*返回這部分表達式的值*/
}
int main(void)
{ system("cls");
input_str();
if (s[0]=='\0') return 0;
printf("該表達式的值是: ");
printf("%-8f\n",proc1('\0'));
system("pause");
return 0;
}
⑥ 用C語言編譯數學運算
這個是我的實驗報告,跟你的這個一樣的。如果只要代碼的話就看最後面的。我感覺應該算比較全面的。你看看,有什麼具體要求可以提出來。
一、需求分析
1、 功能:疏如一行表達式,若表達式有誤,則輸出「表達式有錯」 ,否則計算出表達式的值並輸出。 運算符包括加、減、乘、除、乘方、一目減。 括弧均為小括弧,但可以層層嵌套。操作數可以是浮點數,也包括有多個字母組成的變數。
2、 輸入的形式為表達式,按回車結束。輸入值的范圍不超過浮點數的范圍。含有變數,變數名由字母組成,大小寫不限。
3、 若計算結果為整數,則輸出整數,若含有小數,則輸出浮點數。
二、概要設計
1、 總體思路,先讀入一行表達式,用一個字元數組存儲。然後依次讀每個字元,進行判斷。邊讀入邊進行計算。程序中用到了兩個棧,一個字元棧以及一個數字棧,分別用來存儲運算符和數字,根據運算符的優先順序進行計算。最後輸出結果。
2、程序包括幾個模塊,主函數和幾個基本函數。
說明幾個函數:
bool stackempty(save1 s)用來判斷操作數棧s是否為空。
void push(save1 &s,char e)若棧滿則輸出「棧已滿」,否則將元素e入棧
void pop(save1 &s, char &e)若棧為空則輸出「棧為空」,否則將棧頂元素賦給e
bool stackempty2(save2 s)用來判斷運算符棧s是否為空。
void push2(save2 &s, char e)若運算符棧滿則輸出「棧已滿」,否則將元素e入棧
void pop2(save2 &s, char &e)若棧為空則輸出「棧為空」,否則將棧頂元素賦給e
int in(char e)返回運算符e在棧內的優先順序別
int out(char e) 返回運算符e在棧外的優先順序別
void count(char a,char ope, char b)將a、b進行相應的運算,並將運算結果入棧
3、具體操作步驟:
1、先讀入一行表達式,用一個字元數組line[]存儲
2、依次讀入每個字元並進行處理同是進行表達式判錯:
1. 遇數字,則繼續判斷下一個字元,直到下一個字元不是數字且不是小數點,若該數含有兩個小以上數點,則表示輸入錯誤。否則即可保證該操作數是完整的浮點數,然後將該數入操作數棧。
若數字不是表達式的最後一位,且數字後面跟的不是「+、-、*、/、^、)」,則為表達式錯誤
2. 遇運算符,則分兩種情況:
1、若運算符為負號(該運算符為符號的情況有兩種:一為負號在最開頭,一為符號前面是「(」 ),則先將0入操作數棧,然後再將負號入運算符棧。
2、該運算符不是負號則與運算符棧的棧頂元素比:
(1) 若棧頂元素優先順序低, 新輸入的運算符入棧。
(2) 若棧頂元素優先順序高,
1) 從符號棧彈出一個運算符,
2) 從對象棧彈出一個/兩個操作數,
3) 運算結果壓入對象棧。
(3) 優先順序相等,則棧頂元素出棧,與輸入元素對消。
若「(、+、-、*、/、^」放在表達式最後面,則表達式錯誤
若「+、-、*、/、^」後面跟的不是數字或者變數,表達式錯誤
3、遇字母變數,則繼續判斷下一個字元,直到下一個字元不是字母變數,即可保證該變數是完整的,然後輸出「請輸入變數的值」,再將輸入的變數值入操作數棧。
若變數後面跟的不是「+、-、*、/、^、)」,則表達式錯誤
4、若所讀的該字元不是上述情況中的一種,則表達式錯誤
3、當將所有的字元都讀一遍之後,若表達式正確的話,則必然不含有「(」或者「)」。即若運算符棧中含有「(」或者「)」,則表達式必錯誤。 再考慮表達式正確的情況:運算符棧可能為空,則操作符棧中必剩下一個操作數,即最後的結果。若不為空,則留在運算符棧中的運算符的優先順序別從棧頂至棧底依次遞減。故可從運算符棧頂開始彈出一個運算符,從操作數棧中彈出兩個操作數進行運算,再將運算結果入操作數棧,一直循環至運算符棧為空。此時操作數棧剩下的唯一一個操作數就是運算結果。
三、結論及體會
1、實驗結論
a)、實驗完成了題目的要求,自己添加了對浮點數的操作,並進行判錯。
b)、編寫代碼基本上能夠滿足編程規范的要求,代碼的變數命名,以及注釋的書寫,基本能按照要求進行。
b)、將數據結構中的隊列和堆棧的知識復習到,並且學會創新,在代碼的編寫中,學習了編程規范,學習了結構化編程。
2、實驗體會
a)、通過本設計實驗將數據結構中的堆棧和隊列的知識復習到,並且能夠自己設計一些東西,學會了在設計實驗過程時的基本步驟。基本上能夠有條理的解決這些問題。
b)、在試驗中遇到了很多的問題,都是以前沒有發現的,這些問題設計的方面很多,有以前的C++基礎的,也有最近學習的數據結構的知識。通過實驗的設計,讓我發現了自己的不足。自己在學習知識上面的漏洞。自己在細節方面的考慮還不夠全面,很多細節都是通過調試才發現的。比如剛開始時忘了考慮變數之前有負號的情況以及將整個式子讀一遍之後,棧中的操作數可能還有剩,還得繼續進行計算等。希望通過彌補這些發現的漏洞,提高自己的專業知識水平。
c)、設計過程中的解決問題的方法,讓我明白了如何學習會更有效。如何學習才不會耽誤太多的時間。也學會了解決問題的一般方法:向老師、同學請教,藉助網路等等。
d)、實驗過程中也走了很多的彎路,由於在開始設計的時候思路不時很清晰,對於一些問題不能很好的提出解決問題的方法,在設計過程中,代碼總是重復的修改,在很多問題上,代碼並不時最優的。相信在以後的學習中,隨著知識的增多,問題會逐漸得到解決。
四、程序源代碼
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
#define MAX 1000
struct save1
{
float n[MAX];
int top;
}stack1;
struct save2
{
char n[MAX];
int top;
}stack2;
//stack1存儲數字,stack2存儲運算符號.
bool stackempty(save1 s)//判斷是否為空
{
if (s.top== -1)
return 1;
else
return 0;
}
bool stackempty2(save2 s)//判斷是否為空
{
if (s.top== -1)
return 1;
else
return 0;
}
void push(save1 &s,float e)//將e入棧
{
if(s.top==MAX-1)
{
cout<<"棧已滿"<<endl;
return ;
}
s.top++;
s.n[s.top]=e;
}
void push2(save2 &s,char e)//將e入棧
{
if(s.top==MAX-1)
{
cout<<"棧已滿"<<endl;
return ;
}
s.top++;
s.n[s.top]=e;
}
void pop(save1 &s,float &e)//將棧頂元素出棧,存到e中
{
if(s.top==-1)
{ cout<<"棧為空"<<endl; }
else
{e=s.n[s.top]; s.top--; }
}
void pop2(save2 &s,char &e)//將棧頂元素出棧,存到e中
{
if(s.top==-1)
{ cout<<"棧為空"<<endl; }
else
{e=s.n[s.top]; s.top--; }
}
int in(char e)//e在棧內的優先順序別
{
if(e=='-' || e=='+') return 2;
if(e=='*' || e=='/') return 4;
if(e=='^') return 5;
if(e=='(') return 0;
if(e==')') return 7;
return -1;
}
int out(char e)//e在棧外的優先順序別
{
if(e=='-' || e=='+') return 1;
if(e=='*' || e=='/') return 3;
if(e=='^') return 6;
if(e=='(') return 7;
if(e==')') return 0;
return -1;
}
void count(float a,char ope,float b)//進行計算並將計算結果入棧
{
float sum;
if(ope=='+') sum=a+b;
if(ope=='-') sum=a-b;
if(ope=='*') sum=a*b;
if(ope=='/') sum=a/b;
if(ope=='^') sum=pow(a,b);
push(stack1,sum);
}
int main()
{
int i=0,len,j,nofpoint,g=0;//len表示輸入式子的長度。 g表示讀入的字元是否是字母變數、數字以及運算符。
float a,b;//a、b用來存儲操作數棧中彈出的操作數,便於代入函數中進行計算。
char line[MAX],operate,temp[20];
cout<<"請輸入表達式"<<endl;
cin>>line;
len=strlen(line);
stack1.top=-1;//將棧置為空
stack2.top=-1;//將棧置為空
while(1)
{
g=0;
if(isdigit(line[i]))//若讀入的字元為數字,則繼續判斷下一個字元,直到下一個字元不是數字或者不是小數點,即可保證該操作數是完整的小數,然後將該數入操作數棧。
{
j=0; g=1;
nofpoint=0;//記錄所存的數中小數點的個數
while(isdigit(line[i]) || line[i]=='.')
{
if(line[i]=='.') nofpoint++;
temp[j++]=line[i];
i++;
if(i>=len) break;
}
if( nofpoint>1 || (i<len&&(line[i]!='-' && line[i]!='+' && line[i]!='*' && line[i]!='/' && line[i]!='^' && line[i]!=')')) )
{ cout<<"表達式有錯"<<endl; return 0; }//所存數中含有不止一個小數點,或者數字後面跟的不是「+、-、*、/、^、)」,則為錯誤
temp[j]='\0';
b=atof(temp);
push(stack1,b);
if(i>=len) break;
}
else
{
if(line[i]=='-' || line[i]=='+' || line[i]=='*' || line[i]=='/' ||
line[i]=='^' || line[i]=='(' || line[i]==')' ) //若讀入的字元為運算符的情況
{
g=1;
if(line[i]=='(' && i==len) { cout<<"表達式有錯"<<endl; return 0; }// 「(」放表達式最後面,錯誤
if(line[i]=='-' || line[i]=='+' || line[i]=='*' || line[i]=='/' || line[i]=='^')
{
if(i==len) { cout<<"表達式有錯"<<endl; return 0; }//「+、-、*、/、^」放在表達式最後面,錯誤
if( (!isdigit(line[i+1])) && (!isalpha(line[i+1])) && line[i+1]!='(')//「+、-、*、/、^」後面跟的不是數字或者變數,錯誤
{ cout<<"表達式有錯"<<endl; return 0; }
}
if(line[i]=='-' && (i==0 || line[i-1]=='(' ))//運算符是負號
{
push(stack1,0);
push2(stack2,line[i]);
i++;
}
else
{ //讀入的運算符與運算符棧的棧頂元素相比,並進行相應的操作
if(in(stack2.n[stack2.top])<out(line[i])||stackempty2(stack2)) { push2(stack2,line[i]);i++;}
else
if(in(stack2.n[stack2.top])==out(line[i])) {i++; stack2.top--;}
else
if(in(stack2.n[stack2.top])>out(line[i]))
{
pop(stack1,a);
pop(stack1,b);
pop2(stack2,operate);
count(b,operate,a);
}
if(i>=len) break;
}
}
else
{
if(isalpha(line[i]))//讀入的字元是字母變數的情況
{
g=1;
cout<<"請輸入變數";
while( isalpha(line[i])) { cout<<line[i]; i++; }
cout<<"的值"<<endl;
cin>>b;
push(stack1,b);
if(i>=len) break;
if(line[i]!='-' && line[i]!='+' && line[i]!='*' && line[i]!='/' && line[i]!='^' && line[i]!=')')//變數後面跟的不是「+、-、*、/、^、)」,則為錯誤
{ cout<<"表達式有錯"<<endl; return 0; }
}
}
}
if(g==0) { cout<<"表達式有錯"<<endl; return 0; }//g=0表示該字元是不符合要求的字元
}
while(stack2.top!=-1)//讀入結束後,繼續進行操作,直到運算符棧為空
{
pop(stack1,a);
pop(stack1,b);
pop2(stack2,operate);
if(operate=='(' || operate==')') //括弧多餘的情況
{ cout<<"表達式有錯"<<endl; return 0; }
count(b,operate,a);
}
cout<<stack1.n[stack1.top]<<endl;
return 0;
}
⑦ 簡單說一下編譯程序怎樣編譯一個函數
高級語言在編譯的時候,編譯器會生成匯編,進而生成二進制文件.
高級語言編譯函數,先把函數的形參壓棧(有時候還有狀態寄存器等),再分配聲明的局部變數的內存空間,然後是函數處理,最後是出棧.
⑧ 用C語言寫一個加法運算的代碼怎麼寫
例子如下:
知識擴展:
C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
C語言屬於高級程序語言的一種,它的前身是「ALGOL」。其創始人是布朗·W·卡尼漢和丹尼斯·M·利奇。C語言問世時是帶有很大的局限性,因為它只能用於UNIX系統上。然而隨著科學技術的進步,計算機工業的發展,C語言逐漸脫離UNIX。1987年美國標准化協會制定了C語言的國際標准,簡稱「ANSI C」,從此以後它便成為一種廣泛使用的程序語言。
⑨ 怎樣用C語言編寫一個簡單的可以進行加減乘除運算混合運算的計算器
用C語言編寫一個簡單的可以進行加減乘除運算混合運算的計算器的方法:
1、打開visual C++ 6.0-文件-新建-文件-C++ Source File;
⑩ 怎麼用c語言編正弦函數計算
樓上的各位已經提到了scanf輸入控制與目標數據類型不匹配的問題,即應改為:scanf("%f",&n);
另外三樓有提到說角度與弧度的問題,就是說sin()和cos()輸入需要保證為弧度,所以你需要轉換一下,比如你這個90度就應該約是1.57。
其實我覺得應該弄清楚的是為什麼在輸入控制錯誤的情況下,還會產生這樣的結果。
這是因為輸入控制錯誤,導致n的值沒有變化,也就是說後邊計算正弦餘弦的時候也是計算的n的初始值。你可以在先不改正輸入控制的前提下,在輸入語句前加一個輸出語句,看看n值為多少,如果沒猜錯的話,應該是0,進而計算的結果也當是正確的。也許你要問了,不是說局部變數自動變數未初始化的話值是隨機值么,怎麼會是0呢?是的,我也很納悶,也許適合具體的編譯環境有關吧,不同的編譯環境對這種情況可能處理會有所不同吧,留待自己去探究咯~
希望能幫到你~歡迎交流~