顯示0,1,1,2,3,5,8,13…..

這是我去面試時的考題,

當時笨笨的,一直想不出來

(在此感謝建安,崇德及86的幫忙)

VB語法:

        Dim x, y, z, n As Integer
        x = 0
        y = 0
        z = 0

        For n = 10 To 0 Step -1
            Console.WriteLine(y)
            z = x + y
            If z = 0 Then z += 1
            x = y
            y = z
        Next


Java:

int x = 0,y = 0,z = 0;
int size = 10;
while((size–)>= 0){
    System.out.println ;
    z = x+y;
    if(z == 0)++z;
    x = y;
    y = z;
}

從 i=i++; 談程式師容易犯的錯!

轉貼自﹝工程師的家

code:
i=0; i=i++;

這樣的程式,最後 i 的值會是多少?0 還是 1 或其它值?
我在網路上看過幾個類似的問題,回覆的答案也是莫衷一是。
對大部份的 C/C++ Compiler測試的結果是 1,
有人把它拿到 java 上測試,發現結果是 0 。
但 C/C++ 和 java 對這樣表示式的計算規則是一樣的啊!
是java不好?還是 C/C++ 錯了?事實上,都不是,
是程式寫得有問題!

ANSI C/C++ 運算式(expression)有一個但書:
如果一個左值(l-value)在運算式中被改變了兩次以上,除非運算子
能保證其計算次序,否則運算式的結果是未定義的

很明顯的 i 在運算式中被改變了兩次,所以:
運算後 i 的結果在ANSI C/C++的規格是未定義的,它依compiler 所用的運
算式演算法不同而有不同的結果,用你手上的C++ Compiler,i的結果可能
是0或是1甚至是其它的值,但不表示其它家的C++compiler 會有一樣的結
果; 甚至你手上C++的下一個版本都不保證會和現在一樣。因為它們都未違
反ANSI 的法律!

很多程式員並不熟讀程式語言的細節而容易犯下這樣的錯,原來跑得好好的
程式在compiler換上新版本後出現了問題。通常直覺的會去怪"新版本"的
compiler有bug!但十有八九問題是出在自己的程式。

”一個左值(l-value)在運算式中被改變了兩次以上,除非運算子 能保證
其計算次序,否則運算式的結果是未定義的”
這在C/C++原始的定義是這樣的:
一個運算式中若含有子運算式,子運算式的計值次序是未定義。
(未定義的意思是ANSI 未規範,編譯器可自行依演算法之差異而便宜行事)
i=i++; 這個運算式來說它分成
i=i;//<—主運算式
i=i+1;//<—子運算式

兩個運算式
因為子運算式(i=i+1)計值次序未定義,所以主運算式的右值 i 到底是新值或
舊值便無法確定,所以最後指派到i的值便未定義。
那麼什麼運算子可以保證子運算式的計值次序?就是”循序”運算子:逗號 (,)
像這樣的式子是正確的運算式:
j=i++, i=j+2;
循序運算子保證其左邊會先於右邊計值。

注意到在C/C++裡只有運算式中的逗號是循序運算子,不是所有的逗號都
是循序運算子。
例如呼叫函式:
FuncCall(i, j*i++);
這程的函式的呼叫是錯的,兩個引數中間的逗號是”分隔符號”不是”循序
運算子”。C/C++也不保證引數的計值次序,結果是第一個引數值是不確定的。

花了一個晚上除錯

不知有沒有電腦高手上來看到我這麼蠢的除錯方式,
真是獻醜啦!!
******************************************
以下我先說明一下我所遇到的情況,
我有寫一套「借還系統」(ASP.NET),
它是在win2000的環境下開發的,
而我架站的主機是win2003,
可是程式放上去之後,卻遇到問題了,
在本機執行程式,做新增,修改,刪除等動作都OK喔!!
但如果從其他台連到它,
按下某個BUTTON的功能(基本上都是要連上SQL SERVER資料庫),
一次OK,第二次就會掛點…(運氣不好的話,第一次就掛了)
而掛掉的情況就是"系統畫面直接黑掉,重新開機…."
******************************************
各位高手,你們認為要怎麼查呢?
以下,說明我花了一整個晚上的成果:
  1. 系統出現錯誤的話,一開始我是會查事件檢視器,沒有查到相關的錯誤訊息
  2. 接下來,我判斷是DNS出了問題,結果我使用區域內的IP連,依然掛點
  3. 程式應該是沒問題,所以我假設是和.NET程式和SQL SERVER的連接出了問題,所以,我把我測試環境的SQL SERVER連到主機上用,OK!!而主機上SQL SERVER連到測試環境上,結果,仍然OK!!有頭緒了
  4. 我猜想,應該是那台win2003上SQL SERVER和ASP.NET的問題,於是,我把SQL SERVER和IIS都重灌,但….還是一樣沒有用(又陷入困境了)
  5. 我想到,我會自動重開機,是不是因為我開啟了錯誤重啟?沒想到,真的是這樣
    很順利的,我終於看到了藍色的畫面,錯誤訊息出現了…..
    teefer.sys!!這是什麼東東,上GOOGLE查,找不到,在我HD內查,檔案在SYGATE的資料夾下,這不是我防火牆的程式嗎?(現在時間是晚上2點了)
  6. 有點想睡了說,但我還是打起精神完成最後一步,我關掉防火牆再進行測試,賓果!!兇手就是它….
 ———————————————————————
後記:教導如何解teefer.sys的問題
http://forums.sygate.com/vb/showthread.php?s=edb10aaa6e8c5fc90b420cf35878c222&threadid=7431

.NET的開發工具

開發工具

  • Microsoft Visual Studio.NET

以程式碼後置(CodeBehind)的概念將畫面與程式碼分離,以web form為例,aspx存放的是與畫面有關的html與server control,另外會產生一個同名的vb程式存放事件與邏輯

Form的配置:document的屬性pagelayout可有兩個值,flowlayout可以像寫asp一樣利用table繪製版面,gridlayout的話,有點像用layer

  • Microsoft ASP.NET Web Matrix

Web Matrix 是微軟完全以c#實作出來的Windows Form(Client-Side UI)的網頁程式IDE開發工具,雖然使用介面類似Visual Studio.NET但實際是以嵌入式(Embedded)的概念來表現,其程式碼與畫面放在同一個檔案內(CodeInline)。Web Matrix是一個”Community Project”,使用者可以透過線上社群的討論方式,針對感興趣的項目提出問題與回應。

Web Matrix與Visual Studio.NET尚有若干差異:
1. Web Matrix應用程式不是以專案型式開啟,檔案間各自獨立。
2. Web Matrix的程式撰寫區不提供Intellisense的屬性提示窗格。
3. Web Matrix檔案無法自動編譯成DLL,而須透過Command Line自行編譯。
4. Web Matrix IDE提供.NET Framework Class Library屬性查詢視窗與線上討論區連結。
5. Web Matrix程式免費下載與使用。

  • #develop

#develop (唸成「 Sharp Develop」) 是一套遵循GPL授權的自由軟體,可在微軟的.NET平台上編寫C#與VB.NET的程式

  • Borland C#Builder

Borland C#Builder

  • Mono

    1. Mono 是一套.NET架構的開放原始碼發展平台,可讓軟體開發者以具生產力的方式輕易發展出跨平台的解決方案。
    2. Mono’s .NET 實作了C#與CLR在 ECMA的標準(ECMA-334ECMA-335)

.NET – 存取修飾元

l          Overloads用法:

‘test的第一個同名函式

Public Overloads Function test(num as integer) as integer

        test = num * num

End Function

 

‘test的第二個同名函式

Public Overloads Function test(str as string) as string

        test = str & str

End Function

 

l          Overrides用法:

建立一個Class

Class JustTest

        兩個屬性

        Public num1 As Integer

        Public num2 As Integer

       

        一個method

        Public Overridable Function Add() As Integer

                Add=num1+num2

        End Function

End Class

 

建立一個Class繼承自JustTest

Class JustTest1

        Inherits JustTest

       

        Public result As Integer

       

        Public Overrides Function Add() As Integer

                result=num1+num2

        End Function

End Class

 

PS.使用Overrides的條件為父子的型別需要相同,如需完全取代則用Shadows

 


 

l          MSDN上的說法:

 

Protected

Dim 陳述式中的 Protected 關鍵字將項目宣告為只能從相同類別或從該類別衍生的類別中存取。下列程式碼顯示 Protected 宣告範例:

Protected Class ClassForMyHeirs

您只能在類別層級中,而且只能在宣告類別的成員時,使用 Protected

 

Friend

Dim 陳述式中的 Friend 關鍵字將項目宣告為可從相同專案中存取,但無法從專案以外存取。下列程式碼顯示 Friend 宣告範例:

Friend StringForThisProject As String

您只能在模組、命名空間或檔案層次中使用 Friend。這表示您可以在原始程式檔或模組、類別或結構中宣告 Friend 項目,但不可以在程序內。

 

Protected Friend

Dim 陳述式中一起出現的 Protected Friend 關鍵字將項目宣告為可在衍生的類別或相同的專案,或兩者當中使用。下列程式碼顯示 Protected Friend 宣告範例:

Protected Friend StringForProjectAndHeirs As String

您只能在類別層級中,而且只能在宣告類別的成員時,使用 Protected Friend

 

 



l          OMG的說法:

privateprotectedpublic三者的作用是在定義class成員的開放性

也就是說你可不可以直接去取用這個class內的成員。

設定為private屬性的成員只能被class本身的成員函數存取

你不能在class外的敘述中使用。

而設定為public的成員,則可以開放給程式內部的所有敘述。

至於protected,它跟private一樣也限制只有class內的成員函數可以使用,

不過除此之外,它也開放給繼承class作存取。