对于c++中的一个空类
class X
{
};
事实上并不是空的,sizeof(X)并不等于0, 一般的结果是1。每个X的对象都有一个隐晦的1 bytes,是被编译器安插进去的一个char,这样可以使得这个class的两个objects在内存中配置独一无二的地址。
当X作为另一个类的成员时,如:
class A
{
public:
X x;
int a;
};
由于X占一个字节,int占4个字节,再加上编译器的alignment调整,sizeof(Y) = 8。
但是当一个类继承X时:
class Y : public X
{
public:
int a;
};
这时大部分编译器对于sizeof(Y)的结果是4,而不是8。这就是所谓的空白基类最优化在(empty base optimization-EBO 或 empty base class opimization-EBCO)。在空基类被继承后由于没有任何数据成员,所以子类优化掉基类所占的1 byte。EBO并不是c++标准所规定必须的,但是大部分编译器都会这么做。
目前界面的需求已经都完成了,但是还有很多地方不是很清楚,特地记录学习一下。
写JS页面的时候比较痛苦,很多都忘记了,都是复制例子之后自己改的。除了开头的
Ext.BLANK_IMAGE_URL='../extsrc/resources/images/default/s.gif'; Ext.lib.Ajax.defaultPostHeader += ";charset=utf-8";也不知道具体什么用,先晾着
所有的代码都写在Ext.onReady( )里面了。
Ext.onReady(function(){ Ext.QuickTips.init();//QuickTips的作用是读取标签中的ext:qtip属性,并为它赋予显示提示的动作 });
store
// store var store = new Ext.data.Store({ proxy: new Ext.data.ScriptTagProxy({//注意后台必须使用callback参数进行包装 url: globalURL //会向对应的Action传值 }), //对返回的呃Json进行解析,获取需要的值 reader : new Ext.data.JsonReader({ totalProperty : 'totalCount', root : 'root' }, [{ name : 'majorId' }, { name : 'majorName' }, { name : 'majorCode' }, { name : 'majorUseFlag' },{ name : 'flag' },{ name : 'majorStime' }, { name : 'majorEtime' } ]) // sortInfo:{field:'majorId', direction:'ASC'} 排序 }); store.load({params : {start : 0,limit : 30}}); //重新加载一下checkbox
var checkbox = new Ext.form.Checkbox({ id : 'checkbox', boxLabel : '显示历史' //labelAlign : 'right', 这个属性IE8下目测没有效果 // name : 'no', // inputValue : 1, // checked : false, // handler : checkboxshow 这个属性IE8下目测没有效果,但是下面的 listeners 就可以了,不知道为什么 listeners:{ 'check':function(checkbox,checked){ //这个checked 的值是自动填充的并非要求传入的参数,即是否有勾,为boolean类型 //checkbox 即他自身 var delBut = Ext.getCmp('delBut'); //可通过 id 获取对应的组件 var celBut = Ext.getCmp('celBut'); if(checked){ alert("checked"); celBut.show(); delBut.hide(); }else{ alert("not checked"); delBut.show(); celBut.hide(); } } } });
sm
var sm = new Ext.grid.CheckboxSelectionModel({boxLabel: '全选'}); //定义sm,这个 全选 在IE8中目测无效
cm
var cm = new Ext.grid.ColumnModel([ //定义cm ,以下为对应的列,和列对应的属性 sm, { id:'majorId', header: "专业序号", width:200, dataIndex: 'majorId', editor:new Ext.form.TextField() },{ id:'majorName', header: "专业名称", width:200, dataIndex: 'majorName', editor:new Ext.form.TextField() // ,renderer:sourceRenderer },{ id:'majorCode', header: "专业编码", width:200, dataIndex: 'majorCode' }, { id:'majorStime', header: "开始时间", width:200, dataIndex: 'majorStime' }, { id:'majorEtime', header: "结束时间", width:200, dataIndex: 'majorEtime' }, { id:'majorUseFlag', header: "使用标志", width:100, dataIndex: 'majorUseFlag', editor:new Ext.form.TextField() }, //这里定义了一组行按钮放在每行的末尾,用于单项删除,后面有 cellclick 事件与之对应 header: "", dataIndex: "delButton", width: 50, renderer: function (value, cellmeta) { return "<INPUT type='button' value='删除'>";} } ]); cm.defaultSortable = true;
各种页面响应的调用函数
function doadd(){ var newrrecord = new newrecord({ majorId:'', majorName : '', majorCode : '', majorUseFlag:'', flag: '1' //这个 flag 用来区别是 新建 还是 修改 }) grid.stopEditing(); store.insert(0, newrrecord); } function dosave() { var m = grid.store.getModifiedRecords(); var jsonData = '['; for (var i = 0; i < m.length; i++) { // m表示被修改的行 if(m[i].get('majorId')==''){ Ext.Msg.alert('信息提示', '专业序号不能为空!'); return false; } if(m[i].get('majorName')==''){ Ext.Msg.alert('信息提示', '专业名称不能为空!'); return false; } /*if(m[i].get('majorCode')==''){ Ext.Msg.alert('信息提示', '专业编码不能为空!'); return false; } if(m[i].get('majorUseFlag')==''){ Ext.Msg.alert('信息提示', '使用标志不能为空!'); return false; }*/ var n=store.getCount(); jsonData = jsonData + Ext.util.JSON.encode(m[i].data) + ','; } jsonData += ']'; if (jsonData == '[]') { Ext.Msg.alert('信息提示', '没有发现保存项,请确认有保存项!'); return false; } Ext.Msg.confirm('信息', '确定要保存所选项吗?', function(btn) { if (btn == 'yes') { Ext.MessageBox.wait("正在保存", "请稍候..."); Ext.Ajax.request({ url : '../control/IndexMajor?act=saveMajor', params : { jsonData : jsonData }, method: 'POST', success: function (request) { var message = request.responseText; var resp=Ext.util.JSON.decode(request.responseText); if(resp.success == 'fail'){ Ext.Msg.alert('信息','<center>保存项保存失败!<p>'+ resp.Info+'</center>'); } else{ Ext.Msg.alert('信息','保存项保存成功!'); store.each(function(record) { record.commit(); }) loadF = 0; selectedrecord = null; grid.getView().refresh(); saved=true; store.reload(); renderGrid(); } }, failure: function ( result, request) { Ext.Msg.alert('错误','保存时出现未知错误.'); } }); } }) } function dodelete(){ var m = grid.getSelections(); if(m.length <= 0){ Ext.Msg.alert('信息','<center>请至少选择一行数据!</center>'); }else{ Ext.MessageBox.confirm('确认删除', '你真的要删除所选行记录吗?', function(btn) { if (btn == 'yes') { Ext.MessageBox.wait("正在删除", "请稍候..."); var majorCodes = ''; for(var i=0;i<m.length-1;i++){ majorCodes += m[i].get('majorCode')+','; } majorCodes +=m[m.length-1].get('majorCode'); Ext.Ajax.request({ url : '../control/IndexMajor?act=deleteMajor', params : { majorCodes : majorCodes }, method: 'POST', success: function (request ) { var resp=Ext.util.JSON.decode(request.responseText); if(resp.success == 'fail'){ Ext.Msg.alert('信息','<center>记录删除失败!<p>'+ resp.Info+'</center>'); } else{ Ext.Msg.alert('提示', '记录删除成功!'); store.reload(); grid.getView().refresh(); store.commitChanges(); } }, failure: function ( result, request) { Ext.Msg.alert('错误','删除时出现未知错误.'); } }); } }) } } //撤销删除 function canceldel(){ historyFlag = "mark"; var m = grid.getSelections(); if(m.length <= 0){ Ext.Msg.alert('信息','<center>请至少选择一行数据!</center>'); }else{ Ext.MessageBox.confirm('确认撤销删除', '你真的要恢复所选行记录吗?', function(btn) { if (btn == 'y
一个学期的计算理论课程已经结束,给我的感觉吧,计算理论是一门计算机不得不学,学了短期又没用,但是可以培养一些逻辑思维的课程。其最关注的问题是什么是可计算性,什么问题可计算,问题之间的映射/归约,计算代价及难易。在分析问题和检验模型计算能力之前需要掌握的工具是形式语言、图灵机等。本文主要对计算理论中的重点进行了总结,总结了一些定理和理解上容易有障碍的知识点,但是里面还有一些点没有提到,比如NFA、DFA的相互转化,CFL和PDA的相互转化,需要书中的题目和证明辅助。
Summary
1. 与自然数集合N等势的集合是可数无穷的,称有穷的or可数无穷的集合是可数的。非可数的集合称作不可数的。
2. DFA( K, Σ, s,F, δ ) ;NFA(K, Σ,s,F,Δ)
3. 每台NFA都有一台等价的DFA(method:find closure)
4. 有穷自动机接受的语言类 = 正则语言类(正则表达式描述的语言类)
5. 正则语言在各种运算下封闭
6. 语言是正则的,iff 其等价语言中有有穷个等价类。
7. DFA状态最小化->寻找等价类(初始等价类F & K-F)
8. CFL(V,Σ,R,S)
9. 存在非正则的CFL
10. 能够生成>=两棵语法分析树的字符串的文法叫做歧义的。
11. PDA M=(K,Σ,Γ,Δ,s,F),Γ为栈符号
12. PDA接受的语言正好是CFL
13. 正则语言(xynz)和CFL(uvnxynz)的泵定理
14. L={anbn}∈CFL,L={anbncn}∉CFL,L={an,n为素数}不是CFL
15. Chomsky范式(CNF):若RÍ(V-Σ)×V2,则称G=(V,Σ,R,S)为Chomsky范式
16. CFG到CNF的转化:
1) 消除长rules
2) 消除空rules(A->e)
3) 消除短rules(A->a or A->B)
17. 对任意CFL G,都可以在多项式时间构造Chomsky范式G’,使得L(G’)=L(G)-(Σ∪{e})
18. 没有chomsky范式能够表示length<2的字符串,所以包含<2的字符串的语言不能转化到chomsky范式。
19. 确定型CFL(确定型PDA接受的语言类)在补下封闭。
20. TM (K,Σ,δ,s,H),注意字母表Σ不包含←和→
21. 若存在TM判定L,则称L是递归的。
22. 如果对于所有w属于Σ*,M(w) = f(w),我们说M计算函数f,若存在TM计算f,则f称为递归的。
23. 半判定语言的TM都不是算法
24. 多带、多带头、双向无穷带or多维带的TM,其判定or半判定的任何语言及任何函数,都分别可用标准TM判定、半判定or计算。
25. 非确定型TM:一个格局可在一步里产生多个其他格局
26. 若非确定型TM M半判定或者判定语言L,或者计算函数f,则存在标准型TM M’半判定or判定L,or计算函数f。
27. 文法是CFG的推广,任何CFG都是文法。G=(V,Σ,R,S)
28. 语言被文法生成iff它是r.e.的。
29. 所有数值函数都是原始递归的
30. 原始递归函数集是递归可枚举的。
31. 特殊语言/问题:
H = {“M””w”: M在w上停机 }
H1 = {“M”:M在“M”上停机 }
﹁H1 = { w:要么w不是一台TM的编码,
要么w是M的编码,M是一台在”M”上不停机的TM }
H:r.e. ; H1:r.e.; ﹁H1:非r.e. ; 2-SAT∈P; SAT∈NP
32. 没有算法的问题称作不可判定的or不可解的,如TM的停机问题
33. 证明不可判定:从通用图灵机U通过递归函数归约到L,如果L是递归的则U是递归的。
i.e.若L1非递归,并存在L1到L2的归约,则L2也非递归。
递归函数是Turing Computable的。
34. 语言是图灵可枚举的,iff存在枚举它的图灵机。(M通过空格代开始,周期性的经过特殊状态q来枚举L,任意顺序且可重复)
35. 不可判定语言与递归语言互为补集,与r.e.语言有交集。
36. 语言是r.e.,iff它是图灵可枚举的;语言是递归的,iff它是以字典序Turing可枚举的。
37. P在并、连接和补运算下封闭,NP在并、连接运算下封闭。若NP在补下封闭,则NP=P。
38. H = {“M””w”: M在最多2|w|步后停机} ∉ P
39. 所有正则语言和所有CFL都属于P
40. NP问题:
A. 机器角度去定义:被多项式界限非确定型图灵机判定的所有语言的类。
B. 基于verifier的定义:NP问题上建立的非确定机包含两步:
1) 非确定地猜一个解
2) 用