homework-10
不多不说这是一次神奇的作业,作业一拖再拖,到最后发现。。。。
首先,在一开始的最大字数和问题实现图形界面主要是由我的小伙伴邹同学完成的,所以当我第一次看到说要显示详细运行过程的时候感到很迷茫。
第一感觉,应该写成多线程,然后通过进程间的通信让另外进程来显示运行过程。但是这种情况会产生一个问题,那就是自动运行很难处理。
然后在熊英夫同学的提醒下,觉得可以将所有的过程先存储到一个文件,程序开始运行矩阵生成之后即将程序运行的结果与过程写到该文件中。
但是这还是会有一个问题,那就是数据以什么形式存储呢?因为时间紧迫,所以这部分我就没有再自己设计结构,直接采用了网络上常用的json格式。
初次接触到这个格式是在大二结束的时候做关于数据挖掘方面的东西,所拿到的数据就是以这样的形式存储的,并且python对json的解析非常好。
然后,就是程序编写过程,由于之前已经写过图形界面的最小字数和,所以中间过程的数据很容易就得到,然后以json的格式进行封装就可以了。这时候又碰到
问题,那就是如何将JSON的数据读出来呢?这部分还有javascript的代码,均是参考了余峰伟同学的代码,因为本人对这方面实在是才疏学浅。
将数据从json直接读出来很容易,但是由于作业推荐将结果显示在网页上,这又出现了问题,由于采用了web.py的架构,全局变量的处理很复杂,在之前的作业中就发现了这个
现象,并且没有找到很好的解决办法,所以就采取了别的同学解决这个问题的方法,就是用从网页获取数据的方式将json的数据读出来,即是通过表单的传输。
最后,数据也获得了,需要做的就是将其显示在网页上了,但是我真的是不会写javascript啊!!!虽然是根据小余同学的脚本代码进行的修改,但是也足足让我调试了三个小时。
从一开始找不到js文件,到后来不清楚js的函数返回值,又没有可靠的调试工具,只能通过alert的方式来判断是否进入函数。最后发现,由于有的语句没有执行,js的返回值就会是false,跟我想象中的完全不一样,应该是js内部封装好的函数也是有返回值的,并且js函数的返回值默认应该是最后一条语句。
最后的最后,凑凑合合的写完了,代码覆盖率什么的,稍后再说吧。
代码和截图如下:
import web import string import random import copy import json urls=('/','Index', '/history','Json') render=web.template.render('templates/') class Json: def GET(self): f=open("index.json","r") s=f.read() f.close() return s class Index: def execute(self,f,n,m,h,v): his = [] que = [[-1,0]] maxv = {'sum':f[0][0],'a':0,'b':0,'c':0,'d':0} if h or v: for i in range(0,n): if h: f[i] += f[i] if v: f += [f[i]] M = m if h: M = 2*m N = n if v: N = 2*n for i in range(0,n): p = [0]*M for j in range(i,min(N,i+n)): sumv = 0 que = [[-1,0]] for k in range(0,M): while len(que)>=1 and k-que[0][0]>m: que.pop(0) p[k] += f[j][k] sumv += p[k] nowv = {} nowv['sum'] = sumv-que[0][1] nowv['a'] = i % n nowv['b'] = (que[0][0]+1)%m nowv['c'] = j % n nowv['d'] = k % m if nowv['sum']> maxv['sum']: maxv = copy.deepcopy(nowv) his.append({'max':maxv,'now':nowv}) while len(que)>=1 and que[len(que)-1][1]>sumv: que.pop(len(que)-1) que.append([k,sumv]) f = open("index.json","w") json.dump(his,f) f.close() def GET(self): return render.index(0,0,[[0]],5,5) def POST(self): x=web.input(myfile={}) if x['myfile'].value!='': f = x['myfile'].value f = f.split("\n") n = string.atoi(f[0].replace(",","")) m = string.atoi(f[1].replace(",","")) f = f[2:] f = [[string.atoi(j) for j in i.split(",")] for i in f if i is not ''] else: n=string.atoi(x['hsize']) m=string.atoi(x['lsize']) f=[] for i in range(0,n): f += [[]] for j in range(0,m): f[i].append(random.randint(-100,100)) self.execute(f,n,m,"h" in x,"v" in x) return render.index(n,m,f,n,m) if __name__ == "__main__": app=web.application(urls,globals()) app.run()
var SPEED=0 var NOWB=-1 var set_color = function(i,j,co){ if (co!="" && i<n && j<m){ document.getElementById("table").rows[i].cells[j].style.background = co; } } var set_border = function(i,j,st){ if (st!="" && i<n && j<m){ document.getElementById("table").rows[i].cells[j].style.border = st; } } function get_json(){ alert("1"); var xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET",window.location.href+"history",false); xmlhttp.send(); HIS = eval("(" +xmlhttp.responseText+")"); n = document.getElementById("table").rows.length; m = document.getElementById("table").rows[0].cells.length; return true; } var draw = function(x,w,co,bo){ var i,j,a,b,c,d; a = HIS[x][w]['a']; b = HIS[x][w]['b']; c = HIS[x][w]['c']; d = HIS[x][w]['d']; i = a -1; do{ j = b -1; i = (i + 1)%n; do{ j = (j + 1)%m; set_color(i,j,co); set_border(i,j,bo); }while(j!=d); }while(i!=c); if (NOWB!=-1){ document.getElementById(w).innerHTML = HIS[x][w]['sum']; } } var draw_it = function(){ var i,j; for(i=0;i<n;i++){ for(j=0;j<m;j++){ set_color(i,j,'white'); set_border(i,j,'2px dotted black'); } } if(NOWB>=0){ draw(NOWB,'now',"#AAAAAA",""); draw(NOWB,'max',"","2px solid yellow"); } } } var draw = function(x,w,co,bo){ var i,j,a,b,c,d; a = HIS[x][w]['a']; b = HIS[x][w]['b']; c = HIS[x][w]['c']; d = HIS[x][w]['d']; i = a -1; do{ j = b -1; i = (i + 1)%n; do{ j = (j + 1)%m; set_color(i,j,co); set_border(i,j,bo); }while(j!=d); }while(i!=c); if (NOWB!=-1){ document.getElementById(w).innerHTML = HIS[x][w]['sum']; } } var draw_next = function(){ alert(1); if(NOWB < HIS.length-1){ NOWB += 1; }else{ SPEED = 0; } draw_it(); } var draw_last = function(){ if(NOWB>=0){ NOWB -= 1; } else{ SPEED = 0; } draw_it(); } var auto_go = function(){ if (SPEED>0){ draw_next(); } if (SPEED){ setTimeout("auto_go()",1000/Math.abs(SPEED)); } } var stop = function(){ SPEED = 0; }
![](http://images0.cnblogs.com/blog/568548/201312/15073331-9367a47cd04f46299ccb0a72cdf99fba.jpg)