30/09/2018, 16:28
sắp xếp tên theo alphabe trong Tiếng Vệt
Chào mọi người.
Em đang viết một chương trình C nhập vào họ tên từ bàn phím và lưu danh sách ra file, ( có thể nhập tiếp tục ghi thêm vào cuối file) sau đó sắp xếp và in ra màn hình. Khi em chạy chương trình thì bị lỗi runtime. Mọi người giúp em với ạ. Đây là code của em:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 5000
char *subString(char *string, int position, int endstr);
//Lấy tên từ họ tên đầy đủ
char *getName(char* fullName);
//đếm số dòng đã nhập trong file
int countLines(char *filename);
void sortByVietnam();
void nhapDanhSach();
int main(){
nhapDanhSach();
sortByVietnam();
return 0;
}
void nhapDanhSach(){
int i=0;
char danhSach[5000][30];
FILE *fp;
fp=fopen("D:\danhsach.txt", "a+");
//Nhap danh sach.
i= countLines(fp);
while(i<5000){
printf("Nhap ho ten sinh vien thu %d:", i+1);
gets(danhSach[i]); fflush(stdin);
if(danhSach[i][0]==' ')
break;
fprintf(fp,"%s
", danhSach[i]);
i++;
}
fclose(fp);
};
void sortByVietnam(){
char name[5000][30], danhSach[5000][30], *tg;
int i=0, j=0;
FILE* fp = fopen("D:\danhsach.txt", "r");
//read file input assign to danhsach
while (fgets(danhSach[i], 30 , fp)){
i++;
}
int n=strlen(danhSach);
for(i=0; i< n; i++){
strcpy(name[i], getName(danhSach[i]));
}
for(i=0; i<n-1; i++){
for(j=i+1; j<n; j++){
if(strcmp(name[i], name[j])>0){
strcpy(tg, danhSach[i]);
strcpy(danhSach[i], danhSach[j]);
strcpy(danhSach[j], tg);
}
if(strcmp(name[i],name[j])==0&&strcmp(danhSach[i], danhSach[j])>0){
strcpy(tg, danhSach[i]);
strcpy(danhSach[i], danhSach[j]);
strcpy(danhSach[j], tg);
}
}
}
printf("
Danh sach sap xep kieu Viet Nam:
");
for(i=0; i<n; i++){
printf("%d . %s
", i+1, danhSach[i]);
}
};
char *subString(char *string, int start, int endstr){
int c, length;
length = endstr-start+1;
char *pointer = (char*)malloc(sizeof(char)*(length+1));
for (c = 0 ; c < start ; c++)
string++;
for (c = 0 ; c < length; c++){
*(pointer+c) = *string;
string++;
}
*(pointer+c)= ' ';
return pointer;
}
char *getName(char* fullName){
char*name;
int i, n =strlen(fullName);
for(i= n-1; i>0; i--){
if(fullName[i]==' '){
name=(subString(fullName, i+1, n-1));
break;
}
}
return name;
};
int countLines(char* filename){
FILE *fp=NULL;
fp=fopen("D:\danhsach.txt", "r");
char str[MAX+1];
int numLine;
numLine = 0;
while( fgets(str, MAX, fp)!= NULL ){
numLine++;
}
return numLine;
}
Bài liên quan
Dòng này có vấn đề @ChuoiTieu ơi
Em khai báo hàm
countLines
nhận vào chuỗi cơ mà.P/S: Lần sau sử MarkDown để post code nhé
Ví dụ
Vâng, Cảm ơn anh Đạt. Để em sửa lại xem sao.
Đấy chỉ là một lỗi thôi @ChuoiTieu, anh nghi ngờ có nhiều lỗi hơn đấy.
Em đã sử lại thành
nhưng vẫn bị runtime error.
em sửa hết runtime rồi ạ Nhưng mà tên sắp xếp in ra không đúng alphabe.
Đang debug tìm lỗi.
@ChuoiTieu gửi lên code mới cập nhật đi, nhớ dùng markdown nhé
Code mới đây của em đây ạ
Em nghĩ mình sai ở phần hoán đổi 2 tên với nhau. Vì mảng giống như hằng.
Có thể giải thuật của em chưa đúng, anh google thì thấy có solution này, em so sánh với cái của em đang dùng thử. Code em dùng vòng for loop khá khó hiểu
Output:
Nguồn: http://www.c4learn.com/c-programs/c-program-to-sort-set-of-strings-in-alphabetical-order-using-strcmp.html
Em cũng đã thử code theo giải thuật này (sắp xếp theo kiểu tiếng anh) nhưng vẫn không sắp xếp được
Anh thấy giải thuật em dùng đâu giống đâu, trước hết em hiểu giải thuật của cái link anh gửi chưa?
Cảm ơn anh Đạt, Sắp xếp theo kểu tiếng Anh thì chuẩn rồi ạ.
Em đang thay đổi thành sắp xếp theo kiểu tiếng Việt nữa là xong
Tiếng Anh hay tiếng Việt cũng giống nhau mà Chuối ơi
Khác mà anh.
Tiếng Việt mình nhập vào tên ở sau cùng , nhưng tiếng anh thì họ ở cuối tên đặt lên trước tiên. Ở đây em sắp xếp họ tên đầy đủ chứ không phải chỉ có tên đâu anh.
Vậy em tìm cách cắt tên và họ riêng ra, lưu ở 2 chuỗi khác nhau. Sau đó so sánh Tên trước, so sánh tên xong. Nếu trùng tên thì so sánh họ. Sau khi so sánh hết thì lưu lại trong mảng với thứ tự hợp lý.
Khi in ra thì in họ trước, tên sau.
Cắt tên đặt lại phía trước họ, lưu tên và họ trong 1 chuỗi, so sánh như tiếng Anh. Khi in ra thì in họ trước, tên sau.
Em đã sử dụng một hàm cắt tên sau đó lưu tên vào một mảng để so sánh tên trước, họ và đệm sau nhưng không biết sai ở đâu. Anh Đạt có thể giúp em được không ạ. Chương trình chạy thì không báo lỗi. Có lẽ sai ở phần giải thuật.
Cuối cùng em cũng làm xong rồi. Cảm ơn anh Đạt và mọi người đã giúp đỡ.
Post luôn solution đi chuối ơi. Lúc nãy tính làm cho em mà quên mất. Hehe
Em dùng một hàm cắt tên sau đó dùng strcat() nối thêm họ vào sau cuối cùng cũng đơn giản hơn.
Anh chỉ mong sao diễn đàn mình có thêm nhiều thảo luận như thế này nữa. Mặc dù chỉ có mình em làm và nghiên cứu giải pháp cho chính em. Nhưng đó là cách anh muốn diễn đàn mình phát triển.
Các thành viên nỗ lực tìm giải pháo cho mình với sự giúp đỡ của người khác, để rồi sau đó có được lời giải và chia sẻ lại cho người khác.
Topic này đã hoàn thành xuất sắc nhiệm vụ. Anh sẽ close nó sau 1h nữa.