Mảng 2 chiều, viết chương trình random 1 câu và hiện câu hỏi, đáp án

Trungkienbk

New Member
21/3/13
20
0
1
27
Em cũng có ý đinh làm như anh JackV
đó là tạo class cho đối tượng cauhoi với những thuộc tính như trên

nhưng em đang mắc việc đọc dữ liệu từ file txt vào 1 mảng với những cauhoi được ngăn cách nhau bởi dấu "\" và những thuộc tính được ngăn cách nhau bởi dấu ";"

trước khi em tạo topic này thấy trên này cũng có 1 topic khác tương tự về việc đọc file chứa Tên và Điểm của các sinh viên vào đối tượng sinhvien dùng split nhưng em tìm mãi mà giờ ko thấy. A/c nào biết topic đó ở đâu cho em xin cái đường link hoặc chỉ giúp e đc ko ạ ? :D tại em mới học java việc tự tìm hiểu mà cứ mịt mù quá . Em cảm ơn ạ :

Class câu hỏi này của em nh này có đc ko ? :D

Code:
public class Cauhoi {
private String NoiDungCauHoi ;
private String LuaChon1;
private String LuaChon2;
private String LuaChon3 ;
private String LuaChon4 ;
private String DapAn ;

    public String getNoiDungCauHoi () {
    return NoiDungCauHoi ;
}
public void setNoiDungCauHoi ( String NoiDungCauHoi) throws Exception{
    this.NoiDungCauHoi = NoiDungCauHoi ; }
public String getLuaChon1 () {
    return NoiDungCauHoi ;
}
public void setLuaChon1 ( String LuaChon1) throws Exception{
    this.LuaChon1 = LuaChon1 ; }
public String getLuaChon2 () {
    return NoiDungCauHoi ;
}
public void setLuaChon2( String LuaChon2) throws Exception{
    this.LuaChon1 = LuaChon2 ; }
public String getLuaChon3 () {
    return NoiDungCauHoi ;
}
public void setLuaChon3 ( String LuaChon3) throws Exception{
    this.LuaChon1 = LuaChon3 ; }
public String getLuaChon4 () {
    return NoiDungCauHoi ;
}
public void setLuaChon4 ( String LuaChon4) throws Exception{
    this.LuaChon1 = LuaChon4 ; }
public String getDapAn () {
    return DapAn ;
}
public void DapAn ( String DapAn) throws Exception{
    this.DapAn = DapAn ; }

public Cauhoi ( String NoiDungCauHoi , String LuaChon1 , String LuaChon2 , String LuaChon3 , String LuaChon4 , String DapAn )
    throws Exception {
    setNoiDungCauHoi(NoiDungCauHoi);
    setLuaChon1(LuaChon1);
    setLuaChon2(LuaChon2);
    setLuaChon3(LuaChon3);
    setLuaChon4(LuaChon4);
    setDapAn(DapAn);
}
 

JackV

Administrator
Staff member
Bạn nên đặt tên biến, bên class theo chuẩn hoa thường để tránh lỗi lập trình về sau
PHP:
public class CauHoi {

    private String noiDungCauHoi;
    private String luaChon1;
    private String luaChon2;
    private String luaChon3;
    private String luaChon4;
    private String dapAn;

    public CauHoi(String noiDungCauHoi, String luaChon1, String luaChon2, String luaChon3, String luaChon4, String dapAn) {
        this.noiDungCauHoi = noiDungCauHoi;
        this.luaChon1 = luaChon1;
        this.luaChon2 = luaChon2;
        this.luaChon3 = luaChon3;
        this.luaChon4 = luaChon4;
        this.dapAn = dapAn;
    }

    /**
    * @return the noiDungCauHoi
    */
    public String getNoiDungCauHoi() {
        return noiDungCauHoi;
    }

    /**
    * @param noiDungCauHoi the noiDungCauHoi to set
    */
    public void setNoiDungCauHoi(String noiDungCauHoi) {
        this.noiDungCauHoi = noiDungCauHoi;
    }

    /**
    * @return the luaChon1
    */
    public String getLuaChon1() {
        return luaChon1;
    }

    /**
    * @param luaChon1 the luaChon1 to set
    */
    public void setLuaChon1(String luaChon1) {
        this.luaChon1 = luaChon1;
    }

    /**
    * @return the luaChon2
    */
    public String getLuaChon2() {
        return luaChon2;
    }

    /**
    * @param luaChon2 the luaChon2 to set
    */
    public void setLuaChon2(String luaChon2) {
        this.luaChon2 = luaChon2;
    }

    /**
    * @return the luaChon3
    */
    public String getLuaChon3() {
        return luaChon3;
    }

    /**
    * @param luaChon3 the luaChon3 to set
    */
    public void setLuaChon3(String luaChon3) {
        this.luaChon3 = luaChon3;
    }

    /**
    * @return the luaChon4
    */
    public String getLuaChon4() {
        return luaChon4;
    }

    /**
    * @param luaChon4 the luaChon4 to set
    */
    public void setLuaChon4(String luaChon4) {
        this.luaChon4 = luaChon4;
    }

    /**
    * @return the dapAn
    */
    public String getDapAn() {
        return dapAn;
    }

    /**
    * @param dapAn the dapAn to set
    */
    public void setDapAn(String dapAn) {
        this.dapAn = dapAn;
    }
}
Về việc đọc từng dòng đưa vào mảng 2 chiều, khi bạn sử dụng đối tượng của class CauHoi rồi thì chỉ cần mảng 1 chiều.
PHP:
CauHoi  arCH = new CauHoi[100];
khi bạn đọc một dòng lên, ví dụ dòng đầu tiên

PHP:
String[] arDong = dongDocLen.split("/");
arCH[0] = new CauHoi(arDong[0],arDong[1],arDong[2],arDong[3]);
Nhược điểm của mảng là kích thước được xác định ngay từ khi khai báo, bạn có thể sử dụng
PHP:
Vector<CauHoi> vCauHoi = new Vector();
khi bạn đọc mỗi dòng lên
PHP:
String[] arDong = dongDocLen.split("/");
vCauHoi.add(new CauHoi(arDong[0],arDong[1],arDong[2],arDong[3]));
 
  • Like
Reactions: Trungkienbk

kokichi88

Member
3/5/12
60
12
8
Hôm bữa có làm cái kiểu multi lựa chọn với số lượng ko hạn chế như vầy rồi, cách làm là chứa tất cả lựa chọn bằng mảng, sau đó dùng random và size của mảng để đảo thứ tự các lựa chọn, đáp án thì vẫn được lưu trữ ở bên dữ liệu.
Trong khi đảo thứ tự thì đồng thời lưu lại thứ tự đảo của các lựa chọn, rồi gửi qua bên form, dĩ nhiên là ko hiển thị lên cho user thấy. Sau khi user chọn xong thì gửi lại cái object câu hỏi đó về, rồi lấy cái đống thứ tự xếp lại như cũ, xong so sánh đáp án.

Hơi bị rườm rà nhưng chưa nghĩ ra cách nào hay hơn.
Thực ra bạn chỉ cần lưu randomseed dùng để random ra thứ tự là được rồi, không cần phải gửi cả mảng đã random đi.
 
  • Like
Reactions: Trungkienbk

Trungkienbk

New Member
21/3/13
20
0
1
27
hic . vì lí do thời gian chưa biết nên làm theo cách kia hơi khó.
Nên em làm như thế này .
Nhưng mà nếu như thế này , thì nếu các câu hỏi để trong 1 file có thể bị random lại nhiều lần :^o .
Các anh xem có làm thế nào để nó random ko bị lặp lại không ạ ?
Nếu ko đc thì chương trình ai 15 câu có khi phải làm 15 cái file /:) rồi mỗi câu làm 1 void đọc đến 1 file b-(. Dù biết là kiểu thế thì dạng bó tay nhưng mà cũng phải làm cho xong cái project :D

file e chuyển về như thế này ạ :
Con ... ga cuc tac la chanh?;A. Ga;B. Lon;C. Cho;D. Meo;A;
Thang 12 am lich con goi la tháng gi?;A. Rieng ;B. Chap ;C. An Choi;D. Nhay Mua;B;
Chuon chuon bay thap thi mua Bay cao thi ... bay vua thi ram, Dien tu con thieu?;A. Mua;B. Loc;C.Nang;D. Lu;C;
Viet Nam nam o Chau luc nao ?;A. Chau My;B. Chau Phi;C. Chau Dai Duong;D. Chau A;D;
PHP:
/package Game1;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;

/**
*
* @author TrungKien
*/
public class Game1 {

private static String CauHoi[] = new String[100];
private static String DapAn;
private static Map StrSet;

public static void main(String[] args) throws FileNotFoundException, IOException {
Game1 a = new Game1();
int i = 0;
String url = "E:\\Pro1\\Cau1.txt";
File fr = new File(url);
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fr)));
BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
String line = "";
while (i < 4) {
if (i == 0) {
CauHoi[i] = a.randomStr(true);
} else {
CauHoi[i] = a.randomStr(false);
}
i++;
}
a.startGame(3);
}

public String randomStr(boolean isStart) throws FileNotFoundException, UnsupportedEncodingException, IOException {
if (StrSet == null) {
StrSet = new HashMap();
}
String line;
String str = "";
int i = 0;
String url = "E:\\Pro1\\Cau1.txt";
Random rd = new Random();
if (isStart) {
File f = new File(url);
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-8"));
while ((line = reader.readLine()) != null && i < 15) {
StrSet.put(i, line);
i++;
}
}
Set keyset = StrSet.keySet();
Object[] bound = keyset.toArray();
int key = rd.nextInt(bound.length);
str = (String) StrSet.get(bound[key]);
StrSet.remove(bound[key]);
return str;
}

public void startGame(int win) {
    int diem = 0;
String Dong[] = new String[6];
int j = 0;
Scanner sc = new Scanner(System.in);
while (j <= win) {
Dong = CauHoi[j].split(";");
DapAn = Dong[5];
System.out.println("cau " + (j + 1) + ":");
System.out.println(Dong[0]);
System.out.println(Dong[1]);
System.out.println(Dong[2]);
System.out.println(Dong[3]);
System.out.println(Dong[4]);
// System.out.println(tach[5]);
System.out.println("Hay chon dap an: ");
String a = sc.next().toUpperCase();
if (a.equals(DapAn)) {
j++; 
diem = diem + 100;
System.out.println("Điểm hiện tại của bạn là : "+diem);        
} else {
    diem = 0 ;
System.out.println("Ban da thua cuoc");
System.out.println("Điểm của bạn là : "+diem);
System.out.println("Trong khi điểm cao nhất là ");
System.exit(0);
}
}
}
}
 

JackV

Administrator
Staff member
Các anh xem có làm thế nào để nó random ko bị lặp lại không ạ ?
Nếu ko đc thì chương trình ai 15 câu có khi phải làm 15 cái file /:) rồi mỗi câu làm 1 void đọc đến 1 file b-(. Dù biết là kiểu thế thì dạng bó tay nhưng mà cũng phải làm cho xong cái project :D
Đó cũng là một giải pháp mà :D
Con ... ga cuc tac la chanh?;A. Ga;B. Lon;C. Cho;D. Meo;A;
câu đó chọn con gì nó cũng hơi lạ ;))
Sao lại không dùng bản có dấu ;;) Class hỗ trợ đọc ghi văn bản tiếng việt có dấu theo các encoding, IOMaster

Nếu muốn random không trùng thì random một danh sách các thứ tự không trùng trước rồi dựa vào đó chọn câu hỏi [TIP]Kỹ thuật random, tạo danh sách (mảng) ngẫu nhiên trong java

---
Bạn nên tìm đọc tất cả các topic trong
Hướng dẫn người mới bắt đầu
Bài viết hướng dẫn JSE
Library Of Examples
 
  • Like
Reactions: Trungkienbk

Trungkienbk

New Member
21/3/13
20
0
1
27
Đó cũng là một giải pháp mà :D
câu đó chọn con gì nó cũng hơi lạ ;))
Sao lại không dùng bản có dấu ;;) Class hỗ trợ đọc ghi văn bản tiếng việt có dấu theo các encoding, IOMaster

Nếu muốn random không trùng thì random một danh sách các thứ tự không trùng trước rồi dựa vào đó chọn câu hỏi [TIP]Kỹ thuật random, tạo danh sách (mảng) ngẫu nhiên trong java

---
Bạn nên tìm đọc tất cả các topic trong
Hướng dẫn người mới bắt đầu
Bài viết hướng dẫn JSE
Library Of Examples
à. trong code của em có cái phần đọc có dấu rồi mà nhưng tại vẫn đưa lên cái file thử cũ thôi nên kệ nó, còn các file dùng thì có dấu :D thanks ad