我又回来了

。。。

Posted in 默认分类 | Leave a comment

实现了商品的历史浏览记录(2)

京东商城的:

e58e86e58fb2e6b58fe8a788e8aeb0e5bd95

当当的:

e58e86e58fb2e6b58fe8a788

 

 

 

 

 

 

我的:(界面模的京东,功能模的当当)
好像还得修改下文字与边框的距离,这里靠的太近了
e58e86e58fb2e6b58fe8a7881
分析:
  1.     页面上显示用户在前面浏览过的商品信息,最多显示10条,多了浪费
  2.  若用户再次点击【最近浏览商品】里的商品话,该商品将排在最前面(当当有这个功能,京东无)
思路:
  1. 要实现这一商品历史浏览功能,可以依靠cookie来完成,同时结合session,将浏览过的商品ID写入到Cookie中,需要时,拆分字符串成商品ID,调用数据库,显示相应信息。
  2. 实现上述第2个功能的话,用C#只要一条语句搞定,替换!比如取到cookie中的值为 9&8&7&3,当再次点击ID= 7 的商品时,可以使cookie值变成 7&9&8&3,以此更新排序。cookieValue = cookieValue.Replace(prId + "&", "");//若已存在该ID,剔除;保证了prId的惟一性!
  3. 原本我是把字符串的拆分的代码放到了UI层,然后每次传一个商品ID到DAL层,但这样一来,Repeater就得绑定好几个DataTable才可以完成显示。所以这样行不通,应该将字符串拆分的任务放在DAL层来处理。
实现:
   UI层:(对cookie写入新商品的ID,放在商品详情页,相关代码在(1)中)
protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
           //注:CookieManage.getCookie是我自己写的cookie类
            cookieValue = CookieManage.getCookie("HistoryVisit");//获取cookie值
            Response .Write (cookieValue );
            if (cookieValue != null && cookieValue != "")
            {
                //存在对应的cookie,读取显示
                ////拆串----------------------------------------------
                //string[] temp = cookieValue.Split(new char[] { '&' });
                //string[] prId = new string[10];
                ////最多返回10个子串
                //for (int i = 0; i < temp.Length & i < 10; i++)
                //{
                //    prId[i] = temp[i];
                //    Response .Write ( prId[i]);
                //}
                //绑定----------------------------------------------
                    rptHistory.DataSource = new ProductDAO ().GetProductShort (cookieValue );
                rptHistory.DataBind();
            }
            else    //不存在,新建Cookie项
            {
                CookieManage.setCookie("HistoryVisit", "");
            }
        }
    }
   
DAL层:
        #region 获取商品简要信息,主要用于显示历史浏览商品
        /// <summary>
        /// 获取商品简要信息
        /// </summary>
        /// <param name="productId">Cookie值</param>
        /// <returns></returns>
        public DataTable GetProductShort(string cookieValue)
        {
            //拆串
            string []prId = cookieValue .Split (new char []{'&'});
            int count = prId.Length;
            if (count > 10)//最多只显示10条
            {
                count = 10;
            }
            SqlParameter[] param = new SqlParameter[count];
            for (int i = 0; i < count ; i++)
            {
                string paramName = "@P" + (i + 1).ToString();
                param[i] = new SqlParameter(paramName, prId[i]);
            }
            string procName = "proc_ProductSelect_Short";
            DataTable dt = help.SqlExecuteQuery(CommandType.StoredProcedure, procName, param);
            return dt;
        }
        #endregion
数据层:
  -------------------------------------------------------------------------------  
  --   项目名称:NSMS(网络购物管理系统)  
  --   过程名称: proc_ProductSelect_Short 
  --   功能描述:商品简要信息
  --   创建时间:2009-04-05 23:12:30
  --   修改时间:2009-04-06 12:33:01
  --根据cookie中的商品ID,取出数据;主要用来显示历史浏览的商品
  --   作者姓名:chenyihao 
  -------------------------------------------------------------------------------  
   
CREATE PROCEDURE  proc_ProductSelect_Short
 -- Add the parameters for the stored procedure here
 @P1 int = null,
 @P2 int = null,
 @P3 int = null,
 @P4 int = null,
 @P5 int = null,
 @P6 int = null,
 @P7 int = null, 
 @P8 int = null,
 @P9 int = null,
 @P10 int = null
AS
BEGIN
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;
     -- Insert statements for procedure here
 select PrId,PrName,PrPic,SalePrice
 from Product
 where PrId = @P1 OR PrId = @P2 OR PrId = @P3 OR PrId = @P4 OR
  PrId = @P5 OR PrId = @P6 OR PrId = @P7 OR PrId = @P8 OR
  PrId = @P9 OR PrId = @P10
END
GO
Posted in 学习笔记 | Tagged , , | 2 Comments

ASP.NET-实现商品的历史浏览记录(1)

过程是艰难的,结果是美好的。
 
经过了不懈地努力,我终于从牛角尖里爬了出来!!!!!
 
原本我想着如何在写入cookie中的值是如同下面形式的:
先来看下其它网站写入的Cookie
 
当当网的cookie:
cookie1
京东的cookie:
cookie
我期望得到的结果如下:
HistoryVisit
9&7&6&4&1
localhost/....
以‘&’连接每个商品ID,但发现每次重新写入新的都会覆盖原先的。没办法,只能不停的在网上找解决方法。
最终找到了可以使用
HttpCookie cookie = new HttpCookie("HistoryVisit");
            cookie.Expires = DateTime.Now.AddMinutes(30);//有效期为30分钟
            for (int i = 0; i < 5; i++)
            {
                //cookie.Values["P"+i.ToString ()] = i.ToString ();//将会输出P0=0&P1=1&P2=2&P3=3&P4=4
                //cookie.Values.Add("p" , i.ToString());//将会输出P=0&P=1&P=2&P=3&P=4
                cookie.Values.Add(null, i.ToString());//正是我想要的!!!!!!!第一个参数可以为null,将输出 0&1&2&3&4
                //Response.Cookies.Add(cookie);
            }
            Response.Cookies.Add(cookie);
 
但这只能用在一个循环了,否则就不行。
 
结果瞎搞了好久时间,后来在吃饭的时候,终于想起来可以先将Cookie值取出来,然后将新加入的Id拼接到原来的cookie值前,最终写入!
代码如下:
 
//------------------------------------------
        HttpContext context = HttpContext.Current;
        cookie = Request.Cookies["HistoryVisit"];
        //获取Cookie中原有的值cookieValue
        string cookieValue = cookie.Value;
        cookieValue = cookieValue.Replace(prId + "&", "");//若已存在该ID,剔除;保证了prId的惟一性!
        cookieValue = prId + "&" + cookieValue;
        //-------------重新写入cookie
        cookie = new HttpCookie("HistoryVisit", cookieValue );
        //设置cookie的有效期
        cookie.Expires = DateTime .Now .AddDays (30);
        //将cookie设置到客户端
        context.Response.Cookies.Add(cookie);
        //----------------------------------------
        cookie = Request.Cookies["HistoryVisit"];
        Response.Write("修改后的Cookie:" + cookie.Value);
 
Posted in 学习笔记 | Tagged , , | 2 Comments

完成了 迷你购物车 和 购物车 功能

原本界面准备一直是模仿联想商城的,后来感觉联想商城的布局不够大气。
后来思量再三,准备用整体的蓝色来模仿京东商城,现在看来感觉还不错。
 
先来看看京东商城的:
minicart
最终效果图,感觉我的比它好吧!^_^,各个栏目标明的都比较清楚:
2009-04-04_120909
思路:
分析了下京东商城迷你购物车,主要功能如下:
  1. 【最新加入的商品】有图片显示;
  2. 【您购物车中的其它物品】商品按时间顺序先后排序,且不包含最新加入的商品;
  3. 再点击购买其它商品后,【最新加入的商品】显示刚加入的商品,而原先的移动到【其它物品中】
  4. 当删除购物车中的最新加入的商品后,【最新加入的商品】无商品再显示
实现方法:
  1. 【最新加入的商品】,由cookie中取出商品ID,然后显示。所以在点击购买商品时就要将该商品的ID写入cookie中。
  2. 由于【其它商品】不显示最新加入的商品,所以只取数据库中对应CartId的前N-1条,即最新加入的不取出
SQL语句:(ASP。NET代码略)
1.================================2009-04-04 11:25:32
 
-------------------------------------------------------------------------------  
  --   项目名称:NSMS(网络购物管理系统)  
  --   过程名称:proc_CartSelect  
  --   功能描述:取出购物车中的商品,(为了实现我要的功能,这里有两种情况
 --1.不选取最后一条记录,即最新加入的,为迷你购物车提供数据
 --2.全选,为完整的购物车提供数据
  --   创建时间:2009-03-31 20:53:54
  --   修改时间:2009-04-02 21:53:30(当购物车中只有一条记录时,mini购物车也会一条有记录?)
  --   作者姓名:chenyihao 
  -------------------------------------------------------------------------------  
ALTER PROCEDURE proc_CartSelect
 @CartId char(36),
 @Flag varchar( 8)
AS
 IF @Flag = 'MiniCart'
 BEGIN
  declare @count int
  select  @count=count(*)-1 from Cart where CartId = @CartId
  if @count = 0 goto goon
  if @count>0 SET rowcount @count --好方法
 END
 --取出购物车ID,商品ID名称价格,购买数量,以及小计
 SELECT c.CartId,c.PrId,p.PrName,p.SalePrice,c.Quantity,p.SalePrice * c.Quantity  AS Subtotal
 from  Cart as c INNER JOIN Product as p
 ON c.PrId = p.PrId 
 where c.CartId = @CartId
 Order By AddTime
 
 goon: return
GO
------------------------
2.通过下面这条SQL,可以弥补京东商城迷你购物车的缺陷,当cookie中无值时,还能显示最近一次购买的商品
 -------------------------------------------------------------------------------  
  --   项目名称:NSMS(网络购物管理系统)  
  --   过程名称: proc_CartLastestItem 
  --   功能描述:最新加入购物的商品,带图片
  --   创建时间:2009-04-03 15:58:24
 --添加了,当cookie中无商品Id时,从数据库中读取最后一条商品(即最新加入商品)
  --   作者姓名:chenyihao 
  -------------------------------------------------------------------------------  
   
ALTER PROCEDURE  proc_CartLastestItem
 -- Add the parameters for the stored procedure here
 @CartId char(36),
 @PrId varchar(50)= null
AS
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;
 
 if @PrId is null
 BEGIN
  declare @time datetime
  select @time = max(AddTime) from Cart where  CartId = @CartId
      -- Insert statements for procedure here
 
  select p.PrId,p.PrName,p.PrPic,p.SalePrice,c.Quantity
  from Product as p INNER JOIN Cart as c
  on p.PrId = c.PrId
  where c.AddTime = @time AND c.CartId = @CartId
 END
 
 else
 BEGIN
  select p.PrId,p.PrName,p.PrPic,p.SalePrice,c.Quantity
  from Product as p INNER JOIN Cart as c
  on p.PrId = c.PrId
  where c.PrId = @PrId AND c.CartId = @CartId
 END
GO
exec proc_CartLastestItem 'bc7ca3b2-5e42-4ef4-9a71-de273fc93afb','10'
----------------------------------------------
遇到的问题:
  1. 购物车中仅只有一条记录时,迷你购物车也会有记录一条出来。然后我测试过当购物车中的记录大于1条时,是完全没问题的。难道是当@count=0时,SET rowcount @count没起作用了?
    那在SET rowcount @count前加跳判断语句,if @count = 0 return ,不行这样以来总金额和总数量就没了 break也不能用只能在while中。
    查了下,用goto不错。ok!
  2. 2.最新加入的商品数量明明只有1件,竟然显示9件!。后来找了找,发现了原因:在SQL中少加了一个判断条件,@CartId;以至于现在取出了对应ID存在于数据库中的第一条记录。如下图所示,它取出了PrId =13 第一次出现的那条记录,而它的数量正是9200904041240388v-scaj45dudgyhh

=====================================

又花了一下午,将一些BUG修补了下

1.在删除购物车中的最后一条记录时,将cookie中的对应值清除,不然的话,迷你购物车中【最新加入的商品】栏还是显示删除以前的商品

2.新增了,当cookie中无值时,【最新加入的商品】栏显示最近购买的商品(从数据库中读取),对应上面第2条SQL语句。

3.购物车无商品时,隐藏迷你购物车

Posted in 学习笔记 | Tagged , | 1 Comment

实现-搜索完成后关键字仍显示在输入框中

今天一个下午都上不了网,所以为了弄出这个功能,我不停地试,看到下面那么多行注释了吗?试出来的结果。还不错,最终找到了搜索框的ID值,但却不知道怎么给它赋值。到了晚上,可以上网了,搜到了解决方法,搞定!
-----------------------
有以下几个页面:
用户控件Search.ascx,之上有个文本框txtSearch
母板页,Common. master
搜索结果页,Search.aspx
这3个页面之间的关系如下:
Search.ascx放在Common.master中,Search.aspx使用了母板页
---------------------
首先要在Search.ascx.cs中公开其text属性
public partial class UserControl_Search : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    private string keyword;
    public string Keyword
    {
        get
        {
            return txtSearch.Text.Trim();
        }
        set
        {
            txtSearch .Text  = value;
        }
    }
    protected void ibtnSearch_Click(object sender, ImageClickEventArgs e)
    {
        //string keyword = txtSearch.Text.Trim();
        string url = Request.ApplicationPath + "Search.aspx?Keyword={0}";
        //url = string .Format (url,HttpUtility .UrlEncode (keyword ,Encoding .GetEncoding ("GB2312")));
        url = string.Format(url, Server.UrlEncode(Keyword));
        Response.Redirect(url);
    }
}
 
然后在Search.aspx.cs中给txtSearch的Text属性赋值:
public partial class Search : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //    NameValueCollection gb2312Requests;
            //    gb2312Requests = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("GB2312"));
            //    string keyword = HttpUtility.UrlDecode(Request.QueryString["keyword"], Encoding.GetEncoding("GB2312"));
            //    lblKey.Text = gb2312Requests["keyword"];
            //string keyword = Server .HtmlDecode (Request .QueryString ["Keyword"]);
            //lblKey.Text = keyword;
            NameValueCollection qs = QueryString(Request.RawUrl);
            if (qs != null)
            {
                string keyword = qs["Keyword"];
                this.Title = keyword + "-" + Title ;
                //Response.Write(Master.Controls.Count);//
                //Response.Write(Master.Controls[0].ID  + "|");
                //Response.Write(Master.Controls[1].ID + "|");
                //Response.Write(Master.Controls[2].ID + "|");
                //Response.Write(Master.Controls[3].ID + "|");//输出form1,即自己添加的
                //Response.Write(Master.Controls[4].ID + "|");
                //Response .Write ( Master.Controls[3].Controls.Count);//母板页上有5个控件
                //Response.Write(Master.Controls[3].Controls[1].ID );//得到了“Search”,即Search.ascx控件,哈哈
                //Response.Write( Master.Controls[3].Controls [1].FindControl ("txtSearch").ID );//服务器端ID,txtSearch
                //Master.Controls[3].Controls[1].FindControl("txtSearch").Visible = false ;             
                //Response.Write(Master.Controls[3].Controls[1].FindControl("txtSearch").ClientID);//客户端显示的ID,“ctl00_Search_txtSearch”          
                //Response .Write (Master.FindControl("form1").FindControl("Search").FindControl("txtSearch").ID);
                Master.FindControl("form1").FindControl("Search").FindControl("txtSearch");//最简单的方法
                TextBox t =(TextBox)Master.Controls[3].Controls[1].FindControl("txtSearch");
                t.Text = keyword;
                //Master.Controls[3].Controls[1].FindControl("txtSearch").Focus();
            }
           
        }
    }
 搜索结果
Posted in 学习笔记 | Tagged , , , | Leave a comment

实现- 地址栏中显示中文参数(不进行转码显示)

这些天一直在做毕业设计,^_^。
今早,遇到了一个问题,从早上8点一直用搜索引擎到中午吃饭时间,目前总算解决了。
问题:直接在地址栏中输入,如:http://localhost/Search.aspx?Keyword=西南交大,获取Keyword的值,应为西南交大。
效果同google:
图一。搜索框中输入“西南交大”,地址栏就会显示转码后的值,q=后面的值%E8%A5%BF%E5%8D%97%E4%BA%A4%E5%A4%A7
 20090326130236xvbcf6x47nwwfyrt
接下来,在地址栏中将%E8%A5%BF%E5%8D%97%E4%BA%A4%E5%A4%A7替换为“西南交大”,效果如下:
图二。
20090326130626xvbcf6x47nwwfyrt
页面还是和前面的一样。
-------------------------------
先整理一下ASP.NET的编码知识
1.asp.net默认的编码是UTF-8,不过可以在<system.web>添加一下全局设置
<globalization requestEncoding ="gb2312" responseEncoding ="gb2312" />,
这样这个网站就是GB2312编码了。
同时也可以指定页面的编码格式,方法如下::<configuration>节点下加上
<location path="gindex.aspx">
    <system.web>
      <globalization fileEncoding="gb2312" requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN"/>
    </system.web>
  </location>
2.Server.UrlEncode和HttpUtility.UrlEncode
Server.UrlEncode最终会调用HttpUtility.UrlEncode。
只是调用时传递的编码是当前上下文会话Response的Encode如果当前上下文为空则使用默认编码。
若我的网站是UTF-8的,那么用Server.UrlEncode("xxx")和 HttpUtility.UrlEncode("xxx",Encoding.UTF 8) 所得结果是一致的。
 
3.实例,(网站UTF-8编码)
 
提交UTF8 URL编码参数
在不指定编码的时候,系统是自动使用UTF-8编码的,那么我们要提交UTF8 URL编码参数可以直接使用Server.UrlEncode。
string strBefore = "西南交大";
string strAlfter = "";
strAfter = Server.UrlEncode(strBefore);
Response.Write(strAlfter);
获取的方法:
string stringValue;
stringValue = Request.QueryString["string"];
Response.Write(stringValue);
 
提交GB2312 URL编码参数
因为系统默认使用的是UTF-8编码,所以要用GB2312进行URL编码。得指定一个编码才行。代码如下:
//引用System.Text命名空间
string strBefore = "西南交大";
string strAlfter = "";
strAfter = HttpUtility.UrlEncode(strBefore, Encoding.GetEncoding("GB2312"));
Response.Write(strAlfter);
获取方法是
'引用System.Collections.Specialized和System.Text命名空间
string stringValue;
NameValueCollection gb2312Requests;
gb2312Requests = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("GB2312"))
Response.Write(gb2312Requests["string"]); //'里面的string就是你提交的参数的Key
 
4.
对西南交大的GB2312编码结果:%CE%F7%C4%CF%BD%BB%B4%F3
 20090326135506xvbcf6x47nwwfyrt
而UTF-8编码后的结果是        : %e8%a5%bf%e5%8d%97%e4%ba%a4%e5%a4%a7
20090326135328xvbcf6x47nwwfyrt
 
5.编码对英文和数字不起作用
--------------------------------------------------------
其实前面遇到的问题,我思考的方向一直是错误的,白白浪费了好多时间。
在搜索框里输入中文,字母,数字;运行后显示的结果都是正确的。但我想实现这样一个功能,直接在地址栏将参数值弄成中文,
结果是乱码。
现在想来,其实很简单。因为我在提交参数时已经先进行编码了,然后在显示时有将参数解码出来。而要是在地址栏输入中文参数,
由于没有前面的编码过程,后面却要对中文进行解码,结果显然不正确。
 
思路:使用Request.RawUrl获取原始地址
先检查Url有无被转义,有的话先转正,没有的就直接分离生成命名集供使用
        private NameValueCollection QueryStringEx(string rawurl)
        {
           
if (!Uri.IsWellFormedUriString(Request.RawUrl, UriKind.Absolute))
            {
                rawurl
= Uri.UnescapeDataString(Request.RawUrl);//将字符串转换为它的非转义表示形式
            }
            return null

sender, EventArgs e)
        {

 

            NameValueCollection qs = QueryStringEx(Request.RawUrl);
            Response.Write(qs[
"q"]);
        }

 

 

            if (rawurl.Contains("?"))
            {
               
string[] ss = rawurl.Split(new char[] { '?' }, StringSplitOptions.RemoveEmptyEntries);
               
if (ss.Length > 0)
                {
                    NameValueCollection nvc
= HttpUtility.ParseQueryString(ss[1]);
                   
return

nvc;
                }
            }
;
        }

 

        protected void Page_Load(object

 

Posted in 默认分类 | Tagged | 1 Comment

学生教务系统(PB9.0+SQL 2000)-课程设计

这是《数库据设计与应用》的课程设计,花费了快3个星期的时间才完成的。

 主要功能:

其中管理员的主要操作是“系统维护”,包括用户的管理,信息的维护;教师的主要操作是:学生成绩的提交,文件的上传,以及成绩的统计;学生的主要操作是:选择课程,查看自己的成绩等功能。

界面还算比较美观吧,不过有些地方还不是很完善大家自己去发现吧。

帐号见文件夹里的ReadMe.txt

数据库设计:点击下载

要程序的,请留下你的邮箱。

pb数据库

学生教务系统

学生教务系统

学生教务系统

选课窗口

查看成绩

提交成绩

wj.jpg

Posted in 学习笔记 | Tagged , , , , | 10 Comments

C语言变量详解(复习)

2008-11-8

http//www.diaomin.org

通过1个月的找工作,发现自己还是太弱了,努力下

一。变量的存储类型

C语言中的变量存储类型有4种,分别为auto(自动变量),static(静态变量),extern(外部变量),register(寄存器变量)

1.全局变量的存储类型:

static和extern两种,其中extern是缺省的全局变量存储类型

int x,y=5;//默认为外部全局变量

extern int a=1,b=2;//定义外部全局变量,使用关键字extern后,必须进行初始化!

static float f1,f2;//静态全局变量

void main()

{

..........

}

extern型全局变量通过外部全局变量说明可以被其他源程序引用,而static星的全局变量只能局限在本源程序文件中使用

如果使用了关键字extern,则必须对这个外部全局变量进行出示化,否则编译程序会把它当作外部变量的声明(说明)      

2.局部变量的存储类型:

C语言种的局部变量的存储类型有如下3种:auto,static,register。其中auto是缺省的局部变量存储类型!

void main()

{

    auto int a;//自动变量

    fioat f;//自动变量

    static int i;//静态变量

    register double d;//寄存器变量,要求编译器使用CPU寄存器来存储变量值

}

C语言函数定义中的形参也是局部变量,形参的默认存储类型是auto,也可以指定形参的存储类型是register,但不允许指定形参的村塾类型为static!

二。变量的生存期

C语言的变量生存期有2种:全程生存期,动态生存期。

1.全程生存期

指变量在程序运行一开始就被建立,而在程序运行结束后才从内存中删除。

具有全程生存期的变量是全局变量静态变量  

具有全程生存期的变量存储在程序的静态数据存储区

2.动态生存期

指变量在程序运行过程中,因需要使用才建立,而使用结束就被删除

具有动态生存期的变量有:局部自动变量寄存器变量

具有动态生存期的变量存储在程序的动态数据区

对于复合语句种定义的auto型的局部变量,每当程序运行至该语句时,就会在动态数据区建立这些局部变量的存储空间,而一旦程序流程离开该复合语句时,该复合语句种的局部变量将被系统从内存种删除

3.变量的初始化

    具有全局生存期的变量(包括数组)在定义时如果没有初始化,则初值自动为0;而具有动态生存期的变量未初始化时,初值为一随机数!

    具有全局生存期的变量在定义时如有初始化,则初始化在程序刚开始运行建立静态数据区时会被执行一次,以后再也不会执行初始化操作。而动态生存期的变量在定义时如有初始化,则每当程序创建该变量时都会执行初始化。

static double a[10];

int b[5];double x,y;static char ch;

void main()

{

     static long p[8];

     static float g;

}

上述变量都为全局生存期变量,所以初值都时0!

注意:如果在函数中使用静态局部变量,由于静态局部变量的初始化只执行一次,故当第2次调用该函数时,不会对静态局部变量进行再次初始化;又由于静态局部变量时全程生存期的,所以静态局部变量的值为上次结束函数调用时的值!

#include "stdio.h"

void f()

{

    int a =0;//自动局部变量

    static int c;//静态局部变量

    a++;c++;

    printf("%d,%d,",a,c)

}

void main()

{

    int k;

    for(k=1;k<=4;k++)

        f();

}

输出结果:1,1,1,2,1,3,1,4

解析:

由于a时自动变量,即为动态生存期变量,所以每次调用函数f()时都要进行初始化,故每次输出都时1。

而b为静态局部变量,即为全局生存期变量,所以只是在第一次调用函数f()时进行初始化,在接下来函数f的调用中

b的值为上次函数结束时的值

Posted in 学习笔记 | 1 Comment

C#学习笔记-(如何:串联多个字符串)-(2008-10-18)

http://msdn.microsoft.com/zh-cn/library/ms228504.aspx

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

//如何:串联多个字符串(C# 编程指南)
//class stringConnect1
//{
//    static void Main()
//    {
//        string s1 = "he " + "is " + "a " + "chinese ";
//        string s2 = "boy";
//        string s3 = @"h
//                     e"+ "is";//在字符串前面加上@可以按原样输出,而不报错,若不加@则提示“常量中有换行符”
//        Console.WriteLine(s1);
//        Console.WriteLine(s1+s2);
//        Console.WriteLine(s3);
//    }
//}
//class stringConnect2
//{
//    static void Main(string[] args)
//    {
//        string name = args[0];//从命令行获取参数,,在执行程序是在后面加上参数
//        string time = DateTime.Today.ToShortDateString() ;
//        string s="您好" + name + "," + "今天是" + time;
//        //Console.WriteLine("您好" + name + "," + "今天是" + time);
//        s+=",祝您好心情!";
//        Console.WriteLine(s);
//    }
//}

//3.使用StringBuilder类的Append方法
/*如果您串联的字符串数量不那么巨大(例如,在循环中),
 * 那么这些代码的性能成本可能不会很高。上述情况同样适用于 String.Concat 和 String.Format 方法。

但如果性能的优劣很重要,则应该总是使用 StringBuilder 类来串联字符串。下面的代码使用
 * StringBuilder 类的 Append 方法来串联字符串,因此不会有 + 运算符的链接作用产生。

*/
class stringConnect
{
    static void Main()
    {

        StringBuilder s = new StringBuilder("0");
        for (int i = 1; i < 10; i++)
        {
            s.Append(i.ToString());
        }
        Console.WriteLine(s.ToString() );
    }
}

Posted in 学习笔记 | Tagged , | 1 Comment