对于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}}); //重新加载一下
checkboxvar 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) 用