Xin giúp mình bài Java (mình là newbie)

phuctran_pt_83

New Member
6/7/21
3
1
3
VietNam
Tạo lớp đa giác, tính chu vi, sau đó tạo ra lớp tam giác extends lớp đa giác có thêm phần tính diện tích (Phần này mình làm được). Sau đó viết chương trình nhập xuất n tam giác.
Java:
import java.io.*;
public class DaGiac {
    public static int socanh;
    public static int[] a;
 
    public static String nhapXau(){
        String str;
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader stream = new BufferedReader(isr);
        try{
            str = stream.readLine();

        }catch(IOException e){
            str = "0";
        }
        return str;
    }

    public static int doiXau(String str){
      int so;
      try{
          so = Integer.valueOf(str).intValue();
      }catch(NumberFormatException e){
          so = 0;
      }
      return so;
    }

    public void nhapCanh(){
        System.out.print("Nhập số cạnh: ");
        socanh = doiXau(nhapXau());
        a = new int[socanh];
        for(int i = 0 ; i < socanh ; i++) {
                System.out.println("Cạnh thứ " + (i + 1) + ": ");
                a[I] = doiXau(nhapXau());
        }
    }

    public int chuVi(){
        int cv = 0;
        for(int i = 0 ; i < socanh ; i++) {
            cv += a[I];
        }
        return cv;
    }
  
    public void xuatCanh(){
        System.out.println("Hiển thị độ dài: ");
        for(int i = 0 ; i < socanh ; i++) {
            System.out.println("Cạnh thứ " + (i + 1) + ": " + a[I]);
        }
}

    public DaGiac() {
        // TODO Auto-generated constructor stub
    }

}
Java:
public class TamGiac extends DaGiac {
  
     public void nhapCanh(){
            a = new int[3];
            for(int i = 0 ; i < 3 ; i++) {
                    System.out.println("Cạnh thứ " + (i + 1) + ": ");
                    a[I] = doiXau(nhapXau());
            }
        }
  
     public void xuatCanh(){                //k lấy bên DaGiac vì biến socanh nó k hiểu
            for(int i = 0 ; i < 3 ; i++) {
                System.out.println("Cạnh thứ " + (i + 1) + ": " + a[I]);
            }
    }
   
    public int chuVi(){
        int cv = 0;
        for(int i = 0 ; i < 3 ; i++) {
            cv += a[I];
        }
        return cv;
    }

    public double dienTich() {
        double m = a[0];
        double n = a[1];
        double k = a[2];
        double p = (m+n+k)/2;
        System.out.format("%.2f", Math.sqrt(p*(p-m)*(p-n)*(p-k)));         //chú ý làm tròn
        System.out.println();
        return Math.sqrt(p*(p-m)*(p-n)*(p-k));
    }

}
Java:
public class ClassTamGiac {
    TamGiac tamgiac;
  
    public ClassTamGiac() {
        super();
    }
}
public class Main {
    static int soTamGiac;
    public static void main(String[] args) throws NumberFormatException, IOException {
        DaGiac A = new DaGiac();
        System.out.println("========== Nhập đa giác =============");
        A.nhapCanh();
        A.xuatCanh();
        System.out.println("Chu vi : " + A.chuVi());
        DaGiac B = new TamGiac();
        System.out.println("========== Nhập tam giác =============");
        B.nhapCanh();
        B.xuatCanh();
        System.out.println("Chu vi : " + B.chuVi());
        System.out.println("Diện tích : " + ((TamGiac) B).dienTich());      //ép B về TamGiac
           
      
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
        System.out.println("Số tam giác: ");         soTamGiac = Integer.valueOf(nhapgt()).intValue();
        ClassTamGiac[] classtamgiac = new ClassTamGiac[soTamGiac];
        for(int m = 0; m < soTamGiac; m++) {
            classtamgiac[m] = new ClassTamGiac();
            nhap(classtamgiac[m]);
        }
      
        System.out.println("======== HIỂN THỊ TAM GIÁC ============");
        for(int m = 0; m < soTamGiac; m++) {
            System.out.println("Tam giác thứ " + (m + 1) + ": ");
            xuat(classtamgiac[m]);
            System.out.println("------------------------");
        }
      
    } //end main
      
        private static void xuat(ClassTamGiac ctg) {
                ctg.tamgiac.xuatCanh();
    }
          
        private static void nhap(ClassTamGiac ctg) throws NumberFormatException, IOException {
            ctg.tamgiac = new TamGiac();
            ctg.tamgiac.nhapCanh();
        }
        static String nhapgt()throws IOException {
            String str;
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader stream = new BufferedReader(isr);
            str =stream.readLine();
            return str;
            }
  
    }
Code:
Kết quả
======== HIỂN THỊ TAM GIÁC ============
Tam giác thứ 1:
Cạnh thứ 1: 2
Cạnh thứ 2: 4
Cạnh thứ 3: 6
------------------------
Tam giác thứ 2:
Cạnh thứ 1: 2
Cạnh thứ 2: 4
Cạnh thứ 3: 6
------------------------
Mình bị sai chỗ nào xin các bạn chỉ giúp.
 
Last edited by a moderator:

Joe

Thành viên VIP
21/1/13
2,958
1,323
113
Hi
First of all please use the tags (see yellow arrows) to insert the codes or read HERE to learn how to do that:

javaTag.png
To your codes:
Java:
    ...
    public static int doiXau(String str){
      int so;
      try{
          //so = Integer.valueOf(str).intValue();
          so = Integer.parseInt(str); // <----- better
      }catch(NumberFormatException e){
          so = 0;
      }
      return so;
    }
    ...
    public void nhapCanh(){
        System.out.print("Nhập số cạnh: ");
        socanh = doiXau(nhapXau());
        a = new int[socanh];
        for(int i = 0 ; i < socanh ; i++) {
                System.out.println("Cạnh thứ " + (i + 1) + ": ");
                a[I] = doiXau(nhapXau()); // <------------------ WHERE is I when the loop use i ?
        }


    public int chuVi(){
        int cv = 0;
        for(int i = 0 ; i < socanh ; i++) {
            cv += a[I]; // <----------------why I ?
        }
        return cv;
    }

    public void xuatCanh(){
        System.out.println("Hiển thị độ dài: ");
        for(int i = 0 ; i < socanh ; i++) {
            System.out.println("Cạnh thứ " + (i + 1) + ": " + a[I]); // <---------Why I ?
        }
You coded a loop with i (lower case) but indexed the array element with I (upper case). The best way to write the codes is to code directly. Example:
Java:
    public static int doiXau(String str){
      //int so;
      try{
          //so = Integer.valueOf(str).intValue();
          return Integer.parseInt(str);
      }catch(NumberFormatException e){
          //so = 0;
      }
      //return so;
      return 0;
    }
OK?
PS: I cannot check your codes with my editor because of String in Vietnamese characters. See Point 2 of the preconditions of THIS THREAD if you want I check the codes for you:
 
Sửa lần cuối:

phuctran_pt_83

New Member
6/7/21
3
1
3
VietNam
Mình Post lại bài, các bạn giúp mình sai chỗ nào nha
Java:
import java.io.*;

public class DaGiac {
    public static int socanh;
    public static int[] a;
    public DaGiac() {}

    public static String nhapXau(){
        String str;
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader stream = new BufferedReader(isr);
        try{
            str = stream.readLine();

        }catch(IOException e){
            str = "0";
        }
        return str;
    }

    public static int doiXau(String str){
      int so;
      try{
          so = Integer.parseInt(str);
      }catch(NumberFormatException e){
          so = 0;
      }
      return so;
    }
 
    public void nhapCanh(){
        System.out.print("Nhập số cạnh: ");
        socanh = doiXau(nhapXau());
        a = new int[socanh];
        for(int i = 0 ; i < socanh ; i++) {
                System.out.println("Cạnh thứ " + (i + 1) + ": ");
                a[i] = doiXau(nhapXau());
        }
    }

    public int chuVi(){
        int cv = 0;
        for(int i = 0 ; i < socanh ; i++) {
            cv += a[i];
        }
        return cv;
    }
    
    public void xuatCanh(){
        System.out.println("Hiển thị độ dài: ");
        for(int i = 0 ; i < socanh ; i++) {
            System.out.println("Cạnh thứ " + (i + 1) + ": " + a[i]);
        }
    }

}

public class TamGiac extends DaGiac {
    
     public void nhapCanh(){
            a = new int[3];
            for(int i = 0 ; i < 3 ; i++) {
                    System.out.println("Cạnh thứ " + (i + 1) + ": ");
                    a[i] = doiXau(nhapXau());
            }
        }
    
     public void xuatCanh(){            \
            for(int i = 0 ; i < 3 ; i++) {
                System.out.println("Cạnh thứ " + (i + 1) + ": " + a[i]);
            }
    }
    
    public int chuVi(){
        int cv = 0;
        for(int i = 0 ; i < 3 ; i++) {
            cv += a[i];
        }
        return cv;
    }

    public double dienTich() {
        double m = a[0];
        double n = a[1];
        double k = a[2];
        double p = (m+n+k)/2;
        return Math.sqrt(p*(p-m)*(p-n)*(p-k));
    }

}

public class ClassTamGiac {             
    TamGiac tamgiac;
    
    public ClassTamGiac() {
        super();
    }
}

import java.io.*;

public class Main {
    static int soTamGiac;
    public static void main(String[] args) throws NumberFormatException, IOException {
        DaGiac A = new DaGiac();
        System.out.println("========== Nhập đa giác =============");
        A.nhapCanh();
        A.xuatCanh();
        System.out.println("Chu vi : " + A.chuVi());
        DaGiac B = new TamGiac();
        System.out.println("========== Nhập tam giác =============");
        B.nhapCanh();
        B.xuatCanh();
        System.out.println("Chu vi : " + B.chuVi());
        System.out.println("Diện tích : " + ((TamGiac) B).dienTich());     
            
        
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
      
        System.out.println("Số tam giác: ");         soTamGiac = Integer.valueOf(nhapgt()).intValue();
        ClassTamGiac[] classtamgiac = new ClassTamGiac[soTamGiac];
        for(int m = 0; m < soTamGiac; m++) {
            classtamgiac[m] = new ClassTamGiac();
            nhap(classtamgiac[m]);
        }
        
        System.out.println("======== HIỂN THỊ TAM GIÁC ============");
        for(int m = 0; m < soTamGiac; m++) {
            System.out.println("Tam giác thứ " + (m + 1) + ": ");
            xuat(classtamgiac[m]);
            System.out.println("------------------------");
        }
        
    } //end main
        
        private static void xuat(ClassTamGiac ctg) {
                ctg.tamgiac.xuatCanh();
    }
            
        private static void nhap(ClassTamGiac ctg) throws NumberFormatException, IOException {
            ctg.tamgiac = new TamGiac();
            ctg.tamgiac.nhapCanh();
        }
        static String nhapgt()throws IOException {
            String str;
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader stream = new BufferedReader(isr);
            str =stream.readLine();
            return str;
            }
    
}
Kết quả
======== HIỂN THỊ TAM GIÁC ============
Tam giác thứ 1:
Cạnh thứ 1: 6
Cạnh thứ 2: 7
Cạnh thứ 3: 5
------------------------
Tam giác thứ 2:
Cạnh thứ 1: 6
Cạnh thứ 2: 7
Cạnh thứ 3: 5
------------------------
Tam giác thứ 3:
Cạnh thứ 1: 6
Cạnh thứ 2: 7
Cạnh thứ 3: 5
------------------------
 

Joe

Thành viên VIP
21/1/13
2,958
1,323
113
I wonder why you ignored my previous reply with the hint:
PS: I cannot check your codes with my editor because of String in Vietnamese characters. See Point 2 of the preconditions of THIS THREAD if you want I check the codes for you:
So I have spent a lot of time to correct the trivial things like this:
Java:
//System.out.print("Nhập số cạnh: "); // <---Vietnamese characters !!!!
System.out.print("Nhap so canh: ");  // change the string to ASCII without accents.
Please consider that for the next time, otherwise I won't waste my time because of such trivial things.


Back to the codes:

First of all: please separate the codes according to the classes: Dagiac.java, TamGiac.java, ClassTamGiac.java and Main.java, NOT ALL in ONE like what you did. You've wasted my time for the separation of the classes.
Then: If you want to be helped then you should follow the rules and make things easier for the helpers. Got it?

Problem 1: DaGiac.java: static is only meaningful if it is used through out the app as a constant.
Java:
import java.io.*;

public class DaGiac {
    //public static int socanh;
    //public static int[] a;
    public  int socanh;
    public  int[] a;
    public DaGiac() {}

    //public static String nhapXau(){
    public String nhapXau(){
        String str;
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader stream = new BufferedReader(isr);
        try{
            str = stream.readLine();

        }catch(IOException e){
            str = "0";
        }
        return str;
    }

    //public static int doiXau(String str){
    public int doiXau(String str){
      //int so;
      try{
          return Integer.parseInt(str);
      }catch(NumberFormatException e){
          //so = 0;
      }
      //return so;
      return 0;
    }

    public void nhapCanh(){
        System.out.print("Nhap so canh: ");
        socanh = doiXau(nhapXau());
        a = new int[socanh];
        for(int i = 0 ; i < socanh ; i++) {
                System.out.println("Canh thu " + (i + 1) + ": ");
                a[i] = doiXau(nhapXau());
        }
    }

    public int chuVi(){
        int cv = 0;
        for(int i = 0 ; i < socanh ; i++) {
            cv += a[i];
        }
        return cv;
    }

    public void xuatCanh(){
        System.out.println("Hien thi do dai: ");
        for(int i = 0 ; i < socanh ; i++) {
            System.out.println("Canh thu " + (i + 1) + ": " + a[i]);
        }
    }

}
Problem 2: TamGiac.java and ClassTamGiac.java (superfluous).TamGiac is the son of DaGiac and ClassTamGiac is the son of TamGiac. Both INHERIT all methods of DaGiac. Therefore there's NO NEED to repeat the inherited methods if they are the SAME. That is that what it is called INHERITANCE of Object Oriented Programming Language (OOPL).
Java:
public class TamGiac extends DaGiac {
    public TamGiac() {
      super();
    }
    /*
     public void nhapCanh(){
            //a = new int[3];
            //for(int i = 0 ; i < 3 ; i++) {
            for(int i = 0 ; i < socanh ; i++) {
                    System.out.println("Canh thu " + (i + 1) + ": ");
                    a[i] = doiXau(nhapXau());
            }
        }
     public void xuatCanh(){
            for(int i = 0 ; i < 3 ; i++) {
                System.out.println("Canh thu " + (i + 1) + ": " + a[i]);
            }
    }

    public int chuVi(){
        int cv = 0;
        for(int i = 0 ; i < 3 ; i++) {
            cv += a[i];
        }
        return cv;
    }
    */
    public double dienTich() {
        double m = a[0];
        double n = a[1];
        double k = a[2];
        double p = (m+n+k)/2;
        return Math.sqrt(p*(p-m)*(p-n)*(p-k));
    }
}
Java:
public class ClassTamGiac extends TamGiac{         
    //TamGiac tamgiac;
    public ClassTamGiac() {
        super();
    }
}
Problem 3: Main.java. You don't seem to understand the purpose of OOPL and INHERITANCE. Example:
Java:
        //DaGiac B = new TamGiac();
        TamGiac B = new TamGiac();
         ....
        //System.out.println("Dien tich : " + ((TamGiac) B).dienTich()); 
        System.out.println("Dien tich : " + B.dienTich());
and the Instantiation of Objects. Example:
Java:
        for(int m = 0; m < soTamGiac; m++) {
            classtamgiac[m] = new ClassTamGiac();
            //nhap(classtamgiac[m]);
            classtamgiac[m].nhapCanh();
        }
So, the functional Main.java:
Java:
import java.io.*;

public class Main {
    static int soTamGiac;
    public static void main(String[] args) throws NumberFormatException, IOException {
        DaGiac A = new DaGiac();
        System.out.println("========== Nhap da giac =============");
        A.nhapCanh();
        A.xuatCanh();
        System.out.println("Chu vi : " + A.chuVi());
        //DaGiac B = new TamGiac();
        TamGiac B = new TamGiac();
        System.out.println("========== Nhap tam giac =============");
        B.nhapCanh();
        B.xuatCanh();
        System.out.println("Chu vi : " + B.chuVi());
        //System.out.println("Dien tich : " + ((TamGiac) B).dienTich()); 
        System.out.println("Dien tich : " + B.dienTich());
        
    
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
        System.out.println("So tam giac: ");    
        //soTamGiac = Integer.valueOf(nhapgt()).intValue();
        soTamGiac = nhapgt();
        ClassTamGiac[] classtamgiac = new ClassTamGiac[soTamGiac];
        for(int m = 0; m < soTamGiac; m++) {
            //classtamgiac[m] = new ClassTamGiac();
            //nhap(classtamgiac[m]);
            classtamgiac[m] = new TamGiac(); // <--- direct instead of ClassTamGiac
            classtamgiac[m].nhapCanh();
        }
    
        System.out.println("======== HIEN THI TAM GIAC ============");
        for(int m = 0; m < soTamGiac; m++) {
            System.out.println("Tam giac thu " + (m + 1) + ": ");
            //xuat(classtamgiac[m]);
            classtamgiac[m].xuatCanh();
            System.out.println("------------------------");
        }
    
    } //end main
/*    
        private static void xuat(ClassTamGiac ctg) {
                //ctg.tamgiac.xuatCanh();
                ctg.xuatCanh();
    }
        private static void nhap(ClassTamGiac ctg) throws NumberFormatException, IOException {
            //ctg.tamgiac = new TamGiac();
            //ctg.tamgiac.nhapCanh();
            ctg = new ClassTamGiac();
            ctg.nhapCanh();
        }
*/        
        //static String nhapgt()throws IOException {
        static int nhapgt()throws IOException {
            //String str;
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader stream = new BufferedReader(isr);
            return Integer.parseInt(stream.readLine());
            //str =stream.readLine();
            //return str;
         }

}
 
Sửa lần cuối:
  • Love
Reactions: phuctran_pt_83

phuctran_pt_83

New Member
6/7/21
3
1
3
VietNam
Xin cảm ơn Joe, mình cũng đã hiểu thêm rồi. Bạn hướng dẫn rất kĩ và chi tiết. Mình xóa lớp ClassTamGiac luôn rồi.
 
  • Like
Reactions: Joe