PDA

View Full Version : lập trình C,thuật toán quicksort?



billythekidvn
16-05-2005, 20:45
Sinh viên gồm các thông tin sau:mã số,họ tên,năm sinh.
Viết chương trình quản lý sinh viên gồm các thông tin sau:
-tạo danh sách sinh viên,,ghi vào file.
-cập nhật thông tin sinh viên.
-thêm 1 sinh viên vào danh sách.
-sắp xếp danh sách theo thứ tự tăng dần của mã số bằng thuật giải quicksort.
-tìm kiếm trong danh sách 1 sinh viên theo thứ tự(tìm kiếm nhị phân).
Các bác biết cách viết thì giúpem qua con trăng này.Cảm ơn nhiều.

duytanghostlake
17-05-2005, 08:37
Cái này sử dụng Cấu trúc dữ liệu là ổn ngay đấy mà, để mai tôi Post lên cho mọi ngươi cùng tham khảo

bichduyen_nt
17-05-2005, 10:21
Cái này là bài tập CTDL cơ bản lắm đó bạn à, bạn nên tự xử thì tốt hơn cho bạn đó, hình như cái này là bài tập trong phần cây nhị phân tìm kiếm, còn phần Quicksort chỉ là thêm vô cho dzui thôi, cái chính phải là cây, hi hi, mà đã lưu trong cây thì chuyện sắp xếp đơn giản hơn nhiều, đâu cần phải xài tới Quicksort nhỉ

billythekidvn
17-05-2005, 19:53
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#include<ctype.h>

#define file "c:\\danhsach.dat"
#define max 100

typedef struct NHANVIEN{
char ms[10];
char ht[max];
long ns;
}nhanvien;
nhanvien DS[max];
int count=0;
int kiemtra=0;
int a[max];
char select();
void them();
void capnhat();
void xoa();
void sapxep();
int timkiem();
void in();
void ghifile();
void docfile();

char select()
{ char kt;
clrscr();
printf("\n\t1. Them.");
printf("\n\t2. Cap nhat.");
printf("\n\t3. Xoa.");
printf("\n\t4. Sap xep.");
printf("\n\t5. Tim kiem.");
printf("\n\t6. In danh sach.");
// printf("\n\t7. Luu vao file.");
printf("\n\t0. Thoat.");
printf("\n\nChon chuc nang(0-6): ");
do{
kt=getche();
}while(kt< '0' || kt> '6');
if(count== 0)
printf("\n-Danh sach trong!");
else
printf("\n-Hien dang co %d nhan vien trong danh sach.",count);
printf("\n");

return kt;
}

void them()
{ char ms[10];
long ns;
char ht[max];
do{ fflush(stdin);
printf("\n-Ma so nhan vien: ");
gets(ms);
//if(strcmp(ms,"")==0)
if(strlen(ms)!=0)
{ strcpy(DS[count].ms,ms);
fflush(stdin);
printf("\t-Ho ten: ");
gets(ht);
strcpy(DS[count].ht,ht);
printf("\t-Nam sinh: ");
scanf("%ld",&ns);
DS[count].ns=ns;
count++;
kiemtra=1;
printf ("\n\n nhan ESC de cham dut nhap du lieu sinh vien\n\n");
}
}while(strcmp(ms,"")!=0);

}

void capnhat()
{ char ms[10];
char ht[max];
long ns;
int thoat=0;
fflush(stdin);
printf("\n-Nhap ma so nhan vien: ");
gets(ms);
for(int i=0;i<count;i++)
{
if(strcmp(ms,DS[i].ms)==0)
{ printf("\n\n-Ma so nhan vien: %s",DS[i].ms);
printf("\n -Ho ten: %s",DS[i].ht);
printf("\n -Nam sinh: %ld",DS[i].ns);

printf("\n\n-Thay doi thong so nhan vien.");
fflush(stdin);
printf("\n\n-Ma so nhan vien: ");
gets(ms);
strcpy(DS[i].ms,ms);
printf(" -Ho ten: ");
gets(ht);
strcpy(DS[i].ht,ht);
printf(" -Nam sinh: ");
scanf("%ld",&ns);
DS[i].ns=ns;
printf("\n- Da thay doi!");
thoat=1;
kiemtra=1;
getch();
}
}
if(thoat==0)
{ printf("\Khong ton tai nhan vien trong danh sach!");
getch();
}
}

void xoa()
{ char ms[10];
int test=1;
printf("\n-Nhap ma so nhan vien: ");
gets(ms);
for(int i=0;i<count;i++)
if(strcmp(ms,DS[i].ms)==0)
{
for(int j=i;j<count;j++)
DS[j]=DS[j+1];
count--;
printf("\n-Da xoa!");
test=0;
kiemtra=1;
getch();
}
if(test==1)
{
printf("\n-Khong co trong danh sach!");
getch();
}
}

void in()
{ if(count==0)
printf("\n-Danh sach chua co nhan vien!");
else
{
printf("\n\t\t****DANH SACH NHAN VIEN****");
for(int i=0;i<count;i++)
{ printf("\n-Ma so: %s",DS[i].ms);
printf("\n -Ho ten : %s", DS[i].ht);
printf("\n -Nam sinh : %ld",DS[i].ns);
printf("\n");
}
}
getch();
}
int timkiem()
{
char maso[50];
fflush(stdin);
printf("\n-Nhap ma so nhan vien can tim: ");
gets(maso);
int m,left=0,right=count-1, test;
while(left<=right)
{
m=(left+right)/2;
test=strcmp(DS[m].ms,maso);
if (test==0)
{ printf("\n-Tim thay!");
printf("\n\n-Ma so: %s",DS[m].ms);
printf("\n -Ho ten: %s",DS[m].ht);
printf("\n -Nam sinh: %ld",DS[m].ns);
getch();
return 0;
}
else if (test>0)
right=m-1;
else
left=m+1;
}
printf("\n-Khong co trong danh sach!");
getch();
return 0;
}
void sapxep()//Here it is.Tôi chết ở đây
void ghifile()
{
FILE *fp;
fp=fopen(file,"wb");
if(fp==NULL)
{ printf("\n-Khong mo duoc file!");
exit(1);
}
fwrite(&DS,sizeof(nhanvien),count,fp);
fclose(fp);
// printf("\n-Da ghi vao file!",count);
// getch();
}
void docfile()
{ count=0;
FILE *fp;
fp=fopen(file,"a+b");
if(fp==NULL)
{ printf("\-Khong mo duoc file!");
exit(1);
}
while(!feof(fp))
{
fread(&DS[count],sizeof(nhanvien),1,fp);
count++;
}
count=count-1;
fclose(fp);
}



void main()
{
clrscr();
docfile();
char sl,exit='0';
do{
sl=select();
switch(sl)
{
case '1' : them(); break;
case '2' : capnhat(); break;
case '3' : xoa(); break;
case '4' : sapxep(); break;
case '5' : timkiem(); break;
case '6' : in(); break;
// case '7' : ghifile(); break;
case '0' :
{ exit = '1';
if(kiemtra==1)
{ printf("\n-Danh sach da thay doi.");
printf("\n-Co muon luu lai thay doi?(C/K)");
char test=getche();
if(toupper(test)=='C')
{ ghifile();
printf("\n\n-Da ghi vao file!");
}
}
break;
}
}
}while(exit!='1');
getch();
}

bà con nào biết thì xử lý hàm sapxep // qsort thử xem.Em ko biết hoàn thành sao cho hợp lý đây.

dragonair
19-05-2005, 15:13
template < class item >
void swap( item & x , item & y ) {
item tam = x;
x = y;
y = tam;
}
void sapxep(){
sapxep( 0 , count-1 );
}
void sapxep( int l , int r )
{
if ( r <= l );
else {
double x=atof(DS[(l+r)/2].ms);
int i=l,j=r;
while (i<=j){
while(atof(DS[i].ms)<x)i++;
while(atof(DS[j].ms)>x)j--;
if(i<=j){
swap(DS[i],DS[j]);
i++;
j--;
}
}
sapxep( l , j );
sapxep( i , r );
}
}

Hổng biết có đúng ko nữa. Bà con coi giúp nhé.

ntc_113
15-05-2009, 14:52
cái này sai ở đâu vậy, nhờ các bạn chỉ giùm


#include"fstream.h"
#include"conio.h"
#include"stdio.h"
int a[20],n,l=0,r=n-1;
void quick(int *a,int l,int r)
{
if(l<r)
{
int t=a[(l+r)/2];
int i=l;int j=r;
while (i<=j)
{
while (a[i]<t) i++;
while (a[j]>t) j--;
while (i<=j)
{
int tg = a[i];
a[i] = a[j];
a[j] = tg;
i++; j--;
}
}

quick(a,l,j);
quick(a,i,r);

}
}
void main()
{
clrscr();
int a[20],n;
cout<<"n:= ";cin>>n;
for(int i=0;i<n;i++)
{
cout<<"a["<<i<<"]:= ";
cin>>a[i];
}
quick(a,0,n-1);
for(i=0;i<n;i++)
cout<<a[i]<<" ";
getch();
}

kimduquan
17-05-2009, 08:57
bạn khai báo biến toàn cục n nhưng chưa gán giá trị cho n mà bạn lại khai báo r=n-1;bạn khai báo biến toàn cục int a[20] và n nhưng trong hàm main bạn lại khai báo int a[20] và n nên có thể 2 biến toàn cục bị che dẫn đến kết quả sai.