C#经典面试之算法

来源:互联网 发布:编程世界 编辑:程序博客网 时间:2024/05/24 06:52

1.  一列数的规则如下: 112358132134...... 求第30位数是多少, 用递归算法实现。

答:public class MainClass

{

public static void Main(){

Console.WriteLine(Foo(30));

}

public static int Foo(int i){

if (i <= 0)    return 0;

else if(i > 0 && i <= 2)        return 1;

else  return Foo(i -1) + Foo(i - 2);

}

}

2.  编程遍历页面上所有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 ;

}

}

3.  请编程实现一个冒泡排序算法?

答:int [] array = new int;

int temp = 0 ;

for (int i = 0 ; i < array.Length - 1 ; i++){

for (int j = i + 1 ; j < array.Length ; j++){

if (array[j] < array[i]){

temp = array[i] ;

array[i] = array[j] ;

array[j] = temp ;

}

}

}

4.  请编程实现一个选择排序算法?

int [] array = new int;

int iTemp = 0;

       int iValueTemp = 0;

       for (int i =0; i < array.Length - 1; i++)

       {

              iTemp = i;

              for (int j = i+1; j < array.Length; j++)

              {

                     if (array[iTemp] > array[j])

                     {

                            iTemp = j;

                     }

              }

 

              if (iTemp != i)

              {

                     iValueTemp = array[i];

                     pArr[i] = array[iTemp];

                     array[iTemp] = iValueTemp;

              }

           }

5.  求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m

答:int Num = this.TextBox1.Text.ToString() ;

int Sum = 0 ;

for (int i = 0 ; i < Num + 1 ; i++){

if((i%2) == 1) { Sum += i ; }

else { Sum = Sum - I ;}

}

System.Console.WriteLine(Sum.ToString());

System.Console.ReadLine() ;

6.  在下面的例子里

using System;

class A{

public A() {

PrintFields();

}

public virtual void PrintFields(){}

}

class B:A{

int x=1;

int y;

public B(){

y=-1;

}

public override void PrintFields(){

Console.WriteLine("x={0},y={1}",x,y);

}

当使用new B()创建B的实例时,产生什么输出?

答:X=1,Y=0;

7.  根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:

namespace test

{

public delegate void OnDBOperate();

public class UserControlBase : System.Windows.Forms.UserControl

{

public event OnDBOperate OnNew;

private void toolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e)

{

if(e.Button.Equals(BtnNew))

{

//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。

}

}

}

答:if( OnNew != null )

OnNew( this, e );

8.  分析以下代码,完成填空

string strTmp = "abcdefg某某某";

int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;

int j= strTmp.Length;

以上代码执行完后,i= j=

答:i=13,j=10

9.  SQLSERVER服务器中,给定表 table1 中有两个字段 IDLastUpdateDateID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号

答:Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)

select   top   ID   from   table1   order   by   LastUpdateData   desc

10. 写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。

答:解1: select top 10 * from A where id not in (select top 30 id from A)

2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)

11. 根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。

public void test(int i)

{

lock(this)

{

if (i>10)

{

i--;

test(i);

}

}

}

答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)

12. 给定以下XML文件,完成算法流程图。

< DriverC >请画出遍历所有文件名(FileName)的流程图(请使用递归算法)

答:void FindFile( Directory d )

{

FileOrFolders = d.GetFileOrFolders();

foreach( FileOrFolder fof in FileOrFolders )

{

if( fof is File )

You Found a file;

else if ( fof is Directory )

FindFile( fof );

}

}

private void CopyFolder(string argSourceFileName, string argDestFileName)

        {

            String[] Files;

            if (argDestFileName[argDestFileName.Length - 1] != System.IO.Path.DirectorySeparatorChar)

            {

                argDestFileName += System.IO.Path.DirectorySeparatorChar;

            }

            if (!System.IO.Directory.Exists(argDestFileName))

            {

                System.IO.Directory.CreateDirectory(argDestFileName);

            }

            Files = System.IO.Directory.GetFileSystemEntries(argSourceFileName);

            foreach (string Element in Files)

            {

                //   Sub   directories  

                if (System.IO.Directory.Exists(Element))

                {

                    CopyFolder(Element, argDestFileName + System.IO.Path.GetFileName(Element));

                }

                //   Files   in   directory  

                else

                {

                    System.IO.File.Copy(argSourceFileName, argDestFileName, true);

                }

            }

        }

13. 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。

方法1:

int[] intArr=new int[100];

ArrayList myList=new ArrayList();

Random rnd=new Random();

while(myList.Count<100)

{

int num=rnd.Next(1,101);

if(!myList.Contains(num))

myList.Add(num);

}

for(int i=0;i<100;i++)

intArr[i]=(int)myList[i];

方法2:

List L=new List();

Random random = new Random();

for (int i = 1; i <= 100; i++)

{

if (L.IndexOf(i) < 0)

{

L.Add(random.Next(1,100));

}

14. 下面这段代码输出什么?为什么?

int i=5;int j=5;

if (Object.ReferenceEquals(i,j))   Console.WriteLine("Equal");

else   Console.WriteLine("Not Equal");

答:不相等,因为比较的是对象

15. 下面的代码中有什么错误吗?_______

using System;

class A

{

public virtual void F(){ 软件开发网 www.mscto.com

Console.WriteLine("A.F");

}

}

abstract class B:A

{

public abstract override void F(); 答:abstract override 是不可以一起修饰.

} // new public abstract void F();

16. 下面这段代码有错误么?

switch (i){

case(): 答://case()条件不能为空

   CaseZero();break;

case 1:

   CaseOne();break;

case 2:

dufault; 答://wrong,格式不正确  default

CaseTwo();break;

}

17. .netC# or vb.net)中如何用户自定义消息,并在窗体中处理这些消息。

答:在form中重载DefWndProc函数来处理消息:

protected override void DefWndProc ( ref System.WinForms.Message m )

{

switch(m.msg)

{

case WM_Lbutton :

///stringMFC中的CStringFormat函数的使用方法有所不同

 string message = string.Format("收到消息!参数为:{0},{1}",m.wParam,m.lParam);

  MessageBox.Show(message);///显示一个消息框

  break;

case USER:

处理的代码

default:

  base.DefWndProc(ref m);///调用基类函数处理非自定义消息。

  break;

}}

18. .netC# or vb.net)中如何取消一个窗体的关闭。

答:private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)

{

e.Cancel=true;

}

19. .netC# or vb.net)中,Appplication.Exit 还是 Form.Close有什么不同?

答:一个是退出整个应用程序,一个是关闭其中一个form

20. C#中有一个double型的变量,比如10321.5,比如 122235401.21644,作为货币的值如何按各个不同国家的习惯来输出。比如美国用$10,321.50$122235401.22而在英国则为£10 321.50和£122 235 401.22

答:System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-US");

//System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-GB");为英 国 货币类型

decimal y = 9999999999999999999999999999m;

string str = String.Format(MyCulture,"My amount = {0:c}",y);

21. 对于这样的一个枚举类型:

enum Color:byte

{

Red,

Green,

Blue,

orange

}

答:string[] ss=Enum.GetNames(typeof(Color));

byte[] bb=Enum.GetValues(typeof(Color));

22. 分析以下代码。

public static void test(string ConnectString)

{

System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();

conn.ConnectionString = ConnectString;

try

{

conn.Open();          …….

}

catch(Exception Ex)

{          MessageBox.Show(Ex.ToString());       }

finally

{

if (!conn.State.Equals(ConnectionState.Closed))        conn.Close();

}

}

请问

1)以上代码可以正确使用连接池吗?

答:如果传入的connectionString是一模一样的话,可以正确使用连接池。不过一模一样的意思是,连字符的空格数,顺序完全一致。

2)以上代码所使用的异常处理方法,是否所有在test方法内的异常都可以被捕捉并显示出来?

答:只可以捕捉数据库连接中的异常吧. finally中,catch中,如果有别的可能引发异常的操作,也应该用try,catch。所以理论上并非所有异常都会被捕捉。)

23. 下面的例子中

using System;

class A

{

public static int X;

static A() { X=B.Y+1;}

}

class B

{

public static int Y=A.X+1;

static B(){}

static void Main(){

Console.WriteLine("X={0},Y={1}",A.X,B.Y);

}

}

产生的输出结果是什么?答:x=1,y=2

24. 用何把一个Array复制到Arraylist?

答:Foreach (object o in Array), ArrayList.Add (o)

25. 写出程序的输出结果

class Class1  {

      private string str = "Class1.str";

       private int i = 0;

       static void StringConvert(string str)  {

           str = "string being converted.";

       }

       static void StringConvert(Class1 c)  {

           c.str = "string being converted.";

       }

       static void Add(int i)  {

           i++;

       }

 

static void AddWithRef(ref int i)  {

           i++;

       }

       static void Main()  {

           int i1 = 10;

           int i2 = 20;

           string str = "str";

           Class1 c = new Class1();

           Add(i1);

           AddWithRef(ref i2);

           Add(c.i);

           StringConvert(str);        

               StringConvert(c);

               Console.WriteLine(i1);

           Console.WriteLine(i2);

           Console.WriteLine(c.i);

           Console.WriteLine(str);

           Console.WriteLine(c.str);

       }  

   }

结果:10       21     0     str     string being converted.

26. 写出程序的输出结果:

public abstract class A  

{

        public A()  

       {

            Console.WriteLine('A');

        }

        public virtual void Fun()  

       {

            Console.WriteLine("A.Fun()");

        }

}

public class B: A  

{

        public B()

       {

            Console.WriteLine('B');

        }

        public new void Fun()  

       {

            Console.WriteLine("B.Fun()");

        }

        public static void Main()  

       {

           A a = new B();

           a.Fun();

        }

}

A

    B

A.Fun()

27. 写出程序的输出结果:

public class A  

{

        public virtual void Fun1(int i)

       {

            Console.WriteLine(i);

        }

        public void Fun2(A a)  

       {

            a.Fun1(1);

            Fun1(5);

        }

}

public class B : A  

{

        public override void Fun1(int i)    

       {

 

    base.Fun1 (i + 1);

        }

        public static void Main()  

       {

            B b = new B();

            A a = new A();

            a.Fun2(b);

            b.Fun2(a);          

        }

}

 2

    5

    1

6

28.  程序设计:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)

要求:  1.要有联动性,老鼠和主人的行为是被动的。

2.考虑可扩展性,猫的叫声可能引起其他联动效应。

要点:1. 联动效果,运行代码只要执行Cat.Cryed()方法。2. 对老鼠和主人进行抽象

评分标准: <1>.构造出CatMouseMaster三个类,并能使程序运行(2)

            <2>MouseMaster中提取抽象(5分)

            <3>联动效应,只要执行Cat.Cryed()就可以使老鼠逃跑,主人惊醒。(3)

    public interface Observer

    {

        void Response();    //观察者的响应,如是老鼠见到猫的反映

    }

    public interface Subject

    {

        void AimAt(Observer obs);  //针对哪些观察者,这里指猫的要扑捉的对象---老鼠

    }

    public class Mouse : Observer

    {

        private string name;

        public Mouse(string name, Subject subj)

        {          

            this.name = name;

            subj.AimAt(this);

        }

        

        public void Response()

        {

            Console.WriteLine(name + " attempt to escape!");

        }

    }

    public class Master : Observer

    {  

        public Master(Subject subj)

        {          

            subj.AimAt(this);

        }

        

        public void Response()

        {

            Console.WriteLine("Host waken!");

        }  

    }

  

 

 public class Cat : Subject

    {

        private ArrayList observers;

        public Cat()

        {  

            this.observers = new ArrayList();

        }

        public void AimAt(Observer obs)

        {

            this.observers.Add(obs);

        }

        public void Cry()

        {

            Console.WriteLine("Cat cryed!");

            foreach (Observer obs in this.observers)

            {

                obs.Response();

            }

        }

    }

    class MainClass

    {      

        static void Main(string[] args)

        {

            Cat cat = new Cat();

            Mouse mouse1 = new Mouse("mouse1", cat);

            Mouse mouse2 = new Mouse("mouse2", cat);

            Master master = new Master(cat);

            cat.Cry();

        }

    }

//---------------------------------------------------------------------------------------------

设计方法二: 使用event -- delegate设计..

    public delegate void SubEventHandler();

    public abstract class Subject

    {

        public event SubEventHandler SubEvent;

        protected void FireAway()

        {

            if (this.SubEvent != null)

                this.SubEvent();

        }  

    }

    public class Cat : Subject

    {  

        public void Cry()

        {

            Console.WriteLine("cat cryed.");

            this.FireAway();

        }

    }

    public abstract class Observer

    {

        public Observer(Subject sub)

        {

            sub.SubEvent += new SubEventHandler(Response);

        }

        public abstract void Response();    

    }

    public class Mouse : Observer

    {

        private string name;

        public Mouse(string name, Subject sub) : base(sub)

        {  

            this.name = name;

        }

        public override void Response()

        {

            Console.WriteLine(name + " attempt to escape!");

        }

    }

    public class Master : Observer

    {

 

 public Master(Subject sub) : base(sub){}

        public override void Response()

        {

            Console.WriteLine("host waken");

        }

    }

    class Class1

    {

        static void Main(string[] args)

        {

            Cat cat = new Cat();

            Mouse mouse1 = new Mouse("mouse1", cat);

            Mouse mouse2 = new Mouse("mouse2", cat);

            Master master = new Master(cat);

            cat.Cry();

        }

}

29. .netC# or vb.net)如何启动另一个程序。Process

30. .netC# or vb.net)中如何获得当前窗体或控件的句柄,特别是控件本身的句柄(请列举)。

: this(C#) Me(vb.net).

31. .netC# or vb.net)中,Appplication.Exit 还是 Form.Close有什么不同?

:一个是退出整个应用程序,一个是关闭其中一个form

32. C#中有一个double型的变量,比如10321.5,比如122235401.21644,作为货币的值如何按各个不同国家的

习惯来输出。比如美国用$10,321.50$122235401.22而在英国则为£10 321.50和£122 235 401.22

答案:

System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-US");

//System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-GB");为英国货币类型

decimal y = 9999999999999999999999999999m;

string str = String.Format(MyCulture,"My amount = {0:c}",y); 

原创粉丝点击