⑴ 自學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語言從零開始 怎麼學 要求是什麼
看書。選對學習書籍,對於學習C語言能夠起到事半功倍的作用。在看書的時候,沒看完一段知識點,最好上機進行實驗訓練,把章節後面的練習自己動手操作一
下,章節中的代碼示例也可以自己動手敲一下,進行編譯。這樣不僅可以鍛煉自己敲代碼的能力,還有助於進一步理解理論知識點。
敲代碼。學習的時候,如果光看書上的理論知識,而不自己動手進行實踐,理解不深刻,是很容易遺忘的,也許下次遇到類似的項目或者代碼,還是不會,這樣的學習就是無用功。代碼敲的多了,出現的bug也會多,這樣在調試bug,修改漏洞的時候也能學到很多,可以積累很多經驗。
向他人學習。學習C語言不是孤立的,自己一個人學習的過程中常常會遇到很多問題,這時大家需要多向別人請教。通過與他們交流可以真正學到企業需要的技能。多看他們怎樣思考,如何寫代碼,有哪些工具和快捷方式,出現問題怎樣調試追蹤,這些在書本上很少見,卻都是項目實踐中非常有用的東西。
分享自己的知識。對於自己所知道的東西,要不吝於與別人交流溝通,可以在一些論壇或貼吧分享自己的知識,如果發現自己哪方面能力不夠,多通過這些方式進行交流,也可以急躁發現自己的問題,實現自我提升。
⑶ C語言24點的演算法
下面是我自己寫的一個程序:
我的解法是把這個問題分解成了兩個子問題,首先求出4個數字的無重復全排列,放到一個數組裡面,再對沒一個排列情況,從頭到尾窮舉所有的四則運算情況。注意到除法是特殊的,我用x/y表示x除以y,用x|y表示x分之y。注意到,如果窮舉的解得到-24的話,只需要把有減法的地方調換一下順序就可以了,代碼如下
/***********************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int index[4]={0,1,2,3};//used to generate subscription collection
int sub[4]; //used in p() only
float f[4]={8.0f,3.0f,3.0f,8.0f};//the 24 point numbers
float fs[24][4];//all possible permutaions of f
float tmp[4]; //used for buf
int g_number=0; //number of permutations
float RES[4];
char op[3];
void p(int idx){//求全排列的函數
if(idx==4){
for(int i=0;i<4;++i){tmp[i]=f[sub[i]];}
for(int g=0;g<g_number;++g){if(memcmp(fs[g],tmp,sizeof(float)*4)==0)return;}
for(int i=0;i<4;++i){fs[g_number][i]=f[sub[i]];}
g_number++;
return;
}
for(int i=0;i<4;++i){//make subscription collections
bool pflag=false;
for(int j=0;j<idx;++j){if(sub[j]==i)pflag=true;}
if(pflag==true)continue;
sub[idx]=index[i];
p(idx+1);
}
}
void solve(int L){//對某個排列,遞歸求所有四則運算的結果,找到就退出
if(L==3){
if(fabs(fabs(RES[L])-24.0f)<0.01f){
printf("Found solution,RES=%f,((%d%c%d)%c%d)%c%d\n",RES[L],
(int)f[0],op[0],
(int)f[1],op[1],
(int)f[2],op[2],
(int)f[3]);
exit(0);
}
return;
}
for(int j=0;j<5;++j){//j judges for operators
if(j==0){RES[L+1]=RES[L]+tmp[L+1];op[L]='+';solve(L+1);}
if(j==1){RES[L+1]=RES[L]-tmp[L+1];op[L]='-';solve(L+1);}
if(j==2){RES[L+1]=RES[L]*tmp[L+1];op[L]='*';solve(L+1);}
if(j==3&&tmp[L+1]!=0)
{RES[L+1]=RES[L]/tmp[L+1];op[L]='/';solve(L+1);}
if(j==4&&RES[L+1]!=0)
{RES[L+1]=tmp[L+1]/RES[L];op[L]='|';solve(L+1);}
}
}
int main(int argc,char* argv[]){//should avoid 0
f[0]=atoi(argv[1]);
f[1]=atoi(argv[2]);
f[2]=atoi(argv[3]);
f[3]=atoi(argv[4]);
p(0);
for(int i=0;i<g_number;++i){
memcpy(tmp,fs[i],sizeof(float)*4);
RES[0]=tmp[0];
for(int t=0;t<4;++t){ printf("%d,",(int)tmp[t]); }
printf("\n");
solve(0);
}
printf("Found no solution :( \n");
return 0;
}
----------編譯運行,運行時的參數就是4個數字
g++ p.cpp && ./a.out 1 5 5 5
1,5,5,5,
Found solution,RES=-24.000000,((1/5)-5)*5
g++ p.cpp && ./a.out 8 3 3 8
8,3,3,8,
Found solution,RES=-24.000006,((8/3)-3)|8
上面這個解寫出來就是
8
--------- = 24
3-(8/3)
主程序為了簡化,省去了對輸入的檢查,樓主可以自己添加。
⑷ 計算24點 要求:用C語言編寫,輸入4個數,通過加減乘除計算出24點,顯示計算過程,並提示成功信息.
/* Note:Your choice is C IDE */
#include "stdio.h"
#include "stdlib.h"
#include "ctype.h"
#include "string.h"
#include "math.h"
typedef float dd[5];
dd a; //輸入的4個數
dd b; //4個數計算後剩餘的3個數
dd c; //3個數計算後剩餘的2個數
int num=0;
char temp1[200]; //用於存儲4個數中任意2個數參與運算的表達式
char temp2[200]; //用於存儲3個數中任意2個數參與運算的表達式
void js4(); //4個數參與運算
void js3(); //3個數參與運算
void js2(); //2個數參與運算
void main()
{
int i;
printf("輸入4個小於10的正整數:");
for(i=1;i<=4;i++)
{
scanf("%f",&a[i]);
if(a[i]<1 || a[i]>10)
{
printf("輸入數字有誤!");
return;
}
}
js4();
if(num==0)
{
printf("\n對不起,沒有可行的演算法!");
}
}
void js4()
{
int i,j,k,m;
for(i=1;i<=4;i++) //取遍4個數a[1],a[2],a[3],a[4]
{
for(j=i+1;j<=4;j++) //與其後每個數進行組合
{
m=2; //找到沒參與運算的數
for(k=1;k<=4;k++)
{
if(k!=i && k!=j)
{
b[m]=a[k];
m=m+1;
}
}
//進行四則運算,並記錄表達式(備用)
//加
b[1]=a[i]+a[j];
sprintf(temp1,"%0.2f+%0.2f=%0.2f",a[i],a[j],b[1]);
js3();
//減
if(a[i]>a[j])
{
b[1]=a[i]-a[j];
sprintf(temp1,"%0.2f-%0.2f=%0.2f",a[i],a[j],b[1]);
}
else
{
b[1]=a[j]-a[i];
sprintf(temp1,"%0.2f-%0.2f=%0.2f",a[j],a[i],b[1]);
}
js3();
//乘
b[1]=a[i]*a[j];
sprintf(temp1,"%0.2f*%0.2f=%0.2f",a[i],a[j],b[1]);
js3();
//除
if(a[i]>a[j] && a[j]!=0)
{
b[1]=a[i]/a[j];
sprintf(temp1,"%0.2f/%0.2f=%0.2f",a[i],a[j],b[1]);
}
else if(a[i]!=0 && a[j]!=0)
{
b[1]=a[j]/a[i];
sprintf(temp1,"%0.2f/%0.2f=%0.2f",a[j],a[i],b[1]);
}
js3();
}
}
}
void js3()
{
int i,j,k,m;
for(i=1;i<=3;i++) //取遍3個數a[1],a[2],a[3],a[4]
{
for(j=i+1;j<=3;j++) //與其後每個數進行組合
{
m=2; //找到沒參與運算的數
for(k=1;k<=3;k++)
{
if(k!=i && k!=j)
{
c[m]=b[k];
m=m+1;
}
}
//進行四則運算,並記錄表達式(備用)
//加
c[1]=b[i]+b[j];
sprintf(temp2,"%0.2f+%0.2f=%0.2f",b[i],b[j],c[1]);
js2();
//減
if(b[i]>b[j])
{
c[1]=b[i]-b[j];
sprintf(temp2," %0.2f-%0.2f=%0.2f",b[i],b[j],c[1]);
}
else
{
c[1]=b[j]-b[i];
sprintf(temp2," %0.2f-%0.2f=%0.2f",b[j],b[i],c[1]);
}
js2();
//乘
c[1]=b[i]*b[j];
sprintf(temp2," %0.2f*%0.2f=%0.2f",b[i],b[j],c[1]);
js2();
//除
if(b[i]>b[j] && b[j]!=0)
{
c[1]=b[i]/b[j];
sprintf(temp2," %0.2f/%0.2f=%0.2f",b[i],b[j],c[1]);
}
else if(b[i]!=0 && b[j]!=0)
{
c[1]=b[j]/b[i];
sprintf(temp2," %0.2f/%0.2f=%0.2f",b[j],b[i],c[1]);
}
js2();
}
}
}
void js2()
{
//對最後2個數的四則運算最終結果進行判斷,將滿足條件的情況輸出
//加
if(c[1]+c[2]==24)
{
printf("%s\t%s\t%f+%0.2f=24\n",temp1,temp2,c[1],c[2]);
num=num+1;
}
//減
if(c[1]-c[2]==24)
{
printf("%s\t%s\t%f-%0.2f=24\n",temp1,temp2,c[1],c[2]);
num=num+1;
}
else if(c[2]-c[1]==24)
{
printf("%s\t%s\t%f-%0.2f=24\n",temp1,temp2,c[2],c[1]);
num=num+1;
}
//乘
if(c[1]*c[2]==24)
{
printf("%s\t%s\t%f*%0.2f=24\n",temp1,temp2,c[1],c[2]);
num=num+1;
}
//除
if(c[1]>c[2] && c[2]!=0)
{
if(c[1]/c[2]==24)
{
printf("%s\t%s\t%f/%0.2f=24\n",temp1,temp2,c[1],c[2]);
num=num+1;
}
}
else if(c[2]>c[1] && c[1]!=0)
{
if(c[2]/c[1]==24)
{
printf("%s\t%s\t%f/%0.2f=24\n",temp1,temp2,c[2],c[1]);
num=num+1;
}
}
}
⑸ C語言怎麼學
淺談C語言學習方法
本人是一名windows程序寫作員,使用的語言是C語言.其他語言了解一點點,但並不擅長.可能對於初學者來說,首先就是選擇一門程序設計語言.當然,今天我將要說的不是這方面.每種語言都有它所擅長的領域與層面.當然對於其他非C語言我是一名門外汗,我也不會站在C語言的立場去談論其他任何一門語言.好了,在開始進入正題之前,我想談談個人對C的一些看法:
C語言是一種早期的計算機語言,最初誕生目的是為了提供一種基於UNIX系統的工作語言.但是,後來卻被越來越多的人發現它的優點與潛力.C本身比較接近底層,適合開發系統軟體甚至是操作系統.我個人也認為它是界於高級語言與匯編語言之間的中級語言.C語言是一門結構化語言(我認為主要是指它的控制結構如:if if-else while for等等).C程序設計上有提到"自頂向下,逐步深入".以函數為原子功能模塊.對於大型的程序來說模塊化是很重要的,有一句話說的很好"優質的程序首先就是便與人們之間的相互討論與交流,其次才是執行效率".當然我個人認為任何一名程序寫作者,都應該養成一種特定的思維方式,以程序的思維方式來思考程序的實現.前提就是要足夠的來了解計算機底層技術.要不我想就連學習都是很困難的,凡事都是一個思路的問題嘛.標準的來衡量,C應該算是高級語言陣營的一份子.可很多有C語言開發經驗的程序寫作者.通常親切的稱C為界於底級語言與高級語言之間的中級計算機語言.當然不是因為C比高級語言要差,之所以這么認為是因為C既具有高級語言的結構化與可理解性又具有低級語言的高效率.同時C的移植性也是非常不錯的,大家應該知道,越是接近硬體,接近底層的語言就越加的依賴硬體環境,也就是我們所說的設備相關性.C這一點做的是非常棒的.說了這些,在從另一個角度去分析C語言.當然每種語言都有它自身的優缺點,C也一樣.比如在現在高級語言與頂層技術的角度來看的話,C最大的缺陷就是Data與演算法的分離.舉一個例子: 對於一個擁有幾千行甚至上萬行Code的程序來說,如果修改Data,比如我在Structure中增加一個欄位,可能為此我的整個程序都要改動,這使得程序的可重用性大大降低.開發周期也大大的延長.但是在底層的角度來看這也正是C的優點.我為什麼要這么說呢?我個人認為在求解與實現一個小問題的時候,我們可以寫出一個通用的模塊處理不同的Data.當然比如某些經常用到的,基於數據結構的一些常用演算法我們可以寫出來在開發的時候我們可以直接把預先編寫的模塊插入到我們的程序中去,這不也是大大低了開發周期嗎?初學者完全可以根據自己的需求來編寫一個自定義庫.好了,說了這些,有些地方我理解錯了,還請各位指出來,交流是很重要的,前提是要把自己的心態放平.下面我將談論本問的重點,也就是如何來學習C語言,是給那些初學者讀的.
正題部分:
有人可能會說:學習還用你教啊,誰沒上過學啊.其實我今天要說的只是,站在一個過來人的角度,來分析與解釋學習C語言的過程中比較困難的地方.當然我個人也會對比較具體的問題進行解釋(個人看法).我一直在強調個人看法,我是想讓大家明白,對於同一個問題大家可能都很難達成統一的意見,希望批評的時候客氣點就好嘍!
初學者該看哪些書來入門:
在學習C語言之前,首先就要選擇一本教材,對於初學者,我個人並不建議去讀電子書籍,最好是買紙質書來學習.比如比較有名的"C程序設計"就很不錯,尤其是第二版.我也看過,比較適合中國人來初學.整本書都在全面系統的講解C的語法結構,構成C的語言元素包括:數據類型,支持的運算符,標識符(是由程序員按照命名規則起的名字,用於變數名,函數名,宏名等等),關鍵字(編譯系統用於實現C內部功能的詞,比如:轉向goto和中斷break等等)等.看完這本書你基本上可以寫一些簡單的小程序,當然是DOS下的程序.如果你想在進一步深入學習C的話,可以看"C陷阱與缺陷"這本書.寫這本書的作者是在Bell工作對C是非常精通的,應該算是大師級的人物了.如果你暫時不想深入C的話,也沒問題,因為此時你完全可以把C當作一種編程工具來使用,你要做的就是多寫Code來讓自己熟悉C語言.經驗是非常重要的,"經驗是檢驗真理的唯一方法".當然你不會紙上談兵,如果你有過多的開發經驗的話,就知道在紙上或最初的設想的Code拿到計算機上來實現,最終會發現有很多地方都是不合理的,之前是沒有辦法想像到的.在初學C的過程中,比如你會看"C程序設計"來初學C,當你學完每一章的時候要把習題來完成,這里就是考驗你學到的知識了,看看你應用能力怎麼樣?尤其是程序設計題目,比較有意思.哪裡不懂了.可以翻回去看書中的解釋.如果沒有解釋或你還是不明白,可以去問別人,與其他人交流. bbs,QQ或Google.直到你弄明白為止.當你把問題最終解決的時候,我敢打賭,此時你一定很興奮,或者是比較興奮.這個時候知識已經在你的大腦里了.
下面我為你推薦幾本不錯的關於C語言籍:
C編程規范
C語言大全第四版 (個人感覺不錯,裡面有提及C標准方面的東西)
C和指針
The C programming Language (經典著作)
如果你要看電子書的話,以上幾本書在Google上很容易就可以找到.
關於C語言的初步理解:
對於初學者,會有太多的疑問,原因是你的知識面太小.現在我為你解釋一些C相關的東西.目的是讓你能夠有一個大致清晰的方向,來給自己安排學習計劃.專業的來說,我們是或將是一名程序員,程序員當然就是要開發程序了.對於軟體開發方面我來解釋下術語:
C,C++,ASM,Basic,Java 這些是計算機語言.計算機語言很多,我就不多說了.
Visual C++,Visual Basic, Microsoft研發的開發環境,開發環境包括:編譯器,庫函數(每種C語言編譯器都支持標准庫,同時它們也會擴展自己的庫,所以很多比較以來庫函數實現的程序員,在轉向不同的開發環境的時候最初總是不使用的,會遇到很多問題),一些資源模板等等.Visual 就是可視的意思,後面的就是語言.Visual C++支持C與C++2種語言,是根據文件的擴展名來判斷採用哪種編譯內核.
什麼是"面向對象"與"面向過程"? 其實是2種完全不同的程序設計思想,C語言是面向過程語言,而C++是面向對象語言.在面向對象的語言中有"類(Class)"這個東西.C中沒有.對象是由類來派生的一個實例,相反類就象是一個模板.
什麼是SDK? SDK就是軟體開發工具包(Software Development Kit).指的范圍比較廣,通俗的說,凡是能夠與軟體開發過程占上邊的東西都屬於.比如:庫文件,參考資料,介面函數,當然語言也應該屬於.
DDK就是設備驅動程序開發工具包.
Turbo C: 這是一個比較精緻的C語言編譯器.
理論上來說任何一門語言都可以在任何一種操作系統上運行,前提是操作系統要支持.也就是我們所說的應用程序介面,比如Window API(Application Programming Interface),其實是Microsoft內部定義的介面函數用於實現一些Windows內部的功能.一些對象的描述術語,在不同平台上是不同的,比如:Windows下的"調用",經常被稱為"呼叫","返回"被稱為"傳回".
什麼是"演算法"? 你最初只需要知道演算法實際上就是對特定的Data進行運算的一段代碼而已.也可以認為在求解一道題目的時候,採取的方法與步驟的總稱.對於基本的C程序來說,實際上就是由Data與演算法來組成的.
什麼是"數據結構"? 如果要是系統的講解,還需要一本書"數據結構",簡單的說:是程序要處理的數據在內存中的存儲與組織的方式,分為:物理結構與邏輯結構.邏輯結構就是我們抽象化以後得到的大腦影象.
什麼是"函數庫"? 它們以文件的形式存儲,是預先定義好的函數的集合,我們的程序可以直接調用.當然前提是要包含它的頭文件(庫函數的原型聲明).這些函數是在靜態連接期間組成到.exe文件中去的.Windows又存在另一種庫,叫做動態連接庫(DLL).
GUI: 也就是"圖形用戶界面",就是我們在Windows上看到的,存在:菜單欄,滾動條與顯示區域的窗口.
GDI: 圖形設備介面,從程序寫作者的角度來看,其實GDI就是由上百個函數與數據形態和一些相關的數據結構所組成的.
學習C語言的全過程:
仔細想想,實際上學習C語言,最初是應該先學習C語言的基礎語法.也就是學習C語言的組成部分.一部分一部分的向下學.知識要一點一點的鞏固的.本人假設你學習C語言是看"C程序設計".我認為你應該先把C程序設計仔細的看一便,這樣你應該可以對整本書和C語言的整體組成結構有個大致的清晰了解.不要認為學習只是在看書,看一便就可以了.你應該學會記筆記,在記筆記的過程中,其實你就是在學習,從知識的分析,理解,歸納,到最後以自己的思維方式記下來,這整個過程就是把書中的知識抽象到你自己的腦袋裡.個人感覺學習效果非常好,不懂就問,要多多與人交流,要多思考,遇到問題自己先多想想,實在找不到問題出在哪,在去請教別人,不要有不懂的地方就直接去問別人,那樣對你沒太大的好處.其實要學會給自己安排適合自己的學習計劃,我大致來估計了一下,如果你每天能花4個小時安靜的,用心去學習的話,30天之內你應該可以掌握C語言了.其實在整個學習過程中你大多數時間都在看書,而不是面對電腦.在調試你的代碼之前,先在紙上把核心代碼大致寫出來,分析一下:程序的組成模塊(可以是一個函數或多個),由幾個函數來實現,介面的封裝.採用哪種數據結構更適合一些.關鍵在於演算法.在你的最終程序發布之前,最好把你的代碼行數減到最少.不要只想著把代碼寫多.過多的代碼對程序來說是負擔.你可以在Internet上下載一個文件(C語言經典例題.chm),裡面大致包含了上百個經典的例題.每一個例題都是C語言某部分的典型應用.花時間把這個文件中的所有例題代碼研究一下,最好能自己把代碼改善,以自己的方式來求解.以後你會發現你在寫一些應用程序的時候經常會有一些演算法.會涉及到我之前提到的例題.最後我認為你可以自己來寫C語言標准函數,比如strcpy(); strlen();strcat();最好不要過分依賴庫函數.
C語言學習的難點:
現在應該是已經講到一個重點的環節.很多網友都說學習C語言很難,我認為C中有些部分是比較復雜,難理解的.當然在你具有了豐富的開發經驗以後,這以不在是問題了.下面我個人會對我認為學習C的時候比較難學的地方進行我自己的闡述,如果哪裡不正確,還請各位指出:
指針的出現:
我想有很多初學者學習到指針那一章都感覺很難,下面我就以自己的想法來解釋下指針這個特殊的數據類型,
基本變數大家可能並不難理解,因為基本變數其內部存儲了同類型的常量,事實上指針也是變數,不過呢,這個變數和基本變數有點不一樣,那你又問了:是哪裡不一樣呢? 我告訴你,簡單的來理解其實普通的變數內部存儲了同類型的常量,而指針變數內部存儲的則是"同類型變數的首地址".這樣你能夠理解嗎,是很簡單的解釋,但不失本質.事實就是這樣的.如果你不理解"同類型變數的首地址"的話,我可以給你形象的來描述一下:
float Variable; //聲明一個單精度實型的變數
此時,編譯器已經給Variable分配了內存空間,結構如下:
__________
| |1001
|---------
| |1002
|---------
| |1003
|---------
| |1004
|---------
以上便是Variable的內存結構了,16位下的float佔用4個位元組,內存地址是線性編碼的,我們可以很容易的看出Variable的首地址就是他第一個單元的地址1001,好的,繼續向下看:
float *Pointer=&Variable; //聲明一個指向Variable的指針Pointer
_________
|1001 | 這是Pointer的內存結構
|_______|
我們的程序可以這樣來執行:
Variable=1.0;
直接給Variable賦值,我們稱為直接訪問.
也可以這樣執行:
*Pointer=1.0;
也可以通過指針變數來賦值,前面的*是間接運算符號,意思是求Pointer內部存儲地址所標識的內存單元.也就是Variable.此時,是賦值是通過間接訪問來實現的.可以這樣形象的描述:
________ (指向Variable) __________
|Pointer|------------------------------------>|Variable|
--------- ----------
以上應該是指針實現的基本解釋,很多優秀的程序寫作者都說指針是C語言中的精華,的確如此,很多優秀的程序寫作者寫程序都非常依賴指針,因為它很方便,實際上指針所訪問的對象是沒有限制的,他可以指向任何類型的變數,前提是只要我們知道內存地址.因此指針也並不安全,在開發網路程序的時候,盡量要少使用指針.下面我們在來看一下指針在數組中的使用.
數組中的指針:
簡單的來解釋下數組,數組結構在C中使用比較普遍,其實最常用的就是char 類型的數組,主要是用於字元串操作.實際上數組是"同類型變數的有限集合".我想這應該不難理解吧.數組在內存中佔用連續的內存單元(地址連續),來存儲數組中的每一個元素.數組是預先分配好指定長度的內存單元,供數組元素使用.它並不支持動態內存分配.在內存中想要唯一的確定數組,需要2個標識:入口地址(函數名)和結束標記('\0').有些語言並不向C語言這樣支持字元串結束標記,它們必須要另外聲明一個變數來標識尾元素的下標.那數組名其實就是這一組內存單元的首單元,他的地址就是整個數組的入口地址.此時應該明白了,數組名是一個指針,這樣理解沒有問題.不錯在具體操作的時候不允改變數組名的地址,也不符合實際要求.這樣就可以明白數組名是一個什麼 const Pointer(指針常量).我們可以這樣做:
int Array[10];
int *Pointer;
Pointer=Array;
for(i=0;i<10;++i)
Pointer==i;
以上代碼應該是沒問題吧,同類型的指針,完全可以勝任數組名的任務.一點問題沒有而且可以運行的很好.當然,我們可以進一步把代碼這樣來寫:
把
for(i=0;i<10;++i)
Pointer=i;
改成
for(i=0;i<10;++i,Pointer++)
*Pointer=i;
不好意思,我記不清了,指針的++運算是地址+1還是向後移動一個元素的位置,如果是地址+1的話,以上代碼在改成這樣:
for(i=0;i<10;++i,Pointer+sizeof(int))
*Pointer=i;
如果數組類型是char的話,那就更方便了,因為字元串存存在一個在尾元素之後的結束標記('\0'),下面給出一個簡單的代碼,應用char Pointer:
char * my_strcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ ); // 注意運算符的優先順序與結合性
return( dst ); //返回新傳的指針
}
以上代碼實現字元傳Copy功能,代碼是不是很簡潔啊.如果不需要移動內存塊的話,我們完全可以通過交換指針(內存地址)來實現排序操作,其效率應該是很客觀的.補充一句:千萬要弄清楚,指針本身與指針所指向的變數不是一個單元.
⑹ 范磊《零起點學通C語言》
一、工欲善其事,必先利其器
這里介紹幾個學習C語言必備的裝置和書籍:
A)開發環境
例如turbo C 2.0,這個曾經占據了DOS時代開發程序的大半個江山。但是現在windows時代,用turbo C有感覺不方面,編輯程序起來很吃力,並且拖放,更沒有函數變數自動感應功能,查詢參考資料也不方便。建議使用Visual C++,這個平台雖然體積大,但是一旦安裝好了,用起來很方便。
B)一本學習教程
現在C語言教材多如牛毛,推薦大家使用《C語言程序設計》第二版。此書很適合初學者,並且內容也很精到。
C)利用輔助學習軟體
畢竟現在是Windows時代了,學習軟體多如牛毛,這里向大家推薦一個「集成學習環境(C語言)」,里邊的知識點總結和常式講解都非常好,有好幾千題的題庫測試環境,包括一個windows下的trubo C,初學者甚至不用裝其它的編譯器,就可以練習編程了。還有一個「C語言學習系統」軟體,不過感覺只是一個題庫系統,如果你覺得題做的不夠,不妨也可以試試。
二、葵花寶典
學習計算機語言最好的方法是什麼?答曰:讀程序。
沒錯,讀程序是學習C語言入門最快,也是最好的方法。我們大家都應該有個體驗——在最初學習windows系統操作或Microsoft words如果操作的過程中,剛開始總是正兒八經地買來教材,結果讀來讀去卻雲里霧里,而當我們將教材丟在一邊,拿起滑鼠反復地試,幾個小時就搞定。包括學習J#,C#等其他語言,在今天的Windows時代,也不再提倡抱著書本逐行啃,而是學習它們的常式。
當然,對於沒有學過任何計算機語言的初學者,多少要先閱讀教程,認真體會所有概念,然後不放過這一章中提到的所有常式,仔細研讀,直到每一行都理解了,再找幾個編程題目,最好是和常式類似的或一樣的,自己試圖寫出這段已經讀懂的程序。如果寫不出來,回過頭來再繼續研究常式,想想自己為什麼寫不出來,然後再去寫這段程序,反反復復,直到你手到擒來為止。
三、登峰造極
寫程序的最高境界其實就是掌握各種解決問題的手段(數據結構)和解決問題的方法(演算法)。
是不是寫出底層程序就是程序設計高手呢?非也,寫底層程序,無非是掌握了硬體的結構,況且硬體和硬體還不一樣,要給一個晶元寫驅動程序,無非就是掌握這塊晶元的各種寄存器及其組合,然後寫值讀值,僅此而已。這不過是熟悉一些I/O函數罷了。那麼怎樣才算精通程序設計呢?怎樣才能精通程序設計呢?舉個例子:
你面前有10個人,找出一個叫「張三」的人,你該怎麼辦?第一種方法:直接對這10個人問:「誰叫張三」。第2種方法:你挨個去問「你是不是張三?」,直到問到的這個人就是張三。第三種方法:你去問一個人「你認不認識張三,指給我看」。不要小看這個問題,你說當然會選第一種方法,那麼恭喜你答對了,因為這個方法最快,效率最高,但是在程序設計中找到解決問題的最優方法和你用的手段卻是考驗一個程序員程序設計水平的重要標志,而且是不容易達到的。剛才這個問題類似於數據結構和演算法中的:Map數據結構,窮舉查找和折半查找。所以掌握好數據結構和一些常用演算法,是登峰造極的必然之路。
⑺ 用C語言編程序算24
#include<stdio.h>
#define C case
double fun(double a1,double a2,int b)
{switch(b)
{C 0:return (a1+a2);
C 1:return (a1-a2);
C 2:return (a1*a2);
C 3:return (a1/a2);
}
}
void main()
{ int g;
for(g=0;g<100;)
{int i,j,k,l,n,m,r,save[4];
double num[4]={1,1,1,1},tem1,tem2,tem3,abc=1111;
char sign[5]="+-*/";
printf("請輸入4個數,數字與數字之間用空格隔開:\n");
for(i=0;i<4;i++)
{scanf("%lf",num+i); save[i]=num[i];}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(j!=i)
{for(k=0;k<4;k++)
if(k!=i&&k!=j)
{for(l=0;l<4;l++)
if(l!=i&&l!=j&&l!=k)
{for(n=0;n<4;n++)
for(m=0;m<4;m++)
for(r=0;r<4;r++)
{tem1=fun(num[i],num[j],n);
tem2=fun(tem1,num[k],m);
tem3=fun(tem2,num[l],r);
if(tem3==24.0)printf("{(%d%c%d)%c%d}%c%d=24\n",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);
else if(tem3==-24.0)printf("{%d%c(%d%c%d)}%c%d=24\n",save[k],sign[m],save[i],sign[n],save[j],sign[r],save[l]);
else if(tem3==1.0/24.0)printf("%d%c{(%d%c%d)%c%d}=24\n",save[l],sign[r],save[i],sign[n],save[j],sign[m],save[k]);
else if(tem3==-1.0/24.0)printf("%d%c{%d%c(%d%c%d)}=24\n",save[l],sign[r],save[k],sign[n],save[i],sign[m],save[j]);
else
{tem1=fun(num[i],num[j],n);
tem2=fun(num[k],num[l],r);
tem3=fun(tem1,tem2,m);
if(tem3==24.0) printf("(%d%c%d)%c(%d%c%d)=24\n",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);
}
}
}
}
}
g++;
}
}
這個演算法不用講解了吧。。