so_0_lanh_lung xin help Pascal - VN-Zoom forum

Go Back   VN-Zoom forum > Chia sẻ kiến thức > Lập trình > Pascal | C/C++
Đăng Ký Quên mật khẩu Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc
 
so_0_lanh_lung xin help Pascal
Gửi Ðề Tài Mới  Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 29-04-2008, 06:01   #1 (permalink)
Búa Đá
 
so_0_lanh_lung's Avatar
 
Tham gia: Mar 2008
Đến từ: Huế
Bài: 63
Điểm: 2/2 bài viết
Smile so_0_lanh_lung xin help Pascal

dùng mảng 1 chiều nhé các anh :
nhập vào 1 mảng nào đó với số phần tử tùy,giá trị tùy ý
-hãy thực hiện chèn x vào vị trí vt . hãy xóa phần tử tại vị trí vt
-giả sử mảng sắp xếp theo chiều tăng dần, chèn 1 phần tử x vào sao cho vẫn đảm bảo thứ tự tăng dần,
- hãy thực hiện xóa phần tử x trong dãy số
- giả sử có 2 mảng a và b sắp theo thứ tự tăng dần thực hiện
trộn hai mảng a và b nhưng vẫn đảm bảo thứ tự tăng dần

giúp em thanks all
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Old 29-04-2008, 08:18   #2 (permalink)
Gà Con
 
hungson215's Avatar
 
Tham gia: Nov 2007
Bài: 2
Điểm: 0/0 bài viết
Default

Mình ko có học Pascal nhưng mình sẽ đưa ra cách giải:
-để chèn x vào vị trí Vt thì bạn phải dời các phần tử từ V(t)->V(n) "qua phải" tức là V(n+1)=V(n) , V(n)=V(n-1) ,....., V(t+1)=V(t) . Sau đó bạn gán V(t)=x.
-Để xóa phần tử tại vị trí V(t) thì bạn dịch chuyển các phần tử từ V(t+1)->V(n) "qua trái" tức là V(t)=V(t+1) ,......, V(n)=V(n+1).
-Để chèn x vào mảng sao cho vẫn đảm bảo tăng dần thì bạn chỉ cần so sánh x với từng phần tử trong mảng theo thứ tự từ "trái" qua "phải" hoặc ngược lại để tìm vị trí V(t) sau đó chèn x vào vị trí V(t). (Để giảm số lần so sánh bạn nên so sánh với phần tử ở giữa mảng có vị trí V(n/2) (nhớ lấy giá trị nguyên) ).
-Xóa phần tử X trong dãy số là tổng hợp 2 cách trên nên mình để bạn tự suy nghĩ.
-Để trộn 2 mảng tăng dần mình sẽ giả sử:
2 mảng cần trộn là A và B có số phần tử tương ứng là x và y
Mảng sau khi trộn là C có số phần tử là n=x+y;
Mình sẽ làm như sauMình sẽ viết code bằng ngôn ngữ C mình nghĩ nó cũng tương tự pascal)

int a=b=i=0; //Trong C mảng đánh số từ 0 chứ ko phải từ 1 như
//trong pascal
while(i<n) //Chắc bạn biết đến vòng lặp này
{ //Câu lệnh if này gần giống trong Pascal
if(a == x) //Dấu này "==" là dấu so sánh bằng
C(i) = B(b); //Đây là phép gán chứ ko phải dấu bằng.
else if(b == y)
C(i)=A(i);
else if(A(a)<B(b))
{
C(i)=A(x);
a=a+1; //Biểu thức này nghĩa là tăng giá trị của a lên 1
}
else
{
C(i)=B(y);
y=y+1;
}
i=i+1;
}
*Cách của mình trên đây chỉ là tham khảo

thay đổi nội dung bởi: hungson215, 29-04-2008 lúc 09:20.
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Old 30-04-2008, 17:43   #3 (permalink)
Búa Gỗ Đôi
 
giangmeo's Avatar
 
Tham gia: Mar 2008
Bài: 44
Điểm: 0/0 bài viết
Default

bạn nên dùng một vòng lặp là tốt nhất
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Old 05-05-2008, 03:23   #4 (permalink)
Búa Đá
 
so_0_lanh_lung's Avatar
 
Tham gia: Mar 2008
Đến từ: Huế
Bài: 63
Điểm: 2/2 bài viết
Default

giúp em giải câu này đi
- giả sử có 2 mảng a và b sắp theo thứ tự tăng dần thực hiện
trộn hai mảng a và b nhưng vẫn đảm bảo thứ tự tăng dần
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Old 06-05-2008, 09:49   #5 (permalink)
Rìu Sắt
 
thienthan's Avatar
 
Tham gia: Nov 2007
Bài: 163
Điểm: 31/27 bài viết
Send a message via Yahoo to thienthan
Default

Bài này có trong sách bài tập tin 11 thì phải. Có ngó qua một tí nhưng dạng này chán lắm.
Chiều mình còn thì học kì toán hơn 10 h rồi. Mình làm nhanh vậy.
Code:
{Có hai mẩng a[m], b[n]}
i:= 1;
j:= 1;
l:= 1;
do
	if a [i] < b[j] then
		begin
			c[l]:= a [i];
			inc(l);
			while i < m do inc (i) {tang bien i mot don vi}
		end
	else
		begin
			c[l]:= b [j];
			inc(l);
			while j < n do inc (j) {tang bien j mot don vi}
		end;
until l=m+n;{co the thay dieu kien thanh i=n and j=m}
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Old 09-05-2008, 04:46   #6 (permalink)
Búa Đá
 
so_0_lanh_lung's Avatar
 
Tham gia: Mar 2008
Đến từ: Huế
Bài: 63
Điểm: 2/2 bài viết
Default

cho mình hỏi ý nghĩa của 2 từ "đối số"
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Old 09-05-2008, 19:58   #7 (permalink)
Rìu Sắt
 
thienthan's Avatar
 
Tham gia: Nov 2007
Bài: 163
Điểm: 31/27 bài viết
Send a message via Yahoo to thienthan
Default

Trích:
so_0_lanh_lung View Post
cho mình hỏi ý nghĩa của 2 từ "đối số"
+ Danh sách tham số có thể chứa không, một hay nhiều đối số hàm. Mỗi đối số được định nghĩa gồm kiểu dữ liệu và tên đối số.
Đối số= Đơn vị cấu tạo nên danh sách tham số.
Đối số ~ Tham số (hình thức).
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Thành viên đã cám ơn bài viết này của thienthan:
so_0_lanh_lung (10-05-2008)
Old 10-05-2008, 04:50   #8 (permalink)
Búa Đá
 
so_0_lanh_lung's Avatar
 
Tham gia: Mar 2008
Đến từ: Huế
Bài: 63
Điểm: 2/2 bài viết
Default

Hỏi về xâu :
về xóa kí tự trắng ở đầu cuối và giữa...
tại sao ta không cho chạy từ 1 -- > length(st) nếu s[i] = #32 thì delete(st,i,1);
có nghĩa là nó chạy gặp kí tự trắng thì Xóa.....
mà phải dùng WHILE xóa đầu Xóa đuôi,,rồi POS để xóa giữa
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Old 12-05-2008, 06:53   #9 (permalink)
Búa Đá
 
so_0_lanh_lung's Avatar
 
Tham gia: Mar 2008
Đến từ: Huế
Bài: 63
Điểm: 2/2 bài viết
Default

hỏi thêm câu nữa nè tại sao ta viết thế này là đúng xóa hết kí tự trống đầu
Code:
  While s[1] = #32 do delete(st,1,1);
còn thế này lại không được nó chỉ xóa được một khoảng thôi
Code:
 While s[i] = #32 do
             begin
               delete(st,i,1);
                inc(i);
             end;
__________________
Một buổi tối đẹp trời. Cô gái gọi điện cho cậu trai đang tán tỉnh mình : "Anh ơi... Nhà em đi hết cả rùi... Anh đến ngay nhé... Không có ai ở nhà đâu... !". Cậu trai hí hửng vội vàng phóng xe đến nhà cô bạn, bấm chuông, 5 phút... 10 phút... 15 phút... Sau nửa tiếng bấm chuông, anh mới nhận ra, đúng là... "KHÔNG CÓ AI Ở NHÀ THẬT". potay..^^!
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Old 12-05-2008, 07:48   #10 (permalink)
Búa Gỗ Đôi
 
gico2107's Avatar
 
Tham gia: Dec 2007
Bài: 27
Điểm: 6/3 bài viết
Default

Trích:
so_0_lanh_lung View Post
hỏi thêm câu nữa nè tại sao ta viết thế này là đúng xóa hết kí tự trống đầu
Code:
  While s[1] = #32 do delete(st,1,1);
còn thế này lại không được nó chỉ xóa được một khoảng thôi
Code:
 While s[i] = #32 do
             begin
               delete(st,i,1);
                inc(i);
             end;
cái trên mới là xóa 1 ký tự trắng vì nó chỉ xét có 1 mình s[1] thôi nếu s[1] = " " thì xóa s1. còn cái dưới mới là xóa tất cả ký tự trắng vì nó quét tất cả các s[i] (i=1,...,n), gặp thằng s[i] nào là " " thì xóa ngay.
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Old 12-05-2008, 09:54   #11 (permalink)
Rìu Sắt
 
thienthan's Avatar
 
Tham gia: Nov 2007
Bài: 163
Điểm: 31/27 bài viết
Send a message via Yahoo to thienthan
Default

Trích:
so_0_lanh_lung View Post
Hỏi về xâu :
về xóa kí tự trắng ở đầu cuối và giữa...
tại sao ta không cho chạy từ 1 -- > length(st) nếu s[i] = #32 thì delete(st,i,1);
có nghĩa là nó chạy gặp kí tự trắng thì Xóa.....
mà phải dùng WHILE xóa đầu Xóa đuôi,,rồi POS để xóa giữa
Là vì khi del bạn đã thay đổi chuỗi đó rồi (làm nó ngắn đi). Vì vậy bạn phải dùng while nếu dùng for cũng được nhưng bạn cần phải hiểu về bản chất ngôn ngữ bạn viết thì mới sửa cho thích hợp được.
Code:
repeat
if s[i]=#32 then delete(s,i,1) else inc(i)
until i>length(s){Thông cảm chỗ này mình viết vội nên hơi nhầm}
Code:
for i=1 to length(s) do
if s[i]=#32 then
begin
delete(s,i,1)
dec(i)
end

thay đổi nội dung bởi: thienthan, 12-05-2008 lúc 19:29. Lý do: Viết nhầm
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Thành viên đã cám ơn bài viết này của thienthan:
so_0_lanh_lung (12-05-2008)
Old 12-05-2008, 15:45   #12 (permalink)
Rìu Bạc
 
Mr_Dolphin's Avatar
 
Tham gia: Dec 2007
Bài: 323
Điểm: 55/37 bài viết
Default

Trích:
tại sao ta không cho chạy từ 1 -- > length(st) nếu s[i] = #32 thì delete(st,i,1);
Đúng cách này sẽ xóa hết kí tự trắng nhưng khi cần dùng xóa kí tự trắng thường là do yêu cầu chuẩn hóa sâu kí tự của đầu bài, tức là xóa hết trằng ỏ đầu, cuối và mỗi chữ trong chuỗi chỉ cách nhau bởi 1 kí tự trắng. Từ yêu cầu đó mới nảy sinh ra 3 bước chuẩn hóa xâu mà bạn đã biết.

@to gico2107 : giải thích của bạn sai hoàn toàn, đoạn mã 1 sẽ xóa hết kí tự trắng ở đầu xâu.
Còn đoạn thử 2 không xóa đc hết kí tự trắng ở đầu xâu, có thể giải thích đơn giản như sau:
Nếu xâu của bạn có 5 kí tự trắng đánh dấu là abcde
ban đầu s[1] là kí tự trắng a, vì a là kí tự trắng nến xóa a dẫn đến s[1] trở thành kí tự trắng b tăng i lến 1 tức i=2 mà hiện tại s[2] là kí tự trắng c và tiếp tục xét và xóa, như vậy nó bỏ qua kí tự trắng b.
Tóm lại đoạn code 2 cứ cách một kí tự lại xóa một kí tự trắng, code sai, thậm chí bạn nhập vào 1 chuỗi nhứ sau: a s d f g h (bắt đầu là 1 kí tự trắng và sau đó là xen kẽ nhau 1 kí tự thường và 1 kí tự trắng) code vẫn hoạt động và xóa hết kí tự trắng.
__________________
-_::Tin Học là chia sẻ ::_-
http://cnttk1a.hnsv.com
Chào mừng các bạn đến diễn đàn lớp tui!
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Old 12-05-2008, 15:56   #13 (permalink)
Rìu Bạc
 
Mr_Dolphin's Avatar
 
Tham gia: Dec 2007
Bài: 323
Điểm: 55/37 bài viết
Default

Trích:
repeat
if s[i]=#32 then delete(s,i,1) else inc(i)
until i=length(s)
code này không xóa kí tự trắng cuối cùng.
Mà cách dùng for đúng là một hạ sách luôn phải chạy đủ số vòng lặp mà xâu thì không nhiều kí tự trắng đến vậy, nói chung là cách while là ổn nhất rồi.
__________________
-_::Tin Học là chia sẻ ::_-
http://cnttk1a.hnsv.com
Chào mừng các bạn đến diễn đàn lớp tui!
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Thành viên đã cám ơn bài viết này của Mr_Dolphin:
so_0_lanh_lung (12-05-2008)
Old 12-05-2008, 19:33   #14 (permalink)
Rìu Sắt
 
thienthan's Avatar
 
Tham gia: Nov 2007
Bài: 163
Điểm: 31/27 bài viết
Send a message via Yahoo to thienthan
Default

Trích:
Mr_Dolphin View Post
code này không xóa kí tự trắng cuối cùng.
Mà cách dùng for đúng là một hạ sách luôn phải chạy đủ số vòng lặp mà xâu thì không nhiều kí tự trắng đến vậy, nói chung là cách while là ổn nhất rồi.
Thông cảm viết nhầm sửa = thành > được rồi.(Hoặc sử dụng while do thì điều kiện vẫn là =)
Nếu dùng while mà dùng pos thì còn chậm hơn nhiều do bản chất pos cũng chứa for rồi. Nhưng nó không tận dụng phần đầu đã xóa thì không còn kí tự trắng nữa. Kiểu gì cũng phải kiểm tra mỗi vị trí ít nhất một lần thì mới biết nó có là #32 không. Nhưng nếu dùng pos và while thì nó sẽ kiểm tra tới vài lần gây lãng phí không cần thiết.
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Thành viên đã cám ơn bài viết này của thienthan:
so_0_lanh_lung (12-05-2008)
Old 12-05-2008, 21:16   #15 (permalink)
Búa Đá
 
so_0_lanh_lung's Avatar
 
Tham gia: Mar 2008
Đến từ: Huế
Bài: 63
Điểm: 2/2 bài viết
Default

giải thích hộ em bài này..tìm số từ trong 1 câu ca dao được nhập từ bàn phím
Code:
Program Dem_Tu;
{$V-}
Var
St:String;
Function Sochu(Dong:String):Integer;
Var
	dem,i:Integer;
Begin
	Dem:=0;
	i:=1;
   Repeat
   	While ((UpCase(Dong[i]) < 'A') Or (UpCase(Dong[i]) > 'Z'))
   		And (I <=Length(Dong)) Do
   		i:=i+1;
      If i <= Length(Dong) Then
      	Dem:=Dem + 1;
   	While ((UpCase(Dong[i]) >= 'A') And (UpCase(Dong[i]) <= 'Z'))
   		And (I <=Length(Dong)) Do
      i:=i+1;
   Until i > Length(Dong);
   Sochu:=Dem;
End;
{---------------------------}
BEGIN
	Write('-Nhap mot cau ca dao tuc ngu: ');
   Readln(St);
   Writeln('-Cau nay co: ',Sochu(St),' tu');
   Readln
END.
__________________
Một buổi tối đẹp trời. Cô gái gọi điện cho cậu trai đang tán tỉnh mình : "Anh ơi... Nhà em đi hết cả rùi... Anh đến ngay nhé... Không có ai ở nhà đâu... !". Cậu trai hí hửng vội vàng phóng xe đến nhà cô bạn, bấm chuông, 5 phút... 10 phút... 15 phút... Sau nửa tiếng bấm chuông, anh mới nhận ra, đúng là... "KHÔNG CÓ AI Ở NHÀ THẬT". potay..^^!
Hiện đang vắng mặt   Trả Lời Với Trích Dẫn
Gửi Ðề Tài Mới  Trả lời


Ðang xem: 1 (0 thành viên & 1 khách)
 
Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
Bạn không được quyền gửi bài
Bạn không được quyền gửi trả lời
Bạn không được quyền gửi kèm file
Bạn không được quyền sửa bài

vB code đang Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt
Trackbacks are Mở
Pingbacks are Mở
Refbacks are Tắt


Múi giờ GMT +7. Hiện tại là 02:42.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2007, Jelsoft Enterprises Ltd.