存档在 2008年4月

君子抉(4月28日)

2008年4月28日

已经好几天没写了,今天也不知道是第几天,重新开始写.

今天上午听老师讲课一直昏昏沉沉的,还不如自己看书了.今天看的是php和mysql一起的.

主要是创建表单,函数,默认参数,日期和时间.再就是mysql中的SQL语句.

1.创建和调用函数

fuction  function_name()

{

//function code

}

2.函数代码的执行时间发生在调用函数时,而不是定义函数时.因此只需要在调用一个引用的全局变量的函数之前,定义改全局变量即可.

3.避开使用全局变量作用域的另一个方法是按引用(而不是按值)传递一个变量.

4.Unix Epoch 时间戳是1970年1月一日0点起所经过的秒数.

5.mysql中char与varchar的区别:存储为char的任何内容总是被存储为列长度的字符串(使用空格填充它),想法,varchar字符串只与存储的字符串本身一样长.在检索数据时,Mysql会删除char列中多余的空格,对应varchar列,这种操作则会发生在插入数据时.

6.在mysql中使用enum.如: gender  ENUM(‘M’,’F’) default ‘F’

7.user_id是用户表的主键(PRIMARY KEY),对该列添加了AUTO_INCREMENT,就相当与标识种子

8.升序ASC(默认),降序DESC

9.MYSQL中限制查询结果数

select *from tablename LIMIT 10    只查询前10条记录

select *from tablename LIMIT 10,20    从第11条记录开始(数据库中索引从0开始),一共返回20条记录.

10.使用别名 as

11.从表中获取随机的一行  SELECT  * from users ORDER BY RAND() LIMIT 1

忙里偷闲4.22

2008年4月23日

昨天从上午起床到晚上就一直在忙,晚上停了电发现自己今天还是忙的时候少,闲的时候多啊.大清早的起来让兴旺帮我写论文,我在编自动下载的程序,感觉到了最后更本不能实现了就让兴旺画了张流程图,我再贴上代码糊弄了一下.然后去上课,今天第一节接口听得不大明白了,感觉自己缺了不少课了,过一段时间再把它拾回来.第二节是孔老师的C#,讲得挺没意思的.我就自己看书,结果过了一会,我就看不下去了.她在讲我写的上机作业,心中窃喜,原来把我的作业当作样本讲啊.她没说是谁做到,不过有不少人看过我代码,明白是我的.在讲的时候,还把我的一个概率分布给讲错了,我的都是设计好的,让她给想象成另一个样了.不过我也没说,别人看过的没多少明白的,关键是我没有写注释和帮助.讲完了我的两个程序,我也看不下去书了,就和张超在那聊天.听他说,他想去做一个类似于QQ的聊天、传文件的软件,想把它发布到华军上,说要能做个东西并发布到网上,大学四年也算是没有白上了。我想也是,都快三年了,也没有一个什么正式的成果出来。我和他说,要做就做个跨平台的,他说他用java做,我想我俩一块做,我换个语言,看是用C还是用C#做。到了中午,把上午写的东西和兴旺写的和到一块,然后再把东西改了改,都差不多了,结果wp打电话来了,让我下去,没办法就下去和wp去了网络楼。去了网络楼又去了水化楼,那两个老师也挺能磨的,搞了半天,最后我找了个机会逃了出来,直奔科学实验楼。结果去了才知道,兴旺早就去了,都在门口睡着了,让曹乐就叫醒的,这都怪我不好的。之后我就帮兴旺改论文,改着改着就去拿着小车去照相。隔行如隔山,虽说以前都一个专业的,但还是很多都不大明白,只能简单的改了改。也不知怎么弄的,也没改多少,在五楼也没干什么事就到了6点半去吃饭了。回去实验室也没过多久就回来了。回来途中,还照了几张像,感觉有那种老相片的味道在里面。回来了也没干多少事,帮兴旺改了改ppt,看了看肖东光的科技立项,感觉挺不错的,一个示波器包含能想到的功能,还有更多想不到的功能也有。再就看了另一个科技立项的,也很好用的是太阳能电池板,好几百一个的东西,还有遥控控制、光控等功能。
今天学习的内容:
DetailsView的分页 显示 排序等功能.
写完了,突然感觉今天写的完全就是记流水账.

君子抉第三天(4月20日)

2008年4月21日

本来应该在4月20日写的,由于种种原因没有写,今天将它补起来.这是正式的按君子抉中的计划来写博客的第二天,今天搞那个垂直搜索搞了一上午,以前还感觉搞这个有点激情,现在感觉完全是一种累赘,还得写文档,麻烦啊.下午才干了点真正有点意思的东西—–flex.

以前从来没有接触过flex,那次听兴旺说要做一个自动的词法分析器,用flex来实现,研究了半天,最后总算明白了.而且今天我才明白原来编程最痛苦的事不是代码怎么写,而是在哪里编写代码.刚开始在网上搜索了半天,都是讲解flex的程序怎么编写,就是没说,写了在哪里进行编译.最后找了半天,明白了.

先下载flex-2.5.4a-1.exe,然后进行安装,我是安装到了D:GnuWin32,然后在环境变量的path加上一句:  ;D:GnuWin32bin

再到DOS命令下进行测试安装好了没有,输入 flex -V 即可.这个是大写V.之后就是编写.l文件.编写好.l文件之后,在DOS命令行下定位到你的.l文件的目录,让后输入flex test.l 回车即可.这里test.l是你的.l文件的文件名.让后在test.l文件的同一目录就会生成一个 lex.yy.c.这个文件就可以在Visual Studio中进行编译了.下面这个是我改写的词法分析器的flex的.l文件的代码.

%{
#include
<stdio.h>
#include
<stdlib.h>
/*保留字*/
#include
<string.h>
char *key[]={ ,auto,break,case,char,const,continue,default,do,double,
else,enum,extern,float,for,goto,if,int,long,register,
return,short,signed,sizeof,static,struct,switch,typedef,
union,unsigned,void,volatile,while};  

int IsKeyWord(char *lex) ;/* 判断字符串是否是保留字 */void print();                            //输出token序列;
void main(int argc,char*argv[]);         //主函数;
struct token{                            //二元组;
      char*idproperty;    //token属性值;
      char*idname;    //识别的token名字;
}entity[1000];     //定义1000个这样的token,大小可改变;
char*filename;                           //保存结果的文件名;
int errnum=0;     //错误token的数目;
int value;     //属性值int型;
int linenum=1;     //行数;
int count=0;     //token的个数;
int flag=0;
FILE
*fpin;     //测试文件指针;
FILE*fpout;     //结果文件指针;
%}
digit         [
09]
letter        [_a
zAZ]
number        {digit}
+
identifier    {letter}({letter}
|{digit})*
wrongid       ({digit}
+){letter}({letter}|{digit})*
newline       [n]
whitespace    [t]
+
allchar             [
^0]|0
string_l            
{allchar}?
%%
{string_l}        {value
=6;print();}                                            //字符串常量
{identifier}   {value=IsKeyWord(yytext); print();}  //标识符—0 关键字—1
{wrongid}   {value=7;print();}                                        //错误标识符
{number}   {value=2;print();}                                            //数字常量
++         |
         |
->      |
&&    |
||    |
<=    |
==       |
!=    |
>=    |
>>    |
<<    |
*=    |
/=    |
%=      |
+=    |
-=    |
&=    |
|=    |
^=                    {value=4;print();}            /*组合运算符*/
+            |
            |
*            |
/         |
!    |
%     |
&     |
|                   {value=3;print();}                                /*基本运算符*/
,            |
;            |
{            |
}            |
(            |
)            |
.            |
#            |
              {value=5;print();}                /*分界符*/
{newline}   {linenum
+=1;}
{whitespace}   {;}
     {;}
.    {value
=7;print();}                 /*其他不识别*/
%%
int yywrap()
{
fclose(fpin);
return 1;
}
 

void print()
{
count
+=1;
if(flag!=1){
if((fpout=fopen(filename,a))==NULL){
printf(
无法打开文件! n);
exit(
0);
}
}
if(value<=6){
switch(value){
case 0:entity[count1].idproperty=标识符;break;
case 1:entity[count1].idproperty=关键字;break;
case 2:entity[count1].idproperty=数字常量;break;
case 3:entity[count1].idproperty=基本运算符;break;
case 4:entity[count1].idproperty=组合运算符;break;
case 5:entity[count1].idproperty=分界符;break;
case 6:entity[count1].idproperty=字符串常量;break;
}
entity[count
1].idname=yytext;
fprintf(fpout,
%d < %s , %s > n,count,entity[count1].idname,entity[count1].idproperty);
}
else{
errnum
+=1;
switch(value){
case 8:entity[count1].idproperty=错误标识符:;break;
case 7:entity[count1].idproperty=不识别:;break;
}
entity[count
1].idname=yytext;
fprintf(fpout,
%d [line:%d]:%s%s n,count,linenum,entity[count1].idproperty,entity[count1].idname);
}
if(flag!=1)fclose(fpout);
}
/* 判断字符串是否是保留字 *//*    如果不是就返回 0 */int IsKeyWord(char *lex)
{
int i;
for( i=1;i<=32;i++)
{
if(strcmp(lex,key[i]) == 0)
return 1;
}
return 0;
}
void main(int argc,char*argv[])
{
if(argc==1){
printf(
please input the C program(ctrl+z to end) n);
flag
=1;
fpin
=stdin;
fpout
=stdout;
}
if(argc==2)argv[2]=defresult.txt;
filename
=argv[2];
if(flag!=1){
if((fpin=fopen(argv[1],r))==NULL){
printf(
cannot open the file n);
exit(
0);
}
}
yyin
=fpin;
yylex();
if(flag!=1){
if((fpout=fopen(filename,a))==NULL){
printf(
cannot write the file n);
exit(
0);
}
}
fprintf(fpout,
n);
fprintf(fpout,
%d symbol(s) found. n %d error(s) found. n,count,errnum);
fprintf(fpout,
======================================================================= n);
if(flag!=1)fclose(fpout);
yywrap();
}

 

image004 image002

君子抉第二天(4月19日)

2008年4月21日

本来应该在4月19日写的,由于种种原因没有写,今天将它补起来.这是正式的按君子抉中的计划来写博客的第二天,今天一整天都在宿舍呢.昨天晚上和今天上午主要学习了PHP的初级使用.
在昨天晚上看了一晚上的PHP,感觉和C语言是如此的类似,虽然说这是第一次接触PHP,但看到了其中的语法感觉非常的亲切.就像C语言似的.
读书笔记:
1.PHP的基本语法,变量,数字,常量,单引号和双引号.
其中单引号与双引号的区别:单引号的值按照字面意思进行处理,而封闭在双引号中的值怎被PHP解释.
2.PHP进行基本编程,条件语句,运算符,数组,for和while
isset($var):如果$var具有不同于NULL的任何值,包括0和空串
($var):如果$var具有非0值,空字符串,或是null怎条件为真.
访问数组  foreach($array as $value){//….}
foreach($array as $key=>value{//….}

君子抉—–吾之所感

2008年4月21日

看了兴旺的《当技不如人时》,自己坐在板凳上一直在思考.熄灯了还在想着,觉也谁不着了.一直在想自己该怎么办?以前一直以为自己做得对的事,现在发觉很多都错了.感觉对兴旺很愧疚.

       首先说说名字,看兴旺以前写的是君子议,我感觉比较难听.我就把它改成了君子诀.意思是想把这个作为一段口诀、秘诀来反复记诵的。昨天又看到兴旺发到blog上的是君子抉,大概是为了表达选择自己道路的意思,感觉很不错,就用这个名字。

   我感觉现在每天都很茫然,不知道自己要干什么,就像兴旺说的”有事就干点,没事就到处瞎逛.”.也是该有一个计划来约束自己了.由此和兴旺共同制定了本计划《君子抉》。今后一定认真执行,我俩共同监督。

约定如下

一、基本作息时间:

       工作日:

              起床:6:20                      午睡:13:10—13:40            睡觉:11:00

       周末及假期:

              起床:7:00                                                                睡觉:12:00

       备注:作息时间的安排似乎可以影响到我的整个安排与计划,这次安排为自己留了一个很大的可以灵活调整的时间段,问题会可能会出现在睡觉时间上,现在已经有了晚睡的习惯了,所以首先得改掉这个习惯同时形成这样一个生物钟。坚持21天!

二、工作日的每天中几个固定的时间段安排:

    早晨:6:35——7:30

            土豆:上网学习  付:背诵CET4词汇

中午:12:35——13:10

        写博客或写其他文字性东东(对昨天的情况进行总结,写一些读书笔记,学习心得,计划执行情况,心情,感想等等)

下午:5:00——5:50

        周一、周三、周五锻炼身体绕环山行。

        周二做作业(实验、大作业、书面作业)

晚上:18:00——19:00      写程序(周四下午4:30——6:00)

          19:30——21:00      周一、三、五、日学习英语

备注:这段时间的安排仍然需要坚持,土豆不喜欢记单词,早晨的上网学识是读新闻看消息,比如CSDN的东东等。

三、周末任务安排

(离开宿舍,去实验室)

8:00——12:00

14:00——17:00

18:00——21:00(周六)

其余课余时间为看书时间,去图书馆或自习室,看书的内容分为课内和课外,课外书的选择以一本为原则,看完一本,再看另外一本,各个击破,看书写读书笔记,不动笔墨不读书!周六、周日晚21:30至23:30休息!

今天搜索引擎备忘

2008年4月20日

修改SQL语句,以前老以为数据库自动做好了优化工作,其实不然,在修改后的SQL语句,可以很快实现.

‘tSql=”select ArticleUrl,Title,NewsTime,Source from mynews where ID in (select distinct urlID from UrlWord where word='”+ sKey +”‘);”
tSql=” select ArticleUrl,Title,NewsTime ,Source from mynews where Title like  ‘%” + sKey +”%’ Union   All  select ArticleUrl,Title,NewsTime,Source from mynews where ID in (select distinct urlID from UrlWord where word='”+ sKey +”‘);”

利用游标来增加数据到mynews表中

declare newsie_cur cursor
for
select ArticleUrl,Title,NewsTime from  newsie

open newsie_cur
declare @ArticleUrl nvarchar(255),@Title nvarchar(255),@NewsTime datetime
fetch next from newsie_cur into @ArticleUrl,@Title,@NewsTime
while(@@fetch_status=0)
begin
fetch next from newsie_cur into @ArticleUrl,@Title,@NewsTime
insert into mynews(ArticleUrl,Title,NewsTime,Source) values( @ArticleUrl,@Title,@NewsTime,’信息工程学院’)
end

close news_cur

又流鼻血了

2008年4月20日

也不知道现在是怎么会事,老流起鼻血了.前天去跑步跑了一半就突然流起鼻血来了,今天又流了,感觉今天的真是有点恐怖.本来在穿衣服,突然大滴的鼻血流了出来,感觉像雨点一样滴到了衣服上.但是眼看着血涌出来,一点感觉也没有 .

哎…..

4_16 ASP.NET2.0学习

2008年4月16日

GridView控件的使用方法及练习

1.不编写代码制作简单的数据编辑、显示、删除的页面。

A。Web Config存储连接字符串的方法
http://www.coolsdu.cn/pjblog/article.asp?id=36

B。用GridView连接SqlDataSource,直接选择数据源即可。在代码中是

<asp:GridView ID=”GridView1″ runat=”server” AutoGenerateColumns=”False” DataKeyNames=”UserID”
DataSourceID=”SqlDataSource1″

C。直接利用向导生成GridView的代码。

D。右键显示智能标记可以看到启用分页,启用排序的选项。

GridView分页

当GridView的AllowPaging属性设置为True的时候,我们实现了分页,我们还可以对分页进行一些个性化的设置。常用的属性包括:PageIndex――设置数据显示的当前页面,默认是0,也就是数据的首页。PageSize ――也就是一页显示多少条记录,默认为10条。在PagerSettings中,还可以对分页的导航按钮进行详细设置,在Mode属性中,可以设置:Numeric――默认的,分页用数字表示,1,2,3……。NextPrevious、NextPreviousFirstLast、NumericFirstLast均可顾名思义,显示上一页、下一页、首页、末页等。当Mode设定不是Numeric时,那么可以通过设定FirstPageText、LastPageText等属性来实现分页导航时,到首页、末页、下页、上页时显示的文字提示。
如果想实现分页界面的完全自动控制,还可以点击GridView右键,选择编辑模版-PagerTemplate来实现,在模版中加入若干个Button控件,然后将Button控件的CommandName属性设置为Page,将CommandArgument属性分别设置为First、Last、Prev、Next或者一个数字,即可实现分页操作。

GridView中的编辑、删除、排序

与分页类似,直接在显示智能标记中有启用编辑,启用删除(必须是对应的SqlDataSource1有DeleteCommand、UpdateCommand)

GridView中的自定义列

我们现在假设有一个表,其中有一个字段是username,我们现在产生一个自定义列,自定义列中包括一个操作,删除此用户。我们首先右键点击GridView,在智能标记中,选择编辑列,添加一个模版列,然后编辑模版中的ItemTemplate,加入一个ImageButton控件,点击该控件即可修改ImageUrl、AlternateText、CommandArgument、CommandName。
其中ImageUrl—图像的URL  AlternateText—相当于alt   CommandName–按钮的名字 CommandArgument–该按钮的参数
在这里把这个参数绑定到 UserID。绑定方法:CommandArgument='<%# DataBinder.Eval(Container.DataItem,”UserID”) %>’。如果单向绑定,一般采用Eval,也就是说数值只从数据源传到页面上,如果双向绑定,也就是采用Bind的话,对数据的修改可以回传到数据源之中。

<asp:TemplateField HeaderText=”操作”>
<ItemTemplate>
<asp:ImageButton id=”deleteBtn” ImageUrl=”~/images/delete.gif” AlternateText=”删除此项” runat=”server”  CommandName=”delete” CommandArgument='<%# DataBinder.Eval(Container.DataItem,”UserID”) %>’ /></ItemTemplate>
<ItemStyle Width=”300px” BorderWidth=”1px” HorizontalAlign=”Center” />
<HeaderStyle HorizontalAlign=”Center” />
</asp:TemplateField>

GridView中的RowDataBound事件

在创建gridView控件时,必须先为GridView的每一行创建一个GridViewRow对象,创建每一行时,将引发一个RowCreated事件;当行创建完毕,每一行GridViewRow就要绑定数据源中的数据,当绑定完成后,将引发RowDataBound事件。如果说我们可以利用RowCreated事件来控制每一行绑定的控件,那么我们同样可以利用RowDataBound事件来控制每一行绑定的数据,也就是让数据如何呈现给大家。
在这里点击这个删除图片后,一般弹出一个对话框,这就需要没一行的图片都需要添加这样的javascript,

protected void UserView_RowDataBound(object sender, GridViewRowEventArgs e)
{

///找到删除按钮
ImageButton deleteBtn = (ImageButton)e.Row.FindControl(“DeleteBtn”);
if (deleteBtn != null)
{
///添加删除确认对话框
deleteBtn.Attributes.Add(“onclick”, “return confirm(‘你确定要删除所选择的数据项吗?’);”);
}

}

GridView中的RowCommand事件

在点击这个删除图片按钮后就会触发一个RowCommand。在设置删除图片按钮有这两个CommandArgument、CommandName参数,这里就用得到了。

protected void UserView_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == “delete”)
{
///删除数据
User user = new User();               //这里是后台代码,删除用户的类,未实现
user.delUser(Int32.Parse(e.CommandArgument.ToString()));

///重新绑定控件的数据
BindUserData();
Response.Write(“<script>alert(‘” + “删除数据成功,请妥善保管好你的数据!” + “‘);</script>”);
}
}

 

作业:参考上面的制作方法,制作一个类似的用户管理的页面(主要是那个删除图片按钮),可以扩充功能。

参考页面:

image

4_14 ASP.NET学习总结

2008年4月14日

SqlDataSource控件的使用方法及练习

1.Web Config存储连接字符串的方法

主要代码:

在web.config中

<connectionStrings>
<!–链接SQL Server数据库的链接字符串–>
<add name=”SQLCONNECTIONSTRING” connectionString=”data Source=127.0.0.1;database=ShareWeb;user id=sa;pwd=dai” providerName=”System.Data.SqlClient”></add>
</connectionStrings>

在页面中default.aspx

<asp:SqlDataSource ID=”SqlDataSource1″ runat=”server” ConnectionString=”<%$ ConnectionStrings:SQLCONNECTIONSTRING %>”
SelectCommand=”Select [DepartmentID], [DepartmentName] FROM [Department]”>
</asp:SqlDataSource>

在程序中调用这个连接字符串

//读取web.config文件
connStr = WebConfigurationManager.ConnectionStrings[“SQLCONNECTIONSTRING”].ConnectionString;

//打开数据库连接
conn = new SqlConnection(connStr);
conn.Open();

2.简单sql语句进行的数据绑定.

练习1.利用DatailsView与SqldataSource实现[编辑][删除]等.不编写代码.直接用控件拖动.

样本:http://www.coolsdu.cn/4_14_test/Default2.aspx

练习2.在Sqldatasource中使用Parameter类来表示一个任意的参数值.ControlParameter表示控件值或页面属性值.

制作一个简易的留言板,可以显示IP和日期.参考示例:http://www.coolsdu.cn/4_14_test/Default3.aspx

关键代码:

在default3.aspx中
InsertCommand=”Insert INTO [lyb] (  [Content], [Name],[IP]) VALUES (  @Content, @Name,@IP)”
SelectCommand=”Select [ID], [IP], [Content], [EntryData], [Name] FROM [lyb]”  >
<InsertParameters>
<asp:Parameter Name=”Content” />
<asp:Parameter Name=”Name” />

<asp:ControlParameter Name=”IP”  ControlID=”__page” PropertyName=”IP”/>

</InsertParameters>
在default3.aspx.cs中

public string IP
{
get
{
return Request.UserHostAddress;
}
}

 

其中显示IP功能:

注意:控件参数的ControlID属性值为_page,这个值为Page类自动生成的ID。而PropertName属性的值为IP,这个值在同一页面中定义的。

作业:参考简易的留言板,制作一个类似可以显示时间和IP的留言板,可以扩充功能.(当前状态:未完成)

4_14~4_20学习大纲

2008年4月14日

一、SqlDataSource控件的使用方法及练习

1.Web Config存储连接字符串的方法

2.简单sql语句进行的数据绑定.

练习1.利用DatailsView与SqldataSource实现[编辑][删除]等.编写代码与不编写代码两种方式.

练习2.在Sqldatasource中使用Parameter类来表示一个任意的参数值.ControlParameter表示控件值或页面属性值.

3.简单介绍FormView、GridView、DetailsView、DropListView控件

二、详细介绍GridView控件的使用方法

1.分页、编辑、排序

2.模板、按钮

3.图片按钮

实例1.用户管理系统中的用户管理列表

三、采用数据库编程方式实现数据的绑定与更新

1.普通单类结构的代码编写

2.连接数据库类的使用方法

实例:将用户管理系统的用户管理列表采用单类结构进行改写

四、SQL语句的简介

1.简单查询与子查询的使用

2.存储过程,游标的使用

实例:编写查询用户信息、审核用户、检验用户的存储过程,并进行测试。

五、三层ASP.Net2.0架构的代码编写.