编程题总结

2024-07-15

编程题总结(共6篇)

篇1:编程题总结

大家必须掌握每种类型的1-3题。

题号考点要求

48、将两个两位数的整数合并成一个整数

65、两个正整数合并成一个整数

71、两个正整数合并成一个整数

77、两个正整数合并成一个整数

81、两个正整数合并成一个整数

84、两个正整数合并成一个整数

87、两个正整数合并成一个整数

91、两个正整数合并成一个整数

8、s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+.....+n)

9、p=m!/(n!*(m-n)!)

26、连加

68、s=1+1/1!+1/2!+1/3!+........70、s=1/(1*2)+1/(2*3)+...+1/(n*(n+1))

76、s=1+0.5*x+(0.5*(0.5-1)*x*x/2!+......86、连加

90、连加

92、连加

93、连加

97、连加

100、连加

(2、)

类似素数或者闰年算法

2、求出1到1000之间能被7或11整除、但不能同时被7和11整除的所有整数,并将他们放在a所指的数组中,通过n返回这些数的个数。

58、求n以内同时能被3与7整除的所有自然数之和的平方根s3、求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。

27、求出1到m之间能被7或11整除的整数,放在数组中,通过n返回这些数的个数

63、求n的所有因子(不包括1与自身)

98、计算n以内能被5或9整除的所有自然数的倒数之和

15、w是大于10的无符号整数,若w是n(n>=2)位的整数,则函数求出w的后n-1位的数作为函数值返回。

24、将数字字符串转化为一个整数

16、对变量中的值保留两位小数,对第三位四舍五入

(3、)

1、一维数组中,将低于平均分的人数作为函数值返回,低于平均分的分数放在below所指的数组中。

82、计算一维数组中n门课程的平均分

96、一维数组中每相邻元素之平均值的平方根之和

28、找出一维数组中最大的值和它所在的下标,两者通过形参返回

7、求出数组的最大元素在数组中下标并存放在k所指的存贮单元中。

43、从num个字符串中找出最长的一个字符串,并通过形参指针传回

39、移动数组中的内容,前p个数移动到数组后面

40、移动数组中的内容,前m个字符移动到后面

5、将大于整数m且紧靠m的k个素数存入xx所指的数组中。

20、求出小于变量m的所有素数并放在一个数组中

51、将大于1小于m的非素数存入xx所指数组中,个数通过形参返回

99、计算3到n之间所有素数的平方根之和

29、将字符串中下标为奇数位置上的字母转化为大写

47、字符串中所有下标为奇数的字母转为大写

31、将字符串中除了下标为偶数、同时ASCII码也为偶数的字符外,其余的全都删除;串中剩余字符放在t字符串中

32、除了下标为奇数、同时ASCII码也为奇数的字符外,其余的全都删除;串中剩余字符放在t字符串中

49、将字符串中下标为偶数且ASCII码为奇数的字符删除

19、从字符串中删除指定字符

64、将字符串中ASCII值为奇数的字符删除,剩余字符放在t所指字符串中

72、将字符串中下标为偶数的字符删除

78、字符串中ASCII为偶数的字符删除

35、删除字符串中所有空格

6、删除一个字符串中指定下标的字符。

60、删去一维有序数组中所有相同的数,使之只剩一个

33、删除字符串中尾部*号,使不超过n个

36、把字符串中的前导*号全部移到字符串尾部

45、删除字符串中前导和尾部的*号

56、字符串中,除了尾部*号外,字符串中其余*号全部删除

73、删除字符串中除了前导和尾部*号外的所有*号

83、字符串中尾部*号删除

88、字符串中除了前导*外,删除其余*号

94、字符串中,前导*号全部删除

95、字符串中前导*号不得多于n个

66、删除字符串中所有*号

(4、)

17、字符串内容逆置

23、判断字符串是否为回文

25、比较两个字符串的长度(不能用strlen)

52、实现两个字符串连接

59、将字符串数组中的字符串依次合并到一个字符串中

21、字符串中字符按降序排列(选择法排序)

4、统计在tt字符串中“a”到“z”26个字母各自出现的次数,并依次放在pp所指数组中。

38、求出字符串中指定字符的个数

44、统计长度为2的字符串在另一个字符串出现的次数

62、统计一行字符串中单词个数

11、二维数组构成矩阵,使数组左下半三角元素中的值全部置成042、二维数组,将右上半角元素中的值乘以m80、二维数组中左下半三角中元素中的值乘以312、求出数组周边元素的平均值

14、求出二维数组周边元素之和

18、矩阵行列互换

53、矩阵B=A+A130、求出二维数组中最大元素的值,此值返回给调用函数

55、M行N列的二维数组中的数据,按行的顺序依次放到一维数组中

41、将二维数组中的字符,按列的顺序依次放到一个字符串中

75、二维数组中数按列的顺序放到一维数组中

13、求出二维数组每列中最小元素,并依次放在pp所指一维数组中

37、结构体数组(学号、8门成绩、平均成绩),求出每个学生的平均成绩

34、把结构体数组(学号、成绩)中分数最高的学生放到h数组中,函数返回人数

74、把结构体数组(学号、成绩)中分数最低的学生数据放在h所指数组中

50、结构体数组(学号、成绩),找出成绩最高的学生记录,通过形参返回

54、结构体数组(学号、成绩),低于平均分的学生数据放在b所指数组中

89、结构体数组(学号、成绩),高于等于平均分的学生人数通过形参返回

57、结构体数组(学号、姓名),把指定范围内的学生数据放在所指数组中

67、结构体数组(学号、成绩)返回指定学号的学生数据(查找)

46、结构体数组(学号、成绩),按分数降序排列(选择法排序)

22、链表结构中,找出数值最大的结点,并由函数值返回

85、链表中,求出平均成绩

10、迭代法求方程的实根

61、统计各年龄段人数(建议采用if else)

69、递归函数

篇2:编程题总结

(1)进程是运行中的程序,拥有自己独立的内存空间和资源;

(2)一个进程可以有一个或多个线程组成,且至少有一个线程称为主线程;(3)线程是最小的处理单位,多个线程共享一块内存和资源;

(4)当一个线程改变了所属进程的变量时,其它线程下次访问该变量时得到这种改变。简述什么是多线程。

线程的最主要功能是多任务处理,即多线程。多线程也就是在主线程中有多个线程在运行,多个线程的执行是并发的,在逻辑上“同时”,而不管是不是物理上的“同时”。

多线程和传统上的单线程在程序设计上的区别在于: 由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,由此带来的线程调度、同步等问题是需要重点留意的。

引入线程的优点: 充分利用CPU资源。2简化编程模型。

3简化异步事件处理。4使GUI更有效率。5节约成本 线程状态:

Thread和Runnable区别:

(1)Thread是类,具有线程的所有方法,其对象就是一个线程对象。但继承Thread,就不能再继承其他的类(Java只支持单一继承)。

(2)Runnable是接口,只提供run()方法。实现该接口的类还可以继承其他类,但其对象不是线程对象,不能直接运行,必须通过Thread将其启动。通过Runnable接口创建线程的步骤如下:

1、实例化实现Runnable接口的类;

2、建立一个Thread对象,并将第一步实例化后的对象作为参数传入Thread类的构造方法;

3、通过Thread类的start()方法建立线程。线程优先级:

(1)线程的优先级代表该线程的重要程度。

(2)当有多个线程同时处于可执行状态并等待获得CPU时间时,线程调度系统根据各个线程的优先级来决定CPU分配时间。

(3)优先级高的线程有更大的机会获得CPU时间。

(4)线程的默认优先级值:Thread.NORM_PRIORITY,值为5。每个新线程均继承创建线程的优先级。setPriority()设置线程优先级。

值为MIN_PRIORITY(1)和MAX_PRIORITY(10)之间的值。getPriority()获取线程的优先级值。线程通信:

(1)线程通信的方法:wait()、notify()和notifyAll()(2)调用notify()方法时可以随机选择一个在该对象调用wait()方法的线程,解除它的阻 塞。

(3)调用notifyAll()方法可以唤醒等待该对象的所有线程。但唤醒时无法控制唤醒哪个线程,唤醒过程完全由系统来控制。

(4)notify()方法和notifyAll()方法只能在同步方法或同步块内部使用。产生死锁的原因主要是:

所谓死锁,是指两个或多个线程都在等待对方释放对象资源而进入的一种不可“调节”的状态。

1、因为系统资源不足;

2、进程运行推进的顺序不合适;

3、资源分配不当等。

如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。wait()方法区别于sleep()方法的是:

(1)wait()方法调用时会释放对象锁,而sleep()方法不会(2)sleep()使当前线程进入停滞状态(阻塞当前线程),让出CPU的使用(3)sleep()是Thread类的Static(静态)的方法;(4)wait()方法是Object类里的方法;wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程。

(5)wait()必须放在synchronized block中,否则会在运行时扔出”java.lang.IllegalMonitorStateException“异常。

通信协议指网络中传递、管理信息的一些规范。TCP/IP协议,IPX/SPX协议,NetBEUI协议等。

TCP/IP协议

IP协议:网络层协议,保证计算机之间发送和接收数据,能适应各种网络硬件。无连接,不可靠的协议。

TCP协议:端对端的协议,端与端之间建立连接、发送、接收数据以及终止连接。利用重发技术和拥塞控制机制,向应用程序提供可靠通信连接。

区别与联系:IP协议只保证计算机能发送和接受分组数据,而TCP协议则可提供一个可靠的、可流控的、全双工的信息流传输服务。两个协议统称为TCP/IP协议。

A类地址:0-126,默认掩码:255.0.0.0。B类地址:128-191,默认掩码:255.255。C类地址:192-223,默认掩码:255.255.255.0。D类地址:广播地址,E类地址保留。

常用端口以及对应的服务 7:Echo服务端口

21:FTP服务端口

23:Telnet服务端口 25:SMTP服务端口 80:HTTP服务端口 网络API:

(1)Java中有关网络方面的功能都定义在java.net包中。(2)使用InetAddress类封装IP地址和域名

(3)URL由四部分组成。协议名:指明获取资源所使用的传输协议。主机名:指定获取资源的域名。端口:指定服务的端口。文件路径:指定访问的文件名以及路径。URLConnection类:

(1)通过URL的方法openStream()只能从网络上读取数据,如果如要输出数据,就要用到URLConnection类。(2)URLConnection是个抽象类,代表与URL指定的数据源的动态连接。

(3)URLConnection类提供比URL类更强的服务器交互控制,允许用Post或者Put和其他HTTP请求方法将数据送回服务器。Socket的工作步骤:

1根据指定的地址和端口创建一个Socket对象。

2调用getInputStream()方法或getOutputStream()方法打开连接到Socket的输入/输出流。3客户端与服务器根据一定的协议交互,直到关闭连接。4关闭客户端的Socket。ServerSocket的工作步骤:

1根据指定端口创建一个新的ServerSocket对象。

2调用ServerSocket的accept()方法,在指定的端口监听到来的连接。Accpet()一直处于阻塞状态,知道有客户端试图建立连接。这时accpet()方法返回连接客户端与服务器的Socket对象。

3调用getInputStream()方法或getOutputStream()方法打开连接到Socket的输入/输出流。

4服务器与客户端根据一定的协议交互,直到关闭连接。

5关闭服务器端的Socket。6回到第2步,继续监听下一次的连接。多线程Socket通信实现:

服务器总是在指定的端口监听是否有客户端请求,一旦监听到客户请求,服务器就会启动一个专门的服务线程来响应客户请求,而服务器本身在启动完线程之后马上有进入监听状态,等待下一个客户的到来。synchronized两种使用方式:

1.修饰方法,使调用该方法的线程均能获得该对象的锁。2.放在代码块中,修饰对象,当前代码获得对象的锁。。锁定的是对象,而不是方法或代码块。

Swing的结构:

(1)Swing组件位于javax.swing包中,javax是一个Java扩展包。(2)在javax.swing包中,定义了两种类型的组件:

顶层容器(不包含在其他容器中的容器,JFrame,JApplet,JDialog和Jwindow 4个)和轻量级组件。

Swing组件都是AWT的Container类的直接子类和间接子类。布局:

(1)用来管理组件在容器中的布局格式。

(2)FlowLayout, BorderLayout, GridLayout和CardLayout四种。位于java.awt包中。(3)FlowLayout流布局一般用来安排面板中的按钮。它使得按钮呈水平放置,直到同一条线上再也没有适合的按钮。线的对齐方式由align属性确定。(4)BorderLayout边界布局,JFrame的默认布局。

(5)GridLayout网格布局,类似于表格,按照行列排列所有组件,每个单元格大小一样。添加组件使,按照从左至右,自上而下的顺序加入。

(6)CardLayout卡片布局,将加入到容器的组件看作一叠卡片,只能看到最上面的组件 常用的事件类:

java.awt.event包中常用的事件类:

ActionEvent, AdjustmentEvent, ItemEvent, FocusEvent, KeyEvent, MouseEvent, WindowEvent。java.awt.event包中常用的监听接口:

ActionListener,AdjustmentListener, ItemListener, FocusListener, KeyListener, MouseListener, WindowListener。适配器:

(1)扩展监听接口时,有些事件处理方法是不需要的,但必须重写。

(2)出于简化代码的目的,java.awt.event包中提供了一个抽象适配器类,分别实现每个具有多个事件处理方法的监听接口。

(3)继承适配器后,可以仅重写需要的事件处理方法。事件处理的步骤:

1创建监听类,监听类中,事件处理方法中编写事件处理代码 2创建监听对像。

3利用组件的addXXXListener()方法将监听对象注册到组件上 3者区别联系:

监听类:是一个扩展监听接口的类,可以扩展一个或多个监听接口。

事件处理方法:是监听接口中已经定义好的相应的事件处理方法,要重写。监听对象:是监听类的一个实例对象,具有监听功能。

事件用于实现用户界面的交互,是GUI编程的重要组成部分。Java最新的事件处理方法是基于委派事件模型的。

事件包含3个组件:事件对象、事件源和事件处理程序。

事件是一个描述事件源状态改变的对象,不是通过new 创建的,而是由用户操作触发的。一个事件源可能会生成不同类型的事件。可以将一个事件发送到多个监听器对象。

监听类是实现监听接口的类,监听对象是监听类的实例化对象 在组件中注册监听器的方法是:addXxxxListener()。适配器是实现相关监听接口的类,目的是简化程序代码 创建菜单的步骤:

1创建一个JMenuBar菜单栏对象,将其设置到窗体中。

2创建若干个JMenu菜单对象,将其放置到JMenuBar对象中,或按要求放到其他JMenu对象中。

3创建若干个JMenuItem菜单项对中,将其放置到对应的JMenu对象中。JPopupMenu:弹出式菜单 位置不固定、无标题

(JDialog类)模式对话框:必须首先对该对话框进行响应(单击“确定”或“取消”)后,才能对对话框以外的应用程序进行操时;

无模式对话框:可以不响应对话框,对其以外的程序进行操作。JTable类--表格模型 TableModel:

TableModel本身是个接口,若要实现此接口建立表格非常复杂,因此Java提供了两个类实现了TableModel接口:(1)AbstractTableModel:抽象类,实现了大部分的TableModel方法。AbstractTableModel 类 对 TableModel 接口中大部分方法提供部分实现,它关注监听器的管理,并生成TableModeEvents 事件,以及把他们发送到监听器提供方便。

(2)DefaultTableModel:继承AbstractTableModel,是默认的表格模型类。

(3)要创建一个TableModel,可以简单扩展AbstractTableModel类并且至少实现下列三 个方法 public int getRowCount()、public int getColumnCount()、public Object getValueAt(int row,int column)使用JDBC访问数据库的基本步骤:

1加载JDBC驱动程序(Class.forName(“oracle.jdbc.driver.OracleDriver”);)。2建立数据库连接(Class.forName(“oracle.jdbc.driver.OracleDriver”);Connection conn = DriverManager.getConnection(“jdbc:oracle:thin:@localhost:1521:orcl”, “scott”, “tiger”);)。3创建Statement对象 4执行SQL语句。5 处理返回结果。6 关闭创建的对象 Statement中3个执行方法的不同:

(1)execute():用于执行返回多个结果集、多个更新计数或二者的混合。(2)executeUpdate():用于执行insert、update、delete语句及SQl DDL语句。插、更、删效果是修改表中的行或列,返回值一个整数,即影响行数。对于建立、删除返回值为0。(3)executeQuery():用于产生单个结果集的语句,例如select语句。事务的ACID特性:

数据库中的操作通常是一个独立单元,事务是构成单一逻辑单位的操作集合。已提交事务是指成功执行完毕的事务,未能成功完成的事务成为中止事务,对中止事务造成的变更需要进行撤销处理,成为事务回滚。原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durabilily)。

保存点: 集元数据: 集元数据 Meta Data,是有关数据库和表格结构的信息,如数据库的表、表的列、表的索引、数据类型、对SQL的支持程度等信息。DatabaseMetaData接口

(1)主要用来得到数据库的信息,如:数据库中所有表格的列表、系统函数、关键字、数据库产品名和数据库支持的JDBC驱动名。

(2)通过Connection.getMetaData()方法创建。(3)主要提供了两大类方法:

1.返回类型boolean的,用于检查数据库或驱动器是否支持某项功能。2.用于获取数据库或驱动器本身的某些特征值。

通过Statement实现静态SQL查询

使用PreparedStatement实现动态SQL查询 使用CallableStatement实现存储过程的调用

DatabaseMetaData接口用于得到关于数据库的信息 ResultSetMetaData接口主要用来获取结果集的结构 JDBC默认的事务提交模式是自动提交

通过setAutoCommit()方法控制自动提交模式,使用rollback()方法实现事务回滚 开发RMI--步骤: 定义远程接口。2 实现远程接口。3 编写和实现远程服务类。4 编写客户端程序 RMI机制原理:

2个独立程序。服务器端、客户端 服务器端:(1)创建多个远程对象,(2)调用注册服务程序使得名字与远程对象关联,使得这些远程对象能够被引用,(3)等待客户端调用这些远程对象的方法。客户端:

(1)在服务器上的注册服务程序中用远程对象名称查找一个或者多个远程对象的引用,(2)调用远程对象的方法。

JOptionPane类中四种对话框的静态方法

1消息对话框(showmessagedialog)2输入对话框(input)3确认对话框(Option)4选项对话框(Confirm)Locale常用定义:

Locale类是用来标识本地化消息的重要工具类。该类包含对主要地理区域的地域化特征的封装。通过设定Locale为特定的国家或地区,提供符合当地文化习惯的字体、图标和表达格式。

简述java异常处理机制 :

java提供了两种处理异常的机制:一是捕获异常,二是声明抛出异常.在java运行过程中系统得到一个异常对象时,它会沿着方法的调用栈逐层回溯,寻找处理这个异常的代码,找到后,系统把当前异常对象教给这个方法处理,这就是捕获异常.如果方法中不知道如何处理所出现的异常,则可在定义方法时,声明抛出异常.使用JDBC查询Scott用户的emp表中的所有信息? String sql=“select * from emp”;PreparedStatement stmt =conn.prepareStatement(sql);ResultSet rs = stmt.executeQuery();int columnCount = rs.getMetaData().getColumnCount();//这地方补充了一下 while(rs.next()){ for(int i = 1;i <= columnCount;i++){ System.out.println(md.getColumnName(i)+ “--” + rs.getObject(i));} } JDBC API的三个组成部分: 1 JDBC驱动程序管理器 2 JDBC驱动程序测试包 3 JDBC-OCBC桥

加载JDBC驱动程序中加载驱动程序的一种简单方法是使用Class.forName方法显示加载: Class.forName(“DriverName”);对于JDBC/ODBC桥,加载JDBC-ODBC数据库驱动程序的方法为: Class.forName(“sun.jdnc.odbc.JdbcOdbcDriver”);而对于Oracle数据库,加载数据库驱动程序的方法为: Class.forName(“oracle.jdbc.driver.OracleDriver”);对于Oracle驱动连接的是URL是:

Jdbc:oracle:thin:@serverName:port:instance 通过Oracle驱动获得数据库连接的实力语句:

Class.forName(“oracle.jdbc.driver.OracleDriver”);Connection conn = DriverManager.getConnection(“jdbc:oracle:thin:@localhost:1521:orcl”,”scott”,”tiger”);

多线程Socket通信中多个while循环是用来监听的。

TableModel本身是一个借口,若是要直接实现此接口来建立表格是非常复杂的,因此java中还提供了AbstractTableModel和DefaultTableModel这两个类分别实现TableModel接口。ListSelecyionModel接口中的常量:

static final int SINGLE_SELECTION 单一选择模式 static final int SINGLE_INTERVAL_SELECTION 连续区间选择模式 static final int MULTIPLE_INTERVAL_SELECTION 多重选择模式

简述实现一个自定义的对话框的步骤?

(1)继承JDialog类,在构造方法中传入参数(2)在对话框中添加用户界面组件(3)添加事件处理(4)设置对话框大小

什么是检查型异常,非检查型异常

检查型异常:指编译器要求必须处置的异常,是程序运行时由于外界因素造成的一般性异常 非检查型异常:指编译器不要求强制处理的异常,该异常是因设计或实现方式不当导致的,可以避免这种异常的发生.简述一下使用泛型有什么优点?

答:泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

2.简要描述ArrayList,Vector,LinkedList的存储性能和特性? 答:ArrayList支持可随需要而调整的动态数组。其内部封装了一个动态再分配的Object[]数组。每个ArrayList对象有一个capacity,表示存储列表中元素的数组的容量。当元素添加到ArrayList时,它的capacity自动增加。在向一个ArrayList对象添加大量元素的程序中,可使用ensureCapacity()方法增加Capacity,此法可以减少或增加重分配的数量。Vector 由于使用了synchronized 方法(线程安全),通常性能上较ArrayList 差,而LinkedList 使用双向链表实现存储,按序号索引数据需要进 行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。3.简述Collection和Collections的区别。

答:java.util.Collection 是一个集合接口集合接口集合接口集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态静态静态静态多 态方法多态方法多态方法多态方法。此类不能实例化不能实例化不能实例化不能实例化,就像一个工具类个工具类个工具类个工具类,服务于Java的Collection框架。Java代码。

4、List、Map和Set三个接口,存取元素时,各有什么特点? 答:List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

5、描述HashMap和Hashtable的区别。答:Hashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containKey()方法来区别这两种情况。

6、简述序列化和反序列化概念?

对象的序列化就是把对象写入到一个输出流中,对象的反序列化是指从一个输入流中读取一个对象。

7、简述适配器与监听接口的区别?

区别:适配器只需要重写需要的事件处理方法,而监听接口需要实现全部的方法。

监听接口中定义了抽象的事件处理方法,这些方法针对不同的操作进行不同的处理。在程序中,通常使用监听类实现监听接口中的事件处理方法。监听接口定义在java.awt.event包中,该包中提供了不同事件的监听接口,这些接口中定义了不同的抽象的事件处理方法。扩展监听接口时,有些事件处理方法是不需要的,但必须重写。

篇3:自动阅卷系统中编程题的解决方法

在现代教学中,计算机课程的阅卷系统越来越多,从Office应用到各种高级编程语言都有,不过计算机本身的智能化程度不高,主要是按照事先设定好的程序运行的,所以在批改选择题时非常有优势,速度快,准确率高,但对主观程度比较高的,如完善程序,特别是编写程序,很多阅卷系统还解决得不够好,而编程题恰恰又是计算机编程语言课程考试的常见题型。

选择题的实现已经非常成熟,本文不再讨论。填空、简答、论述等题型也有了各种解决方法,虽然效果还不是很理想,但技术也是在不断进步的,这部分也不是本文要讨论的。本文以VBA为例,主要讨论主观性很强且会有多种不同答案但结果又都正确的完善程序和编写程序两种题型的阅卷方法。

●完善程序题

1. 一般的解决方法

完善程序题其实是填空题的一种,但里面填写的是程序的代码,下面就是一个完善程序的例子。

题目:从大到小输入3个数,如不符合要求则显示“输入不符合要求”,在空白处填入程序代码完善程序(如图1)。

一般的阅卷程序都在用枚举答案的方法,如将可以想到的x>y And y>z和y<x And z<x等答案和学生的答案进行比较,如果相符则判对,否则扣分。但其实这道题目还有很多其他答案也是正确的,如y<x And x>z和x>y And z<x,甚至也会有学生写成Not x<=y And Not y<=z和Not(x<=y Or y<=z)等答案。枚举是一种方法,但只适应于答案非常单一的题目,因此建议尽量不使用。下面笔者将介绍一种代入法,将学生的答案代入到阅卷系统中,根据生成的表达式结果来判定答案是否正确。

2. 代入法

代入法就是将学生写的答案代入到事先编写好的程序中进行验证,图2中的函数t15就是为上题编写的验证函数,其中的参数x、y、z为输入的三个数,s Expression为获得的学生编写的答案。在t15函数中的第三行,就是On Error和Exit Function之间是一个空行,学生的代码将代入到这里。

那么如何在一个程序中动态地插入一行代码并运行呢?这里要用到m o d u l e对象中的Proc Start Line属性和Replace Line方法。Proc Start Line属性是指返回一个值,该值标识指定的过程的起始行。Replace Line方法是指在标准模块中替换指定行。下面给出代入法的代码,如图3。

其中:(1)s c o r e是模块的名称。(2)s Expression="t15="&"Not x<=y And Not x<=y"是将学生的答案存储在s Expression中。最终s Expression中存放的是“t15=Not x<=y And Not y<=z”,这样如果“Not x<=y And Not y<=z”计算正确,则函数t15返回值为true,否则返回false。(3)line Num=md.Proc Start Line("t15",vbext_pk_Proc)+3得到要将s Expression代入到t15函数的位置。(4)md.Replace Line line Num,s Expression的功能是进行替换。将s Expression代入到t15函数中。(5)Msg Box(IIf(t15(5,4,3,s Expression),"得分","不得分"))调用代入了学生答案的t15函数,得到结果。

3. 注意事项

上述代码中给出的making()过程是一个演示程序,其中的"Notx<=y And Not y<=z"为学生编写的答案,应该是从学生的答案中提取,而不是像本例中这样直接写出来。另外对答案的处理使用了代码Msg Box(IIf(t15(5,4,3,s Expression),"得分","不得分")),对于结果只是进行了显示,在实际应用中应该是将结果写入到学生的成绩表中。而且在函数t15(5,4,3,s Expression)中使了5,4,3为测试参数,应该按照软件测试的方法给出测试数据,多次调用t15函数进行验证。

●编程题

编程题是主观性非常强的题目,每位学生的答案都有可能不一样,如果根据学生每句代码是怎么编写的给分是不现实的,所以好的解决方法是根据结果给分。具体方法是将学生的答案写入到一个文件中,然后阅卷系统读取该文件中的内容,判断答案是否正确。

将答案写入文件的代码如图4所示,其中"answer.dat"为答案文件名,t Anwser是学生的答案。

在具体实现时可以采用两种方法,一种是事先为学生搭建好程序的框架,上面的文件输出代码写在最后,要求学生不能修改已有的代码,完成编码后需运行代码。还有一种方法就是利用Module.Insert Lines(Line,String)方法将文件输出代码插入到学生编写的代码的后面来输出答案。

●结论

本文提出了准确评判学生编写的程序的方法,解决了程序设计上机考试中主观题评判不够准确的问题。提供的方法简单、容易实现,大大提高了判卷的准确性。这里还需要特别说明的是,学生编写的表达式或代码会有错误,所以在代码中一定要使用on error代码来对可能的错误进行处理,以保证阅卷的顺利进行。

参考文献

[1]李翠霞,谭营军,孔金生.基于马氏距离的文本聚类算法在自动阅卷系统中的应用[J].计算机应用与软件,2015,32(4):80-82.

[2]田甜,张振国.主观题自动阅卷技术研究[J].计算机工程与设计,2010(16):3697-3699.

[3]周松.Visual FoxP ro上机操作考试自动阅卷系统的设计与实现[J].淮海工学院学报,2004,12(2):22-24.

[4]刘凌波,刘苏淮.基于Excel深层应用的考试和阅卷系统[J].软件工程师,2015(3):3-5.

篇4:编程题总结

【摘要】本系统主要研究C语言编程题目中“编译运行结果对比”、“编译错误原因恢复与评阅”、“得分点分割正则动态测试”三种手段,将研究内容运用到自动阅卷系统中,实现对编程题目的自动评分,并实现基于J2EE技术的具有在线考试、自动评分等功能的C语言编程题目自动阅卷考试系统,提高阅卷的准确度的同时能够节省大量的人力物力财力。

【关键词】C语言;编程题;自动评分

随着计算机技术的发展以及互联网的普及,办公自动化已无处不在。作为一门基础课程,C语言考试应用系统也给批阅试卷的工作人员带来了很大的工作量,自上世纪六十年代起,国内外就陆续出现了许多关于语言类课程考试的软件系统,虽然很多已具有基本的随机答卷、上机考试及自动评阅等功能,但只针对客观题,因自然语言的刻画、人工智能、模式识别等核心技术发展缓慢,制约了编程题目阅卷系统研究发展。所以,本系统针对C语言编程题目进行整体规划,致力于做出更精确的C语言编程题自动阅卷的方法,填补自动阅卷软件开发空白,减少人工操作的资源浪费。

1.系统运行环境

智能C语言考试系统、自动评分系统的运行环境是根据我校现有的教学机房的硬件环境(每个机房有70台学生机和一台教师机)规划的,教师端和学生端都采用window 7操作系统,每个机房都采用校园公共网络提供的局域网,运用Myeclipse开发环境、MySQL数据库建立一套具有在线考试、自动评分等功能的C语言编程题目自动阅卷系统,并辅以AJAX技术,确定了用FreeMarker表现层技术增强用户与系统间的交互,加快系统运行效率,同时,尽可能细化评分点,增加准确性。

2.系统运行模式的选择

系统采用B/S三层架构模式,系统的用户可通过Internet网络,客户端不需要手动安装软件,只要有浏览器就可以对系统进行访问和一般操作,本次对阅卷系统主要分析了的C语言编程题目评分功能,充分考虑到系统对灵活性和准确性的要求,并保证安全性的前提下,本系统采用B/S结构以达到轻客户端需求。

3.系统研究内容

通过研究C语言程序结构,从编译原理角度设计评价模型,通过内部运行编译器对比动态运行结果,并且本课题创造性提出利用关键字对比、控制结构判断和正则表达式匹配三种静态测试技术作为结果比对方案的补充,既保证了程序判断的正确性,又确保了相对公正性。

编译结果对比要实现程序内部对C语言编译器的动态调用技术,通过比对测试结果和标准答案进行评分,对于不能编译部分,研究关键字库建立、控制结构规范化和正则表达式建立的具体方案。

其中重点研究C语言编程题目评分标准的两个方面:一是如何检验运行结果的正确性,二是如何评价程序代码包含的分点。

为突出本系统对主观题的评分机制,在试题主观题程序可运行以及不可运行的情况下分别给出了相应的评分策略,以此来一步步细化评分机制。

4.评分核心模块设计

详细设计自动阅卷系统中的关键技术——程序题评分。系统首先采用动态测试技术,编译运行待评价程序,和标准答案进行对比给出分数;需要数值型输入参数的程序,通过均匀分布随机数给出随机输入;需要字符型输入参数的程序,首先在数据库中保存预选文字段,然后随机选取其中的一部分给出随机输入。对于编译运行报错的程序代码,课题会采取错误恢复技术,通过编译信息给出的错误位置尝试以标准答案修复代码,从而给出扣分点。最后对于不能编译运行的代码片段,系统提出关键字对比、控制结构标准化和提取、正则表达式规则匹配相结合的静态测试方法,加入权重处理,分析得分点给出更全面客观的评分结果。

通过对软件模式的对比和分层架构模型的研究,系统拟采用B/S结构,方便用户在线答题和管理操作;在具体实现技术方面,拟采用J2EE技术和SSH开源框架——利用Java语言提供的公开接口开发调用C语言编译器模块和正则表达式匹配模块,利用MySQL数据库完成题库和答案库的建立和开发工作,利用Ajax技术提高系统的整体响应速率,利用FreeMarker表现层技术增强用户与系统之间的交互。

建立计算机矫正机制和完善的评价方案,并对试题多次进行人工阅卷与机器阅卷的对比测试。

5.数据库设计

因需要评测本系统自动阅卷功能和人工阅卷的准确度,给出测评结果,并对仍存在的问题和不足提出进一步改进方案;特别是对系统不能正常评分的特殊题目,建立特例题库,以便在今后的工作进行研究并从中提出新的解决方案。

考生提交试卷首先由c语言编译器自动编译后生成可执行文件并运行输出结果,进行评阅步骤校验结果时,通过试题编号(id)调用试题表数据,对比答案进行准确性校对,调用纠错参考库数据,比对出错原因并根据错因扣除相应分数,通过模糊匹配替代出错关键字,迭代匹配错因至无错,若迭代五次还未改正视为崩溃性错误,不可弥补,判定本段分数为零崩溃性错误,不可弥补,判定本段分数为零,通过题目编号获取相应评分关键点库,通过正则表达式匹配得分点,通过得分点数量给出相应分数,完成试卷评阅。

当程序不能正常编译运行时,系统判定进入系统纠错,系统自动运行修复性算法,代码中个别关键字错误,为此我们把c语言中所有的关键字整理出来,建立关键字库,对错误的关键字进行模糊匹配,通过字符的顺序、相同字符的数量、键盘键位的keycode尽可能的匹配出相似度最高的的关键字替换错误的关键字。

纠错主要是语句拼写错误,我们分了下面三种情况:

1)测试用例由测试输入数据和与之对应的预期输出结果组成,人们常用白盒法和黑盒法设计测试用例,其中白盒法主要是为了检查是否有数据结构或外部数据库访问错误等,对比通过单元测试的模块或组件、编程规范、集成测试来检查测试的准确性。

通过正误判断匹配正误判断表进行结果判定,判定结果是否符合题目,若是则给分,否则进行结果范围判断及结果属性判断,比对结果是否适用本题范围,并进行分数评估。

2)本表主要有三个主要信息id、name、keyword。分别用来存储错误的id、错误的名称、题目中的关键字。Id的数据类型为int(整型),name的数据类型为varchar(字符型),keyword的数据类型为varchar(字符型),id需要主键非空自增,name与keyword非空。通过建立本数据库表可以实现对错误信息的收集归类,同时可以实现判断系统中出现的错误的功能。

定位捕捉错误点,抛出错误原因并与数据库进行比对,并根据错因给予相应分数,运用模糊匹配寻找替代关键词,进行替代继续检查错误,若连续替代五次后仍然不能进行下一步骤视为程序崩溃行错误,不可弥补,判定本段分数为零。

3)正则表达式,又称正规表示法、常规表示法(英语:RegularExpression,在代码中常简写为regex、regexp或RE),正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,在本字段里,正则表达式通常被用来检索、替换那些符合模式的程序段,进行分步得分。

本数据库包含关键字类库,通过正则表达式匹配关键词多寡,大概率的确定了答题者的思路范围及答题思路的正确与否,给以步骤分,极大的提高了批卷的人性化,拉近了机器阅卷与人工阅卷的阅卷水平,更有说明行的体现了机器阅卷更好的使用性。

C语言考试系统已普遍在各高校使用,对于客观题方面,有了相对完善公平的系统,但是在自动评分方面,还有很多不足之处,有待改善,本系统就是针对这一空白区域,设计公平而相对更准确的算法,主要对C语言考试系统中的编程题部分进行得分点分割,对考生的程序一步步细致分析,做到该得分的地方给考生相应的分数,这样避免了某一点小错误导致的大幅度扣分的不公平性,同时,将系统应用到学生的日常学习中后,能够更好地检验教师的教学成果,查找教学过程中需要注意的地方,对于学生,也能够更好地发现自己的错误,及时改正,这样,在学习的过程中,在保证公平的前提下,培养学生注意细节的习惯,最重要的是,应用到高校的二级C语言考试后,能够更好的给考生更公平更合理的考试成绩,同时也使得阅卷更加节约、方便、快捷,这也顺应了如今社会计算机行业的飞速发展,提高办公自动化的程度及效率。

参考文献

[1]K.A.Redish,W.F.Smyth.Pragram style analysis:a natural by-product of prograrn compilation[J].Cornnnunications of the ACM,1986.(3):126-133.

[2]Yasuhiro Ajiro,KazunoriUeda.Kima:An Automated Error Correction System for Concurrent Logic Progrrams.Automated Software Engineering 2002.9(2):67-94.

[3]王甜甜,基于语义相似度的编程题自动评分方法的研究,哈尔滨工业大学硕士论文,2001;1-52.

[4]李永浩,居于程序理解的编程题自动评分系统愤愤研究与应用,哈尔滨工业大学硕士论文,2001:1-60

[5]王华东.刘国柱.基于局域网下C语言考试系统的设计与实现[J].计算机与信息技术,2006.

篇5:笔试编程设计题

三、编程题:30 分 共 1 题

注意:要求提供完整代码,如果可以编译运行酌情加分,

1. 求符合指定规则的数。

给定函数 d(n) = n + n 的各位之和,n 为正整数,如 d(78) = 78+7+8=93。 这样这个函数可以看成一个生成器,如 93 可以看成由 78 生成。

定义数 A:数 A 找不到一个数 B 可以由 d(B)=A,即 A 不能由其他数生成。现在要写程序,找出 1 至 10000 里的`所有符合数 A 定义的数。

输出:

1

3

四、设计题:35 分 共 1 题

注意:请尽可能详细描述你的数据结构、系统架构、设计思路等。建议多写一些伪代码或者流程说明,

1. 假设一个 mp3 搜索引擎收录了 2^24 首歌曲,并记录了可收听这些歌曲的 2^30 条 URL,但每首歌的 URL 不超过 2^10 个。系统会定期检查这些 URL,如果一个 URL 不可用则不出现在搜索结果中。现在歌曲名和 URL 分别通过整型的 SONG_ID 和 URL_ID 唯一确定。对该系统有如下需求:

1) 通过 SONG_ID 搜索一首歌的 URL_ID,给出 URL_ID 计数和列表

2) 给定一个 SONG_ID,为其添加一个新的 URL_ID

3) 添加一个新的 SONG_ID

4) 给定一个 URL_ID,将其置为不可用

限制条件:内存占用不超过 1G,单个文件大小不超过 2G,一个目录下的文件数不超过 128 个。

篇6:编程题总结

1.类成员指针

Class test

{

Public:

Int fun(int)const;

Int fun(int);

Static int fun(int);

Int iTemp;

}

1.1非静态成员函数指针定义:

int(Test::*pFun)(int)= &Test::fun;

int(Test::*pFunConst)(int)const = &Test::fun;

使用:

Test a;

const Test b;

(a.*pFun)(2)或(a.*pFunConst)(2);

(b.*pFunConst)(2);

不能用(b.*pFun)(2);

1.2非静态成员变量int Test::*pInt = &Test::iTemp;

(a.*pInt)= 3;

1.3静态成员函数指针int(*pFun)()= &Test::fun;

或 int(*pFun)()= Test::fun;都正确;(注:定义无域操作符)使用:

(*pFun)()或 pFun()都正确;

2.非成员函数指针和静态成员函数一致。

3.非成员函数和静态成员函数上不允许修饰符。例如 void fun()const;void fun()volatile;但非静态 成员函数允许const、volatile等修饰符。

4.变量修饰符

auto:指定数据存储在栈中。局部变量默认为auto。该修饰符不能用于成员变量和全局变量。

static: 局部变量表示存储在静态空间,全局变量表示不允许外部引用。

volatile:表示该变量可能随时改变,不要做任何假设优化。

mutale: 去除成员变量的const属性。

extern:全局变量默认为extern属性,表示可被外部引用,此时与static相对。

extern int a =2;表示定义一个可被外部引用的变量。

extern int a;表示引用外部变量。

5.数据类型隐式转换

短数据->长数据(eg: float-> double)

有符号->无符号(eg: int-> unsigned int)PS: 所以 int(-1)>unsigned int(1);

低精度->高精度(eg: int-> float)

6.memcpy 有“防重叠”覆盖机制,strcpy 没有。

7.float表示

共计32位,折合4字节

由最高到最低位分别是第31、30、29、……、0位

31位是 符号位,1表示该数为负,0反之。

30-23位,一共8位是指数位。

22-0位,一共23位是尾数位。

每 8位分为一组,分成4组,分别是A组、B组、C组、D组。

每一组是一个字节,在内存中逆序存储,即:DCBA

8.不能在类的声明中初始化类常量,而只能在构造函数初始化列表来初始化

9.类中的枚举常量不占用对象的存储空间

10.有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。

11.赋值函数,应当用“引用传递”的方式返回String 对象。如果用“值传递”的方式,虽然功能仍然正确,但由于return 语句要把 *this 拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,降低了赋值函数的效率。

12.对于非内部数据类型的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。如果用free 释放“new 创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete 释放“malloc 申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。

13.如果用new 创建对象数组,那么只能使用对象的无参数构造函数,delete时如果对象没有析构函数,则delete和delete[]是功能相同的。

14.只能靠参数而不能靠返回值类型的不同来区分重载函数。编译器根据参数为每个重载函数产生不同的内部标识符。并不是两个函数的名字相同就能构成重载。全局函 数和类的成员函数同名不算重载,因为函数的作用域不同。

15.关键字inline

必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。定义在类声明之中的成员函数将自动地成为内联函数。

以下情况不宜使用内联:

(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。

(2)如果函数体 内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。

16.只有静态常量整型数据成员才可以在类中初始化,普通成员只能在初始化列表或函数内初始化,常量成员只能在初始化列表。成员对象初始化的次序完全不受它们在 初始化表中次序的影响,只由成员对象在类中声明的次序决定。

17.拷贝构造函数和赋值函数非常容易混淆,常导致错写、错用。拷贝构造函数是在对象被创建时调用的,而赋值函数只能被已经存在了的对象调用。

18.不想编写拷贝构造函数和赋值函数,又不允许别人使用编译器生成的,则只需将拷贝构造函数和赋值函数声明为私有函数,不用编写代码。

19.“const T”和“T const”总是都被允许的,而且是等效的。

注意在常量指针(const pointer)中,“const”永远出现在“*”之后。

例如:

int *const p1 = q;//指向int 变量的常量指针

int const* p2 = q;//指向int 常量的指针

const int* p3 = q;//指向int 常量的指针

20.一个常见的微妙问题是,一个函数风格的宏并不遵守函数参数传递的规则。

21.没有引用数组,但可有指向数组的引用,并且保留数组的边界。

22.左值拥有保存值的位置,而右值则没有相关地址,只是简单值。

23.负索引是可以的,如p[-2]或(-2)[p]都是可以的(p必然不能是数组名),但必须保持不越界。

sum=p()+q()+r();不能保证p(),q(),r()调用的顺序。

逗号运算符“,”可以保证求值顺序.result=(p(),q(),r());是先求p(),q(),然后将r()赋给result

24.在if的条件里声明变量,且可在真假分支里面使用。

const int * const * p;p是个指针,指向常指针的,常指针指向一个常量int。

25.不能用空白初始化列表来规定默认的对象初始化.class a;

a A();//会警告,看起来像函数声明

a *p=new a();//ok

a *p=new a;//ok

26.可以写一句只有数字的代码,如1234;(void)0;可以编译执行,相当于nop。

27.给函数指针赋值时可以对函数名取地址也可以不取,通过函数指针调用函数时可以用*也可不用。

28.static_cast可以转换基本数据类型(int->char)、void*和有类型指针、基类和派生类指针的转换(多重继承也行,它可重新计算偏移地址),但是不能转换如(int*->char*等)。

29.dynamic_cast主要用于执行“安全的向下转型”,reinterpret_cast可执行任何转换,const_cast执行去 const转换。

30.将取地址运算符用到完全限定的类成员名(包括变量和函数),就能获得指向成员的地址。使用形式为“X::*”来声明一个指向类X成员的指针。注意声明成员 函数指针的时候不能像普通函数指针可以省略&或*的使用,但静态成员函数则除外,它和普通函数一致。成员指针和普通指针不一样,并非指向一个内存 区域,而是相当于一个结构的偏移量,当它和具体的对象结合就能指向特定对象的特定成员。

31.当把派生类对象赋给基类对象的时候会产生切割现象,即针对派生类的数据和行为将产生切割。

32.多维数组的第1个元素是数组而非普通类型。

33.在含有单参数构造函数的类中注意隐式转换。如String s=“Hello”;

34.函数对象是重载函数调用运算符的类对象。

35.引用需要用左值进行初始化,但指向常量的引用除外,编译器将创建一个临时左值。如const int c=12;//ok 一般情况下编译器产生的临时对象的生命期在它所在的最大表达式范围内,但用临时对象初始化常量对象的引用时会让编译器保证临时对象和引用生命周期一样。

36.可以将基类的成员指针(变量或函数)安全的转换为指向派生类成员的指针,但反之则不安全。

37.函数参数的传递是采用拷贝构造函数而非赋值操作。对未初始化的对象赋值可能会出现意外,如类中含有未初始化指针。

38.声明但不定义私有的拷贝构造和赋值运算将会关闭类的复制操作。并且赋值运算、拷贝构造函数和析构函数不会被继承,对派生类重载赋值运算时需要调用基类的赋 值运算。

39.在构造函数里对成员变量初始化,比较好的方式是使用初始化列表。在初始化列表中静态成员和数组不能被初始化。

类的初始化顺序是虚拟基类的成员->非虚基类成员->类自身成员,和初始化列表的顺序无关。含有虚拟基类和不含的类在成员布局上不一样,含有虚拟基类的类将虚拟基类的数据放在最后面。另外如B:virtual A,C:virtual A,D:B,C;(均是虚继承)则D的构造函数将对A初始化一次(即使在初始化列表没有显式初始化A),B,C将不再对A初始化。

所有静态数据(全局变量和静态存储变量)在使用前如未初始化其值都为0.全局变量可以存储在静态初始化区和未初始化区。

40.RVO返回值优化,是指在函数返回中执行拷贝初始化到直接初始化(使用带非对象参数的构造函数)的转换,NRV和RVO类似,但使用命名局部变量来保存返 回值。p160

41.重载、覆盖和隐藏的区别

重载的特征:在同一个类,函数名相同,参数不同,virtual可有可无。

覆盖的特征:在两个类(基类和派生类),函数名和参数都相同,且必须有virtual关键字。

隐藏的特征:基类函数名和派生类函数名相同参数不同,且不管是否有关键字。或函数名、参数均相同,但基类 函数没有virtual(有的话就是覆盖)。

不能覆盖而只能隐藏基类非虚函数。

42.相同类型的所有对象公用一个虚函数表,在单继承下不管有多少个虚函数都只有一个虚函数表指针。覆盖就是在为派生类构造虚函数表时用派生类的函数地址替换基 类成员函数地址的过程。

43.使用常量类成员可能在对类对象赋值的时候产生问题。

上一篇:中考作文常用100字下一篇:初中作文我和爸爸抢电视