導航:首頁 > 源碼編譯 > c標准庫演算法

c標准庫演算法

發布時間:2023-05-17 10:37:35

1. C語言中對字元串進行操作的標准庫函數有哪些

1)字元串操作
strcpy(p, p1) 復制字元串
strncpy(p, p1, n) 復制指定長度字元串
strcat(p, p1) 附加字元串
strncat(p, p1, n) 附加指定長度字元串
strlen(p) 取字元串長度
strcmp(p, p1) 比較字元串
strcasecmp忽略大小寫比較字元串
strncmp(p, p1, n) 比較指定長度字元串
strchr(p, c) 在字元串中查找指定字元
strrchr(p, c) 在字元串中反向查找
strstr(p, p1) 查找字元串
strpbrk(p, p1) 以目蘆迅標字元串的所有字元作為集合,在當前字元串查找該集合的任一元素
strspn(p, p1) 以目標字元串的所有字元作為集合,在當前字元串查找不屬於該集合的任一元素的偏移
strcspn(p, p1) 以目標字元串的所有字元作為集合,在當前字元串查找屬於該集合的任一元素的偏移
* 具有指定長度的字元串處理函數在已處理的字元串之後填姿嘩祥補零結尾符

2)字元串到數值類型的轉換
strtod(p, ppend) 從字元串 p 中轉換 double 類型數值,並將後續的字元串指針存儲到 ppend 指向的 char* 類型存儲。
strtol(p, ppend, base) 從字元串 p 中轉換 long 類型整型數值,base 顯式設置轉換的整型進制,設置為 0 以根據特定格式判斷所用進制,0x, 0X 前綴以解釋為十六進制格式整型,0 前綴以解釋為八進制格式整型
atoi(p) 字元串轉換到 int 整型
atof(p) 字元串轉換到 double 符點數
atol(p) 字元串轉換到 long 整型

3)字元檢查
isalpha() 檢查是否為字母字元
isupper() 檢查是否為大寫字母字元
islower() 檢查是否為小寫字母字元
isdigit() 檢查是否為數字
isxdigit() 檢查是否為十六進制數字表示的有效字元
isspace() 檢查是否為空格類型字元
iscntrl() 檢查是否為控制字元
ispunct() 檢查是否為標點符號
isalnum() 檢查是否為字母和數字
isprint() 檢查跡搏是否是可列印字元
isgraph() 檢查是否是圖形字元,等效於 isalnum() | ispunct()

2. 在C中,什麼是標准庫函數

在C語言程序設計里,C 標准函數庫(C Standard library) 是所有符合標準的頭文件(head file)的集合,以及常用的函數庫實現程序,例如I/O 輸入輸出和字元串昌裂姿控制。不像COBOL、Fortran和PL/I等編程語言,在 C 語言的工作任務里不會包含嵌入的關鍵字,所以幾乎所有的 C 語言程序都是由標准函數庫的函數來創建的。

每一個函數的名稱與特源搏性會被寫成一個電腦文件,這個文件就稱為頭文件,但是實際的函數實現是被分存到函數庫文件里。頭文件的命名和領域是很常見的,但是函數庫的組織架構也會因為不同的編譯器而有所不同。標准函數庫通常會隨附在編譯器上。因為 C 編譯器常會耐絕提供一些額外的非ANSI C函數功能,所以某個隨附在特定編譯器上的標准函數庫,對其他不同的編譯器來說,是不兼容的。

3. C++庫和C庫的區別

C++標准庫非常大。在C++標准中,關於標准庫的規格說明佔了密密麻麻300多頁,這還不包括標准C庫,後者只是 "作為參考"包含在C++庫中。

當然,並非總是越大越好,但在現在的情況下,確實越大越好,因為大的庫會包含大量的功能。標准庫中的功能越多,開發自己的應用程序時能藉助的功能就越多。C++庫並非提供了一切(沒有提供並發和圖形用戶介面的支持),但確實提供了很多。幾乎任何事都可以求助於它。


為標准庫中東西如此之多,你所選擇的類名或函數名就很有可能和標准庫中的某個名字相同。為了避免這種情況所造成的名字沖突,實際上標准庫中的一切都被放在
名字空間std中。但這帶來了一個新問題。無數現有的C++代碼都依賴於使用了多年的偽標准庫中的功能,例如,聲明
在<iostream.h>,<complex.h>,<limits.h>等頭文件中的功能。現有軟體沒有針對使
用名字空間而進行設計,如果用std來包裝標准庫導致現有代碼不能用,將是一種可恥行為。


於被激怒的程序員會產生的破壞力,標准委員會決定為包裝了std的那部分標准庫構件創建新的頭文件名。生成新頭文件的方法僅僅是將現有C++頭文件名中的
.h 去掉,方法本櫻此身不重要,正如最後產生的結果不一致也並不重要一樣。所以<iostream.h>變成
了<iostream>,<complex.h>變成了<complex>,等等。對於C頭文件,採用同樣的方法,
但在每個名字前還要添加一個c。所以C的<string.h>變成了<cstring>,<stdio.h>變成

了<cstdio>,等等。最後一點是,舊的C++頭文件是官方所反對使用的(即明確列出不再支持),但舊的C頭文件則沒有(以保持對C的兼
容性)。實際上,編譯器製造商不會停止對客戶現有軟體提供支持,所以可以預計,舊的C++頭文件在未來幾年內還是會被支持。

所以,實際來說,下面是C++頭文件的現狀:

· 舊的C++頭文件名如<iostream.h>將會繼續被支持,盡管它們不在官方標准中。這些頭文件的內容不在名字空間std中。

· 新的C++頭文件如<iostream>包含的基本功能和對應的舊頭文件相同,但頭文件的內容在名字空間std中。(在標准化的過程中,庫中有些部分的細節被修改了,所以舊頭文件和新頭文件中的實體不一定完全對應。)

· 標准C頭文件如<stdio.h>繼續被支持。頭文件的內容不在std中。

· 具有C庫功能的新C++頭文件具有如<cstdio>這樣的名字。它們提供的內容和相應的舊C頭文件相同,只是內容在std中。


有這些初看有點怪,但不難習慣它。最大的挑戰是把字元串頭文件理清楚:<string.h>是舊的C頭文件,對應的是基於char*的字元串

處理函數;<string>是包裝了std的C++頭文件,對應的是新的string類;<cstring>是對應於舊C頭文件
的std版本。如果能掌握這些,其餘的也就容易了。


於標准庫,需要知道的第二點是,庫中的一切幾乎都是模板。iostream幫助你操作字元流,但什麼是字元?是char嗎?是wchar_t?是
Unicode字元?一些其它的多位元組字元?沒有明顯正確的答案,所以標准庫讓脊返迅你去選。所有的流類(stream
class)實際上是類模板,在實例化流類的時候指定字元類型。例如,標准庫將cout類型定義為ostream,但ostream實際上是一個
basic_ostream<char>類型定義(typedef
)。


似的考慮適用於標准庫中其它大部分類。string不是類,它是類模板:類型參數限定了每個string類中的字元類型。complex不是類,它是類模
板:類型參數限定世悉了每個complex類中實數部分和虛數部分的類型。vector不是類,它是類模板。如此不停地進行下去。


標准庫中無法避開模板,但如果只是習慣於和char類型的流和字元串打交道,通常可以忽略它們。這是因為,對這些組件的char實例,標准庫都為它們定義
了typedef,這樣就可以在編程時繼續使用cin,cout,cerr等對象,以及istream,ostream,string等類型,不必擔心
cin的真實類型是basic_istream<char>以及string的真實類型是
basic_string<char>。


准庫中很多組件的模板化和上面所建議的大不相同。再看看那個概念上似乎很直觀的string。當然,可以基於 "它所包含的字元類型"
確定它的參數,但不同的字元集在細節上有不同,例如,特殊的文件結束字元,拷貝它們的數組的最有效方式,等等。這些特徵在標准中被稱為traits,它們
在string實例中通過另外一個模板參數指定。此外,string對象要執行動態內存分配和釋放,但完成這一任務有很多不同的方法。哪一個最好?選
擇:string模板有一個Allocator參數,Allocator類型的對象被用來分配和釋放string對象所使用的內存。

這里有一個basic_string模板的完整聲明,以及建立在它之上的string類型定義(typedef);可以在<string>頭文件中找到它(或與之相當的什麼東西):

namespace std {

template<class charT,
class traits = char_traits<charT>,
class Allocator = allocator<charT> >
class basic_string;

typedef basic_string<char> string;

}

注意,basic_string的traits
和Allocator參數有預設值。這在標准庫中是很典型的做法。它為使用者提供了靈活性,但對於這種靈活性所帶來的復雜性,那些只想做 "正常"
操作的"典型" 用戶卻又可以避開。換句話說,如果只想使用象C字元串那樣的字元串對象,就可以使用string對象,而不用在意實際上是在用
basic_string<char, char_traits<char>,
allocator<char> >類型的對象。

通常可以這么做,但有時還是得稍稍看看底層。例如,聲明一個類而不提供定義具有優點;它還指出,下面是一種聲明string類型的錯誤方法:

class string; // 會通過編譯,

先不要考慮名字空間,這里真正的問題在於:string不是一個類,而是一個typedef。如果可以通過下面的方法解決問題就太好了:

typedef basic_string<char> string;

但這又不能通過編譯。"所說的basic_string是什麼東西?" 編譯器會奇怪 ---- 當然,它可能會用不同的語句來問你。所以,為了聲明string,首先得聲明它所依賴的所有模板。如果可以這么做的話,就會象下面這樣:

template<class charT> struct char_traits;

template<class T> class allocator;

template<class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> >
class basic_string;

typedef basic_string<char> string;


而,你不能聲明string。至少不應該。這是因為,標准庫的實現者聲明的stirng(或std名字空間中任何其它東西)可以和標准中所指定的有所不
同,只要最終提供的行為符合標准就行。例如,basic_string的實現可以增加第四個模板參數,但這個參數的預設值所產生的代碼的行為要和標准中所
說的原始的basic_string一致。那到底該怎麼辦?不要手工聲明string(或標准庫中其它任何部分)。相反,只用包含一個適當的頭文件,
如<string>。

有了頭文件和模板的這些知識,現在可以看看標准C++庫中有哪些主要組件:

· 標准C庫。它還在,還可以用它。雖然有些地方有點小的修修補補,但無論怎麼說,還是那個用了多年的C庫。

· Iostream。和
"傳統"
Iostream的實現相比,它已經被模板化了,繼承層次結構也做了修改,增強了拋出異常的能力,可以支持string(通過stringstream
類)和國際化(通過locales)。當然,你期望Iostream庫所具有的東西幾乎全都繼續存在。也就是說,它還是支持流緩沖區,格式化標識符,操作

子和文件,還有cin,cout,cerr和clog對象。這意味著可以把string和文件當做流,還可以對流的行為進行更廣泛的控制,包括緩沖和格式
化。

·
String。string對象在大多數應用中被用來消除對char*指針的使用。它們支持你所期望的那些操作(例如,字元串連接,通過
operator[]對單個字元進行常量時間級的訪問,等等),它們可以轉換成char*,以保持和現有代碼的兼容性,它們還自動處理內存管理。一些
string的實現採用了引用計數,這會帶來比基於char*的字元串更佳的性能(時間和空間上)。

·
容器。標准庫提供了高效的容器實現:vector(就象動態可擴充的數組),list(雙鏈表),queue,
stack,deque,map,set和bitset。但多少可以作為補償的一點是,
string是容器。這很重要,因為它意味著對容器所做的任何操作對string也適用。

標准庫規定了每個類的介面,而且每條介面規范中的一部分是一套性能保證。所以,舉例來說,無論vector是如何實現的,僅僅提供對它的元素的訪問是不夠的,還必須提供 "常量時間" 內的訪問。如果不這樣,就不是一個有效的vector實現。


多C++程序中,動態分配字元串和數組導致大量使用new和delete,new/delete錯誤 ----
尤其是沒有delete掉new出來的內存而導致的泄漏 ----
時常發生。如果使用string和vector對象(二者都執行自身的內存管理)而不使用char*和動態分配的數組的指針,很多new和delete就
可以免於使用,使用它們所帶來的問題也會隨之消失。

· 演算法。標准庫就提供了大量簡易的方法(即,預定義函數,官方稱為演算法(algorithm) ---- 實際上是函數模板),其中的大多數適用於庫中所有的容器 ---- 以及內建數組(built-in arrays)。


法將容器的內容當作序列(sequence),每個演算法可以應用於一個容器中所有值所對應的序列,或者一個子序列(subsequence)。標准演算法有

for_each(為序列中的每個元素調用某個函數),find(在序列中查找包含某個值的第一個位置,count_if(計算序列中使得某個判定為真的

所有元素的數量),equal(確定兩個序列包含的元素的值是否完全相同),search(在一個序列中找出某個子序列的起始位置),(拷貝一個

序列到另一個),unique(在序列中刪除重復值),rotate(旋轉序列中的值),sort(對序列中的值排序)。注意這里只是抽取了所有演算法中的
幾個;標准庫中還包括其它很多演算法。

和容器操作一樣,演算法也有性能保證。例如,stable_sort演算法執行時要求不超過0比較級(N log N) 。(stable_sort提供的性能必須和最高效的通用排序演算法在同一個級別。)

· 對國際化的支持。不同的文化以不同的方式行事。和C庫一樣,C++庫提供了很多特性有助於開發出國際化的軟體。但雖然從概念上來說和C類似,其實C++的方法還是有所不同。例如,C++為支持國際化廣泛使用了模板,還利用了繼承和虛函數,這些一定不會讓你感到奇怪。


持國際化最主要的構件是facets和locales。facets描述的是對一種文化要處理哪些特性,包括排序規則(即,某地區字元集中的字元應該如何

排序),日期和時間應該如何表示,數字和貨幣值應該如何表示,怎樣將信息標識符映射成(自然的)明確的語言信息,等等。locales將多組facets

捆綁在一起。例如,一個關於美國的locale將包括很多facets,描述如何對美國英語字元串排序,如何以適合美國人的方式讀寫日期和時間,讀寫貨幣
和數字值,等等。而對於一個關於法國的locales來說,它描述的是怎麼以法國人所習慣的方式完成這些任務。C++允許單個程序中同時存在多個
locales,所以一個應用中的不同部分可能採用的是不同的規范。

·
對數字處理的支持。C++庫為復數類(實數和虛數部分的精度可以是float,double或long
double)和專門針對數值編程而設計的特殊數組提供了模板。例如,valarray類型的對象可用來保存可以任意混疊(aliasing)的元素。這
使得編譯器可以更充分地進行優化,尤其是對矢量計算機來說。標准庫還對兩種不同類型的數組片提供了支持,並提供了演算法計算內積(inner
proct),部分和(partial
sum),臨差(adjacent difference)等。

· 診斷支持。標准庫支持三種報錯方式:C的斷言,錯誤號,例外。為了有助於為例外類型提供某種結構,標准庫定義了下面的例外類(exception class)層次結構:

|---domain_error
|----- logic_error<---- |---invalid_argument
| |---length_error
| |---out_of_range
exception<--|
| |--- range_error
|-----runtime_error<--|---underflow_error
|---overflow_error

logic_error(或它的子類)類型的例外表示的是軟體中的邏輯錯誤。理論上來說,這樣的錯誤可以通過更仔細的程序設計來防止。runtime_error(或它的子類)類型的例外表示的是只有在運行時才能發現的錯誤。

可以就這樣使用它們,可以通過繼承它們來創建自己的例外類,或者可以不去管它。沒有人強迫你使用它。

上面列出的內容並沒有涵蓋標准庫中的一切。

標准庫中容器和演算法這部分一般稱為標准模板庫。STL中實際上還有第三個構件 ---- 迭代子(Iterator)。迭代子是指針似的對象,它讓STL演算法和容器共同工作。

STL
是標准庫中最具創新的部分,這並不是因為它提供了容器和演算法(雖然它們非常有用),而是因為它的體系結構。簡單來說,它的體系結構具有擴展性:可以對
STL進行添加。當然,標准庫中的組件本身是固定的,但如果遵循STL構建的規范,可以寫出自己的容器,演算法和迭代子,使它們可以和標准STL組件一起工

作,就象標准組件自身之間相互工作一樣。還可以利用別人所寫的符合STL規范的容器,演算法和迭代子,就象別人利用你的一樣。使得STL具有創新意義的原因
在於它實際上不是軟體,而是一套規范(convention)。標准庫中的STL組件只是具體體現了遵循這種規范所能帶來的好處。

通過使用標准庫中的組件,通常可以避免從頭到尾來設計自己的IO流,string,容器,國際化,數值數據結構以及診斷等機制。這就有更多的時間和精力去關注軟體開發中真正重要的部分:實現軟體的其他功能。

4. C++問題,如何使用標准庫

C++標准庫的內容基本可以分以下為10類。

C1. 標准庫中與語言支持功能相關的頭文件

頭文件

描 述

<cstddef>

定義宏NULL和offsetof,以及其他標准類型size_t和ptrdiff_t。與對應的標准C頭文件的區別是,NULL是C++空指針常量的補充定義,宏offsetof接受結構或者聯合類型參數,只要他們沒有成員指針類型的非靜態成員即可。

<limits>

提供與基本數據類型相關的定義。例如,對於每個數值數據類型,它定義了可以表示出來的最大值和最小值以及二進制數字的位數。

<climits>

提供與基本整數數據類型相關的C樣式定義。這些信息的C++樣式定義在<limits>中

<cfloat>

提供與基本浮點型數據類型相關的C樣式定義。這些信息的C++樣式定義在<limits>中

<cstdlib>

提供支持程序啟動和終止的宏和函數。這個頭文件還聲明了許多其他雜項函數,例如搜索和排序函數,從字元串轉換為數值等函數。它與對應的標准C頭文件stdlib.h不同,定義了abort(void)。abort()函數還有額外的功能,它不為靜態或自動對象調用析構函數,也不調用傳給atexit()函數的函數。它還定義了exit()函數的額外功能,可以釋放靜態對象,以注冊的逆序調用用atexit()注冊的函數。清除並關閉所有打開的C流,把控制權返回給主機環境。

<new>

支持動態內存分配

<typeinfo>

支持變數在運行期間的類型標識

<exception>

支持異常處理,這是處理程序中可能發生的錯誤的一種方式

<cstdarg>

支持接受數量可變的參數的函數。即在調用函數時,可以給函數傳送數量不等的數據項。它定義了宏va_arg、va_end、va_start以及va_list類型

<csetjmp>

為C樣式的非本地跳躍提供函數。這些函數在C++中不常用

<csignal>

為中斷處理提供C樣式支持

C2. 支持流輸入/輸出的頭文件

頭文件

描 述

<iostream>

支持標准流cin、cout、cerr和clog的輸入和輸出,它還支持多位元組字元標准流wcin、wcout、wcerr和wclog。

<iomanip>

提供操縱程序,允許改變流的狀態,從而改變輸出的格式。

<ios>

定義iostream的基類

<istream>

為管理輸出流緩存區的輸入定義模板類

<ostream>

為管理輸出流緩存區的輸出定義模板類

<sstream>

支持字元串的流輸入輸出

<fstream>

支持文件的流輸入輸出

<iosfwd>

為輸入輸出對象提供向前的聲明

<streambuf>

支持流輸入和輸出的緩存

<cstdio>

為標准流提供C樣式的輸入和輸出

<cwchar>

支持多位元組字元的C樣式輸入輸出

C3. 與診斷功能相關的頭文件

頭文件

描 述

<stdexcept>

定義標准異常。異常是處理錯誤的方式

<cassert>

定義斷言宏,用於檢查運行期間的情形

<cerrno>

支持C樣式的錯誤信息

C4. 定義工具函數的頭文件

頭文件

描 述

<utility>

定義重載的關系運算符,簡化關系運算符的寫入,它還定義了pair類型,該類型是一種模板類型,可以存儲一對值。這些功能在庫的其他地方使用

<functional>

定義了許多函數對象類型和支持函數對象的功能,函數對象是支持operator()()函數調用運算符的任意對象

<memory>

給容器、管理內存的函數和auto_ptr模板類定義標准內存分配器

<ctime>

支持系統時鍾函數

C5. 支持字元串處理的頭文件

頭文件

描 述

<string>

為字元串類型提供支持和定義,包括單位元組字元串(由char組成)的string和多位元組字元串(由wchar_t組成)

<cctype>

單位元組字元類別

<cwctype>

多位元組字元類別

<cstring>

為處理非空位元組序列和內存塊提供函數。這不同於對應的標准C庫頭文件,幾個C樣式字元串的一般C庫函數被返回值為const和非const的函數對替代了

<cwchar>

為處理、執行I/O和轉換多位元組字元序列提供函數,這不同於對應的標准C庫頭文件,幾個多位元組C樣式字元串操作的一般C庫函數納肆被返回值為const和非const的函數對替代了。

<仿慶cstdlib>

為把單位元組字元串轉換為數值、洞大轎在多位元組字元和多位元組字元串之間轉換提供函數

C6. 定義容器類的模板的頭文件

頭文件

描 述

<vector>

定義vector序列模板,這是一個大小可以重新設置的數組類型,比普通數組更安全、更靈活

<list>

定義list序列模板,這是一個序列的鏈表,常常在任意位置插入和刪除元素

<deque>

定義deque序列模板,支持在開始和結尾的高效插入和刪除操作

<queue>

為隊列(先進先出)數據結構定義序列適配器queue和priority_queue

<stack>

為堆棧(後進先出)數據結構定義序列適配器stack

<map>

map是一個關聯容器類型,允許根據鍵值是唯一的,且按照升序存儲。multimap類似於map,但鍵不是唯一的。

<set>

set是一個關聯容器類型,用於以升序方式存儲唯一值。multiset類似於set,但是值不必是唯一的。

<bitset>

為固定長度的位序列定義bitset模板,它可以看作固定長度的緊湊型bool數組

C7. 支持迭代器的頭文件

頭文件

描 述

<iterator>

給迭代器提供定義和支持

C8. 有關演算法的頭文件

頭文件

描 述

<algorithm>

提供一組基於演算法的函數,包括置換、排序、合並和搜索

<cstdlib>

聲明C標准庫函數bsearch()和qsort(),進行搜索和排序

<ciso646>

允許在代碼中使用and代替&&

C9. 有關數值操作的頭文件

頭文件

描 述

<complex>

支持復雜數值的定義和操作

<valarray>

支持數值矢量的操作

<numeric>

在數值序列上定義一組一般數學操作,例如accumulate和inner_proct

<cmath>

這是C數學庫,其中還附加了重載函數,以支持C++約定

<cstdlib>

提供的函數可以提取整數的絕對值,對整數進行取余數操作

C10. 有關本地化的頭文件

頭文件

描 述

<locale>

提供的本地化包括字元類別、排序序列以及貨幣和日期表示。

<clocale>

對本地化提供C樣式支持

5. 你們怎麼看C標准庫和各種操作系統API的關系

c標准庫是c標准里規族棚定的c語言要求的函數庫,這是為了讓標準的c語言具有移植性而規定的,可以由於不同的操作系統的實現方式不同,c標准沒有規定其實現,對於不同的編程系統,根據其情況實現全部或部分標准庫,遲穗碰有些系統還碼談增加了一些自定義函數。 api是操作系統提供給應用程序的編程介面,他是應用程序實現其它功能的基礎,c標准庫在特定的操作系統就用這個操作系統來實現一些功能,當然,有些標准庫函數可以不用api來實現,這時這種函數在不同系統的實現方式就大致一致,比如strcpy,可有些函數就與api有關,比如繪圖函數,這些函數會用系統的繪圖api來實現標準的繪圖函數,對於這種功能我們可以用c標准庫也可以用api。 總的來說,c標准庫是個標准,目的是實現程序代碼級可移植,api是系統的介面,與操作系統有關,對於不用的系統,c標准庫實現是不一樣的,有些還需要系統api來實現。用api是為了與系統銜接,實現一些特定的功能,用c標准庫是為了代碼級可移植。

6. 參考C++標准庫中的泛型演算法(如find等)設計並實現求最大值的泛型演算法max,該演算法返回容器中數據的最大值

#include/*演算法概要:a1, a2a2取第一個數a1作為組合的第一個數,然後從剩下的數a2an中取r-1個數進行剩下的組合,完成一次循環然後取第二個數a2作為組合的第一個數,然後從剩下的數a3an中取r-2個數進行剩下的組合,完成一次循環依此類推,得到全部的組合。慶茄迅*//* 進行排列輸出的主函數 a: n個數據的數組 n: 數據個數 r: 組合的r result: 緩存本次組合的數組 aindex: 當前組合的a下標 resultindex: 當前組合的結果下標*/ void C(int a[], int n, int r, int result[], int aindex, int resultindex){// 如果已經組合夠r個數據,輸出if (resultindex >= r){for (int x=0; x>n>>譽此r; // 輸入組合的n,r值int* a = new int[n];for (int i=0; i>a[i]; // 輸入數據}CC(a, n, r); // 組合輸出納游delete[] a;return 0;}

7. [計算機][c語言][編程] 跪求c語言標准庫函數的詳解(高手請進)!郵箱:[email protected]

推薦:
1.C語言編程寶典

2.C In China

3.網路C語言吧

4.編程中國

5.C語言之家

6.C語言基地

c語言基地 有名校教師 視頻 教學

我認為要學好C語言首先必須了解等級考試C語言的大綱和內容,以及各種輔助材料的用途,這是學好C的基礎。從以前的經驗以及考網上的一些信息可知,要自學C語言必須准備以下資料:

1、 教材:大家現在都公認是清華大學譚浩強主編的那本,當然有其他的也可以,如高校出版社的。

2、 習題集:我認為清華大學的《C語言樣題匯編》不錯。書後面附有答案。

3、 上機練習:我認為南開大學的那個可以,最好是在考前從頭到尾做一遍。答案可以去考網下載區下載。

4、 大綱:這個肯定要的,可以在考網二級版那裡去下,然後列印出來。

5、 自學計劃:為了做到有計劃有目的地學習C語言,大家可以根據自己的學習(或工作)情況,制定一個自學計劃,循序漸進地學習。

6、 模擬盤:為了更好地熟悉考場環境,下一個模擬盤是必不可少的,可以在。下載,注意,在下載時要把鎖匙盤一起下回來,否則不能進入考試環境。

7、 教學光碟:如果能買到C語言的教學光碟,那當然更好,這樣可以更直觀地學習C語言了。

下面從微觀上針對C語言的幾個重點和難點,逐個談談具體的自學方法。

二 如何學習C語言的運算符和運算順序

C語言的運算功能十分豐富,運算種類遠多於其它程序設計語言。因此,當多種不同運算組成一個運算表達式,即一個運算式中出現多種運算符時,運算的優先順序和結合規則顯得十分重要。

初學者往往對此感到非常困難,覺得C語言學習太繁雜,其實只要我們對此合理進行分類,找出它們與我們在數學中所學到運算之間的不同點之後,記住這些運算也就不困難了,有些運算符在理解後更會牢記心中,將來用起來得心應手,而有些可暫時放棄不記,等用到時再記不遲。

下面是所有的運算符按優先順序不同分類列表:(對不起,因為表格顯示不正常,已被我刪除大家可以看書上的)

表中列出15種優先順序的運算符,從高到低,優先順序為1 ~ 15,最後邊一欄是結合規則,除第2、3級和第14級為從右至左結合外,其它都是從左至右結合,它決定同級運算符的運算順序。

下面我們通過幾個例子來說明:

(1) 3*20/4%10 這個表達式中出現3種運算符,是同級運算符,運算順序按從左至右結合,因此先計算3 * 20=60,然後被4除,結果為15,最後是%(求余數)運算,所以表達式的最終結果為15%10 = 5

(2)a = 3;b = 5;c =++ a* b ;d =a + +* b;

例子中的「;」是C語言的語句分隔符,執行順序為從左到右,第1條語句執行後a的值為3,第2條語句執行後b的值為5,第3條語句中有兩個運算符前置+ +和*,按表中所列順序,+ +先執行,*後執行,所以+ + a執行後,a的值為4,由於+ +為前置運算,所以a的值4參與運算,C的值為20,最後執行第4條語句,由於a + +為後置運算,所以a值為4參與運算,使得d的值仍為20,而a參與運算後其值加1,值為5。

這個例子執行後,a的值為5,b的值為5,c的值為20,d的值也是20。

(3)a = 3,b = 5,b+ = a,c = b* 5

例子中的「,」是逗號結合運算,上式稱為逗號表達式,自左向右結合,最後一個表達式的結果值就是逗號表達式的結果,所以上面的逗號表達式結果為40,a的值為3,b的值為8,c的值為40。

三、如何學習C語言的四種程序結構

(1)順序結構

這種結構的程序比較簡單,就是按照語句的排列順序依次執行的機制。順序結構的執行順序是自上而下,依次執行,因此編寫程序也必須遵守這一規定,否則你的程序執行結果就不對。

例如;a = 3,b = 5,現交換a,b的值,正確的程序為:

c = a;

a = b;

b = c;

執行結果是a = 5,b = c = 3如果改變其順序,寫成:

a = b;

c = a;

b = c;

則執行結果就變成a = b = c = 5,不能達到預期的目的,這是初學者常犯的錯誤。

順序結構可以獨立使用構成一個簡單的完整程序,常見的輸入、計算,輸出三步曲的程序就是順序結構,例如計算圓的面積,其程序的語句順序就是輸入圓的半徑R,計算S = 3.14159*R*R,輸出圓的面積S。而大多數情況下順序結構都是作為程序的一部分,與其它結構一起構成一個復雜的程序,例如分支結構中的塊體、循環結構中的循環體等。

C語言自學方法(2)

(2) 分支結構

分支結構與順序結構不同,其執行是依據一定的條件選擇執行路徑,而不是嚴格按照語句出現的物理順序。分支結構的程序設計方法的關鍵在於構造合適的分支條件和分析程序流程,根據不同的程序流程選擇適當的分支語句。

分支結構適合於帶有邏輯條件判斷的計算,設計這類程序時往往都要先繪制其程序流程圖,然後根據程序流程寫出源程序,這樣做把程序設計分析與語言分開,使得問題簡單化,易於理解。程序流程圖是根據解題分析所繪制的程序執行流程圖。

學習分支結構不要被分支嵌套所迷惑,只要弄清基本的分支結構,嵌套結構也就不難了。嵌套只不過是分支塊體中又包括分支語句而已,不是新知識,只要你基礎知識扎實,分支嵌套也難不住你,下面我們重點討論幾種基本的分支結構的學習方法。

①If(條件)

{



}

這種分支結構中的塊可以是一條語句,此時「{

}」可以省略,也可以是多條語句。它有兩條分支路徑可選,一條是條件為真,執行塊,另一條是條件不滿足,跳過塊。

如,計算x的絕對值,根據絕對值定義,我們知道,當x>=0時,其絕對值不變,而x<0時其絕對值是為x的反號,因此程序段為:if(x<0)

x=-x;

②if(條件)

else

這是典型的分支結構,如果條件成立,執行塊1,否則執行塊2,塊1和塊2都有1條或若干條語句構成。

如:求ax^2+bx+c=0的根

分析:因為當b^2-4ac>=0時,方程有兩個實根,否則(b^2-4ac<0)有兩個共軛復根。其程序段如下:

d=b*b-4*a*c;

if(d>=0)

{x1=(-b+sqrt(d))/2a;

x1=(-b-sqrt(d))/2a;

printf(「x1=%8.4f,x2=%8.4f\n」,x1,x2);

}

else

{r=-b/(2*a);

i =sqrt(-d)/(2*a);

printf(「x1=%8.4f+%8.4fi\n」r, i);

printf(「x2=%8.4f-%8.4fi\n」r,i)

}

③多路分支:其語句格式為:

if(條件1) ;

else if(條件2)

else if(條件3)

……

else if(條件n)

else

④switch語句:

switch

語句也是多分支選擇語句,又稱為多路開關語句,到底執行哪一塊,取決於開關設置,也就是表達式的值與常量表達式相匹配的那一路,它不同if—else 語句,它的所有分支都是並列的,程序執行時,由第一分支開始查找,如果相匹配,執行其後的塊,接著執行第2分支,第3分支……的塊,直到遇到break語句;如果不匹配,查找下一個分支是否匹配。

(3)循環結構:

循環結構可以減少源程序重復書寫的工作量,用來描述重復執行某段演算法的問題,這是程序設計中最能發揮計算機特長的程序結構,C語言中提供四種循環,即goto循環、while循環、do –while循環和for循環。

四種循環可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提昌用goto循環,所以下面我們重點講解另外的三種循環。

常用的三種循環結構學習的重點在於弄清它們相同與不同之處,以便在不同場合下使用,大家好好看一下書中三種循環的格式和執行順序,如何替換使用,如把while循環的例題,用for語句重新編寫一個程序,這樣能更好地理解它們的作用。

注意:在while和do—while循環體內和for

循環中的第3語句中,應包含趨於結束的語句(如I++,I--),否則就可能成了一個死循環,這也是初學者的一個常見錯誤。

下面我們來討論下這三種循環的異同之處:

用while和do—while循環時,循環變數的初始化的操作應在循環體之前,而for循環是在語句1中進行的;while

循環和for循環都是先判斷表達式,後執行循環體,而do—while循環是先執行循環體後判斷表達式,也就是說do—while的循環體最少被執行一次,而while

循環和for就不一定了。這三種循環都可以用break語句跳出循環,用continue語句結束本次循環,而goto語句與if構成的循環,不能用break和

continue語句進行控制。

這三種結構並不是彼此孤立的,在循環中可能出現分支、順序結構,分支中也可能出現循環、順序結構而把循環、分支看成一個語句,它又是構成順序結構的一個元素,因此這三種結構相互結合,就能實現各種演算法,設計出解題程序,但若是很大的題目,這樣編出的程序往往很長,重復結構多,並且可閱讀性差,因此我們常將C程序設計成模塊化結構。

(4)模塊化程序結構

C語言的模塊化程序結構用函數來實現,即將復雜的C程序分為若干模塊,每個模塊都編寫成一個合法的C函數,然後用主函數調用函數及函數調用函數實現一大C程序:C程序=主函(main)+若干個函數。

在程序設計中,常將一些常用的功能模塊寫成函數,也可以將大程序段分割成若干函數,前者目的在於減少重復編寫程序段的工作量,後者目的在於縮短模塊長度,以便程序閱讀方便。

一個源程序文件由一個或多個函數組成,它是一個編譯單位,而一個C程序由一個或多個源程序文件組成。對較大的程序,往往分成多個文件,這樣可以分別編寫、分別編譯,提高高調試效率,一個源程序文件可以被多個C程序公用。

C程序的的執行是從main()函數開始,調用其它函數後流程回到main函數,在main中結束整個函數運行,main函數的稱是系統規定的,用戶可以修改其內容即函數體,但不能修改其名稱和參數,一個C程序必須有一個main函數,也只能有一個main函數。

所有函數都是平行的,即在定義函數時是互相獨立的一個函數度不從屬於另一個函數,即函數不能嵌套定義,但可以互相調用,但不能調用main函數。

函數分成兩類,即標准函數和用戶自定義函數,標准函數又稱庫函數,由系統提供,用戶可直接調用,C語言提供了豐富的庫函數,請考生在編寫C程序時查閱教材後的函數說明,這可節省你的編程工作量;用戶自定義函數由編程者自己編寫.
回答者:阿拉蕾啊呀 - 試用期 一級 7-23 11:13

提問者對於答案的評價:
太好了,非常感謝!
評價已經被關閉 目前有 1 個人評價

100% (1) 不好
0% (0)

對最佳答案的評論
19798802 C語言新手群快加入吧!!!!!!1
評論者: 549045259 - 見習魔法師 二級

浮躁的人容易問:我到底該學什麼;----別問,學就對了;浮躁的人容易說:我要中文版!我英文不行!----不行?學呀!浮躁的人分兩種:只觀望而不學的人;只學而不堅持的人;浮躁的人永遠不是一個高手。
評論者: hnytgl - 試用期 一級

其他回答共 4 條
1.讀代碼!
2.改代碼!
3.寫代碼!
回答者:liuding1213 - 見習魔法師 二級 7-18 21:10

找一本經典教材,例如譚浩強的《C語言陳序設計》。
找一本習題集,要有全部詳細解釋的那種,最好有實例的代碼答案。

花一個月把課本看完,務求理解。不理解的地方也不要死摳,做上標記等以後再解決。然後開始做題,不要因為題目簡單就放過,往往簡單背後蘊藏大的發現。也可以快速看完書,然後復習,每復習完一章後把習題集上的題目好好做一遍。
做題時最好在計算機上把不明白的地方親自實踐一下,然後在筆記本上寫下自己的感想和心得。考試前翻一翻筆記即可。

千里之行始於足下,行動吧!
你的串號我已經記下,採納後我會幫你製作

8. c++標准庫有哪些

C++標准庫函數
c++程序通常可以調用標准c++庫中的大量函數。這些函數完成一些基本的服務,如輸入和輸出等,同時也為一些經常使用的操作提供了高效的
實現代碼。這些函數中含有大量的函數和類定義,以幫助程序員更好地使用標准c++庫。
標准c++庫包含以下內容:
,,,,,,,,,,,,<iterat
or>,,,,,,,,,,,,,,<strin
ig>,,,,,,,,,,,,,<cse
tjmp>,,,,,,,,,和
標准c++庫的詳細消息均在其對應的頭文件進行了說明。主要標准c++庫頭文件如下所示。其中13項為標准模板庫(STL),在其說明文字的前面標有(STL)的為標准模板庫。
---(STL)用於定義實現常用、實用演算法的大量模板
----- 用於定義官位位集合的模板類
-----用於在程序執行時執行斷言
-----用於對字元進行分類
-----用於測試有庫函數提交的錯誤代碼
------用於測試浮點類型屬性
----用於在ISO646變體字元集中編程
-----用於測試整數類型屬性
-----用於使程序適應不同的文化風俗
———用於計算常用的數學函數
-----用於定義支持復雜演算法的模板類
-----用於執行非局部的goto語句
------用於控制各種異常情況
-----用於訪問參數數量文化的函數
-----用於訪問參數數量變化的函數
----用於定義實用的類型和宏
-----用於執行輸入和輸出
----用於執行同一操作的不同版本
-----用於處理幾種不同的字元串類型
------用於在幾種不同的時間和日期格式間進行轉換
----用於處理寬流(wide stream)和字元串
---用於對寬字元(wide character是)分類
---(STL)用於定義實現雙向隊列容器的模板類
---用於定義控制異常處理的幾個函數
-----用於定義處理外部文件的幾個iostream模板類
-----(STL)用於定義幾個模板,該模板將幫助在和中定義的 模板構造謂詞
---- 用於聲明一個帶有參數的iostreams控制器
-----用於定義用作大量iostreams類的基類的模板類
-----用於定義iostreams模板類(在需要定義之前)
---用於聲明處理標准流的iostreams對象
---用於定義執行析取操作的模板類
----(STL)用於定義幫助定義和管理迭代器的模板
---用於測試數字類屬性
---(STL)用於定義實現list容器的模板類
----用於定義在iostreams類中控制與特定位置相關的行為的類和模板
------(STL)用於定義實現關聯容器的模板類
-----(STL)用於定義對不同容器分配和釋放內存的模板
-----(STL)用於定義實現實用數字函數的模板
----用於定義管理字元串容器的iostreamas模板類
----(STL)用於實現隊列容器的模板類
-----(STL)用於定義實現只有唯一元素的關聯容器的模板類
----用於定義管理字元串容器的iostreams模板類
-----(STL)用於定義實現堆棧容器的模板類
----用於定義提交異常的類
----用於定義為iostreams操作分配緩沖區的模板類
------用於定義是實現字元串容器的模板類
-----用於定義處理非內存(in-memory)字元系列的iostreams類
-----(STL)用於定義通用工具的模板
----用於定義支持值(value-oriented)數組的類和模板類
----(STL)用於定義實現向量容器的模板類
標准c++庫還包括18個標准C庫中的頭文件,但其中有些變化。我們暫時不討論,這些頭文件為:
---用於在程序運行時執行斷言
----用於對字元分類
----用於測試用庫函數提交的錯誤代碼
----用於測試浮點類型屬性
-----用於在IOS646變體字元集中編程
-----用於測試整數類型屬性
-----用於適應不同的文化習俗
----用於計算常見的數學函數
----用於執行非局部的goto語句
----用於控制各種異常情況
-----用於訪問參數數量變化的函數
-----用於定義類型和宏
------用於執行輸入和輸出
------用於執行各種操作
-----用於處理字元串
-------用於在不同的時間和日期格式之間轉換
-----用於處理寬流(wide stream)和字元類
-----用於對寬字元(wide character)分類

原載地址:http://blog.csdn.net/wh0826/article/details/5380634
分類: C & C++

9. C++標准庫主要就指STL嗎

關於STL的定義,不同人理解不一。現在有人直接把 STL 定義為「the standard library」,但通常而言, STL 指的是標准庫的容器、迭代器、演算法這幾個部分,而這遠不是C++標准庫的全部內容。

在C++開始標准化之時,一個名叫SGI STL的庫被標准委員會投入極大關注,後來被吸收進C++標准庫,主要構成 C++ 標准庫的容器庫(Containers library)、迭代器庫(Iterators library)、演算法庫(Algorithms library)部分。因此後人有時就直接用 STL 指代標准庫的容器、迭代器、演算法這幾個部分。
但是C++標准庫並非只含有容器、迭代器、演算法這幾個部分,其他的還有每個新手都會用到的輸入輸出庫(Input/output library,iostream、fstream都屬於這里),以及字元串庫(Strings library)、異常診斷庫(Diagnostics library,包括 std::logic_error、std::runtime_error等異常類,assert這樣的工具也屬於這里)、數值運算庫(Numerics library,包括 std::complex 以及相關的復數運算,隨機數生成等)、語言支持庫(Language support library)、Localization library等,以及C++11加入的正則表達式庫(Regular expressions library)、原子操作庫(Atomic operations library)、線程支持庫(Thread support library),和不好歸類的「通用工具庫」(General utilities library)等
顯然我們不能說「容器、迭代器、演算法」就是C++標准庫的全部,把「容器、迭代器、演算法」說成C++標准庫的主要部分恐怕也是有問題的

閱讀全文

與c標准庫演算法相關的資料

熱點內容
住宿app可砍價是什麼意思 瀏覽:131
java跳出語句 瀏覽:53
javastring個數 瀏覽:926
人工免疫演算法應用 瀏覽:77
有什麼app能收聽俄羅斯廣播電台 瀏覽:34
2015考研紅寶書pdf 瀏覽:443
程序員幾月跳槽合適 瀏覽:443
液壓油可壓縮嗎 瀏覽:944
源泉cad加密文件 瀏覽:125
銀河v10驅動重編譯 瀏覽:891
電腦上文件夾右擊就會崩潰 瀏覽:691
右美維持演算法 瀏覽:938
php基礎編程教程pdf 瀏覽:220
穿越之命令與征服將軍 瀏覽:351
android廣播重復 瀏覽:832
像阿里雲一樣的伺服器 瀏覽:319
水冷空調有壓縮機嗎 瀏覽:479
訪問日本伺服器可以做什麼 瀏覽:434
bytejava詳解 瀏覽:450
androidjava7 瀏覽:386