1. Trang chủ
  2. » Luận Văn - Báo Cáo

Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình

62 528 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 62
Dung lượng 122,29 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Ví dụ 2: Chương trình nhập vào một mảng nguyên, tìm phần từ lớn nhất, nhỏ nhất trong mảngimport java.io.*; public class MinMax { public static void main String[] args throws Exception

Trang 1

VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG

Giảng viên hướng dẫn : PGS TS Huỳnh Quyết Thắng

Nhóm học viên :Mai Tiến Khải

Nghiêm Xuân Đức

Lê Sơn Hải

Trang 2

Mục lục

1.2) Một số vấn đề về sử dụng dữ liệu

2.1) Các vấn đề cơ bản về đặt tên biến.

2.2) Đặt tên từng kiểu dữ liệu.

Trang 3

6.2) điều kiện xử lý có cần xét hết khả năng hay không

6.3)xử lý các điều kiện rẽ nhánh dài và phức tạp

6.4) điều kiện rẽ nhiều nhánh

6.5) sắp xếp các khả năng xảy ra theo một thứ tự nhất định

B) Câu lệnh case

6.1) Ta nên sắp xếp các khả năng xảy ra theo một thứ tự nào đó

6.2) Biểu thức trong case ta thường viết sao cho ngắn gọn, nếu việc xử lý dài

Trang 4

Lời mở đầu

Trang 5

Chương 1:Các vấn đề cơ bản trong sử dụng

biến

1.1) Khởi tạo biến

- Khai báo biến gần nơi nó được sử dụng lần đầu, tránh khai báo ngầm

- Nên khởi tạo giá trị của biến ngay khi khai báo (Trong trường hợpngôn ngữ lập trình không cho phép thì nên khởi tạo biến gần với nơi nó được sửdụng lần đầu)

- Luôn chú ý đến các biến đếm, nên khởi tạo lại chúng mỗi lần sử dụng

- Kiểm tra sự cần thiết của việc khởi tạo lại biến trong những đoạn mãchạy lặp lại nhiều lần (ví dụ như vòng lặp)

Ví dụ 1: Chương trình giải phương trình bậc 2.

import java.util.Scanner;

public class QuadraticEquationSolution {

public static void main(String[] args) {

Scanner nhap = new Scanner(System.in);

System.out.println( "Nhập vào giá trị cho a " );

Trang 6

System.out.println( "Phương trình vô số nghiệm" );

System.out.println( "X1 là : " +x1);

System.out.println( "X2 là : " +x2);

}

Trong ví dụ trên, các biến a, b, c được khai báo gần nơi nó được sử dụng

đồng thời giá trị của biến được khởi tạo ngay khi khai báo

Trang 7

Ví dụ 2: Chương trình nhập vào một mảng nguyên, tìm phần từ lớn nhất, nhỏ nhất trong mảng

import java.io.*;

public class MinMax {

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

BufferedReader in = new BufferedReader(new

InputStreamReader(System.in));

System.out.print( "Nhap so phan tu co trong mang n: " );

int n = Integer parseInt(in.readLine());

int a[] = new int[n];

int i;

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

System.out.print( "Nhap a[" +i+ "]: " );

a[i] = Integer parseInt(in.readLine());

System.out.println( "So nho nhat la: " +min);

System.out.println( "So lon nhat la: " +max);

}

}

Trang 8

Trong ví dụ trên biến đếm i được chú ý và được khởi tạo lại mỗi lần sử

- Các biến phải có ý nghĩa rõ ràng, tránh nghĩa ẩn

- Đảm bảo tất cả các biến khai báo đều được sử dụng

- Các biến chỉ được sử dụng cho một và chỉ một mục đích

Ví dụ: Chương trình kiểm tra một số nguyên nhập vào từ bàn phím là số chẵn hay lẻ

import java.io.*;

public class OddOrEven {

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

BufferedReader in = new BufferedReader(new

Trang 9

}

}

Trong ví dụ trên: tất cả các biến đều được khai báo rõ ràng, có ý nghĩa,đều được cục bộ hóa, được sử dụng (cho chỉ một mục đích) và có thời gian sốngngắn

Trang 10

Chương 2 : Đặt tên biến

2.1) Các vấn đề cơ bản về đặt tên biến.

- Tên biến mô tả đầy đủ, đúng và chính xác đối tượng mà nó đại diện

- Tên biến cần liên quan đến vấn đề cần giải quyết hơn là cách giảiquyết vấn đề đó

- Tên biến có độ dài phù hợp (khoảng 8-20 ký tự)

- Các biến mang giá trị tính toán như: max, min, sum, total… nên đặtkiểu tính toán đó ở cuối tên biến

- Nên sử dụng Count và Index thay vì Num để tránh gây rối loạn, nhầm

public class IsPrime {

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

Scanner scan=new Scanner(System.in);

Trang 11

System.out.print( "Nhap so tu nhien can kiem tra:" );

int soKiemTra = scan.nextInt();

if (( soKiemTra == 0) | (soKiemTra == 1))

System.out.print( "so '" + soKiemTra + "' khong phai la so ng to" );

if (soKiemTra == 2)

System.out.print( "so 2 la so ng to" );

if (( soKiemTra > 2 ) && (soKiemTra % 2 == 0))

System.out.print( "so '" + soKiemTra + "'khong phai la so ngyen to " );

Trong chương trình trên ta thấy biến soKiemTra mô tả đầy đủ, chính xác,

rõ ràng, liên quan đến vấn đề bải toán, có độ dài hợp lý và đặt đúng quy ướcJava Convention

2.2) Đặt tên từng kiểu dữ liệu.

- Chú ý đến tên biến chỉ số của vòng lặp Thông thường: đặt là i, j, k.Tuy nhiên nếu biến này được sử dụng cả ở ngoài vòng lặp thì nên đặt tên biến có

ý nghĩa cụ thể, ngoài ra chú ý cả trong trường hợp các vòng lặp lông nhau

- Biến tạm thời nên đặt tên có ý nghĩa để tránh nhầm lẫm

- Đặt tên biến luân lý (Boolean) mang hàm ý true hoặc false

Trang 12

- Đặt tến hằng số cho đơn vị trừu tượng nó đại diện thay vì giá trị mà nómang.

Ví dụ :Chương trình tính tổng các số nguyên tố trong mảng nguyên một chiều

nhập từ bàn phím

import java.io.*;

public class example4 {

public static boolean isPrime(int soKiemTra) {

boolean checkPrime = true;

}

return checkPrime;

}

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

BufferedReader in = new BufferedReader(new

InputStreamReader(System.in));

System.out.print( "Nhap so phan tu co trong mang n: " );

int n = Integer parseInt(in.readLine());

int a[] = new int[n];

Trang 13

for (int i = 0; i < n; i++) {

System.out.print( "Nhap a[" +i+ "]: " );

a[i] = Integer parseInt(in.readLine());

Biến luân lý checkPrime dùng để kiểm tra số nguyên tố được đặt hợp lý

và mang hàm nghĩa true, false rõ ràng Biến tổng số nguyên tố của mảng được

đặt với kiểu tính toán sum cuối: arraySum.

2.3) Các tên viết tắt.

Trong một số trường hợp cụ thể, cần thiết phải đặt những tên ngắn tắt,khi đó cần:

Trang 14

- Tránh những tên viết tắt chỉ bỏ đi một ký tự so với tên đầy đủ.

Ví dụ: tên biến arrayNumber viết tắt là arrayNumbe (nên viết là arrayNum)

- Đặt các tên viết tắt một các phù hợp, hợp lý và có thể đọc, phát âmđược

Ví dụ: tên biến arraySum viết tắt đặt là: rrySum không đọc được (nên đặt là arrSum ).

- Tránh những sự kết hợp gây đọc sai, hiểu nhầm hoặc không đọc được

Ví dụ: biến endNumber viết tắt là enum gây hiểu nhầm.

- Với một số ngôn ngữ, cần có bảng dịch với các tên viết tắt (ví dụ nhưFORTRAN)

2.4) Những loại tên cần tránh:

- Những tên, viết tắt gây nhầm lẫn, đa nghĩa

- Những tên có nghĩa giống nhhau

- Những tên thường hay hoặc cố ý viết sai chính tả

Ví dụ: accumulate viết thành acumulate

Trang 15

- Những tên chứa nhiều ngôn ngữ khác nhau

- Những tên đặt bừa bãi không liên quan đến giá trị nó đại diện

- Những tên trùng với những từ dùng trong ngôn ngữ lập trình

+) Dự đoán trước lỗi chia cho 0:

- Mỗi lần sử dụng đến phép chia, hãy nghĩ đến khả năng của số chia là 0 Nếu có, viết code để ngăn điều này xảy ra

+) Ép kiểu một cách tường minh:

- Ép kiểu tường minh để người đọc sẽ biết được khi nào việc chuyển đổi dữ liệu diễn ra

+) Tránh so sánh khác kiểu:

- So sánh trên các dữ liệu khác kiểu khiến chương trình dịch cần

tự tìm xem cần chuyển đổi sang kiểu nào để so sánh, kéo theo việc làm tròn số, gây ra sai sót Ta lên làm việc chuyển đổi này bằng tay để chương trình dịch biết rõ nó đang so sánh cái gì.+) Kiểm tra cảnh báo warning của chương trình dịch:

Ví dụ:

package com.xuanduc987.example;

import java.util.*;

Trang 16

public class Example1 {

/* dung hang NUMBER_OF_MONTH thay cho so 12 */

final static int NUMBER_OF_MONTH = 12;

public static void main(String[] args) {

int[] mangDiemThiDua = new int[NUMBER_OF_MONTH];

float diemTb = 0;

Scanner console = new Scanner(System.in);

for (int i = 0; i < NUMBER_OF_MONTH; ++i) {

System.out.println( "Nhap vao diem thi dua cua ca to trong thang "

if (diemTb == 50.0)

System.out.println( "Chuc mung doi da dat diem toi da!" ); System.out.println( "Nhap vao so nguoi trong to: " );

int soNguoi = console.nextInt();

/* kiem tra xem so chia co the bang 0 hay khong */

if (soNguoi != 0) {

float diemTbCaNhan = diemTb / soNguoi;

System.out.println( "Diem trung binh cho moi ca nhan la: "

Trang 17

+) Chú ý kiểm tra lỗi tràn số

- Không chỉ chú ý lỗi tràn số ở kết quả cuối cùng, cần nghĩ đến việc có thể bị tràn số ở kết quả trung gian

Ví dụ:

package com.xuanduc987.example;

import java.util.*;

public class Example2 {

public static void main(String[] args) {

int soA = 0;

int soB = 0;

float giaTri = 0;

Scanner console = new Scanner(System.in);

System.out.print( "Nhap a: " );

soA = console.nextInt();

System.out.print( "Nhap b: " );

soB = console.nextInt();

giaTri = soA / soB;

System.out.println( "a / b = " + giaTri);

giaTri = ((float) soA) / soB;

System.out.println( "(float) a / b = " + giaTri);

* ket qua voi a = 5 va b =3:

* "a / b = 1.0" do a / b la chia nguyen;

* "(float) a / b = 1.6666666" do ep kieu nen gio la chia so thuc;

* "2147483640 + 50 = -2147483606" do loi tran so

*/

7.3) Số thực dấu phẩy động:

Trang 18

1. Tránh cộng trừ trên những số có sự khác biệt lớn:

- Việc này nhằm làm giảm sai số do làm tròn

2. Dự đoán và tránh việc làm tròn tới 0:

3. Tránh so sánh giá trị 2 số thực:

Ví dụ:

package com.xuanduc987.example;

public class Example3 {

final static double SAI_SO_CHAP_NHAN_DUOC = 0.00001;

public static boolean equal(float a, float b) {

return (Math.abs(a - b) < SAI_SO_CHAP_NHAN_DUOC); }

public static void main(String[] args) {

Trang 19

*/

Ở đây do làm tròn số nên giaTri không bằng 1 Cho nên, để so sánh, tadùng method equal, so sánh |giaTri – 1| với SAI_SO_CHAP_NHAN_DUOC

7.4) Xâu và kí tự:

+) Tránh “magic character” và “magic string”:

- Giống ở kiểu dữ liệu số, nên dùng hằng để thay thế chúng

Ví dụ minh họa cùng ở phần sau

7.5) Biến Boolean:

+)Dùng biến Boolean để chương trình dễ đọc:

+)Dùng biến Boolean để đơn giản hoá những kiểm tra phức tạp:

Ví dụ:

package com.xuanduc987.example;

import java.util.*;

public class Example4 {

public static void main(String[] args) {

Scanner console = new Scanner(System.in);

int maxIndex = 0;

System.out.println( "Nhap vao so phan tu can nhap: " );

maxIndex = Integer.parseInt(console.nextLine());

int[] mangSo = new int[maxIndex];

for (int i = 0; i < maxIndex; ++i) {

System.out.print( "Nhap vao phan tu thu " + (i + 1) + " :

" );

mangSo[i] = Integer.parseInt(console.nextLine());

} System.out.print( "Nhap vao chi so phan tu can truy nhap: " );

int index = Integer.parseInt(console.nextLine());

boolean quaGioiHan = index >= maxIndex;

boolean chiSoAm = index < 0;

Trang 20

Ở đây ta dùng 2 biến Boolean quaGioiHan và chiSoAm để chương trình

dễ đọc, dễ hiểu hơn: biểu thức

(quaGioiHan || chiSoAm) dễ hiểu hơn ((index >= maxIndex) || (index <0))

7.6) Kiểu liệt kê:

+) Dùng kiểu liệt kê thay cho hằng để cải thiện sự dễ đọc, sự ổn định,

public class Example5 {

public static void main(String[] args) {

Color color = Color.BLACK; Random random = new Random();

Trang 21

System.out.println( "Mau ngau nhien la mau " + color);

Ví dụ:

package com.xuanduc987.example;

import java.util.*;

enum Error {

Trang 22

FALSE, OUT_OF_RANGE, NEGATIVE_INDEX

}

public class Example6 {

final static int MAX_INDEX = 10;

public static Error isError(int index) {

if (index >= MAX_INDEX)

return Error.OUT_OF_RANGE;

if (index < 0)

return Error.NEGATIVE_INDEX;

return Error.FALSE; }

public static void main(String[] args) {

int[] mangSo = new int[MAX_INDEX];

System.out.print( “Nhap vao chi so phan tu can nhap: “ );

Scanner console = new Scanner(System.in);

int index = Integer.parseInt(console.nextLine());

}

}

Ở đây ta dùng kiểu liệt kê Error làm kiểu trả về cho hàm kiểm tra lỗi, nhờ

Trang 23

vậy ta có thể dễ dàng xác định được lỗi.

Ví dụ:

package com.xuanduc987.example;

import java.util.*;

public class Example1 {

/* dung hang NUMBER_OF_MONTH thay cho so 12 */

final static int NUMBER_OF_MONTH = 12;

public static void main(String[] args) {

int[] mangDiemThiDua = new int[NUMBER_OF_MONTH];

float diemTb = 0;

Scanner console = new Scanner(System.in);

for (int i = 0; i < NUMBER_OF_MONTH; ++i) {

System.out.println( "Nhap vao diem thi dua cua ca to trong thang "

if (diemTb == 50.0)

System.out.println( "Chuc mung doi da dat diem toi da!" ); System.out.println( "Nhap vao so nguoi trong to: " );

Trang 24

int soNguoi = console.nextInt();

/* kiem tra xem so chia co the bang 0 hay khong */

if (soNguoi != 0) {

float diemTbCaNhan = diemTb / soNguoi;

System.out.println( "Diem trung binh cho moi ca nhan la: "

+) Trong vòng lặp lồng nhau, cần chú ý tránh nhầm lẫn chỉ số các vòng lặp:

Ví dụ:

package com.xuanduc987.example;

import java.util.*;

public class Example7 {

public static void main(String[] args) {

Scanner console = new Scanner(System.in);

System.out.print( "Nhap vao kich thuoc cua ma tran n x n: " );

int n = Integer.parseInt(console.nextLine());

Trang 25

int[][] matranA = new int[n][n];

int[][] matranB = new int[n][n];

int[][] matranC = new int[n][n];

/* can tranh nham lan chi so cac vong lap */

for (int i = 0; i < n; ++i)

}

Trang 26

Chương 4 Kiểu dữ liệu không cơ bản (unusal data type)

4.1) Kiểu dữ liệu cấu trúc:

+) Sử dụng cấu trúc thay cho các biến thông thường để tố chức và làm việc với nhóm các dữ liệu liên quan:

+) Nên cân nhắc tạo lớp thay cho tạo cấu trúc:

Ví dụ:

package com.xuanduc987.example;

import java.util.*;

final class SoPhuc {

public float phanThuc , phanAo ;

public static SoPhuc cong(SoPhuc a, SoPhuc b) {

SoPhuc c = new SoPhuc();

c phanAo = a phanAo + b phanAo ;

Trang 27

a phanThuc = a phanThuc + b phanThuc ;

return c;

}

}

public class Example8 {

public static void main(String[] args) {

SoPhuc a = new SoPhuc();

SoPhuc b = new SoPhuc();

Scanner console = new Scanner(System.in);

System.out.print( "Nhap vao so phuc a: " );

+) Nên sử dụng biến địa phương trừ khi tuyệt đối cần toàn cục:

- Đầu tiên nên sử dụng biến cục bộ trong từng method, nếu thấy cần sử dụng chúng ở đâu đó khác, chuyển chúng thành biến private hay protected của lớp trước khi biến chúng trở thành biến toàn cục Nếu cuối cùng bạn vẫn thấy cần dùng biến toàn cục thì mới dùng biến toàn cục

+) Cần đặt tên biến theo code convention:

+) Tất cả biến toàn cục cần được chú thích:

Trang 28

+) Cần loại bỏ hết những biến toàn cục không cần thiết chuyển về biếnđịa phương:

+) Sử dụng biến toàn cục thông qua các method truy cập:

- Tất cả những việc cần làm với biến địa phương, ta đều có thể làm tốt hơn thong qua sử dụng các method để truy cập

- Lợi ích của việc sử dụng các method này:

• Kiểm soát dữ liệu một cách tập trung Nếu bạn tìm thấy một cách khác sử dụng biến toàn cục hiệu quả hơn, bạn không cần phải sửa lại mọi chỗ mà biến toàn cục được tham chiếu tới

• Có thể kiểm soát được lỗi

• Việc thay đổi trong các method truy cập này không làm ảnh hưởng đến chương trình chính

+) Các method và dữ liệu nên được tổ chức thành một class:

+) Các method truy cập đến biến toàn cục cần ở cùng một mức trừu tượng:

Ví dụ:

package com.xuanduc987.example;

import java.util.*;

final class Global {

private static int global = 0;

public static int get() {

return global; }

public static void set(int value) {

global = value;

}

Trang 29

public class Example9 {

public static void main(String[] args) {

Scanner console = new Scanner(System.in);

System.out.println( "Nhap gia tri vao bien toan cuc: " );

Global.set(console.nextInt());

System.out.println( "gia tri bien toan cuc la: " +

Global.get());

}

Chương 5: Tổ chức các đoạn code

5.1) Mỗi câu lệnh phải theo một thứ tự cụ thể

Xét ví dụ :

import java.util.Scanner;

public class Class1 {

public static void main(String arg[]) {

Scanner nhap = new Scanner(System.in);

System.out.println( "nhap so ngay lam viec: " );

int soNgayLam =nhap.nextInt();

System.out.println( "luong trung binh mot ngay ($): " );

int luongMotNgay = nhap.nextInt();

int thuNhap = soNgayLam*luongMotNgay;

System.out.print( "thu nhap : " +thuNhap+ "$" );

Trang 30

trước và đoạn mã sau viết sai, chương trình sẽ bị lỗi !

System.out.println( "nhap so ngay lam viec: " );

int soNgayLam = nhap.nextInt();

System.out.println( "luong trung binh mot ngay ($): " );

int luongMotNgay = nhap.nextInt();

*) Ta tổ chức các đoạn code để thấy sự phụ thuộc

+) Tổ chức các đoạn code để thấy được sự phụ thuộc

+) Tên method cho thấy sự phụ thuộc

+) Tên các tham số của method cho thấy sự phụ thuộc

Ví dụ sau minh họa các kĩ thuật trên

Ví dụ chương trình sau tính doanh thu trung bình của các nhà hàng thuộcmột công ty :

import java.util.Scanner;

public class ExampleClass {

float[] totalRevenue ;

int noRestaurant ;

public ExampleClass(int noRestaurant) {

this noRestaurant = noRestaurant;

}

void initializeRevenue() {

totalRevenue = new float[ noRestaurant ];

Scanner nhap = new Scanner(System.in);

for (int i = 0; i < noRestaurant ; i++) {

System.out.print( "\n doanh thu cua hang thu " + (i+1) + " :

" );

totalRevenue [i] = nhap.nextFloat();

} }

Trang 31

void computeAverageRevenue() {

float sum = 0;

for (int i = 0; i < noRestaurant ; i++)

sum += totalRevenue [i];

System.out.print( "doanh thu trung binh : " + (sum / 5));

}

public static void main(String arg[]) {

ExampleClass anobject = new ExampleClass(3);

anobject.initializeRevenue();

anobject.computeAverageRevenue();

}

}

Ở đây ta thấy tên của các method mang tính gợi mở và liên quan đến nhau

ví dụ như đầu tiên là initializeRevenue() là nhập dữ liệu vào cho cửa hàng, hàmkhởi tạo có tên tham số noRestaurant để thấy được sự phụ thuộc lẫn nhau giữacác phần trong chương trình

-) khi mà thứ tự thực hiện các câu lệnh không ảnh hưởng đến trong chươngtrình, ta cũng nên viết theo một thứ tự nhất định để tăng tính dễ đọc và sửa lỗi

Ta nên viết những câu lệnh liên quan đến nhau gần nhau:

Ví dụ sau thực hiện chương trình nhập vào thông tin một sinh viên rồi in

ra màn hình thông tin sinh viên nhập vào:

Ngày đăng: 25/03/2015, 10:12

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w