Hiển thị kết quả từ 1 đến 2 / 2
  1. #1
    Tham gia
    06-05-2011
    Location
    nghệ an
    Bài viết
    80
    Like
    0
    Thanked 11 Times in 11 Posts

    Hạnh phúc mọi người ơi dúp em vơi pascal

    em có một bài pascal sau :
    nhập vào một dãy số rồi in ra các số giông nhau
    succe của nó như sau:
    Code:
    Uses crt;
    Var
       a, b: Array[1..50] Of Integer;
       n, m, i, j, k: Byte;
       trung: Boolean;
    BEGIN
      Clrscr;
         Write(' Nhap do dai cua day so nguyen : '); Readln(n);
         Writeln(' Nhap cac phan tu cua day : ');
         For i:= 1 To N do
             Begin
               Write (' a[',i,'] = '); Readln(a[i]);
             End;
         i:= 1; m:= 0;
         Repeat
           trung:= false;
           j:= i + 1;
           Repeat
              If (j <= n) and (a[i] = a[j]) Then trung:= true;
              inc(j);
           Until trung or (j > n);
           If trung Then
             Begin
                m:= m + 1;
                b[m]:= a[i]; writeln(b[m]:4);
             End;
             inc(i);
         Until i > n;
         If m > 1 Then
             Begin
                i:= 1;
               Repeat
                  j:= i + 1;
                  Repeat
                     trung:= false;
                     If b[i] = b[j] Then trung:= true;
                     If trung Then
                        Begin
    	                  If j < m Then
                          For k:= j To m - 1 Do b[k]:= b[k + 1];
    	                  m:= m - 1;
    	                  dec(j);
                        End;
                     inc(j);
                  Until j > m;
                  inc(i);
               Until i > m;
             End;
         If m > 0 Then
           For k:= 1 To m Do Write(b[k]:4);
        Readln;
    END.
    nhưng đoạn mà em nghì mãi không hiểu là đoạn:
    Code:
     If m > 1 Then
             Begin
                i:= 1;
               Repeat
                  j:= i + 1;
                  Repeat
                     trung:= false;
                     If b[i] = b[j] Then trung:= true;
                     If trung Then
                        Begin
    	                  If j < m Then
                          For k:= j To m - 1 Do b[k]:= b[k + 1];
    	                  m:= m - 1;
    	                  dec(j);
                        End;
                     inc(j);
                  Until j > m;
                  inc(i);
               Until i > m;
             End;
    em không hiểu nó có tác dụng gì trong ct trên em đã thử bỏ đoạn đó đi nhưng thấy nó vẫn ổn vấy mong mọi người giải thích hộ em với !
    Quote Quote

  2. #2
    Tham gia
    16-03-2008
    Location
    Hà nội
    Bài viết
    109
    Like
    0
    Thanked 17 Times in 13 Posts
    Đoạn code của bạn có thế hiểu như sau:
    Code:
    Repeat
    trung:= false;
    j:= i + 1;
    Repeat
    If (j <= n) and (a[i] = a[j]) Then trung:= true;
    inc(j);
    Until trung or (j > n);
    If trung Then
    Begin
    m:= m + 1;
    b[m]:= a[i]; writeln(b[m]:4);
    End;
    inc(i);
    Until i > n;
    Đoạn này có thể hiểu là sẽ tìm từ đầu mảng đến cuối mảng để tìm ra những phần tử trùng nhau, cụ thể là xét 1 phần từ của mảng, rồi so sánh từ đầu tới cuối mảng, nếu có phần tử trùng thì dừng lại và thêm phần tử vảo mảng B. Nhưng cái này nó sẽ là cứ trùng nhau thì nó đưa vào.
    Ví dụ như mảng của bạn là 1,2,5,4,2,4,6,7 --> Thì kết quả ở mảng B là :2,4
    Nhưng vấn đề của bài này đó là nếu số lần trùng >2 thì nó sẽ ra kết quả khác
    Ví dụ: Mảng của bạn là: 1,2,5,4,2,4,6,7,2 --> Thì kết quả ở mảng B là : 2,4,2
    Như vậy kết quả đưa ra sẽ lại bị trùng, vậy thì điều tiếp theo cần làm là tiếp tục kiểm tra mảng B xem có những phần tử nào trùng, và loại nó ra khỏi mảng.
    Đó chính là công việc của đoạn code
    Code:
    If m > 1 Then
    Begin
    i:= 1;
    Repeat
    j:= i + 1;
    Repeat
    trung:= false;
    If b[i] = b[j] Then trung:= true;
    If trung Then
    Begin
    If j < m Then
    For k:= j To m - 1 Do b[k]:= b[k + 1];
    m:= m - 1;
    dec(j);
    End;
    inc(j);
    Until j > m;
    inc(i);
    Until i > m;
    End;
    Cách loại bỏ ở đây, cũng giống như trên, xét 1 phần tử, và tìm phần tử trùng, khi tìm được thì cho phần từ trùng đó về cuối mảng, sau đó loại bỏ ra khỏi mảng.
    Empty

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •