Lập trình tính toán khoa học kỹ thuật - Buổi 7: Kiểu tập tin và nâng cao - Lê Hoàng Sơn
1. Đối với danh sách sinh viên trong ví dụ 1, hãy in ra file
output danh sách sinh viên mới sắp xếp theo thứ tự
alphabet của họ tên
2. Cho bai2.inp như sau:
- Dòng đầu là chỉ số hàng
và cột của ma trận
- Các dòng sau là phần tử
ma trận
Ghi vào file bai2.out:
a) Dòng đầu: Số phần tử dương
b) Dòng thứ hai: Số phần tử âm
c) Dòng thứ ba: Số phần tử bằng 0
24 trang |
Chia sẻ: dntpro1256 | Lượt xem: 689 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Lập trình tính toán khoa học kỹ thuật - Buổi 7: Kiểu tập tin và nâng cao - Lê Hoàng Sơn, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Lập trình tính toán khoa học kỹ thuật 1
Buổi 7: Kiểu tập tin và nâng cao
Giảng viên: TS. Lê Hoàng Sơn
lehoangson@hus.edu.vn
Lê Hoàng Sơn 2/24
Nội dung chính
Kiểu Tập Tin 1
Nâng Cao Về C 2
Bài tập 3
Lê Hoàng Sơn 3/24
1. Kiểu tập tin (File)
File là loại dữ liệu có thể ghi lên đĩa để dùng nhiều lần.
Trong C chỉ có một loại File, nhưng cấu trúc của mỗi File
có thể khác nhau.
Cấu trúc này được hình thành khi ta ghi dữ liệu lên File,
nó phụ thuộc vào hàm mà ta dùng để ghi dữ liệu lên đĩa.
Có hai kiểu xuất/ nhập dữ liệu vào File:
Nhị phân
Văn bản
Lê Hoàng Sơn 4/24
Kiểu xuất/nhập tập tin
Nhị phân:
Dữ liệu trong file ở dạng các số nhị phân
Dữ liệu ghi lên tập tin không bị thay đổi và khi đóng tập tin thì mã
kết thúc tập tin sẽ được ghi lên đĩa là -1
Văn bản:
Dữ liệu ở dạng text
Khi xử lý ký tự xuống dòng và khi đóng tập tin thì mã kết thúc tập
tin sẽ được ghi lên đĩa là 26
Khi ghi một ký tự chuyển dòng lên đĩa (mã 10) sẽ ghi thành 2 ký tự
mã 13 và mã 10.
Khi đọc, nếu gặp hai ký tự liên tiếp là mã 10 và mã 13, sẽ gom lại
thành một ký tự là mã 10.
Lê Hoàng Sơn 5/24
Một số hàm xuất/ nhập chuẩn
Mở file: Nếu thành công trả về kết quả là con trỏ FILE tương ứng
với file vừa mở, ngược lại trả về giá trị NULL.
FILE *fopen(const char *tên_tập_tin,const char *kiểu_truy_cập);
Đóng file: Ðóng tập tin được chỉ đến bởi con trỏ f. Nếu thành công
thì giá trị của hàm = 0 ngược lại có giá trị EOF. Sau khi đóng con
trỏ f sẽ không còn trỏ đến file trước đó nữa
int fclose(FILE *f)
Làm sạch vùng đệm của tập tin được chỉ đến bởi con trỏ f. Nếu
thành công cho giá trị 0, ngược lại cho giá trị EOF
int fflush(FILE *f)
Xóa một tập tin trên đĩa: Nếu thành công giá trị của hàm bằng 0 ,
ngược lại cho giá trị EOF
int unlink(const char *tên_tập_tin)
Lê Hoàng Sơn 6/24
Một số hàm xuất/ nhập chuẩn (P2)
Ðổi tên một tập tin trên đĩa: Nếu thành công giá trị của hàm
bằng 0 , ngược lại cho giá trị EOF
int rename(const char *tên_cũ,const char *tên_mới)
Kiểm tra kết thúc tập tin: Cho giá trị khác không nếu ở cuối
tập tin, ngược lại =0
int feof(FILE *f)
Ghi dữ liệu theo khuôn dạng: dữ liệu sẽ được ghi lên file
int fprintf(FILE *f , const char *đặc tả,....)
Ðọc dữ liệu theo khuôn dạng: dữ liệu sẽ được đọc từ File f
rồi đưa vào các đối số tương ứng
fscanf(FILE *f , const char *đặc tả,....)
Lê Hoàng Sơn 7/24
Một số hàm xuất/ nhập chuẩn (P3)
Ghi một chuỗi: Ghi một chuỗi được chỉ tới bởi con trỏ s
vào file f. Kết quả = ký tự cuối được ghi nếu thành công,
ngược lại =EOF
int fputs(const char *s, FILE *f)
Ðọc một chuỗi: Ðọc một chuỗi từ File f và đưa vào
vùng nhớ do s trỏ đến. Việc đọc kết thúc khi đã đọc
được n-1 ký tự , hoặc gặp ký tự xuống dòng , hoặc gặp
ký tự kết thúc File. Nếu việc đọc có lỗi kết quả của hàm
=NULL
char *fgets(const char *s, int n, FILE *f)
Ðưa con trỏ về đầu file:
void rewind ( FILE *f);
Lê Hoàng Sơn 8/24
Nhập danh sách sinh viên từ file và in ra file khác
sinh viên có điểm lớn nhất
#include
#include
#include
struct sinhvien {
int masv;
char hoten[30];
float diem;
};
FILE *fi, *fo; sinhvien *sv; int n;
int mofile(char *filein, char *fileout) {
fi = fopen (filein,"r"); rewind(fi);
fo = fopen (fileout,"w"); rewind(fo);
if ( (fi == NULL) || (fo == NULL) ) return 0;
return 1;
}
Con trỏ đến file input và output
Cấu trúc sinh viên
Mở input để đọc và output để ghi
Lê Hoàng Sơn 9/24
Nhập danh sách sinh viên từ file và in ra file khác
sinh viên có điểm lớn nhất (P2)
int dongfile() {
fclose(fi); fflush(fi);
fclose(fo); fflush(fo);
}
void docdulieu() {
int i = 0;
fscanf (fi, "%d", &n);
sv =(sinhvien *) calloc(n,sizeof(sinhvien));
while (!feof(fi)) {
fscanf (fi, "%d", &sv[i].masv);
fgets(sv[i].hoten,30,fi);
fscanf (fi, "%f", &sv[i].diem);
i++;
}
}
Đọc số sinh viên và ghi vào n
Nhập từng dòng dữ liệu
Lê Hoàng Sơn 10/24
Nhập danh sách sinh viên từ file và in ra file khác
sinh viên có điểm lớn nhất (P3)
void indanhsach() {
int i;
puts("Danh sach sinh vien:");
puts("MaSV\tHo va ten\tDiem");
for (i=0; i<n; i++)
printf("\n%d\t%s\t%5.1f",sv[i].masv,sv[i].hoten,sv[i].diem);
}
int timsinhvien() {
float max = 0; int vitri,i;
for (i=0; i<n; i++)
if(sv[i].diem >= max) {
max = sv[i].diem;
vitri = i;
}
return vitri;
}
Tìm sinh viên có điểm lớn nhất
In danh sách sinh viên ra
màn hình
Lưu thứ tự sinh viên vào vitri
Lê Hoàng Sơn 11/24
Nhập danh sách sinh viên từ file và in ra file khác
sinh viên có điểm lớn nhất (P4)
void inraoutput(int i) {
fprintf(fo,"\n%d\t\t%s\t\t%5.3f",sv[i].masv,sv[i].hoten,sv[i].diem);
}
int main() {
mofile("danhsach.inp", "danhsach.out");
docdulieu();
indanhsach();
inraoutput( timsinhvien() );
dongfile();
printf("\n\nSinh vien co diem lon nhat trong file danhsach.out !");
getch();
}
Chương trình chính
In sinh viên có điểm lớn
nhất vào file output
Lê Hoàng Sơn 12/24
Kết quả
Lê Hoàng Sơn 13/24
Nội dung chính
Kiểu Tập Tin 1
Nâng Cao Về C 2
Bài tập 3
Lê Hoàng Sơn 14/24
Đo thời gian chạy của chương trình
# include
# include
# include
int main() {
float max, min, tam;
clock_t t1,t2;
t1=clock();
printf("\nNhap vao so max, min: "); scanf("%f%f", &max, &min);
if (max < min) {
tam = max; max = min; min = tam;
}
printf("\nMax = %5.3f Min = %5.3f", max, min);
t2=clock();
float diff = ((float)t2 - (float)t1) / CLOCKS_PER_SEC;
printf("\nThoi gian chay chuong trinh la: %5.3f giay", diff);
getch(); return 0;}
Đo thời gian chạy
Biến thời gian
Lê Hoàng Sơn 15/24
Kết quả
Lê Hoàng Sơn 16/24
Kiểm tra đoạn nhập vào là số hay xâu?
#include #include #include
#include #include
int isNumber(const char str[]){
char *ok; strtod(str,&ok);
return !isspace(*str) && strlen(ok)==0;
}
int main(){
char mang[14][15] = {"00100" ,"-00200","+030","-040.30",
"-000.35"," 50","50 ","char","200.003-",".-","-",
".","+1.234E-05","-6.789E+10"};
for(int i=0; i<14; i++){
printf("%s:\t\t\t", mang[i]);
if(isNumber(mang[i])) printf("la so!\n");
else printf("khong phai la so!\n");
}
getch(); return 0; }
Kiểm tra các phần tử
Kiểm tra có phải là số
Lê Hoàng Sơn 17/24
Kết quả
Lê Hoàng Sơn 18/24
Chuyển xâu thành số
#include
#include
#include
int main ()
{
int i;
char xau [256];
printf ("\nNhap vao mot so: ");
fgets ( xau, 256, stdin );
i = atoi (xau);
printf ("\nXau nhap vao la: %s\nSo la: %d",xau,i);
getch();
return 0;
}
Chuyển xâu thành số
Lê Hoàng Sơn 19/24
Kết quả
Lê Hoàng Sơn 20/24
Tóm tắt bài học
Kiểu tập tin
Kiểu xuất/nhập tập tin
Một số hàm xuất/ nhập chuẩn
Một số ví dụ nâng cao
Đo thời gian chạy chương trình
Kiểm tra đoạn nhập vào là số hay xâu?
Chuyển xâu thành số
Lê Hoàng Sơn 21/24
Câu hỏi thảo luận
Lê Hoàng Sơn 22/24
Nội dung chính
Kiểu Tập Tin 1
Nâng Cao Về C 2
Bài tập 3
Lê Hoàng Sơn 23/24
Bài tập
1. Đối với danh sách sinh viên trong ví dụ 1, hãy in ra file
output danh sách sinh viên mới sắp xếp theo thứ tự
alphabet của họ tên
2. Cho bai2.inp như sau:
- Dòng đầu là chỉ số hàng
và cột của ma trận
- Các dòng sau là phần tử
ma trận
Ghi vào file bai2.out:
a) Dòng đầu: Số phần tử dương
b) Dòng thứ hai: Số phần tử âm
c) Dòng thứ ba: Số phần tử bằng 0
Lập trình tính toán khoa học kỹ thuật
C l i c k t o e d i t c o m p a n y s l o g a n .
Lê Hoàng Sơn
Các file đính kèm theo tài liệu này:
- bai_giang_thcs3_7_6947_2047003.pdf