① 學習編程時會遇到什麼困難
其實你這個問題比較難回答。因人而異。
我覺得應該都有一個過程,我擅長自學,有過學徒。因此是這個過程。
1、不知道從什麼地方看起。解決辦法就是從第一章看起。
2、不知道如何編第一個程序,很簡單解決方法是
(1)、用書上例子
(2)、獨立完成最簡單的一個完整流程,如從代碼到完整的作品,如軟體就是一個提示框,硬體完成一個閃燈。
3、不知道程序怎麼編寫,這個是剛學習的通病,其實很簡單,按照你的想法編寫,錯了也比不編程好的多,慢慢改進就會很精簡。我剛開始寫一個代碼用了1200多條的匯編,但現在讓我改完後只有105條實現了相同功能。
4、不知道怎麼更好更快的編寫,其實編寫程序有一些思想在裡面多看看一些編程思路的書。
我可以提供一些
下面是總結的經驗。
1、程序細化,利於組建其他程序。
2、程序模塊化,利於整體調用。
3、分類程序段,使程序思路清晰。
4、合並相同和相似的代碼,編寫成一個函數,用到此功能調用此函數。
5、編寫通用程序,載入不同的腳本實現不同的功能。
6、編寫程序工具,不同功能的模塊可以用程序工具來編輯,比用代碼編輯方便。
7、用通用的現成功能庫來提高工作效率。
8、持續優化重構和改進,提高代碼質量。(lens23 提出的)
9、建立通用數學模型,使一類事物用一個統一模型表示。
10、預留一些介面,提高程序的可擴展性。(chm51666提出的)
11、添加一些注釋、流程圖、說明文檔使思路清晰。
這樣你編寫的程序會可讀性強、重復錯誤少,代碼量少,時間少。其實好的代碼往往比不好的代碼可以差幾十倍的代碼量。(這個我也不知道為什麼)
5、如何學別的知識和相關的東西,按照上面的路子再走一次。
6、如何和客戶交談,滿足客戶要求,這個比較難。可以找一些錄音設備。
② java編程中,你經常遇到的異常有哪些場景如何
數組角標越界異常,經常是取數據時忘了數組的大小,導致程序取了數組里不存在的位置。
③ 學習電腦編程過程中遇到的問題
首先,我想說的是,其實編程能力的高低和英語水平沒有很大的關聯。(如果,是想要做科研,演算法研究等非一般人能完成的偉業,那麼就需要有比較好的英文水平,因為可以讀懂外國最新技術的原著)其次,我個人認為,VB不算是一個好的入門語言。因為它基本上是實現可視化編程,處在一個比較高的位置上,會將許多東西混雜在一起。(比如,函數,事件,消息)對於初學者而言,在一開始還是需要在細節上做做功夫。(比如,變數,常量,表達式,語句)最後,我建議你學習C語言吧。我當初,也是先學的VB然後發現自己什麼都沒有學會。直到後面學習C語言才會編程的。而且,你將來准備去軟體學院,有C語言的基礎會好一些。 就這樣了,祝你成功。
④ 基礎C語言編程時易犯錯誤有哪些
一、基礎知識和數據類型、表達式 1、{},[],(),『』,「」不配對。解決這個問題最好的方法就是每當寫這些符號的時候就先寫成一對,然後再在中間加內容。 2、忘記在語句的末尾加分號,或在預處理命令後多加分號。記住:每一個語句的後邊都要加分號,而預處理命令並不是語句,所以不加分號,他們必須每行一條,不能把多個命令寫在一行。 3、混淆/和\;注釋對應的符號是/* */,而轉義字元是以\開頭,除號是/。 4、printf()和scanf()的參數設置有誤,主要表現在以下幾方面: l 類型不匹配的問題。(例如:有float a=3.5,但輸出的時候printf(「a=%d」,a);則屏幕上會顯示出a=0.00000或者提示其它運行錯誤)。基本原則是:float對應%f, int對應%d, char對應%c。 l 個數不匹配。無論是哪個函數,都可以有n個參數,第一個永遠是「」括起來的內容,表示輸出格式。剩下的n-1個是輸出的變數或者輸入的變數的地址。需要注意的是,如果後邊有n-1個參數,那麼前邊一定對應n-1個%f一類的格式說明符。 l scanf()中變數前忘了加&。記住:scanf()中變數前要有&(但後邊學到的字元數組名和指針前不用加) 5、定義標識符的時候經常出現使用非法字元的情況,例如:標識符中不能用空格,也就是說不能有這樣的定義:int radium of circle;一般情況下可用下劃線將三個單詞連接在一起。 6、在使用變數前未定義,或未初始化。例如:若下邊的sum未定義,則在編譯時會提示相應的錯誤信息,而若未初始化為0,則求和的結果一定是錯誤的。 void main() { int I,a[10], sum=0; /*只要下邊要用,這個定義就必須要有,一般情況下也要有初始值*/ for(I=0;I<10;I++) sum+=a[I]; printf(「%d」,sum); } 7、計算錯誤。主要注意:++,――和其它運算符一起運算時,除根據優先順序進行計算時,還要考慮先後位置的特殊含義;數據類型不一致時發生的自動轉換也會導致計算的誤差;還要注意求模結果的符號與被除數相同;某些特殊情況下 使用懶惰求值法。 8、不能除以0,要做合法性檢查; 9、類型溢出。記住每種數據類型的取值范圍,確保數據在所定義類型範圍之內; 10、數學表達式的格式有誤。常見的有:(1)數學與C語言運算表達式的混淆(例如:=表示賦值,而= =才表示我們數學中的相等關系)。(2)、忽略了運算的優先順序。解決這個問題的最好方法就是寫數學表達式時不要從左到右,而是按優先順序的順序寫,寫完優先順序高的一個表達式後加上()再寫下一級的表達式,例如:計算梯形的面積時,要s=((a+b)*h)/2,不要1/2*a+b*h. (3)忽略了計算和賦值時的自動轉換。例如:float half=1/2;這樣,因為=右邊是整數相除的結果為整數0,不會得到0.5存入half,進而會影響下邊的計算結果。要想不在這兒絆跟頭,當計算不同類型的數據時,一定注意會不會出現引起錯誤的自動轉換,建議最好加上強制轉換。(4)賦值號左邊不是變數,例如:若有#define PI 3.14,程序中又出現PI=3.14159。又例如:f(n)=f(n-1)*n(這是典型的數學語言,在C語言中右邊的乘積不能正確存儲,而左邊又是一個函數調用)。 11、使用庫函數前忘了加#include<?.h> 二、流程式控制制 1、 丟掉語句結束標記「;」,尤其是for語句中表達式後或do-while語句後的分號,或在預處理命令後邊、while()後、for()後加「;」; 2、 If語句或循環語句中邏輯表達式或關系表達式書寫錯誤。一定要注意C語言的條件與數學表達式的區別(例如我們數學中經常寫到的0≤x≤9,在C語言中應該寫成x>=0&&x<=9)。 3、 if-else嵌套時不配對。最好在寫每個條件時要用兩個{}分別將兩個分支先括起來,再添加其中的語句,以保證其配對不易錯。 4、 switch()語句中的格式不正確。()中的表達式結果一定是一些明確的值,不能是區間;表達式的所有可能結果要列在case後邊,case與常量之間有一空格,不要丟掉必要的break; 5、 隨意修改循環控制變數i的值,導致循環次數的改變,尤其是當循環有嵌套時。在循環體中,不要將循環控制變數進行另外的改變。 6、 分不清什麼情況下用雙重循環,什麼情況下用兩個控制變數寫成一重循環。當I不變,j又循環一遍的時候用雙重循環。當I,j同時變化的時候用一重循環,此時,循環控制變數有兩個,但條件只寫一個就可以,因為另一個總是進行相應的變化的。 7、 忽略循環體與循環控制變數的關系。其實,很多情況下,循環控制變數都在循環體中起到非常重要的作用。應該利用上這種關系。 三、數組與指針 1、 字元串的輸入有錯誤:主要表現在使用scanf()或gets()時加了&,或輸入字元串時用循環,(這樣的話,字元個數無論多長,都不會為自動加\0,將來引用的時候也就不能以字元串的形式引用。) 2、 對字元串的處理中,循環條件仍然寫成I<N。由於字元串是不定長的,所以循環條件一般為str[I]!=』\0』 或I<strlen(str) 3、 而輸入所對應的變數是指針時(常見的有:輸入的變數是字元數組名或指向字元串的指針)不能加&。 4、 指針定義後未賦值就引用。如果在定義時不知道賦什麼值,可以用p=NULL賦初值,以避免引起的災難性錯誤。 5、 分不清p和*p。前者是指針,即地址,後者表示指針所間接引用的數據,但如果是二級指針或多級指針,取*以後得到的仍然可能是地址。 四、函數 1、 函數定義的時候,函數頭部加分號,而函數聲明的地方忘了加分號 2、 函數實參格式不對,主要表現在:給出實參時,多給出數組類型,或者,形參是數組int a[];的時候,給出的a[]或a[I]. 3、 遞歸時忘了設置邊界條件,這樣易造成死循環調用。 4、使用函數之前未聲明(包括C庫函數的聲明)。建議大家,將所定義的一切函數都在程序開始的預處理命令後加上函數原型的聲明,這樣做不僅可以避免錯誤,而且整個程序的結構看起來更清楚。 五、結構體共用體 1、 結構體類型定義有誤,主要表現在:結構體類型里還有嵌套的時候,忘記了成員名稱。(例如:下邊的例子中,有些同學經常忽略了birthday) 2、 結構體類型名和結構體變數名混淆。例如: struct STU {…. Struct data {int year,month,day; }birthday }; struct STU a; struct STU是類型名稱,而且不分配空間,且不能直接引用。只有定義了結構體類型struct STU的變數a以後,才為a分配相應的內存空間,引用時也要是a.??? 3、 結構體變數的成員引用不正確,尤其是當結構體類型中有嵌套定義的時候。一定要一級一級的引用。例如:上邊的例子:如果引用其中的年的話,一定是a.birthday.year. 不能直接a.year. 4、 對結構體變數進行輸入輸出的時候,整體輸入或整體輸出。除作為函數參數外,不能對結構體變數整體操作,只能一個成員一個成員地輸入、輸出。 5、 不理解共用體的「共占內存」。對共用體中的成員變數,一定要靠一個標記區別它們,並分別按不同類型引用它們。切記:共用體變數不能做函數形參。 六、文件 1、 使用之前沒有打開文件,使用之後沒有關閉文件。 2、 相關函數的調用格式有誤。請一定注意實參的類型、順序、個數上與函數原型(或函數聲明)的一致。
⑤ Java編程中常見的錯誤有哪些
相信作為程序員的我們在對程序進行編譯過程中經常會遇到錯誤,或者在運行過程中出現錯誤,在這里主要跟大家談談經常遇到的一些異常與錯誤,以及解決辦法。
異常是指程序在編譯或運行過程出現的錯誤。
在java.lang包中Throwable包含了所有的異常。
Error (錯誤) 和Exception(異常)
(1)Error(錯誤)
一旦發生無法修復,但可以避免發生。
常見錯誤類:
IOError:I/O錯誤,當發生嚴重的I/O錯誤時,拋出此錯誤。
VirtualMachineError:虛擬機錯誤,當 Java 虛擬機崩潰或用盡了它繼續操作所需的資源時,拋出該錯誤。
StackOverflowError:棧內存滿了,當應用程序遞歸太深而發生堆棧溢出時,拋出該錯誤。
OutofMemoryError:堆內存滿了,因為內存溢出或沒有可用的內存提供給垃圾回收器時,Java 虛擬機無法分配一個對象,這時拋出該異常。
以上是一些常見的錯誤,在Error類中還有一些別的錯誤(參照文件Java.lang.Throwable.Error).
(2)Exception(異常)
一旦發生,可以捕獲並處理,不會導致程序終止,有時可以避免有時無法避免。
異常的分類:
1.編譯時異常(需要強制處理) 2.運行時異常(不需要強制處理)
常見的異常有:
IOException:輸入輸出流異常
FileNotFoundException:文件找不到的異常
ClassNotFoundException:類找不到的異常
DataFormatException:數據格式化異常
NoSuchFieldException:沒有匹配的屬性異常
NoSuchMethodException:沒有匹配的方法異常
SQLException:資料庫操作異常
TimeoutException:執行超時異常
常見的運行時異常:
RuntimeException:運行時異常
NullPointerException:空指針異常
:數組越界異
ClassCastException:類型轉換異常
IllegalArgumentException:非法的參數異常
InputMismatchException:輸入不匹配
以上是常見的一些異常,另外還有別的異常,參見文件:Java.lang.Throwable.Exception
既然我們常常會遇到一些異常,那我們如何來處理這些異常就是一個急需解決的事情。
(1) 如何處理編譯時異常?
方法一:將需要處理的代碼塊放在一個try...catch...中
try{
//需要處理異常的代碼
}catch(XXXException ef){
ef.printStackTrace();
}
我們方法一就是要將我們不確定的代碼放入try......catch中,先進行try一下,如果沒有異常,則不會觸發catch,沒有輸出,一旦出現異常,那麼catch就會工作,在catch中捕獲異常信息,根據異常信息進行補救措施。
如以下代碼:
從結果可以看出,我們在輸入數據的時候出現錯誤,這樣通過自定義異常能夠讓我們更直接快速的找到運行或編譯時的異常。
在上述中我們分別提到了三種throw,分別是Throwable,Throws以及throw,那麼到底三者有什麼區別?
Throwable:是指在在Java.lang包中的一個類,其包含了所有的異常和錯誤,其中類Error和Exception 是它
的子類。
Thows:是指在解決編譯時異常,將方法中異常拋給上一級,在方法後面要加Throw Exception來進行拋。
throw:是指在自定義異常時,如果方法出現異常,那麼將作為引用方法的對象拋出。即拋出異常。
⑥ 面向對象編程有哪些問題
1. 過度封裝
使用OOP時,會把一些復雜的問題分拆抽象成較簡單的獨立對象,通過對象的互相調用去實現方案。但是,由於對象包含自己封裝的數據,一個問題的數據集會被分散在不同的內存區域。互相調用時很可能會出現數據的cache miss的情況。
2. 多態
在C++的一般的多態實現中,會使用到虛函數表。虛函數表是通過加入一次間接層來實現動態派送。但在調用的時候需要讀取虛函數表,增加cache miss的可能性。基本上要支持動態派送,無論用虛函數表、函數指針都會形成這個問題,但如果類的數目極多,把函數指針如果和數據放在一起有時候可放緩問題。
3. 數據布局
雖然OOP本身並無限制數據的布局方式,但基本上絕大部分OOP語言都是把成員變數連續包裹在一段內存中。甚至使用C去編程的時候,也通常會使用到OOP或Object-based的思考方式,把一些相關的數據放置於一個struct之內:
structParticle{
Vector3position;
Vector4velocity;
Vector4color;
floatage;
//...
};
即使不使用多態,我們幾乎不加思索地會使用這種數據布局方式。我們通常會以為,由於各個成員變數都緊湊地放置在一起,這種數據布局通常對緩存友好。然而,實際上,我們需要考慮數據的存取模式(access pattern)。
在OOP中,通過封裝,一個類的各種功能會被實現為多個成員函數,而每個成員函數實際上可能只會存取少量的成員變數。這可能形式非常嚴重的問題,例如:
for(Particle*p=begin;p!=end;++p)
p->position+=p->velocity*dt;//或p->SimulateMotion(dt);
在這種模式下,實階上只存取了兩個成員變數,但其他成員變數也會載入緩存造成浪費。當然,如果在迭代的時候能存取盡量多的成員變數,這個問題可能並不存在,但實際上是很困難的。
如果採用傳統的OOP編程範式及實現方式,數據布局的問題幾乎沒有解決方案。所以在[1]里,作者提出,在某些情況下,應該放棄OOP方式,以數據的存取及布局為編程的考慮重中,稱作面向數據編程(data-oriented programming, DOP)。