01/10/2018, 14:34

Logic error code java

đề bài: Nhập số liệu cho dãy số thực a0 , a1 ,…, an-1 và một giá trị thực x. Giả sử dãy a đã được sắp xếp theo thứ tự tăng dần. Hãy chèn giá trị x vào dãy a sao cho vẫn giữ được tính sắp xếp của mảng.
đây là code của em. Nhưng nó lỗi từ dòng 28 và nó k chạy, ai biết chỉ em với…
package daycon;

import java.util.Scanner;

public class Daycon {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Nhập n: ");
        int n = scanner.nextInt();
        System.out.println("Nhập x: ");
        int x = scanner.nextInt();
        int a[] = new int[n];
        for (int i = 0; i < n; i++) {
            System.out.println("Nhập a[i]: ");
            a[i] = scanner.nextInt();
        }
        for (int i = 0; i < n; i++) {
            if (x < a[i + 1] && x > a[i]) {
                int k = i + 1;
                System.out.println(k + "   " + i);
                System.out.println(n);
                for (int j = n; j > k; j--) {
                    a[j] = a[j - 1]; //Dịch các phần tử sang phải 1 vị trí
                    a[k] = x;
                    System.out.println(a[k]);
                }
                n++;
                System.out.println(n);
            }
        }
        for (int i = 0; i < n; i++) {
            System.out.println(a[i] + "	");
        }
    }
}
HK boy viết 16:38 ngày 01/10/2018
  • Hình như đây không phải là lần đầu mình nhắc bạn thêm category vào topic. Thêm vào mau lên đi :v

  • Dòng 28 là dòng nào?

  • Đoạn

a[k] = x;
System.out.println(a[k]);

vứt ngay ra ngoài vòng for j ngay.

Monochorme viết 16:35 ngày 01/10/2018

ơ, em biết category vào như nào đâu -_- , nó k chạy từ for(j) ấy ạ :v

Monochorme viết 16:42 ngày 01/10/2018

không đc đâu, em test kiểu này rồi bác ơi

HK boy viết 16:37 ngày 01/10/2018

int a[] = new int[n];

Khai báo mảng a có mỗi n phần tử, thế mà đòi dịch phần tử ra phần tử a[n]

for (int j = n; j > k; j--) {
    a[j] = a[j - 1]; //Dịch các phần tử sang phải 1 vị trí

thì dịch thế quái nào được.

không đc đâu, em test kiểu này rồi bác ơi

Mình biết. Vứt đoạn đấy ra ngoài for không ảnh hưởng gì mấy, nhưng về logic tư duy thì đưa ra ngoài for đúng hơn.

Monochorme viết 16:50 ngày 01/10/2018

ơ, em thấy code C làm đc tưởng java cũng thế -_-

HK boy viết 16:49 ngày 01/10/2018

C != Java mà.

20 char.

Monochorme viết 16:35 ngày 01/10/2018

vẫn lỗi và em chưa biết sửa thế nào -_-

HK boy viết 16:35 ngày 01/10/2018

Lỗi thế nào hả bạn? Bạn post lên đi chứ.

Monochorme viết 16:37 ngày 01/10/2018

nó cứ như này từ tối đến giờ bác ơi

HK boy viết 16:38 ngày 01/10/2018

for (int i = 0; i < n; i++) {
if (x < a[i + 1] && x > a[i]) {

Còn chỗ này nữa.

Nếu x > a[n-1] thì sao? Nếu x < a[0] thì sao? Nếu x nằm giữa a[0] và a[n] thì sao?

Không phải cứ muốn x nằm giữa khoảng 2 phần tử liên tiếp là được.

Vòng lặp i quên chưa break kìa :v cho nên code sẽ chạy đến i = n-1 -> truy cập vào a[i+1] = a[n] -> lỗi.

Monochorme viết 16:50 ngày 01/10/2018

em cũng biết còn chặn đầu chặn đuôi cơ mà khúc giữa chưa ffix xong nên chưa nghĩ tới

HK boy viết 16:51 ngày 01/10/2018

Tại bạn không nắm rõ code flow nên dễ gặp bug kiểu này. Lần sau đọc code cho kĩ.

Monochorme viết 16:50 ngày 01/10/2018

Uploading… thêm break; nó ra thế này đây bác ơi :V
còn cái vòng lặp i, em cho nó x < a[i + 1] && x > a[i] tức là nó chỉ chạy đc 1 lần rồi mà nhỉ

HK boy viết 16:41 ngày 01/10/2018

Up lại hình đi.

Vòng lặp sẽ đến khi nào tìm được chỗ cho x thì break mà.

Monochorme viết 16:37 ngày 01/10/2018

HK boy viết 16:46 ngày 01/10/2018

Up lại cả code lên đây.

Monochorme viết 16:50 ngày 01/10/2018

package daycon;

import java.util.Scanner;

public class Daycon {

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Nhập n: ");
    int n = scanner.nextInt();
    System.out.println("Nhập x: ");
    int x = scanner.nextInt();
    int a[] = new int[n];
    for (int i = 0; i < n; i++) {
        System.out.println("Nhập a[i]: ");
        a[i] = scanner.nextInt();
    }
    for (int i = 0; i < n; i++) {
        if (x < a[i + 1] && x > a[i] && a[i] != x) {
            int k = i + 1;
            System.out.println(k + "   " + i);
            for (int j = n; j > k; j--) {
                a[j] = a[j - 1];  
            }
            n++;
            a[k] = x;
        } break;
    }
    for (int i = 0; i < n; i++) {
        System.out.println(a[i] + "\t");
    }
}

}

rogp10 viết 16:45 ngày 01/10/2018

Sau khi tìm ra và chèn xong thì phải break chứ nhỉ, có một phần tử thôi. Viết vậy không rõ ràng.[quote=“Monochorme, post:6, topic:63232, full:true”]
ơ, em thấy code C làm đc tưởng java cũng thế -_-
[/quote]
Trong C/C++ không phải câu nào dịch được cũng có nghĩa (như bạn nghĩ) đâu. Đó chính là khái niệm undefined.

HK boy viết 16:51 ngày 01/10/2018

Nếu tìm được chỗ để nhồi x vào giữa thì mới break được chứ -> break phải nằm trong if chứ

Bạn phải nắm được bạn đang code cái gì chứ

Monochorme viết 16:37 ngày 01/10/2018

giờ nó lại bị mất giá trị cuối

Bài liên quan
0