hoa đầu từ bằng hàm Doi_Dau_Tu(). Xuất ra màn hình chuỗi trước và sau khi gọi hàm.
Hướng dẫn: trước hết cần chèn ký tự trống ‘ ‘ vào phía trước chuỗi st để quy luật được áp dụng cho cả chuỗi
sử dụng hàm for cho biến i chạy với điều kiện i+1<=len(st)-1 và thực hiện: Kiểm tra nếu st[i]=’ ‘ và st[i+1]!=’ ‘ thì
Chuyển st[i+1] thành chữ hoa bằng hàm toupper()
2) Viết chương trình nhập vào một chuỗi và một từ. Cho biết từ đó xuất hiện trong chuỗi bao nhiêu lần?
Hướng dẫn: gọi chuỗi nhập vào làstr và từ cần tìm là tu. Để tìm cần phải sử dụng hàm tìm kiếm chuỗi strstr(str,tu). Tuy nhiên, có thể từ tu xuất hiện nhiều lần trong chuỗi nhưng do hàm strstr() chỉ trả về vị trí đầu tiên của chuỗi. Chính vì vậy, cần phải dùng vòng lặp while/do…while với điều kiện strstr(str,tu)!=NULL thì tiếp tục tìm, đồng thời sau khi tìm được thì chuỗi str phải được cắt bớt phần từtu.
Ví dụ: char str[80]=”chao co chao thay chao chu chao bac chaochaochao”,tu[4]=”chao”; //như vậy, số lần xuất hiện của từ “chao” trong chuỗi str là 7 lần.
//nhưng dùng hàm strstr(str,tu) thì chỉ tìm thấy vị trí đầu tiên. Chính vì vậy, sau khi tìm xong //một từ thì cần phải cắt bỏ phần từ vừa tìm được trong str, cụ thể là str=” co chao thay chao //chu chao bac” bằng cách đặt ký tự kết thúc xâu ‘\0’ ở vị trí thích hợp
#include<stdio.h> #include<conio.h> #include<string.h> void main() { char str[80],tu[4],tam[80]; int dem=0,n; clrscr();
printf("Nhap vao chuoi ky tu : ");gets(str); printf("\nNhap vao tu can tim : ");gets(tu); n=strlen(tu);
while(strstr(tam,tu)!=NULL) { dem++; strcpy(tam,strstr(tam,tu)); //tam[strlen(tam)]='\0'; strrev(tam); tam[strlen(tam)-n]='\0'; strrev(tam); }
printf("\nTu %s xuat hien trong chuoi \"%s\" : %d lan",tu,str,dem); getch();
}
3) Viết chương trình nhập vào một chuỗi ký tự và kiểm tra xem chuỗi đó có đối xứng hay không?
BÀI THỰC HÀNH SỐ 4
(Chương VII: DỮ LIỆUTỰ ĐỊNH NGHĨA – DỮ LIỆU KIỂU CẤU TRÚC) Kiểu dữ liệu liệt kê: dùng từ khóa enum và không đọc/ghi trực tiếp các giá trị của nó.
Ví dụ: enum mausac{xanh,tim,vang,do,cam,luc};
enum mausac mau; //khai báo biến mau thuộc kiểu dữ liệu mausac đã định nghĩa ở trên if(mau==tim)
printf….
Định nghĩa kiểu: dùng từ khóa typedef
Ví dụ: typedef int songuyen; //tạo một kiểu dữ liệu mới có tên là songuyen giong kiểu dữ liệu int songuyen x;
Kiểu dữ liệu cấu trúc:có thể vừa định nghĩa vừa khai báo biến thuộc kiểu cấu trúc ngay phía sau dấu kết thúc }. Và từ khóa typedef có thể đặt trước struct hoặc không.
[typedef] struct tênkiểu {
//khai báo các thành phần của cấu trúc; }[biến];
Cặp dấu [ ] là có thể có hoặc không có thành phần này.
Ví dụ: typedef struct svien {
char hoten[40],quequan[40]; int namsinh;
};
svien sv;
1) Viết chương trình nhập vào một chuỗi ký tự và đếm số lần xuất hiện của mỗi loại ký tự.
Hướng dẫn: định nghĩa một kiểu dữ liệu cấu trúc có thành phần thứ nhất là kiểu ký tự và thành phần thứ hai là kiểu int chứa số lượng ký tự trong chuỗi, rồi khai báo một mảng các phần tử thuộc cấu trúc vừa định nghĩa như sau:
typedef struct KyTu_SoLuong {
char kt; int sluong; };
KyTu_SoLuong mang[100];
2) Viết chương trình nhập vào một danh sách các sinh viên, trong đó mỗi sinh viên cần nhập họ tên, quê quán, năm sinh và điểm toán – lý – hóa. Hãy tính và xuất ra danh sách sinh viên với điểm trung bình của mỗi sinh viên dưới dạng bảng danh sách.
Hướng dẫn: định nghĩa kiểu dữ liệu cấu trúc như sau: struct SinhVien { char hoten[40],quequan[40]; int namsinh; float toan,ly,hoa,dtb; }; SinhVien sv[100];
BÀI THỰC HÀNH SỐ 4
(Chương VIII: DỮ LIỆU KIỂU FILE)
Thông thường cần khai báo biến con trỏ kiểu file để dễ quản lý vùng nhớ của file với khai báo cụ thể như sau:
FILE *fp; (stdio.h)
Câu lệnh fflush: nếu đang ghi mà gặp hàm fflush thì mọi thông tin từ vùng đệm sẽ được đưa vào file và vùng đệm trở về trạng thái rỗng; ngược lại nếu đang đọc mà gặp hàm fflush thì vùng đệm cũng được làm rỗng.
Mã LF=10 (bao gồm 2 mã CR=13 và LF=10) ghi từ bộ nhớ ra file
Đọc từ file ra bộ nhớ thìđọc luôn 2 ký tự CR và LF nhưng bộ nhớ sẽ lọc ra và chỉ nhận ký tự LF
Khi đọc trên file, nếu gặp ký tự có mã 26 thì có nghĩa là kết thúc file (biểu thức cho biết kết thúc file là EOF=-1)
Các thao tác trên tập tin:
Khai báo biến tập tin (con trỏ tập tin)
Mở tập tin bằng hàm fopen()
Thực hiện các thao tác xử lý dữ liệu bằng các hàm đọc/ghi dữ liệu
Đóng tập tin bằnghàm fclose() Mở file: cú pháp như sau
Biếnfile = fopen(tênfile trên đĩa, kiểu xử lý file);
Trong đó, tênfile trên đĩa có thể là một hằng kiểu xâu hay một biến kiểu xâu ; kiểu xử lý file thuộc dạng sau Kiểu xử lý File văn bản File nhị phân Ý nghĩa “r” “rb” Mở file tồn tại để đọc “w” ”wb” Mở file mới để ghi
“a” “ab” Mở file đã có và ghi thêm dữ liệu tiếp nối vào cuối file này. Nếu file này chưa có thì một file mới sẽ được tạo ra. “r+” “r+b” Mở file đã có và cho phép cả ghi, cả đọc
“w+” “w+b” Mở filemới cho cả ghi và đọc.
“a+” “a+b” Mở file đã có hoặc tạo file mới để đọc và ghi thêm dữ liệu tiếp nối vào cuối file này hoặc đọc.
Nếu mở một file thành công thì biến con trỏ sẽ trả về giá trị khác NULL, ngược lại (không thành công) thì con trỏ nhận giá trị NULL.
Đóng file: cú pháp như sau
Mặc định, nếu kết thúc chương trình mà không đóng file thì file vẫn được đóng bởi hệ thống.
Ghi một ký tự lên file: File văn bản:
putc(char ch, FILE biếncontrỏ); fputc(char ch[30], FILE biếncontrỏ) ;
fprintf(FILE biếncontrỏ,…);
File nhị phân :
fwrite(&i,sizeof(int),1, biếncontrỏ);//ghi số nguyên vào file &i: địa chỉ của một khối dữ liệu, ở đây là địa chỉ của biến i
Tiếp theo là kích thước của khối dữ liệu cần ghi vào, ở đây do ta chỉ ghi 1 số nguyên nên kích thước của nó là sizeof(int)
Tiếp đến là số khối dữ liệu mà bạn cần ghi vào tệp, ở đây là 1 khối Cuối cùng là con trỏ cấu trúc tệp
fread(&i,sizeof(int),1,biếncontrỏ);
Lưu ý khi đọc file: kiểm tra xem có hết tệp chưa? Tức là phải khác feof(biếncontrỏ). Fseek(biếncontrỏ,No*kích_thước_1_phần_tử,SEEK_SET);
Đọc một ký tự từ file và lưu vào biến:
getc(biênfile); fgetc(str,biênfile);
fscanf();
Hàm feof(biến con trỏ) cho biết đã gặp ký tự kết thúc file hay chưa? Nếu trả về 0 thì chưa, còn trả về giá trị khác 0 (≠0) thì có nghĩa đã kết thúc file
Hàm với file văn bản:
fprintf, fscanf, fgets, fputs
fprintf(biếncontrỏ, chuỗi điều khiển, danh sách các tham số);
giống như printf nhưng đưa dữ liệu ra file.
fscanf(biếncontrỏ, chuỗi các đặc tả, danh sách địa chỉ các biến);
giống như scanf nhưng dữ liệu nhận từfile.
Con trỏ tập tin: khi một tập tin được mở ra để làm việc, tại mỗi thời điểm sẽ có một vị trí của tập tin mà tại đó việc đọc/ghi thông tin sẽ xảy ra (có nghĩa là có một con trỏ đang chỉ đến vị trí đó và đặt tên nó là con trỏ tập tin).
Bài tập:
1) Viết chương trình mở một tập tin văn bản tên VD_File.txt chứa trong ổ đĩa D để ghi nội dung vào tập tin này.
Hướng dẫn: đây là tập tin văn bản nên phải mở với chế độ “w”
#include<stdio.h> #include<conio.h> void main()
clrscr(); FILE *fpt;
char filename[50]="D:\\CDCNghe\\GT_CDCN\\GT_THanh\\LT_C\\VD_File.txt";
//fpt=fopen("D:\\CDCNghe\\GiaoTrinhCDCN\\GT_Thuchanh\\LT_C\\ViDuFile.txt","w"); //Lưu ý: Tên thư mục chứa không được đặt quá dài giống như dòng chú thích trên //Bởi vì nếu để đường dẫn như câu lệnh trên thì sẽ không thực thi được!!!
fpt=fopen(filename,"w"); if(fpt==NULL)
printf("\n Error - Khong mo duoc tep!!!"); else { char c; do putc(c=getchar(),fpt); while(c!='\n');
//Ghi cho đến khi gõ vào phím Enter. fclose(fpt);
}
//getch(); Không cần hàm getch() vì gặp phím Enter là chương trình đã thoát rồi }
2) Viết chương trình mở một tập tin văn bản tên VD_File.txt chứa trong ổ đĩa D để ghi nội dung vào tập tin này.
Hướng dẫn: đây là tập tin văn bản nên phải mở với chế độ “w+b” hoặc “wb”
#include<stdio.h> #include<conio.h> void main() { char filename[50]="D:\\CDCNghe\\GT_CDCN\\GT_THanh\\LT_C\\File_NhiPhan.dat"; FILE *fpt; int i; clrscr(); fpt=fopen(filename,"w+b"); if(fpt==NULL)
printf("\nError - Khong mo duoc file!!!"); else
{
fwrite(&i,sizeof(int),1,fpt); fclose(fpt);
}
fpt=fopen(filename,"rb");
//Muốn ghi và đọc file trong cùng một chương trình thì phải đóng file trước khi mở để đọc //lại file đó //while(fread(&i,sizeof(int),1,fpt),!feof(fpt)) // printf(“\n%d”i); do { fread(&i,sizeof(int),1,fpt); if(!feof(fpt)) printf("\n%d",i); } while(!feof(fpt)); fclose(fpt); getch(); }