Hiển thị kết quả từ 1 đến 10 / 10
  1. #1
    Tham gia
    12-07-2009
    Bài viết
    5
    Like
    0
    Thanked 3 Times in 3 Posts

    Ngạc nhiên cần giải giúp mấy bài pascal này gấp !!!! help..help

    sau khi đọc mấy bài này thì mình không hiểu phải làm gì ? các bạn có thể phân tích đầu bài xem họ yêu cầu gì dc ko ạ ? hay hộ luông thì tốt mình đang cần .....

    Bài tập số 1
    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Tạo một danh sách liên kết đơn n phần tử (n>0) chứa các số nguyên ngẫu nhiên. Hãy in ra giá trị và các vị trí của phần tử nhỏ nhất trong danh sách.

    Bài tập số 2

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Tạo một danh sách liên kết đơn n phần tử (n>0) chứa các số nguyên ngẫu nhiên. Hãy in ra giá trị và các vị trí của phần tử lớn nhất trong danh sách.

    Bài tập số 3

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Tạo một danh sách liên kết đơn n phần tử (n>0) chứa các số nguyên ngẫu nhiên. Xác định xem phần tử x nhập vào từ bàn phím có nằm trong danh sách hay không? Nếu có thì ở những vị trí nào? In ra các phần tử của danh sách.

    Bài tập số 4

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Tạo một danh sách liên kết đơn n phần tử (n>0) chứa các số nguyên ngẫu nhiên. Hãy in ra các phần tử của danh sách và cho biết giá trị của phần tử thứ k của danh sách là bao nhiêu ? Loại bỏ phần tử thứ k khi k=1.


    Bài tập số 5
    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Tạo một danh sách liên kết đơn n phần tử (n>0) chứa các số nguyên ngẫu nhiên. Hãy đếm xem trong danh sách có bao nhiêu số chẵn, bao nhiêu số lẻ, bao nhiêu số âm, bao nhiêu số dương? Hãy in ra màn hình lần lượt từng loại các phần tử tương ứng trên.






    Bài tập số 6

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Tạo một danh sách liên kết đơn gồm 20 phần tử là các số nguyên. Hãy chèn phần tử x nhập từ bàn phím vào vị trí thứ k (0<k<21) của danh sách. Hãy in các phần tử của danh sách trước và sau khi chèn.

    Bài tập số 7

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Sinh ngẫu nhiên một danh sách liên kết đơn chứa các số nguyên có thứ tự tăng. Hãy chèn số nguyên x được đọc vào từ bàn phím vào danh sách liên kết sao cho sau khi chèn vẫn đảm bảo thứ tự. Hãy in các phần tử của danh sách cả trước và sau khi chèn.

    Bài tập số 8

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Sinh ngẫu nhiên hai danh sách liên kết đơn chứa các số nguyên đều có thứ tự tăng. Hãy ghép hai danh sách liên kết đơn này thành một danh sách liên kết cũng có thứ tự tăng. Hãy in các phần tử của cả ba danh sách trên.

    Bài tập số 9

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Tạo một danh sách liên kết đơn gồm 20 phần tử là các số nguyên. Hãy xoá phần tử thứ k (0<k<21) của danh sách. Hãy in các phần tử của danh sách trước và sau khi xoá.

    Bài tập số 10

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Sinh ngẫu nhiên một danh sách liên kết đơn chứa n (0<n<100) các số nguyên. Hãy xoá đi k (k>0) phần tử liên tiếp của danh sách liên kết kể từ vị trí thứ i (1<i<50) của danh sách. In ra các phần tử của danh sách trước và sau khi xoá.
    Quote Quote

  2. Thành viên Like bài viết này:


  3. #2
    Tham gia
    05-08-2010
    Bài viết
    313
    Like
    9
    Thanked 73 Times in 69 Posts
    Đây là những bài xử lý trên ds liên kết đơn thôi mà.

  4. 2 thành viên Like bài viết này:


  5. #3
    Tham gia
    06-10-2010
    Bài viết
    24
    Like
    0
    Thanked 15 Times in 11 Posts
    - Đó là những bài Pascal sử dụng danh sách liên kết (danh sách móc nối), các con trỏ được móc nối với nhau thông qua địa chỉ, thông thường tất cả các con trỏ đều có cấu trúc gồm: Các trường chứa thông tin và ít nhất 1 trường kiểu con trỏ (không thể thiếu) để chứa địa chỉ của con trỏ khác
    - Những bài bạn đưa ra cũng không phải là quá khó nếu bạn hiểu về con trỏ, cách tạo lập và xử lý nó. Và đặc biệt bạn sẽ cần phải sử dụng các hàm, thủ tục tự tạo để dễ quản lý và sử dụng lại.
    - Thời gian có hạn nên mình sẽ không giải quyết được 1 lúc cho bạn hết được, chỉ có thể mỗi ngày 1 ít cho đến khi nào hết thì thôi. Quyết định thế đi.
    - Bắt đầu nhé:
    Bài tập số 1
    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Tạo một danh sách liên kết đơn n phần tử (n>0) chứa các số nguyên ngẫu nhiên. Hãy in ra giá trị và các vị trí của phần tử nhỏ nhất trong danh sách.
    Bài tập số 2

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Tạo một danh sách liên kết đơn n phần tử (n>0) chứa các số nguyên ngẫu nhiên. Hãy in ra giá trị và các vị trí của phần tử lớn nhất trong danh sách.
    - Vì chỉ viết nhưng không test, nên khi chạy chương trình có lỗi coding dấu chấm dấu phảy thì bạn sửa giùm
    Code:
    PROGRAM DANHSACH_NOIDON;
    VAR
    	Type Contro = ^SoNguyen;
    	SoNguyen = Record
    		Value: Integer;
    		Next: Contro;
    	End;
    	P:Contro;
    
    /*Cac ham va thu tuc dung trong chuong trinh*/
    Procedure TaoDanhsach(Var P: Contro);
    	(*Thu tuc tao moi danh sach lien ket don chua cac so nguyen ngau nhien, so phan tu nhap tu ban phim*)
    	Var
    		Q,R: Contro;
    		I,n: Interger;
    	Begin
    		Write(“Nhap co phan tu cua danh sach: ”);
    		Readln(n);
    		P:=Nil;
    R:=P;
    		For i:=1 to n do
    			Begin
    				New(Q);
    				Q^.Value := Random(32767);
    				If P=Nil then
    					P:=Q;
    				Else
    					R^.Next:=Q;
    				R:=Q;
    			End;
    	End;
    
    Procedure HienthiDanhsach(P: Contro);
    (*Thu tuc hien thi danh sach P ra man hinh*)
    Var P:Contro;
    Begin
    If P=Nil then
    Begin
    	Write(“Danh sach rong”);
    	Exit(1);
    End;
    		R:=P;
    		While R<>Nil do
    			Begin
    				Write(R^.Value:5);
    				R:=R^.Next;
    			End;
    	End;
    
    Function Min_DS (P: Contro): Integer;
    (*Ham tim so nho nhat trong danh sach*)
    Var
    	R: Contro; X: Integer;
    Begin
    	X:=P^.Value;
    R:=P^.Next;
    	While R<>Nil
    		Begin
    			If R^.Value < X then X:=R^.Value;
    			R:=R^.Next;
    		End;
    	Min_DS:=X;
    End;
    	
    Function Max_DS (P: Contro): Integer;
    (*Ham tim so lon nhat trong danh sach*)
    Var
    	R: Contro; X: Integer;
    Begin
    	X:=P^.Value;
    R:=P^.Next;
    	While R<>Nil
    		Begin
    			If R^.Value > X then X:=R^.Value;
    			R:=R^.Next;
    		End;
    	Max_DS:=X;
    End;
    	Procedure SoNhoNhat (P: Contro);
    		(*Thu tuc hien thi so nho nhat va danh sach dia chi cua cac so nho nhat*)
    		Var X: integer; R:Contro;
    		Begin
    			X:=Min_DS(P);
    			Writeln(“So nho nhat co trong danh sach: ”,X);
    			Writeln(“Vi tri:”);
    R:=P;
    			While R<>Nil do
    				Begin
    					If R^.Value = X then Writeln(R);
    					R:=R^.Next;
    				End;
    		End;
    
    	Procedure SoLonNhat (P: Contro);
    		(*Thu tuc hien thi so lon nhat va danh sach dia chi cua cac so lon nhat*)
    		Var X: integer; R:Contro;
    		Begin
    			X:=Max_DS(P);
    			Writeln(“So lon nhat co trong danh sach: ”,X);
    			Writeln(“Vi tri:”);
    R:=P;
    			While R<>Nil do
    				Begin
    					If R^.Value = X then Writeln(R);
    					R:=R^.Next;
    				End;
    		End;
    BEGIN
    	Writeln(“TAO DANH SACH LIEN KET DON”);
    TaoDanhsach(P);
    Writeln(“DANH SACH VUA TAO”);
    HienThiDanhsach(P);
    SoNhoNhat(P);
    SoLonNhat(P);
    
    Readln;
    END.
    Được sửa bởi hshason lúc 23:55 ngày 22-09-2011

  6. Thành viên Like bài viết này:


  7. #4
    Tham gia
    06-10-2010
    Bài viết
    24
    Like
    0
    Thanked 15 Times in 11 Posts
    Bài tập số 3

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Tạo một danh sách liên kết đơn n phần tử (n>0) chứa các số nguyên ngẫu nhiên. Xác định xem phần tử x nhập vào từ bàn phím có nằm trong danh sách hay không? Nếu có thì ở những vị trí nào? In ra các phần tử của danh sách.

    Bài tập số 4

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Tạo một danh sách liên kết đơn n phần tử (n>0) chứa các số nguyên ngẫu nhiên. Hãy in ra các phần tử của danh sách và cho biết giá trị của phần tử thứ k của danh sách là bao nhiêu ? Loại bỏ phần tử thứ k khi k=1.


    Bài tập số 5
    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Tạo một danh sách liên kết đơn n phần tử (n>0) chứa các số nguyên ngẫu nhiên. Hãy đếm xem trong danh sách có bao nhiêu số chẵn, bao nhiêu số lẻ, bao nhiêu số âm, bao nhiêu số dương? Hãy in ra màn hình lần lượt từng loại các phần tử tương ứng trên.
    - Hình như Write 1 xau phải là dấu nháy đơn thì phải, bạn đổi dấu nháy kép thành nháy đơn nhé
    - các hàm và thủ tục sau đây bạn nối thêm vào sau khác hàm và thủ tục ở trong bài mình post lần trước nhé

    Code:
    Function TimKiem (P: Contro; x: Integer): Contro;
    	{Ham thuc hien kiểm tra trong sanh sách P có chứa giá trị x hay không, kết quả trả về là địa chỉ nut chứa x}
    	Var R: Contro;
    	Begin
    		R:=P;
    		While (R^.Value <> x) and (R <> Nil) do
    			R:=R^.Next;
    		TimKiem:=R;
    	End;
    
    Function ViTri (P: Contro; k: Integer): Contro;
    	{Ham thuc hien tra lai dia chi cua nut tai vi tri thu k trong danh sach P}
    	Var R: Contro; i: integer;
    	Begin
    		R:=P;
    		i:=1;
    		While (i<k) and (R <> Nil) do
    			R:=R^.Next;
    			i:=i+1;
    		ViTri:=R;
    	End;
    
    Procedure Xoa (Var P: Contro; M: Contro);
    	{Thu tuc thuc hien loai bo nut M khoi danh sach P}
    	Var R: Contro;
    	Begin
    		If M=P then
    			P:=P^.Next;
    		else
    			Begin
    				R:=P;
    				While R^.Next<>M do R:=R^.Next;
    				R^.Next:=M^.Next;
    			end;
    		Dispose(M);
    	End;
    
    Procedure TimX (P: Contro);
    	{Thu tuc thu hien dua ra vi tri cua nut co gia tri bang x trong danh sach P, voi x nhap tu ban phim}
    	Var R: Contro; x: integer;
    	Begin
    		Write('Nhap gia tri can tim: ');
    		Readln(x);
    		R:=TimKiem(P,x);
    		If R<>Nil then
    			Begin
    				Writeln('Tim thay gia tri ',x,' trong danh sach. Tai cac vi tri:');
    				Writeln(R);
    				While R^.Next<>Nil do
    					Begin
    						{Ham TimKiem da thuc hien duyet danh sach, 
    						 khi ket thuc moi lan tim kiem con tro R se tro den 1 nut nao do trong danh sach, hoac het danh sach}
    						R:=TimKiem(R^.Next,x);
    						If R<>Nil then Writeln(R);
    					End;
    			end;
    		else
    			Writeln('Khong tim thay gia tri ',x,' trong danh sach.');
    	End;
    
    Function DemSoAm(P: Contro): Integer;
    	{Ham dem so am trong danh sach}
    	Var R: Contro; T: Integer;
    	Begin
    		T:=0;
    		R:=P;
    		While R<>Nil do
    			Begin
    				If R^.Value<0 then T:=T+1;
    				R:=R^.Next;
    			End;
    		DemSoAm:=T;
    	End;
    
    Function DemSoDuong(P: Contro): Integer;
    	{Ham dem so duong trong danh sach}
    	Var R: Contro; T: Integer;
    	Begin
    		T:=0;
    		R:=P;
    		While R<>Nil do
    			Begin
    				If R^.Value>0 then T:=T+1;
    				R:=R^.Next;
    			End;
    		DemSoDuong:=T;
    	End;
    
    Function DemSoChan(P: Contro): Integer;
    	{Ham dem so chan trong danh sach}
    	Var R: Contro; T: Integer;
    	Begin
    		T:=0;
    		R:=P;
    		While R<>Nil do
    			Begin
    				If (R^.Value mod 2 = 0) then T:=T+1;
    				R:=R^.Next;
    			End;
    		DemSoChan:=T;
    	End;
    
    Function DemSoLe(P: Contro): Integer;
    	{Ham dem so le trong danh sach}
    	Var R: Contro; T: Integer;
    	Begin
    		T:=0;
    		R:=P;
    		While R<>Nil do
    			Begin
    				If (R^.Value mod 2 = 1) then T:=T+1;
    				R:=R^.Next;
    			End;
    		DemSoLe:=T;
    	End;
    
    Procedure InSoAm(P: Contro);
    	{Thu tuc in so am trong danh sach}
    	Var R: Contro;
    	Begin
    		T:=0;
    		R:=P;
    		While R<>Nil do 
    			If R^.Value<0 then Write(R^.Value)
    		Writeln;
    	End;
    
    Procedure InSoDuong(P: Contro);
    	{Thu tuc in so duong trong danh sach}
    	Var R: Contro;
    	Begin
    		T:=0;
    		R:=P;
    		While R<>Nil do 
    			If R^.Value>0 then Write(R^.Value)
    		Writeln;
    	End;
    	
    Procedure InSoChan(P: Contro);
    	{Thu tuc in so chan trong danh sach}
    	Var R: Contro;
    	Begin
    		T:=0;
    		R:=P;
    		While R<>Nil do 
    			If (R^.Value mod 2 = 0) then Write(R^.Value)
    		Writeln;
    	End;
    	
    Procedure InSoLe(P: Contro);
    	{Thu tuc in so le trong danh sach}
    	Var R: Contro;
    	Begin
    		T:=0;
    		R:=P;
    		While R<>Nil do 
    			If (R^.Value mod 2 = 1) then Write(R^.Value)
    		Writeln;
    	End;
    
    Procedure TimNutThuK (P: Contro);
    	{Thu tuc tim nut thu k trong danh sach, va xoa nut dau tien neu k=1, voi k nhap tu ban phim}
    	Var k: integer; R:Contro;
    	Begin
    		Write('Nhap vi tri nut can xem: ');
    		Readln(k);
    		R:=ViTri(P,k);
    		If R=Nil then 
    			Write('Khong tim thay nut thu ',k);
    		else
    			Writeln('Gia tri cua nut thu ',k,'la ',R^.Value);
    		If k=1 then
    			Begin
    				Xoa(P,P);
    				Writeln('Danh sach sau khi xoa');
    				HienthiDanhsach(P);
    			End;
    	End;
    - Các lời gọi hàm, bạn thêm vào phía cuối của phần BEGIN chương trình chính nhé
    Code:
    TimX (P);
    TimNutThuK (P);
    Writeln('So luong so le co trong sanh sach: ',DemSoLe(P));
    Writeln('So luong so chan co trong sanh sach: ',DemSoChan(P));
    Writeln('So luong so am co trong sanh sach: ',DemSoAm(P));
    Writeln('So luong so duong co trong sanh sach: ',DemSoDuong(P));
    Write('So am: ');
    InSoAm(P);
    Write('So duong: ');
    InSoDuong(P);
    Write('So chan: ');
    InSoChan(P);
    Write('So le: ');
    InSoLe(P);
    - Để ngắn gọn: Với các loại bài toán liên quan đến số âm, dương, chẵn, Lẻ, Nguyên tố, Chính phương... Bạn có thể gộp chung, chỉ cần thêm tham số là thực hiện trên loại nào dữ liệu nào, vì nó chỉ khác nhau mỗi điều kiện thôi, bạn có thể dùng Case Of để làm điều đó. Mình tách ra mỗi loại một chương trình con để dễ hiểu

  8. Thành viên Like bài viết này:


  9. #5
    Tham gia
    12-07-2009
    Bài viết
    5
    Like
    0
    Thanked 3 Times in 3 Posts

    Vui lắm ! thanks

    Thanks bạn nhiều mình đang cần đang chờ bạn giải tiếp bài 6 -> 10 . Nhưng cho mình hỏi cái bài 1 và 2 có nhiều cách làm đúng khong mình khai báo min1,min2 và cho vào vòng lặp for để so sánh không biết có đúng không nhỉ ? Sớm trả lời mình nhá mà sao bài 1 mình chạy toàn lỗi vậy nói thật là mình không học về pascal nên không biết sửa thế nào nếu bạn giúp thì giúp cho chót đi fix lại giùm mình ?
    Được sửa bởi bbbb24 lúc 15:33 ngày 23-09-2011

  10. Thành viên Like bài viết này:


  11. #6
    Tham gia
    05-08-2010
    Bài viết
    313
    Like
    9
    Thanked 73 Times in 69 Posts
    Quote Được gửi bởi hshason View Post
    - Hình như Write 1 xau phải là dấu nháy đơn thì phải, bạn đổi dấu nháy kép thành nháy đơn nhé
    - các hàm và thủ tục sau đây bạn nối thêm vào sau khác hàm và thủ tục ở trong bài mình post lần trước nhé
    - Để ngắn gọn: Với các loại bài toán liên quan đến số âm, dương, chẵn, Lẻ, Nguyên tố, Chính phương... Bạn có thể gộp chung, chỉ cần thêm tham số là thực hiện trên loại nào dữ liệu nào, vì nó chỉ khác nhau mỗi điều kiện thôi, bạn có thể dùng Case Of để làm điều đó. Mình tách ra mỗi loại một chương trình con để dễ hiểu
    Bài của hshason n` lỗi quá. Đây là code mình sửa lại:
    Code:
    PROGRAM DANHSACH_NOIDON;
    uses crt;
    Type Contro = ^SoNguyen;
    	SoNguyen = Record
    		Value: Integer;
    		Next: Contro;
    	End;
    var  P:Contro;
    
    Procedure TaoDanhsach(Var P: Contro);
    	(*Thu tuc tao moi danh sach lien ket don chua cac so nguyen ngau nhien, so phan tu nhap tu ban phim*)
    	Var
    		Q,R: Contro;
    		I,n: Integer;
    	Begin
    		Write('Nhap co phan tu cua danh sach: ');
    		Readln(n);
    		P:=Nil;
    R:=P;
    		For i:=1 to n do
    			Begin
    				New(Q);
    				Q^.Value := Random(32767);
    				If P=Nil then P:=Q
                                  	Else R^.Next:=Q;
    				R:=Q;
    			End;
    	End;
    
    Procedure HienthiDanhsach(P: Contro);
    (*Thu tuc hien thi danh sach P ra man hinh*)
    var R:contro;
    Begin
    If P=Nil then
    Begin
    	Write('Danh sach rong');
    	Exit;
    End;
    		R:=P;
    		While R<>Nil do
    			Begin
    				Write(R^.Value,' ');
    				R:=R^.Next;
    			End;
                    writeln;
    	End;
    
    Function Min_DS (P: Contro): Integer;
    (*Ham tim so nho nhat trong danh sach*)
    Var
    	R: Contro; X: Integer;
    Begin
    	X:=P^.Value;
    R:=P^.Next;
    	While R<>Nil do
    		Begin
    			If R^.Value < X then X:=R^.Value;
    			R:=R^.Next;
    		End;
    	Min_DS:=X;
    End;
    
    Function Max_DS (P: Contro): Integer;
    (*Ham tim so lon nhat trong danh sach*)
    Var
    	R: Contro; X: Integer;
    Begin
    	X:=P^.Value;
    R:=P^.Next;
    	While R<>Nil do
    		Begin
    			If R^.Value > X then X:=R^.Value;
    			R:=R^.Next;
    		End;
    	Max_DS:=X;
    End;
    	Procedure SoNhoNhat (P: Contro);
    		(*Thu tuc hien thi so nho nhat va danh sach dia chi cua cac so nho nhat*)
    		Var X: integer; R:Contro;
    		Begin
    			X:=Min_DS(P);
    			Writeln('So nho nhat co trong danh sach: ',X);
    			Write('Vi tri:');
    R:=P;
    			While R<>Nil do
    				Begin
    					If R^.Value = X then Writeln(R^.Value);
    					R:=R^.Next;
    				End;
    		End;
    
    	Procedure SoLonNhat (P: Contro);
    		(*Thu tuc hien thi so lon nhat va danh sach dia chi cua cac so lon nhat*)
    		Var X: integer; R:Contro;
    		Begin
    			X:=Max_DS(P);
    			Writeln('So lon nhat co trong danh sach: ',X);
    			Write('Vi tri:');
    R:=P;
    			While R<>Nil do
    				Begin
    					If R^.Value = X then Writeln(R^.value);
    					R:=R^.Next;
    				End;
    		End;
    BEGIN
         clrscr;
         Writeln('TAO DANH SACH LIEN KET DON');
         TaoDanhsach(P);
         Writeln('DANH SACH VUA TAO');
         HienThiDanhsach(P);
         SoNhoNhat(P);
         SoLonNhat(P);
    
         Readln;
    END.

  12. Thành viên Like bài viết này:


  13. #7
    Tham gia
    05-08-2010
    Bài viết
    313
    Like
    9
    Thanked 73 Times in 69 Posts
    Quote Được gửi bởi bbbb24 View Post
    Nhưng cho mình hỏi cái bài 1 và 2 có nhiều cách làm đúng khong mình khai báo min1,min2 và cho vào vòng lặp for để so sánh không biết có đúng không nhỉ ?
    Đây là danh sách lk đơn, ko phải là mảng nên làm cách của hshason là được rồi.

  14. Thành viên Like bài viết này:


  15. #8
    Tham gia
    06-10-2010
    Bài viết
    24
    Like
    0
    Thanked 15 Times in 11 Posts
    Bài tập số 6

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Tạo một danh sách liên kết đơn gồm 20 phần tử là các số nguyên. Hãy chèn phần tử x nhập từ bàn phím vào vị trí thứ k (0<k<21) của danh sách. Hãy in các phần tử của danh sách trước và sau khi chèn.

    Bài tập số 7

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Sinh ngẫu nhiên một danh sách liên kết đơn chứa các số nguyên có thứ tự tăng. Hãy chèn số nguyên x được đọc vào từ bàn phím vào danh sách liên kết sao cho sau khi chèn vẫn đảm bảo thứ tự. Hãy in các phần tử của danh sách cả trước và sau khi chèn.

    Bài tập số 8

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Sinh ngẫu nhiên hai danh sách liên kết đơn chứa các số nguyên đều có thứ tự tăng. Hãy ghép hai danh sách liên kết đơn này thành một danh sách liên kết cũng có thứ tự tăng. Hãy in các phần tử của cả ba danh sách trên.

    Bài tập số 9

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Tạo một danh sách liên kết đơn gồm 20 phần tử là các số nguyên. Hãy xoá phần tử thứ k (0<k<21) của danh sách. Hãy in các phần tử của danh sách trước và sau khi xoá.

    Bài tập số 10

    Dùng ngôn ngữ lập trình Pascal để thực hiện công việc sau:
    Sinh ngẫu nhiên một danh sách liên kết đơn chứa n (0<n<100) các số nguyên. Hãy xoá đi k (k>0) phần tử liên tiếp của danh sách liên kết kể từ vị trí thứ i (1<i<50) của danh sách. In ra các phần tử của danh sách trước và sau khi xoá.
    - Thêm các hàm và thủ tục sau vào chương trình
    Code:
    	
    Procedure Chen (Var P: Contro; M: Contro; Q: Contro);
    	{Thu tuc thuc hien chen nut Q vao truoc nut M dang tro toi trong danh sach P}
    	Var R: Contro;
    	Begin
    		{Tim nut truoc M}
    		R:=P;
    		While R^.Next <> M do R:=R^.Next;
    		Q^.Next:=M;
    		If M=P then
    			P:=Q
    		else
    			R^.Next:=Q;
    	End;
    
    Procedure ChenX (Var P:Contro)
    	{Thu tuc thuc hien chen 1 nut moi, co thong tin la X vao vi tri k trong danh sach P}
    	Var R,Q: Contro;
    		k,i: Integer;
    	Begin
    		New(Q);
    		Write('Nhap gia tri can chen: ');
    		Readln(Q^.Value);
    		Write('Nhap vi tri can chen: ');
    		Readln(k);
    		{Tim nut thu k, dung chon tro R duyet danh sach}
    		R:=P;
    		i:=1;
    		While (i<k) and (R<>Nil) do R:=R^.Next;
    		{i=k: Tim thay nut k}
    		if i=k then
    			Chen(P,R,Q);
    		else
    			Writeln('Danh sach khong co nut thu ',k);
    	End;
    
    Procedure TaoDsNgauNhienTangDan(Var P: Contro);
    	{Thu tuc thuc hien sinh ngau nhien 1 danh sach so nguyen theo thu tu tang dan.}
    	{Co su dung thu tuc Chen(P,M,Q) da xay dung}
    	Var R,Q: Contro; i: integer;
    	Begin
    		{Sinh 10 phan tu thoi nhe}
    		P:=Nil;
    		For i:=1 to 10 do
    			Begin
    				New(Q);
    				Q^.Value:=Random(32767);
    				If P=Nil then P:=Q;
    				else
    					Begin
    						{Tim vi tri de chen}
    						R:=P;
    						While (R^.Value < Q.Value) and (R<>Nil) do 
    							Begin
    								{M la vi tri can chen de giu nguyen tinh sap xep}
    								M:=R;
    								R:=R^.Next;
    							End;
    						Chen(P,M,Q);
    					End;
    			End;
    	End;
    
    Procedure ChenSapxep(Var P: Contro);
    	{Thu tuc thuc hien chen nut moi vao trong danh sach da sap xep theo thu tu tang dan}
    	{Sau khi chen danh sach van giu nguyen thu tu tang}
    	Var R,M,Q: Contro;
    	Begin
    		Write('Nhapp gia tri can chen: ');
    		Readln(Q^.Value);
    		{Tim Vi tri chen}
    		R:=P;
    		While (R^.Value < Q.Value) and (R<>Nil) do
    			Begin
    				{M la vi tri can chen de giu nguyen tinh sap xep}
    				M:=R;
    				R:=R^.Next;
    			End;
    		Chen(P,M,Q);
    	End;
    
    Procedure ChenCuoi(Var P: Contro; Var M: Contro; Q: Contro);
    	{Thu tuc thuc hien chen nut Q vao cuoi danh sach P, co M luon tro toi nut cuoi cung trong danh sach}
    	Begin
    		If P=Nil then
    			P:=Q;
    		else
    			M^.Next:=Q;
    		M:=Q;
    	End;
    Procedure GhepDsSapxep(Var R: Contro; P:Contro; Q: Contro);
    	{Thu tuc thuc hien ghep 2 danh sach P,Q da duoc sap xep tang dan}
    	{Danh sach ket qua do R quan ly va van giu nguyen tinh sap xep}
    	Var P1,Q1,M: Contro;
    	Begin
    		R:=Nil; M:=Nil;
    		P1:=P; Q1:=Q;
    		While (P1<>Nil) and (Q1<>Nil) do
    			If P1.Value < Q^.Value then
    				Begin
    					ChenCuoi(R,M,P1);
    					P1:=P1^.Next;
    				End;
    			else
    				Begin
    					ChenCuoi(R,M,Q1);
    					Q1:=Q1^.Next;
    				End;
    		{Neu P1<>Nil: Danh sach P chua het}
    		While P1<>Nil do
    			Begin
    				ChenCuoi(R,M,P1);
    				P1:=P1^.Next;
    			end;
    		{Neu Q1<>Nil: Danh sach Q chua het}
    		While Q1<>Nil do
    			Begin
    				ChenCuoi(R,M,Q1);
    				Q1:=Q1^.Next;
    			end;
    	End;
    
    Procedure XoaViTri(Var P: Contro)
    	{Thu tuc xoa phan tu thu k trong danh sach, voi k nhap tu ban phim 0<k<21}
    	{Co su dung thu tuc Xoa(P,M) da xay dung}
    	Var R: Contro; k: integer;
    	Begin
    		Repeat
    			Write('Nhap vi tri can xoa: ');
    			Readln(k);
    			If (k<=0) or (k>20) then
    				Writeln('So K phai nam trong khoang (0<k<21)');
    		Until (k>0) and (k<21);
    		{Timm nut thu k}
    		R:=P;
    		i:=1;
    		While (i<k) and (R^.Next<>Nil) do
    			Begin
    				R:=R^.Next;
    				i:=i+1;
    			end;
    		If i=k then Xoa(P,M);
    	end;
    
    Procedure XoaLienTiep(Var P: Contro);
    	{Thu tuc thuc hien xoa lien tiep n phan tu trong danh sach tu vi tri thu i}
    	{Co su dung thu tuc Xoa(P,M) da xay dung}
    	Var R: Contro; i,j,k: Integer;
    	Begin
    		Write('Nhap so luong phan tu can xoa: ');
    		Readln(k);
    		Repeat
    			Write('Nhap vi tri bat dau xoa: ');
    			Readln(i);
    			If (i<=0) or (i>20) then
    				Writeln('So i phai nam trong khoang (0<i<21)');
    		Until (i>0) and (i<21);
    		{Tim nut thu i}
    		R:=P; j:=1;
    		While (j<i) and (R^.Next<>Nil) do
    			Begin
    				j:=j+1;
    				R:=R^.Next;
    			End;
    		{Xoa}
    		While (k>0) and (R<>Nil) do
    			Begin
    				Xoa(P,R);
    				k:=k-1;
    				R:=R^.Next;
    			End;
    	End;
    - Phần này nối thêm vào thân chương trình chính
    - Khai báo thêm con trỏ Q và R ở chỗ khai báo P lúc đầu tiên
    Code:
    {Bai 6: Tao danh sach ban tu lam nhe}
    Writeln('Danh sach truoc khi chen:');
    HienthiDanhsach(P);
    ChenX(p);
    Writeln('Danh sach sau khi chen:');
    HienthiDanhsach(P);
    
    {Bai 7: }
    TaoDsNgauNhienTangDan(Q);
    Writeln('Danh sach so nguyen ngau nhien tang dan:');
    HienthiDanhsach(Q);
    ChenSapxep(Q);
    Writeln('Danh sach sau khi chen:');
    HienthiDanhsach(Q);
    
    {Bai8: }
    TaoDsNgauNhienTangDan(Q);
    TaoDsNgauNhienTangDan(P);
    GhepDsSapxep(R,P,Q);
    Writeln('Danh sach 1:');
    HienthiDanhsach(P);
    Writeln('Danh sach 2:');
    HienthiDanhsach(Q);
    Writeln('Danh sach 3: sau khi ghep:');
    HienthiDanhsach(R);
    
    {Bai 9: Tao danh sach nhu bai 6, gia su da co danh P, su dung luon nhe}
    Writeln('Danh sach truoc khi xoa:');
    HienthiDanhsach(P);
    XoaViTri(P);
    Writeln('Danh sach sau khi xoa:');
    HienthiDanhsach(P);
    {Bai 10: Tao danh sach co gioi han so phan tu ban tu lam nhe, su dung luon danh sach P da co}
    XoaLienTiep(P);
    - Với những gì mình đã Post lên cho bạn, mình đã cố gắng để chương trình đơn giản ở mức tối đa. Còn có những cách khác có thể làm chương trình ngắn hơn và chạy nhanh hơn, nhưng sẽ khó hiểu cho những bạn mới làm quen với kiểu dữ liệu con trỏ này.
    - Cũng sẽ có những lỗi dấu chấm dấu phảy, khai báo thiếu biến, các bạn tự sửa nha. Vì cũng ko có Pascal để test

  16. Thành viên Like bài viết này:


  17. #9
    Tham gia
    12-07-2009
    Bài viết
    5
    Like
    0
    Thanked 3 Times in 3 Posts
    Cám ơn các bạn đã trả lời giúp mình nhưng hình như chương trình chạy chưa đúng thì phải, theo mình thì mỗi lần chạy thì tạo ra 1 chuỗi ngẫu nhiên nhưng mình nhập 6 thì chỉ in ra 6 số đó mặc dù lần sau mình đã thay bằng số 4,5... nhưng vẫn ra 6 số các bạn xem lại giúp mình nhá

  18. Thành viên Like bài viết này:


  19. #10
    Tham gia
    15-03-2017
    Bài viết
    3
    Like
    1
    Thanked 0 Times in 0 Posts
    bạn có thể giúp mình bài này đc k?
    sử dụng dữ liệu con trỏ để cài đặt danh sách móc nối gồm n phần tủ là số nguyên
    1. tìm kiếm phần tử x có trong danh sách không bằng thuật toán tìm kiếm nhị phân
    2.sắp xép danh sách theo thứ tự tăng (giảm) bằng thuật toán nổi bọt, phân đoạn, chèn, chọn.
    mong bạn giúp đỡ mình với mình cảm ơn nhé

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
  •