樹星c語言
『壹』 自學c語言 零基礎 看什麼書 該怎麼學
現在,市面上的
C語言書籍多的數不過來,但是很多不適合你這種初學者使用,作為一名老程序員,我給你推薦幾本我看過認為還不錯的書:
1)
《C語言小白變怪獸》:既適合對計算機一竅不通的小白,也適合有編程基礎的讀者,還可以用來進階。同時,最重要的是,這本書的作者還在不斷地更新這本書,我認為最大的特點是通俗易懂,深入淺出,只要認真看,就一定能看懂,我認為這是C語言入門的首選教材,吐血推薦,經典中的經典!!!
2)
《啊哈C語言》:適合對計算機一竅不通的純小白,有編程基礎的讀者請忽略。這本書語言幽默,生動形象,通俗易懂,給人耳目一新的感覺,但是這本書非常淺顯,並不深入,所以適合純小白入門,找到門以後也就扔了。這本書著重於語言藝術,針對純小白下足了功夫,小學生坐在馬桶上都能學會編程。說實話,我非常欣賞作者的創意和用心,國內像這樣寫書的少之又少,入門的書就應該是這個樣子。
上邊這兩本書是我推薦給你用於C語言入門的,我不建議你使用譚浩強的《C語言程序設計》這本書入門,雖然這本書的知名度很高,因為很多大學把它作為C語言的授課教材,然而,這本書被吐槽最多,不但代碼不標准,而且有很多錯誤,據說可以找出幾十個錯誤,這樣很容易誤導你這種小白。
等你有一定的C語言基礎了,可以看下面的這幾本書,進一步提升你的編程水平:
1)
《C
Primer
Plus》:暢銷
30
余年的C語言入門經典書籍,至今無人能撼動它的地位,它是最符合C語言標準的書籍,作為一名C語言程序員,不收藏一本都覺得自己很水。
2)
《C程序設計語言,The
C
Programming
Language》:C語言創始人丹尼斯·里奇(Dennis
MacAlistair
Ritchie)的著作,和《C
Primer
Plus》並駕齊驅,很難分出伯仲,這兩本書都是一樣的優秀,都是C語言程序員必須收藏的。
3)
《C專家編程》:適合已經具備C語言基礎、想進階的讀者。這貌似是一本吐槽C語言的書,基本上介紹了大多數C語言的坑,有不少精髓,在C語言界久負盛名,進階時一定要看。
4)
《C陷阱與缺陷》:和《C專家編程》類似,也是給C語言挑刺的,闡述了很多容易讓人誤解的語法細節,重在幫助C程序員繞過編程過程中的陷阱和障礙。
5)
《程序員的自我修養
--
鏈接、裝載與庫》:這真是一本深入骨髓的書,讓你徹底明白程序的編譯、鏈接、裝載和運行的全過程,你會從此上天,拉開和別人的差距,看任何問題都有了深度和高度。重點推薦!
所有的這些書我都有電子版,需要可以找我要!
『貳』 c語言二叉樹問題
#include
#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define NULL 0
typedef int status;
typedef struct bitnode{ /*二叉樹的結點*/
char data;
struct bitnode *lchild,*rchild;
}bitnode,*bitree;
bitree t;
status createbitree(bitree *t) /*按先序次序輸入值建立二叉樹*/
{
char ch;
scanf("%c",&ch);fflush(stdin);/*清除緩存區里的回車改咐察*/
if(ch=='*') *t=NULL;/*這里以星號作為結束標志*/
else{
if(!(*t=(bitnode *)malloc(sizeof(bitnode))))exit(OVERFLOW);
(*t)->data=ch;
createbitree(&((*t)->lchild));
createbitree(&((*t)->rchild));
}
return OK;
}
status visit(char ch) /*對二叉樹每個結點元素的訪問操作*/
{
printf("%c",ch);
return OK;
} /*你這個visit函數好像沒什麼作用?可以刪掉*/
status preordertraverse(bitree t) /*按先序訪問二叉樹*/
{
if(t)
{
printf("%c",t->data);
if(preordertraverse(t->lchild))
if(preordertraverse(t->rchild))return OK;
return ERROR;
}else return OK;
}
status jh(bitree t)
{
bitree x;
x=t->lchild;
t->lchild=t->rchild;
t->rchild=x;
return OK;
}
status exchange(bitree t) /*交換二叉樹中所有結點的左、右子樹*/
{
if(t)
{
jh(t);
if(jh(t->lchild)) /*這里是最重要的地方,你好像寫錯了吧*/
if(jh(t->rchild))return OK;
return ERROR;
}else return OK;
}
void main()
{
printf("input to create binary tree:\n");
createbitree(&t); /*按先序建立二叉樹*/
printf("create ok");/*提示createbitree函數沒有出問題*/
exchange(t);/*交換每個結點的左、右子樹*/
printf("\n");/*輸出一個換行*/核茄
preordertraverse(t); /*按先序訪問修改後的二叉樹簡瞎*/
getch();
}
我試過了,可以
『叄』 如何學習C語言
學習方法是:
1、課前預習,課後復習,認真做課堂、課後的作業,理解理論知識。
2、記住語法規則。
3、加強邏輯思維。
4、多動手,通過練習上機了解它的運行過程。
5、實踐—>理論—>再實踐,剛開始學習C語言時,按示例練習,並推動理論的學習,然後再自己多思考,多上機實踐。
拓展資料
C語言是一門通用計算機編程語言,廣泛應用於底層開發。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
『肆』 如何學好C語言
所有初學者面臨的第一個問題便是:如何選擇教材。好的開始是成功的一半,選擇一本優秀的教材是事半功倍的關鍵因素。不幸的是,學校通常會幫你指定一本很差勁的C語言課本;而幸運的是,你還可以再次選擇。沒有學習交流地方可以來
所以我建議初學者應該以Visual C++ 6.0(不是VisualC++ .NET)或者Dev C++作為主要的學習環境,而且千萬不要在IDE的使用技巧上過多糾纏,因為今後你一定要轉向Unix環境的。Visual C++ 6.0使用很方便,調試也很直觀,但其默認的編譯器對C標準的支持並不好,而Dev C++使用gcc編譯器,對C99的標准都支持良好。使用順帶提一下,很多大學的C語言課程還在使用Turbo C 2.0作為實驗環境,這是相當不可取的,原因其一是TC 2.0對C標准幾乎沒有支持,其二是TC 2.0編譯得到的程序是16位的,這對今後理解32位的程序會造成極大的困擾(當然,用djgpp之類的東西可以使TC 2.0編譯出32位程序,不過那過於復雜了)。
等你學完一本C語言的教材,你一定要轉向Unix平台繼續學習,幾乎所有的C語言高級教程都是基於Unix平台的(比如《C專家編程》)。轉變的過程是痛苦的,你需要面對的是各種紛繁復雜的命令,完全不同於Windows平台的思考方式,但是這種痛苦是值得的。Unix與C是共生的,Unix的思考方式和習慣更加符合C語言的思考方式和習慣。在Unix下,你可以找到無數優秀的源代碼供你盡情閱讀,你可以方便地查看某個庫函數的聯機手冊,還可以看到最優秀的代碼風格(說到代碼風格,我會專門寫一篇文章詳細敘述)。
歸結起來就是一句話:初學C語言,建議使用Windows系統和集成開發環境,在准備向「高手」方向努力時,請先轉向Unix平台。
三、萬事俱備,你就是東風
書已選定,環境配置完成,正所謂萬事俱備,只欠你自己的努力了。請從書的前言開始,仔細地閱讀手頭的教材,很多人看書喜歡直接從第一章開始看,這是錯誤的做法。前言是作者對整本書的大體介紹,作者一般會告訴你需要什麼基礎才能夠順利閱讀本書,這可以幫助你檢驗自己的基礎知識是否已經具備。看完前言,還要瀏覽一下目錄,了解一下書的整體結構,順便給自己安排一下學習計劃。
學習C語言,必需注意每一個細節,書上的例子代碼一定要自己親自敲一遍,編譯執行輸出都跟書上說的一致才能算是學完了一個例子,如果不一致,就要仔細找原因。出了書本上有的例子,自己還要「創造」一些例子,比如學習運算符優先順序的時候,可以寫幾個相同的表達式,在不同的位置加上括弧,看看有哪些不同的行為,比如*p++和(*p)++,又比如a = b == c、(a = b) == c和a = (b == c)等等。自己抄的書上的例子以及改造之後的例子,還有自己「創造」的例子,都應該仔細地歸類保存,並且要在源代碼中寫上簡短的注釋,闡述這個例子的意圖。
例子之後就是習題了,我建議初學者把所有的習題都獨立做一遍,然後對照答案的代碼,看看自己的代碼有那些不足,再試著修改自己的代碼。很多人不重視習題,這是極大的錯誤,因為作者通常會在習題中說明一些重要的道理,而不是單純地檢驗前面的知識。
也許你認為這樣學習太慢,其實不然。學得細致就不用走回頭路,等你學到後面才發現自己前面沒搞清楚,那才是真的得不償失。一般說來,整本書讀完,你應該完成數千行乃至上萬行的代碼,無論是原封不動照抄書上的,還是自己心血來潮寫就的,都是今後繼續學習的一筆財富。以我自己舉例,閱讀《Windows核心編程》時(我只閱讀了3/4的內容),除了抄書上的代碼,還自己寫了很多例子,一共有5574行(用unix下的wc工具統計),時隔多日,我早已記不清Windows的系統編程了,但只要花幾分鍾翻出以前的代碼看看,便會重新瞭然於胸。所謂好記性不如爛筆頭,就是這個道理。
仔細讀書、認真抄寫源代碼、獨立完成習題外加更進一步的實驗,最後將所有的代碼留下,成為自己的經驗和財富,絕對的辛苦,也絕對的事半功倍。當然,這種方式只適合學習需要精通的技術,如果不是學習C語言,你還要具體情況具體分析。
寫到最後,還有非常非常重要的一點沒有提及──代碼風格,從最開始學習就必須強迫自己模仿最優秀的代碼風格。因為代碼風格太重要內容也太多,我會用專門的一篇文章來詳細討論,請大家關注《程序員之路──關於代碼風格》。
題目是關於C語言,其實我主要想說說程序該怎麼學,或者一點感悟罷了,在這里,我只想引用身邊的幾個人的例子,來談一下對程序學習的理解
第一個人要說到我了,我對程序產生興趣,是聽說程序可以作游戲,那時候是在初一,然而借來一本G-BASIC簡明教材後,我便傻了眼。
陌生的詞彙,古怪的邏輯,都是些天文的中文譯本,頭疼了好一陣子。
然而當時又沒有別的閑書可看,我就整天捧著那一本書,什麼方法都試過了,甚至倒著看過了,都沒看出什麼眉目,自己又沒有電腦,只能不停地大膽地想像,然後滿腦子的疑惑……
在這里停一下,上面說的便是我學習的風格:總要經歷一番波折,瞎折騰幾下,然後才會有偶然間的明悟-開竅了!我甚至沒見過幾個人有我這么笨,現在明白過來了,我總是一開始把事情想得過於復雜,造成狗咬刺蝟的難堪的局面,然而竟然有意想不到的收獲!但是不建議大家模仿這種風格,起碼追女朋友的時候不能這樣,生活中很多機會在於接手的那一瞬間,失去就永遠找不回來了。
現在回來,後來偶然間,我看懂了一行代碼,是print 語句,當時興奮得要命,又仔細看了這個看了那個,一下子看懂了很多東西,像是在霎那間被什麼給擊中似的,立刻間醍醐灌頂。。。。
初三在學校學了FOXBASE,基本上自學的,我發現了一件奇怪的事,我這人是出了名的記性不好,然而當時背程序中的命令卻是過目不忘,到現在還記得很多,也許是感興趣吧,也感謝我的微機老師給我提供自由上機的機會!後來我又自學了QBASIC,初四暑假又學了一點C,那時學C遇到不少困難,當時我們學校機房連C語言都沒有,我只好悶在家裡,一本二級C教材,一本配套習題,整天發呆地想,把自己的腦袋當電腦cpu使,有時進入死循環,有時又徹底崩潰。我花十幾天看完了一本書,做完了一本題,然而腦袋裡充滿了疑惑,由於沒有上機實踐的機會,我就憑自己的猜測與推理己慢慢建立了一大堆理論,十分得意與自信,但後來證明大部分是錯的,害我花了很長時間去糾正,這是後話。可是,還是那句話不破不立,不阻不行。就像我現在有了電腦,整天泡在互聯網的海洋里,感受著快餐文化,好久都沒靜下心來好好想點東西了.
高中還上過幾節電腦課,只不過忙於應付高考,我將學程序的打算放棄了,到這里我該說下一個人了。
高中時坐我旁邊一女生,她的文曲星里有BASIC,我偶爾拿過來編了幾個小程序玩,她看到後很感興趣,令人驚訝的是,她只看了三五個程序,聽我講了幾個命令的功能,就能根據自己的想像編出小動畫來,她此前是絕沒有學過程序的!我曾一度懷疑過她的智商,然而她程序是如此之快,卻讓我的眼都瞪大了好幾圈,比我當年高了好幾個境界!我後來經常在想,是不是我當時的方法不對,程序到底應該怎樣學。。。
一晃就到了大學,我碰到另一個讓我佩服的人,跟我一樣是學計算機的,他是偶爾看到我在編動畫,然後十分感興趣,便開始自學。他令人吃驚的是,指針,結構體,位運算等等,都沒搞懂(更不用說演算法和數據結構),只學了三種程序結構,現在只學了C半年,便自己能編出貪吃蛇,俄羅斯方塊,掃雷,還有很多叫不出名字的小游戲來,現在又在寫黑白棋,我知道我確實是走了不少彎路。
程序應該怎樣學,對C來講,我覺得應該從畫圖學起。
原因有二。
一,畫圖程序很能振奮人心的,它能帶給你濃厚的興趣,這是學程序的關鍵。
二,畫圖程序容易上手,很簡單的道理,就能做出很漂亮的東西來。有很多東西甚至不用看課本,就能自己推出來(我認為推理的方法很重要,它是你自學的必要條件)。
比如畫一個圓,從數學角度來分析,要確定一個圓,只需知道它的圓心(x,y)與半徑r,那好一個圓就畫出來了,circle(x,y,r);
其它的類推,再畫一個立體的,選擇立方體,再分析,只要知道兩個對角的坐標就行了吧,翻一下課本,不是這樣,為什麼?你或許會想到,電腦屏幕本來就是平面的,用立體坐標的理論在這里,恐怕就不是最簡單的方法。所以它採用的應該是兩個平面圖形平移。此處留下疑問,立體圖形在平面坐標中怎麼表示?自己慢慢研究,很淺的東西。
想作動畫吧,想像一下動畫的原理只是從一個圖形變幻到另一個圖形,不同地變幻就出現動畫效果,那就可以畫一個,擦了,再畫一個新的,再變化。。。
數學功底好的話,從二維到三維,從靜態到動態我認為是很快的過渡。
具體該怎麼學呢,你可以多找幾個畫圖的例子,敲到電腦里,多敲幾個,慢慢地你就會知道哪些東西是干什麼的,慢慢地就會自己做出東西來。
但這里不要沉溺太久了,先學畫圖只是幫助你輕松地入門(很多人C學完了還沒有入門)。
從畫圖里暫時走出來,你應該打打基礎了,這里不再贅述。可以邊學邊實踐,物理,數學課本中很多問題都可以用程序來演示,來解決,嘗試著多做些東西,這比你老學課本中的模型強多了,只有你自己去體會才能知道。
談及C語言,我想凡是學過它的朋友都有這樣一種感覺,那就是「讓我歡喜讓我憂。」歡喜的是,C語言功能非常強大、應用廣泛,一旦掌握了後,你就可以理直氣壯地對他人說「我是電腦高手!」,而且以後若是再自學其他語言就顯得輕而易舉了。憂慮的是,C語言猶如「少林武功」一般博大精深,太難學了。其實就筆者認為C語言並非是「difficult(困難)」的,只要你能理清思路,掌握它的精髓,那麼自學C語言是一件非常容易且又其樂無窮的事。今天本人就與大家一起談談如何學習C語言或者說學習C語言應從哪幾方面著手。
了解一些基本知識
一.C語言的背景
就個人感觸,無論學習哪門語言首先應該了解一下自己所學語言的背景,也可以說它的發展史。
C語言屬於高級程序語言的一種,它的前身是「ALGOL」。其創始人是布朗·W·卡尼漢和丹尼斯·M·利奇。C語言問世時是帶有很大的局限性,因為它只能用於UNIX系統上。然而隨著科學技術的進步,計算機工業的發展,C語言逐漸脫離UNIX。1987年美國標准化協會制定了C語言的國際標准,簡稱「ANSI C」,從此以後它便成為一種廣泛使用的程序語言。C語言的優點很多,主要的有如下四點:
1.兼備高級語言與低級語言的優點,屬於一種中間語言。
2.它是一種結構化程序設計語言,非常適合結構化程序設計。
3.有較豐富的數據類型、運算符以及函數供以選用。
4.直接與內存打交道,使修改、編輯其他程序與文檔變得輕松,簡單。
二.二大語系二種不同的學習方法
筆者學習過很多程序語言,例如:C,C++(C語言的擴展),QBASIC,VB(BASIC的可視化),JAVA,J ,VB,JAVA,ASP,FOXPRO,PERL等等,就本人實踐所得,其實高級程序語言分為兩大語系。一路是以C為主的程序語言,例如:JAVA,JAVA等,這類語言在函數的調用,程序語句的書寫,循環的控制都極為相似。另一路是以BASIC為首的程序語言,例如:FOXPRO,VB等,此類語言同樣具有相似的函數調用,程序語句書寫以及循環控制,但與C語系是不同的。因此若是您以前是從QBASIC起家的,那麼在學習C語言前最好是先洗洗腦,千萬不要把學習BASIC的方法以及思路用在C身上。
講到這里,我想大家對C語言一定有了感性認識吧!下面讓我們再升華一下,全方位親密接觸它。學習C語言必須從以下四點入手,也就是說,只要你能掌握這四點的內容,那麼基本上就大功告成了。
怎樣才能學好c語言
有人問我c語言是不是很難學,我說不是,後來問的人多了,我就萌生了寫一篇關於c語言如何入門的文章的念頭來。
其實c語言很簡單,它只是一種交流的規則,一種表達的工具,一種承載思想的容器而已,之所以感覺難,我覺得是還不習慣使用計算機特點來考慮問題。這就好比中國人從到英國定居一樣,雖然你學過英語,但是那隻是想像中的英國,和現實的英國的情況還相差很遠,所以要有一個適應的過程,也就是常說的過渡期或磨合期。
想盡快上手就得掌握計算機的特點,計算機的特點包括:
1、 計算機在問題的處理方式上要求全,將所有的可能都要告訴它。人可以根據習慣忽略一些東西,但計算機不行。比如說求解一元二次方程,我們考慮問題就已經默認了a不等於0,更有甚者把b方減4ac也默認大於等於零了。這是我們的習慣,既然有解,我們一般習慣上就把它定為實數解,所以你做出來的程序一般是不考慮這兩個條件的,但是計算機不行,計算機是有名的弱智。計算機沒有象人一樣的智能處理能力,它是人忠實的信徒,不管你怎麼想,它都會執行你的命令。由於你的習慣,導致一些別有用心的人或者無意犯錯的人來犯錯誤,致使計算機有時無所適從。很疲憊,甚至崩潰,報錯,造成你的程序是不成功的,所以你感覺很難。
2、 計算機要求程序的描述精確,無二義性。人的語言有很強的隨機性和二義性。我們平時說話時,有時是一些招呼,有時說話的邏輯性可以不太清楚,話既可以表達這樣的意思,也可以表達那樣的意思,人可以根據環境和對方想表達的含義進行分析,最終得到正確的結果,但是計算機很弱智,雖然它很聽話,但是他不能理解你表達的思想,只會按你交給的指令執行,這樣導致執行時報警和出錯。
3、 計算機編程是要求有很強的全局性和邏輯性,不存在起伏的問題。人的思維有很強的活躍期和蟄伏期,計算機不會,它隨時待命。人在考慮問題時,有很多盡興的東西,但這不是處理問題的整體,而是一部分,所以就出現做完一段代碼後,就不願意再寫,或感覺很吃力,所以感覺很難。
計算機要求它的主人,考慮問題要全面,所有可能的情況及處理都要告訴它,要求學會沉穩,心態要穩定,要求交流的語句一定要明了含義單一。
怎樣才能很快的學會c語言,更快的度過磨合期呢?C語言的語法規則記憶理解當然是不可少的,除此之外還應注意以下幾個方面:
1、 好好理解一下變數和函數的概念,至少要重新回頭看看初等數學。這是基礎,否則就會先天不足,你學的再好,也成不了大氣候。
2、 平衡心態,雖然不能做到「不以物喜,不以己悲」的水平,但至少不要浮躁,不要急於求成,欲速則不達。
3、 培養自身的全局意識,既能小無內,也能大無外,才行。
4、 嚴格按照程序設計過程設計程序,不要跳脫,天馬行空,沒有規矩是不成方圓的。
5、 努力提高自身的綜合素質。程序是人思維的表達形式,是人處理問題思路和語言的結合體。你對客觀看成到什麼程度和你掌握的知識成正比。如果你對處理的問題不理解,不會處理,你怎麼也寫不出程序。
6、 學會交流,多交流,相互補益,同時團隊合作也是很重要的。
總之,實踐出真知,多學、多練、多思、多交流,勤奮好學才能學成。
『伍』 C語言編程 在屏幕上列印五行*號,每行分別為5個,30個,10個,28個,16個。
C語言輸出如題所示圖案的代乎脊碼如下:
#include<stdio.h>
int main( )
{
int x;
int i,j,k;
{
for(j=0;j<2*i-1;j++)
printf("*");
printf(" ");
}
for(i=k-1;i>=1;i--)
(5)樹星c語言擴展閱讀:
C語言的注釋符一般分為兩種,一種是以「/*」開頭,在中間加上注釋內容,並以「*/」結尾的段落注釋符。在「/*」和「*/」之間的即為注釋。
另一種是以「//」開頭,後面加註釋內容的單行注釋符。在「//」之後的即為注釋。
C語言的注釋符清頃歲是以「/*」開頭並以「*/」結尾的串。在「/*」和「*/」之間的即為注釋。程序編譯時,不對注釋作任何處理。注釋可出現在程序中的任何位置。
C標准函數庫(C Standard library)是所有符合標準的頭文件(head file)的集合,以及常用的函數庫實現程序,例如I/O 輸入輸出和字元串控制。
不像 COBOL、Fortran 和 PL/I等編程語言,在 C 語言的工答睜作任務里不會包含嵌入的關鍵字,所以幾乎所有的 C 語言程序都是由標准函數庫的函數來創建的。
『陸』 c語言如何學習
談及C語言,我想凡是學過它的朋友都有這樣一種感覺,那就是「讓我歡喜讓我憂。」歡喜的是,C語言功能非常強大、應用廣泛,一旦掌握了後,你就可以理直氣壯地對他人說「我是電腦高手!」,而且以後若是再自學其他語言就顯得輕而易舉了。憂慮的是,C語言猶如「少林武功」一般博大精深,太難學了。其實就筆者認為C語言並非是「difficult(困難)」的,只要你能理清思路,掌握它的精髓,那麼自學C語言是一件非常容易且又其樂無窮的事。今天本人就與大家一起談談如何學習C語言。
學習C語言必須從以下四點入手,也就是說,只要你能掌握這四點的內容,那麼基本上就大功告成了。
1、多看代碼 在有一定基礎以後一定要多看別人的代碼。 注意代碼中的演算法和數據結構。
畢竟學C之後的關口就是演算法和數據結構。提到數據結構,指針是其中重要的一環,絕大多數的數據結構是建立在指針之上的,如鏈表、隊列、樹、圖等等,所以只有學好指針才能真正學好C。別的方面也要關注一下,諸如變數的命名、庫函數的用法等等。有些庫函數是經常用到的。對於這些函數的用法就要牢牢記住。
2、要自己動手 編程序是個實乾的活,光說不練不行。剛開始學的時候可以多練習書上的習題。 對於自己不明白的地方,自己編個小程序實驗一下是最好的方法,能給自己留下深刻的印象。 自己動手的過程中要不斷糾正自己不好的編程習慣和認識錯誤。有一定的基礎以後可以嘗試編一點小游戲,文曲星之類的電子詞典上小游戲很多,照著編作為練習。基礎很扎實的時候,可以編一些關於數據結構方面的東西,諸如最經典的學生管理系統。之後.....學匯編、硬體知識。
3、選擇一個好的編譯器 VS2010以上版本
4、關於養成良好的編程習慣 基本上每本C教材上都要提到。作為新手這條一定要時時遵守。具體方面:
(1) 在比較復雜的代碼後面要有注釋。 如果光溜溜一堆代碼,別人就不可能看懂你的代碼,而且也不利於查找錯誤。
(2)注意語句的嵌套不能過長,一般來說,一段代碼里Tab要少於8個。
簡單說就是語句最多8個嵌套。 對於新手來說,這個標准還要下降。有一個好習慣是,把主函數盡量寫簡短。經常看到別人的代碼是主函數只有幾行,幾個函數調用,而定義全在主函數外部。這樣一是減少了主函數內部的嵌套,二是比較精簡,容易讀懂。
(3)注意語句的選擇。並不是分支語句就用if循環就用while、for。在適當的情況下switch和do while語句也是要用的。
『柒』 c語言中取地址符和*有什麼區別
c語言中取地址符和*有兩點區別:
一、p指令:
聲明中: * 表示指針,例如: int *p,p是指針,指向整型量。*p表示指針指向的整型量的值。
語句中,p表示指針指向的地址。如果p是指針,沒有 &p 形式。
二、 x指令:
聲明中:x是整型量。&x是整型量x的地址,不是指針。
語句中:x是整型量x的值。&另一用途是按位運算符,按位* 是乘號。
(7)樹星c語言擴展閱讀:
C語言中常見符號的作用:
1、 ? x:y,類似於if語句,例如: x>9?50:100; 意思是x是否大於9 ,是的話就輸出50,不是的話就輸出100。
2、c語言中,!的作用是邏輯非,例如:!a 凡是a不等於0,那麼輸出都是0,只有當a等於0時,輸出的才是0。!=意思是不等於,一般應用與判斷 if(a!=b)。
3、c語言中,&&表示邏輯且(交集) ,||表示邏輯或(並集)。實際上兩者也是用來輸出正確與錯誤,也就是輸出0或1,判斷的意思。
『捌』 算術表達式與二叉樹,要用C語言實現。。。會做的不勝感激呀
變數替換比較麻煩
暈,要求輸入還是前綴表達式,這個...
『玖』 求樹與二叉樹的轉換c語言代碼
#include<stdio.h>此悉差
#include<malloc.h>
#define DEGREE 5 //樹的高度
#define NULL 0
#define QUEUESIZE 10
#define MAX_NODE_NUM 100
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@樹和二叉樹的結構體@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
typedef struct st1//樹節點的類型
{
char data;//數據域,採用char星
struct st1 *children[DEGREE];/陸雀/指向孩子節點的指針域
}CTreeNode;
typedef struct st2
{
char data;//數據域
struct st2 *lchild,*rchild;//左右孩子節點的指針
}BTreeNode;
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@查找樹的節點@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
CTreeNode *SearchCTree(CTreeNode *root ,char data)
{
int i;
CTreeNode *returnNode;
if(root->data==data)
return root;
else
{
for(i=0;i<DEGREE;i++)
{
if(root->children[i]==NULL)
return NULL;
else
{
returnNode=SearchCTree(root->children[i],data);//遞歸查找
if(returnNode!=NULL)
return returnNode;
}
}
}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@生成樹@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
CTreeNode *CreateSTree()
{
int i,j,k;
char data, parent;;
CTreeNode *root,*parentNode,*node;
printf("請輸入樹的節點的數量:");
scanf("%d",&j);
fflush(stdin);//清除鍵盤緩森皮存
if(j==0)
return NULL;//空樹,結束函數
printf("請輸入根節點的數據:");
scanf("%c",&data);
fflush(stdin);
root=(CTreeNode *)malloc(sizeof(CTreeNode));
root->data=data;
for(i=0;i<DEGREE;i++)
root->children[i]=NULL;
for(i=2;i<=j;i++)//依次輸入每個節點的信息
{
printf("請輸入第%d個節點的數據及其父節點的數據:",i);
scanf("%c%c",&data,&parent);//切記當以%c號格式輸入數據時候,不要輸入空格
fflush(stdin);
node=(CTreeNode *)malloc(sizeof(CTreeNode));
node->data=data;
for(k=0;k<DEGREE;k++)
node->children[k]=NULL;
//printf("驗證parent=%c\n",parent);
parentNode=SearchCTree(root,parent);//查找指定數據的節點
for(k=0;k<DEGREE;k++)
{
if(parentNode->children[k]==NULL)
{
parentNode->children[k]=node;
break;
}
}
}
return root;
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@樹的遍歷@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
void preorderTree(CTreeNode *ctroot)//遍歷每個節點的操作就是輸出該節點的data域
{
CTreeNode *ctchild;
int i;
printf("%c",ctroot->data);//先遍歷根節點
for(i=0;i<DEGREE;i++)//依次先序遍歷孩子節點
{
ctchild=ctroot->children[i];
if(ctchild==NULL)
break;//孩子節點遍歷結束,退出
else
preorderTree(ctchild);//遞歸先序遍歷
}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@結構體類型@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//樹隊列結構體類型
typedef struct nodeCTree
{
CTreeNode *CTreeArray[MAX_NODE_NUM];//結構體指針數組,存放節點的地址
//struct nodeCTree *next;
int CTreeFront,CTreeRear;
}QueueCTree;
//二叉樹隊列結構類型
typedef struct nodeBTree
{
BTreeNode *BTreeArray[MAX_NODE_NUM];//結構體指針數組,存放節點的地址
//struct nodeBTree *next;
int BTreeFront,BTreeRear;
}QueueBTree;
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@初始化隊列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//初始化樹隊列
void initQueueCTree(QueueCTree *&q)
{
q=(QueueCTree *)malloc(sizeof(QueueCTree));
q->CTreeFront=q->CTreeRear=0;
}
//初始化二叉樹隊列
void initQueueBTree(QueueBTree *&q)
{
q=(QueueBTree *)malloc(sizeof(QueueBTree));
q->BTreeFront=q->BTreeRear=0;
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@入隊列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//樹隊列元素入隊
int addQueueCTree(QueueCTree *&q,CTreeNode *ctroot)//
{
if((q->CTreeRear+1)%MAX_NODE_NUM==q->CTreeFront)//隊滿
return 0;
q->CTreeRear=(q->CTreeRear+1)%MAX_NODE_NUM;
q->CTreeArray[q->CTreeRear]=ctroot;
return 1;//入隊列
}
//二叉樹隊列元素入隊
int addQueueBTree(QueueBTree *&q,BTreeNode *btroot)
{
if((q->BTreeRear+1)%MAX_NODE_NUM==q->BTreeFront)//隊滿
return 0;
q->BTreeRear=(q->BTreeRear+1)%MAX_NODE_NUM;
q->BTreeArray[q->BTreeRear]=btroot;
return 1;//入隊列
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@隊列判空@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//樹的隊列判空
int QueueCTreeEmpty(QueueCTree *q)
{
return(q->CTreeFront==q->CTreeRear);
}
//二叉樹隊列判空
int QueueBTreeEmpty(QueueBTree *q)
{
return(q->BTreeFront==q->BTreeRear);
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@出隊列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//樹隊列元素出隊
CTreeNode *delQueueCTree(QueueCTree *&q)
{
CTreeNode *ctroot;
if(q->CTreeFront==q->CTreeRear)//隊空
return NULL;//返回空指針
q->CTreeFront=(q->CTreeFront+1)%MAX_NODE_NUM;
ctroot=q->CTreeArray[q->CTreeFront];
return ctroot;//返回節點
}
//二叉樹隊列元素出隊
BTreeNode *delQueueBTree(QueueBTree *&q)
{
BTreeNode *btroot;
if(q->BTreeFront==q->BTreeRear)//隊空
return NULL;//返回空指針
q->BTreeFront=(q->BTreeFront+1)%MAX_NODE_NUM;
btroot=q->BTreeArray[q->BTreeFront];
return btroot;//返回節點
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@樹轉化為二叉樹@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
void TreeToBTree(CTreeNode *ctroot,BTreeNode *&btroot)//樹轉化為二叉樹ctroot指向樹的根節點,btroot,指向二叉樹的跟
{
QueueCTree *VisitedCTreeNodes;
QueueBTree *VisitedBTreeNodes;//輔助隊列
initQueueCTree(VisitedCTreeNodes);
initQueueBTree(VisitedBTreeNodes);//初始化隊列
CTreeNode *ctnode;
BTreeNode *btnode,*p,*LastSibling;
int i;
btroot=(BTreeNode *)malloc(sizeof(BTreeNode));//添加開辟內存空間語句
btroot->data=ctroot->data;//樹的根節點作為二叉樹的根節點
btroot->lchild=btroot->rchild=NULL;
addQueueCTree(VisitedCTreeNodes,ctroot);//樹的跟節點入隊
addQueueBTree(VisitedBTreeNodes,btroot);//二叉樹的跟節點入隊
while(!QueueCTreeEmpty(VisitedCTreeNodes))
{
ctnode=delQueueCTree(VisitedCTreeNodes);//樹節點出隊
btnode=delQueueBTree(VisitedBTreeNodes);//二叉樹節點出隊
for(i=0;i<DEGREE;i++)//訪問節點所有的孩子節點
{
if(ctnode->children[i]==NULL)//孩子節點訪問完畢
break;
p=(BTreeNode *)malloc(sizeof(BTreeNode));//分配二叉樹節點
p->data=ctnode->children[i]->data;
p->lchild=p->rchild=NULL;
if(i==0)
btnode->lchild=p;//長子,作為父節點的做孩子
else
LastSibling->rchild=p;//作為上一個兄弟節點的右孩子
LastSibling=p;
addQueueCTree(VisitedCTreeNodes,ctnode->children[i]);//樹節點進隊列
addQueueBTree(VisitedBTreeNodes,p);//二叉樹節點進門隊列
}
}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@二叉樹的遍歷@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
void Preorder(BTreeNode *T)
{
if(T)
{
printf("%2c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@主函數調用@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
int main()
{
CTreeNode *Tree;
BTreeNode *BTree;
printf("創建一棵樹\n");
Tree=CreateSTree();
printf("樹的先序遍歷結果為:");
preorderTree(Tree);
printf("\n");
TreeToBTree(Tree,BTree);
printf("轉換後的二叉樹,先序遍歷的結果為:");
Preorder(BTree);
printf("\n");
return 0;
}
『拾』 如何學好c語言
上回說的是一些小問題,真正編東西,學東西還有許多要注意的地方。
由於本人也是剛學不久,水平有限,說錯的地方望大家原諒。謝謝!
一、多看代碼
在有一定基礎以後一定要多看別人的代碼。注意代碼中的演算法和數據結構。畢竟學C之後的關口就是演算法和數據結構。提到數據結構,指針是其中重要的一環,絕大多數的數據結構是建立在指針之上的,如鏈表、隊列、樹、圖等等,所以只有學好指針才能真正學好C。別的方面也要關注一下,諸如變數的命名、庫函數的用法等等。有些庫函數是經常用到的。對於這些螞頃函數的用法就要牢牢記住。
二、要自己動手
編程序是個實乾的活,光說不練不行。剛開始學的時候可以多練習書上的習題。旦物舉對於自己不明白的地方,自己編個小程序實驗一下是最好的方法,能給自己留下深刻的印象。自己動手的過程中要不斷糾正自己不好的編程習慣和認識錯誤。有一定的基礎以後可以嘗試編一點小游戲,文曲星之類的電子詞典上小游戲很多,照著編作為練習。基礎很扎實的時候,可以編一些關於數據結構方面的東西,諸如最經典的學生管理系統。之後.....學匯編、硬體知識。
三、選擇一個好的編譯器
本人前段時間就遭受了一個編譯器的折磨。這個編譯器帶了個自運行程序,自動修改IE主頁。叫什麼名字就不說了。言歸正傳,英文版Turbo C v2.0沒話說,最經典的C編模碧譯器(下載地址:http://www4.skycn.com/soft/2151.html),其次推薦一個win-tc 1.91,支持windows下的編譯器。(下載地址:http://www4.skycn.com/soft/17869.html)
四、關於養成良好的編程習慣
基本上每本C教材上都要提到。作為新手這條一定要時時遵守。記的一位網友發過評論:高手寫一堆亂七八糟的代碼就是藝術,新手寫一堆亂七八糟的代碼就是垃圾。就象古代賢人寫錯字叫通假字,小學生寫錯字叫錯別字,一個道理。具體方面:
1、在比較復雜的代碼後面要有注釋。如果光溜溜一堆代碼,別人就不可能看懂你的代碼,而且也不利於查找錯誤。除非你一直編東西給自己看。能在代碼里說明白的就一定要在代碼里體現。比如變數名、函數名,在命名的時候盡量說明是干什麼用的。
2、注意語句的嵌套不能過長,一般來說,一段代碼里Tab要少於8個。簡單說就是語句最多8個嵌套。對於新手來說,這個標准還要下降。有一個好習慣是,把主函數盡量寫簡短。經常看到別人的代碼是主函數只有幾行,幾個函數調用,而定義全在主函數外部。這樣一是減少了主函數內部的嵌套,二是比較精簡,容易讀懂。
3、注意語句的選擇。並不是分支語句就用if循環就用while、for。在適當的情況下switch和do while語句也是要用的。在某些時候,switch語句比if語句更加精練明了,而do while比while少一個循環。