當前位置:首頁 » 編程語言 » c語言的歷史記錄
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言的歷史記錄

發布時間: 2023-05-27 14:12:22

『壹』 dev中c語言代碼被替換了怎麼找回

如果你使用的是開發環境(IDE),例如Visual Studio、Code::Blocks等,那麼通常有一個版本控制系統可以幫助你找回之前的代碼。
如果你使用了Git等版本控制知陪工具,可以通過查看提交記錄和比較不同版本之間的差異來找回之前的代碼。如果你沒有使用版本控制工具,也可以在開發環境中查看編輯器的撤銷歷史記錄,嘗試找回之前的代碼。
另外,如果你曾經保存過這段代碼並且知道文件名和保存路徑蠢談,也可以通過搜帶猛碰索文件的方式來找回之前的代碼。
如果以上方法都無法找回之前的代碼,那麼很遺憾,可能需要重新編寫一遍。所以,我們要養成良好的代碼管理習慣,及時備份代碼並使用版本控制工具,以防止數據丟失。

『貳』 字元串變數不支持歷史記錄怎麼辦

可以間接使用報警記錄。
在報警文本的伏棗州組態界面中點擊滑鼠右缺蔽鍵,插入變數域,顯示類型修改為文本,然後關聯字元串,間接實現字元串變數歷史記錄。
字元串變數是C語言中通常使用字元數組作為字元串變數來存放一個字元串,數組中每一個岩羨元素存放一個字元。

『叄』 c語言演算法

C語言演算法的基本概念包括演算法的特徵:有窮性,確定性,可行性,輸入和輸出5個方面。所謂演算法,就是為解決某一特定問題而採取的具體工作步驟和方法。

(3)c語言的歷史記錄擴展閱讀

C語言是一門面向過程的計算機編程語言,與C++、Java等面向對象編程語言有所不同。C語言的設計目標是提供吵衫一種能以簡易的方式編譯、處理低級存儲器、僅產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。C語言描述問題比匯編語言迅速、工作量小、可讀性好、易於調試、修改和移植,而代碼質量與匯編語言相當。C語言一般只比匯編語言代碼生成的目標程序效率低10%-20%。因此,C語言可以編寫系統軟體。

當前階段,在編程領域中,C語言的運用非常之多,它兼顧了高級語言和匯編語言的優點,相較於其它編程語言具有較大優勢。計算機系統設計以及應用程序編寫是C語言應用的兩大領域。同時,C語言的普適較強,在許多計算機操作系統中都能夠得到適用,且效率顯著。

C語言擁有經過了漫長發展歷史的完整的理論體系,在編程語言中具有舉足輕重的地位。

所並此謂演算法,就是為解決某一特定問題而採取的具體工作步驟和方法。當編寫一個程序的時候,總是要先想好這個程序是干什麼的,應該如何實現這個目標,程序應該先完成什麼功能,接下來進行什麼操作,處理這個程序的格式是什麼,等等一系列的問題,在有些情況下,還需要涉及其他領域,如數學,物理,因此在考慮以上所有因素的時候,都應該考慮一個關鍵的問題——演算法。基本演算法策略包括:枚舉法、歸納法、遞歸法以及排序的各類方法。

1、枚舉法:

常被稱之為窮舉法,是指從可能的集合中一一枚舉各個元素,用題目給定的約束條件判定哪些是無用的,哪些是有用的。能使命題成立者,即為問題的解。

採用枚舉演算法解題的基本思路:

a、確定枚舉對象、枚舉范圍和判定條件;

b、一一枚舉可能的解,驗證是否是問題的解

2、歸納法:

這是一個相對比較「聰明」的`方法,看到問題之後,可以通過分析歸納,找出從變數舊值出發求出新值的規律。

可以用歸納法解決的問題,它們的相鄰數之間有著明顯的規律性的變化,通常可以從初始條件進行一定的歸納求出下一個值,並利用這種規律性一步一步遞推到結果。如循環累乘、循環累加等。

3、遞歸法:

一般使用在函數的調用上,所謂函數的「遞歸調用」是指一個函數直接調用自己(即直接遞歸調用)或通過其他函數間接地調用自己(即間接遞歸調用)。

4、排序的各類方法:

a、冒泡排序

就是將被排序的記錄數組arr[0]…arr[n]進行排列,每個記錄arr[i]看作是「氣泡」。根據輕氣泡不能在重氣升蔽腔泡之下的原則,從下到上掃描數組arr,凡掃描到違反本原則的輕氣泡,就使其向上「漂浮」。如此反復進行,直到最後任何兩個氣泡輕者在上,重者在下為止。

b、選擇排序

這是一種很簡單的排序方法,它的基本解題思路:選擇法排序(設對N個數進行排序)是每次從待排序數據中選擇最小的數,與相應位置上的數交換。

『肆』 C的發展歷史是什麼情況

C語言的發展歷史

[編輯本段]

C語言的原型ALGOL 60語言。

(也稱為A語言)

1963年,劍橋大學將ALGOL 60語言發展成為CPL(bined Programming Language)語言。

1967年,劍橋大學的Matin Richards 對CPL語言進行了簡化,於是產生了BCPL語言。

1970年,美國貝爾實驗室的Ken Thompson將BCPL進行了修改,並為它起了一個有趣的名字「B語言」。

意思是將CPL語言煮干,提煉出它的精華。

並且他用B語言寫了第一個UNIX操作系統。

而在1973年,B語言也給人「煮」了一下,美國貝爾實驗室的D.M.RITCHIE在B語言的基礎上最終設計出了一種新的語言,他取了BCPL的第二個字母作為這種語言的名字,這就是C語言。

為了使UNIX操作系統推廣,1977年Dennis M.Ritchie 發表了不依賴於具體機器系統的C語言編譯文本《可移植的C語言編譯程序》。

即是著名的ANSI C。

1978年由美國電話電報公司(AT&T)貝爾實驗室正式發表了C語言。

同時由B.W.Kernighan和D.M.Ritchit合著了著名的「THE C PROGRAMMING LANGUAGE」一書。

通常簡稱為《K&R》,也有人稱之為《K&R》標准。

但是,在《K&R》中並沒有定義一個完整的標准C 語言,後來由美國國家標准協會(American National Standards Institute)在此基礎上制定了一個C 語言標准,於一九八三年發表。

通常稱之為ANSI C。

1988年,隨著微型計算機的日益普及, C語言出現了許多版本。

由於沒有統一的標准,使得這些C語言之間出現了一些不一致的地方。

為了改變這種情況,美國國家標准研究所(ANSI)為C語言制定了一套ANSI標准, 成為現行的簡豎首C語言標准3.C語言的主要特點 。

C語言發展迅速, 而且成為最受歡迎的語言之一, 主要因為它具有強大的功能。

許多著名的系統軟體, 如DBASE Ⅲ PLUS、DBASE Ⅳ 都是由C 語言編寫的。

用C語言加上一些匯編語言子程序, 就纖粗更能顯示C語言的優勢了,象PC- DOS 、WORDSTAR等就是用這種方法編寫的。

C語言的優點

[編輯本段]

1. 簡潔緊湊、靈活方便

C語言一共只有32個關鍵字,9種控制語句,程序書寫自由,主要用小寫字母表示。

它把高級語言的基本結構和語句與低級語言的實用性結合起來。

C 語言可以象匯編語言一樣對位、位元組和地址進行操作, 而這三者是計算機最基本的工作單元。

2. 運算符豐富

C的運算符包含的范圍很廣泛,共有種34個運算符。

C語言把括弧、賦值、強制類型轉換等都作為運算符處理。

從而使C的運算類型極其豐富表達式類型多樣化,靈活使用各種運算符可以實現在其它高級語言中難以實現的運算。

3. 數據結構豐富

C的數據類型有:整型、實型攔數、字元型、數組類型、指針類型、結構體類型、共用體類型等。

能用來實現各種復雜的數據類型的運算。

並引入了指針概念,使程序效率更高。

另外C語言具有強大的圖形功能, 支持多種顯示器和驅動器。

且計算功能、邏輯判斷功能強大。

4. C是結構式語言

結構式語言的顯著特點是代碼及數據的分隔化,即程序的各個部分除了必要的信息交流外彼此獨立。

這種結構化方式可使程序層次清晰, 便於使用、維護以及調試。

C語言是以函數形式提供給用戶的,這些函數可方便的調用,並具有多種循環、條件語句控製程序流向,從而使程序完全結構化。

5. C語法限制不太嚴格,程序設計自由度大

雖然C語言也是強類型語言,但它的語法比較靈活,允許程序編寫者有較大的自由度。

6. C語言允許直接訪問物理地址,可以直接對硬體進行操作

因此既具有高級語言的功能,又具有低級語言的許多功能,能夠象匯編語言一樣對位、位元組和地址進行操作,而這三者是計算機最基本的工作單元,可以用來寫系統軟體。

7. C語言程序生成代碼質量高,程序執行效率高

一般只比匯編程序生成的目標代碼效率低10へ20%。

8. C語言適用范圍大,可移植性好

C語言有一個突出的優點就是適合於多種操作系統, 如DOS、UNIX,也適用於多種機型。

C語言的缺點

[編輯本段]

1. C語言的缺點主要是表現在數據的封裝性上,這一點使得C在數據的安全性上做的有很大缺陷,這也是C和C++的一大區別。

2. C語言的語法限制不太嚴格,對變數的類型約束不嚴格,影響程序的安全性,對數組下標越界不作檢查等。

從應用的角度,C語言比其他高級語言較難掌握。

[C語言指針]

指針就是C語言的一大特色,可以說C語言優於其它高級語言的一個重要原因就是因為它有指針操作可以直接進行靠近硬體的操作,但是C的指針操作也給它帶來了很多不安全的因素。

C++在這方面做了很好的改進,在保留了指針操作的同時又增強了安全性。

Java取消了指針操作,提高了安全性。

C源程序的結構特點

[編輯本段]

1.一個C語言源程序可以由一個或多個源文件組成。

2.每個源文件可由一個或多個函數組成。

3.一個源程序不論由多少個文件組成,都有一個且只能有一個main函數,即主函數。

4.源程序中可以有預處理命令(include 命令僅為其中的一種),預處理命令通常應放在源文件或源程序的最前面。

5.每一個說明,每一個語句都必須以分號結尾。

但預處理命令,函數頭和花括弧「}」之後不能加分號。

6.標識符,關鍵字之間必須至少加一個空格以示間隔。

若已有明顯的間隔符,也可不再加空格來間隔。

『伍』 C語言程序注釋

C語言編程規范-注釋

規則:
1:一般情況下,源程序有效注釋量必須在20%以上。
說明雹悄:注釋的原則是有助於對程序的閱讀理解,在該加的地方棚肆擾都加了,注釋不宜太多也不能太少,注釋語言必須准確、易懂、簡潔。
2:說明性文件(如頭文件.h文件、.inc文件、.def文件、編譯說明文件.cfg等)頭部應進行注釋,注釋必須列出:版權說明、版本號、生成日期、作者、內容、功能、與其它文件的關系、修改日誌等,頭文件的注釋中還應有函數功能簡要說明。
示例:下面這段頭文件的頭注釋比較標准,當然,並不局限於此格式,但上述信息建議要包含在內。
/*************************************************
Copyright (C), 1988-1999, Tech. Co., Ltd.
File name: // 文件名
Author:
Version:
Date: // 作者、版本及完成日期
Description: // 用於詳細說明此程序文件完成的主要功能,與其他模塊
// 或函數的介面,輸出值、取值范圍、含義及參數間的控
// 制、順序、獨立或依賴等關系
Others: // 其它內容的說明
Function List: // 主要函數列表,每條記錄應包括鏈旦函數名及功能簡要說明
1. ....
History: // 修改歷史記錄列表,每條修改記錄應包括修改日期、修改
// 者及修改內容簡述
1. Date:
Author:
Modification:
2. ...
*************************************************/
3:源文件頭部應進行注釋,列出:版權說明、版本號、生成日期、作者、模塊目的/功能、主要函數及其功能、修改日誌等。
示例:下面這段源文件的頭注釋比較標准,當然,並不局限於此格式,但上述信息建議要包含在內。
/************************************************************
Copyright (C), 1988-1999, Tech. Co., Ltd.
FileName: test.cpp
Author:
Version :
Date:
Description: // 模塊描述
Version: // 版本信息
Function List: // 主要函數及其功能
1. -------
History: // 歷史修改記錄
<author> <time> <version > <desc>
David 96/10/12 1.0 build this moudle
***********************************************************/
說明:Description一項描述本文件的內容、功能、內部各部分之間的關系及本文件與其它文件關系等。History是修改歷史記錄列表,每條修改記錄應包括修改日期、修改者及修改內容簡述。

4:函數頭部應進行注釋,列出:函數的目的/功能、輸入參數、輸出參數、返回值、調用關系(函數、表)等。
示例:下面這段函數的注釋比較標准,當然,並不局限於此格式,但上述信息建議要包含在內。

/*************************************************
Function: // 函數名稱
Description: // 函數功能、性能等的描述
Calls: // 被本函數調用的函數清單
Called By: // 調用本函數的函數清單
Table Accessed: // 被訪問的表(此項僅對於牽扯到資料庫操作的程序)
Table Updated: // 被修改的表(此項僅對於牽扯到資料庫操作的程序)
Input: // 輸入參數說明,包括每個參數的作
// 用、取值說明及參數間關系。
Output: // 對輸出參數的說明。
Return: // 函數返回值的說明
Others: // 其它說明
*************************************************/

5:邊寫代碼邊注釋,修改代碼同時修改相應的注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除。
6:注釋的內容要清楚、明了,含義准確,防止注釋二義性。
說明:錯誤的注釋不但無益反而有害。
7:避免在注釋中使用縮寫,特別是非常用縮寫。
說明:在使用縮寫時或之前,應對縮寫進行必要的說明。
8:注釋應與其描述的代碼相近,對代碼的注釋應放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面,如放於上方則需與其上面的代碼用空行隔開。
示例:如下例子不符合規范。

例1:
/* get replicate sub system index and net indicator */

repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
例2:
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
/* get replicate sub system index and net indicator */
應如下書寫
/* get replicate sub system index and net indicator */
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
9:對於所有有物理含義的變數、常量,如果其命名不是充分自注釋的,在聲明時都必須加以注釋,說明其物理含義。變數、常量、宏的注釋應放在其上方相鄰位置或右方。
示例:
/* active statistic task number */
#define MAX_ACT_TASK_NUMBER 1000

#define MAX_ACT_TASK_NUMBER 1000 /* active statistic task number */
10:數據結構聲明(包括數組、結構、類、枚舉等),如果其命名不是充分自注釋的,必須加以注釋。對數據結構的注釋應放在其上方相鄰位置,不可放在下面;對結構中的每個域的注釋放在此域的右方。
示例:可按如下形式說明枚舉/數據/聯合結構。
/* sccp interface with sccp user primitive message name */
enum SCCP_USER_PRIMITIVE
{
N_UNITDATA_IND, /* sccp notify sccp user unit data come */
N_NOTICE_IND, /* sccp notify user the No.7 network can not */
/* transmission this message */
N_UNITDATA_REQ, /* sccp user's unit data transmission request*/
};
11:全局變數要有較詳細的注釋,包括對其功能、取值范圍、哪些函數或過程存取它以及存取時注意事項等的說明。
示例:
/* The ErrorCode when SCCP translate */
/* Global Title failure, as follows */ // 變數作用、含義
/* 0 - SUCCESS 1 - GT Table error */
/* 2 - GT error Others - no use */ // 變數取值范圍
/* only function SCCPTranslate() in */
/* this moal can modify it, and other */
/* mole can visit it through call */
/* the function GetGTTransErrorCode() */ // 使用方法
BYTE g_GTTranErrorCode;
12:注釋與所描述內容進行同樣的縮排。
說明:可使程序排版整齊,並方便注釋的閱讀與理解。
示例:如下例子,排版不整齊,閱讀稍感不方便。
void example_fun( void )
{
/* code one comments */
CodeBlock One

/* code two comments */
CodeBlock Two
}

應改為如下布局。
void example_fun( void )
{
/* code one comments */
CodeBlock One

/* code two comments */
CodeBlock Two
}
13:將注釋與其上面的代碼用空行隔開。
示例:如下例子,顯得代碼過於緊湊。
/* code one comments */
program code one
/* code two comments */
program code two

應如下書寫
/* code one comments */
program code one

/* code two comments */
program code two
14:對變數的定義和分支語句(條件分支、循環語句等)必須編寫注釋。
說明:這些語句往往是程序實現某一特定功能的關鍵,對於維護人員來說,良好的注釋幫助更好的理解程序,有時甚至優於看設計文檔。
15:對於switch語句下的case語句,如果因為特殊情況需要處理完一個case後進入下一個case處理,必須在該case語句處理完、下一個case語句前加上明確的注釋。
說明:這樣比較清楚程序編寫者的意圖,有效防止無故遺漏break語句。
示例(注意斜體加粗部分):
case CMD_UP:
ProcessUp();
break;

case CMD_DOWN:
ProcessDown();
break;

case CMD_FWD:
ProcessFwd();

if (...)
{
...
break;
}
else
{
ProcessCFW_B(); // now jump into case CMD_A
}

case CMD_A:
ProcessA();
break;

case CMD_B:
ProcessB();
break;

case CMD_C:
ProcessC();
break;

case CMD_D:
ProcessD();
break;
...
建議:
1:避免在一行代碼或表達式的中間插入注釋。
說明:除非必要,不應在代碼或表達中間插入注釋,否則容易使代碼可理解性變差。
2:通過對函數或過程、變數、結構等正確的命名以及合理地組織代碼的結構,使代碼成為自注釋的。
說明:清晰准確的函數、變數等的命名,可增加代碼可讀性,並減少不必要的注釋。
3:在代碼的功能、意圖層次上進行注釋,提供有用、額外的信息。
說明:注釋的目的是解釋代碼的目的、功能和採用的方法,提供代碼以外的信息,幫助讀者理解代碼,防止沒必要的重復注釋信息。
示例:如下注釋意義不大。
/* if receive_flag is TRUE */
if (receive_flag)

而如下的注釋則給出了額外有用的信息。
/* if mtp receive a message from links */
if (receive_flag)
4:在程序塊的結束行右方加註釋標記,以表明某程序塊的結束。
說明:當代碼段較長,特別是多重嵌套時,這樣做可以使代碼更清晰,更便於閱讀。
示例:參見如下例子。
if (...)
{
// program code

while (index < MAX_INDEX)
{
// program code
} /* end of while (index < MAX_INDEX) */ // 指明該條while語句結束
} /* end of if (...)*/ // 指明是哪條if語句結束
5:注釋格式盡量統一,建議使用"/* …… */"。
6:注釋應考慮程序易讀及外觀排版的因素,使用的語言若是中、英兼有的,建議多使用中文,除非能用非常流利准確的英文表達。
說明:注釋語言不統一,影響程序易讀性和外觀排版,出於對維護人員的考慮,建議使用中文。

『陸』 c語言程序設計附錄要寫什麼

附錄?注釋吧?
如果是注釋一般有:

'版權說明

'文件名

'版本號

'日期

'作者

'模塊描述,
描述本文件的內容、功能、內部各部分之間的關系及本文件與其它文件關系等

'修改歷史記錄列表,每條修改記錄應包括修改日期、修改者及修改內容簡述

『柒』 學習C語言 必看的書籍

給C++初學者的50個忠告
1.把C++當成一門新的語言學習(和C沒啥關系!真的。);
2.看《Thinking In C++》,不要看《C++變成死相》;
3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因為他們很難而我們自己是初學者所以就不看;
4.不要被VC、BCB、BC、MC、TC等詞彙所迷惑——他們都是集成開發環境,而我們要學的是一門語言;
5.不要放過任何一個看上去很簡單的小編程問題——他們往往並不那麼簡單,或者可以引伸出很多知識點;
6.會用Visual C++,並不說明你會C++;
7.學class並不難,template、STL、generic programming也不過如此——難的是長期堅持實踐和不遺餘力的博覽群書;
8.如果不是天才的話,想學編程就不要想玩游戲——你以為你做到了,其實你的C++水平並沒有和你通關的能力一起變高——其實可以時刻記住:學C++是為了編游戲的;
9.看Visual C++的書,是學不了C++語言的;
10.浮躁的人容易說:XX語言不行了,應該學YY;——是你自己不行了吧!?
11.浮躁的人容易問:我到底該學什麼;——別問,學就對了;
12.浮躁的人容易問:XX有錢途嗎;——建議你去搶銀行;
13.浮躁的人容易說:我要中文版!我英文不行!——不行?學呀!
14.浮躁的人容易問:XX和YY哪個好;——告訴你吧,都好——只要你學就行;
15.浮躁的人分兩種:a)只觀望而不學的人;b)只學而不堅持的人;
16.把時髦的技術掛在嘴邊,還不如把過時的技術記在心裡;
17.C++不僅僅是支持面向對象的程序設計語言;
18.學習編程最好的方法之一就是閱讀源代碼;
19.在任何時刻都不要認為自己手中的書已經足夠了;
20.請閱讀《The Standard C++ Bible》(中文版:標准C++寶典),掌握C++標准;
21.看得懂的書,請仔細看;看不懂的書,請硬著頭皮看;
22.別指望看第一遍書就能記住和掌握什麼——請看第二遍、第三遍;
23.請看《Effective C++》和《More Effective C++》以及《Exceptional C++》;
24.不要停留在集成開發環境的搖籃上,要學會控制集成開發環境,還要學會用命令行方式處理程序;
25.和別人一起討論有意義的C++知識點,而不是爭吵XX行不行或者YY與ZZ哪個好;
26.請看《程序設計實踐》,並嚴格的按照其要求去做;
27.不要因為C和C++中有一些語法和關鍵字看上去相同,就認為它們的意義和作用完全一樣;
28.C++絕不是所謂的C的「擴充」——如果C++一開始就起名叫Z語言,你一定不會把C和Z語言聯系得那麼緊密;
29.請不要認為學過XX語言再改學C++會有什麼問題——你只不過又在學一門全新的語言而已;
30.讀完了《Inside The C++ Object Model》以後再來認定自己是不是已經學會了C++;
31.學習編程的秘訣是:編程,編程,再編程;
32.請留意下列書籍:《C++面向對象高效編程(C++ Effective Object-Oriented Software Construction)》《面向對象軟體構造(Object-Oriented Software Construction)》《設計模式(Design Patterns)》《The Art of Computer Programming》;
33.記住:面向對象技術不只是C++專有的;
34.請把書上的程序例子親手輸入到電腦上實踐,即使配套光碟中有源代碼;
35.把在書中看到的有意義的例子擴充;
36.請重視C++中的異常處理技術,並將其切實的運用到自己的程序中;
37.經常回顧自己以前寫過的程序,並嘗試重寫,把自己學到的新知識運用進去;
38.不要漏掉書中任何一個練習題——請全部做完並記錄下解題思路;
39.C++語言和C++的集成開發環境要同時學習和掌握;
40.既然決定了學C++,就請堅持學下去,因為學習程序設計語言的目的是掌握程序設計技術,而程序設計技術是跨語言的;
41.就讓C++語言的各種平台和開發環境去激烈的競爭吧,我們要以學習C++語言本身為主;
42.當你寫C++程序寫到一半卻發現自己用的方法很拙劣時,請不要馬上停手;請盡快將餘下的部分粗略的完成以保證這個設計的完整性,然後分析自己的錯誤並重新設計和編寫(參見43);
43.別心急,設計C++的class確實不容易;自己程序中的class和自己的class設計水平是在不斷的編程實踐中完善和發展的;
44.決不要因為程序「很小」就不遵循某些你不熟練的規則——好習慣是培養出來的,而不是一次記住的;
45.每學到一個C++難點的時候,嘗試著對別人講解這個知識點並讓他理解——你能講清楚才說明你真的理解了;
46.記錄下在和別人交流時發現的自己忽視或不理解的知識點;
47.請不斷的對自己寫的程序提出更高的要求,哪怕你的程序版本號會變成Version 100.XX;
48.保存好你寫過的所有的程序——那是你最好的積累之一;
49.請不要做浮躁的人;
50.請熱愛C++!

建議你買本書,書比網上的電子版教程好的多,如計算機屆超級權威教授 譚浩強 老先生寫的《C語言程序設計(第三版)》,全國發行了700萬冊,可以說是學C語言的人必看的書,我們大學就用這本書,很適合自學,通俗易懂

建議你學習其它計算機知識時也看他的書,他出的書很多,涵蓋面廣,每一本都很經典

這里有他的教程word版下載

另外,機械工業出版社的 計算機叢書系列也相當經典,全是翻譯國外經典教材,國外計算機發展早,水平比國內高很多,看這些教材事半功倍,推薦(美)Al Kelley Ira Pohl的《C語言教程第4版》

學習程序語言要持之以恆,不浮躁,祝你成功!

『捌』 c語言單鏈表實現消費歷史記錄

#include <stdio.h>
#include <malloc.h>
// 定義單鏈表數據結構
struct Node
{
int Data;
struct Node* next;
};
// 定義該單汪攜鏈表的類型困拍伏名
typedef struct Node* pNodeList;
// 實現鏈表指定區間數據的反轉操作
void ReverseList(pNodeList L, int iBegin, int iEnd, int iListlen)
{
// L為空鏈表或者只有一個節賀顫點時,直接返回
if(NULL == L ||
NULL == L->next)
{
return ;
}

// 反轉區間開始和結束位置相同時,即:反轉區間長度為0時,直接返回
if(iBegin >= iEnd || iBegin <=0 || iEnd > iListlen)
{
return ;
}
// 定義當前節點、下一結點、結尾節點
pNodeList pCurrentNode = NULL;
pNodeList pNextNode = NULL;
pNodeList pLastNode = NULL;
pNodeList pPreNode = NULL;
// 臨時變數,用於判斷節點位置
int i = 0;
int j = 0;

// 為開始和結尾節點賦值,得到需要反轉區間
while(L->next != NULL)
{
if(i == iBegin-1)
pPreNode = L;
else if(i == iBegin)
pCurrentNode = L;
else if(i == iEnd+1)
{
pLastNode = L;
break;
}
L = L->next;
i++;
}
i = i-2;
// 對屬於需要轉置的區間結點進行轉置操作
while(i>0)
{
pNextNode = pCurrentNode->next;
pCurrentNode->next = pLastNode;
pLastNode = pCurrentNode;
pCurrentNode = pNextNode;
i--;
}
// 前面結點指向調整
pPreNode->next = pLastNode;
return ;
}
void InsertItemIntoList(pNodeList L)
{
pNodeList pNode,temp;
int i;

if(NULL == L)
return;
pNode = L;

for(i=0;i<10;i++)
{
temp=(pNodeList)malloc(sizeof(struct Node));
temp->Data = i;
temp->next = NULL;
pNode->next = temp;
pNode = pNode->next;
}
return ;
}
void FreeListMemory(pNodeList L)
{
if(NULL == L)
return;
pNodeList pNode = L;
while(pNode->next != NULL)
{
pNodeList temp = pNode->next;
pNode->next = temp->next;
free(temp);
}
return;
}
void PrintListElement(pNodeList L)
{
if(NULL == L)
return;
pNodeList pNode = L->next;
while(pNode != NULL)
{
printf(" %d ", pNode->Data);
pNode = pNode->next;
}
printf("\n");
}
void main()
{
pNodeList pHead;
pHead = (pNodeList)malloc(sizeof(struct Node));
if(NULL == pHead)
return;
pHead->next = NULL;
pHead->Data = -1;
InsertItemIntoList(pHead);
PrintListElement(pHead);
ReverseList(pHead, 2, 4, 10);
PrintListElement(pHead);
FreeListMemory(pHead);
getchar();
}