1. Chuẩn hóa tên
Cho file tập tin sinhvien.txt chứa danh sách các tên sinh viên của trường đại học X, hãy chuẩn hóa và loại bỏ các dấu cách thừa giữa tên sinh viên và lưu vào file sinhvien_out.txt
File sinhvien.txt có khuôn mẫu như sau : Dòng đầu là số lượng sinh viên, các dòng sau là tên sinh viên mỗi sinh viên trên 1 dòng
Để làm được bài này bạn cần biết chuẩn hóa tên người, bạn có thể tham khảo tại đây
| sinhvien.txt | sinhvien_out.txt |
4 nguyen HoaNG aNH NguyEN thi THuy LInh PhAM ngOC nam LuoNG Thi VAn | 4 Nguyen Hoang Anh Nguyen Thi Thuy Linh Pham Ngoc Nam Luong Thi Van |
Code :
#include "stdio.h" #include "string.h" #include "ctype.h" //Hàm này chuẩn hóa từng từ : liNH => Linh char* chuanHoaTu(char *s){ s[0] = toupper(s[0]); for(int i = 1; i < strlen(s); i++){ s[i] = tolower(s[i]); } return s; } char *chuanHoaTen(char *s, char *res){ char *token = strtok(s, " "); while(token != NULL){ //nối từ vào chuỗi kết quả res strcat(res, chuanHoaTu(token)); token = strtok(NULL, " "); //Nếu chưa phải từ cuối thì nối thêm dấu cách if(token != NULL){ strcat(res, " "); } } return res; } int main(){ //Mo file FILE *in; in = fopen("sinhvien.txt", "r"); if(in == NULL){ printf("File not found !\n"); } else{ FILE *out; out = fopen("sinhvien_out.txt", "w"); int n; fscanf(in, "%d", &n); fprintf(out, "%d\n", n); fgetc(in); char name[100], s[100]; for(int i = 0; i < n; i++){ //Doc file fgets(s, 100, in); s[strlen(s) - 1] = '\0'; //Ghi file fprintf(out, "%s\n", chuanHoaTen(s, name)); //reset xau name strcpy(name, ""); } fclose(in); fclose(out); } return 0; }
2. Cấp email sinh viên
Cho danh sách sinh viên trong file sinhvien.txt, hãy cấp email sinh viên theo mẫu : Nguyen Van Nam => namnv@28tech.com.vn
Lưu lại danh sách email vào file email.txt
File sinhvien.txt gồm nhiều dòng mỗi dòng là tên 1 sinh viên có thể không chuẩn
| sinhvien.txt | email.txt |
nguyen HoaNG aNH NguyEN thi THuy LInh PhAM ngOC nam LuoNG Thi VAn |
Để làm được bài này bạn cần biết cú pháp đọc hết mọi dòng trong file input và biết cách cấp email từ tên, bạn có thể tham khảo tại đây nếu chưa biết cách cấp email từ tên theo mẫu trên
Code :
#include "stdio.h" #include "string.h" #include "ctype.h" char *chuanHoa(char *name, char *email){ char a[100][50]; int n = 0; for(int i = 0; i < strlen(name); i++){ name[i] = tolower(name[i]); } char *token = strtok(name, " "); while(token != NULL){ strcpy(a[n], token); ++n; token = strtok(NULL, " "); } strcpy(email, a[n - 1]); int len = strlen(email); for(int i = 0; i < n - 1; i++){ email[len] = a[i][0]; ++len; } email[len] = '\0'; strcat(email, "@28tech.com.vn"); return email; } int main(){ //Mo file FILE *in; in = fopen("sinhvien.txt", "r"); if(in == NULL){ printf("File not found !\n"); } else{ FILE *out; out = fopen("email.txt", "w"); char name[100], email[100]; //Đọc mọi dòng trong file while(fgets(name, 100, in) != NULL){ name[strlen(name) - 1] = '\0'; fprintf(out, "%s\n", chuanHoa(name, email)); strcpy(email, ""); } fclose(in); fclose(out); } return 0; }
3. Sắp xếp danh sách sinh viên theo gpa
Cho danh sách sinh viên trong file sinhvien.txt, mỗi sinh viên gồm tên, lớp, ngày sinh và điểm gpa. Thông tin mỗi sinh viên được ghi trên 1 dòng, các thông tin cách nhau 1 dấu ','
Thực hiện sắp xếp lại danh sách sinh viên này và ghi vào file sinhvien_out.txt với điểm gpa giảm dần
| sinhvien.txt | sinhvien_out.txt |
Nguyen Van 28Tech,CNTT1,22/12/2004,3.5 Hoang Van Long,DTVT1,01/10/2003,3.8 Pham Van Nam,CNTT2,10/07/2004,2.5 Pham Thuy Linh,CNTT1,05/05/2003,3.1 | Hoang Van Long,DTVT1,01/10/2003,3.8 Nguyen Van 28Tech,CNTT1,22/12/2004,3.5 Pham Thuy Linh,CNTT1,05/05/2003,3.1 Pham Van Nam,CNTT2,10/07/2004,2.5 |
Để giải quyết bài toán này bạn cần đọc từng dòng để lấy thông tin sau đó tách thông tin ra và lưu vào struct, sắp xếp mảng struct và cuối cùng ghi vào file output
Code :
#include "stdio.h" #include "string.h" #include "ctype.h" #include "stdlib.h" struct SinhVien{ char ten[100]; char lop[20]; char ngaysinh[50]; double gpa; }; typedef struct SinhVien SinhVien; int cmp(const void *a, const void *b){ SinhVien *x = (SinhVien*)a; SinhVien *y = (SinhVien*)b; if(x->gpa > y->gpa) return -1; return 1; } int main(){ FILE *in; SinhVien a[1000]; int n = 0; in = fopen("sinhvien.txt", "r"); if(in == NULL){ printf("File not found !\n"); } else{ FILE *out; out = fopen("sinhvien_out.txt", "w"); char data[200], email[100]; //Đọc mọi dòng trong file while(fgets(data, 200, in) != NULL){ data[strlen(data) - 1] = '\0'; //tach thong tin int stt = 0; char *token = strtok(data, ","); while(token != NULL){ ++stt; // stt = 1 : ten, 2 : lop, 3 : ngaysinh, 4 : gpa if(stt == 1){ strcpy(a[n].ten, token); } else if(stt == 2){ strcpy(a[n].lop, token); } else if(stt == 3){ strcpy(a[n].ngaysinh, token); } else{ a[n].gpa = atof(token); } token = strtok(NULL, ","); } ++n; // tang so luong sinh vien } //Sap xep danh sach qsort(a, n, sizeof(SinhVien), cmp); //Ghi file for(int i = 0; i < n; i++){ fprintf(out, "%s,%s,%s,%.1lf\n", a[i].ten, a[i].lop, a[i].ngaysinh, a[i].gpa); } fclose(in); fclose(out); } return 0; }
4. Xếp loại học sinh
Cho file hocsinh.txt chứa thông tin của các học sinh bao gồm có thông tin : tên và điểm 3 môn toán, lý, hóa
Hãy tính điểm trung bình và lưu vào file hocsinh_out.txt thông tin về điểm trung bình và xếp loại học lực.
- Điểm trung bình ≥ 9.0 xếp loại Xuất sắc
- Điểm trung bình ≥ 8.0 xếp loại giỏi
- Điểm trung bình ≥ 6.5 xếp loại khá
- Điểm trung bình ≥ 5 xếp loại trung bình
- Điểm trung bình < 5 xếp loại yếu
File hocsinh.txt có khuôn mẫu như sau : File gồm nhiều dòng mỗi sinh viên gồm 2 dòng thông tin, dòng 1 là họ tên và dòng 2 là điểm toán lý hóa
File hocsinh_out.txt ghi thông tin tên, điểm trung bình và học lực trên từng dòng.
| hocsinh.txt | hocsinh_out.txt |
Nguyen Van 28Tech 6 7 8 Hoang Van Long 9 9 9 Nguyen Ngoc Phu 7 8 9 | Nguyen Van 28Tech 7.0 KHA Hoang Van Long 9.0 XUAT SAC Nguyen Ngoc Phu 8.0 GIOI |
Code :
#include "stdio.h" #include "string.h" #include "ctype.h" #include "stdlib.h" int main(){ FILE *in; in = fopen("hocsinh.txt", "r"); if(in == NULL){ printf("File not found !\n"); } else{ FILE *out; out = fopen("hocsinh_out.txt", "w"); char name[200], diem[100]; //Đọc mọi dòng trong file while(fgets(name, 200, in) != NULL){ name[strlen(name) - 1] = '\0'; double t, l, h; fscanf(in, "%lf %lf %lf", &t, &l, &h); fgetc(in); double tb = (t + l + h) / 3; fprintf(out, "%s %.1lf ", name, tb); if(tb >= 9) fprintf(out, "XUAT SAC\n"); else if(tb >= 8) fprintf(out, "GIOI\n"); else if(tb >= 6.5) fprintf(out, "KHA\n"); else if(tb >= 5) fprintf(out, "TRUNG BINH\n"); else fprintf(out, "YEU"); } fclose(in); fclose(out); } return 0; }
5. Đọc toàn bộ file số nguyên
Cho file number.txt chứa không quá 100000 số nguyên gồm nhiều dòng, mỗi dòng gồm nhiều số. Thực hiện đọc các số trong file này và ghi vào file prime.txt các số nguyên tố trong file theo thứ tự xuất hiện trong file, mỗi dòng không quá 10 số
| number.txt | prime.txt |
2 3 8 9 2 1 2 2 9 9 3 3 1 10 100 2 9 3 9234 123 123911 13 181 11 17 71 13 89 11 2 2 2 3 3 3 5 55 7 9 13 | 2 3 2 2 2 3 3 2 3 123911 13 181 11 17 71 13 89 11 2 2 2 3 3 3 5 7 13 |
Code :
#include "stdio.h" #include "string.h" #include "ctype.h" #include "math.h" int nt(int n){ if(n < 2) return 0; for(int i = 2; i <= sqrt(n); i++){ if(n % i == 0) return 0; } return 1; } int main(){ FILE *in; in = fopen("number.txt", "r"); if(in == NULL){ printf("File not found !\n"); } else{ FILE *out; out = fopen("prime.txt", "w"); int n, dem = 0; while(fscanf(in, "%d", &n) != -1){ if(nt(n)){ ++dem; fprintf(out, "%d ", n); } if(dem % 10 == 0) fprintf(out, "\n"); } fclose(in); fclose(out); } return 0; }