大山中学软件工程中级实训阶段1
Vi,Java,Ant和Junit的自学报告
1. Vi自学报告
目录
什么是vi/vim?
引用菜鸟教程里面的定义:
所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。
但是目前我们使用比较多的是 vim 编辑器。
vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。
Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。
连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个程序开发工具而不是文字处理软件。
我个人感觉vim就相当于
windows系统下的记事本应用的程序员edition
比记事本添加了代码高亮补全编译及错误跳转的功能
vi/vim的模式切换
vi/vim有三种模式
分别是命令模式(Command mode)
输入模式(Insert mode)
和底线命令模式(Last line mode)
转换如下图:
命令模式
一启动vi/vim就进入命令模式
此时在键盘上做出的任何输入操作都会被识别为命令
而非输入字符
常用命令:
- i 切换到输入模式
- x 删除当前光标所在处的字符
- : 切换到底线命令模式
输入模式
输入模式就是可以任意编辑内容
使用ESC键退出输入模式切换到命令模式
底线命令模式
底线命令模式可以在最底下输入单个或多个字符的命令
可用命令非常多
基本命令有:
- q 退出程序
- w 保存文件
按ESC键退出底线命令模式
如何使用Vi/Vim创建/打开文件
例如:创建文件test.txt,如果文件已经存在则打开文件,进入命令模式
vim test.txt
我个人认为Vi/Vim掌握模式的切换和如何创建打开文件就好啦
其他花里胡哨的功能感觉我根本用不上
不会的时候再上网查吧
而且我不喜欢用Vi/Vim
文本编辑器不香吗
2. Java自学报告
之前有选过Java的专选课
现在我只需要回顾一下基本的知识点就好了
第一阶段涉及到的知识点有
基本操作例如输出System.out.println();(如果不要换行就去掉ln)
图形GUI的使用,包括JFrame、JLabel、JButton等等等等的使用
界面布局,我使用了GridLayout布局,最规规矩矩方方正正的那个
事件处理addActionListener()
还有类的名字一定要跟文件名字一样,String首字母要大写等等各种小细节
首先是经典之HelloWorld
public class helloworld {
static public String str;
public static void main(String[] args)
{
helloworld h=new helloworld();
System.out.println(str);
}
public helloworld()
{
str="Hello World!";
}
String get()
{
return str;
}
}
至于为什么不直接使用
System.out.println("Hello World!");
因为等会要用Junit检查
其次是要做一个超级朴素的计算器
只可以用来计算12对2的加减乘除
一眼看上去虽然无从下手
但是一旦对GUI相关知识点有了解就很容易实现
我看了几篇博客站在了巨人的肩膀上
就恍然大悟
下面是我自己缝合的实现
package calculator;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.*;
import java.awt.GridLayout;
import java.awt.event.*;
import java.awt.Font;
public class calculator extends JFrame{
private JFrame frame= new JFrame("Calculator");
private JTextField one = new JTextField("12");
private JLabel two = new JLabel("", JTextField.CENTER);
private JTextField three = new JTextField("2");
private JTextField four = new JTextField("=");
private JLabel five = new JLabel("", JTextField.CENTER);
private JButton six = new JButton("+");
private JButton seven = new JButton("-");
private JButton eight = new JButton("*");
private JButton nine = new JButton("/");
private JButton ten = new JButton("=");
public void init()
{
frame.setLayout(new GridLayout(2, 5, 5, 5));
one.setHorizontalAlignment(JTextField.CENTER);
three.setHorizontalAlignment(JTextField.CENTER);
four.setHorizontalAlignment(JTextField.CENTER);
one.setFont(new Font("宋体",Font.BOLD,30));
two.setFont(new Font("宋体",Font.BOLD,30));
three.setFont(new Font("宋体",Font.BOLD,30));
four.setFont(new Font("宋体",Font.BOLD,30));
five.setFont(new Font("宋体",Font.BOLD,30));
six.setFont(new Font("宋体",Font.BOLD,40));
seven.setFont(new Font("宋体",Font.BOLD,40));
eight.setFont(new Font("宋体",Font.BOLD,40));
nine.setFont(new Font("宋体",Font.BOLD,40));
ten.setFont(new Font("宋体",Font.BOLD,40));
frame.add(one);
frame.add(two);
frame.add(three);
frame.add(four);
frame.add(five);
frame.add(six);
frame.add(seven);
frame.add(eight);
frame.add(nine);
frame.add(ten);
six.addActionListener(new Operation());
seven.addActionListener(new Operation());
eight.addActionListener(new Operation());
nine.addActionListener(new Operation());
ten.addActionListener(new Equal());
frame.setSize(400, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private class Operation implements ActionListener{
public void actionPerformed(ActionEvent e)
{
JButton temp = (JButton)e.getSource();
two.setText(temp.getText());
}
}
private class Equal implements ActionListener{
public void actionPerformed(ActionEvent e)
{
try{
int number1 = Integer.parseInt("12");
int number2 = Integer.parseInt("2");
if(two.getText().equals("+"))
{
five.setText(number1+number2+"");
}
else if(two.getText().equals("-"))
{
five.setText(number1-number2+"");
}
else if(two.getText().equals("*"))
{
five.setText(number1*number2+"");
}
else if(two.getText().equals("/"))
{
five.setText(number1/number2+"");
}
}
catch(Exception err){
five.setText("Wrong!");
}
}
}
public static void main(String[] args)
{
calculator temp=new calculator();
temp.init();
}
}
跑起来是这样一种效果,看起来不太聪明的样子
固定内容的“12”“2”“=”使用了JTextField
内容可变的两个区域使用的是JLabel
下面五个按钮使用的是JButton
在JFrame里面使用了GridLayout布局
前四个按钮的事件都只是直接把符号投射到上方第二个框框里
只有等号按钮的事件才是计算结果并输出到右上方的框框
时间不够,别的功能就不实现了
3. Ant学习报告
Ant给我感觉就像是初级实训的时候c艹的Makefile
真痛苦
短时间内要搞清楚大概原理并且编一个出来也太难了
从网上找来了教程
1.< project >标签
每个构建文件对应一个项目。标签时构建文件的根标签。它可以有多个内在属性,就如代码中所示,其各个属性的含义分别如下。
(1) default表示默认的运行目标,这个属性是必须的。
(2) basedir表示项目的基准目录。
(3) name表示项目名。
(4) description表示项目的描述。
每个构建文件都对应于一个项目,但是大型项目经常包含大量的子项目,每一个子项目都可以有自己的构建文件。
2.< target >标签
一个项目标签下可以有一个或多个target标签。一个target标签可以依赖其他的target标签。例如,有一个target用于编译程序,另一个target用于声称可执行文件。在生成可执行文件之前必须先编译该文件,因策可执行文件的target依赖于编译程序的target。Target的所有属性如下。
(1) name表示标明,这个属性是必须的。
(2) depends表示依赖的目标。
(3) if表示仅当属性设置时才执行。
(4) unless表示当属性没有设置时才执行。
(5) description表示项目的描述。
Ant的depends属性指定了target的执行顺序。Ant会依照depends属性中target出现顺序依次执行每个target。在执行之前,首先需要执行它所依赖的target。程序中的名为run的target的depends属性compile,而名为compile的target的depends属性是prepare,所以这几个target执行的顺序是prepare->compile->run。一个target只能被执行一次,即使有多个target依赖于它。如果没有if或unless属性,target总会被执行。
3.< mkdir >标签
该标签用于创建一个目录,它有一个属性dir用来指定所创建的目录名,其代码如下:通过以上代码就创建了一个目录,这个目录已经被前面的property标签所指定。
4.< jar >标签
该标签用来生成一个JAR文件,其属性如下。
(1) destfile表示JAR文件名。
(2) basedir表示被归档的文件名。
(3) includes表示别归档的文件模式。
(4) exchudes表示被排除的文件模式。
5.< javac >标签
该标签用于编译一个或一组java文件,其属性如下:
(1).srcdir表示源程序的目录。
(2).destdir表示class文件的输出目录。
(3).include表示被编译的文件的模式。
(4).excludes表示被排除的文件的模式。
(5).classpath表示所使用的类路径。
(6).debug表示包含的调试信息。
(7).optimize表示是否使用优化。
(8).verbose 表示提供详细的输出信息。
(9).fileonerror表示当碰到错误就自动停止。
6.< java >标签
该标签用来执行编译生成的.class文件,其属性如下。
(1).classname 表示将执行的类名。
(2).jar表示包含该类的JAR文件名。
(3).classpath所表示用到的类路径。
(4).fork表示在一个新的虚拟机中运行该类。
(5).failonerror表示当出现错误时自动停止。
(6).output 表示输出文件。
(7).append表示追加或者覆盖默认文件。
稍微学了一下,之后就赶鸭子上架,站在巨人的肩膀上缝合尝试编译HelloWorld
<?xml version="1.0" encoding="gbk" ?>
<!--工程的名字是HelloWorld-->
<project name="HelloWorld" default="run" basedir=".">
<!-- 定义资源,包括源文件目录,目标文件目录,和jar文件 -->
<property name="src" value="src"/>
<property name="dest" value="classes"/>
<property name="hello_jar" value="hello.jar"/>
<!-- 定义第一个目标:初始化,新建目标文件目录 -->
<target name="init">
<mkdir dir="${dest}"/>
</target>
<!-- 定义第二个目标:编译源文件,把产品放入dest -->
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${dest}"/>
</target>
<!-- 定义第三个目标:构件jar文件,目标文件为hello_jar指定的文件名 -->
<target name="build" depends="compile">
<jar jarfile="${hello_jar}" basedir="${dest}"/>
</target>
<!-- 定义最后一个目标:运行文件 -->
<target name="run" depends="build">
<java classname="helloworld" classpath="${hello_jar}"/>
</target>
</project>
输入命令ant编译成功
4. Junit学习报告
JUnit是一个Java语言的单元测试框架.
引用百度百科的解释
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestJCase类,就可以用Junit进行自动测试了。
这次只要测试Hello World比较简单
那我只要判断它的输出到底是不是“Hello World!”就好了
编写代码testhw.java
import org.junit.Assert;
import org.junit.Test;
public class testhw {
public helloworld h=new helloworld();
@Test public void Test() {
Assert.assertEquals("Hello World!", h.get());
}
}
跑的使用发现给的环境有问题
重新下载了一个Junit-4.10.jar
和代码放在同一个文件夹里
执行命令
javac -classpath .:junit-4.10.jar testhw.java
java -classpath .:junit-4.10.jar -ea org.junit.runner.JUnitCore testhw
跑起来了
编写JUnit有一点点原则需要遵循
测试方法上必须使用@Test进行修饰
测试方法必须使用public void 进行修饰,不能带任何的参数
建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开
测试类所在的包名应该和被测试类所在的包名保持一致
测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖
测试类使用Test作为类名的后缀(不是必须)
测试方法使用test作为方法名的前缀(不是必须)
5. 总结
顶多半天的任务量
一天半的时间都在配环境
以及尝试解决莫名其妙的问题
黑人问号打满
在大家互帮互助和站在巨人肩膀的基础上也算是顺利完成了
可喜可贺