Trang chủTrang chủ
  Tin mớiTin mới  Xem danh sách thành viênDanh sách thành viên  T́m chuyên mụcT́m kiếm
  Đăng kưĐăng kư  Đăng nhậpĐăng nhập
Cấu trúc dữ liệu
 Diễn Đàn Trường Đại Học Marketing : Cấu trúc dữ liệu
Tiêu đề Mục: Rối Loạn Dữ Liệu Khi Sắp Xếp Trả lờiGửi bài mới
Người gửi
Nội dung << Mục trước | Tiếp >>
truonglam
Newbie
Newbie

Sinh viên 06DTH-DTK

Tham gia: 03/01/2007
Tình trạng online: Offline
Lần gửi: 8
Gửi lên: 25/02/2008 10:33am | IP Logged Trích dẫn truonglam

Đây là bài gửi thư của ḿnh. Mong Thầy và các bạn giúp đỡ

Program GUITHU;        {gui thu 1 nguoi chi duoc gui 1 buc thu}
Uses WinCRT;
Const N=100;
    TENNUOC: array [1..3] of String=('My','Phap','Nhat');
    {Mang chua gia tien gui thu, theo tung nuoc va theo khoi luong buc thu}
    B1: array [1..3] of integer=(6000,5000,4000);
    B2:array [1..3] of integer=(500,400,300);
    B3:array [1..3] of integer=(400,300,200);
Type THU=record
         Name:string[40];{ten khach hang}
         NUOC:integer;   {ten nuoc}
         TLUONG:real;    {trong luong buc thu}
         GTIEN:longint;  {gia tien gui thu}
         end;
Var
  TIEP,CHON:Char;
  SOKHACH,i,j:integer;
  {Mang chua du lieu cua tung buc thu}
  DATA:array [1..N] of THU;
{ thu tuc nhap du lieu vao chuong trinh}
Procedure NhapDL(k:integer);
  Begin
    Writeln('Ban la khach hang thu ',i);
    Write('Nhap ten khach hang: ');readln(DATA[k].Name);
   Repeat
    Write('Nuoc muon gui thu Anh/Phap/My-1/2/3: ');
    readln(DATA[k].NUOC);
   Until ((DATA[k].NUOC>=1) and (DATA[k].NUOC<=3));
    Write('Nhap trong luong buc thu: ');readln(DATA[k].TLUONG);
  End;
{thu tuc xu ly }
Function XULY(k:integer):integer;
 Var TAM:integer;
 Begin
  If DATA[k].TLUONG<=10 then TAM:=B1[DATA[k].NUOC]
   else if ((DATA[k].TLUONG>10) and (DATA[k].TLUONG<=20)) then TAM:=B2[DATA[k].NUOC]
    else TAM:=B3[DATA[k].NUOC];
  XULY:=TAM;
 End;
 {thu tuc trao}
 Procedure Swap(Var X,Y:THU);
  Var TAM:THU;
  Begin
   X:=TAM;
   X:=Y;
   Y:=TAM;
  end;
 { thu tuc sap xep theo thanh tien tang dan}
 {Cach Sap Xep noi bot}
 Procedure SAPXEP(SKHACH:integer);
  Var k,l:integer;
  Begin
   For k:=1 to SKHACH-1 do
    For l:=SKHACH downto k+1 do
     if DATA.GTIEN<DATA[l-1].GTIEN then Swap(DATA,DATA[l-1]);
  end;
 {Ham dem so thu o tung quoc gia}
 Function DEMTHU(TNUOC:integer):integer;
  Var
   DEM:integer;
  Begin
   If TNUOC=1 then DEM=DEM+1
 { thu tuc in thu }
 Procedure InDS(k:integer);
  Begin
   Writeln('*****Hoa Don*****');
   Writeln('Ho va ten khach hang: ',DATA[k].Name);
   Writeln('Nuoc gui thu: ',TENNUOC[DATA[k].NUOC]);
   Writeln('Trong luong buc thu: ',DATA[k].TLUONG:10:2);
   Writeln('Thanh Tien: ',DATA[k].GTIEN);
   Writeln('**********');
  End;

{ Main Program }
Begin
 Repeat
  Write('Nhap so khach hang muon gui thu: ');
  Readln(SOKHACH);
   For i:=1 to SOKHACH do
    Begin
     { goi thu tuc nhap du lieu }
     NhapDL(i);
     {goi thu tuc xu ly}
     DATA.GTIEN:=XULY(i);
    End;
   {goi thu tuc xuat du lieu}
   clrscr;
   For i:=1 to SOKHACH do  InDS(i);
  Write('Ban co muon lam tiep khong (Co/Khong)?');
  Readln(TIEP);
 Until Upcase(TIEP)='K';
 Write('Ban co muon sap xep du lieu khong?(co/khong) ');
 readln(CHON);
  if Upcase(CHON)='C' then
    Begin
     { goi thu tuc sap xep du lieu}
     SAPXEP(SOKHACH);
     Writeln('Nhan phim bat ky de in ra danh sach');
     Readkey;
     clrscr;
     {goi thu tuc in danh sach}
     For i:=1 to SOKHACH do
       InDS(i);
    End
   else Writeln('Xin cam on va hen gap lai!');
End.

** Sau khi tiến hành sắp xếp, dữ liệu xuất ra bị rất lạ.
Quay về đầu Xem truonglam's Thông tin cá nhân T́m bài khác bởi truonglam
 
Phi Vu
Senior Member
Senior Member
Biểu trưng riêng
Sinh vien Dh HTTTKT K1

Tham gia: 20/05/2005
Quốc gia: Vietnam
Tình trạng online: Offline
Lần gửi: 127
Gửi lên: 26/02/2008 10:17am | IP Logged Trích dẫn Phi Vu

==> Đọc sơ qua đoạn code cua bạn, tôi nhận thấy có vài thắc mắc sau :

1. pro SWAP(Var X,Y:THU) ... Liệu 2 biến X,Y có thay đổi giá trị cho nhau ??? Đối với pro hay func th́ để thay đối giá trị của biến đưa vào, người ta hay dùng dấu "&"trước biến đó (trong C hay C++ ...lâu quá rồi nên ḿnh quên Pascal ...) ... Nếu SWAP sai --> SAPXEP sai
2. Nếu SWAP đă đúng th́ có lẽ bạn sẽ sai ngay ḍng lệnh này ...
For i:=1 to SOKHACH do
    Begin
     { goi thu tuc nhap du lieu }
     NhapDL(i);
     {goi thu tuc xu ly}
     DATA
.GTIEN:=XULY(i);
    End;
==> Biến i ở đây là ǵ? nó chỉ có thứ tự từ 1->SoKhach, chứ đâu phải là sự lựa chọn việc gửi lá thư đi nước nào đâu (Anh-Mỹ-Pháp). V́ vậy chắc chắn là dữ liệu xuất ra bị sai rồi ...



__________________
Vọc là cách tốt nhất để hiểu được 2 chữ ..."Tại sao ?"
Quay về đầu Xem Phi Vu's Thông tin cá nhân T́m bài khác bởi Phi Vu
 
truonglam
Newbie
Newbie

Sinh viên 06DTH-DTK

Tham gia: 03/01/2007
Tình trạng online: Offline
Lần gửi: 8
Gửi lên: 26/02/2008 1:44pm | IP Logged Trích dẫn truonglam

Anh ơi trong Passcal Var tương tự như "&".
C̣n i đó là ṿng lặp chứ đâu phải i là đại diện cho nước chọn gủi thư đâu anh.
Vd:
i=1 . Tức là người khách thứ nhất.
Nó sẽ yêu cầu nhập thông tin liên quan rồi đưa vào lưu trữ trong mảng DATA.
Mong anh xem lại giùm em.

Quay về đầu Xem truonglam's Thông tin cá nhân T́m bài khác bởi truonglam
 
Phi Vu
Senior Member
Senior Member
Biểu trưng riêng
Sinh vien Dh HTTTKT K1

Tham gia: 20/05/2005
Quốc gia: Vietnam
Tình trạng online: Offline
Lần gửi: 127
Gửi lên: 27/02/2008 10:26pm | IP Logged Trích dẫn Phi Vu

--> DATA.GTIEN:=XULY(i); ???
DATA la mot mang phan tu THU, vay DATA.GIATIEN la cua THU nao ??? XULY(i) cho KH thu i, vay cau lenh hinh nhu co van de ...???


__________________
Vọc là cách tốt nhất để hiểu được 2 chữ ..."Tại sao ?"
Quay về đầu Xem Phi Vu's Thông tin cá nhân T́m bài khác bởi Phi Vu
 
dinhngan
Admin Group
Admin Group

Giảng Viên

Tham gia: 08/05/2005
Quốc gia: Vietnam
Tình trạng online: Offline
Lần gửi: 378
Gửi lên: 28/02/2008 7:05am | IP Logged Trích dẫn dinhngan

Chào em.

Bài này "rối loạn" khi sắp xếp là do tổ chức dữ liệu ..."rối loạn", phức tạp và không hiệu quả. Các bạn cần chú ư những điểm sau:

  1. Trong một biểu thức (Expression), nếu có một toán hạng (Operand) mang kiểu số thực th́ tất cả đều phải chuyển qua kiểu số thực, ở dây bạn dùng Integer và Real lẫn lộn sẽ cho kết quả không chính xác.
  2. Trong Pascal có toán tử "&" dùng với con trỏ (Pointer), phần này các bạn không học v́ không cần thiết (học con trỏ trên C là đủ).
  3. Hàm (Function) để xử lư một thuộc tính (Property) của đối tượng (Object) như: xếp loại, tính ĐTB, tính thuế,... ở đây băn đă dùng hàm để xử lư cả một phần tử (Element).
  4. Do đang công tác ở nước ngoài, không có th́ giờ nhiều nên tôi Post bài sau, các bạn theo đó mà tham khảo và sửa lại.

Program Tinh_diem;
Uses CRT;
Const  Max = 50;
       HSP = 4 ; HSTHCB = 3 ; HSTCC = 4;
Type
       String30 = String[30];
       Sinhvien = Record
                      Masv  : String[5];
                      Hoten,LoaiHT : String[30];
                      Pascal,THCB,TCC,DTB : Real;
                   End;
       MangSV = Array[1..Max] Of Sinhvien;
Var
      SV   : MangSV;
      SoSV : Byte;
      Tiep : Char;
      {Thu tuc dinh vi Cursor}
       Procedure WriteXY(X,Y:Byte;Chuoi:String);
          Begin
              GotoXY(X,Y);
              Write(Chuoi);
          End;

      {Thu tuc in tieu de}
       Procedure Tieude;
          Begin
               Clrscr;
               TextColor(LightCyan);
               WriteXY(20,1,'  TRUONG DAI HOC MARKETING');
               WriteXY(20,2,'    KHOA TIN HOC QUAN LY');
               TextColor(White);
               WriteXY(20,3,'       &nbs p; ********');
               TextColor(LightGreen);
               WriteXY(20,4,'CHUONG TRINH TINH DIEM HOC KY');
               TextColor(White);
         End;

      {Ham tinh diem trung binh}
       Function Tinhdiem(D1,D2,D3,HS1,HS2,HS3:Real):Real;
         Var
             Tongdiem,Tongheso : Real;
         Begin
             Tongdiem := (D1*HS1)+(D2*HS2)+(D3*HS3);
             Tongheso := HS1 + HS2 + HS3;
             Tinhdiem := Tongdiem / Tongheso;
         End;

      {Ham xep loai hoc tap}
       Function Xeploai(Diem : Real):String30;
         Var
              Loai : String30;
         Begin
              If Diem>=9 Then Loai :='Gioi'
              Else If Diem>=7 Then Loai := 'Kha'
                   Else If Diem >=6 Then Loai :='TB kha'
                         Else If Diem>=5 Then Loai := 'Trung binh'
                              Else If Diem>=4 Then Loai := 'Yeu'
                                    Else Loai :='Kem';
               Xeploai := Loai;
        End;

      {Thu tuc hoan vi 2 Records}
       Procedure Hoanvi(Var A,B:Sinhvien);
         Var
               Temp : Sinhvien;
         Begin
               Temp := A;
               A := B;
               B := Temp;
         End;

      {Thu tuc Sap xep thu tu theo diem trung binh}
       Procedure BubbleSort(Var A:MangSV;N:Byte);
          Var
              i,j:Byte;
          Begin
              For i:=2 To N Do
                  For j:=N Downto i Do
                      If A[j-1].DTB>A.DTB Then Hoanvi(A[j-1],A[j]);
          End;

      {Thu tuc nhap so lieu cho tung sinh vien}
       Procedure Nhap(Var A:Sinhvien);
         Begin
             With A Do
                Begin
                  GotoXY(10,10);
                     Write('Ma sinh vien : ');Readln(Masv);
                  GotoXY(10,11);
                     Write('Ho ten sinh vien : ');Readln(Hoten);
                  GotoXY(10,12);
                     Write('Diem Pascal          : ');Readln(Pascal);
                  GotoXY(10,13);
                     Write('Diem Tin hoc can ban : ');Readln(THCB);
                  GotoXY(10,14);
                     Write('Diem Toan cao cap    : ');Readln(TCC);
                  {Xu ly diem va xep loai hoc tap}
                   DTB := Tinhdiem(Pascal,THCB,TCC,HSP,HSTHCB,HSTCC);
                   LoaiHT := Xeploai(DTB);
                End;
         End;

       {Thu tuc nhap du lieu}
        Procedure NhapDL(Var A:MangSV;Var N:Byte);
           Var
              i : Byte;
           Begin
               Tieude;
               WriteXY(10,6,'Nhap bao nhieu sinh vien ? ');Readln(N);
               For i:=1 To N Do
                   Begin
                      Tieude;
                      GotoXY(10,6);
                      Write('Nhap so lieu cho sinh vien thu : ',i:2);
                      Nhap(A);
                   End;
           End;

      {Thu tuc xuat ket qua}
       Procedure XuatKQ(A:MangSV;N:Byte);
         Var
           i,Hang:Byte;
         Begin
           Tieude;
           TextColor(Yellow);
           WriteXY(5,6,'=============================================== =====================');
           WriteXY(5,7,' STT  MASV    HO TEN SV     PASCAL    THCB   TCC   DTB     XEPLOAI');
           WriteXY(5,8,'=============================================== =====================');
           TextColor(White);
                         {56789012345678901234567890123456789012345678901234567890123 456789012345678
                               1         2         3         4         5         6         7    }
           Hang := 9;
           For i:=1 To N Do
                Begin
                   GotoXY(07,Hang); Write(i:2);
                   GotoXY(11,Hang); Write(A.Masv);
                   GotoXY(18,Hang); Write(A.Hoten);
                   GotoXY(34,Hang); Write(A.Pascal:5:2);
                   GotoXY(44,Hang); Write(A.THCB:5:2);
                   GotoXY(50,Hang); Write(A.TCC:5:2);
                   GotoXY(57,Hang); Write(A.DTB:5:2);
                   GotoXY(63,Hang); Write(A.LoaiHT);
                   Inc(Hang);
               End;
           Readln;
     End;
{Chuong trinh chinh}
BEGIN
    NhapDL(SV,SoSV);
    BubbleSort(SV,SoSV);
    XuatKQ(SV,SoSV);
END.

Chúc các bạn đạt kết quả tốt.

Quay về đầu Xem dinhngan's Thông tin cá nhân T́m bài khác bởi dinhngan
 

Nếu muốn trả lời mục này trước tiên phải đăng nhập
Nếu chưa đăng kư, trước tiên phải đăng kư

  Trả lờiGửi bài mới
In bài In bài

Chuyển chuyên mục
Bạn không thể gửi bài mới trong chuyên mục này
Bạn không thể trả lời bài viết trong chuyên mục này
Bạn không thể xoá bài viết trong chuyên mục này
Bạn không thể sửa bài viên trong chuyên mục này
Bạn không thể tạo mục b́nh bầu trong chuyên mục này
Bạn không thể b́nh bầu trong chuyên mục này

Copyright ©2001 Web Wiz Guide

Trang web được load trong 0.3594 giây.