Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: Sắp xếp danh sách sinh viên theo thứ tự abc. Giúp mình sửa lỗi?

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

    Mặc định Sắp xếp danh sách sinh viên theo thứ tự abc. Giúp mình sửa lỗi?

    Các bạn cho hỏi cái hàm sắp xép danh sách mình viết như vầy có sai hok mà nó không chạy, ai sửa lại hộ mình với

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <string.h>
    4. typedef struct
    5. {
    6.     long int maso;
    7.     char ho[15],ten[8];
    8.     float toan,ly,hoa,dtb;
    9. }sinhvien;
    10.  
    11. void nhap(sinhvien a[],int n)
    12. {
    13.     float tam;
    14.     for (int i=0;i<n;i++)
    15.     {
    16.         printf("Nhap ma so sinh vien\n");
    17.         scanf("%li",&a[i].maso);
    18.         fflush(stdin);
    19.         printf("Nhap ho va chu lot cua sinh vien\n");
    20.         gets(a[i].ho);
    21.         printf("Nhap ten sinh vien\n");
    22.         gets(a[i].ten);
    23.         fflush(stdin);
    24.         printf("Nhap diem toan\n");
    25.         scanf("%f",&tam);
    26.         a[i].toan=tam;
    27.         printf("Nhap diem ly\n");
    28.         scanf("%f",&tam);
    29.         a[i].ly=tam;
    30.         printf("Nhap diem hoa\n");
    31.         scanf("%f",&tam);
    32.         a[i].hoa=tam;
    33.         a[i].dtb=(a[i].toan+a[i].ly+a[i].hoa)/3;
    34.     }
    35.  
    36. }
    37.  
    38.  
    39. void sapxep(sinhvien a[],int n)
    40. {
    41.     sinhvien b;
    42.     for (int i=0;i<n;i++)
    43.     for (int j=i+1;j<n-1;j++)
    44.     {
    45.         if (strcmp(a[i].ten,a[j].ten)>0)
    46.         {
    47.             b=a[i];
    48.             a[i]=a[j];
    49.             a[j]=b;
    50.         }
    51.     }
    52. }
    53.  
    54. void xuat(sinhvien a[],int n)
    55. {
    56.     printf("\n-+-----+-----------+----------------+------------+------+------+------+------+-");
    57.     printf("\n-| STT |  MSSV     |      HO        |   TEN      | TOAN |  LY  |  HOA |  DTB |-");
    58.     printf("\n-+-----+-----------+----------------+------------+------+------+------+------+-");
    59.     for (int i=0;i<n;i++)
    60.     {
    61.         printf("\n | %3d |",i+1);
    62.         printf("%10li %16s %12s %6.1f %6.1f %6.1f %6.1f",a[i].maso,a[i].ho,a[i].ten,a[i].toan,a[i].ly,a[i].hoa,a[i].dtb);
    63.     }
    64.  
    65. }
    66. void main()
    67. {
    68.     clrscr();
    69.     int n;
    70.     sinhvien a[100];
    71.     printf("Ban muon nhap bao nhieu sinh vien");
    72.     scanf("%d",&n);
    73.     nhap(a,n);
    74.     sapxep(a,n);
    75.            xuat(a,n);
    76.    
    77. getch();
    78. }

    đề bài là nhập danh sách sinh viên gồm mã số, diểm toán, lý, hóa, ĐTB, in ra danh sách sinh viên theo thứ tự abc

  2. #2
    Ngày gia nhập
    03 2008
    Bài viết
    64

    Chạy thì ko có lỗi gì (xóa dòng clscr() và chạy trong VC++)

    Nhưng bạn làm sai yêu cầu rồi,yêu cầu là sắp xếp theo thứ tự abc theo tên,mà bạn lại sắp xếp theo kiểu hoán đổi là sai,nên xem lại hàm sapxep.

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

    vậy làm sao mới đúng, mình làm so sánh tên, nếu tên i mà nhỏ hơn tên j thì đổi toàn bộ cấu trúc của i cho j, phải viết như thê nào mới đúng

  4. #4
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,006

    đây mới là thuật toán interchange sort chuẩn, code xắp xếp theo interchange của bạn sai rồi,
    PHP Code:
        for (i=0;i<n-1;i++)
                for (
    j=i+1;j<n;j++)
                    
    nếu .... thì đổi chỗ 
    + Trong c thuần túy ko hỗ trỡ gán cấu trúc cho cấu trúc. Trong mở rộng của C thì có. Nếu bạn dùng trình biên dịch có bao gồm của C++ thì ko cần quan tâm

    + nên dùng stricmp hơn strcmp
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

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

    Cảm ơn bạn, mình sửa được rồi

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

    Mặc định Sắp xếp danh sách sinh viên theo thứ tự abc. Giúp mình sửa lỗi?

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    đây mới là thuật toán interchange sort chuẩn, code xắp xếp theo interchange của bạn sai rồi,
    PHP Code:
        for (i=0;i<n-1;i++)
                for (
    j=i+1;j<n;j++)
                    
    nếu .... thì đổi chỗ 
    + Trong c thuần túy ko hỗ trỡ gán cấu trúc cho cấu trúc. Trong mở rộng của C thì có. Nếu bạn dùng trình biên dịch có bao gồm của C++ thì ko cần quan tâm

    + nên dùng stricmp hơn strcmp
    cái này hình như chỉ xắp xếp với tên thôi..nếu như xắp xếp theo ho va tên thì khong được mà
    vidu:Nguyen van an
    tran van an
    thi sau khi xap xep:tran van an trước nguyễn văn an là sai rồi..k biết sửa thế nào nữa..giúp mình với

  7. #7
    Ngày gia nhập
    04 2012
    Nơi ở
    Bình Định (Đang học ở tphcm)
    Bài viết
    35

    Cái này bạn phải viết thêm hàm so sánh 2 chuỗi nữa thôi ma!
    Đã được chỉnh sửa lần cuối bởi thai_thinh : 07-05-2012 lúc 11:27 PM.

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

    2 hàm so sánh là sao bạn??? tức là cắt chuối tên vs họ ra riêng để so sánh ak :-S

  9. #9
    Ngày gia nhập
    04 2012
    Nơi ở
    Bình Định (Đang học ở tphcm)
    Bài viết
    35

    Code:
    #define MAX 30 // cái này là độ dài tối đa của tên
    
    void Tach(char s[],char c[],int &size)
    {
    	while(size>=0&&s[size]!=' ')
    		size --;
    	int k = size-- + 1;
    	int i = 0;
    	while(s[k]&&s[k]!=' ')
    		c[i++] = s[k++];
    	c[i] = NULL;
    }
    int SoSanh(char s1[],char a1[],int size1,char s2[],char a2[],int size2)
    {
    	if(size1||size2)
    	{
    	Tach(s1,a1,size1);
    	Tach(s2,a2,size2);
    	int k = strcmp(a1,a2);
    	if(k==0)
    		return SoSanh(s1,a1,size1,s2,a2,size2);
    	return k;
    	}
    	return 0;
    }
    //Tra ve 1 neu s1>s2
    //Tra ve 0 neu hai ten trung nhau
    //Tra ve -1 neu s1<s2
    int Strcmp(char s1[],char s2[])
    {
    	char a1[MAX],a2[MAX];
    	int size1 = strlen(s1)-1,size2 = strlen(s2)-1;
    	return SoSanh(s1,a1,size1,s2,a2,size2);
    }
    Bạn có thể lưu họ và tên vào một chuỗi cho dễ sử dụng hàm Strcmp cua mình
    Nếu không (Lưu như cấu trúc) bạn so sánh hai tên trước nếu mà bằng nhau thì bạn dùng hàm này để so sánh tiếp.
    Đã được chỉnh sửa lần cuối bởi thai_thinh : 08-05-2012 lúc 10:23 AM.

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

    cái này mình so sanh:nguyen van an với tran van an thì kq là -1..nếu vậy khi xắp xếp:tran van an vẫn đứng trước :nguyen van an mà ???

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

  1. Nhập Danh sách sinh viên, sắp xếp theo điểm của SV và in danh sách.
    Gửi bởi ltqqn93 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 6
    Bài viết cuối: 15-04-2013, 08:38 PM
  2. Bài tập C++ Sắp xếp danh sách Nhân viên theo ngày sinh trong C++?
    Gửi bởi lufivuahaitac trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 23-04-2012, 02:22 PM
  3. Bài tập C In ra danh sách sinh viên sau khi sắp xếp theo alphabet?
    Gửi bởi viethai1431 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: 10-08-2011, 11:54 AM
  4. Chương trình quản lí sinh viên viết trong visual c++ 2010. Lỗi không chạy khi in danh sách sinh viên theo năm
    Gửi bởi hikaru1015 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 9
    Bài viết cuối: 03-06-2011, 09:31 AM
  5. Sắp sếp danh sách sinh viên theo ID (Help me)
    Gửi bởi qhi trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 30-03-2010, 02:30 PM

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