技術類面試、筆試題彙總css
注:標明*的問題屬於選擇性掌握的內容,能掌握更好,沒掌握也不要緊。html
下面的參考解答只是幫助你們理解,不用背,面試題、筆試題變幻無窮,不要夢想着把題覆蓋了,下面的題是供你們查漏補缺用的,真正的把這些題搞懂了,才能「以不變應萬變」。回答問題的時候能聯繫作過項目的例子是最好的,有的問題後面我已經補充聯繫到項目中的對應的案例了。程序員
1、簡述 private、 protected、 public、 internal 修飾符的訪問權限。 web
private : 私有成員, 在類的內部才能夠訪問。面試
protected : 保護成員,該類內部和繼承類中能夠訪問。ajax
public : 公共成員,徹底公開,沒有訪問限制。 算法
internal: 當前程序集內能夠訪問。sql
2、ADO.NET中的五個主要對象數據庫
Connection:主要是開啓程序和數據庫之間的鏈接。沒有利用鏈接對象將數據庫打開,是沒法從數據庫中取得數據的。Close和Dispose的區別,Close之後還能夠Open,Dispose之後則不能再用。編程
Command:主要能夠用來對數據庫發出一些指令,例如能夠對數據庫下達查詢、新增、修改、刪除數據等指令,以及調用存在數據庫中的存儲過程等。這個對象是架構在Connection 對象上,也就是Command 對象是透過鏈接到數據源。
DataAdapter:主要是在數據源以及DataSet 之間執行數據傳輸的工做,它能夠透過Command 對象下達命令後,並將取得的數據放入DataSet 對象中。這個對象是架構在Command對象上,並提供了許多配合DataSet 使用的功能。
DataSet:這個對象能夠視爲一個暫存區(Cache),能夠把從數據庫中所查詢到的數據保留起來,甚至能夠將整個數據庫顯示出來,DataSet是放在內存中的。DataSet 的能力不僅是能夠儲存多個Table 而已,還能夠透過DataAdapter對象取得一些例如主鍵等的數據表結構,並能夠記錄數據表間的關聯。DataSet 對象能夠說是ADO.NET 中重量級的對象,這個對象架構在DataAdapter對象上,自己不具有和數據源溝通的能力;也就是說咱們是將DataAdapter對象當作DataSet 對象以及數據源間傳輸數據的橋樑。DataSet包含若干DataTable、DataTableTable包含若干DataRow。
DataReader:當咱們只須要循序的讀取數據而不須要其它操做時,能夠使用DataReader 對象。DataReader對象只是一次一筆向下循序的讀取數據源中的數據,這些數據是存在數據庫服務器中的,而不是一次性加載到程序的內存中的,只能(經過遊標)讀取當前行的數據,並且這些數據是隻讀的,並不容許做其它的操做。由於DataReader 在讀取數據的時候限制了每次只讀取一筆,並且只能只讀,因此使用起來不但節省資源並且效率很好。使用DataReader 對象除了效率較好以外,由於不用把數據所有傳回,故能夠下降網絡的負載。
ADO.NET 使用Connection 對象來鏈接數據庫,使用Command 或DataAdapter對象來執行SQL語句,並將執行的結果返回給DataReader 或 DataAdapter ,而後再使用取得的DataReader 或DataAdapter 對象操做數據結果。
3、列舉ASP.NET 頁面之間傳遞值的幾種方式。
1.使用QueryString, 如....?id=1; response. Redirect()....
2.使用Session變量
3.使用Server.Transfer
4.Cookie傳值
4、C#中的委託是什麼?事件是否是一種委託?事件和委託的關係。
委託能夠把一個方法做爲參數代入另外一個方法。
委託能夠理解爲指向一個函數的指針。
委託和事件沒有可比性,由於委託是類型,事件是對象,下面說的是委託的對象(用委託方式實現的事件)和(標準的event方式實現)事件的區別。事件的內部是用委託實現的。由於對於事件來說,外部只能「註冊本身+=、註銷本身-=」,外界不能夠註銷其餘的註冊者,外界不能夠主動觸發事件,所以若是用Delegate就無法進行上面的控制,所以誕生了事件這種語法。事件是用來閹割委託實例的,類比用一個自定義類閹割List。事件只能add、remove本身,不能賦值。事件只能+=、-=,不能= 。加分的補充回答:事件內部就是一個private的委託和add、remove兩個方法
面試聊:用Reflector查看.Net的類的內部實現,解決問題。
5、override與重載(overload)的區別
重載是方法的名稱相同。參數或參數類型不一樣,進行屢次重載以適應不一樣的須要。重載(overload)是面向過程的概念。
Override 是進行基類中函數的重寫。Override是面向對象的概念
6、C#中索引器是否只能根據數字進行索引?是否容許多個索引器參數?
參數的個數和類型都是任意的。加分的補充回答:用reflector反編譯能夠看出,索引器的內部本質上就是set_item、get_item方法。
基礎知識:
索引的語法:
public string this[string s],經過get、set塊來定義取值、賦值的邏輯
索引能夠有多個參數、參數類型任意
索引能夠重載。
若是隻有get沒有set就是隻讀的索引。
索引其實就是set_Item、get_Item兩個方法。
7、屬性和public字段的區別是什麼?調用set方法爲一個屬性設值,而後用get方法讀取出來的值必定是set進去的值嗎?
屬性能夠對設值、取值的過程進行非法值控制,好比年齡禁止設值負數,而字段則不能進行這樣的設置。雖然通常狀況下get讀取的值就是set設置的值,可是可讓get讀取的值不是set設置的值的,極端的例子。Public Age{get{return 100;}set{}}。加分的補充回答:用reflector反編譯能夠看出,屬性內部本質上就是set_***、get_***方法,詳細參考傳智播客.net培訓視頻中串講.net基礎的部分。
class Person
{
public int Age
{
get
{
return 3;
}
set
{
}
}
}
Person p1 = new Person();
p1.Age = 30;
p1.Age++;
Console.Write(p1.Age);//輸出3
必須手寫掌握的代碼(既包含拿電腦寫,拿筆寫):
一、 手寫三層架構
二、 手寫冒泡排序
三、 手寫AJAX:XMLHttpRequest
四、 手寫增刪改查、SQLHelper
8、三層架構
一般意義上的三層架構就是將整個業務應用劃分爲:表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL)。
區分層次的目的即爲了「高內聚,低耦合」的思想。
表現層(UI):通俗講就是展示給用戶的界面,即用戶在使用一個系統的時候的所見所得。
業務邏輯層(BLL):針對具體問題的操做,也能夠說是對數據層的操做,對數據業務邏輯處理。
數據訪問層(DAL):該層所作事務直接操做數據庫,針對數據的增添、刪除、修改、更新、查找等每層之間是一種垂直的關係。
三層結構是N層結構的一種,通常來講,層次之間是向下依賴的,下層代碼未肯定其接口(契約)前,上層代碼是沒法開發的,下層代碼接口(契約)的變化將使上層的代碼一塊兒變化。
優勢: 分工明確,條理清晰,易於調試,並且具備可擴展性。
缺點: 增長成本。
10、關於拆箱裝箱:
1)什麼是裝箱(boxing)和拆箱(unboxing)? (*)
Object是引用類型,可是它的子類Int32居然不能去Object能去的「要求必須是引用類型」
的地方,違反了繼承的原則,因此須要把Int32裝在Object中才能傳遞。
裝箱:從值類型接口轉換到引用類型。
拆箱:從引用類型轉換到值類型。
object obj = null;//引用類型
obj = 1;//裝箱,boxing。把值類型包裝爲引用類型。
int i1 = (int)obj;//拆箱。unboxing
2)下面三句代碼有沒有錯,以inboxing或者unboxing爲例,解釋一下內存是怎麼變化的
int i=10;
object obj = i;
int j = obj;
分析:在inboxing(裝箱)時是不須要顯式的類型轉換的,不過unboxing(拆箱)須要顯式的類型轉換,因此第三行代碼應該改成:
3 int j = (int)obj;
要掌握裝箱與拆箱,就必須瞭解CTS及它的特色:
NET重要技術和基礎之一的CTS(Common Type System)。CTS是爲了實如今應用程序聲明和使用這些類型時必須遵循的規則而存在的通用類型系統。.Net將整個系統的類型分紅兩大類 :值類型和引用類型。
CTS中的全部東西都是對象;全部的對象都源自一個基類——System.Object類型。值類型的一個最大的特色是它們不能爲null,值類型的變量總有一個值。爲了解決值類型不能夠爲null,引用類型能夠爲null的問題,微軟在.Net中引入了裝箱和拆箱:裝箱就是將值類型用引用類型包裝起來轉換爲引用類型;而從引用類型中拿到被包裝的值類型數據進行拆箱。
(*)
object.ReferenceEquals();//用來判斷兩個對象是不是同一個對象
Console.WriteLine(object.ReferenceEquals(3,3));//由於兩個3被裝到了兩個箱子中,因此是false
Equals ==的關係
12、CTS、CLS、CLR分別做何解釋(*)把英文全稱背過來。
C#和.Net的關係。
C#只是抽象的語言,能夠把C#編譯生成Java平臺的二進制代碼,也能夠把Java代碼編譯生成.Net平臺的二進制代碼。因此C#只是提供了if、while、+-*/、定義類、int、string等基礎的語法,而Convert.ToInt32、FileStream、SqlConnection、String.Split等都屬於.Net的東西。深藍色是C#的,淺藍色是.Net的。
C# new→IL:newobj
C# string →.Net中的String
類型的差異:.net中的Int32在C#中是int,在VB.Net中是Integer。String、Int32等公共類型。
語法的差異:IL中建立一個對象的方法是L_0001: newobj instance void 索引.C1::.ctor()
C#中是new C1();VB.net中是 Dim c1 As New C1
CTS:Common Type System 通用類型系統。Int32、Int16→int、String→string、Boolean→bool。每種語言都定義了本身的類型,.Net經過CTS提供了公共的類型,而後翻譯生成對應的.Net類型。
CLS:Common Language Specification 通用語言規範。不一樣語言語法的不一樣。每種語言都有本身的語法,.Net經過CLS提供了公共的語法,而後不一樣語言翻譯生成對應的.Net語法。
CLR:Common Language Runtime 公共語言運行時,就是GC、JIT等這些。有不一樣的CLR,好比服務器CLR、Linux CLR(Mono)、Silverlight CLR(CoreCLR)。至關於一個發動機,負責執行IL。
13、在dotnet中類(class)與結構(struct)的異同?
Class能夠被實例化,屬於引用類型,是分配在內存的堆上的。類是引用傳遞的。
Struct屬於值類型,是分配在內存的棧上的。結構體是複製傳遞的。加分的回答:Int32、Boolean等都屬於結構體。
14、堆和棧的區別?
棧是編譯期間就分配好的內存空間,所以你的代碼中必須就棧的大小有明確的定義;局部值類型變量、值類型參數等都在棧內存中。
堆是程序運行期間動態分配的內存空間,你能夠根據程序的運行狀況肯定要分配的堆內存的大小。
15、能用foreach遍歷訪問的對象的要求
須要實現IEnumerable接口或聲明GetEnumerator方法的類型。
16、GC是什麼? 爲何要有GC?
C/C++中由程序員進行對象的回收像學校食堂中由學生收盤子,.Net中由GC進行垃圾回收像餐館中店員去回收。
GC是垃圾收集器(Garbage Collection)。程序員不用擔憂內存管理,由於垃圾收集器會自動進行管理。GC只能處理託管內存資源的釋放,對於非託管資源則不能使用GC進行回收,必須由程序員手工回收,一個例子就是FileStream或者SqlConnection須要程序員調用Dispose進行資源的回收。
要請求垃圾收集,能夠調用下面的方法:GC.Collect()通常不須要手動調用GC.Collect()。當一個對象沒有任何變量指向(再也不能使用)的時候就能夠被回收了。
基礎知識:當沒有任何變量指向一個對象的時候對象就能夠被回收掉了,但不必定會當即被回收。
object obj = new object();//只有new纔會有新對象
Console.WriteLine(obj);
object obj2 = obj;
obj = null;
obj2 = null;
Console.WriteLine();
18、值類型和引用類型的區別?
1.將一個值類型變量賦給另外一個值類型變量時,將複製包含的值。引用類型變量的賦值只複製對對象的引用,而不復制對象自己。
2.值類型不可能派生出新的類型:全部的值類型均隱式派生自 System.ValueType。但與引用類型相同的是,結構也能夠實現接口。
3.值類型不可能包含 null 值:然而,可空類型功能容許將 null 賦給值類型。
4.每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。
19、C#中的接口和類有什麼異同。
不一樣點:
不能直接實例化接口。
接口不包含方法的實現。
接口能夠多繼承,類只能單繼承。
類定義可在不一樣的源文件之間進行拆分。
相同點:
接口、類和結構均可以從多個接口繼承。
接口相似於抽象基類:繼承接口的任何非抽象類型都必須實現接口的全部成員。
接口和類均可以包含事件、索引器、方法和屬性。
基礎知識:接口只能定義方法(只能定義行爲,不能定義實現也就是字段),由於事件、索引器、屬性本質上都是方法,因此接口中也能夠定義事件、索引器、屬性。
20、abstract class和interface有什麼區別?
相同點:
都不能被直接實例化,均可以經過繼承實現其抽象方法。
不一樣點:
接口支持多繼承;抽象類不能實現多繼承。
接口只能定義行爲;抽象類既能夠定義行爲,還可能提供實現。
接口只包含方法(Method)、屬性(Property)、索引器(Index)、事件(Event)的簽名,但不能定義字段和包含實現的方法;
抽象類能夠定義字段、屬性、包含有實現的方法。
接口能夠做用於值類型(Struct)和引用類型(Class);抽象類只能做用於引用類型。例如,Struct就能夠繼承接口,而不能繼承類。
加分的補充回答:講設計模式的時候SettingsProvider的例子。
21、是否能夠繼承String類?
String類是sealed類故不能夠繼承。
22、
static void Main(string[] args)
{
Console.WriteLine(GetIt());
Console.ReadKey();
}
static int GetIt()
{
int i = 8;
try
{
i++;
Console.WriteLine("a");
return i;//把返回值設定爲i,而後「儘快」返回(沒啥事就回去吧)
}
finally
{
Console.WriteLine("b");
i++;
}
}
上面程序的執行結果是ab9
try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的代碼會不會被執行,何時被執行?
會執行,在return後執行。
static void Main(string[] args)
{
//Console.WriteLine(GetIt());
Console.WriteLine(GetPerson().Age);
Console.ReadKey();
}
static Person GetPerson()
{
Person p = new Person();
p.Age = 8;
try
{
p.Age++;
Console.WriteLine("a");
return p;//把返回值設定爲i,而後「儘快」返回(沒啥事就回去吧。搞完就走)
}
finally
{
Console.WriteLine("b");
p.Age++;
}
}
加分的補充回答(也助記):讀取數據庫中數據的條數的程序
public int QueryCount()
{
…..
try
{
return cmd.ExecuteScalar();
}
finally
{
cmd.Dispose();
}
}
先執行cmd.ExecuteScalar(),把返回值暫時存起來,而後再去執行finally(錢放在這,我去劫個色),而後把返回值返回。return都是最後執行,可是return後的表達式的計算則是在finally以前。
若是C#設計的是先執行cmd.Dispose()再執行return就會出現return執行失敗了,由於cmd已經Dispose了。
28、int、DateTime、string是否能夠爲null?
null表示「不知道」,而不是「沒有」。沒有年齡和不知道年齡是不同。
數據庫中null不能用0表示。0歲和不知道多少歲不同。
Sex is zero。《色便是空》
//int i1 = null;
//int? i2 = null;//值類型後加?就成了可空數據類型
////int i3 = i2;//因此把可空的賦值給必定不能爲空的會報錯。
//int i4 = (int)i2;//能夠顯式轉換,由程序員來保證「必定不爲空」
//int? i5 = i4;//必定會成功!
//using()→try{]catch{}finally{}
//int?是微軟的一個語法糖。是一種和int沒有直接關係的Nullable類型
Nullable<int> d1 = new Nullable<int>();//int? d1=null;
Nullable<int> d2 = new Nullable<int>(3);//int? d2=3;
Console.WriteLine(d1==null);
int、DateTime不能,由於其爲Struct類型,而結構屬於值類型,值類型不能爲null,只有引用類型才能被賦值null。string能夠爲null。
C#中int等值類型不能夠爲null、而數據庫中的int能夠爲null,這就是糾結的地方。int?就變成了可空的int類型。bool?、DateTime?
int i1 = 3;
int? i2 = i1;
//int i3 = i2;//不能把可能爲空的賦值給必定不能爲空的變量
int i3 = (int)i2;//顯式轉換
可空數據類型經典應用場景:三層中的Model屬性的設計。
int?翻譯生成.Net的Nullable<int>,CTS。
29、using關鍵字有什麼用?什麼是IDisposable?
using能夠聲明namespace的引入,還能夠實現非託管資源的釋放,實現了IDisposiable的類在using中建立,using結束後會自動調用該對象的Dispose方法,釋放資源。加分的補充回答:using其實等價於try……finally,用起來更方便。
30、XML 與 HTML 的主要區別
1. XML是區分大小寫字母的,HTML不區分。
2. 在HTML中,若是上下文清楚地顯示出段落或者列表鍵在何處結尾,那麼你能夠省略</p>或者</li>之類的結束 標記。在XML中,絕對不能省略掉結束標記。
HTML:<img src="1.jpg"><br><br>
XML:<img src="1.jpg"></img><br/><br/>
3. 在XML中,擁有單個標記而沒有匹配的結束標記的元素必須用一個 / 字符做爲結尾。這樣分析器就知道不用 查找結束標記了。
4. 在XML中,屬性值必須分裝在引號中。在HTML中,引號是可用可不用的。
5. 在HTML中,能夠擁有不帶值的屬性名。在XML中,全部的屬性都必須帶有相應的值。
XML是用來存儲和傳輸數據的
HTML是用來顯示數據的
若是使用了徹底符合XML語法要求的HTML,那麼就叫作符合XHTML標準。符合XHTML標準的頁面有利於SEO。
31、string str = null 與 string str =」」說明其中的區別。
答:string str = null 是不給他分配內存空間,而string str = \"\" 給它分配長度爲空字符串的內存空間。 string str = null沒有string對象,string str = 「」有一個字符串對象。
string s3 = string.Empty;//反編譯發現,string.Empty就是在類構造函數中 Empty = "";
32.寫出一條Sql語句:取出表A中第31到第40記錄(SQLServer,以自動增加的ID做爲主鍵,注意:ID可能不是連續的。
答:解1: select top 10 * from A where id not in (select top 30 id from A)
演變步驟:
1)select top 30 id from T_FilterWords--取前條
2)select * from T_FilterWords
where id not in (select top 30 id from T_FilterWords)--取id不等於前三十條的
--也就是把前條排除在外
3)select top 10 * from T_FilterWords
where id not in (select top 30 id from T_FilterWords)
--取把前條排除在外的前條,也就是-40條
解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)
解答3:用ROW_NUMBER實現
33.面向對象的語言具備________性、_________性、________性
答:封裝、繼承、多態。
不要背,腦子中要有聯想。
34.在.Net中全部可序列化的類都被標記爲_____?
答:[serializable]
35、什麼是code-Behind技術。
就是代碼隱藏,在ASP.NET中經過ASPX頁面指向CS文件的方法實現顯示邏輯和處理邏輯的分離,這樣有助於web應用程序的建立。好比分工,美工和編程的能夠個幹各的,不用再像之前asp那樣都代碼和html代碼混在一塊兒,難以維護。code-Behind是基於部分類技術實現的,在個人項目的三層代碼生成器中用到了部分類。
36、接口是一種引用類型,在接口中能夠聲明( a),但不能夠聲明公有的域或私有的成員變量。
a) 方法、屬性、索引器和事件;
b) 索引器和字段;
c) 事件和字段;
解讀:接口中不能聲明字段只能聲明方法,屬性、索引器和事件 最終都編譯生成方法。由於字段屬於實現層面的東西,只有存取值的時候纔會用到字段,因此中接口中不能定義字段。
37. 在ADO.NET中,對於Command對象的ExecuteNonQuery()方法和ExecuteReader()方法,下面敘述錯誤的是(c)。
a) insert、update、delete等操做的Sql語句主要用ExecuteNonQuery()方法來執行;
b) ExecuteNonQuery()方法返回執行Sql語句所影響的行數。
c) Select操做的Sql語句只能由ExecuteReader()方法來執行;
d) ExecuteReader()方法返回一個DataReader對象;
拿SQLHelper實現一下。
38. 下列關於C#中索引器理解正確的是(c )
a) 索引器的參數必須是兩個或兩個以上
b) 索引器的參數類型必須是整數型
c) 索引器沒有名字
d) 以上皆非
39. 下面關於XML的描述錯誤的是(d)。
a) XML提供一種描述結構化數據的方法;
b) XML 是一種簡單、與平臺無關並被普遍採用的標準;
c) XML文檔可承載各類信息;
d) XML只是爲了生成結構化文檔;
40、如下的C#代碼,試圖用來定義一個接口:
public interface IFile
{
int A;
int delFile()
{
A = 3;
}
void disFile();
}
關於以上的代碼,如下描述錯誤的是(d )。
a) 以上的代碼中存在的錯誤包括:不能在接口中定義變量,因此int A代碼行將出現錯誤;
b) 以上的代碼中存在的錯誤包括:接口方法delFile是不容許實現的,因此不能編寫具體的實現函數;
c) 代碼void disFile();聲明無錯誤,接口能夠沒有返回值;
d) 代碼void disFile();應該編寫爲void disFile(){};
41、在ASP.NET中有Button控件myButton,要是單擊控件時,導航到其餘頁面http://www.abc.com, 正確的代碼爲( c)。
a) private void myButton_Click(object sender, System.EventArgs e){Redirect(「http://www.abc.com」);}
b) private void myButton_Click(object sender, System.EventArgs e){Request.Redirect(「http://www.abc.com」);}
c) private void myButton_Click(object sender, System.EventArgs e){Reponse.Redirect(「http://www.abc.com」);}
d) private void myButton_Click(object sender, System.EventArgs e){Request.Redirect(「http://www.abc.com」);return true;}
42. 聲明一個委託public delegate int myCallBack(int x); 則用該委託產生的回調方法的原型應該是(b )。
a) void myCallBack(int x) ;
b) int receive(int num) ;
c) string receive(int x) ;
d) 不肯定的;
43.StringBuilder 和 String 的區別?
答:String 在進行運算時(如賦值、拼接等)會產生一個新的實例,而 StringBuilder 則不會。因此在大量字符串拼接或頻繁對某一字符串進行操做時最好使用 StringBuilder,不要使用 String
若是要操做一個不斷增加的字符串,儘可能不用String類,改用StringBuilder類。兩個類的工做原理不一樣:String類是一種傳統的修改字符串的方式,它確實能夠完成把一個字符串添加到另外一個字符串上的工做沒錯,可是在.NET框架下,這個操做實在是划不來。由於系統先是把兩個字符串寫入內存,接着刪除原來的String對象,而後建立一個String對象,並讀取內存中的數據賦給該對象。這一來二去的,耗了很多時間。而使用System.Text命名空間下面的StringBuilder類就不是這樣了,它提供的Append方法,可以在已有對象的原地進行字符串的修改,簡單並且直接。固然,通常狀況下覺察不到這兩者效率的差別,但若是你要對某個字符串進行大量的添加操做,那麼StringBuilder類所耗費的時間和String類簡直不是一個數量級的。
44、.請敘述屬性與索引器的區別。 (*)
屬性 索引器
經過名稱標識。 經過簽名標識。
經過簡單名稱或成員訪問來訪問。 經過元素訪問來訪問。
能夠爲靜態成員或實例成員。 必須爲實例成員。
屬性的 get 訪問器沒有參數。 索引器的 get 訪問器具備與索引器相同的形參表。
屬性的 set 訪問器包含隱式 value 參數。 除了 value 參數外,索引器的 set 訪問器還具備與索引器相同的形參表。
46. 請解釋ASP。NET中的web頁面與其隱藏類之間的關係?
一個ASP.NET頁面通常都對應一個隱藏類,通常都在ASP.NET頁面的聲明中指定了隱藏類例如一個頁面Tst1.aspx的頁面聲明以下
<%@ Page language="c#" Codebehind="Tst1.aspx.cs" AutoEventWireup="false" Inherits="T1.Tst1" %>
Codebehind="Tst1.aspx.cs" 代表經編譯此頁面時使用哪個代碼文件
Inherits="T1.Tst1" 表用運行時使用哪個隱藏類
aspx頁面會編譯生成一個類,這個類從隱藏類繼承。
49、您在什麼狀況下會用到虛方法?它與接口有什麼不一樣?
答案:子類從新定義父類的某一個方法時,必須把父類的方法定義爲virtual
在定義接口中不能有方法體,虛方法能夠。
實現時,子類能夠不從新定義虛方法,但若是一個類繼承接口,那必須實現這個接口。
50. 不定項選擇:
(1) 如下敘述正確的是: B C
A. 接口中能夠有虛方法。B. 一個類能夠實現多個接口。 C. 接口不能被實例化。 D. 接口中能夠包含已實現的方法。
(2) 從數據庫讀取記錄,你可能用到的方法有:B C D
A. ExecuteNonQuery B. ExecuteScalar C. Fill D. ExecuteReader
(3).對於一個實現了IDisposable接口的類,如下哪些項能夠執行與釋放或重置非託管資源相關的應用程序定義的任務?(多選) ( ABCD )
A.Close B.Dispose C.Finalize
D.using E.Quit
(4)如下關於ref和out的描述哪些項是正確的?(多選) ( ACD )
A.使用ref參數,傳遞到ref參數的參數必須最早初始化。
B.使用out參數,傳遞到out參數的參數必須最早初始化。
C.使用ref參數,必須將參數做爲ref參數顯式傳遞到方法。
D.使用out參數,必須將參數做爲out參數顯式傳遞到方法。
51. 單項選擇:
(1)下列選項中,(C)是引用類型。
a)enum類型 b)struct類型 c)string類型 d)int類型
(2).關於ASP.NET中的代碼隱藏文件的描述正確的是(C)
a)Web窗體頁的程序的邏輯由代碼組成,這些代碼的建立用於與窗體交互。編程邏輯惟一與用戶界面不一樣的文件中。該文件稱做爲「代碼隱藏」文件,若是用C#建立,該文件將具備「.ascx.cs」擴展名。
b)項目中全部Web窗體頁的代碼隱藏文件都被編譯成.EXE文件。
c)項目中全部的Web窗體頁的代碼隱藏文件都被編譯成項目動態連接庫(.dll)文件。
d)以上都不正確。
(3).下列描述錯誤的是(D)
a)類不能夠多重繼承而接口能夠;
b)抽象類自身能夠定義成員而接口不能夠;
c)抽象類和接口都不能被實例化;
d)一個類能夠有多個基類和多個基接口;
52、DataReader和DataSet的異同?
DataReader使用時始終佔用SqlConnection,在線操做數據庫
每次只在內存中加載一條數據,因此佔用的內存是很小的
是隻進的、 只讀的
DataSet則是將數據一次性加載在內存中.拋棄數據庫鏈接..讀取完畢即放棄數據庫鏈接(非鏈接模式)
DataSet將數據所有加載在內存中.因此比較消耗內存...可是確比DataReader要靈活..能夠動態的添加行,列,數據.對數據庫進行 回傳更新操做(動態操做讀入到內存的數據)
53、public static const int A = 1;這段代碼有錯誤麼?
錯誤:const不能被修飾爲static ;由於定義爲常量 (const )後就是靜態的(static )。
54、傳入某個屬性的set方法的隱含參數的名稱是什麼?
value,它的類型和屬性所聲名的類型相同。
55、C#支持多重繼承麼?
類之間不支持,接口之間支持。類對接口叫作實現,不叫繼承。 類是爹、接口是能力,能有多個能力,但不能有多個爹。
56、C#中全部對象共同的基類是什麼?
System.Object
57、經過超連接怎樣傳遞中文參數?
答:用URL編碼,經過QueryString傳遞,用urlencode編碼 用urldecode解碼
58、string、String;int、Int32;Boolean、bool的區別
String、Int32、Boolean等都屬於.Net中定義的類,而string、int、bool至關於C#中對這些類定義的別名。CTS。
59、Server.Transfer和Response.Redirect的區別是什麼?(常考)
答: Server.Transfer僅是服務器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址;Response.Redirect則是徹底的跳轉,瀏覽器將會獲得跳轉的地址,並從新發送請求連接。這樣,從瀏覽器的地址欄中能夠看到跳轉後的連接地址。
Server.Transfer是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,因此它的地址欄中仍是原來的地址。 這個過程當中瀏覽器和Web服務器之間通過了一次交互。
Response.Redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址,通常來講瀏覽器會用剛纔請求的全部參數從新請求。這個過程當中瀏覽器和Web服務器之間通過了兩次交互。
Server.Transfer不能夠轉向外部網站,而Response.Redirect能夠。
Server.Execute效果和Server.Transfer相似,可是是把執行的結果嵌入當前頁面。
60、不是說字符串是不可變的嗎?string s="abc";s="123"不就是變了嗎?(傳智播客.Net培訓班原創模擬題)
String是不可變的在這段代碼中,s原先指向一個String對象,內容是 "abc",而後咱們將s指向"123",那麼s所指向的那個對象是否發生了改變呢?答案是沒有。這時,s不指向原來那個對象了,而指向了另外一個 String對象,內容爲"123",原來那個對象還存在於內存之中,只是s這個引用變量再也不指向它了。
61、是否能夠從一個static方法內部發出對非static方法的調用?
不能夠。由於非static方法是要與對象關聯在一塊兒的,必須建立一個對象後,才能夠在該對象上進行方法調用,而static方法調用時不須要建立對象,能夠直接調用。也就是說,當一個static方法被調用時,可能尚未建立任何實例對象,若是從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪一個對象上的呢?這個邏輯沒法成立,因此,一個static方法內部不能發出對非static方法的調用。
63、說出一些經常使用的類、接口,請各舉5個
要讓人家感受你對.Net開發很熟,因此,不能僅僅只列誰都能想到的那些東西,要多列你在作項目中涉及的那些東西。就寫你最近寫的那些程序中涉及的那些類。
經常使用的類:StreamReader、WebClient、Dictionary<K,V>、StringBuilder、SqlConnection、FileStream、File、Regex、List<T>
經常使用的接口:IDisposable、IEnumerable、IDbConnection、IComparable、ICollection、IList、IDictionary
要出乎意料!不要僅僅完成任務!筆試不是高考!到處要顯出牛!
說出幾個開源軟件?MySQL、Linux、 Discuz、Apache、Paint.Net、Android、Chrome、Notepad++……
開源項目有一些是開發包。開源軟件指的是能夠直接用的。Jquery、NPOI、ASP.Net MVC、Silverlight Toolkit、AJAX toolkit、json.net
得瑟!
65、編寫一個單例(Singleton)類。
參考複習ppt。
把構造函數設置爲private,設置一個public、static的對象實例
public FileManager
{
private FileManager(){}
public readonly static FileManager Instance = new FileManager();
}
擴展:搜「C# Singleton」,有線程安全的更牛B的實現
66、什麼是sql注入?如何避免sql注入?
用戶根據系統的程序構造非法的參數從而致使程序執行不是程序員指望的惡意SQL語句。使用參數化的SQL就能夠避免SQL注入。
詳細參考複習ppt。舉例子,擺事實!
1' or 1=1
67、數據庫三範式是什麼?
用本身的話解釋,而不是背概念。
傳智播客風格的非嚴謹卻一會兒明瞭的解答方式:
第一範式:字段不能有冗餘信息,全部字段都是必不可少的。
第二範式:知足第一範式而且表必須有主鍵。
第三範式:知足第二範式而且表引用其餘的表必須經過主鍵引用。
員工內部→本身的老大→外部的老大
記憶順序:本身內部不重複→別人引用本身→本身引用別人。
72、post、get的區別
get的參數會顯示在瀏覽器地址欄中,而post的參數不會顯示在瀏覽器地址欄中;
使用post提交的頁面在點擊【刷新】按鈕的時候瀏覽器通常會提示「是否從新提交」,而get則不會;
用get的頁面能夠被搜索引擎抓取,而用post的則不能夠;
用post能夠提交的數據量很是大,而用get能夠提交的數據量則很是小(2k),受限於網頁地址的長度。
用post能夠進行文件的提交,而用get則不能夠。
參考閱讀:http://www.cnblogs.com/skynet/archive/2010/05/18/1738301.html
73、下面的程序執行結果是什麼?(傳智播客.Net培訓班原創模擬題)
class Person
{
public int Age { get; set; }
}
int i1 = 20;
int i2 = i1;
i1++;
Console.WriteLine(i2);
Person p1 = new Person();
p1.Age = 20;
Person p2 = p1;
p1.Age++;
Console.WriteLine(p2.Age);
答案:
20
21
解釋:引用類型和值類型的區別。
76、下面程序的執行結果是什麼?(傳智播客.Net培訓班原創模擬題)
int i = 10;
Console.WriteLine(i++);
Console.WriteLine(++i);
Console.WriteLine(i=20);
Console.WriteLine(i==20);
答案:
10
12
20
True
解答:前兩個參考第80題,i++表達式的值爲i自增以前的值,因此打印10,執行完成後i變成11,執行++i的時候表達式的值爲自增之後的值12。C#中賦值表達式的值爲變量被賦值的值,所以最後一個就輸出i賦值後的值20
while((line=reader.ReadLine())!=null)
{
}
下面程序的執行結果是什麼?
bool b=false;
if(b=true)
{
Console.WriteLine("yes");
}
else
{
Console.WriteLine("no");
}
7八、下列哪一個名詞和WebService不直接相關?(B)(傳智播客.Net培訓班原創模擬題)
A、UDDI
B、GUID
C、WSDL
D、SOAP
WebService解決的三個問題:接口的自我描述;採用Http協議等常規協議,不用寫原始的Socket;基於Web服務器,不佔用80端口以外的端口。
UDDI用來自動發現WebService的協議(*)
SOAP和HTTP的關係:SOAP基於Http協議的,和普通網頁不一樣的是網頁返回HTML,SOAP則是符合SOAP協議的XML數據。
WSDL(WebService Defination Language)是對WebService上的方法名、參數進行描述的協議。對接口的自描述。
SOAP(Simple Object Access Protocol)是對參數、返回值以什麼樣的格式進行傳遞進行描述的協議。對報文的格式規範。
實際工做中應該是本身調用別人的WebService或者別人調用本身的WebService,溝通語言就是WSDL,拿到WSDL什麼都不用操心。
WebService是跨平臺、跨語言調用,能夠跨防火牆;缺點:效率低。因此適用於兩個非內部系統的通信(好比炒股軟件和證券交易所之間的通信)
WCF是對WebService、Socket、MQ等通信方式的一個統一,底層仍是採用這些通訊協議,能夠簡化這些程序的開發,不用再換不一樣通訊協議的時候重寫代碼而且學一堆新的技術。因此WCF和WebService不是一個競爭取代關係。
WCF是對.Net Remoting、WebService、MQ等通信方式的一個高級封裝,讓咱們開發不一樣通信協議的程序的時候很簡單,不用學更多的東西。並非替代.Net Remoting、WebService、MQ這些東西。
8一、.Net、ASP.Net、C#、VisualStudio之間的關係是什麼?(傳智播客.Net培訓班原創模擬題)
答:.Net通常指的是.Net Framework,提供了基礎的.Net類,這些類能夠被任何一種.Net編程語言調用,.Net Framework還提供了CLR、JIT、GC等基礎功能。
ASP.Net是.Net中用來進行Web開發的一種技術,ASP.Net的頁面部分寫在aspx 文件中,邏輯代碼一般經過Code-behind的方式用C#、VB.Net等支持.Net的語言編寫。
C#是使用最普遍的支持.Net的編程語言。除了C#還有VB.Net、IronPython等。
VisualStudio是微軟提供的用來進行.Net開發的集成開發環境(IDE),使用VisualStudio能夠簡化不少工做,不用程序員直接調用csc.exe等命令行進行程序的編譯,並且VisualStudio提供了代碼自動完成、代碼高亮等功能方便開發。除了VisualStudio,還有SharpDevelop、MonoDevelop等免費、開源的IDE,VisualStudio Express版這個免費版本。
8二、AJAX解決什麼問題?如何使用AJAX?AJAX有什麼問題須要注意?項目中哪裏用到了AJAX?(傳智播客.Net培訓班原創模擬題)
答:AJAX解決的問題就是「無刷新更新頁面」,用傳統的HTML表單方式進行頁面的更新時,每次都要將請求提交到服務器,服務器返回後再重繪界面,這樣界面就會經歷:提交→變白→從新顯示這樣一個過程,用戶體驗很是差,使用AJAX則不會致使頁面從新提交、刷新。
AJAX最本質的實現是在Javascript中使用XMLHttpRequest進行Http的請求,開發中一般使用UpdatePanel、JQuery等方式簡化AJAX的開發,UpdatePanel的方式實現AJAX最簡單,可是數據通信量比較大,由於要來回傳整個ViewState,並且不靈活,對於複雜的需求則能夠使用JQuery提供的ajax功能。
UpdatePanel的內部原理。
AJAX最重要的問題是沒法跨域請求(www.rupeng.com →so.rupeng.com),也就是沒法在頁面中向和當前域名不一樣的頁面發送請求,能夠使用在當前頁面所在的域的服務端作代理頁面的方式解決。
在如鵬網項目中發帖的時候顯示相關帖的功能、站內搜索項目中顯示搜索Suggestion、數據採集項目中都用到了AJAX。
常考:不用任何框架編寫一個AJAX程序。XHR:XmlHttpRequest。背也要背下來!
若是面試的時候談AJAX談到UpdatePanel的時候,就是NB的時候!!!先侃UpdatePanel的原理!引出爲何Dom操做的動態效果在用UpdatePanel提交刷新之後沒有了,以及CKEditor被套在UpdatePanel中提交之後也變成了textarea,爲何把Fileupload放到Updatepanel中沒法實現無刷新上傳。說成是公司內部的一個菜鳥用UpdatePanel遇到這樣問題,因爲我懂XHR、UpdatePanel的原理,因此輕鬆解決!UpdatePanel生成的上萬行JS腳本,不適合於互聯網項目。「WebForm怎麼可能把開發人員編程傻子呢!不明白原理苦命呀!仍是MVC好呀,MVC。。。。。。。」
多準備幾把斧子!上來找一切機會甩斧子!
8四、Application 、Cookie和 Session 兩種會話有什麼不一樣?
答:Application是用來存取整個網站全局的信息,而Session是用來存取與具體某個訪問者關聯的信息。Cookie是保存在客戶端的,機密信息不能保存在Cookie中,只能放小數據;Session是保存在服務器端的,比較安全,能夠放大數據。
談到Session的時候就侃Session和Cookie的關係:Cookie中的SessionId。和別人對比說本身懂這個原理而給工做帶來的方便之處。
8五、開放式問題:你常常訪問的技術類的網站是什麼?
博客園(www.cnblogs.com)、csdn、codeplex、codeproject、msdn文檔、msdn論壇(遇到問題先到網上搜解決方案,還不行就問同事,同事也解決不了就去MSDN論壇提問,必定能獲得解決)。Cnbeta.com。
8六、你對.net的GC的理解
GC是.Net的垃圾收集器,能夠進行內存資源的回收,程序員無需關心資源的回收,當一個對象沒有任何引用的時候就能夠被回收了。一個對象能夠被回收並不意味着必定會被當即回收,GC會選擇時機進行回收。能夠調用GC.Collect()讓GC當即回收。GC不能回收非託管資源,對於非託管資源通常都實現了IDisposable接口,而後使用using關鍵字進行資源的回收。
8七、請寫一個SQL語句:從user表中取出name列中的起始字符是「北京」的所有記錄
select * from [user] wherer name like '北京%'
8八、請你簡單的說明數據庫創建索引的優缺點
使用索引能夠加快數據的查詢速度,不過因爲數據插入過程當中會建索引,因此會下降數據的插入、更新速度,索引還會佔磁盤空間。
10一、下面程序的執行結果是什麼?
public struct Point
{
public int x;
public int y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
}
Point p1 = new Point(100, 100);
Point p2 = p1;
p1.x = 200;
Console.WriteLine("{0},{1}", p1.x, p2.x);
答案:
200,100
解答:結構體是複製傳遞的。
擴展:爲啥this.Size.Width = 100;編譯不經過。
10六、不用JQuery等框架實現AJAX無刷新登陸。(常考)
提示:用純XMLHttpRequest實現。
10七、Http狀態碼各是什麼意思。
301(永久重定向)、302 :重定向
404 :頁面不存在
500:服務器內部錯誤
10八、 對html文本框進行賦值的JQuery語句,對html文本框進行取值的JQuery語句,對TextBox服務端控件進行取值的語句JQuery。
1十、Session有什麼重大BUG,微軟提出了什麼方法加以解決?(常考)
iis中因爲有進程回收機制,系統繁忙的話Session會丟失,IIS重啓也會形成Session丟失。這樣用戶就要從新登陸或者從新添加購物車、驗證碼等放到Session中的信息。能夠用State server或SQL Server數據庫的方式存儲Session不過這種方式比較慢,並且沒法捕獲Session的END事件。可是(必定要寫上,這樣纔夠拽)我認爲這不是Bug,只能說是In-Proc方式存儲Session的缺陷,缺陷是和Bug不同的,In-Proc方式存儲Session會由服務器來決定何時釋放Session,這是By Design,In-Proc方式不知足要求的話徹底能夠用StateServer和數據庫的方式。
StateServer還能夠解決集羣Session共享的問題。
配置StateServer的方法:
http://support.microsoft.com/kb/317604
http://blog.csdn.net/zj1103/archive/2008/09/14/2926773.aspx
111、asp.net中<%%>、<%=%>、<%#%>的區別是什麼
<%%>是執行<%%>中的C#代碼,<%=%>是將=後表達式的值輸出到Response中,<%#%>是數據綁定,通常用在ListView、GridView、Repeater等控件的綁定中。數據綁定分爲:Eval:單向綁定和Bind:雙向綁定。
11三、說說在軟件設計中你遇到的以空間換時間的例子?
參考回答:談Cache(緩存)、索引這些例子。用額外的磁盤、內存空間的消耗來提升執行速度。Lucene.Net也是一個例子。
11四、asp.net中的錯誤機制。(常考)
參考:
定製錯誤頁來將顯示一個友好的報錯頁面。
頁面中未捕獲同樣會觸發Page_Error(不經常使用),應用程序中的未捕獲異常會觸發Application_Error。經過HttpContext.Current.Server.GetLastError()、HttpContext.Current.Error;拿到未捕捉異常,記錄到Log4Net日誌中。
11五、不用中間變量交換兩個變量(常考)
i = i + j;//i=30
j = i - j;//j=10;
i = i - j;//i=20;
Console.WriteLine("i={0},j={1}",i,j);
另一個解決方案:位運算。
int a=5;
int b=6;
a=a^b;
b=b^a; //b^a至關於 b^a^b 也就是 b^a^b的值就是a了, 下邊相同
a=a^b;
下面的SQL題是常考題中的常考題,必須重視!!!!!!!!
11六、橫表、縱錶轉換(常考!!!)
1)縱表結構 TableA
Name |
Course |
Grade |
張三 |
語文 |
75 |
張三 |
數學 |
80 |
張三 |
英語 |
90 |
李四 |
語文 |
95 |
李四 |
數學 |
55 |
橫表結構 TableB
Name |
語文 |
數學 |
英語 |
張三 |
75 |
80 |
90 |
李四 |
95 |
55 |
0 |
先理解:
select Name,
(case Course when ‘語文‘ then Grade else 0 end) as 語文,
(case Course when ‘數學‘ then Grade else 0 end) as 數學,
(case Course when ‘英語‘ then Grade else 0 end) as 英語
from TableA
而後理解標準答案:
select Name,
sum(case Course when ‘語文‘ then Grade else 0 end) as 語文,
sum(case Course when ‘數學‘ then Grade else 0 end) as 數學,
sum(case Course when ‘英語‘ then Grade else 0 end) as 英語
from TableA
group by Name
2)、橫錶轉縱表的"SQL"示例
橫表結構: TEST_H2Z
ID 姓名 語文 數學 英語
1 張三 80 90 70
2 李四 90 85 95
3 王五 88 75 90
轉換後的表結構:
ID 姓名 科目 成績
1 張三 語文 80
2 張三 數學 90
3 張三 英語 70
4 李四 語文 90
5 李四 數學 80
6 李四 英語 99
7 王五 語文 85
8 王五 數學 96
9 王五 英語 88
橫錶轉縱表SQL示例:
SELECT 姓名,'語文' AS 科目,語文 AS 成績 FROM TEST_H2Z UNION ALL
SELECT 姓名,'數學' AS 科目,數學 AS 成績 FROM TEST_H2Z UNION ALL
SELECT 姓名,'英語' AS 科目,英語 AS 成績 FROM TEST_H2Z
ORDER BY 姓名,科目 DESC;
11七、刪除姓名、年齡重複的記錄(只保留Id最大的一條)(常考!!!)
Id name age salary
1 yzk 80 1000
2 yzk 80 2000
3 tom 20 20000
4 tom 20 20000
5 im 20 20000
//取得不重複的數據
select * from Persons
where Id in
(
SELECT MAX(Id) AS Expr1
FROM Persons
GROUP BY Name, Age
)
根據姓名、年齡分組,取出每組的Id最大值,而後將Id最大值以外的排除。
刪除重複的數據:
delete from Persons
where Id not in
(
SELECT MAX(Id) AS Expr1
FROM Persons
GROUP BY Name, Age
)
儘量的得瑟!
11八、介紹幾個使用過的開源的項目
Lucene.net、NPOI、JQuery、ASP.Net AJAX toolkit、Quartz.Net、JqueryUI、ASP.Net MVC。在CodePlex、SourceForge等網站上有更多的開源項目。
11九、說出五個集合類
List、Dictionary、Set、Stack(先入後出)、Queue(先入先出)、Tree等。
解答:HashSet用於盛放不一樣的數據,相同的數據只保留一份
120有一個10個數的數組,計算其中不重複數字的個數。{3,5,9,8,10,5,3}
工程化的非最優解答:用HashSet或者List
int[] values = { 3, 5, 9, 8, 10, 5, 3 };
HashSet<int> set = new HashSet<int>();
foreach (int i in values)
{
set.Add(i);
}
Console.WriteLine(set.Count);
12二、下面是一個由*號組成的4行倒三角形圖案。要求:一、輸入倒三角形的行數,行數的取值3-21之間,對於非法的行數,要求拋出提示「非法行數!」;二、在屏幕上打印這個指定了行數的倒三角形。
*******
*****
***
*
123、一個文本文件含有以下內容:
4580616022644994|3000|趙濤
4580616022645017|6000|張屹
4580616022645090|3200|鄭欣夏
上述文件每行爲一個轉帳記錄,第一列表示賬號,第二列表示金額,第三列表示開戶人姓名。
建立一張數據庫表(MS SQLServer數據庫,表名和字段名自擬),請將上述文件逐條插入此表中。
124、一個文本文件含有以下內容,分別表示姓名和成績:
張三 90
李四 96
王五 78
趙六 82
提供用戶一個控制檯界面,容許用戶輸入要查詢的姓名,輸入姓名而且按回車之後,打印出此人的成績,若是不輸入姓名直接按回車則顯示全部人的姓名以及成績。(注意:不能使用數據庫)
126、下面程序的執行結果是什麼?
class Person
{
public DateTime BirthDay = DateTime.Now;
}
static void Main(string[] args)
{
Person p1 = new Person();//1:00:00
Console.WriteLine(DateTime.Now);
Thread.Sleep(1000 * 10);
Console.WriteLine(DateTime.Now);
Console.WriteLine(p1.BirthDay);
}
經過在public DateTime BirthDay = DateTime.Now上設定斷點來驗證。
再難一點
class Person
{
public static int A = 30;
static Person()//靜態構造函數在static字段初始化完成後執行
{//靜態構造函數只執行一次
A++;
}
public int B = A++;//字段的初始化賦值代碼只是在new一個對象的時候執行,而不是每次用字段的時候都執行
public Person()
{B++;}
}
程序的執行結果是什麼?
Person p1 = new Person();
Console.WriteLine(p1.B);
Console.WriteLine(Person.A);
Console.WriteLine(p1.B);
Console.WriteLine(Person.A);
Person p2 = new Person();
Console.WriteLine(p2.B);
Console.WriteLine(Person.A);
127、說一下SQLServer中索引的兩種類型(常考!!!)
參考:聚簇(或者叫作彙集,cluster)索引和非聚簇索引。
字典的拼音目錄就是聚簇(cluster)索引,筆畫目錄就是非聚簇索引。這樣查詢「G到M的漢字」就很是快,而查詢「6劃到8劃的字」則慢。
聚簇索引是一種特殊索引,它使數據按照索引的排序順序存放表中。聚簇索引相似於字典,即全部詞條在字典中都以字母順序排列。聚簇索引實際上重組了表中的數據,因此你只能在表中創建一個聚簇索引。
當數據按值的範圍查詢時,聚簇索引就顯得特別有用。由於全部SQLServer都必需先找到所查詢範圍的第一行,而後依次下去,直到該範圍的最後一個值找到爲止,而且保證了全部其餘值也落在這個範圍內。舉一個例子,一個應用程序要查找首字母位於G和P之間的姓名列表,SQLServer首先找到以字母G開頭的名字,取出全部記錄,直到找到以字母P開頭的名字爲止,這種方法使得查詢過程很是高效。
進行大量數據改動的表不適宜用聚簇索引,由於SQLServer將不得不在表中維護行的次序。若是要索引的值極少,例如一個列包含的全都是1和0,建立聚簇索引就不是個好主意。若是表常常由一個指定的列來排序,該列將是簇索引的最佳候選列。這是由於表中的數據已經爲你排好序了。若是訪問一個表並使用BETWEEN、<、>、>=或<=操做符來返回一個範圍的值時,應該考慮使用聚簇索引。
128、滬江網網申題:
1)可否脫離VS用相似editplus的工具手寫代碼?你以爲如何才能提升代碼的效率和性能?
能夠,使用CSC.exe 來編譯.cs文件!
能夠根據業務流程、業務數據的特色進行優化,好比能夠採用緩存、索引、表驅動等來提高代碼的效率和性能,同時不要進行無心義的代碼優化,重點優化系統的性能瓶頸。
2).如何提升頁面的顯示速度?假如一個頁面的加載時間是10.89s,你會用什麼樣的方式進行優化?
回答要大氣!顯得很牛!
提示:分而治之的思想。
首先要找出問題所在,是服務器端運行的速度慢仍是服務器端到客戶端的下載慢仍是頁面在瀏覽器的加載速度慢。
若是是服務器端運行速度慢,則找是數據庫的緣由仍是算法的問題,若是是數據庫的問題則嘗試添加索引、優化SQL語句,若是是算法的問題,則優化算法。若是對於一些不常常改動的頁面能夠使用靜態頁技術!對於一些數據不須要及時更新的並且取數據的過程很是耗時能夠使用緩存。頁面中的內容能夠按需加載(好比說能夠像verycd網站的評論那樣當用戶須要看的時候再加載其內容),能夠在圖片須要顯示的時候再進行加載。
若是是服務器端到客戶端的下載慢則看是頁面體積過於臃腫仍是網絡問題,若是是頁面體積過於臃腫,則優化HTML代碼,去掉無用的標籤,壓縮JS、CSS,能夠用CSS Spirit技術將多個圖片放到一個圖片中,減小向服務器的請求。若是是網絡問題,則嘗試在不一樣的網絡、地區部署服務器,而後使用CDN技術加速訪問。
若是是頁面中的JavaScript運行復雜致使運行速度慢,則優化JavaScript。
webkaka:測網速。
如何處理百萬條數據的優化?
對於常常進行檢索的字段建立索引,對於常常進行範圍查詢的一個字段建立彙集索引;
當有大量數據進行插入的時候進行批量插入;
一些代碼用存儲過程進行重寫(當一個邏輯有多行SQL要執行的時候用存儲過程能夠優化速度,能夠避免客戶端和SQLServer之間屢次交互);
(*)集羣、讀寫分離;
(*)分區、分表;
3).在程序編碼的時候,你會對Sql注入漏洞的防範採起什麼樣的措施?
儘可能不要拼SQL語句!使用參數化查詢或存儲過程能夠防止SQL注入攻擊!在必須用SQL拼接的地方對用戶輸入的內容進行檢查、過濾。
4).你會採用什麼樣的策略和方法來實現系統緩存?
在ASP.NET中 緩存有 頁面緩存,數據源緩存,和一些本身定義的緩存!
對於那些整個頁面不常常變化的咱們能夠使用頁面緩存,而對於那些執行很是耗時的SQL語句而且數據的及時性要求不高的咱們能夠使用數據源緩存。
對於頁面緩存、數據源緩存等都不知足要求的狀況下采用直接操做HttpRuntime.Cache來自定義緩存策略。若是須要用多臺Web服務器做爲一個集羣來承載網站的狀況,則能夠部署專門的分佈式緩存服務器,好比Memcached。
5)網站想要實現文件防盜鏈的功能,說說你的解決方案。
讀取HTTP報文頭中的UrlReferrer在Application_BeginRequest中咱們能夠判斷用戶的請求是否來源於本網站。若是不是咱們能夠終止用戶的請求(Response.End();)!
6).有這樣一個功能需求,用戶新註冊的時候須要給他推薦3個好友,說說你的推薦算法
好比說相似豆瓣網咱們能夠根據用戶興趣來匹配,相似於人人網那些地區性比較比較強的網站咱們能夠根據用戶的地區來匹配。
7).若是給學英語的用戶設計一個在線應用,你會選擇什麼做爲切入點,簡述你的想法和理由。
英語學習資料的下載、在線答疑、用戶交流、在線英語角做爲切入點。
8).你眼中的滬江是怎樣的?談談你對滬江的理解
我眼中的滬江是爲那些愛好外語,須要學習外語人提供一個學校交流的平臺!
9).是否有如下相關開發經驗?若有請簡要說明開發狀況(有可看項目網址也請提供)。
a、lucene相關開發經驗
b、分佈式文件處理經驗
c、流媒體相關開發經驗
d、語音技術
e、高負載網站開發
f、手機相關開發
129、請編程遍歷WinForm頁面上全部TextBox控件並給它賦值爲string.Empty?
答:
foreach (System.Windows.Forms.Control control in this.Controls)
{
if (control is System.Windows.Forms.TextBox)
{
System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ;
tb.Text = String.Empty ;
}
}
132、
int i=2000;
object o=i;
i=2001;
int j=(int)o;
Console.WriteLine("i={0},o={1},j={2}",i,o,j);
輸出的結果是:
134.一個數組:1,1,2,3,5,8,13,21...+m,求第30位數是多少?用遞歸實現;(常考!!!)
寫遞歸要肯定兩個:遞歸的終止條件;遞歸表達式。
解答:總結遞歸規律:F(n)=F(n-2)+F(n-1) Fibonacci數列
static int F(int n)
{
if (n == 1)
{
return 1;
}
if (n == 2)
{
return 1;
}
return F(n - 2) + F(n - 1);
}
非遞歸(有bug嗎?),遞歸算法的缺點:測試大數據
int n = Convert.ToInt32(Console.ReadLine());
if(n<=0)
{Console.WRiteLine("必須大於0");return;}
if(n==1) //時刻注意邊界值!!!
{
Console.WriteLine("1");
return;
}
int[] data =new int[n];
data[0] = 1;
data[1] = 1;
for(int i=2;i<n;i++)
{
data[i] = data[i-1]+data[i-2];
}
Console.WriteLine(data[n-1]);
上面程序的時間複雜度爲O(n),空間複雜度爲O(n)
用BigInteger解決溢出的問題。
若是回答斐波那契數列:提到用非遞歸實現、注意邊界條件以及用BigInteger解決溢出問題!
題目:計算兩個很是大的整數的加法、乘法。用程序實現乘法、加法運算。最起碼把思路說出來,說本身寫不出來,可是工做中用BigInteger解決。
參考:
算法複雜度:時間複雜度:算法運行須要消耗的時間的數量級、空間複雜度:算法運行須要消耗的內存的數量級。
消耗的時間或者內存隨着問題規模的擴大而成正比增長,就是O(n)。
消耗的時間或者內存隨着問題規模的擴大而不變,就是O(1)。
消耗的時間或者內存隨着問題規模的擴大而n*n增長,就是O(n*n)
算法複雜度只考慮最差狀況(從一個數組中找出第一個大於10的數,時間複雜度爲O(n)),而且算法複雜度忽略常量和低階。把數組數一遍和數兩遍的時間複雜度都是O(n)。把長度爲n的數組數n/2遍的時間複雜度仍是O(n*n)。
上課時把數組先後顛倒的算法的時間複雜度爲O(n),空間複雜度爲O(1)。
136.ref與out的區別?
137.表A字段Id爲numberic(18,0),哪一個SQL語句是錯誤的:
select * from A where id='';
select * from A where id='13';
select * from A where id=null;
select * from A where id=' 13';
138.在SQLServer中求當前時間與2012-01-01 0:0:0相差的秒數?
140、作一個表格,三行三列,第一列,前兩行合一;第二行,後兩列合一。
141、下面的HTML代碼
<style type="text/css">
#Text1{ background-color:Red}
.txt{ background-color:Green}
input {background-color:Black}
</style>
<input id="Text1" type="text" class="txt" />
<input type="text" class="txt" />
兩個文本框各是什麼顏色?
參考資料:我的大於集體:元素單獨設置的樣式>class命名樣式>標籤樣式。樣式override父級別的。
145、傳智播客.net培訓精品就業班學員總結SQL題
表一:student_info
學號 |
姓名 |
性別 |
出生年月 |
家庭住址 |
備註 |
0001 |
張三 |
男 |
1981-8-9 |
北京 |
NULL |
|
|
|
|
|
|
|
|
|
|
|
|
表二:curriculum
課程編號 |
課程名稱 |
學分 |
0001 |
計算機基礎 |
2 |
0002 |
C語言 |
2 |
表三:grade
學號 |
課程編號 |
分數 |
0001 |
0001 |
80 |
0001 |
0002 |
90 |
題目:
條件查詢:
select 學號,分數 from grade where 分數 between 80 and 90
select avg(分數) from grade where 課程編號='003'
Select課程編號,count(學號) as 人數from grade group by 課程編號
select 姓名,學號 from student_info where 姓名 like '張%'
嵌套查詢:
一、 查詢和學號’0001’的這位同窗性別相同的全部同窗的姓名和出生年月
select 姓名,出生年月 from student_info where 性別 in(select 性別 from student_info where sno='0001')
二、 查詢全部選修課程編號爲0002 和0003的學生的學號、姓名和性別
select 學號,姓名,性別 from student_info where 學號 in(select 學號 from grade where 課程編號='0002' and 學號 in(select 學號 from grade where 課程編號='0001'))
三、 查詢出學號爲0001的學生的分數比0002號學生最低分高的課程編號的課程編號和分數
select 課程編號, 分數 from grade where 學號='0001' and 分數>(select min(分數) from grade where 學號='0002')
多表查詢:
一、 查詢分數在80-90分的學生的學號、姓名、分數
select student_info.學號,student_info.姓名,grade.分數 from student_info,grade where grade.分數 between 80 and 90
二、 查詢學習了’C語言’課程的學生學號、姓名和分數
select student_info.學號,student_info.姓名,grade.成績from student_info,grade,curriculum where student_info.學號=grade.學號and grade.課程號=curriculum.課程號and curriculum.課程名='C語言'
三、 查詢全部學生的總成績,要求列出學號、姓名、總成績,沒有選課的學生總成績爲空。
select grade.學號,student_info.姓名,sum(grade.成績) as 總成績from student_info,grade where grade.學號=student_info.學號group by grade.學號,student_info.姓名
題目、活期存款中,「儲戶」經過「存取款單」和「儲蓄所」發生聯繫。假定儲戶包括:帳號,姓名,電話,地址,存款額;「儲蓄所」包括:儲蓄所編號,名稱,電話,地址(假定一個儲戶能夠在不一樣得儲蓄所存取款)
一、寫出設計以上表格的語句(4分)
二、建立一個觸發器TR1完成下面內容:
當向「存取款單」表中插入數據時,若是存取標誌=1則應該更改儲戶表讓存款額加上存取金額,若是存取標誌=0則應該更改儲戶表讓存款額減去存取金額,若是餘額不足顯示餘額不足錯誤。
CREATE TABLE CREATE TRIGGER tr1 on qukuan after insert
AS
BEGIN
declare @sid nvarchar(50)
declare @type int
declare @qian int
declare @yuer int
select @sid=sid,@type=[type],@m=m from inserted
select @yuer=yuer from cunkuan
if(@type=1)
begin
update cunkuan set yuer=yuer+@qian
end
else
begin
if(@yuer<@qian)
begin
print '餘額不足'
end
else
begin
update cunkuan set yuer=yuer-@qian
end
end
END
GO
本題用到下面三個關係表:
CARD 借書卡: (CNO 卡號,NAME 姓名,CLASS 班級)
BOOKS 圖書: (BNO 書號,BNAME 書名,AUTHOR 做者,PRICE 單價,QUANTITY 庫存冊數 )
BORROW 借書記錄: (CNO 借書卡號,BNO 書號,RDATE 還書日期
備註:限定每人每種書只能借一本;庫存冊數隨借書、還書而改變。
要求實現以下處理:
CREATE FUNCTION getSUM
(
@CNO int
)
RETURNS int
AS
BEGIN
declare @sum int
select @sum=sum(price) from BOOKS where bno in (select bno from BORROW where cno=@CNO)
return @sum
END
GO
2. 找出借書超過5本的讀者,輸出借書卡號及所借圖書冊數。
select CNO,count(BNO) as 借書數量from BORROW group by CNO having count(BNO)>3
3. 查詢借閱了"水滸"一書的讀者,輸出姓名及班級。
select name,class from card where cno in( select cno from borrow where bno in(
select bno from BOOKS where bname='水滸'))
4. 查詢過時未還圖書,輸出借閱者(卡號)、書號及還書日期。
select CNO,BNO,RDATE from borrow where getdate()>RDATE
5. 查詢書名包括"網絡"關鍵詞的圖書,輸出書號、書名、做者。
select bno,bname,author from books where bname like '網絡%'
6. 查詢現有圖書中價格最高的圖書,輸出書名及做者。
select bname,author from books where price in(select max(price) from books )
7. 查詢當前借了"計算方法"但沒有借"計算方法習題集"的讀者,輸出其借書卡號,並按卡號降序排序輸出。
select cno from borrow where bno in (select bno from books where bname='計算方法') and cno not in ( select cno from borrow where bno in(select bno from books where bname='計算方法習題集')) order by cno desc
或
SELECT a.CNO
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO AND b.BNAME=N'計算方法'
AND NOT EXISTS(
SELECT * FROM BORROW aa,BOOKS bb
WHERE aa.BNO=bb.BNO
AND bb.BNAME=N'計算方法習題集'
AND aa.CNO=a.CNO)
ORDER BY a.CNO DESC
8. 將"C01"班同窗所借圖書的還期都延長一週。
update borrow set rdate=dateadd(day,7,rdate) from BORROW where cno in(select cno from card where class='一班')
9. 從BOOKS表中刪除當前無人借閱的圖書記錄。
DELETE A FROM BOOKS a
WHERE NOT EXISTS(
SELECT * FROM BORROW
WHERE BNO=a.BNO)
10.若是常常按書名查詢圖書信息,請創建合適的索引。
(這個不肯定對不 90%應該是對的 本身看了下書寫的)
CREATE CLUSTERED INDEX IDX_BOOKS_BNAME ON BOOKS(BNAME)
11.在BORROW表上創建一個觸發器,完成以下功能:若是讀者借閱的書名是"數據庫技術及應用",就將該讀者的借閱記錄保存在BORROW_SAVE表中(注ORROW_SAVE表結構同BORROW表)。
CREATE TRIGGER TR_SAVE ON BORROW
FOR INSERT,UPDATE
AS
IF @@ROWCOUNT>0
INSERT BORROW_SAVE SELECT i.*
FROM INSERTED i,BOOKS b
WHERE i.BNO=b.BNO
AND b.BNAME=N'數據庫技術及應用'
12.創建一個視圖,顯示"力01"班學生的借書信息(只要求顯示姓名和書名)。
CREATE VIEW V_VIEW
AS
select name,bname
from books,card,borrow
where borrow.cno=card.cno and borrow.bno=books.bno and class='一班'
13.查詢當前同時借有"計算方法"和"組合數學"兩本書的讀者,輸出其借書卡號,並按卡號升序排序輸出。
select a.cno from borrow a,borrow b
where a.cno=b.cno and
a.bno in(select bno from books where bname='計算方法') and
b.bno in(select bno from books where bname='組合數學')
order by a.cno desc
或
SELECT a.CNO
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO
AND b.BNAME IN('計算方法','組合數學')
GROUP BY a.CNO
HAVING COUNT(*)=2
ORDER BY a.CNO DESC
1四、用事務實現以下功能:一個借書卡號借走某書號的書,則該書的庫存量減小1,當某書的庫存量不夠1本的時候,該卡號不能借該書
alter PROCEDURE pro_jieshu
@cno int,
@bno int,
@date datetime
AS
BEGIN
begin tran
declare @quantity int
select @quantity=quantity from books where bno=@bno
insert into borrow values(@cno,@bno,@date)
update books set quantity=@quantity-1 where bno=@bno
if(@quantity>0)
begin
commit tran
end
else
begin
print '已無庫存'
rollback
end
END
GO
1五、用遊標實現將書號爲‘A001’的書本的價格提升10元
declare @bno int
declare @bname nvarchar(50)
declare @author nvarchar(50)
declare @price int
declare @quantity int
declare mycursor cursor for select * from books
open mycursor
fetch next from mycursor into @bno,@bname,@author,@price,@quantity
while(@@fetch_status=0)
begin
if(@bno=2)
begin
update books set price=@price+10 where current of mycursor
end
fetch next from mycursor into @bno,@bname,@author,@price,@quantity
end
close mycursor
deallocate mycursor
Student(S#,Sname,Sage,Ssex) 學生表
Course(C#,Cname,T#) 課程表
SC(S#,C#,score) 成績表
Teacher(T#,Tname) 教師表
問題:
一、查詢「001」課程比「002」課程成績高的全部學生的學號;
select a.S# from (select s#,score from SC where C#='001') a,(select s#,score
from SC where C#='002') b
where a.score>b.score and a.s#=b.s#;
二、查詢平均成績大於60分的同窗的學號和平均成績;
select S#,avg(score)
from sc
group by S# having avg(score) >60;
三、查詢全部同窗的學號、姓名、選課數、總成績;
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student left Outer join SC on Student.S#=SC.S#
group by Student.S#,Sname
四、查詢姓「李」的老師的個數;
select count(distinct(Tname))
from Teacher
where Tname like '李%';
五、查詢沒學過「葉平」老師課的同窗的學號、姓名;
select Student.S#,Student.Sname
from Student
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='葉平');
六、查詢學過「001」而且也學過編號「002」課程的同窗的學號、姓名;
select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');
七、查詢學過「葉平」老師所教的全部課的同窗的學號、姓名;
select S#,Sname
from Student
where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='葉平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname='葉平'));
八、查詢課程編號「002」的成績比課程編號「001」課程低的全部同窗的學號、姓名;
Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2
from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score;
九、查詢全部課程成績小於60分的同窗的學號、姓名;
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);
十、查詢沒有學全全部課的同窗的學號、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);
十一、查詢至少有一門課與學號爲「1001」的同窗所學相同的同窗的學號和姓名;
select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';
十二、查詢至少學過學號爲「001」同窗全部一門課的其餘同窗學號和姓名;
select distinct SC.S#,Sname
from Student,SC
where Student.S#=SC.S# and C# in (select C# from SC where S#='001');
1三、把「SC」表中「葉平」老師教的課的成績都更改成此課程的平均成績;
update SC set score=(select avg(SC_2.score)
from SC SC_2
where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='葉平');
1四、查詢和「1002」號的同窗學習的課程徹底相同的其餘同窗學號和姓名;
select S# from SC where C# in (select C# from SC where S#='1002')
group by S# having count(*)=(select count(*) from SC where S#='1002');
1五、刪除學習「葉平」老師課的SC表記錄;
Delect SC
from course ,Teacher
where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='葉平';
1六、向SC表中插入一些記錄,這些記錄要求符合如下條件:沒有上過編號「003」課程的同窗學號、二、
號課的平均成績;
Insert SC select S#,'002',(Select avg(score)
from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');
1七、按平均成績從高到低顯示全部學生的「數據庫」、「企業管理」、「英語」三門的課程成績,按以下形式顯示: 學生ID,,數據庫,企業管理,英語,有效課程數,有效平均分
SELECT S# as 學生ID
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 數據庫
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企業管理
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英語
,COUNT(*) AS 有效課程數, AVG(t.score) AS 平均成績
FROM SC AS t
GROUP BY S#
ORDER BY avg(t.score)
1八、查詢各科成績最高和最低的分:以以下形式顯示:課程ID,最高分,最低分
SELECT L.C# As 課程ID,L.score AS 最高分,R.score AS 最低分
FROM SC L ,SC AS R
WHERE L.C# = R.C# and
L.score = (SELECT MAX(IL.score)
FROM SC AS IL,Student AS IM
WHERE L.C# = IL.C# and IM.S#=IL.S#
GROUP BY IL.C#)
AND
R.Score = (SELECT MIN(IR.score)
FROM SC AS IR
WHERE R.C# = IR.C#
GROUP BY IR.C#
);
1九、按各科平均成績從低到高和及格率的百分數從高到低順序
SELECT t.C# AS 課程號,max(course.Cname)AS 課程名,isnull(AVG(score),0) AS 平均成績
,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分數
FROM SC T,Course
where t.C#=course.C#
GROUP BY t.C#
ORDER BY 100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC
20、查詢以下課程平均成績和及格率的百分數(用"1行"顯示): 企業管理(001),馬克思(002),OO&UML (003),數據庫(004)
SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企業管理平均分
,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企業管理及格百分數
,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 馬克思平均分
,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 馬克思及格百分數
,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分
,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分數
,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 數據庫平均分
,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 數據庫及格百分數
FROM SC
2一、查詢不一樣老師所教不一樣課程平均分從高到低顯示
SELECT max(Z.T#) AS 教師ID,MAX(Z.Tname) AS 教師姓名,C.C# AS 課程ID,MAX(C.Cname) AS 課程名稱,AVG(Score) AS 平均成績
FROM SC AS T,Course AS C ,Teacher AS Z
where T.C#=C.C# and C.T#=Z.T#
GROUP BY C.C#
ORDER BY AVG(Score) DESC
2二、查詢以下課程成績第 3 名到第 6 名的學生成績單:企業管理(001),馬克思(002),UML (003),數據庫(004)
[學生ID],[學生姓名],企業管理,馬克思,UML,數據庫,平均成績
SELECT DISTINCT top 3
SC.S# As 學生學號,
Student.Sname AS 學生姓名 ,
T1.score AS 企業管理,
T2.score AS 馬克思,
T3.score AS UML,
T4.score AS 數據庫,
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 總分
FROM Student,SC LEFT JOIN SC AS T1
ON SC.S# = T1.S# AND T1.C# = '001'
LEFT JOIN SC AS T2
ON SC.S# = T2.S# AND T2.C# = '002'
LEFT JOIN SC AS T3
ON SC.S# = T3.S# AND T3.C# = '003'
LEFT JOIN SC AS T4
ON SC.S# = T4.S# AND T4.C# = '004'
WHERE student.S#=SC.S# and
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
NOT IN
(SELECT
DISTINCT
TOP 15 WITH TIES
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
FROM sc
LEFT JOIN sc AS T1
ON sc.S# = T1.S# AND T1.C# = 'k1'
LEFT JOIN sc AS T2
ON sc.S# = T2.S# AND T2.C# = 'k2'
LEFT JOIN sc AS T3
ON sc.S# = T3.S# AND T3.C# = 'k3'
LEFT JOIN sc AS T4
ON sc.S# = T4.S# AND T4.C# = 'k4'
ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);
2三、統計列印各科成績,各分數段人數:課程ID,課程名稱,[100-85],[85-70],[70-60],[ <60]
SELECT SC.C# as 課程ID, Cname as 課程名稱
,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85]
,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70]
,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60]
,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -]
FROM SC,Course
where SC.C#=Course.C#
GROUP BY SC.C#,Cname;
2四、查詢學平生均成績及其名次
SELECT 1+(SELECT COUNT( distinct 平均成績)
FROM (SELECT S#,AVG(score) AS 平均成績
FROM SC
GROUP BY S#
) AS T1
WHERE 平均成績 > T2.平均成績) as 名次,
S# as 學生學號,平均成績
FROM (SELECT S#,AVG(score) 平均成績
FROM SC
GROUP BY S#
) AS T2
ORDER BY 平均成績 desc;
2五、查詢各科成績前三名的記錄:(不考慮成績並列狀況)
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 3 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
2六、查詢每門課程被選修的學生數
select c#,count(S#) from sc group by C#;
2七、查詢出只選修了一門課程的所有學生的學號和姓名
select SC.S#,Student.Sname,count(C#) AS 選課數
from SC ,Student
where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;
2八、查詢男生、女生人數
Select count(Ssex) as 男生人數 from Student group by Ssex having Ssex='男';
Select count(Ssex) as 女生人數 from Student group by Ssex having Ssex='女';
2九、查詢姓「張」的學生名單
SELECT Sname FROM Student WHERE Sname like '張%';
30、查詢同名同性學生名單,並統計同名人數
select Sname,count(*) from Student group by Sname having count(*)>1;;
3一、1981年出生的學生名單(注:Student表中Sage列的類型是datetime)
select Sname, CONVERT(char (11),DATEPART(year,Sage)) as age
from student
where CONVERT(char(11),DATEPART(year,Sage))='1981';
3二、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列
Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;
3三、查詢平均成績大於85的全部學生的學號、姓名和平均成績
select Sname,SC.S# ,avg(score)
from Student,SC
where Student.S#=SC.S# group by SC.S#,Sname having avg(score)>85;
3四、查詢課程名稱爲「數據庫」,且分數低於60的學生姓名和分數
Select Sname,isnull(score,0)
from Student,SC,Course
where SC.S#=Student.S# and SC.C#=Course.C# and Course.Cname='數據庫'and score <60;
3五、查詢全部學生的選課狀況;
SELECT SC.S#,SC.C#,Sname,Cname
FROM SC,Student,Course
where SC.S#=Student.S# and SC.C#=Course.C# ;
3六、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;
SELECT distinct student.S#,student.Sname,SC.C#,SC.score
FROM student,Sc
WHERE SC.score>=70 AND SC.S#=student.S#;
3七、查詢不及格的課程,並按課程號從大到小排列
select c# from sc where scor e <60 order by C# ;
3八、查詢課程編號爲003且課程成績在80分以上的學生的學號和姓名;
select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003';
3九、求選了課程的學生人數
select count(*) from sc;
40、查詢選修「葉平」老師所授課程的學生中,成績最高的學生姓名及其成績
select Student.Sname,score
from Student,SC,Course C,Teacher
where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='葉平' and SC.score=(select max(score)from SC where C#=C.C# );
4一、查詢各個課程及相應的選修人數
select count(*) from sc group by C#;
4二、查詢不一樣課程成績相同的學生的學號、課程號、學生成績
select distinct A.S#,B.score from SC A ,SC B where A.Score=B.Score and A.C# <>B.C# ;
4三、查詢每門功成績最好的前兩名
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
4四、統計每門課程的學生選修人數(超過10人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,查詢結果按人數降序排列,若人數相同,按課程號升序排列
select C# as 課程號,count(*) as 人數
from sc
group by C#
order by count(*) desc,c#
4五、檢索至少選修兩門課程的學生學號
select S#
from sc
group by s#
having count(*) > = 2
4六、查詢所有學生都選修的課程的課程號和課程名
select C#,Cname
from Course
where C# in (select c# from sc group by c#)
4七、查詢沒學過「葉平」老師講授的任一門課程的學生姓名
select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='葉平');
4八、查詢兩門以上不及格課程的同窗的學號及其平均成績
select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#;
4九、檢索「004」課程分數小於60,按分數降序排列的同窗學號
select S# from SC where C#='004'and score <60 order by score desc;
50、刪除「002」同窗的「001」課程的成績
delete from Sc where S#='001'and C#='001';
必定要複習如何經過CreateTable、Alter Table來建立、修改表結構!
14. 假定在建BOOKS表時沒有定義主碼,寫出爲BOOKS表追加定義主碼的語句
--實現代碼:
ALTER TABLE BOOKS ADD PRIMARY KEY(BNO)
15.1 將NAME最大列寬增長到10個字符(假定原爲6個字符)
--實現代碼:
ALTER TABLE CARD ALTER COLUMN NAME varchar(10)
15.2 爲該表增長1列NAME(系名),可變長,最大20個字符
--實現代碼:
ALTER TABLE CARD ADD 系名 varchar(20)
鎖的問題:
public void Test(int i)
{
lock (this)
{
if (i > 10)
{
i--;
Test(i);
}
}
}
執行Test(10)是否會形成死鎖?
答:不會,由於多線程纔有鎖的問題,線程沒法本身鎖本身(單線程必然是有前後執行順序的,不必鎖)
問學網2011
3、Math.Round(11.5)、Math.Round(11.3)、Math.Round(-11.5)、Math.Round(-11.3)的值各是多少?
答案:Round 四捨五入:Math.Round(-11.5)=-12,由於是按照絕對值考慮。
擴展:Math.Ceiling(-11.6)=-11,由於負數的天花板也在上面。
Math.Floor(-11.5)=-12
4、short s=1;s=s+1;有錯嗎?short s=1;s+=1;有錯嗎?
答案:第一個有錯,由於1是int類型,int+short結果是int,沒法隱式轉換,改成s = (short)(s + 1);就能夠了。
第二個沒錯,通過反編譯發現編譯器自動優化成s = (short)(s + 1);
5、產生一個int數組,長度爲100,並向其中隨機插入1-100,而且不能重複。(要求使用兩種方法)
解答:Random類是一個僞隨機數算法,原理:
r(n)=(sed+r(n-1))%100;
class MyRand
{
private int seed;
private int prevNumber = 10;
public MyRand(int seed)
{
this.seed = seed;
}
public int Next()
{
int newRand = (seed + prevNumber) % 100;
prevNumber = newRand;
return newRand;
}
}
生成的隨機數是依賴於上一個的,因此叫「隨機數序列」。,肯定的種子產生肯定的隨機數序列。
爲了不每次生成的隨機數序列都同樣,因此通常採用當前系統運行的毫秒數Environment.TickCount作種子。
這就明白爲何
//for (int i = 0; i < 10; i++)
//{
// Random rand = new Random();
// Console.WriteLine(rand.Next(100));
//}
是錯的。
通過反編譯,Random類的無參構造函數最終也是調用有參的,傳遞的就是當前毫秒數
public Random() : this(Environment.TickCount)
這就驗證了
//for (int i = 0; i < 10; i++)
//{
// Random rand = new Random();
// Console.WriteLine(rand.Next(100));
//}
爲何同樣,或者一半同樣,是由於在同一毫秒內。
作法1:
List<int> list = new List<int>();
Random rand = new Random();
while (list.Count < 100)
{
int number = rand.Next(1, 101);//>=1,<101
if (!list.Contains(number))//若是list中已經含有這個數,則不插入
{
list.Add(number);
}
}
foreach (int i in list)
{
Console.WriteLine(i);
}
作法2:
先把1-100這100個數按順序放入數組arr,再重複100次下面的操做,生成兩個介於 >=0,<100 之間的隨機數m、n,顛倒arr[m]和arr[n]的數。
int[] arr = new int[100];
//把100個數順序放入
for (int i = 0; i < 100; i++)
{
arr[i] = i + 1;
}
Random rand = new Random();
for (int i = 0; i < 100; i++)
{
//隨機生成兩個位置
int m = rand.Next(0, 100);
int n = rand.Next(0, 100);
//顛倒兩個位置
int temp = arr[m];
arr[m] = arr[n];
arr[n] = temp;
}
2、JavaScript中聲明空數組。
[]
晨飛燕第一次
2、冒泡排序(背也要背下來,50%必考!)
for (int j = 0; j < nums.Length - 1; j++)
{
for (int i = 0; i < nums.Length - 1 -j; i++)
{
if (nums[i] > nums[i + 1])
{
int temp = nums[i];
nums[i] = nums[i + 1];
nums[i + 1] = temp;
}
}
}
若是隻是調用集合的Sort方法,是不知足人家要求的!必定要本身寫!
快速排序(!)
五、select * from t where id=(select max(id) from t)
更簡單的就是:select top 1 * from t order by id desc
六、題有問題,應該增長一個主鍵字段
create table T_Persons(id bigint identity(1,1),name nvarchar(20),age int)
insert into T_Persons(name,age) values('小明',20);
insert into T_Persons(name,age) values('小明',20);
insert into T_Persons(name,age) values('小黑',20);
insert into T_Persons(name,age) values('小明',20);
insert into T_Persons(name,age) values('小宏',20);
--取出name、age相同的id最小的數據
select min(id)
from T_Persons
group by name,age;--按照name和age分組
--把id等於最小值的取出來
select * from T_Persons where id in
(
select min(id)
from T_Persons
group by name,age--按照name和age分組
)
答案:
--把不等於最小id的刪掉
delete from T_Persons where id not in
(
select min(id)
from T_Persons
group by name,age--按照name和age分組
)
九、別瞎回答,要重點突出本身的和別人不同的地方。別犯之前同窗最後一關說本身父母管本身很嚴的事情。
你爲何來咱們公司?若是是知名公司,就說仰慕貴公司,(舉例,看到大家網站發展速度快,還據說過關於大家技術團隊、技術架構的介紹);若是是不知名公司,就說喜歡這個行業。描述本身針對這個職位的優點
四、2+5+"8"獲得的結果是什麼?
解答:從左向右運算,int+string是string。因此是"78"
"8"+2+5是"825",而"8"+(2+5)是「87」
五、
(1)
var x=1;
var y=0;
var z=0;
function add(n){n=n+1;return n;}
y=add(x);
function add(n){n=n+3;return n;}
z=add(x);
求y和z的值是多少?
參考:JavaScript引擎會先解析全部的命名函數,再去從上向下執行js代碼。因此第二個add覆蓋了第一個add的定義。所以結果是四、4
(2)傳智播客增長一問
var x=1;
var y=0;
var z=0;
var add = function(n){n=n+1;return n;}
y=add(x);
add =function(n){n=n+3;return n;}
z=add(x);
求y和z的值是多少?
參考:var add = function(n){n=n+1;return n;}是把一個變量名add指向匿名函數。執行的時候add指向哪一個函數,就執行哪一個函數。從上向下執行。結果是二、4。因此寫程序的時候最好用匿名函數。
命名函數的add就是函數的名字。而var add = function(n){n=n+1;return n;}則是建立一個匿名函數,而且把變量add指向它,這個函數仍是匿名函數,並不會由於有一個變量指向它他就不是匿名函數了。
有的公司題量很是大,根本作不完,實際上是在考察你哪方面最熟悉,那麼挑最會作的先作。