文档库 最新最全的文档下载
当前位置:文档库 › 程序调试与11程序填空

程序调试与11程序填空

程序调试与11程序填空
程序调试与11程序填空

java程序设计二级等级考复习资料(习题集)

程序调试题

下列程序都有三个错误, 按题中的要求,纠正错误并调试程序,程序中语句前的#1、#2、……是附加的行号(用于讲解),不是程序内容。

一、复习题解析

(一)语法错误调试题

1.下面的应用程序用于计算两个整数之和,正确的应用程序执行后输出的结果如下所示:

C:\> java test2_1(能用集成环境调试的尽量用集成环境,此处为书写方便)

The sum is: 75

#1public class test2_1

#2 /* A program to add two numbers together */

#3 public static void pain(String[] args) {

#4 int a = 23;

#5 int b = 52;

#6 int c = sum(a, b);

#7 System.out.println("The sum is: " + c);

#8 }

#9 public int sum(int a, int b) {

#10 return a + b;

#11 }

#12 }

答:#1 public class test2_1{

#3 public static void main(String[] args) {

#9 public static int sum(int a, int b) {

【解析】类的声明中规定,类体必须用一对大括号括起来,因此在第1行类名后加一左大括号;第3行main方法名写错,需纠正;由于main方法是类方法,其中调用的方法也必须是类方法,因此第9行的方法声明中加入static。

2.下面的应用程序执行时会发生错误,正确的应用程序执行后输出的结果如下所示:

运行结果如下:

C:\> java test2_2

4 foods

14 televisions 10 foods

#1 public class test2_2 {

#2 public void main(String[] args) { #3 Item t1 =Item("food"); #4 System.out.println(t1); #5 Item t2 = new Item("television"); #6 System.out.println(t2); #7 t2.setValue(10); #8 System.out.println(t1); #9 } #10 }

#11 class Item { #12 private name; #13 private static int value = 0; #14 public Item(String theName) { #15 name = theName; #16 value = value + theName.length(); #17 } #18 public void setValue(int newValue) { #19 value = newValue; #20 } #21 public String toString() { #22 return value + " " + name + "s"; #23 } #24 }

答:#2 public static void main(String[] args) {

#3 Item t1 = new Item("food"); #12 private String name;

【解析】java 应用程序中main 方法是程序执行的入口,规定该方法必须是static 方法,因此对第2行进行修改;第3行在实例化对象t1时应通过new 运算符来完成;第12行声明成员变量时,应明确变量类型,根据上下文判断应为String 型。

(二)语法错误与逻辑错误调试题

3.下面的应用程序通过近似计算公式

)

12)(12()2(75653431222

222+-?

???????=n n n π

求得圆周率。n的取值由该公式所得到的数值与3.1415926的差值小于0.00001决定。程序执行时发生错误,请修改并调试程序。

#1 public class PI{

#2 public static void main(args[])

#3 {

#4 int n=1;

#5 int pi=2;

#6 double p=3.1415926;

#7 while (Math.abs(p-pi)<0.00001) {

#8 pi=pi*(2*n)/(2*n-1)*(2*n)/(2*n+1);

#9 n++;

#10 }

#11 System.out.println("n="+n);

#12 }

#13 }

答:#2 public static void main(String args[])

#5 double pi=2;

#7 while (Math.abs(p-pi)>=0.00001)

【解析】程序中main方法的参数缺少类型说明,应该是String,因此对第2行进行修改;通过阅读程序可见,变量pi将存放圆周率的运算值,所以应改为double类型;第7行是条件式写错

4.下面的程序执行时会发生错误,正确的程序将逐行读取C盘根目录中的文件sale.txt,并将读入的内容显示在屏幕上,请修改并调试程序。

#1 import java.io.*;

#2 public class FileReadIn{

#3 public static void main(String args[]){

#4 String s="";

#5 try{

#6 FileReader fr=new FileReader("C:\sale.txt");

#7 BufferedReader bfr=new BufferedReader(fr);

#8 String str1;

#9 while((str1=bfr.readLine())=null)

#10 s= str1+"\n";

#11 bfr.close(); }

#12 catch(IOException e) {

#13 System.out.println(e);}

#14 System.out.print(s); }

#15 }

答:#6FileReader fr=new FileReader("C:\\sale.txt");

#9 while((str1=bfr.readLine())!=null)

#10s=s+str1+"\n";

【解析】程序中第6行盘符与文件名之间的分隔符应采用转义符"\\";第9行循环语句中的条件应是只要没有读完就继续读,所以应改为“str1=bfr.readLine())!=null”,意思是读入的内容不为空条件为真,继续循环;程序中第10行的变量s只存放了最后一次从文件中读入的内容,而不是文件的全部内容,因此应改为“s=s+str1+"\n";”。

(三)逻辑错误调试题

5.下面的应用程序执行时会发生错误,正确的应用程序执行后输出的结果如下图所示:

#1 public class Test2_1 {

#2 public static void main(String args[]) {

#3 int i;

#4 for (i=1;i<=8;i+=1)

#5 disp(i);

#6 }

#7 static void disp(int i) {

#8 for (int k=8;k>=i;k++)

#9 System.out.print(" ");

#10 for (int k=1;k<=i;k++)

#11 System.out.print("*");

#12 System.out.print(" ");

#13 }

#14 }

答:#4 for (i=1;i<=8;i+=2)

#8 for (int k=8;k>=i;k--)

#12 System.out.println();

【解析】程序中第4行是用于控制图案行数的,因此步长应改为2;阅读程序可见,disp方法是用来显示行信息的,行信息包括二部分,前一部分为空格,后一部分为“*”,第8行语句中的k++方向错了,应改为k--;第12行语句应该用于换行,而不是加一个空格,因此应改为“System.out.println();”。

6.下面的应用程序执行时会发生错误,正确的应用程序执行后输出的结果如下所示:

C:\> java test2_6

Remove 3 random characters from INTERESTING: INEETING

Remove 6 random characters from INTERESTING: EESTN

C:\> java test2_6

Remove 3 random characters from INTERESTING: ITERETIN

Remove 6 random characters from INTERESTING: IEESG 说明:程序中的方法private static String removeSingChar(String str, int indexNum)的功能是返回删除字符串str中第indexNum个字符后得到的字符串。方法private static String removeRandChar(String str, int howMany)中有二个参数,类型分别是String和int,第二个参数表示从第一个参数指定的字符串中删除字符的个数。删除哪个字符由随机数决定。如果第二个参数比第一个参数指定的字符串长度大,则该方法返回空字符串。

#1 public class test2_6{

#2 public static void main(String[] args) {

#3 String word1 = removeRandChar("INTERESTING", 3);

#4 System.out.println("Remove 3 random characters from INTERESTING: " + word1);

#5 word1 = removeRandChar("INTERESTING", 6);

#6 System.out.println("Remove 6 random characters from INTERESTING: " + word1);

#7 }

#8 private static String removeSingChar(String str, int indexNum) {

#9 return str.substring(0,indexNum) + str.substring(indexNum+1);

#10 }

#11 private static String removeRandChar(String str, int howMany){

#12 if (str.length() > howMany)

#13 return "";

#14 int randNo;

#15 for(int j=0; j

#16 randNo = (int) (Math.random() * 3);

#17 str = removeSingChar(str, randNo);

#18 }

#19 return " ";

#20 }

#21 }

答:#12 if (str.length() <= howMany)

#16 randNo = (int) (Math.random() * str.length());

#19 return str;

【解析】根据题意“如果第二个参数比第一个参数指定的字符串长度大,则该方法返回空字符串。”,第12行条件语句中条件应改为str.length() <= howMany;根据题意“删除哪个字符由随机数决定”,并不是说随机数的范围在3以内,所以第16行语句应改成randNo = (int) (Math.random() * 3);第19行应改成“return str;”,否则,该方法无法返回所需要的结果。

二、习题

1.下面的应用程序执行时会发生错误,正确的应用程序执行后输出的结果会依据变量rand的值而变化,输出Heads或Tails或On its side!中的一种情况:

#1 import java.awt.*;

#2 import java.applet.*;

#3 public class CoinToss extends applet {

#4 public void init () {

#5 int rand == (int)(Math.random ()* 3);

#6 if (rand == 1)

#7 System.out.println("Heads");

#8 else if (rand == 2)

#9 System.out.println("Tails");

#10 else

#11 System.out.println(On its side!);

#12 }

#13 }

答案:

#3 public class CoinToss extends Applet {

#5 int rand = (int)(Math.random ()* 3);

#11 System.out.println("On its side!");

2.下面程序执行时会发生错误,请修改并调试程序。程序的功能是计算10!的值并输出结果。

#1 public class Test2_2 {

#2 public static main(String args[]) {

#3 long n=0;

#4 for (int i=1;i<=10;i++)

#5 n=n*i;

#6 System.out.println("n!= "+n)

#7 }

#8 }

答案:

#2 public static void main(String args[])

#3 long n=1;

#6 System.out.println("n!= "+n);

3.下面程序执行时会发生错误,请修改并调试程序。程序的功能时按一定时间间隔显示任意形状的蓝色三角形。下图是正确程序运行中的一个快照。

#1 import java.awt.*;

#2 import java.applet.*;

#3 public class Test2_3 {

#4 public void paint(Graphics g) {

#5 int x[]=new int[3];

#6 int y[]=new int[3];

#7 for (int i=0;i<=3;i++){

#8 x[i]=(int)(400*Math.random());

#9 y[i]= (int)(300*Math.random());

#10 }

#11 g.setColor(Color blue);

#12 g.fillPolygon(x,y,3);

#13 for (long i=1;i<90000000;i++){} //该循环语句用于时间延迟

#14 repaint();

#15 }

#16 }

答案:

#3 public class Test2_3 extends Applet{

#7 for (int i=0;i<3;i++){

#11 g.setColor(Color.blue);

4.下面程序执行时会发生错误,请修改并调试程序。程序功能说明:程序中randomLetters(String word, int howMany)方法带有两个参数,返回值为字符串,该方法实现从字符串中随机获取所需数量的字符,

并按获取的次序以大写字符串返回。第一个参数代表给定的字符串,第二个参数确定字符个数。(假定调用方法时字符串参数不为空,整型参数不为负)

#1 public class Test2_4 {

#2 public static void main(String []args) {

#3 System.out.println(randomLetters("LOVEL Y",3));

#4 System.out.println(randomLetters("LOVEL Y",3));

#5 System.out.println(randomLetters("LOVEL Y",4));

#6 System.out.println(randomLetters("zhang",1));

#7 System.out.println(randomLetters("zhang",2));

#8 }

#9 private static String randomLetters ( String word, int howMany ){

#10 String outWord = "";

#11 char c;

#12 int random;

#13 word = word.toUpperCase();

#14 for( int i=0; i

#15 random =( Math.random()*word.length() );

#16 c = word.charAt( random );

#17 outWord = c;

#18 }

#19 return outWord;

#20 }

#21 }

执行完整的程序后,其中一种输出如下:

LYO

VLO

OOLE

Z

GH

答案:

#14 for( int i=0; i<=howMany; i++ ) {

#15 random = (int)( Math.random()*word.length() );

#17 outWord = outWord + c;

5.下面程序执行时会发生错误,请修改并调试程序。程序功能说明:将一段30米长的木材,每天锯去其中的一半,计算并输出多少天后,木材的长度开始小于0.05米。

#1 public class Test2_5{

#2 public static void main(args[]){

#3 int d=0;

#4 int m=30;

#5 while (m<0.05) {

#6 m=m/2;

#7 d++;

#8 System.out.print(d+": ");

#9 System.out.println(m);

#10 }

#11 System.out.print("You need "+d+" days");

#12 }

#13 }

执行完整的程序后,运行结果如下:

1: 15.0

2: 7.5

3: 3.75

4: 1.875

5: 0.9375

6: 0.46875

7: 0.234375

8: 0.1171875

9: 0.05859375

10: 0.029296875

You need 10 days

答案:

#2 public static void main(String args[]){

#4 float m=30;

#5 while (m>=0.05) {

6.下面程序执行时会发生错误,请修改并调试程序。程序功能说明:下面程序用于判断命令行中给定的两个字符串是否相等,并输出比较的结果。

#1 import java.io.*;

#2 public class Test2_6{

#3 public static main (String[] args){

#4 if ( args.length() < 1 ) {

#5 System.out.println( "你需要在命令行输入两个字符串。");

#6 System.exit(0); // 结束程序语句

#7 }

#8 if (args[0]==args[1]) // 比较两个字符串是否相等

#9 System.out.println( args[0]+" 与"+args[1]+" 相等");

#10 else

#11 System.out.println( args[0]+" 与"+args[1]+" 不相等");

#12 }

#13 }

答案:

#3 public static void main (String[] args){

#4 if( args.length <= 1 ) { 或者if ( args.length <2 ) {

#8 if(args[0].equals(args[1]))

7.下面程序执行时会发生错误,请修改并调试程序。程序用于从键盘上接收用户输入的十个整数,然

后将它们倒置输出。

例如:若用户输入为:1、2、3、4、5、6、7、8、9、10

则程序输出为:10、9、8、7、6、5、4、3、2、1

#1 import java.io.* ;

#2 public class Test2_7{

#3 public static void main(String args[ ]) {

#4 int i , N =10 ;

#5 int arr[ ] = new int[10];

#6 for ( i = 0 ; i < N ; i ++ )

#7 try {

#8 BufferedReader buf;

#9 buf= new BufferedReader(new InputStreamReader(System.in));

#10 arr[i] = buf.readLine( );

#11 } catch ( IOException e ) { } ;

#12 for ( i = N-1 ; i >= 0 ; i ++ ) // 倒置输出数组内容

#13 System.out.print(arr[i]+" ");

#14 System.out.println;

#15 }

#16 }

答案:

#10 arr[i] = Integer.parseInt(buf.readLine( ));

#12 for ( i = N-1 ; i >= 0 ; i -- )

#14 System.out.println();

8.下面程序执行时会发生错误,请修改并调试程序。程序的功能是通过命令行输入一个三位正整数,判断它是否是一个水仙数。水仙数是其各个位数的立方数之和等于该数。如:153=13+53+33。

#1 public class Shuixianshu{

#2 int i,j,k;

#3 public static boolean sxs(int a ){

#4 if(a<100 || a>999) return false;

#5 i=a%10;

#6 j=(a/10)%10;

#7 k=a%100;

#8 return (i*i*i+j*j*j+k*k*k==a);

#9 }

#10 public static void main(String [] args){

#11 if (args.length()!=1)

#12 System.out.println("请输入一个三位的正整数。");

#13 if (sxs(Integer.parseInt(args[0])) )

#14 System.out.println(args[0]+"是水仙数。");

#15 else

#16 System.out.println(args[0]+"不是水仙数。");

#17 }

#18 }

答案:

#2 static int i,j,k;

#7 k=a/100;

#11 if(args.length!=1)

9.下面程序执行时会发生错误,请修改并调试程序。程序的功能是通过一个以二维整数数组为参数的

private static int[][] addToArray(int[][] nums)方法,返回一个新的二维整数数组。由该方法返回的数组中的

每一个元素按以下方法改变:

数组的最后一行最后一个元素加1,该行倒数第二个元素加2,倒数第三个元素加3,当最后一行的元素处理完毕后,接着处理倒数第二行的最后一个元素,以此类推,数组中每个元素按此方法增量,直到第一行第一个元素。

假设数组至少有一行。

例如:如果参数数组如下:

+4

+3

+2

+1

然后通过该方法返回的数组将是:

#1 public class test4_2 {

#2 public static void main(String[] args) {

#3 int[][] numbers1 = {{4, 2, 5, 6},{3, 7, 7, 9},{8, 8, 9, 9}}; #4 System.out.println("Array1:"); #5 printIntA(numbers1);

#6 int[][] numbers2 = addToArray(numbers1); #7 System.out.println("Array2:"); #8 printIntA(numbers2); #9 }

#10 private static void printIntA(int[][] nums) { #11 System.out.println();

#12 for(int i=0; i

#13 for(int j=0; j

#16 System.out.println(); #17 }

#18 System.out.println(); #19 }

#20 private static int[][] addToArray(int[][] nums){ #21 int count = 1;

#22 int[][] newNums =new int[nums.length][nums.length]; #23 for(int i=nums.length-1; i>=0; i--){

#24 for(int j=nums[i].length-1; j>=0; j--){ #25 nums[i][j] = newNums [i][j] +count; #26 count++; #27 } #28 }

#29 return newNums; #30 } #21 }

+9 +5

答案:

#22 int[][] newNums =new int[nums.length][nums[0].length];

#25 newNums[i][j] = nums[i][j] +count;

#29 return nums;

10.下面程序执行时会发生错误,请修改并调试程序。程序的功能是在屏幕上输出如下图案,图案中每个方格大小是20×20像素。

#1 import java.awt.*;

#2 import java.applet.*;

#3 public class Test2_2 extends Applet {

#4 static final int SIZE = 20;

#5 public void paint(Graphics g){

#6 int startX = 60; //设置图形第一行的初始值

#7 int currentX = startX;

#8 int currentY = 0;

#9 for (int lineNo=1; lineNo < 5; lineNo++){ //lineNo为行数

#10 for (int across=1; across < lineNo; across++){

#11 g.fillRect(currentX, currentY, SIZE, SIZE);

#12 currentX += SIZE;

#13 }

#14 startX+= SIZE; //设置图形下一行的初始值

#15 currentX = startX;

#16 currentY += SIZE;

#17 }

#18 }

#19 }

答案:

#10 for (int across=1; across <= lineNo; across++){

#12 currentX += SIZE * 2;

#14 startX -= SIZE;

程序填空题

一、复习题解析

1.阅读下列问题描述和相应的程序,将程序补充完整并进行调试。

【问题描述】

下面是一个Application程序,接受用户从键盘输入的10个整数,然后将这10个数按从大到小的方式排序并输出,请将程序补充完整。

程序:

import java.io.* ;

public class PaiXu{

public static void main(String args[ ]) {

int arr[]=new ______(1)______, i,j;

for ( i = 0 ; i < 10 ; i ++ ) {

try {

BufferedReader br = new BufferedReader( new InputStreamReader(System.in));

arr[i] = Integer.parseInt(______(2)______);

} catch ( IOException e ) { } ;

}

for ( i = 0 ; i < 10 ; i ++ )

for (______(3)_____;j<10;j++)

if(______(4)_____) {

int t=arr[i]; arr[i]=arr[j]; ______(5)_____;

}

System.out.println("排序结果为:");

for ( i = 0 ; i < 10 ; i ++ )

System.out.print(arr[i]+"\t");

}

}

答案:

(1)int[10]

(2)br.readLine()

(3)j=i或j=i+1

(4)arr[i]arr[i]或arr[i]<=arr[j]或arr[j]>=arr[i]

(5)arr[j]=t

【解析】此类题目的解答需要非常认真地阅读问题描述和相应的程序,同时要了解常用的算法结构,然后可以从位置、语法和逻辑上对需要填空的部分进行推敲。本题是一道关于选择排序的题目,选择排序的基本思想是首先在给定的数组中找一个最大值,将其换到数组的第一个位置,然后在剩下的数据中再找一个最大值(即整个数组中第二大数据),放在数组中的第二个位置,以此类推,直到最后,得到的结果就是从大到小降序的数据序列。本题中填空(1)从位置上看很显然是对数组的定义,因此填上“int[10]”;根据题意及第(2)空的位置,可判断出此空所在的语句是将从键盘读入的数据赋给数组“arr[i]”,因此填上“br.readLine()”;从程序上下文看,第(3)空所在的位置应该对变量j进行赋初值,如果对选择排序法比较熟悉(非常有必要熟悉)的话,可以知道此处应填写“j=i”或“j=i+1”;第(4)空是if语句中的条件,因为是找最大值,所以要比较,当满足条件(当前准备存放数据的元素的值小于其它元素中的值)时交换数组元素中的数据,因此第(4)空的位置填上“arr[i]

arr[j]>arr[i]或arr[i]<=arr[j]或arr[j]>=arr[i]”;

2.阅读下列问题描述和相应的程序,按下面给出的程序运行结果将程序补充完整并进行调试。

【问题描述】

UseComputer类创建两个Computer类的对象并调用相应的方法。Computer类用于定义计算机的硬件性能:CPU速度(speed)、内存大小(memory)、硬盘容量(diskSpace)。

当程序正确完成后,产生的输出如下所示:

C:\>java UseComputer

2.0GHz 1024MB内存 128GB硬盘

3.2GHz 2048MB内存 256GB硬盘

3.2GHz 2048MB内存 128GB硬盘

3.4GHz 3072MB内存 256GB硬盘

较好的是:3.4GHz 3072MB内存 256GB硬盘

程序:

public class UseComputer{

public static void main(String []args){

Computer computer1 = new Computer(2.0, 1024, 128);

Computer computer2 = new Computer(3.2, 2048, 256);

System.out.println(computer1);

System.out.println(computer2);

computer1.upGradeMemory(1024);

computer1.replaceCPU(3.2);

computer2.upGradeMemory(1024);

computer2.replaceCPU(3.4);

System.out.println(computer1);

System.out.println(computer2);

if (https://www.wendangku.net/doc/7514410547.html,pare(computer2))

System.out.println("较好的是:"+computer1);

else

System.out.println("较好的是:"+computer2);

}

}

class Computer {

(1)

private int memory;

private int diskSpace;

public Computer(double initSpeed, int initMemory, int initDiskSpace) {

speed = initSpeed;

memory = initMemory;

diskSpace = initDiskSpace;

}

public String toString() {

(2)

}

public void upGradeMemory(int extraMemory) {

(3)

}

public void replaceCPU(double newSpeed) {

(4)

}

public boolean compare(Computer other){

return (5);

}

}

答案:

(1)private double speed;

(2)return speed + "GHz " + memory + "MB内存" + diskSpace+ "GB硬盘";

(3)memory += extraMemory;

(4)speed = newSpeed;

(5)speed>=other.speed或memory>=other. memory;

【解析】此类题目的解答需要非常认真地阅读问题描述和相应的程序,然后可以从位置、语法和逻辑上对需要填空的部分进行推敲,本题中填空(1)从位置上看很有可能是成员变量的声明,阅读程序后可以发现成员变量speed已用但未加声明,又从语句speed = initSpeed;推得speed应该声明为double类型,因此,该空填上“private double speed;”;从第(2)空的位置可以看出此处应该放的语句与Computer类对象的输出方式有关,根据题目中已给出的运行结果及方法类型,可判断出第(2)空应为“return speed + "GHz " + memory + "MB内存" + diskSpace+ "GB硬盘";”;第(3)空应填的内容可以从main()方法中执行的语句与给出的运行结果找到线索,即public void upGradeMemory(int extraMemory)方法与内存数量的更新相关,从运行结果可见,参数中提供的内存数量是与原内存数量相加的,因此第(3)空应填的内容是“memory += extraMemory;”;同理可判断出第(4)空的内容与CPU速度(speed)的更新有关,但从运行结果看public void replaceCPU(double newSpeed)方法参数中提供的数据是用来直接替代CPU的速度,因此第(4)空应填的内容是“speed = newSpeed;”;从第(5)空的位置和方法返回的类型看,此处应填写逻辑值的表达式,从方法的参数可以初步判断是“本对象”的数据与“other”对象数据的比较,再从运行结果判断第(5)空应填的内容是“speed>=other.speed;”或“memory>=other. memory;”。

3.阅读下列问题描述和相应的程序,按下面给出的程序运行结果将程序补充完整并进行调试。

【问题描述】

该程序的功能是为用户提供一个简单的画图环境,当窗口第一次打开时,程序窗口中只有一个“Clear”按钮。每当在窗体上按下鼠标并拖曳,将以鼠标所在点为圆心画一个半径为8个像素、任意颜色的填充圆;连续地拖曳鼠标将绘制出连续的以这种圆为基本单元的图形。如图所示。单击“Clear”按钮将清除窗体上所有内容。

图 6.1

程序:

import java.awt.*;

import java.applet.*;

import java.awt.event.*;

public class Fdrawing extends Applet implements MouseMotionListener,MouseListener,ActionListener {

Button bcls=new Button("Clear!");

int x1,x2,y1,y2;

public void init() {

setLayout(null);

bcls.setBounds(10,10,80,40);

add(bcls);

addMouseListener(this);

addMouseMotionListener(this);

( 1 )

}

public void actionPerformed(ActionEvent e)

{ (2)}

public void Circle(Graphics g,int x,int y,int rx,int ry) {

int cr,cg,cb;

cr=(int)(Math.random()*256);

cg=(int)(Math.random()*256);

cb=(int)(Math.random()*256);

g.setColor(new Color(cr,cg,cb));

(3)

}

public void mousePressed(MouseEvent e) {

x1=e.getX();

y1=e.getY();

}

public void mouseDragged(MouseEvent e) {

Graphics g=getGraphics();

(4)

y2=e.getY();

Circle (g,x1,y1,8,8);

x1=x2;

(5)

}

public void mouseMoved(MouseEvent e){}

public void mouseReleased(MouseEvent e){}

public void mouseEntered(MouseEvent e){}

public void mouseExited(MouseEvent e){}

public void mouseClicked(MouseEvent e){}

}

答案:

(1)bcls.addActionListener(this);

(2)repaint();

(3)g.fillOval(x-rx,y-ry,2*rx,2*ry);

(4)x2=e.getX();

(5)y1=y2;

【解析】此类题目的解答需要非常认真地阅读问题描述和相应的程序,然后可以从位置、语法和逻辑上对需要填空的部分进行推敲。本题要求考生对Java中的事件处理机制比较熟悉,从填空(1)的位置及主类Fdrawing实现的接口看,此处应该是设置ActionEvent事件监听者。从上下文看,由小应用程序本身充当事件监听者,而且事件对象为bcls,所以填空(1)的内容应为“bcls.addActionListener(this);”;第(2)空的位置是在public void actionPerformed(ActionEvent e)方法中,显然是用于事件处理的,根据问题描述,要求单击“Clear”按钮将清除窗体上所有内容,此空填“repaint();”以清除显示区域所显示的内容;通过阅读程序和问题描述可知,第(3)空所在的方法是用于“以鼠标所在点为圆心画一个半径为8个像素、任意颜色的填充圆”,因此第(3)空应填“g.fillOval(x-rx,y-ry,2*rx,2*ry);”;从第(4)空所在位置及上下语句功能判断,此处应该是获取下一次画圆的x坐标,因此填写“x2=e.getX();”;同样从第(5)空所在位置及上下语句的功能判断,此处应该是为画下一个圆的y坐标作好准备,因此填写“y1=y2;”。

二、习题

1.阅读下列问题描述和相应的程序,将程序补充完整并进行调试。

【问题描述】

下面程序的功能是:由键盘输入一个小于“100”的数字字符串(例如“38”),将它转换成整数,然后计算并输出从该整数到100之间所有整数的累加和。

程序:

import _________(1)_________ ;

public class NumJa1{

public static void main(String args[]) throws IOException {

int num1,s;

String str;

BufferedReader buf;

buf=new BufferedReader(new InputStreamReader(System.in));

System.out.print("请输入整数:");

str=_________(2)_________;

num1=_________(3)_________;

if (num1>=100)

System.out.print("输入的数已超出范围");

else

{_________(4)_________;

for (_________(5)_________)

s=s+i;

System.out.println("The sum is "+s);

}

}

}

答案:

(1)java.io.*

(2)buf.readLine()

(3)Integer.parseInt(str)

(4)s=0

(5)int i=num1;i<101;i++或int i=num1;i<=100;i++

2.阅读下列问题描述和相应的程序,按下面给出的程序运行结果将程序补充完整并进行调试。

【问题描述】

Test5创建三个Locker类的对象并调用相应的方法,Locker类用来存放银行保管箱租用者的姓名(hirer)、柜号(cabinetNum)、箱号(num)以及是否空闲(isVacant)的信息。当程序正确完成后,产生的输出如下所示:

C:\> java Test5

柜号:3, 箱号: 301 当前由李瑞杰使用

柜号:3, 箱号: 302 当前由张佳利使用

柜号:2, 箱号: 201 当前由张佳利使用

现在空闲柜号: 3, 箱号: 301 当前空闲

同一租用者柜号: 3, 箱号:302 当前由张佳利使用

同一租用者柜号: 2, 箱号: 201 当前由张佳利使用

程序:

public class Test5 {

public static void main(String[] args) {

Locker lock1, lock2, lock3;

lock1 = new Locker("李瑞杰",3,301);

lock2 = new Locker("张佳利",3,302);

lock3 = new Locker("张佳利",2,201);

System.out.println(lock1.toString());

C程序调试步骤to初学者

调试程序一般应经过以下几个步骤: 1、先进行人工检查,即静态检查。 在写好一个程序以后,不要匆匆忙忙上机,而应对纸面上的程序进行人工检查。这一步是十分重要的,它能发现程序设计人员由于疏忽而造成的多数错误。而这一步骤往往容易被人忽视。有人总希望把一切推给计算机系统去做,但这样就会多占用机器时间,作为一个程序人员应当养成严谨的科学作风,每一步都要严格把关,不把问题留给后面的程序。 为了更有效地进行人工检查,所编的程序应注意力求做到以下几点: (1)应当采用结构化程序方法编程,以增加可读性;(2)尽可能多加注释,以帮助理解每段程序的作用;(3)在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。这样既易于阅读也便于调试,各函数之间除用参数传递数据这一渠道以外,数据间尽量少出现耦合关系,便于分别检查和处理。 2、在人工检查无误后,才可以上机调试。通过上机发现错误称动态检查。在编译时给出语法错误的信息,可以根据提示的信息具体找出程序中出错之处并改正之。 应当注意的是有时提示的出错并不是真正出错的行,如果在提示出错的行上找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多各种错误互有关联,因止要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。如果系统提示的出错信息多,应当从上到下一一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息;有的是少了“}”或多了“}”有的是书写语句时忘记写“;”或是全角的“;”了,只要加上一个变量定义,或填加“};”就所有错误都消除了。 3、在改正语法错误后,程序经过连接就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求。 有的初学者看到运行结果就认为没问题了,不作认真分析,这是危险的。 有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据可以得出容易判断正确与否的结果。可以在计算的输出结果的程序地方加入一段输出到屏幕窗口的程序,利用屏幕窗口可以方便看到结果的,很直观。例如,if语句有两个分支,有可能在流程经过其中一个分支时结果正确,而经过其它一个分支时结果不对等。必须考虑周全。 事实上,当程序复杂时很难把所有的可能方案全部都试到,选择典型的情况作试验即可。 4、运行结果不对,大多属于逻辑错误。对这类错误往往需要仔细检查和分析才能发现。可以采用以下办法: (1)将程序与流程图仔细对照,如果流程图是正确的话,程序写错了,是很容易发现的。例如,复合语句忘记写花括弧,只要一对照流程图就能很快发现。 (2)如果实在找不到错误,可以采用“分段检查”的方法。在程序不同的位置设几个printf 函数语句,输出有关变量的值,往下检查。直到找到在哪一段中数据不对为止。这时就已经把错误局限在这一段中了。不断减小“查错区”,就可能发现错误所在。 (3)也可以用“条件编译”命令进行程序调试(在程序调试阶段,若干printf函数语句就要进行编译并执行。当调试完毕,这些语句不要再编译了,也不再被执行了)。这种方法可以不必一一去printf函数语句,以提高效率。 5、如果在程序中没有发现问题,就要检查流程图有无错误,即算法有无问题,如有则改正

CodeWarrior 基本使用教程

1). CodeWarrior 能做些什么? A).使用C/C++ 进行编程 B).也支持Java 开发 本课程仅限于应用C/C++ 语言在Windows 平台上使用CodeWarrior 进行的开发. 2). CodeWarrior 优点是什么? CodeWarrior 能够自动地检查代码中的明显错误,它通过一个集成的调试器和编辑器来扫描你的代码,以找到并减少明显的错误,然后编译并链接程序以便计算机能够理解并执行你的程序. 3).常用编程类型说明: A).应用程序(如:文本编辑器WordPad ) B). 庞大的商业软(如:比如象Adobe Photoshop,MicrosoftWord,CodeWarrior…) C). 控制面板(control panels)<实际上是设置系统功能的一个简单界面,比如可以在控制面板中 完成.如:设置音量和鼠标移动速度这样一些参数.> D). 动态链接库(dynamic linked libraries,DLLs)<提供一些很有用的被系统和应用程序共享 的函数.通常它们没有用户界面.> E). 插件(plug-ins)<类似于DLLs,插件也是可供其它软件使用的小程序,但插件只能被特定的软 件使用.>

4).CodeWarrior工具条介绍: 4.1).文件菜单: 4.2).编辑菜单

4.3). 查看菜单 4.4). 查找菜单4.5). 工程菜单

4.6). 调试菜单 4.8).窗口菜单 4.9). 帮助菜单 4.7).VCS 菜单

5).CodeWarrior 集成开发环境的设置

软件开发过程详解

软件开发过程详解 软件开发过程即软件设计思路和方法的一般过程,包括设计软件的功能和实现的算法和方法、软件的总体结构设计和模块设计、编程和调试、程序联调和测试以及编写、提交程序。 生产一个最终能满足需求且达到工程目标的软件产品所需要的步骤。软件开发过程覆盖了需求、设计、实现、确认以及维护等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义,又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件系统结构,包括子系统、模块以及相关层次的说明、每一模块的接口定义。详细设计产生程序员可用的模块说明,包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行的程序代码。确认活动贯穿于整个开发过程,实现完成后的确认,保证最终产品满足用户的要求。维护活动包括使用过程中的扩充、修改与完善。 1.需求分析 1.1 需求分析的特点和任务 需求分析是软件开发的第一步。获取需求的一个必不可少的结果是对项目中描述的客户需求的普遍理解。一旦理解了需求,分析者、开发者和客户就能探索出描述这些需求的多种解决方案。参与需求获取者只有在他们理解了问题之后才能开始设计系统,否则,对需求定义的任何改进,设计上都必须大量的返工。把需求获取集中在用户任务上—而不是集中在用户接口上—有助于防止开发组由于草率处理设计问题而造成的失误。有几种原因使需求分析变得困难:(1)客户说不清楚需求;(2)需求自身经常变动;(3)分析人员或客户理解有误。 需求获取、分析、编写需求规格说明和验证并不遵循线性的顺序,这些活动是相互隔开、增量和反复的。当你和客户合作时,你就将会问一些问题,并且取得他们所提供的信息(需求获取)。同时,你将处理这些信息以理解它们,并把它们分成不同的类别,还要把客户需求同可能的软件需求相联系(分析)。然后,你可以使客户信息结构化,并编写成文档和示意图(说明)。下一步,就可以让客户代表评审文档并纠正存在的错误(验证)。这四个过程贯穿着需求分析的整个阶段。需求获取可能是软件开发中最困难、最关键、最易出错及最需要交流的方面。需求获取只有通过有效的客户—开发者的合作才能成功。分析者必须建立一个对问题进行彻底探讨的环境,而这些问题与产品有关。为了方便清晰地进行交流,就要列出重要的小组,而不是假想所有的参与者都持有相同的看法。对需求问题的全面考察需要一种技术,利用这种技术不但考虑了问题的功能需求方面,还可讨论项目的非功能需求。确定用户已经理解:对于某些功能的讨论并不意味着即将在产品中实现它。对于想到的需求必须集中处理并设定优先级,以避免一个不能带来任何益处的无限大的项目。 1.2.需求分析的一般方法

数控车床基本操作简单程序调试

数控车床的基本操作与简单程序调试 一、实训目的 < 1 >掌握数控车削加工基本编程指令及其应用 < 2 >熟悉了解数控车床的操作面板和控制软件; < 3 >掌握数控车床的基本操作方法和步骤; < 4 >进一步了解数控车床的结构组成、加工控制原理; < 5 >熟练掌握精车程序的输入调 二、预习要求 认真阅读数控车床组成、位置调整和坐标系设定及基本编程指令与调试的章节内容。 三、实训理论基础 1.基本编程指令功能介绍 1 ). G 功能 ( 格式: G 2 G 后可跟 2 位数 ) 常用 G 功能指令 (1) 、表内 00 组为非模态指令,只在本程序段内有效。其它组为模态指令,一次指定后持续有效,直到被本组其它代码所取代。 (2) 、标有 * 的 G 代码为数控系统通电启动后的默认状态。

2 ). M 功能 ( 格式: M2 M 后可跟 2 位数 ) 车削中常用的 M 功能指令有: M00-- 进给暂停 M01-- 条件暂停 M02-- 程序结束 M03-- 主轴正转 M04-- 主轴反转 M05-- 主轴停转 M98-- 子程序调用 M99-- 子程序返回。 M08-- 开切削液 M09-- 关切削液 M30-- 程序结束并返回到开始处 3 ). T 功能 ( 格式: T2 或 T 4 ) 有的机床 T 后只允许跟 2 位数字,即只表示刀具号,刀具补偿则由其它指令。 有的机床 T 后则允许跟 4 位数字,前 2 位表示刀具号,后 2 位表示刀具补偿号。如: T0211 表示用第二把刀具,其刀具偏置及补偿量等数据在第 11 号地址中。 4 ). S 功能 ( 格式: S4 S 后可跟 4 位数 ) 用于控制带动工件旋转的主轴的转速。实际加工时,还受到机床面板上的主轴速度修调倍率开关的影响。按公式: N=1000Vc / p D 可根据某材料查得切削速度 Vc ,然后即可求得 N. 例如:若要求车直径为 60mm 的外圆时切削速度控制到 48mm/min ,则换算得: N=250 rpm ( 转 / 分钟 ) 则在程序中指令 S250; 5 ).车床的编程方式 ( 1 ).绝对编程方式和增量编程方式。 图 2-1 编程方式示例 绝对编程是指程序段中的坐标点值均是相对于坐标原点来计量的,常用 G90 来指定。增量( 相对 ) 编程是指程序段中的坐标点值均是相对于起点来计量的。常用 G91 来指定。如对图 2-1 所示的直线段 AB 编程 绝对编程: G90 G01 X100.0 Z50.0; 增量编程: G91 G01 X60.0 Z-100.0;

实验一-Keil软件的使用及简单程序的调试方法

实验一Keil软件的使用及简单程序的调试方法 一、实验目的 掌握Keil的使用方法和建立一个完整的单片机汇编语言程序的调试过程及方法。 二、实验器材 计算机1台 三、实验内容 1.Keil的使用方法。 2.建立一个单片机汇编语言程序的调试过程及方法 四、实验步骤 1.Keil的使用方法。Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM 语言和C 语言的程序设计,界面友好,易学易用。启动Keil 后的界面如下:

几秒钟后即进入Keil的编辑界面。用户便可建立项目及应用程序。 2.简单程序的调试方法 Keil是通过项目工程来管理汇编程序的。因此在调试程序前必须建立一个工程,工程名称及保存位置由用户来指定,注意每位同学的工程名称用“学号姓名实验*”来命名。 (1)建立一工程 单击Project菜单,在弹出的下拉菜单中选中New Project选项。并在弹出的对话框中确定保存的位置及工程名称。 又弹出一对话框,要求用户选择相应的硬件CPU及相关设置。选择Atmel公司的AT89C51单片机。如下图所示

单击“确定”后在弹出的对话框中行选择“否”即工程建好了,但该工程没有任何语句,需要再建一个程序文件并将其添加到此工程中。 (2)建一文件 单击“File”/“New”命令,则弹出文件的编辑窗口,此时该文件还没有指明其文件名称及保存位置,该文件还没有加载到所建立的工程中。单击“File”/“Save”命令在弹出的对话框中指明文件的类型为.ASM汇编型及文件名后单击“保存”即可进行汇编源文件的编辑。如下图所示。 (3)将文件添加到工程中 单击“T arget 1”前的“+”号则展开后变成“-”号,并右键单击“Source Group 1”在弹出的下拉菜单中执行“Add Files to Group ‘Source Group 1’”命令并弹出对话框在该对话框中的“文件类型”下拉列表中选择“Asm source file”后找到要添加的文件名并选中,单击“Add”即可。

codewarrior软件与编程的讲解完整版

CodeWarrior 使用教程 第一课认识CodeWarrior Translated from?https://www.wendangku.net/doc/7514410547.html, CodeWarrior?能做些什么? ????当你知道自己能写更好的程序时,你一定不会再使用别人开发的应用程序。但是常常会发生这种情况,就是当你写了无数行代码后,却找不到使得整个程序出错的那一行代码,导致根本没法编译和链接整个程序。这可能更令人灰心丧气。 ????本文将告诉你如何使用?CodeWarrior?这一工具解决上述问题。 ????从现在开始,我们将集中精力学习如何在?CodeWarrior?中使用?C/C++?进行编程。为了学习本课程,你必须已经能够比较熟练地使用上述两种语言之一。CodeWarrior?也可以支持?Java?开发,但那是另一门课程的内容。本课程仅限于在?Windows?平台上使用?CodeWarrior?进行的开发。一旦你精通了?CodeWarrior?编程后,你可以试试在其它平台上使用?CodeWarrior。本文中讨论过的大部分内容都可以应用到开发?Mac?应用程序中。 ??? CodeWarrior?能够自动地检查代码中的明显错误,它通过一个集成的调试器和编辑器来扫描你的代码,以找到并减少明显的错误,然后编译并链接程序以便计算机能够理解并执行你的程序。你所使用过的每个应用程序都经过了使用象?CodeWorrior?这样的开发工具进行编码、编译、编辑、链接和调试的过程。现在你在我们的指导下,自己也可以去做这些工作了。

????你可以使用?CodeWarrior?来编写你能够想象得到的任何一种类型的程序。如果你是一个初学者,你可以选择编写一个应用程序(比如一个可执行程序),比如象微软公司的文本编辑器?WordPad?这样的应用程序。 ????应用程序可能是最容易编写的程序了,而那些庞大的商业软件,比如象?Adobe Photoshop,Microsoft Word?以及?CodeWarrior?软件都是极其复杂的。其它类型的程序指的是控制面板(control panels),动态链接库(dynamic linked libraries,DLLs)?和插件(plug-ins)。我们先来简单的讨论一下这些类型的程序。 ????在?Windows?中,控制面板程序是一些(通常比较小的)存放在控制面板目录下的程序,可以在开始菜单的控制面板项中看到它们。控制面板实际上是设置系统功能的一个简单界面,比如可以在控制面板中完成诸如设置音量和鼠标移动速度这样一些参数。????动态链接库?(DLLs)?提供了一些很有用的被系统和应用程序共享的函数。通常它们都是没有用户界面的。 ????插件?(Plug-ins)?有点类似于?DLLs,插件也是可供其它软件使用的小程序,但插件只能被特定的软件使用。比如说,Photoshop?的插件允许程序员方便地扩展?Photoshop?的功能,而不需要去修改它的源代码。同样的,许多?Web?浏览器也使用插件来增加功能,或者为了让你能够看到页面上的新的内容类型。实际上,有许多程序,包括?CodeWarrior,都使用这种插件结构。 ????一旦你掌握了?CodeWarior?和你所使用的操作系统的编程接口时,你可以编写许多其它类型的程序。实际上,本课程也是你深入学习其它编程方法的基础课程。你已经找到了一个最优秀的地方开始你的编程之旅。好,现在请坐好,放松,去吸取这门课程的精

PLC程序的调试方法及步骤(精)

PLC程序的调试方法及步骤 PLC程序的调试可以分为模拟调试和现场调试两个调试过程,在此之前首先对PLC外部接线作仔细检查,这一个环节很重要。外部接线一定要准确无误。也可以用事先编写好的试验程序对外部接线做扫描通电检查来查找接线故障。不过,为了安全考虑,最好将主电路断开。当确认接线无误后再连接主电路,将模拟调试好的程序送入用户存储器进行调试,直到各部分的功能都正常,并能协调一致地完成整体的控制功能为止。 1.程序的模拟调试 将设计好的程序写入PLC后,首先逐条仔细检查,并改正写入时出现的错误。用户程序一般先在实验室模拟调试,实际的输入信号可以用钮子开关和按钮来模拟,各输出量的通/断状态用PLC上有关的发光二极管来显示,一般不用接PLC实际的负载(如接触器、电磁阀等)。可以根据功能表图,在适当的时候用开关或按钮来模拟实际的反馈信号,如限位开关触点的接通和断开。对于顺序控制程序,调试程序的主要任务是检查程序的运行是否符合功能表图的规定,即在某一转换条件实现时,是否发生步的活动状态的正确变化,即该转换所有的前级步是否变为不活动步,所有的后续步是否变为活动步,以及各步被驱动的负载是否发生相应的变化。 在调试时应充分考虑各种可能的情况,对系统各种不同的工作方式、有选择序列的功能表图中的每一条支路、各种可能的进展路线,都应逐一检查,不能遗漏。发现问题后应及时修改梯形图和PLC中的程序,直到在各种可能的情况下输入量与输出量之间的关系完全符合要求。 如果程序中某些定时器或计数器的设定值过大,为了缩短调试时间,可以在调试时将它们减小,模拟测试结束后再写入它们的实际设定值。 在设计和模拟调试程序的同时,可以设计、制作控制台或控制柜,PLC之外的其他硬件的安装、接线工作也可以同时进行。 2.程序的现场调试 完成上述的工作后,将PLC安装在控制现场进行联机总调试,在调试过程中将暴露出系统中可能存在的传感器、执行器和硬接线等方面的问题,以及PLC的外部接线图和梯形图程序设计中的问题,应对出现的问题及时加以解决。如果调试达不到指标要求,则对相应硬件和软件部分作适当调整,通常只

嵌入式软件开发流程图

嵌入式软件开发流程 一、嵌入式软件开发流程 1.1 嵌入式系统开发概述 由嵌入式系统本身的特性所影响,嵌入式系统开发与通用系统的开发有很大的区别。嵌入式系统的开发主要分为系统总体开发、嵌入式硬件开发和嵌入式软件开发3大部分,其总体流程图如图1.1所示。 图1.1 嵌入式系统开发流程图 在系统总体开发中,由于嵌入式系统与硬件依赖非常紧密,往往某些需求只能通过特定的硬件才能实现,因此需要进行处理器选型,以更好地满足产品的需求。另外,对于有些硬件和软件都可以实现的功能,就需要在成本和性能上做出抉择。往往通过硬件实现会增加产品的成本,但能大大提高产品的性能和可靠性。 再次,开发环境的选择对于嵌入式系统的开发也有很大的影响。这里的开发环境包括嵌入式操作系统的选择以及开发工具的选择等。比如,对开发成本和进度限制较大的产品可以选择嵌入式Linux,对实时性要求非常高的产品可以选择Vxworks等。

1.2 嵌入式软件开发概述 嵌入式软件开发总体流程为图4.15中“软件设计实现”部分所示,它同通用计算机软件开发一样,分为需求分析、软件概要设计、软件详细设计、软件实现和软件测试。其中嵌入式软件需求分析与硬件的需求分析合二为一,故没有分开画出。 由于在嵌入式软件开发的工具非常多,为了更好地帮助读者选择开发工具,下面首先对嵌入式软件开发过程中所使用的工具做一简单归纳。 嵌入式软件的开发工具根据不同的开发过程而划分,比如在需求分析阶段,可以选择IBM的Rational Rose等软件,而在程序开发阶段可以采用CodeWarrior(下面要介绍的ADS 的一个工具)等,在调试阶段所用的Multi-ICE等。同时,不同的嵌入式操作系统往往会有配套的开发工具,比如Vxworks有集成开发环境Tornado,WindowsCE的集成开发环境WindowsCE Platform等。此外,不同的处理器可能还有对应的开发工具,比如ARM的常用集成开发工具ADS、IAR和RealView等。在这里,大多数软件都有比较高的使用费用,但也可以大大加快产品的开发进度,用户可以根据需求自行选择。图4.16是嵌入式开发的不同阶段的常用软件。 图1.2 嵌入式开发不同阶段的常用软件 嵌入式系统的软件开发与通常软件开发的区别主要在于软件实现部分,其中又可以分为编译和调试两部分,下面分别对这两部分进行讲解。 1.交叉编译 嵌入式软件开发所采用的编译为交叉编译。所谓交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。在第3章中已经提到,编译的最主要的工作就在将程序转化成运行该程序的CPU所能识别的机器代码,由于不同的体系结构有不同的指令系统。因此,不同的CPU需要有相应的编译器,而交叉编译就如同翻译一样,把相同的程序代码翻译成不同CPU的对应可执行二进制文件。要注意的是,编译器本身也是程序,也要在与之对应的某一个CPU平台上运行。嵌入式系统交叉编译环境如图4.17所示。

codewarrior v10.x快速指南

Quick Start for Microcontrollers V10.1

CodeWarrior Development Studio for Microcontrollers V10.x Quick Start SYSTEM REQUIREMENTS Hardware Windows? OS: PC with 1 GHz Intel? Pentium? compatible processor Linux? OS: 1.8 GHz Intel Pentium class processor (or better) 2GB of RAM CD-ROM drive Depending on host-target connection: Parallel Port, 9-pin Serial Port, or USB Port Operating System Microsoft? Windows XP 32-bit and 64-bit (Professional Edition), Microsoft Windows Vista? 32-bit and 64-bit (Home Premium Edition and Business Edition), or Microsoft Windows 7 32-bit and 64-bit (Home Premium Edition and Professional Edition) Red Hat Enterprise Edition 5.2 Disk Space 2 GB total 400MB on Windows system disk This Quick Start explains how to install the CodeWarrior Development Studio for Microcontrollers V10.x software on Windows and Linux operating systems, and how to use the CodeWarrior IDE to create, build, and debug a project. Section A:Installing CodeWarrior Software NOTE This section describes how to download and install CodeWarrior for Microcontrollers V10.x from the Web or install it from the CD. The Web version has a time-bombed license.

实验一调试程序DEBUG的使用实验报告

南昌理工学院实验报告 二O一二年月日 课程名称:微机原理与接口技术实验名称:调试程序DEBUG的使用班级:姓名:同组人: 指导教师评定:签名: 【一、实验名称】 调试程序DEBUG的使用 【二、实验目的】 1.掌握汇编程序的编辑,编译,连接和执行的全过程; 2.学习和掌握用DEBUG 调试程序的方法。 【三、实验内容和原理】 1.用编辑软件,输入以下汇编语言源程序: DAT SEGMENT A D B 20 ;(自定) B DB 15 ;(自定) Y DB 3 DUP(0) Z DB 0,0 DAT ENDS STA SEGMENT STACK DW 50 DUP(?) STA ENDS COD SEGMENT ASSUME CS:COD,DS:DAT STAR PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DAT MOV DS,AX MOV AX,STA MOV SS,AX MOV AL,A MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,B MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,A MOV Z,AL MOV AL,B MOV Z+1,AL CALL SUB1 ADD WORD PTR Y,AX ADC BYTE PTR[Y+2],0 RET STAR ENDP SUB1 PROC MOV AL,Z MOV AH,Z+1 MUL AH ADD WORD PTR Y,AX ADC BYTE PTR[Y+2],0 RET SUB1 ENDP COD ENDS END STAR

CodeWarriorV软件使用指南

Code Warrior V5.1软件使用指南 一、软件安装指南 二、关于BDM驱动 三、创建一个新的工程 四、编写与运行你的程序 2011年10月16日陈万忠

Code Warrior V5.1软件使用指南 一、软件安装指南 1. 打开文件安装文件夹 2. 找到安装文件 3. 双击此文件,出现安装界面: 4. 点击“NEXT”按钮,出现安装路径信息。如果修改系统默认路径,点击“change”按钮,然后修改安装路径,否则点击“NEXT”按钮。

5. 在安装过程中,根据提示信息,完成每一步的安装。 6. 安装完毕后,在所有程序中找到Code Warrior V5.1执行文件,点击执行即可进入Code Warrior V5.1集成环境。

7. 也可以拖到桌面上。此时桌面出现如下图标: 二、关于BDM驱动 请将“BDM使用说明和驱动”文件夹下的文件: OpenSourceBDM.dll 和 tblcf.dll以及 tblcf_gdi.dll 三个文件,复制到: C:\Program Files\Freescale\CWS12v5.1\Prog\gdi目录下(或者你安装时修改过的Code Warrior V5.1所在目录\Prog\gdi子目录下),在调试时选择Open Source BDM 调试接口即可。

三、创建一个新的工程 创建一个新的工程,要按照下面向导选项的8个步骤来选择完成。 双击桌面快捷图标,进入 Code Warrior集成开发环境窗口。 第一步:创建一个新的工程。

第二步:选择CPU类型,选择HCS12X目录下的HCS12X Family。 第三步:选择CPU芯片型号和BDM工具TBDML。 第四步:选择编程语言,我们选择C语言编程。

调试程序的简单说明

难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。 我以前接触的程序大多是有比较成形的思路和方法,调试起来出的问题都比较小,最近这个是我自己慢慢摸索调试,接触了很多新的调试方法,并查了很多前辈的总结,受益匪浅,总结以前的和新的收获如下: VC调试篇 设置 为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息,但是是不是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。 为了增加调试信息,可以按照下述步骤进行: ?打开Project settings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开) ?选择C/C++页,Category中选择general ,则出现一个Debug Info下拉列表框,可供选择的调试信息方式包括: ?选择Link页,选中复选框"Generate Debug Info",这个选项将使连接器把调试信息写进可执行文件和DLL ?如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。 调试方法:

1、使用 Assert(原则:尽量简单)assert只在debug下生效,release下不会被编译。 2、防御性的编程 3、使用Trace 4、用GetLastError来检测返回值,通过得到错误代码来分析错误原因 5、把错误信息记录到文件中 位置断点(Location Breakpoint) 大家最常用的断点是普通的位置断点,在源程序的某一行按F9就设置了一个位置断点。但对于很多问题,这种朴素的断点作用有限。譬如下面这段代码: void CForDebugDlg::OnOK() { for (int i = 0; i < 1000; i++) //A { int k = i * 10 - 2; //B SendTo(k); //C int tmp = DoSome(i); //D int j = i / tmp; //E } } 执行此函数,程序崩溃于E行,发现此时tmp为0,假设tmp本不应该为0,怎么这个时候为0呢?所以最好能够跟踪此次循环时DoSome函数是如何运行的,但由于是在循环体内,如果在E行设置断点,可能需要按F5(GO)许多次。这样手要不停的按,很痛苦。使用VC6断点修饰条件就可以轻易解决此问题。步骤如下。 1 Ctrl+B打开断点设置框,如下图:

调试程序的简单说明.

难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。 我以前接触的程序大多是有比较成形的思路和方法,调试起来出的问题都比较小,最近这个是我自己慢慢摸索调试,接触了很多新的调试方法,并查了很多前辈的总结,受益匪浅,总结以前的和新的收获如下: VC 调试篇 设置 为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard 创建的工程中包含的Debug Configuration 自动包含调试信息,但是是不是Debug 版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration 中增加调试信息,包括Release 版本。 为了增加调试信息,可以按照下述步骤进行: ? 打开Project settings 对话框(可以通过快捷键ALT+F7打开,也可以通过IDE 菜单Project/Settings 打开 ?选择C/C++页,Category 中选择general ,则出现一个Debug Info 下拉列表框,可供选择的调试信息方式包括: 命令行 Project settings 说明 无 None 没有调试信息 /Zd Line Numbers Only 目标文件或者可执行文件中只包含全局和导出符号以及代码行信息,不包含符号调试信息

/Z7 C 7.0- Compatible 目标文件或者可执行文件中包含行号和所有符号调试信息,包括变量名及类型,函数及原型等 /Zi Program Database 创建一个程序库(PDB,包括类型信息和符号调试信息。 /ZI Program Database for Edit and Continue 除了前面/Zi 的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。这个选项同时使 #pragma 设置的优化功能无效 ? 选择Link 页,选中复选框"Generate Debug Info",这个选项将使连接器把调试信息写进可执行文件和DLL ?如果C/C++页中设置了Program Database 以上的选项,则Link incrementally 可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译,而不必每次都从头开始编译。调试方法: 1、使用 Assert(原则:尽量简单assert只在debug下生效,release下不会被编译。 2、防御性的编程 3、使用Trace 4、用GetLastError来检测返回值,通过得到错误代码来分析错误原因 5、把错误信息记录到文件中 位置断点(Location Breakpoint 大家最常用的断点是普通的位置断点,在源程序的某一行按F9就设置了一个位置断点。但对于很多问题,这种朴素的断点作用有限。譬如下面这段代码:

VB程序调试技巧

一,如果遇到了一些逻辑性很强的问题比如有循环什么的我的方法是在关键地方加入 变量 这样可以比较好地找到问题 二,msgbox 三,监视窗口,如下面的例子 For i=1 to 10000 A=sqr(i) next i 你想再监视当i=799时A的值,就可以添加监视,方法:点调试,添加监视,选择“当监视值为真时中断”,上面表达式框中写上i=799, 这样你按F5,运行程序,程序会在i=799时中断。其他选项你可以自己去琢磨一下。 一个程序如何顺利的“脱产”,调试的过程是非常重要的。学过、钻研过程序设计的人都有同样的感受,很多情况下,调试程序的过程会比程序编写的过程更为困难。任何一个天才都不敢说,他编的程序是100%正确的。几乎每一个稍微复杂一点的程序都必须经过反复的调试、修改,最终才完成。所以说,程序的调试是编程中的一项重要技术。 程序中的典型错误类型 A类:语法错误。 B类:编译错误。

C类:属性设置错误。 D类:逻辑错误。 调试方法 方法一:利用“MSDN帮助菜单” “MSDN帮助菜单”是一个很好的自学工具,对于出现调试对话框的菜单来说,可以按下“帮助”按钮查看错误原因。 对于一些不是很清楚的函数格式、保留字的作用,也可以借助“帮助菜单”。 方法二:逐过程检查 主要检查代码是否写对,位置有没有错误,关键是要确定一段代码是在哪个事件控制下的。 不妨先在脑海中把整个程序过一边,想一想究竟会有哪些事件发生(有些事件是人机互动的,例如:鼠标点击;而有些是机器自己执行的,这时要想到计时器的作用);然后想一想每一件事发生后有什么效果。我们代码所编写的一般就是事件发生后的这个效果,那么以此事件来决定代码所写的位置。

C Free 5程序调试方法

C Free 5.0 程序的单步调试 创建一份新的代码文件 可直接点击“文件”下的白色图标,或点击“文件”选择“新建”,或按快捷键“Ctrl + N”(C Free 5.0默认情况下新建的代码文件为.cpp 格式,可在“工具”、“环境选项”、“新建文件类型”中更改,C语言标准格式为.c 格式) 基于实例的C程序调试介绍 一、查看变量的内容 # include int main(int argc, char* argv[]) { int i; int sum; sum=0; for(i=1;i<=10;i++) sum=sum+i; printf("sum=%d",sum); return 0; } 第一步,打开C Free 5.0,输入上面的代码。 第二步,把光标移到“sum=0;”这一行,按F10 它的作 用是设 一个断 点,程序 运行到 这里时, 会停下 来。也就 是说,接 下来,程 序必须 通过按 F7键单 步运行 了。 第三步: 按F9 (开始调试) 我们发现有一箭头停留在这句语句上,它指示程序停留的位置,而箭头所在的语句(“sum=0;”)还没有执行。事实上,我们可以通过看一下内存变量sum的内容来验证。方法是这样的: 打开“调试”下的“监视”,或者按快捷键“Alt + 3”。 在“监视”的空白处点击鼠标右键,选择“添加监视”。

输入需要监视的变量名,这里输入为sum 这时我们可以在监视窗口中看到sum的内容不为0,而是一个随机的值。 第四步,我们按一下F7(进入),我们发现sum的内容变为0了。这说明“sum=0;”这句语句被执行了。 我们还可以用同样的方法看一下i的内容。 只需要鼠标点 第六步,一步一步地按F7,我们可以发现在单步执行for循环语句的时候i和sum的内容在不断变化。当退出循环时,我们发现i的内容为11(因为变量i的内容为11,i<=10这个条件不满足,所以程序退出循环)。 附带提一下,当程序已经执行了“sum=0;”这一句语句后,如果我们直接把光标移到“printf("sum=%d",sum);”,然后按Ctrl+ F8,我们可以直接把上面的for循环都执行了,而不必一步一步地按F7。在实践中,为了查找程序的逻辑错误,我们往往要单步运行该程序好几遍。如果已经通过单步调试验证某一段语句(如一个for循环语句或者几个用户定义的函数)正确了,我们就可以用Ctrl+ F8跳过这段语句,直接运行到还未测试的语句。二、F7(进入)和F8(跳过)的区别 # include int add(int m,int n) { int s; s=m+n; return s; } int main(int argc, char* argv[]) { int i=1; int j=2;

我对软件开发过程的理解

软件开发的过程 摘要:软件开发过程即软件设计思路和方法的一般过程,包括设计软件的功能和实现的算法和方法、软件的总体结构设计和模块设计、编程和调试、程序联调和测试以及编写、提交程序。 生产一个最终能满足需求且达到工程目标的软件产品所需要的步骤。软件开发过程覆盖了需求、设计、实现、确认以及维护等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义,又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件系统结构,包括子系统、模块以及相关层次的说明、每一模块的接口定义。详细设计产生程序员可用的模块说明,包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行的程序代码。确认活动贯穿于整个开发过程,实现完成后的确认,保证最终产品满足用户的要求。维护活动包括使用过程中的扩充、修改与完善。 1.需求分析 1.1 需求分析的特点和任务 需求分析是软件开发的第一步。获取需求的一个必不可少的结果是对项目中描述的客户需求的普遍理解。一旦理解了需求,分析者、开发者和客户就能探索出描述这些需求的多种解决方案。参与需求获取者只有在他们理解了问题之后才能开始设计系统,否则,对需求定义的任何改进,设计上都必须大量的返工。把需求获取集中在用户任务上—而不是集中在用户接口上—有助于防止开发组由于草率处理设计问题而造成的失误。有几种原因使需求分析变得困难:(1)客户说不清楚需求;(2)需求自身经常变动;(3)分析人员或客户理解有误。 需求获取、分析、编写需求规格说明和验证并不遵循线性的顺序,这些活动是相互隔开、增量和反复的。当你和客户合作时,你就将会问一些问题,并且取得他们所提供的信息(需求获取)。同时,你将处理这些信息以理解它们,并把它们分成不同的类别,还要把客户需求同可能的软件需求相联系(分析)。然后,你可以使客户信息结构化,并编写成文档和示意图(说明)。下一步,就可以让客户代表评审文档并纠正存在的错误(验证)。这四个过程贯穿着需求分析的整个阶段。需求获取可能是软件开发中最困难、最关键、最易出错及最需要交流的方面。需求获取只有通过有效的客户—开发者的合作才能成功。分析者必须建立一个对问题进行彻底探讨的环境,而这些问题与产品有关。为了方便清晰地进行交流,就要列出重要的小组,而不是假想所有的参与者都持有相同的看法。对需求问题的全面考察需要一种技术,利用这种技术不但考虑了问题的功能需求方面,还可讨论项目的非功能需求。确定用户已经理解:对于某些功能的讨论并不意味着即将在产品中实现它。对于想到的需求必须集中处理并设定优先级,以避免一个不能带来任何益处的无限大的项目。 1.2.需求分析的一般方法 跟班作业。通过亲身参加业务工作来了解业务活动的情况。这种方法可以比

PLC程序调试方法及步骤

来源:中国物资采购网时间:2010年5月6日11时20分【大中小】PLC程序的调试可以分为模拟调试和现场调试两个调试过程,在此之前首先对PLC外部接线作仔细检查,这一个环节很重要。外部接线一定要准确无误。也可以用事先编写好的试验程序对外部接线做扫描通电检查来查找接线故障。不过,为了安全考虑,最好将主电路断开。当确认接线无误后再连接主电路,将模拟调试好的程序送入用户存储器进行调试,直到各部分的功能都正常,并能协调一致地完成整体的控制功能为止。 1.程序的模拟调试 将设计好的程序写入PLC后,首先逐条仔细检查,并改正写入时出现的错误。用户程序一般先在实验室模拟调试,实际的输入信号可以用钮子开关和按钮来模拟,各输出量的通/断状态用PLC上有关的发光二极管来显示,一般不用接PLC实际的负载(如接触器、电磁阀等)。可以根据功能表图,在适当的时候用开关或按钮来模拟实际的反馈信号,如限位开关触点的接通和断开。对于顺序控制程序,调试程序的主要任务是检查程序的运行是否符合功能表图的规定,即在某一转换条件实现时,是否发生步的活动状态的正确变化,即该转换所有的前级步是否变为不活动步,所有的后续步是否变为活动步,以及各步被驱动的负载是否发生相应的变化。 在调试时应充分考虑各种可能的情况,对系统各种不同的工作方式、有选择序列的功能表图中的每一条支路、各种可能的进展路线,都应逐一检查,不能遗漏。发现问题后应及时修改梯形图和PLC中的程序,直到在各种可能的情况下输入量与输出量之间的关系完全符合要求。 如果程序中某些定时器或计数器的设定值过大,为了缩短调试时间,可以在调试时将它们减小,模拟调试结束后再写入它们的实际设定值。 在设计和模拟调试程序的同时,可以设计、制作控制台或控制柜,PLC之外的其他硬件的安装、接线工作也可以同时进行。 2.程序的现场调试 完成上述的工作后,将PLC安装在控制现场进行联机总调试,在调试过程中将暴露出系统中可能存在的传感器、执行器和硬接线等方面的问题,以及PLC的外部接线图和梯形图程序设计中的问题,应对出现的问题及时加以解决。如果调试达不到指标要求,则对相应硬件和软件部分作适当调整,通常只需要修改程序就可能达到调整的目的。全部调试通过后,经过一段时间的考验,系统就可以投入实际的运行了。 本文来自: 中国物资采购网https://www.wendangku.net/doc/7514410547.html, 详细出处参考:https://www.wendangku.net/doc/7514410547.html,/newsinfo/2010-5-6/201056-11200321719338297.html PLC程序现场调试指在工业现场,甩有设备都安装好后,所有连接线都接好后的实际调试。也是PLC程序的最后调试。现场调试的目的是,调试通过后,可交给用户使用,或试运行。现场调试参与的人员较多,要组织好,要有调试大纲。依大纲,按部就班地一步步推进。开始调试时,设备可先不运转,甚至了不要带电。可随着调试的进展逐步加电、开机、加载,直到按额定条件运转。具体过程大体是: 1)、要查接线、核对地址。要逐点进行,要确保正确无误。可不带电核对,那就是查线,较麻烦。也可带电查,加上信号后,看电控系统的动作情况是否符合设计的目的。 2)、检查模拟量输入输出。看输入输出模块是否正确,工作是否正常。必要时,还可用标准仪器检查输入输出的精度。 3)、检查与测试指示灯。控制面板上如有指示灯,应先对应指示灯的显示进行检查。一方面,查看灯坏了没有,另一方面检查逻辑关系是否正确。指示灯是反映系统工作的一面镜子,先调好它,将对进一步调试提供方便。 4)、检查手动动作及手动控制逻辑关系。完成了以上调试,继而可进行手动动作及手动

相关文档