xuziying

四则运算题目生成器

github地址

https://github.com/CN-XUZIYING/gdut

项目成员:许梓莹3218005083,梁小燕3218005081

1.项目要求

实现一个自动生成小学四则运算题目的命令行程序

2.需求

a.使用 -n 参数控制生成题目的个数

b.使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围

c.生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在形如e1− e2的子表达式,那么e1≥ e2。

d.生成的题目中如果存在形如e1÷ e2的子表达式,那么其结果应是真分数。

e.每道题目中出现的运算符个数不超过3个。

f.程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。例如,23 + 45 = 和45 + 23 = 是重复的题目,6 × 8 = 和8 × 6 = 也是重复的题目。3+(2+1)和1+2+3这两个题目是重复的,由于+是左结合的,1+2+3等价于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重复的两道题,因为1+2+3等价于(1+2)+3,而3+2+1等价于(3+2)+1,它们之间不能通过有限次交换变成同一个题目。

生成的题目存入执行程序的当前目录下的Exercises.txt文件

g.在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件

h.程序应能支持一万道题目的生成。

i.程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计

3.PHP表

 

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

 60

 159

· Estimate

· 估计这个任务需要多少时间

 60

 159

Development

开发

 1770

 2166

· Analysis

· 需求分析 (包括学习新技术)

235

 409

· Design Spec

· 生成设计文档

 25

 8

· Design Review

· 设计复审 (和同事审核设计文档)

 15

 25

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

 25

 22

· Design

· 具体设计

 60

 30

· Coding

· 具体编码

 1260

 1602

· Code Review

· 代码复审

 30

 10

· Test

· 测试(自我测试,修改代码,提交修改)

 120

60

Reporting

报告

 120

 117

· Test Report

· 测试报告

 60

 33

· Size Measurement

· 计算工作量

 30

 10

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

 30

 74

合计

 

 1950

 2442

4.各功能测试

a.生成题目及答案

 

 

 

 

 

 b.投影答案

 

 

 

 

c.校对答案

 

 

 

 

d.下载

 

 

 

 

5.主要代码

 

 1 <!DOCTYPE html>
 2 <!DOCTYPE html>
 3 <html>
 4 <head>
 5     <title>四则运算生成器</title>
 6     <meta charset="utf-8">
 7     <link rel="stylesheet" type="text/css" href="index.css">
 8     <script src="index.js"></script>
 9 </head>
10 <body>
11     <div class="site-header">
12         <p>软件工程结对项目</p>
13     </div>
14     <div class="box"></div>
15     <div class="premises">
16         <div class="premises-content1">
17         <p>题目数量:<input type="txt" name="subject" id="subject" placeholder="如:10"></p>
18         <p>题目范围:<input type="txt" name="range" id="range" placeholder="如:20"></p>
19         <button class="premises-submit" onclick="start()">确定</button>
20         </div>
21     </div>
22     <div class="content">
23         <p>生成题目内容如下:</p>
24         <div class="question">
25             <ul id="question-text">
26 
27             </ul>
28 
29         </div>
30         <div class="answer">
31             <ul id="answer-text">
32                 <li>点击下方功能键查看答案</li>
33             </ul>
34         </div>
35 
36     </div>
37     <div class="content2">
38         
39         <a class="change"><button class="bleft" onclick="marking()">自动批改</button></a>
40         <a class="change"><button class="bleft2" onclick="downloadQuestion()">下载题目</button></a>
41         <a class="change"><button class="bright2" onclick="donloadAnswer()">下载答案</button></a>
42         <a class="change"><button class="bright" onclick="showAnswer()">查看完整答案</button></a>
43     </div>
44     <div id="Right">
45         <p>点击批改可查看正确题数<p>
46     </div>
47     <div id="Fault">
48         <p>点击批改可查看错误题数</p>
49     </div>
50 
51 </body>
52 </html>
html
*{
    margin: 0;
    padding: 0;
    
}
body{
    min-width:1000px;
    background-image: linear-gradient(to bottom right ,#eaafc8,#654ea3);
}
.site-header{
    width:100%;
    text-align: center;
    background-color:#ffffff;
    padding:1rem;
    color: #654ea3;
    font-weight:bold;
    position:fixed;
    font-family: "STCaiyun";
    font-size:1.5rem;
}
.box{
    height:3.56rem;

}
.premises{
    font-family: "楷体";
    background-color:#654ea3;
    /*background-image: linear-gradient(to bottom right, #9cbdb3 , #37b8e9);*/

}

.premises-content1{
    padding-top:1rem;
    text-align:center;
    width:20rem;
    margin:0 auto;
    line-height:3rem;
    color:#ffffff;
}
.premises-content1 button{
    height:2rem;
    width:5rem;
    border-radius:5px;
    border:none;
    background-color:#ffffff; 
    color:#654ea3;
    text-align:center;
    text-decoration:none;
    cursor:pointer;
    font-weight:bold;
    outline:none;
}
.premises-content1 button:hover{
    background-color:black;
    color:#ffffff;

}



.premises-content1 input{
    border:1px solid #ccc;
    padding:7px 0px;
    padding-left:0.3rem;
    border-radius:3px;
}
.content{
    width:60%;
    height:38rem;
    margin:0 auto;
    line-height:2rem;
    padding-top:2rem;
}
.question{
    float:left;
    background-color:#ececec;
    height:35rem;
    width: 50%;
    box-shadow:-2px 3px 5px 0px gray;
    
    padding-left: 2rem;
    overflow:auto;
}
.question input{
    border:none;
    border-bottom:1px solid black;
    background:transparent;
    outline:medium;
    padding-left:1rem;
    text-align:center;
    font-size:1.2rem;
    width:7rem;


}
.answer{
    float:right;
    background-color:#ececec;
    height:35rem;
    width:38%;
    box-shadow:2px 3px 5px 0px gray;
    padding-left:2rem;
    overflow:auto;
}
.content ul{
    list-style:none;
}
.content2{
    width:30rem;
    margin:0 auto;
    height:3rem;
    transform:translateX(25%);
    
}
.content2 button{
    height:2rem;
    width:auto;
    border-radius:5px;
    border:none;
    background-color:#ffffff; 
    color:#654ea3;
    text-align:center;
    text-decoration:none;
    cursor:pointer;
    font-weight:bold;
    padding:0.5rem;
    display:block;
    outline:none;

}
.content2 button:hover{
    background-color:black;
    color:#ffffff;
}
.bleft{

    float:left;
}
.bleft2{
    float:left;
    margin-left:1rem;
}
.bright2{
    float:right;
    margin-left:1rem;
}

.bright{

    float:right;
}
#Right{
    width:80%;
    height:5rem;
    margin:0 auto;
    border:1px solid gray;
    padding-left: 2rem;
    padding-top:1rem;
    overflow:auto;
    background-color:#ffffff;
    opacity:0.4;
}
#Fault{
    width:80%;
    height:5rem;
    margin:0 auto;
    border:1px solid gray;
    padding-left: 2rem;
    padding-top:1rem;
    background-color:#ffffff;
    opacity:0.4;
    margin-bottom:5rem;
    overflow:auto;

}
css
  1 window.sign=0;
  2 
  3 
  4 function start() {
  5     quesitonsHtmlArr = new Array();//所有题目字段,可用于下载
  6     answerHtmlArr = new Array();//字符串,页面备用
  7     answerSign=0;
  8 
  9 
 10     subject = document.getElementById("subject").value;     //题目数
 11     range = document.getElementById("range").value;     //数字范围
 12     
 13     if(subject == 0 || subject < 0 || subject >10000 ) {alert("请输入正确题目数量,不大于10000道");return; }
 14     if(range == 0 || range < 0) {alert("请输入正确题目范围");return; }
 15     sign=1;
 16 
 17     s = new Array();   //存数字
 18         for (s_i = 0; s_i <= subject; s_i++) {
 19             s [s_i] = new Array();
 20             for (s_j = 0; s_j <= 4; s_j++) {  //s_j==1-4时,存运算数
 21                 s[s_i][s_j] = 1;
 22 
 23             }
 24         }
 25     arr = new Array();  //存字符串
 26         for (arr_i = 0; arr_i <= subject; arr_i++) {
 27             arr [arr_i] = new Array();
 28             for (arr_j = 0; arr_j <= 4; arr_j++) { //arr_j==0时存运算符个数,arr_j==1-3时存入运算符,arr_j==4时存入结果
 29                 arr[arr_i][arr_j] = \'\';
 30             }
 31         }
 32     problem = new Array();    //存储整道题目,用于打印和计算结果
 33 
 34     i = 1;  //第几号题目
 35     while(i <= subject){
 36         pro();
 37         if (conform()){
 38             console.log(\'第\'+i+\'题: \');
 39             console.log(problem[i]+" = " + arr[i][4].toString());
 40             quesitonsHtmlArr += (\'<li>\' + \'第\' + i + \'题: \' + problem[i].toString() + \' = \' + "<input class=\'userA\' type=\'text\'/>"  + \'</li>\' );
 41             i++;
 42         }
 43     }
 44     document.getElementById("question-text").innerHTML = quesitonsHtmlArr;
 45 }
 46 
 47 
 48 function conform() {
 49     var ci = 1;
 50     Queue = polish();   //Queue是一个全局队列,将会用于计算后缀表达式
 51     sum = workPolish();    //sum此时暂存未化简的结果
 52     sum = huajian(sum);    //sum此时是化简后的分数
 53     if (sum == "#") {
 54         return 0;
 55     }
 56     if (sum != "#" ){
 57         arr[i][4] = sum;
 58         for(ci = 1; ci < i; ci++){
 59             if (arr[ci][4].toString()==arr[i][4].toString()) {     //与ci题结果相同
 60                 if (arr[ci][0]==arr[i][0]) {      //运算符个数也相同
 61                     var str_a = "";     //存入ci题所有运算符
 62                     var str_b = "";     //存入ci题所有运算数
 63                     switch (arr[i][0]) {
 64                         case 1:   //一个运算符
 65                             str_b = s[ci][1].toString() + s[ci][2].toString();
 66                             if( arr[ci][1]==arr[i][1] && str_b.indexOf(s[i][1].toString())!=-1 )   //运算符和运算数也相同
 67                                 return 0;
 68                             break;
 69                         case 2:
 70                             str_a = arr[ci][1] + arr[ci][2];
 71                             str_b = s[ci][1].toString() + s[ci][2].toString() + s[ci][3].toString();
 72                             if( str_a.indexOf(arr[i][1])!=-1 && str_a.indexOf(arr[i][2])!=-1
 73                                 && str_b.indexOf(s[i][1].toString())!=-1 && str_b.indexOf(s[i][2].toString())!=-1 && str_b.indexOf(s[i][3].toString())!=-1 )
 74                                 return 0;
 75                             break;
 76                         case 3:
 77                             str_a = arr[ci][1] + arr[ci][2] + arr[ci][3];
 78                             str_b = s[ci][1].toString() + s[ci][2].toString() + s[ci][3].toString() + s[ci][4].toString();
 79                             if( str_a.indexOf(arr[i][1])!=-1 && str_a.indexOf(arr[i][2])!=-1 && str_a.indexOf(arr[i][3])!=-1
 80                                 && str_b.indexOf(s[i][1].toString())!=-1 && str_b.indexOf(s[i][2].toString())!=-1 && str_b.indexOf(s[i][3].toString())!=-1 && str_b.indexOf(s[i][4].toString())!=-1 )
 81                                 return 0;
 82                             break;
 83                     }//end switch
 84                 }
 85             }
 86         }
 87         return 1;
 88     }//end if
 89 }
 90 
 91 
 92 
 93 function polish() {      //中缀转后缀
 94     var str_p = problem[i].toString(); //中缀表达式转字符串
 95     var middleArr = str_p.split(\'\');   //中缀表达式转数组
 96     var opStack = [];   //运算符栈
 97     var outputQueue = [];   //输出队列,后缀表达式
 98     var pi = 0;
 99     while (pi < middleArr.length) {
100         var ch = middleArr[pi].toString();
101         var out;
102         switch (ch) {
103             case "+":
104             case "-":
105                 if (opStack.length > 0) {   //栈不空
106                     out = opStack.pop();    //取出栈顶元素
107                     if (out != "(") {    //栈顶不是左括号
108                         outputQueue.push(out);  //栈顶元素添加到后缀表达式
109                     }
110                     else {    //栈顶元素是左括号
111                         opStack.push(out);   //把刚刚的栈顶元素放回去
112                     }
113                 }
114                 opStack.push(ch);     //当前运算符进栈
115                 pi++;
116                 break;
117 
118             case "*":
119             case "/":
120                 if (opStack.length > 0) {   //栈不空
121                     out = opStack.pop();    //取出栈顶元素
122                     if (out == "*" || out == "/") {    //栈顶是乘号或除号
123                         outputQueue.push(out);  //栈顶元素添加到后缀表达式
124                     }
125                     else {    //栈顶不是乘号也不是除号
126                         opStack.push(out);   //把刚刚的栈顶元素放回去
127                     }
128                 }
129                 opStack.push(ch);     //当前运算符进栈
130                 pi++;
131                 break;
132 
133             case "(":
134                 opStack.push(ch);
135                 pi++;
136                 break;
137             case ")":
138                 out = opStack.pop();    //取出栈顶元素
139                 while (out != null && out != "(") {    //直到遇到左括号
140                     outputQueue.push(out);  //栈顶元素添加到后缀表达式
141                     out = opStack.pop();
142                 }
143                 pi++;
144                 break;
145 
146             default:    //遇到数字
147                 while ( pi < middleArr.length && (ch >= \'0\' && ch <= \'9\' ) ) {
148                     outputQueue.push(ch);  //直接添加到输出队列
149                     pi++;
150                     if (pi < middleArr.length)
151                         ch = middleArr[pi];
152                 }
153                 outputQueue.push(\' \');  //添加空格作为数值之间的分隔符
154         }//end switch
155 
156     }//end while
157 
158     while (opStack.length != 0){    //已遍历完中缀表达式,若运算符栈不为空
159         out = opStack.pop();    //取出栈顶元素
160         outputQueue.push(out);  //添加到后缀表达式
161     }
162 
163     return outputQueue;
164 
165 }//end polish
166 
167 
168 function workPolish() {    //计算中缀表达式
169     var value = "";     //用于还原运算数
170     var value2= "";
171     var numStack = [];  //运算数栈
172     // var vue = "";
173     while (Queue.length > 0) {
174         var cur = Queue.shift();    //取队头
175         if (cur >= \'0\' && cur <= \'9\' ) {    //遇到数字
176             value = "";
177             while(cur != \' \') { //不是空格
178                 value2 = cur;
179                 value = value + value2;
180                 cur = Queue.shift();    //继续取队头
181             }
182             numStack.push(value.toString());     //压入运算数栈
183         }
184         else if(cur != \' \'){     //出现了运算符,则取出两个运算数
185             var y = numStack.pop();
186             var x = numStack.pop();
187             var vue = worktwo(x, y, cur);
188             numStack.push(vue);
189         }
190     }//end while
191     return numStack;        //这个结果是还没化简的
192 }
193 
194 
195 function worktwo (fir, sec, cur) {
196     if(fir.toString().indexOf(\'/\') == -1 && sec.toString().indexOf(\'/\') == -1) {    //两数都不是分数
197         fir = Number(fir);
198         sec = Number(sec);
199         switch(cur) {
200             case \'+\': return (fir + sec);
201             case \'-\': return (fir - sec);
202             case \'*\': return (fir * sec);
203             case \'/\': return fir + \'/\' + sec;
204         }
205     }
206     else if(fir.toString().indexOf(\'/\') != -1 && sec.toString().indexOf(\'/\') == -1){    //第一个数为分数
207         var fractional = fir.split(\'/\');   //字符串分割成数组  fractional【0】分子/fractional【1】分母
208         switch(cur) {
209             case \'+\': return ( Number(fractional[1]) * Number(sec) + Number(fractional[0]) ) + \'/\' + Number(fractional[1]);
210             case \'-\': return ( Number(fractional[0]) - Number(fractional[1]) * Number(sec) ) + \'/\' + Number(fractional[1]);
211             case \'*\': return ( Number(fractional[0]) * Number(sec) ) + \'/\' + Number(fractional[1]);
212             case \'/\': return Number(fractional[0]) + \'/\' + ( Number(fractional[1]) * Number(sec) );
213         }
214 
215     }
216     else if(fir.toString().indexOf(\'/\') == -1 && sec.toString().indexOf(\'/\') != -1){    //第二个数为分数
217         var fractional = sec.split(\'/\');
218         switch(cur) {
219             case \'+\': return Number(fractional[1]) * Number(fir) + Number(fractional[0]) + \'/\' + Number(fractional[1]);
220             case \'-\': return ( Number(fractional[1]) * Number(fir) - Number(fractional[0]) ) + \'/\' + Number(fractional[1]);
221             case \'*\': return ( Number(fractional[0]) * Number(fir) ) + \'/\' + Number(fractional[1]);
222             case \'/\': return ( Number(fractional[1]) * Number(fir) ) + \'/\' + Number(fractional[0]);
223         }
224     }
225     else if(fir.toString().indexOf(\'/\') != -1 && sec.toString().indexOf(\'/\') != -1){    //两个数都是分数
226         var fractional1 = fir.split(\'/\');
227         var fractional2 = sec.split(\'/\');
228         switch(cur) {
229             case \'+\': return ( Number(fractional2[1]) * Number(fractional1[0]) + Number(fractional2[0]) * Number(fractional1[1]) ) + \'/\' + (Number(fractional1[1]) * Number(fractional2[1]) );
230             case \'-\': return ( Number(fractional1[0]) * Number(fractional2[1]) - Number(fractional2[0]) * Number(fractional1[1]) ) + \'/\' + (Number( fractional1[1]) * Number(fractional2[1]) );
231             case \'*\': return ( Number(fractional1[0]) * Number(fractional2[0]) ) + \'/\' + ( Number(fractional1[1]) * Number(fractional2[1]) );
232             case \'/\': return ( Number(fractional1[0]) * Number(fractional2[1]) ) + \'/\' + ( Number(fractional1[1]) * Number(fractional2[0]) );
233         }
234     }
235 }
236 
237 
238 function factor(fx, fy) {       // 找最大公因数
239     var t = 0;
240     while(fy) {
241         t = fx%fy;    //取余
242         fx = fy;
243         fy = t;
244     }
245     return fx;
246 }
247 
248 
249 function fenShu (a, b, ft) {     // 分数化简 (a为分子,b为分母,mf为最大公因数)
250     if(ft == 1) {         // 最大公因数是1
251         if(a > b) {    // 分子大,则转化为真分式
252             return parseInt(a/b) + \'’\' + a%b + \'/\' + b;
253         }
254         else if(a < b) {      // 分子小
255             return a + \'/\' + b;
256         }
257         //若最大公因数为1,且a==b,那么a=b=1,而b==1这种情况已经在huajian(num)里面解决了,所以这里不写
258     }
259     else {      //最大公因数不是1,eg:a=12, b=18, ft=6
260         var fa = a/ft;
261         var fb = b/ft;
262         if( fb==1) {
263             return fa;
264         }
265         else {      //此时最大公因数是1,回到前面部分,所以这里用递归
266             return fenShu(fa, fb, factor(fa, fb));
267         }
268     }
269 }
270 
271 
272 function huajian(num) {
273     num = num.toString();
274     if (num.indexOf(\'/\') == -1) {       //不是分数
275         if (num >= 0)  return num;
276         else return "#";        //"#"用于标记无效题目
277     }
278     else {          //若是分数,化简
279         var arr = num.split(\'/\');
280         arr[0] = Number(arr[0]);        //分子
281         arr[1] = Number(arr[1]);        //分母
282         if (arr[0] < 0 || arr[1] <= 0)
283             return "#";
284         if (arr[1] == 1)
285             return arr[0];
286         else
287             return fenShu(arr[0], arr[1], factor(arr[0], arr[1]));
288     }
289 }
290 
291 
292 function pro(){
293         var operatorNum = randomNum(1,3);       //题目会使用多少个符号?
294         arr[i][0] = operatorNum;
295         var num = 1, op = 1;
296         while (num <= operatorNum+1 && op <= operatorNum){
297             if (arr[i][op-1] != "/")
298                 s[i][num] = randomNum(0,range);      //生成运算数
299             else
300                 s[i][num] = randomNum(1,range);      //生成运算数
301             arr[i][op] = randomOperator();      //生成运算符
302             num++;
303             op++;
304         }
305         var brack;   //控制括号
306         switch (operatorNum) {//控制括号
307             case 1:
308                 problem[i] = s[i][1] + arr[i][1] + s[i][2];
309                 break;
310             case 2:
311                 brack = randomNum(1,2);
312                 if (brack == 1)
313                     problem[i] = s[i][1] + arr[i][1] + s[i][2] + arr[i][2] +s[i][3];
314                 else
315                     problem[i] = s[i][1] + arr[i][1] + "(" + s[i][2] + arr[i][2] +s[i][3] + ")";
316                 break;
317             case 3:
318                 brack = randomNum(1,5)
319                 if (brack == 1)
320                     problem[i] = s[i][1] + arr[i][1] + s[i][2] + arr[i][2] +s[i][3] + arr[i][3] + s[i][4];
321                 else if (brack == 2)
322                     problem[i] = "(" + s[i][1] + arr[i][1] + s[i][2] + ")" + arr[i][2] +s[i][3] + arr[i][3] + s[i][4];
323                 else if (brack == 3)
324                     problem[i] = s[i][1] + arr[i][1] + "(" + s[i][2] + arr[i][2] +s[i][3] + ")" + arr[i][3] + s[i][4];
325                 else if (brack == 4)
326                     problem[i] = s[i][1] + arr[i][1] + s[i][2] + arr[i][2] + "(" +s[i][3] + arr[i][3] + s[i][4] + ")";
327                 else
328                     problem[i] = s[i][1] + arr[i][1] +"("  + s[i][2] + arr[i][2] +s[i][3] + arr[i][3] + s[i][4] + ")";
329                 break;
330         }//end switch
331     }//end start
332 
333 
334     function randomNum(min,max) {
335         return Math.floor(Math.random() * (max - min + 1) + min);
336     }
337 
338 
339     function randomOperator() {
340         var operator;
341         operator = randomNum(1,4);
342         if (operator == 1)
343             return "+";
344         else if (operator == 2)
345             return "-";
346         else if (operator ==3)
347             return "*";
348         else
349             return "/";
350     }
351 function showAnswer(){
352     if(sign == 0 ){alert("请先出题");return false;}
353     if(answerSign==1){alert("已输出答案,查看上方答案栏");return false;}
354    
355     var j;
356     for(j = 1;j <= subject;j++)
357     {
358         answerHtmlArr += \'<li>\'+ \'第\' + j +\'题:\'+ arr[j][4] +\'</li>\';
359     }
360     document.getElementById(\'answer-text\').innerHTML=answerHtmlArr;
361     
362     answerSign=1;
363 
364 
365 }
366 
367 function marking(){
368     if(sign ==0 ){alert("请先出题");return false;}
369     var j,tureTotal,flaseTotal;
370     var userAnswer=document.getElementsByClassName("userA")
371     userAn = [];
372     trueAnswer = new Array();
373     trueAnswer="<p>正确题号:";
374      flaseAnswer = new Array();
375     flaseAnswer="<p>错误题号:";
376     tureTotal=0;
377     flaseTotal=0;
378 
379 
380     for(j = 1;j <= subject;j++)
381     {
382        if(userAnswer[j-1].value == arr[j][4])
383            { trueAnswer+= j + \',\';tureTotal++;}
384        else
385          { flaseAnswer += j+\',\';flaseTotal++;}
386         userAn[j] = userAnswer[j-1].value;
387 
388     }
389     console.log(userAn);
390     console.log(tureTotal);
391     console.log(flaseTotal);
392     trueAnswer+="</p><h>共"+tureTotal+"题</h>";
393     flaseAnswer+="</p><h>共"+flaseTotal+"题</h>";
394     console.log(trueAnswer);
395     console.log(flaseAnswer);
396     
397     document.getElementById("Right").innerHTML = trueAnswer;
398     document.getElementById("Fault").innerHTML = flaseAnswer;
399         
400 }
401 
402 
403 function downloadQuestion(){
404     if(sign ==0 ){alert("请先出题");return false;}
405     var question = quesitonsHtmlArr.toString();
406     var name = "question.txt";
407     question = question.split("<input class=\'userA\' type=\'text\'/></li>");
408     question = question.join("\n");
409     question = question.split("<li>");
410     question = question.join("");
411 
412     download(name,question)
413 }
414 
415 
416 function donloadAnswer(){
417     if(sign ==0 ){alert("请先出题");return false;}
418     var answer =answerHtmlArr.toString();
419     var name = "answer.txt";
420     answer = answer.split("</li>");
421     answer = answer.join("\n");
422     answer = answer.split("<li>");
423     answer = answer.join("");
424     download(name,answer)
425 }
426 
427 
428 function download(filename, text) {
429     var pom = document.createElement(\'a\');
430     pom.setAttribute(\'href\', \'data:text/plain;charset=utf-8,\' + encodeURIComponent(text));
431     pom.setAttribute(\'download\', filename);
432     if (document.createEvent) {
433         var event = document.createEvent(\'MouseEvents\');
434         event.initEvent(\'click\', true, true);
435         pom.dispatchEvent(event);
436     } else {
437         pom.click();
438     }
439 }
js

6.测试运行

 

 

 

7.项目小结

在这次项目中,我们不仅更加熟悉了html,css javaScript语言的运用,还学习了逆波兰算法,同时也增加了与人合作开发的经验。在完成这个项目的时候遇到了很多不懂的内容,我们提出彼此的想法,互相交流学习进度。而且结对项目让我们互相督促彼此,让两个人更有学习的动力。

 

 

记录自己的学习进度条(每周追加)

第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 90 90 8 8 熟悉fopen语句,git运用
2  320  410 13 21

 js把字符转换成uri下载文件,

熟悉js的语句

发表于 2020-04-01 22:16  XZY+  阅读(416)  评论(0编辑  收藏  举报
 

分类:

技术点:

相关文章: