sắp xếp tên theo alphabe trong Tiếng Vệt

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. :smile:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 5000

char *subString(char *string, int start, int endstr);

char *getName(char* fullName);

int countLines(FILE *fp);

void swapName(char *name, char *name2);

void sortByEnglish();

void sortByVietnam();

void nhapDanhSach();


int main(){
    nhapDanhSach();
    sortByVietnam();
    sortByEnglish();
    getchar();
    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]=='\0')
        break;
    fprintf(fp,"%s\n", danhSach[i]);
    i++;
    }
    fclose(fp);
};

void sortByVietnam(){
   char name[5000][40], danhSach[5000][30], t[30];
    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 k=i;

    for(j=0; j< k; j++){
        strcpy(name[j], getName(danhSach[j]));
        strcat(name[j], danhSach[j]);
    }

    for (i = 0; i < k-1; i++) {
        for (j = 1; j < k; j++){
            if (strcmp(name[j - 1], name[j]) > 0){
                strcpy(t, danhSach[j - 1]);
                strcpy(danhSach[j - 1], danhSach[j]);
                strcpy(danhSach[j], t);

                strcpy(t, name[j - 1]);
                strcpy(name[j - 1], name[j]);
                strcpy(name[j], t);
            }
        }
    }
    printf("\nDanh sach sap xep kieu tieng Tieng Viet:\n\n");
    for(i=0; i<k; i++){
        printf("%d %s\n", i+1, danhSach[i]);
    }
    fclose(fp);
};

void sortByEnglish(){
   char name[5000][30], danhSach[5000][30], t[30];
    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 k=i;

    for(j=0; j< k; j++){
        strcpy(name[j], getName(danhSach[j]));
    }

     for (i = 1; i < k-1; i++) {
        for (j = 1; j < k; j++) {
            if (strcmp(danhSach[j - 1], danhSach[j]) > 0) {
                strcpy(t, danhSach[j - 1]);
                strcpy(danhSach[j - 1], danhSach[j]);
                strcpy(danhSach[j], t);
            }
        }
    }
    printf("\nDanh sach sap xep kieu tieng Anh:\n\n");
    for(i=0; i<k; i++){
        printf("%d %s\n", i+1, danhSach[i]);
    }
    fclose(fp);
};


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)= '\0';
    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(FILE *fp){
    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;
}
1 Like

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.

This topic was automatically closed after 60 minutes. New replies are no longer allowed.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?