Câu 10: Hãy nhập mảng một chiều a[] có n phần tử từ bàn phím - Xây dựng phương thức tính tổng của mảng.. - Xây dựng phương thức hiện các phần tử của mảng.. //biến ds thuộc kiểu dữ liệu A
Trang 1Bài 1
SƠ LƯỢC VỀ NGÔN NGỮ JAVA
- Làm quen với môi trường IDE (Jubuider 9.0)
- Cài đặt các chương trình ứng dụng đơn giản về ngôn ngữ java
+ Các bài tập về cấu trúc điều khiển
+ Các bài tập về ngoại lệ
+ Các bài tập về lớp
+ Các bài tập về I/O
I 1 Cấu trúc điều khiển.
I.1.1 Bài tập mẫu:
// khai báo thư viện nhập xuất dữ liệu.
import java.io.*;
public class DemSo {
private String s;
// Xây dựng phương thức nhập chuỗi từ bàn phím
public void nhap()
{
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Nhap mot chuoi tu ban phim");
Trang 2case '0':dem0++; break;
case '1':dem1++; break;
case '2':dem2++; break;
case '3':dem3++; break;
Trang 3case '4':dem4++; break;
case '5':dem5++; break;
case '6':dem6++; break;
case '7':dem7++; break;
case '8':dem8++; break;
case '9':dem9++; break;
}
}
System.out.println("So lan xuat hien so 0 co trong chuoi la: \t"+ dem0);
System.out.println("So lan xuat hien so 1 co trong chuoi la: \t"+ dem1);
System.out.println("So lan xuat hien so 2 co trong chuoi la: \t"+ dem2);
System.out.println("So lan xuat hien so 3 co trong chuoi la: \t"+ dem3);
System.out.println("So lan xuat hien so 4 co trong chuoi la: \t"+ dem4);
System.out.println("So lan xuat hien so 5 co trong chuoi la: \t"+ dem5);
System.out.println("So lan xuat hien so 6 co trong chuoi la: \t"+ dem6);
System.out.println("So lan xuat hien so 7 co trong chuoi la: \t"+ dem7);
System.out.println("So lan xuat hien so 8 co trong chuoi la: \t"+ dem8);
System.out.println("So lan xuat hien so 9 co trong chuoi la: \t"+ dem9);
}
// Xây dựng hàm main để thực thi các phương thức, hàm có trong lớp
public static void main(String[]args) throws IOException
{
// Biến dc thuộc kiểu DemSo để gọi đến các phương thức, thuộc tính có trong lớp.
DemSo dc = new DemSo();
Câu 2: In ra 15 số Fibonacci đầu tiên ( Công thức của Fibonacci fib(0) = 0;fib(1) = 1;
fib(n) = fib(n-2) + fib(n-1); n>=2 )
Câu 3 Nhập vào một số nguyên (n) sau đó in ra các số nguyên tố trong khoảng từ 1=>n Câu 4: Nhập độ dài 3 cạnh của một tam giác Thông báo tam giác đó là tam giác đều,
vuông cân, cân, hay tam giác thường
Câu 5: Cho một số tự nhiên N bất kỳ được nhập vào từ bàn phím Tính tổng
Trang 4S = 1+ 1/1+2+ 1/1+2+3….+ 1/(1+2+3 N);
Câu 6: Nhập vào hai chuỗi s1, s2 sau đó đếm số lần chuỗi s2 xuất hiện trong chuỗi s1 Câu 7: Nhập vào ba xâu s1, s2, s3 sau đó thay thế tất cả các vị trí xuất hiện của s2 trong
xâu s1 bằng xâu s3
Câu 8: Nhập một xâu s và kiểm tra xâu đó có phải xâu đối xứng không?
Câu 9: Nhập vào một xâu ký tự sau đó chuẩn hoá xâu này theo quy tắc sau:
- Đầu và cuối xâu không được chứa dấu cách
- Giữa các từ không thể có nhiều hơn 1 dấu cách
- Đầu các từ trong xâu phải là ký tự hoa
- Các ký tự không phải là ký đầu tiên của một từ phải là chữ thường
Câu 10: Hãy nhập mảng một chiều a[] có n phần tử từ bàn phím
- Xây dựng phương thức tính tổng của mảng
- Xây dựng phương thức tính tổng các giá trị chẵn có trong mảng
- Xây dựng phương thức đếm số lần xuất hiện của x có trong mảng
- Xây dựng phương thức sắp xếp các phần tử trong mảng thành dãy tăng dần
- Xây dựng phương thức hiện các phần tử của mảng
Câu 11: Hãy nhập mảng 2 chiều a[n][m] có n số hàng, m số cột từ bàn phím.
- Xây dựng phương thức tính tổng của mảng
- Xây dựng phương thức tính tổng các hàng, các cột
- Xây dựng phương thức tính tổng đường chéo chính, đường chéo phụ
- Xây dựng phương thức hiện các phần tử mảng theo ma trận
I.2 Xử lý ngoại lệ:
I.2 1 Bài tập mẫu:
Tính tổng 2 số a, b được nhập từ bàn phím Yêu cầu xử lý các ngoại lệ có thể xảy ra
// Triển khai thư viện nhập xuất
Trang 5// Bắt ngoại lệ trong quá trình nhập dữ liệu từ bàn phím
Câu 2: Viết chương trình cho phép tạo một mảng 2 chiều cỡ mxn với m,n nhập từ bàn
phím Xây dựng phương thức hiện thị dữ liệu trong mảng Cài đặt các xử lý ngoại lệ cầnthiết
I 3 Hướng đối tượng:
I.3.1 Bài tập mẫu:
// Khai báo thư viện nhập xuất dữ liệu.
import java.io.*;
// Khai báo thư viện collection để tập hợp đối tượng (ArrayList, List, Date .)
import java.util.*;
// Xây dựng một lớp SinhVien
public class SinhVien {
// Khai báo các thuộc tính của lớp (maSV, tenSV).
private String maSV;
private String tenSV;
Trang 6//biến ds thuộc kiểu dữ liệu ArrayList để tập hợp các đối tượng SinhVien để tạo thành một danh sách (biến ds có thể thêm hoặc xóa một đối tượng trong nó)
ArrayList ds = new ArrayList();
// Xây dựng phương thức khởi tạo không có đối số.
public SinhVien()
{ }
// Xây dựng phương thức khởi tạo có đối số truyền vào
public SinhVien(String maSV, String tenSV)
{
this.maSV=maSV;
this.tenSV=tenSV;
}
// Xây dựng phương thức để nhập n sinh viên vào trong ds.
public void nhap()
// Xây dựng phương thức hiện thông tin của sinh viên có trong ds.
public void hien()
{
System.out.println("STT \t"+ "MA SINH VIEN \t"+ " TEN SINH VIEN \t");
Trang 7for(int i=0; i<ds.size();i++)
// Xây dựng phương thức tìm một sinh viên có trong danh sách sinh viên hay không
public void tim(String s)
// Xây dựng phương thức main để thực thi các phương thức có trong lớp
public static void main(String[]args)
Trang 8a) Xây dựng lớp Stack để mô phỏng một Stack (giả thiết mỗi phần tử của stack là
một số nguyên), bao gồm:
- Hàm tạo Stack(int n) để khởi tạo Stack có tối đa n phần tử
- Phương thức isEmpty để kiểm tra xem Stack có phần tử nào hay không?
- Phương thức isFull để kiểm tra xem Stack đã đầy hay chưa?
- Phương thức push để thêm một phần tử vào Stack
- Phương thức pop để lấy một phần tử ra khỏi Stack
b) Viết một đoạn chương trình để kiểm tra lớp Stack vừa tạo bằng cách:
- Tạo ra một Stack có số phần tử tối đa là 5
- Trước khi đưa các phần tử vào Stack, hãy kiểm tra xem Stack có đang rỗng, đầy haykhông?
- Đưa phần tử 5 vào ngăn xếp, sau đó kiểm tra xem ngăn xếp có đầy, rỗng hay không?
- Đưa tiếp các phần tử 1, 6, 8, 9 vào ngăn xếp, sau đó lại kiểm tra lại xem ngăn xếp đầy,rỗng hay không?
Câu 2:
Sử dụng lớp Stack được viết trong Bài 1 để viết chương trình chuyển một số từ hệ
cơ số 10 sang hệ cơ số: 2, 8, 16, một cơ số bất kỳ bằng cách sử dụng phép toán chia liêntiếp
Bài 3:
Xây dựng lớp PhanSo để thực hiện các phép toán trên phân số, bao gồm:
- Hàm tạo PhanSo() để khởi tạo phân số có tử số bằng 0 và mẫu số bằng 1
- Hàm tạo PhanSo(int ts, int ms) để khởi tạo phân số có tử số bằng ts và mẫu số bằng ms
- Phương thức “cong”, “tru”, “nhan”, “chia” để thực hiện việc cộng , trừ, nhân, chia haiphân số
- Phương thức “nghichDao”, “doiDau”, “toiGian” để thực hiện việc nghịch đảo, đổi dấu
và tối giản một phân số
- Phương thức “soSanhBang”, “lonHon”, “nhoHon”… để thực hiện việc so sánh hai phânsố
- Phương thức “nhap” dùng để nhập phân số từ bàn phím
I.4 Các bài tập về I/O.
I.4.1 Bài tập mẫu:
Câu 1: Hãy sao chép file E:\\bien.txt sang D:\\bien.txt.
\\ Khai báo thư viện nhập xuất.
Trang 9public static void xuLy() throws IOException
// biến fis sẽ đọc file bien.txt có trong ổ E
fis = new FileInputStream("E:\\bien.txt");
// biến fos sẽ tạo ra file bien.txt ở ổ D để lưu dữ liệu đọc được ở file bien.txt ở ổ E.
fos = new FileOutputStream("D:\\bien.txt");
// Xây dựng phương thức main để gọi đến phương thức sao chép file.
public static void main(String[]args) throws IOException
{
xuLy();
}
}
Câu 2: Hãy nhập 3 số nguyên từ bàn phím vào trong tệp tin Tong.txt Đọc 3 số từ tệp tin
Tong.txt và tình tổng của 3 số đó rồi ghi kết quả vào dòng tiếp theo trong tệp tin
// Khai báo thư viện nhập xuất
import java.io.*;
// Xây dựng lớp Tong
public class Tong {
// Xây dựng phương thức main để thực thi các phương thức trong lớp Tong
Trang 10public static void main(String[]args)throws IOException, FileNotFoundException
{
tinhTong();
}
// Xây dựng phương thức tinhTong() để ghi và đọc dữ liệu
public static void tinhTong()throws IOException, FileNotFoundException
{
\\ Biến pw thuộc kiểu dữ liệu PrintWriter để ghi dữ liệu dùng luồng ký tự.
PrintWriter pw = new PrintWriter(new FileOutputStream("D:\\Tong.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 3; i++) {
System.out.println("So thu " + i);
// Biến dis thuộc kiểu dữ liệu DataInputStream đọc luồng dữ liệu nhị phân (Một số kiểu
dữ liệu nguyên thủy như int, float, long )
DataInputStream dis = new DataInputStream(new FileInputStream(
Trang 11}
}
I.4.2 Bài tập
Câu 1: Nhập vào một dãy số, ghi dẫy số này ra tệp “dayso.dat” Đọc lại dẫy số này từ tệp
để tìm tất cả các số nguyên tố trong dẫy này và ghi ra tệp “daynn.dat”
Câu 2: Cho một tệp văn bản có kích thước nhỏ, viết chương trình kiểm tra xem trong tệp
này có chứa xâu s (cho trước) hay không?
+ Nhập vào một dãy số ghi dẫy số này ra tệp tin, sau đó tách tệp này thành hai tệp,một tệp chứa toàn các phần tử chẵn, tệp còn lại chứa toàn các phần tử lẻ
Câu 3: Tìm các số Fibonaci nhỏ hơn một số n (cho trước)
+ Ghi các số tìm được ra tệp theo định dạng như sau:
- Hàng đầu tiên của tệp ghi số n
- Hàng thứ 2 của tệp lần lượt ghi số tìm được, các số này được cách nhau bỏi mộtdấu cách
Câu 4:
+ Ghi ma trận này ra tệp mt.dat theo quy tắc sau:
- Hàng đầu tiên của tệp ghi số hàng của ma trận
- Hàng thứ 2 của tệp ghi số cột của ma trận
- Các hàng tiếp theo mỗi hàng ghi một hàng tương của ma trận
+ Đọc lại ma trận này từ tệp mt.dat
I.5 Các bài tập về luồng (Thread).
I.5.1 Bài tập mẫu:
Trang 12II PIPEII.1.Bài tập mẫu.
Câu 1: Xây dựng ứng dụng PipedEcho.
- Sử dụng Pipe làm phương tiện giao tiếp giữa Client và Server
- Server là một thread thực thi song song với client
- Nhập các ký tự từ bàn phím và gởi cho Server và hiện thị kết quả nhận được ramàn hình
- Server nhận được ký tự và tăng mỗi ký tự lên 1 đơn vị rồi gởi về cho Client
* Chương trình Server.
// Khai báo thư viện nhập xuất dữ liệu.
import java.io.*;
// Xây dựng lớp PipedEchoServer kế thừa các phương thức và thuộc tính của lớp Thread
public class PipedEchoServer extends Thread
{
//Biến readPipe thuộc kiểu dữ liệu của PipedInputStream dùng để đọc dữ liệu trên ống dẫn, writePipe thuộc kiểu dữ liệu của PipedOutputStream dùng để ghi dữ liệu lên ống dẫn
// Xây dựng Phương thức ghi đè run() để nhận, xử lý dữ liệu để gửi lại cho Client.
public void run()
} catch (IOException ie)
{ System.out.println("Echo Server bi loi: "+ie );
Trang 13// Xây dựng lớp PipedEchoClient kế thừa các phương thức và thuộc tính của lớp Thread
public class PipedEchoClient extends Thread
// Xây dựng phương thức ghi đè run() để gửi và đọc kết quả lên màn hình.
public void run()
Trang 14// Xây dựng phương thức main để thực thi ứng dụng PipedEcho là tạo ra 2 ống dẫn giúp Client và Server có thể trao đổi thông tin với nhau.
public static void main(String args[])
{
try{
PipedOutputStream cwPipe = new PipedOutputStream();
PipedInputStream crPipe = new PipedInputStream();
PipedOutputStream swPipe = new PipedOutputStream(crPipe);
PipedInputStream srPipe = new PipedInputStream(cwPipe);
PipedEchoServer server = new PipedEchoServer(srPipe,swPipe);
PipedEchoClient client = new PipedEchoClient(crPipe,cwPipe);
Khi chạy PipedEcho
Server bat đau lăng nghe .
Client dang ket noi
123qw
234rx
II.2 Bài tập
Câu 1: Hãy xây dựng một chương trình ghi một mảng byte cho trước lên ống dẫn Pipe.
Đọc dữ liệu từ ống dẫn rồi hiện thị kết quả ra màn hình
Câu 2: Hãy xây dựng một ứng dụng cho dịch vụ phản hồi thông tin bằng ống dẫn (Pipe)
theo mô hình Client-Server theo yêu cầu sau:
- Client nhập một mảng ký tự từ bàn phím rồi gửi đến Server, đợi nhận kết quả trả
về và in ra màn hình
- Server sẽ nhận dữ liệu từ Client gửi sang, kiểm tra ký tự đó nếu là ký tự số sẽ gửitrả về cho Client
Trang 15III SOCKETIII.1 Bài tập mẫu.
III.1 1.Lập trình TCP
III.1.1.1.Xây dựng chế độ phục vụ tuần tự.
Câu 1: Viết chương trình theo mô hình Client-Server sử dụng Socket ở chế độ nối
kết(TCP)
a) Chương trình phía Server
- Lắng nghe và chấp nhận kết nối tại cổng 1234
- Khi nhận một chuỗi từ Client sẽ chuyển chuỗi đó thành chữ hoa và gửi kết quả trả lạicho Client
- Đóng kết nối
b) Chương trình phía máy khách
- Kết nối đến Server có cổng kết nối 1234
- Đọc chuỗi từ bàn phím rồi gởi đến Server chờ và nhận kết quả hiện thị ra màn hình
// Biến sv thuộc kiểu dữ liệu ServerSocket đang lắng nghe tại cổng 1234
ServerSocket sv = new ServerSocket(1234);
// sv chấp nhận kết nối
Socket client = sv.accept();
// br dùng để đọc dữ liệu trên socket
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
// pw ghi dữ liệu lên socket
PrintWriter pw = new PrintWriter(client.getOutputStream());
String s1 = br.readLine();
s1=chuHoa(s1);
pw.write(s1+ "\n");
pw.flush();
Trang 16// Hàm chuyển đổi chuỗi thành chuỗi hoa
public static String chuHoa(String s)
public class TCPClient {
public static void main(String[]args)
{
try
{
// Client kết nối đến Server có địa chỉ IP “127.0.0.1”, cổng 1234.
Socket client = new Socket("127.0.0.1",1234);
BufferedReader br = new BufferedReader(new
Trang 17a) Chương trình phía máy chủ
- Lắng nghe và chấp nhận các kết nối đến trên cổng 9999
- Tạo ra mỗi tuyến cho một kết nối riêng biệt để đáp ứng các yêu cầu của các máykhách đồng thời
- Khi nhận được một dòng do máy khách gửi đến máy chủ sẽ xử lý như sau:+ Nếu dòng nhận được là “quit” (không phân biệt chữ hoa chữ thường) máy chủ
sẽ đóng kết nối với máy khách
+ Nếu dòng nhận được một chuỗi sẽ chuyển chuỗi về chữ hoa sau đó trả về choClient
b) Chương trình phía máy khách
- Kết nối đến chương trình máy chủ đã nêu trong câu a
- Đọc một dòng từ bàn phím và gửi dòng đọc được đến máy chủ
- Nếu dòng đọc được là “quit” (không phân biệt chữ hoa chữ thường) thì ngắt kếtnối với máy chủ và kết thúc chương trình
- Đọc kết quả trả về và in ra màn hình
* Trình tự hoạt động của Server:
// khai báo thư viện nhập xuất
import java.io.*;
// Khai báo thư viện cho các lớp mạng
import java.net.*;
// Xây dựng lớp TCPServer
// Phần 1 lắng nghe tại cổng 9999, khi có client kết nối thì nó sẽ tạo ra một luồng mới để
xử lý yêu cầu của Client.
public class TCPServer
Trang 18ServerSocket svsk = new ServerSocket(9999);
// Nếu quá trình lắng nghe tại cổng 9999 của Server là đúng thì lặp lại công việc Chấp nhận kết nối của client và tạo ra luồng mới để xử lý thông điệp mà client gởi đến.
// Xây dựng lớp MyThread kế thừa từ lớp Thread để nhận và xử lý thông điệp từ Client
class MyThread extends Thread
PrintWriter pw = new PrintWriter(sk.getOutputStream());
// Lặp lại quá trình nhận thông tin và xử lý thông tin để gởi trả lại cho Client.
Trang 19// biến sk thuộc kiểu dữ liệu kiểu Socket để tạo kết nối đến máy chủ tại cổng 9999
Socket sk = new Socket("127.0.0.1",9999);
// biến br thuộc kiểu dữ liệu BufferedReader để đọc dữ liệu trên socket
BufferedReader br = new BufferedReader(new
InputStreamReader(sk.getInputStream()));
BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));// biến pw thuộc kiểu dữ liệu PrintWriter để ghi dữ liệu lên socket
PrintWriter pw = new PrintWriter(sk.getOutputStream());
// Lặp lại quá trình nhập chuỗi để gởi cho Server nếu chuỗi nhập vào là “quit” sẽ thoát khỏi quá trình nhập ngược lại sẽ in kết quả ra màn hình