k4info
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

VẤN ĐỀ NAN GIẢI

2 posters

Go down

tuyetvoi VẤN ĐỀ NAN GIẢI

Bài gửi by quynhnhacit Fri Dec 16, 2011 5:35 pm

tạo một struc sinh viên
gồm
Masv
Ho sinh viên
Ten sinh viên
tìm kiếm theo Mã Sinh viên
viết hàm sắp xếp ds sinh viên theo tên ,nếu trùng tên thì sx theo họ (sắp xếp họ, tên theo Alphabet........)
viết hàm sx theo masv(tăng hoặc giảm theo mã sv...)
quynhnhacit
quynhnhacit

Posts : 12
Thanked : 0
Gia Nhập 06/10/2011

Về Đầu Trang Go down

tuyetvoi Re: VẤN ĐỀ NAN GIẢI

Bài gửi by Admin Fri Dec 16, 2011 6:34 pm

+ Tìm kiếm theo mả số vì mã số bạn làm kiểu char nên dùng hàm xử lý trên biến kiểu tra là strcmp(maso,masotk) nếu giống thông báo tìm thấy (find==TRUE) ngược lại nếu không thấy (find= FALSE).

+ Còn sắp xếp theo tên: Điều kiện lý tưởng là không trùng tên ta lấy chữ cái đầu của tên đổi ra kiểu int (chữa cái đầu của tên lấy bằng cách cho dòng for chạy hết chuỗi, chạy ngược từ cuối chuỗi đến đầu chuỗi VD: n= độ dài chuỗi thì dòng for chạy ngược từ n về 0, nếu gặp thấy khoảng trắng thứ i thì ta lấy ký tự thứ i+1 là ký tự tên và dùng lệnh break để thoát nggay tại vòng lặp đó luôn vì nếu làm tiếp sẽ lấy ký tự đầu tiên của từ Lót. VD Nguyễn_Quỳnh_Nhã ký tự khoảng trắng đầu tiên của dòng for chạy ngược trên là ký tự thứ 13 thì ta lấy ký tự thứ i+1 là N sau đó đổi ký tự này ra int bằng cách -64 trong mã ASCII.) Trường hợp không lý tưởng (trùng tên) ta lấy ký tự đầu tiên của chuỗi là họ ra được chữ N. rồi cũng đổi tương tự về số, vấn đề cần làm là viết 2 hàm , trong đó 1 hàm chuyền vào chuỗi trả về giá trị kiểu int của ký tự đầu của tên. hàm 2 tương tự nhưng dễ hơn trả về kiểu int ký tự đầu của họ. Sau khi làm xong 2 hàm đó vì là kiểu int hết rồi thì ta so sánh trên số để sắp xếp họ tên. bình thường ta gọi hàm 1 để sắp xếp nếu có trường hợp trùng tên tức, thì gọi tới hàm thứ 2 trả về int họ rồi sắp xếp theo thứ tự tăng dần thì danh sách sinh viễn sẽ được sắp xếp theo anphabet.

+ vì mã số sinh viên cũng kiểu char nên cũng chuyển về số để sắp xếp. Xem mã số sinh viên như thế nào rồi cũng chuyển về số giống như họ tên nhé.


==> Đây là ý tưởng của mình để bạn tham khảo thôi còn nhiều cách khác! Chúc bạn thành công!
Admin
Admin

Posts : 1013
Thanked : 47
Gia Nhập 25/08/2010

Tài Sản
Thú nuôi:

https://k4info.forumvi.com

Về Đầu Trang Go down

tuyetvoi Re: VẤN ĐỀ NAN GIẢI

Bài gửi by quynhnhacit Mon Dec 19, 2011 12:36 pm

Code:

    #include<conio.h>
    #include<iostream.h>
    #include<iomanip.h>
    #include<stdio.h>
    typedef struct
    {
    char Masv [20];
    char Ho[20];
    char Ten [20];
    float DiemLT,DiemTH;
    }sinhvien;
void Nhap(sinhvien sv[20],int n)
{
        for(int i=1;i<=n;i++)
        {
        cout<<"\tsinh vien thu :"<<i<<"\n";
        cout<<"\t-------------------------------------------------\n";
        cout<<"\tMa Sinh Vien  : ";cin.ignore(),cin.get(sv[i].Masv,20);
        cout<<"\tNhap Ho      : ";cin.ignore(),cin.get(sv[i].Ho,20);
        cout<<"\tNhap Ten      : ";cin.ignore(),cin.get(sv[i].Ten,20);
        cout<<"\tNhap Diem LT  : ";cin>>sv[i].DiemLT;
        cout<<"\tNhap Diem TH  : ";cin>>sv[i].DiemTH;
        cout<<"\t-------------------------------------------------\n\n";
        }
}
void Xuat(sinhvien sv[20], int n)
{
        for(int i=1; i<=n; i++)
        cout<<"|"<<setw(15)<<sv[i].Masv<<setw(10)<<sv[i].Ho<<setw(10)<<sv[i].Ten<<setw(12)
        <<sv[i].DiemLT<<setw(11)<<sv[i].DiemTH<<setw(10)<<sv[i].DiemTH<<"|\n";
}
void Sapxep(sinhvien sv[20], int n)
{
        sinhvien tam;
        for(int i=1; i<=n; i++)
            for(int j=i+1; j<=n; j++)
            if(strcmp(sv[i].Ten, sv[j].Ten)>0 || strcmp(sv[i].Ho,sv[j].Ho)>0)
            {
            tam = sv[i];
            sv[i] = sv[j];
            sv[j]=tam;
            }
}
void SapxeptheoMasv(sinhvien sv[20], int n)
{
    sinhvien tam;
    for(int i=1; i<=n; i++)
    for(int j=i+1; j<=n; j++)
    if(strcmp(sv[i].Masv,sv[j].Masv)>0)
    {
    tam = sv[i];
    sv[i] = sv[j];
    sv[j]=tam;
    }
}
void Timkiem(sinhvien sv[20],char x[10], int n)
{
    int k, i=0, j=n-1;
    do
    {
        k=(i+j)/2;
        if(strcmp(x,sv[k].Masv)<0)
        j=k-1;
        else
        i=k+1;
    }
    while(x!=sv[k].Masv && i<=j);
    if(strcmp(x,sv[k].Masv)==0)
    cout<<"|"<<setw(15)<<sv[k].Masv<<setw(10)<<sv[k].Ho<<setw(10)<<sv[k].Ten
    <<setw(12)<<sv[k].DiemLT<<setw(11)<<sv[k].DiemTH<<setw(10)<<(sv[k].DiemLT*2+sv[k].DiemTH)/3<<"|"<<endl;
    else cout<<"\nKhong co Sinh vien nao!\n";
}
main()
{
        sinhvien sv[20];
        int i,n,chon,dem=0;
        char x[20];
        cout<<"\t\t==============================================\n";
        cout<<"\t\t|| Nhap thong tin bang sinh vien"<<setw(16)<<"||\n";
        cout<<"\t\t==============================================\n";
        cout<<"\t\t- Nhap so luong sinh vien can nhap :";cin>>n;
        cout<<"\n\t\t==================\n";
        cout<<"\t\t||- Bat dau:"<<setw(8)<<"||\n\a";
        cout<<"\t\t==================\n\n";
        Nhap(sv,n);
        do
    {
       
        cout<<"\n\n\t=========================================================\n";
        cout<<"\t||  MENU QUAN LY SINH VIEN "<<setw(30)<<"||\n";
        cout<<"\t=========================================================\n";
        cout<<"\t||  LUA CHON : "<<setw(7)<<"|"<<setw(35)<<"||\n";
        cout<<"\t||---------------------"<<setw(35)<<"||\n";
        cout<<"\t|| + 1. Hien thi thong tin sinh vien "<<setw(21)<<"||\n";       
        cout<<"\t|| + 2. Danh sach sinh vien sap xep "<<setw(22)<<"||\n";
        cout<<"\t|| + 3. Tim kiem theo ma sinh vien "<<setw(23)<<"||\n";
        cout<<"\t|| + 4. Ket thuc chuong trinh "<<setw(28)<<"||\n";
        cout<<"\t=========================================================\n";
        cout<<"\t\tBan chon chuc nang: ";cin>>chon;
       
    switch(chon)
    {
    case 1:     
        for(i=1; i<=n; i++)
          dem++;
          if(dem==0)
        cout<<"\nKhong co danh sach sinh vien de hien thi\n";
        else
        cout<<"\n\n\n\t\t==============================================\n";
        cout<<"\t\t|| Hien thi bang thong tin sinh vien "<<setw(10)<<"||\n";
        cout<<"\t\t==============================================\n";
        cout<<"----------------------------------------------------------------------"<<endl;
        cout<<"| Ma Sinh Vien  |"<<setw(10)<<"|  Ho  |"<<setw(10)<<"|  Ten  | "<<setw(12)<<"| Diem LT | "<<setw(5)<<"| Diem TH | "<<setw(5)<<"Diem TB|"<<endl;
        cout<<"----------------------------------------------------------------------"<<endl;
        Xuat(sv,n);
        cout<<"\n\n\t\t===============================================\n";
        cout<<"\t\t|| Hoan thanh && Nhan phim bat ki de tiep tuc"<<setw(3)<<"||\n";
        cout<<"\t\t===============================================\n";
        getch();
        break;
    case 2:
        for(i=1; i<=n; i++)
          dem++;
          if(dem==0)
        cout<<"\nKhong co danh sach sinh vien de hien thi\n";
        else
        {
        cout<<"\nDanh Sach Sinh Vien Sau Khi Sap Xep La:\n";
        cout<<"----------------------------------------------------------------------"<<endl;
        cout<<"| Ma Sinh Vien  |"<<setw(10)<<"|  Ho  |"<<setw(10)<<"|  Ten  | "<<setw(12)<<"| Diem LT | "<<setw(5)<<"| Diem TH | "<<setw(5)<<"Diem TB|"<<endl;
        cout<<"----------------------------------------------------------------------"<<endl;
        Sapxep(sv,n);
        Xuat(sv,n);
        }
        cout<<"\n\n\t\t===============================================\n";
        cout<<"\t\t|| Hoan thanh && Nhan phim bat ki de tiep tuc"<<setw(3)<<"||\n";
        cout<<"\t\t===============================================\n";
        getch();
        break;
    case 3:   
        for(i=1; i<=n; i++)
          dem++;
          if(dem==0)
        cout<<"\nKhong co danh sach sinh vien de hien thi\n";
        else
        {
        cout<<"\n\t+ Nhap Ma Sinh vien Can Tim : ";cin>>x;
        cout<<"----------------------------------------------------------------------"<<endl;
        cout<<"| Ma Sinh Vien  |"<<setw(10)<<"|  Ho  |"<<setw(10)<<"|  Ten  | "<<setw(12)<<"| Diem LT | "<<setw(5)<<"| Diem TH | "<<setw(5)<<"Diem TB|"<<endl;
        cout<<"----------------------------------------------------------------------"<<endl;
        SapxeptheoMasv(sv,n);
        Timkiem(sv,x,n);
        }
      }
   
  }while (chon!=4); 
}
đây là bài mình làm nề.thuật sx theo họ tên chắc là ổn.nhưng minh làm bài này phần tiềm kiếm theo mã sinh viên thì lúc được lúc không(tùy theo mình nhập mã tăng hay giảm dần hoặc lẩn lộn..) nên lúc được lúc không bạn xem giúp với
quynhnhacit
quynhnhacit

Posts : 12
Thanked : 0
Gia Nhập 06/10/2011

Về Đầu Trang Go down

tuyetvoi Re: VẤN ĐỀ NAN GIẢI

Bài gửi by Admin Mon Dec 19, 2011 6:22 pm

Hàm tìm kiếm của bạn đây!


void Timkiem(sinhvien sv[20],char x[10], int n)
{
int k, i=0, j=n-1;
do
{
k=(i+j)/2;
if(strcmp(x,sv[k].Masv)<0)
j=k-1;
else
i=k+1;
}


Mình không hiểu ý bạn là vì luôn!

Theo cách mình là làm thế này:

+ Điều kiện: 1 danh sách gồm n sinh viên và mã số sinh viên cần tìm; Khai báo như sau: sinhvien ds[20] , int n, char ms[10];
+ Viết 1 hàm truyền vào 3 tham số đó là danh sách sinh viên, n là số sinh viên và mã số sinh viên cần tìm kiếm; khai báo như sau: bool timkiem( sinhvien ds[20], int n, char mstk[10])
+ Kết quả tìm kiếm trên trả về là 1 kiểu logic có 2 giá trị TRUE ( tìm thấy và FALSE là không tìm thấy)
+ Cho 1 dòng for chạy hết các phần tử của danh sách sinh viên rồi dùng hàm kiểm tra xem mã sinh viên tìm kiếm có bằng với mã sinh viên thứ i nào đó không dùng hàm strcmp(ds[i].mssv,mstk) == 0) Nếu đúng thì mình cho 1 biến kiểu bool find=TRUE; biến find này lúc đầu hàm mình khởi tạo là find=FALSE mặc định là không tìm thấy, kết quả của hàm tìm kiếm trả về giá trị kiểu logic TRUE or FALSE
==> Bạn có thể tham khảo cách mình làm như sau:

Code:

bool Timkiem( sinhvien ds[20], int n, mstk[10])
{
  bool find=FALSE;
 for(int i=1; i<=n; i++)
      if(strcmp(ds[i].mssv,mstk) == 0) find=TRUE;
  return find;
}

+ Cách gọi lại hàm: Giả sử tôi muốn tìm sinh viên có mả số là 0957 trong danh sách sinh viên có sẵn là a[10] gồm có 10 sinh viên. Yêu cầu cần có hàm nhập mã sinh viên cần tìm rồi
Code:
 cin>>mstk;
Gọi lại hàm: if(Timkiem(a[10], n, mstk)==TRUE) cout<<"Tìm thấy sinh viên có mã số <<mstk"; else cout<<"Không tìm thấy";
Admin
Admin

Posts : 1013
Thanked : 47
Gia Nhập 25/08/2010

Tài Sản
Thú nuôi:

https://k4info.forumvi.com

Về Đầu Trang Go down

tuyetvoi Re: VẤN ĐỀ NAN GIẢI

Bài gửi by Sponsored content


Sponsored content


Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết