mọi người giúp chút về pascal

Viết hàm xóa tất cả các phần tử có giá trị bằng x trong dãy số A
 

quanltv

Sư phụ của ADMIN
Bạn duyệt từ đầu đến cuối dãy, xét từng phần tử nếu có thằng nào = x (tại vị trí k chằng hạn) thì diệt ngay, bằng cách:
  1. Cho 1 vòng lặp: Gán giá trị của phần tử A[k] := A[k+1], A[k+1]:= A[k+2] cứ thế cho đến hết dãy
  2. Độ dài của dãy N:=N-1
2 câu lệnh này nằm trong cặp begin ..end và liền sau câu lệnh if, nằm trong vòng lặp for duyệt từng phần tử của dãy :)
 

tengiday

Happy life
Nếu làm như bạn @quanltv thì kích cỡ dữ liệu lớn sẽ chạy mệt. Bài này bạn nên để 2 variables: i và j.
- i sẽ chạy liên tục từ 1 tới n.
- Với j (khởi tạo j := 0), mỗi khi a <> x thì tăng j lên 1 rồi gán a[j] := a.
- Kết quả cuối cùng gán n := j.
Độ phức tạp O(n).

PS: Hình như 4rum sau lần "nâng cấp" càng lúc càng chậm. Nhiều lúc buổi tối chờ 5 phút mà page cũng chưa load đc. :-(
 
program test;
uses crt;
type mang=array[1..100] of integer;
var i,j,k,x,n: integer;
A:mang;
function xoaphantu(A:mang; n,x:integer):integer;
var i,j,m:integer;
begin


for i:=1 to n do
while a=x do
begin
for j:=i to n do
a[j]:=a[j+1];
n:=n-1;
end;
for i:=1 to n do
xoaphantu:=a;
end;
begin
clrscr;
write('so phan tu');readln(n);
for i:=1 to n do
begin
write('Nhap phan tu thu ',i,':');
readln(a);
end;
write('Nhap x:');
readln(x);
writeln('Day so sau khi xoa: ',xoaphantu(A,n,x));
readln;
end.

các bác sửa cho em với
 

tengiday

Happy life
Cách của mình thì phải viết như thế này:
Mã:
procedure deleteElements(var a : arr; var n, x : longint);
var i, j : longint;
begin
    j := 0;
    for i := 1 to n do
        if (a[i] <> x) then
            begin
                inc(j);
                a[j] := a[i];
            end;
    n := j;
end;
 

quanltv

Sư phụ của ADMIN
Cách của mình thì phải viết như thế này:
Mã:
procedure deleteElements(var a : arr; var n, x : longint);
var i, j : longint;
begin
    j := 0;
    for i := 1 to n do
        if (a[i] <> x) then
            begin
                inc(j);
                a[j] := a[i];
            end;
    n := j;
end;
Cách của anh @tengiday rất chuẩn và tối ưu
Ý là xét từng phần tử, nếu khác X thì đưa phần tử đó dồn về đầu dãy luôn, chứ không phải đưa cả cái đuôi của nó theo nữa cho mệt :)
 
Mã:
program test;uses crt;
type mang=array[1..100] of integer;
var i,j,x,n: integer;
       A:mang;
    function xoaphantu(A:mang; n,x:integer):integer;
    var i,j:integer;
    begin
          j:=0;
          for i:=1 to n do
              if (A[i]) <> x then
              begin
                   inc(j);
                   A[j] := A[i];
              end;
              n:=j;
              xoaphantu:=A[j];
    end;
    begin
         clrscr;
         write('so phan tu');readln(n);
         for i:=1 to n do
         begin
              write('Nhap phan tu thu ',i,':');
              readln(a[i]);
              end;
              write('Nhap x:');
              readln(x);
              writeln('Day so sau khi xoa: ',xoaphantu(A,n,x));
              readln;
end.
Em viết lại bằng hàm mà không ra được
 

quanltv

Sư phụ của ADMIN
Code của bạn bị vấn đề sau: Bạn đang hiểu sai về cách dùng Hàm (Function) và thủ tục (Procedure)
Việc xoá các phần tử của dãy A trong bài này thì cần dùng 1 chương trình con là thủ tục (tập hợp các câu lệnh để phục vụ 1 công việc được đặt sẵn, bao gồm các câu lệnh). Khác với Function là cũng thực hiện các công việc nhưng lại xuất kết quả ra theo tên hàm luôn.

Cái bạn cần xuất ở đây là cả dãy số (tập hợp các integer), trong khi bạn khai báo xoaphantu(A,n,x)) lại là 1 integer => dùng sai. Mặt khác tên function không có kiểu dữ liệu mảng (array)

Cần sửa lại code là
Mã:
Procedure xoaphantu(A:mang; n,x:integer);
  begin
  ...
  end

{Nhập dữ liệu}
...

{Xuất kết quả bằng cách cho 1 vòng lặp như lúc nhập để lần lượt in ra các phần tử của mảng}
writeln('Day so sau khi xoa: ');
for i:= 1 to n do writeln(a[i]);
readln;
 
Mã:
program baitap;uses crt;
type mang = array[1..100] of integer;
 var   n,i,j,x:integer;
       a:mang;
procedure xoaphantu(var a:mang;var n,x:integer);
var i,j:integer;
 begin
      j:=0;
 	for i:=1 to n do
        if a[i] <> x then
           begin
                inc(j);
                a[j]:=a[i];
           end;
      n:=j;
 end;


 begin
      clrscr;
         write('Nhap phan tu: ');readln(n);
         for i:=1 to n do
         begin
             write('Phan tu thu ',i,' ');
             readln(a[i]);
         end;
         writeln('Day so truoc khi xoa');
         begin
         for i:=1 to n do
         write(a[i],' ');
         writeln;
         end;
         write('Nhap vao so X: ');readln(x);
         writeln('Day so A sau khi xoa');
         for i:=1 to n do
         write(a[i]);
         writeln;
     readln;
end.

Khi in ra nó vẫn là mảng cũ không xóa đi đc phần tử nhập vào
 

tengiday

Happy life
Mã:
program baitap;uses crt;
type mang = array[1..100] of integer;
 var   n,i,j,x:integer;
       a:mang;
procedure xoaphantu(var a:mang;var n,x:integer);
var i,j:integer;
 begin
      j:=0;
     for i:=1 to n do
        if a[i] <> x then
           begin
                inc(j);
                a[j]:=a[i];
           end;
      n:=j;
 end;


 begin
      clrscr;
         write('Nhap phan tu: ');readln(n);
         for i:=1 to n do
         begin
             write('Phan tu thu ',i,' ');
             readln(a[i]);
         end;
         writeln('Day so truoc khi xoa');
         begin
         for i:=1 to n do
         write(a[i],' ');
         writeln;
         end;
         write('Nhap vao so X: ');readln(x);
         writeln('Day so A sau khi xoa');
         for i:=1 to n do
         write(a[i]);
         writeln;
     readln;
end.

Khi in ra nó vẫn là mảng cũ không xóa đi đc phần tử nhập vào
Bạn chưa gọi hàm mà.
 

quanltv

Sư phụ của ADMIN
Bạn chưa gọi hàm mà.
Anh @tengiday nói chuẩn rồi, bạn cần gọi hàm (thủ tục) trước khi in ra mảng. Hàm được tạo ra để dùng gọi nhiều lần trong cả chương trình to, riêng bài này thì cũng chả cần tạo hàm làm gì cả, vì dùng mỗi 1 lần thôi mà.

Bạn nên đọc thêm về tham biến và tham trị, có var đằng trước tham số được khai báo của hàm là "tham biến" (có thay đổi giá trị sau khi thực hiện hàm xong) như bạn đã làm là đúng. Còn var n,x:integer thì không đúng lắm :)
Mã:
http://doc.edu.vn/tai-lieu/pascal-tham-so-tri-va-tham-so-bien-59381/
 
Top