Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: so sánh điểm sv bằng quicksort

  1. #1
    Ngày gia nhập
    05 2009
    Bài viết
    6

    Mặc định so sánh điểm sv bằng quicksort

    Mình có bài quản lý có bị lỗi . Mong các bạn sử giúp
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>

    typedef struct {
    char MSSV[5], hoten[30];
    int diem;
    } SV;
    void swap(SV a, SV b)
    {
    SV c=a;
    a=b;
    b=c;
    }
    void nhapSV(SV a[], int n)
    {
    int i;
    char x[5];
    printf("Nhap si so sv: ");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
    printf("\nMa so SV: ");
    //int flushall();
    cin.getline(x,5,'.');
    strcpy(a[i].MSSV, x);
    printf("\nHoten SV: ");
    cin.getline(a[i].hoten,30,'.');
    printf("\nDiem SV: ");
    scanf("%d",&a[i].diem);
    }
    }
    void inSV(SV a[], int n)
    {
    int i;
    for (i=0; i<n; i++)
    printf("\n%6s %30s %4d", a[i].MSSV, a[i].hoten, a[i].diem);
    }
    void sapxep(SV a[], int l, int r)
    {
    char *x;
    int i, j;
    i=l;
    j=r;
    x=a[(l+r)/2].MSSV;
    do
    {
    while((a[i].MSSV)<x)i++;
    while((a[j].MSSV)>x)j--;
    if(i<=j)
    {
    swap(a[i],a[j]);
    i++;
    j--;
    }
    }while(i<=j);
    if(l<j)sapxep(a, l , j );
    if(i<r)sapxep(a, i , r );
    }
    void sapxep1(SV a[], int n)
    {
    sapxep(a, 0, n-1 );
    }
    main()
    {
    SV a[100];
    int n=0;
    int l, r;
    nhapSV(a, n);
    printf("\nDanh sach ban dau: ");
    inSV(a, n);
    sapxep1(a, n);
    printf("\n\nDanh sach sau khi sap xep: ");
    inSV(a, n);
    getch();
    }

  2. #2
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Cụ thể bạn bị lỗi gì ? .
    Bạn cùng trình biên dịch nào thế ?
    Mình vừa debug xong sau khi thêm iostream thì nó success

    Cơ mà lần sau bạn viết code lại cho nó đàng hoàng chứ nhìn vào như này đọc lòi con mắt cả ra :((

    -----------
    Cái lỗi đầu tiên là ở hàm Nhập bạn định nghĩa tham số n là tham trị. Làm nó trở thành 1 thắng CỨNG ĐẦU , bạn cố đưa nó vào hàm để "đào tạo" . Okey, nó vẫn dc "dạy dỗ" ở trong hàm. Nhưng khi out hàm, nó trở về bản chất CỨNG ĐẦU ). Tính cách vẫn như cũ. .
    Do đó các hàm sau lúc nhận NÓ vào, thấy "cứng đầu" quá. ko chịu dc nên hàm chả thực hiện dc việc gì
    Khắc phục = cách:
    Truyền nó = tham chiếu đi nhé void nhapSV(SV a[],int &n) .
    Làm như này khiến thằng n này trở nên "dễ bảo" hơn . Lúc thoát khỏi hàm (trường giáo dưỡng) thì nó đã trở thành người tốt
    -----------
    Cái lỗi thứ 2 cũng ở hàm NhapSV luôn.
    Thay thủ tục cin.getline = thủ tục gets(a[i].MSSV) và gets(a[i].hoten) .
    Trước mỗi thủ tục gets bổ sung thêm thủ tục fflush(stdin); để xóa đệm
    Mình ko biết ở complier ở của bạn thì quá trình Nhập nó có dc thông suốt ko chứ mình debug thì nó ko getline dc các dòng Họ tên.
    -----------
    Lỗi thứ 3 ở Hàm sapxep . debug thấy cái hàm đó chả làm dc cái gì cả
    Cụ thể
    C++ Code:
    1. void sapxep(SV a[], int l, int r)
    2. {
    3.      char *x;
    4.      int i, j;
    5.      i=l;
    6.      j=r;
    7.      x=a[(l+r)/2].MSSV;
    8.      do
    9.     {
    10.          while((a[i].MSSV)<x)i++;   // So sánh địa chỉ 2 con trỏ với nhau là như nào ?
    11.          while((a[j].MSSV)>x)j--;   // Để so sánh 2 chuỗi thì dùng strcmp hoặc strcmpi chứ
    12.          // Sửa lại 2 dòng thành như này
    13.          while(strcmp(a[i].MSSV,x)==-1)
    14.               i++;
    15.          while(strcmp(a[j].MSSV,x)==1)
    16.               j--;
    17.  ....
    -------------
    Lỗi thứ 4 : Ở hàm swap . Bạn cũng truyền a b theo tham trị cho nên a b rất cứng đầu. Lúc thoát ra khỏi hàm nó chả thay đổi bản chất xấu xa gì cả .
    Bạn cũng phải định nghĩa nó thành tham chiếu &a,&b
    Cách khác là bạn cũng có thể truyền theo trị. Nhưng ở swap bạn hoán đổi cái nội dung bên trong của chúng.
    Swap ko dc là nguyên nhân làm ko thể sort .
    -----------------------------------------------------
    Tâm sự:
    Bạn nên nắm vững những thứ cơ bản khi viết hàm đã . Cụ thể là truyền tham trị, tham biến, tham chiếu .
    So sánh 2 chuỗi thì dùng thủ tục gì .
    Nên nắm vững mấy cái đó trước khi bắt tay vào Sort , nhất là cái sort tiên tiến như Quicksort
    Chúc vui !
    Đã được chỉnh sửa lần cuối bởi clchicken : 17-10-2011 lúc 04:23 PM.

  3. #3
    Ngày gia nhập
    01 2011
    Nơi ở
    \WINDOWS\Assembly\
    Bài viết
    54

    Trích dẫn Nguyên bản được gửi bởi Lindan Xem bài viết
    Mình có bài quản lý có bị lỗi . Mong các bạn sử giúp
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>

    typedef struct {
    char MSSV[5], hoten[30];
    int diem;
    } SV;
    void swap(SV a, SV b)
    {
    SV c=a;
    a=b;
    b=c;
    }
    void nhapSV(SV a[], int n)
    {
    int i;
    char x[5];
    printf("Nhap si so sv: ");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
    printf("\nMa so SV: ");
    //int flushall();
    cin.getline(x,5,'.');
    strcpy(a[i].MSSV, x);
    printf("\nHoten SV: ");
    cin.getline(a[i].hoten,30,'.');
    printf("\nDiem SV: ");
    scanf("%d",&a[i].diem);
    }
    }
    void inSV(SV a[], int n)
    {
    int i;
    for (i=0; i<n; i++)
    printf("\n%6s %30s %4d", a[i].MSSV, a[i].hoten, a[i].diem);
    }
    void sapxep(SV a[], int l, int r)
    {
    char *x;
    int i, j;
    i=l;
    j=r;
    x=a[(l+r)/2].MSSV;
    do
    {
    while((a[i].MSSV)<x)i++;
    while((a[j].MSSV)>x)j--;
    if(i<=j)
    {
    swap(a[i],a[j]);
    i++;
    j--;
    }
    }while(i<=j);
    if(l<j)sapxep(a, l , j );
    if(i<r)sapxep(a, i , r );
    }
    void sapxep1(SV a[], int n)
    {
    sapxep(a, 0, n-1 );
    }
    main()
    {
    SV a[100];
    int n=0;
    int l, r;
    nhapSV(a, n);
    printf("\nDanh sach ban dau: ");
    inSV(a, n);
    sapxep1(a, n);
    printf("\n\nDanh sach sau khi sap xep: ");
    inSV(a, n);
    getch();
    }
    Bạn phải nói cụ thế nó bị lỗi gì chứ.

  4. #4
    Ngày gia nhập
    11 2010
    Nơi ở
    hell
    Bài viết
    165

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    #include <iostream>
    using namespace std ;
    #pragma warning(disable:4996)
    typedef struct {
    char MSSV[5], hoten[30];
    int diem;
    } SV;
    void swap(SV a, SV b)
    {
    SV c=a;
    a=b;
    b=c;
    }
    void nhapSV(SV a[], int n)
    {
    int i;
    char x[5];
    printf("Nhap si so sv: ");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
    printf("\nMa so SV: ");
    //int flushall();
    cin.getline(x,5,'.');
    strcpy(a[i].MSSV, x);
    printf("\nHoten SV: ");
    cin.getline(a[i].hoten,30,'.');
    printf("\nDiem SV: ");
    scanf("%d",&a[i].diem);
    }
    }
    void inSV(SV a[], int n)
    {
    int i;
    for (i=0; i<n; i++)
    printf("\n%6s %30s %4d", a[i].MSSV, a[i].hoten, a[i].diem);
    }
    void sapxep(SV a[], int l, int r)
    {
    char *x;
    int i, j;
    i=l; 
    j=r; 
    x=a[(l+r)/2].MSSV;
    do
    {
    while((a[i].MSSV)<x)i++;
    while((a[j].MSSV)>x)j--;
    if(i<=j)
    {
    swap(a[i],a[j]);
    i++;
    j--;
    }
    }while(i<=j);
    if(l<j)sapxep(a, l , j );
    if(i<r)sapxep(a, i , r );
    }
    void sapxep1(SV a[], int n)
    {
    sapxep(a, 0, n-1 );
    }
    void main()
    {
    SV a[100];
    int n=0;
    nhapSV(a, n);
    printf("\nDanh sach ban dau: ");
    inSV(a, n);
    sapxep1(a, n);
    printf("\n\nDanh sach sau khi sap xep: ");
    inSV(a, n);
    getch();
    }
    mình chỉ sửa cho code trên chạy.còn chạy thử qua thì mình thấy nó bị lỗi về buffer thôi.code lại hen
    HT117-5277

Các đề tài tương tự

  1. Kỹ thuật C Ko rõ về quicksort
    Gửi bởi neverdie201111 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 13
    Bài viết cuối: 16-12-2013, 10:28 PM
  2. Quicksort sử dụng lặp????
    Gửi bởi 51203104 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 05-11-2013, 06:50 PM
  3. Sắp xếp quicksort khử đệ quy trong lập trình C
    Gửi bởi neverland87 trong diễn đàn Thủ thuật, Tutorials CTDL & Giải thuật
    Trả lời: 1
    Bài viết cuối: 09-05-2012, 01:32 AM
  4. Vận dụng stack để gỡ đệ quy cho quicksort
    Gửi bởi trihn_kt trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 27-10-2010, 05:03 PM
  5. Trả lời: 6
    Bài viết cuối: 04-05-2008, 08:04 AM

Quyền hạn của bạn

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