| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1008 人关注过本帖
标题:帮我查查我的程序逻辑哪里出错了
只看楼主 加入收藏
lampeter123
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:54
帖 子:2508
专家分:6424
注 册:2009-1-30
收藏
得分:0 
以下是引用linjx0123在2010-4-15 09:30:06的发言:

你写的程序,逻辑本身就错误的,就算改得好,也是一个很差的程序。
我写的程序,都跟你的指令一样的,只要把
public int getSize(){
    return size;
}
改成
public int size(){
   return size;
}
就行了。

还有你的测试函数(Hw03)中的
String[] array=new String[2];
数组长度不够,输入remove的时候就溢出了,所以改成
String[] array=new String[5];
就可以了。
楼上的程序是按JavaBean的规范写的,JavaBean的类一般都有setter,getter方法

你的优秀和我的人生无关!!!!
    
    我要过的,是属于我自己的生活~~~
2010-04-15 09:56
suckdog
Rank: 1
等 级:新手上路
帖 子:130
专家分:0
注 册:2007-9-19
收藏
得分:0 
以下是引用linjx0123在2010-4-15 09:30:06的发言:

你写的程序,逻辑本身就错误的,就算改得好,也是一个很差的程序。
我写的程序,都跟你的指令一样的,只要把
public int getSize(){
    return size;
}
改成
public int size(){
   return size;
}
就行了。

还有你的测试函数(Hw03)中的
String[] array=new String[2];
数组长度不够,输入remove的时候就溢出了,所以改成
String[] array=new String[5];
就可以了。
我的不是character array, 我的是string array,所以不会溢出来, 上面的一个method,改成你那样其实本质没区别, 望大家再来帮我找找错误
2010-04-15 10:16
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
收藏
得分:0 
大哥,你试过没呢,你所说的方法在里面都一样的呀,我这里都运行过了,没出任何问题
算了我还是直接把一个一个类贴出来好了
public class Memory {
    private final int STR_SIZE = 9;
    private final  int SIZE_INCREASE = 9;
    private int  size = 0;
    private Person[] persons = new Person[STR_SIZE];

    public Memory() {
        
    }
   
    //扩展数组长度函数,假如数组长度不够,以SIZE_INCREASE扩展
    private Person[] increaseStr(Person[] str, int increaseSize){
        Person[] result = new Person[str.length+increaseSize];
        for(int i=0;i<str.length;i++){
            result[i]=str[i];
        }
        return result;
    }

    public void put(String name, String numberOne) {
        if(size>=persons.length){
            persons = increaseStr(persons,SIZE_INCREASE);
        }
        Person p=new Person();
        p.setName(name);
        p.setNumber(Integer.parseInt(numberOne));
        persons[size] = p;
        size++;
    }

    public String get(String name) {
        int result=-1;
        for(int i=0;i<size;i++){
            if(persons[i].getName().equals(name)){
                result=persons[i].getNumber();
                break;
            }
        }
        return new Integer(result).toString();
    }
   
    public int size(){
        return size;
    }

    public void remove(String name) {
        int j=0,i;
        for(i=0;i<size;i++){
            if(!persons[i].getName().equals(name)){
                persons[j++] = persons[i];
            }else{
               
            }
        }
        if(i==j)
            return;
        persons[size-1]=null;
        size--;
    }

    public void clear() {
        for (int i = 0; i < size; i++) {
            persons[i] = null;
        }
        size=0;
    }
}


//封装了put join 36的name(join)和number(36)
public class Person {
    private String name;
    private int number;
    protected String getName() {
        return name;
    }
    protected void setName(String name) {
        this.name = name;
    }
    protected int getNumber() {
        return number;
    }
    protected void setNumber(int number) {
        this.number = number;
    }
}


import
import java.util.Scanner;
import java.util.StringTokenizer;

public class Hw03 {
    public static void main(String[] args) throws IOException {
        int i = 0, flag = 0;
        String command, name, number; // To hold command
        String[] array = new String[2];

        Scanner keyboard = new Scanner(System.in);
        
        //实例必须在循环体外,不然每次都生成一个新的,就没有用了
        //假如要放在do里面,就必须把men设成单件模式
        Memory mem = new Memory();
        
        do {
            System.out.print("Command? ");
            command = keyboard.nextLine();
            StringTokenizer strTokenizer = new StringTokenizer(command,
                    "get put");
            while (strTokenizer.hasMoreTokens()) {
                array[i] = strTokenizer.nextToken();
                i++;
            }
            i = 0;
            name = array[0];
            number = array[1];

            if (command.startsWith("size"))
                System.out.println("Currently remembering " + mem.size()
                        + " things.");

            else if (command.startsWith("help")) {
                System.out.println("get      Retrieve an item by its key");
                System.out.println("put      Store a <key,value> pair");
                System.out.println("clear    Removes all pairs from the memory");
                System.out.println("exit     Exit the program");
                System.out.println("help     Display this text");
                System.out.println("remove   Removes a given key from the memory");
                System.out.println("size     Report the size of the memory");
            }

            else if (command.startsWith("exit"))
                flag = 1;

            else if (command.startsWith("put"))
                mem.put(name, number);

            else if (command.startsWith("get")) {
                if (mem.get(name) == "-1")
                    System.out.println("That key gets null.");
                else
                    System.out.println("That key gets " + mem.get(name));
            }

            else if (command.startsWith("remove"))
                mem.remove(name);

            else if (command.startsWith("clear")) {
                mem.clear();
                System.out.println("Memory has been cleared!");
            }
        } while (flag != 1);
    }
}
2010-04-15 10:29
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
收藏
得分:0 
在你的程序里
1 没有真正的扩展数组的方法,你就用了String[] extended = new String[1000000];来代替,这个是错误的
  假如非要这样,你就不要再定义 public int size=9;String[] a=new String[size];这两个了,直接用
  String[] a=new String[1000000];还有一点,局部变量不要写成public修饰,没必要把变量公开
2 你的size()方法,根本不是求出数组里存有几个对象。你的原意是,像c语言一样,遇到一个‘\0’就可以
  得出数组长度,但是,java是面向对象语言,不这么设计的,要用一个变量来标记对象本身的属性。所以,
  正确的做法是声明一个变量currentSize来跟踪数组的长度,一旦put一个对象进去,就加1;remove一个的时
  候就减1.  
  就算你想用c语言的方式,你的逻辑也还是错误的。
            while (extended[i]=="")
            {
                count++;
                i++;
            }
  这个应该是不等于,才自增
            if (count==0)
                return count;
            else
                return count+1;
  循环里已经count++了,再count+1就错了;直接return count;

3 你的put方法里,是允许put同名的,
                    System.arraycopy(a, 0, extended, 0, a.length);
                    System.arraycopy(b, 0, extendedOne, 0, b.length);
  每次都把a从0开始把整个复制到extended的0至a.length,整来整去,extended一直都只有a.length个元素
  我写的程序里,put是不允许同名的,要是你想允许同名的话,做个小修改
    public void put(String name, String numberOne) {
        for(Person p:persons){
            if(p.getName().equals(name))
                return;         
        }

        if(size>=persons.length){
            persons = increaseStr(persons,SIZE_INCREASE);
        }
        Person p=new Person();
        p.setName(name);
        p.setNumber(Integer.parseInt(numberOne));
        persons[size] = p;
        size++;
    }
其他的我不说了,错误太多


2010-04-15 11:04
suckdog
Rank: 1
等 级:新手上路
帖 子:130
专家分:0
注 册:2007-9-19
收藏
得分:0 
你的程序我测试过了, 不过每次我输入6个字母的名字就当掉了, 如put andrew 77

[ 本帖最后由 suckdog 于 2010-4-15 11:31 编辑 ]
2010-04-15 11:28
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
收藏
得分:0 
那是因为你的测试用例错误了
            StringTokenizer strTokenizer = new StringTokenizer(command,
                    "get put");
            while (strTokenizer.hasMoreTokens()) {
                array[i] = strTokenizer.nextToken();
                i++;
            }




import
import java.util.Scanner;
import java.util.StringTokenizer;

public class Hw03 {
    public static void main(String[] args) throws IOException {
        int i = 0, flag = 0;
        String command, name="", number=""; // To hold command
        Scanner keyboard = new Scanner(System.in);
        
        //实例必须在循环体外,不然每次都生成一个新的,就没有用了
        //假如要放在do里面,就必须把men设成单件模式
        Memory mem = new Memory();
        
        do {
            System.out.print("Command? ");
            command = keyboard.nextLine();
            String str[] = command.split(" ");
            
            for(i=0;i<str.length;i++){
                if(i==1)
                    name=str[1];
                if(i==2)
                    number=str[2];
            }

            if (command.startsWith("size"))
                System.out.println("Currently remembering " + mem.size()
                        + " things.");

            else if (command.startsWith("help")) {
                System.out.println("get      Retrieve an item by its key");
                System.out.println("put      Store a <key,value> pair");
                System.out.println("clear    Removes all pairs from the memory");
                System.out.println("exit     Exit the program");
                System.out.println("help     Display this text");
                System.out.println("remove   Removes a given key from the memory");
                System.out.println("size     Report the size of the memory");
            }

            else if (command.startsWith("exit"))
                flag = 1;

            else if (command.startsWith("put"))
                mem.put(name, number);

            else if (command.startsWith("get")) {
                if (mem.get(name) == "-1")
                    System.out.println("That key gets null.");
                else
                    System.out.println("That key gets " + mem.get(name));
            }

            else if (command.startsWith("remove"))
                mem.remove(name);

            else if (command.startsWith("clear")) {
                mem.clear();
                System.out.println("Memory has been cleared!");
            }
        } while (flag != 1);
    }
}

2010-04-15 11:54
suckdog
Rank: 1
等 级:新手上路
帖 子:130
专家分:0
注 册:2007-9-19
收藏
得分:0 
我输入一个不存在的人, 如果"get john", 程序给出“that key returns a -1", 我程序里不是写得return null吗, 为什么会给我-1?
2010-04-15 12:15
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
收藏
得分:0 
这个问题前面已经解释了,因为判断是否相等要用equals,
else if (command.startsWith("get")) {
                if (mem.get(name).equals("-1"))
                    System.out.println("That key gets null.");
                else
                    System.out.println("That key gets " + mem.get(name));
            }
2010-04-15 12:30
快速回复:帮我查查我的程序逻辑哪里出错了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.060061 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved