使用字符串的方法:trim();去掉字符串两端空格split();切割string.join();连接复制代码 代码如下:class Program    {        static void Main(string[] args)        {            //原字符串            string str = "  hello      world,你  好 世界   !    ";            //去掉两端空格           str= str.Trim();            //以空格切割           string [] strArray= str.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries);            //以空格连接           string newStr= string.Join(" ", strArray);            Console.WriteLine(newStr);            Console.ReadKey();        }    }使用正则的方法:复制代码 代码如下:class Program    {        static void Main(string[] args)        {            //原字符串            string str = "  hello      world,你  好 世界   !    ";            string s = Regex.Replace(str, @"\s+",

1. 概述  动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。  原理:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。2. 模式中的角色  2.1 抽象构建(Component):定义一个抽象接口,用以给这些对象动态地添加职责。  2.2 具体构建(ConcreteComponent):定义一个具体的对象,也可以给这个对象添加一些职责。  2.3 装饰类(Decorator): 装饰抽象类,继承了Component,从外类来扩展Component类的功能。  2.4 具体装饰者(ConcretorDecorator):负责给构建对象添加职责。3. 模式解读  3.1 装饰模式的一般化类图  3.2 装饰模式的一般化代码 /// <summary> /// 定义一个对象接口,可以给这些对象动态地添加职责 /// </summary> public abstract class Component { public abstract void Opration(); } /// <summary> /// 具体对象 /// </summary> public class ConcreteComponent:Component { public override void Opration() { // 具体对象的操作 } } /// <summary> /// 抽象的装饰类,它不能初始化对象。 /// </summary> public abstract class Decorator:Component { protected Component component; /// <summary> /// 设置Component /// </summary> /// <param name="component"></param> public void SetComponent(Component component) { this.component = component; } /// <summary> /// 重写Operation,实际执行的是Component的Operation。 /// </summary> public override void Opration() { if (component != null) { component.Opration(); } } } public class ConcreteDecoratorA : Decorator { private void SpecialOpration() { // 本类特有的功能 } public override void Opration() { //首先运行原Component的Operation(),在执行本类的功能,相当于对原Component进行了装饰 base.Opration(); this.SpecialOpration(); } } public class ConcreteDecoratorB : Decorator { private void SpecialOprationA() { // 本类特有的功能 A } private void SpecialOprationB() { // 本类特有的功能 B } public override void Opration() { //首先运行原Component的Operation(),在执行本类的功能,相当于对原Component进行了装饰 base.Opration(); this.SpecialOprationA(); this.SpecialOprationB(); } }4. 模式总结  4.1 优点    4.1.1 每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。它是由Decorator的SetComponent方法来实现的,因而它们的职责是单一的。    4.1.2 类的核心职责与动态添加的职责是分离的。如果再向主类中添加新的功能,一是违反了开放封闭原则,二是增加了主类的复杂度。    4.1.3 比静态继承更灵活 与对象的静态继承相比,Decorator模式提供了更加灵活的向对象添加职责的方式,可以使用添加和分离的方法,用装饰在运行时刻增加和删除职责.  4.2 缺点    4.2.1 产生许多小对象,采用Decorator模式进行系统设计往往会产生许多看上去类似的小对象,这些对象仅仅在他们相互连接的方式上有所不同。  4.3 适用场景    4.3.1 当需要为已有功能动态地添加更多功能时。    4.3.2 类的核心功能无需改变,只是需要添加新的功能时。5. 应用实例:装备大兵!无任何装备时(核心功能)可以用拳脚搏击;装备了步枪,可以正常射击;装备了重机枪,可以扫射;装备了火箭筒,可以防空。  5.1 类图设计  5.2 代码实现 /// <summary> /// 装备类,相当于Component /// </summary> public abstract class Equipment { public abstract void Attack(); } /// <summary> /// 士兵类,继承自Equipment /// </summary> public class Soldier : Equipment { public Soldier() { // 构造函数 } /// <summary> /// 没有任何武器装备下的核心功能 /// </summary> public override void Attack() { Console.WriteLine("用拳脚攻击!"); } } public abstract class EquipDecorator : Equipment { protected Equipment equipment; /// <summary> /// 增加装备,使用该方法来动态地给士兵增加装备 /// </summary> /// <param name="equipment"></param> public void SetComponent(Equipment equipment) { this.equipment = equipment; } /// <summary> /// 攻击 /// </summary> public override void Attack() { //如果有装备,就用装备进行攻击 if (equipment != null) { equipment.Attack(); } } } /// <summary> /// 步枪 /// </summary> public class RifleEquipment : EquipDecorator { public override void Attack() { base.Attack(); Console.WriteLine("步枪射击,啪!"); } } /// <summary> /// 机枪 /// </summary> public class MachineGunEquipment : EquipDecorator { public override void Attack() { base.Attack(); Console.WriteLine("机枪扫射,突突突!"); } } /// <summary> /// 火箭筒 /// </summary> public class RocketGunEquipment : EquipDecorator { public override void Attack() { base.Attack(); Console.WriteLine("火箭炮射击,唰......!"); } }  5.3 客户端调用 class Program { static void Main(string[] args) { // 定义新兵 Soldier soldier = new Soldier(); // 三种装备 RifleEquipment rifle = new RifleEquipment(); MachineGunEquipment machineGun = new MachineGunEquipment(); RocketGunEquipment rocketGun = new RocketGunEquipment(); // 将三种装备全部交给新兵 rifle.SetComponent(soldier); machineGun.SetComponent(rifle); rocketGun.SetComponent(machineGun); // 攻击,除了拳脚功夫外,新兵还可以使用步枪,机枪,火箭炮.最终执行的是rocketGun.Attack(). rocketGun.Attack(); Console.Read(); } }  5.4 运行结果  用拳脚攻击!  步枪射击,啪!  机枪扫射,突突突!  火箭炮射击,唰......!以上就是本文的全部内容,希望能给大家一个参考,也希望大家多多支持脚本之家。

1. 理解“Windows 窗体应用程序”项目中Program.cs文件中的main方法与传统C++Console控制台程序中的main方法的区别。从程序运行层次上讲,两者无区别,都是程序的入口点,属于进程中的第一个线程。前者隐藏了UI应用程序必需的消息循环,后者没有。 2. 每个Windows桌面应用程序都必须包含至少一个UI线程,所谓UI线程,就是可以响应Windows消息的线程。通常情况下,除非特别需要,一个Windows桌面应用程序只包含一个UI线程。 3. UI线程本质上跟普通线程一样,一般为程序的入口线程,比如Program.cs文件中的main方法,就是UI线程,而Application.Run()方法中封装了消息循环。如果没有Application.Run()方法,那么它跟其他线程一模一样。之所以叫做UI线程,是因为它之中包含一个类似 复制代码 代码如下: While(GetMessage(…))//取Windows消息 { //处理windows消息,调用开发者编写的回调方法,如事件处理程序 等。 } 的循环。 4. 有关Windows消息机制等内容,请上网Google或者百度。 5. UI线程主要负责界面的实时更新,所以开发人员编写代码时,请遵守以下规律: 1) 不要在控件的事件处理程序中编写(或者调用)耗时的代码块; 2) 不要在控件的事件处理程序中调用阻塞方法; 6. 明白程序设计中的 委托、事件、事件处理程序的区别 复制代码 代码如下: 1) Publicdelegate void KeyPressEventHandler(KeyPressEventArgse); 2) Public eventKeyPressEventHandler KeyPress; 3) Public void Textbox1_KeyPress(objectsender,KeyPressEventArgs e) { //…. } 其中: 1为委托 2为事件 3为事件处理程序 7. 所有的事件处理程序都是在UI线程中调用,又因为UI线程负责更新界面,所以UI线程始终必须保持顺畅(表现为3中的while循环体不能耗时太长),即不能出现长时间执 行一个方法不返回的情况。所以,请遵守5中的规律。8. 同一个方法,可以运行在多个线程之中,方法跟线程没有一对一的原则 复制代码 代码如下:Private void thread_pro() // { } 1) privatebutton1_click(object sender,EventArgs e) { thread_pro(); //thread_pro运行在UI线程中 } 2)private button1_click(object sender,EventArgs e) { Thread t = new Thread(newThreadStart(thread_pro)); Thread t1 = new Thread(new ThreadStart(thread_pro)); Thread t2 = newThread(new ThreadStart(thread_pro)); t.start(); //thread_pro运行在t线程中 t1.start(); //thread_pro运行在t1线程中 t.2.start(); //thread_pro运行在t2线程中 } 3) 还可以通过Control.Invoke() 或者BenginInvoke方法将方法投递到创建该控件的线程中执行。 以上所有情况,请注意线程共享数据。 9. 多线程编程中,请注意“线程安全”问题,对于一些具备“非原子”操作的对象,必须采取措施避免发生错误。 UI控件(Button、datagridview等等)、集合(List、ArrayList)等属于此类对象,控件任何时间都不能多线程访问。 10. 坚决杜绝跨线程访问UI控件,原因见9。跨线程访问控件的方法见8中的3)。 11. 除了.Net Winform中的事件处理程序是在UI线程中调用以外,其它的回调方法几乎所有都不会在UI线程中执行,所以,开发人员在编写回调方法时,请遵守第9,10两大规律。 12. 明白什么叫回调方法。回调方法一般由开发者编写,但不由开发者调用,由系统(或者说框架)调用。在Windows桌面应用程序开发过程中,控件的事件处理程序都属于回调方法,回调方法一般用在“观察者”设计模式中,当事件的激发者激发一个事件时,它就会调用回调方法。控件的所有事件都属于此类。 另外一种常见为,异步执行某个操作,譬如,socket.BeginAccept()中的AsyncCallBack类型参数。 在框架横行的时代,一般开发者编写的代码都属于回调代码。因为程序的主要结构都由先辈们在框架中集成好了。开发者们只需要像填空一样完善空缺的部分。 13. 阻塞方法指,由于方法体内包含耗时较长的操作,所以方法不能及时返回。 所谓“及时”与“非及时”没有绝对界限,示例如下: 复制代码 代码如下: int func1() //及时返回 { Int index = 0; For(int i=0;i<100;i++) { Index ++; } Return index; } Int func2() //非及时返回 { Int index = 0; For(int i=0;i<1000;i++) { For(int j=0;j<1000;++j) { Index ++; } } Return index; } 上述func1相对而言,属于非阻塞方法,func2属于阻塞方法。 14. Windows窗体应用程序不会直接跟键盘、鼠标等硬件设备交互,它只与Windows消息有直接交互。虽然表面上鼠标键盘等硬件设备是操作在窗体之上的,但实质上,你 编写的桌面应用程序是不会理解这些硬件设备的一举一动。他们是通过操作系统(驱动程序)进行桥接的,操作系统先将硬件设备的一举一动翻译成windows消息(一种数据结构,程序可以理解),然后供程序理解,作出相应的反应。 15. 所谓“阻塞调用线程”,是指在某一个线程中调用了阻塞方法,从而使该线程不能及时执行以后的代码。 复制代码 代码如下: Void func() { Int index=0; For(int i=0;i<10000;++i) { For(int j=0;j<10000;++j) { I ndex++; } } } Thread t = newThread(new ThreadStart(func)); t.Start(); //线程t中调用了阻塞方法func,因此线程t会被阻塞 在介绍func方法时,可以这样描述:该方法会阻塞调用线程。 16. 同一个方法可以被多个线程调用,既可被UI线程调用,也可被非UI线程调用,那么在方法体内怎么编写访问UI控件(UI元素)的代码呢?(跨线程访问UI控件会引发异常) 复制代码 代码如下: Void func() { Textbox1.Text=”测试”; PictureBox1.Image = Image.FromFile(“a.jpg”); } 1)以上func方法可能运行在UI线程中,如下: 复制代码 代码如下: Private voidbutton1_Click(object sender,EventArgs e) { func(); //调用func方法 } 2)有如下,func方法可能运行在其他非UI线程中 复制代码 代码如下: Private void button1_Click(object sender,EventArgs e) { Thread t = new Thread(newThreadStart(func)); t.Start(); //func访问运行在t线程中 } 在2)中,可能引发异常。 以上问题的解决方案为: 修改func代码为: 复制代码 代码如下: Func() { If(this.InvokeRequired) { This.BeginInvoke((Action)delegate(){func()}); } Else { Textbox1.Text=”测试”; PictureBox1.Image = Image.FromFile(“a.jpg”); } } 有关BeginInvoke或者Invoke方法的使用,请上网Google或者百度。 17. 有关“跨线程访问UI控件可能引发异常”的原因,跟多线程访问集合可能出现错误的原因基本相似。下面列举一段代码说明情况 复制代码 代码如下: ClassMyControl { Object root; Public Draw() { GetRoot(root); // 一系列操作… ReleaseRoot(root); } Public OtherDraw() { GetRoot(root); // 一系列操作 … ReleaseRoot(root); } } 其中root变量同时只能被占用一次,GetRoot()获取root的访问权,如果root已经被占用,则抛出异常。ReleaseRoot()释放root占用。当在一个线程中(比如UI线程中)访问MyControl类对象A,调用A.Draw()方法,执行到GetRoot(root)方法后,该线程失去控制权,暂停运行一下的代码,即此时root已被占用。而另一线程中如果也要访问同一对象A的Draw()方法,那么就会引发异常。 18.在.Net Winform应用程序中,程序与用户的交互主要包含两个方面,一是用户用鼠标、键盘灯硬件设备进行操作,程序响应操作,然后进行反馈(比如更新界面、刷新数据等),二是不需要用户用鼠标等硬件设备进行操作,程序自己自动进行反馈(比如QQ弹出新闻窗体、360弹窗等)。 第一种情况是我们所熟知的,比如用户用鼠标点击按钮(button1),程序则弹出一个MessageBox,我们在程序中是这样子写的:事件处理程序如下 复制代码 代码如下:Private voidbutton1_Click(object sender,EventArgs e) { MessageBox.Show(“弹出对话框,或者其他操作”); } 再来理一下这个过程,首先用户拿起鼠标点击button1,操作系统(鼠标驱动)会捕获这个事件,经过分析,操作系统得知用户点击的是哪个窗体(按钮)、点击的位置(坐标),点击类型(左键还是右键或者其他),以及其他信息,之后,将这些信息封装成一个类型(即windows消息)发送给创建该窗体(控件)的线程中的消息队列,之后,操作系统(鼠标驱动)就不在负责了。接着,UI线程从线程消息队列中获取该消息(注意:这个过程是一直存在的),分析消息,调用开发人员编写的一些回调方法,如button1_Click()方法,从而到达相应鼠标键盘操作的目的。从上面分析过程来看,再一次说明,程序是不会直接跟鼠标等硬件设备交互的,与它直接交互的只有Windows消息,而这个过程需要Windows操作系统起着重要作用。 第二种情况一般用在多线程编程中,当程序有耗时操作、或者需要一直监听等情况的时候,是不能放在UI线程之中的,这时候就需要另外开辟线程,在另外的线程中处理。这种情况中,另外开辟的线程有时候需要反馈跟用户一些信息,即更新UI界面或者弹出一个窗体等,这就涉及到跨线程访问UI元素的问题了,详见5和19.以上代码部分均为现写的,可能出现拼写错误,包涵! 另外,请配合笔记(二)中的“DOT NETWinform应用程序运行结构图”阅读。

方法一:复制代码 代码如下:using System.Text;using System.Net;private string getHtml(string url){WebClient myWebClient = new WebClient();byte[] myDataBuffer = myWebClient.DownloadData (url);return Encoding.Default.GetString(myDataBuffer);}方法二:复制代码 代码如下:public string getHttp(string HttpUrl,string RefererUrl){string html = "";try{MSXML2.XMLHTTP Http = new MSXML2.XMLHTTPClass();xmlhttp.open("GET", Url, false, null, null);Http.open("GET",HttpUrl,false,null,null);Http.setRequestHeader("Referer",RefererUrl);//Http.setRequestHeader("Referer",RefererUrl);Http.setRequestHeader("Content-Type", "text/html;charset=gb2312");Http.send("");html = Encoding.Default.GetString((byte[])Http.responseBody);Http = null;}catch{}return html;}public bool getweb(string strURL,out string buf)  {   buf="";   try   {    //Uri url=new Uri(strURL,false);    HttpWebRequest request;    request = (HttpWebRequest)WebRequest.Create(strURL);    request.Method="POST"; //Post请求方式    request.ContentType="text/html;charset=gb2312"; //内容类型    string paraUrlCoded = System.Web.HttpUtility.UrlEncode(""); //参数经过URL编码    byte[] payload;    payload = System.Text.Encoding.GetEncoding("GB2312").GetBytes(paraUrlCoded); //将URL编码后的字符串转化为字节    request.ContentLength = payload.Length; //设置请求的ContentLength    Stream writer = request.GetRequestStream(); //获得请求流    writer.Write(payload,0,payload.Length); //将请求参数写入流    writer.Close(); //关闭请求流    HttpWebResponse response;    response = (HttpWebResponse)request.GetResponse(); //获得响应流    Stream s;    s = response.GetResponseStream();    StreamReader objReader = new StreamReader(s,System.Text.Encoding.GetEncoding("GB2312"));    string HTML = "";    string sLine ="";    int i = 0;    while (sLine!=null)    {     i++;     sLine = objReader.ReadLine();     if (sLine!=null)      HTML += sLine;    }    //HTML = HTML.Replace("<","<");    //HTML = HTML.Replace(">",">");    buf=HTML;    return true;   }   catch (Exception x)   {       buf=x.Message.ToString();    return false;       }  }带Cookie:复制代码 代码如下:CookieContainer cc = new CookieContainer();public bool getweb(string strURL,out string buf)  {   buf="";   try   {    HttpWebRequest request;    request = (HttpWebRequest)WebRequest.Create(strURL);    request.Method="POST"; //Post请求方式    request.ContentType="text/html;charset=gb2312"; //内容类型    string paraUrlCoded = System.Web.HttpUtility.UrlEncode(""); //参数经过URL编码    byte[] payload;    payload = System.Text.Encoding.GetEncoding("GB2312").GetBytes(paraUrlCoded); //将URL编码后的字符串转化为字节    request.ContentLength = payload.Length; //设置请求的ContentLength    Stream writer = request.GetRequestStream(); //获得请求流    writer.Write(payload,0,payload.Length); //将请求参数写入流    writer.Close(); //关闭请求流    HttpWebResponse response;    response = (HttpWebResponse)request.GetResponse(); //获得响应流    Stream s;    s = response.GetResponseStream();    StreamReader objReader = new StreamReader(s,System.Text.Encoding.GetEncoding("GB2312"));    string HTML = "";    string sLine ="";    int i = 0;    while (sLine!=null)    {     i++;     sLine = objReader.ReadLine();     if (sLine!=null)      HTML += sLine;    }     buf=HTML;    return true;   }   catch (Exception x)   {       buf=x.Message.ToString();    return false;       }  }  public bool getweb(string strURL,out string buf,string postData)  {   buf="";   try   {       ASCIIEncoding encoding = new ASCIIEncoding();    byte[] data = encoding.GetBytes(postData);    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL);    request.Method = "POST";    request.ContentType = "application/x-www-form-urlencoded";    request.ContentLength = data.Length;    Stream newStream = request.GetRequestStream();    newStream.Write(data, 0, data.Length);    newStream.Close();    request.CookieContainer = cc;    HttpWebResponse response = (HttpWebResponse)request.GetResponse();    cc.Add(response.Cookies);    Stream stream = response.GetResponseStream();    string sHtml = new StreamReader(stream, System.Text.Encoding.Default).ReadToEnd();    buf=sHtml;    return true;   }   catch (Exception x)   {       buf=x.Message.ToString();    return false;       }  }private   string   getWebresourceFile1(string   url)    {WebClient   myWebClient   =   new   WebClient();    byte[]   myDataBuffer   =   myWebClient.DownloadData(url);string   SourceCode   =   Encoding.Default.GetString(myDataBuffer);saveSourceCode(SourceCode);                  return   SourceCode;      }方法2复制代码 代码如下:private   string   getWebresourceFile2(string   url)    {HttpWebRequest   request=(HttpWebRequest)WebRequest.Create(url);  HttpWebResponse   response=(HttpWebResponse)request.GetResponse();                    request.Method   =   "GET ";        Stream   receiveStream=response.GetResponseStream();StreamReader   readStream=new   StreamReader(receiveStream,Encoding.Default);string   SourceCode=readStream.ReadToEnd();    saveSourceCode(SourceCode);response.Close();      readStream.Close();return   SourceCode;      }方法3复制代码 代码如下:private   string   getWebresourceFile3(string   url)      {WebClient   wc   =   new   WebClient();wc.Credentials   =   CredentialCache.DefaultCredentials;Byte[]   pageData   =   wc.DownloadData(url);string   SourceCode   =   Encoding.Default.GetString(pageData);saveSourceCode(SourceCode);wc.Dispose();  return   SourceCode;      }方法4复制代码 代码如下:private   string   getWebresourceFile4(string   url)    {WebClient   wc   =   new   WebClient();wc.Credentials   =   CredentialCache.DefaultCredentials;Stream   resStream   =   wc.OpenRead(url);StreamReader   sr   =   new   StreamReader(resStream,System.Text.Encoding.Default);string   SourceCode   =   sr.ReadToEnd();saveSourceCode(SourceCode);resStream.Close();wc.Dispose();  return   SourceCode;      }方法5复制代码 代码如下:private   string   getWebresourceFile5(string   url)      {WebRequest   request   =   WebRequest.Create(url);WebResponse   response   =   request.GetResponse();Stream   resStream   =   response.GetResponseStream();  StreamReader   sr   =   new   StreamReader(resStream,

本文实例讲述了C语言排序算法之冒泡排序实现方法。分享给大家供大家参考,具体如下:冒泡排序和改进的冒泡排序/*-------------------------------------------------------------------------------------------Bubble_sort.h冒泡排序: 时间复杂度为O(N^2)改进的冒泡排序: 时间复杂度仍为O(N^2) 一般的冒泡排序方法有可能会在已经排好序的情况下继续比较,改进的冒泡排序 设置了一个哨兵flag,如果一次for循环没有进行交换,则元素已经排好序,由哨兵控制退出循环。-------------------------------------------------------------------------------------------*/#ifndef BUBBLE_SORT_H#define BUBBLE_SORT_H#include "typedef.h"#include "swap.h"//冒泡排序void Bubble_sort(T *a, int n){ for(int i=n-1; i != 0; --i) for(int j=0; j != i; ++j) if(a[j+1] < a[j]) swap(a[j+1],a[j]);}//改进的冒泡排序void Improved_Bubble_sort(T *a, int n){ for(int i=n-1; i != 0; --i) { bool flag = true; for(int j=0; j != i; ++j) //这一趟遍历如果没有交换,则已完成排序 if(a[j+1] < a[j]) { swap(a[j+1],a[j]); flag = false; } if(flag == true) break; }}#endif希望本文所述对大家C语言程序设计有所帮助。

分类:36salon手机版

时间:2016-04-05 03:04:53