PHẦN 1 LƯU ĐỒ thuật toáN (flowchart)


GHI TẬP TIN 1) fprintf(, [, ])



tải về 0.58 Mb.
trang5/6
Chuyển đổi dữ liệu23.07.2016
Kích0.58 Mb.
#2411
1   2   3   4   5   6

GHI TẬP TIN

1) fprintf(, <định dạng>[, ]) : Ghi dữ liệu theo một định dạng nào đó vào tập tin.



fprintf(f,“%d”,x);

2) fputs(, ) : Ghi một chuỗi ký tự vào tập tin đang mở.



fputs(“Giao trinh BT”, f);

• Tập tin nhị phân



ĐỌC TẬP TIN

fread(<&ptr>, , , )

• ptr: vùng nhớ để lưu dữ liệu đọc.

• size: kích thước mỗi ô nhớ (tính bằng byte).

• len: độ dài dữ liệu cần đọc.

• FILE: đọc từ tập tin nhị phân nào.

int a[30], b, n;

fread(a,sizeof(int), n , f);

Fread(&b,sizeof(int), 1 , f);

GHI TẬP TIN

fwrite(<&prt>, , , ) (Tham số tương tự như hàm fread)

fwrite(a,sizeof(int), n , f);

d. Đóng tập tin

Sau khi không còn làm việc với tập tin, để đảm bảo an toàn cho dữ liệu thì nhất thiết ta phải đóng tập tin lại.



fclose ( < biến con trỏ tập tin > ) ; hoặc fcloseall () ;

Ví dụ : fclose (f) ;

e. Các thao tác khác trên tập tin

* Xoá tập tin :

remove ( < đường dẫn tập tin> );

* Đổi tên tập tin :

rename ( < tên tập tin cũ >, < tên tập tin mới > );



* Di chuyển con trỏ tập tin :

fseek ( < FILE * >, < độ dời >, < mốc > );

Các mốc :

SEEK_SET dời dến đầu tập tin (giá trị 0).

SEEK_END dời đến cuới tập tin (giá trị 2).

SEEK_CUR dời vị trí hiện hành (giá trị 1).

Ví dụ :

feek ( f , +5 , SEEK_CUR ); // dời vị trí hiện hành về cuối 5 bytes

feek ( f, -4 , SEEK_CUR ); // dời vị trí hiện hành về trước 4 bytes

* Cho biết vị trí con trỏ file:

ftell ( < FILE * > );



Ví dụ :

int size = ftell ( f ); //size: khoảng cách từ đầu tập tin đến vị trí hiện hành (tính bằng byte)

I.3. Các ví dụ minh hoạ

a. Tập tin văn bản

Ví dụ 1: Viết chương trình tạo tập tin văn bản SO.OUT gồm n số nguyên, các số của dãy được tạo ngẫu nhiên có giá trị tuyệt đối không vượt quá M ( n, M đọc từ tập tin SO.INP). Kết quả chương trình là 1 tập tin văn bản có dòng thứ nhất ghi số n; n dòng tiếp theo ghi các số tạo được, mỗi số trên một dòng.



# include < conio.h >

# include < stdio.h >

# define in “SO.INP”

# define out “SO.OUT”
int n, M ;
void Nhap ()

{

FILE *fi;

fi = fopen ( in , “rt” );

fscanf ( fi, “ %d %d ”, &n, &M );

fclose ( fi );

}
void Xuat ()

{

FILE *fo;

fo = fopen ( out , “ wt ” );

fprintf ( fo , “ %d\n”, n );

for ( ; n > 0 ; n -- ) // vòng lặp không có giá trị gán ban đầu

fprintf ( fo , “%d\n” , random ( ( 2 * M + 1 ) - M ) );

fclose ( fo );

}
void main ()

{

clrscr ( );

Nhap ( );

Xuat ( );

getch();

}

Ví dụ 2: Viết chương trình phát sinh ngẫu nhiên ma trận a kích thước 5x6,lưu ma trận này vào file test.inp. Đọc lại file test.inp đưa dữ liệu vào ma trận b và xuất ra màn hình xem kết quả lưu đúng không? Cấu trúc của file test.inp như sau:

- Dòng đầu lưu 2 số nguyên: m, n thể hiện số dòng và số cột của ma trận.

- m dòng tiếp theo, mỗi dòng gồm n phần tử là giá trị các phần tử trên 1 dòng của ma trận.

#include

#include

#include

#define MAX 100

#define dl "test.inp"
void LuuFile(int a[MAX][MAX], int m, int n)

{

FILE *f;

f=fopen(dl, "wt");

if(f==NULL)

{

printf("\nKhong tao duoc file.");

getch();

exit(0);

}

fprintf(f, "%d %d\n", m, n);

for(int i=0; i

{

for(int j=0; j

fprintf(f, "%d\t", a[i][j]);

fprintf(f, "\n");

}

fclose(f);

}
void DocFile(int a[MAX][MAX], int &m, int &n)

{

FILE *f;

f=fopen(dl, "rt");

if(f==NULL)

{

printf("\nKhong doc duoc file.");

getch();

exit(0);

}

fscanf(f, "%d%d", &m, &n);

for(int i=0; i

{

for(int j=0; j

fscanf(f, "%d", &a[i][j]);

}

fclose(f);

}
void main()

{

int a[MAX][MAX], m=5, n=6, i, j;

int b[MAX][MAX], x, y;

for(i=0; i

for(j=0; j

a[i][j]=random(1000);

LuuFile(a, m, n);

DocFile(b, x, y);

for(i=0; i

{

for(j=0; j

printf("%d\t", b[i][j]);

printf("\n");

}

}

Kết quả ví dụ sau khi chạy chương trình, file test.inp có dạng sau:

5 6

480 661 395 736 998 987



31 414 211 801 774 416

166 191 454 830 508 72

121 382 35 365 567 726

159 309 1 275 870 378



b. Tập tin nhị phân

Viết hàm đọc/ ghi một danh sách sinh viên của một lớp vào tập tin SV.DAT



SINHVIEN ds[100];

int siso;
void nhap ( )

{

FILE *fi;

fi = fopen ( “SV.DAT” , “ rb” );

fseek ( fi , 0 , SEEK_END );

siso = ( ftell ( fi ) + 1 ) / sizeof ( SINHVIEN );

fseek ( fi , 0 , SEEK_SET );

fread ( ds , sizeof ( SINHVIEN ) , siso , fi );

fclose ( fi );

}
void xuat ( )

{

FILE *fo;

fo = fopen ( “SV.DAT”, “ wb” );

fwrite ( ds , sizeof ( SINHVIEN ) , siso , fo );

fclose ( fo );

}

II. BÀI TẬP

II.1. Bài tập cơ bản

1. Viết chương trình tạo tập tin văn bản chứa 1 dãy số nguyên bất kỳ.

2. Viết chương trình tạo tập tin nhị phân chứa 10000 số nguyên bất kỳ ghi vào file SONGUYEN.INP. Mỗi dòng 10 số, sau đó viết chương trình đọc file SONGUYEN.INP, sắp xếp theo thứ tự tăng dần và lưu kết quả vào file SONGUYEN.OUT.

3. Viết chương trình tạo một file chứa 10000 số nguyên ngẫu nhiên đôi một khác nhau trong phạm vi từ 1 đến 32767 và đặt tên là “SONGUYEN.INP”.

4. Viết chương trình tạo một file chứa các số nguyên có tên SONGUYEN.INP. Sau đó đọc file SONGUYEN.INP và ghi các số chẵn vào file SOCHAN.OUT và những số lẻ vào file SOLE.OUT.

5. Viết chương trình ghi vào tập tin SOCHAN.DAT các số nguyên chẵn từ 0 đến 100.

6. Viết chương trình đọc tập tin SOCHAN.DAT và xuất ra màn hình, mỗi dòng 30 số.

7. Viết chương trình giả lập lệnh COPY CON để tạo tập tin văn bản. Khi kết thúc tập tin nhấn phím F6 để lưu.

8. Viết chương trình giả lập lệnh TYPE để in nội dung của tập tin văn bản ra màn hình.

9. Viết chương trình kiểm tra tập tin nào đó có trong thư mục được chỉ định hay không?

10. Viết chương trình giả lập lệnh DEL để xoá tập tin. Yêu cầu nhập đường dẫn và tên tập tin, kiểm tra sự tồn tại của tập tin, nếu có thì xoá tập tin được chỉ định.

11. Viết chương trình giả lập lệnh RENAME để đổi tên một tập tin.

12. Viết chương trình tạo file văn bản có tên là “MATRIX.INP” có cấu trúc như sau:

• Dòng đầu ghi hai số m, n.

• Trong m dòng tiếp theo mỗi dòng ghi n số và các số các nhau một khoảng cách.

Hãy kiểm tra xem trong file đó có bao nhiêu số nguyên tố. Kết quả cần ghi vào file “MATRIX.OUT” có nội dung là một số nguyên đó là số lượng các số nguyên tố trong file “MATRIX.INP”.

13. Cho số nguyên n, hãy in tam giác PASCAL gồm n dòng

Dữ lệu vào: tập tin văn bản PAS.INP gồm 1 dòng chứa giá trị n.

Kết quả: đưa ra tập tin văn bản PAS.OUT thể hiện một tam giác PASCAL n dòng.

14. Cho mảng các số nguyên , hãy sắp xếp mảng theo thứ tự tăng dần.

Dữ liệu vào : tập tin văn bản ARRAY.INP gồm 2 dòng

- Dòng 1 chứa số nguyên n ( n < = 100 ).

- Dòng 2 chứa n số nguyên.

Kết quả : Đưa ra tập tin văn bản ARRAY.OUT gồm hai dòng

- Dòng 1 chứa n phần tử của mảng các số nguyên.

- Dòng 2 chứa n số nguyên được xếp tăng dần.

15. Cho mảng các số nguyên, tìm phần tử lớn nhất của mảng.

Dữ liệu vào: tập tin văn bản ARRAY.INP gồm hai dòng:

- Dòng 1 chứa số nguyên n ( n < = 100 ).

- Dòng 2 chứa n số nguyên.

Kết quả: Đưa ra tập tin văn bản ARRAY.OUT gồm 1 dòng ghi 2 giá trị x, y trong đó x là giá trị lớn nhất, y là vị trí của x trong mảng.

II.2. Bài tập luyện tập và nâng cao

16. Cho mảng các số nguyên, tính tổng các phần tử của mảng.

Dữ liệu vào : tập tin văn bản ARRAY.INP gồm hai dòng

- Dòng 1 chứa số nguyên n ( n < = 10 )

- Dòng 2 chứa n số nguyên

Kết quả: Đưa ra tập tin văn bản ARRAY.OUT gồm 1 dòng ghi tổng các phần tử trong mảng

17. Cho mảng các số nguyên, hãy liệt kê các phần tử là số nguyên tố

Dữ liệu vào : tập tin văn bản NT.INP gồm hai dòng

- Dòng 1 chứa số nguyên n ( n < = 100)

- Dòng 2 chứa n số nguyên

Kết quả : đưa ra tập tin văn bản NT.OUT gồm hai dòng:

- Dòng 1 chứa số lượng các phần tử nguyên tố trong mảng.

- Dòng 2 liệt kê các số nguyên tố đó.

18. (*) Tạo file văn bản có tên là “INPUT.TXT” có cấu trúc như sau:

- Dòng đầu tiên ghi N (N là số nguyên dương nhập từ bàn phím).

- Trong các dòng tiếp theo ghi N số nguyên ngẫu nhiên trong phạm vi từ 0 đến 100, mỗi dòng 10 số (các số cách nhau ít nhất một khoảng trắng).

Hãy đọc dữ liệu của file “INPUT.TXT” và lưu vào mảng một chiều A.

Thực hiện các công việc sau :

• Tìm giá trị lớn nhất của mảng A.

• Đếm số lượng số chẵn, số lượng số lẻ của mảng A.

• Hãy sắp xếp các phần tử theo thứ tự tăng dần.

Hãy ghi các kết quả vào file văn bản có tên OUTPUT.TXT theo mẫu sau:



19. (*) Viết chương trình nhập và lưu hồ sơ của sinh viên vào một file có tên là “DSSV.TXT”. Sau đó đọc file “DSSV.TXT” và cất vào mảng, hãy sắp xếp các hồ sơ sinh viên theo thứ tự giảm dần theo điểm trung bình môn học rồi in ra màn hình hồ sơ các sinh viên theo thứ tự đó ra màn hình có thông tin như sau :

Mã số sinh viên.

Họ và tên sinh viên.

Điểm trung bình kiểm tra.

Điểm thi hết môn.

Điểm trung bình môn học (tính bằng (điểm TBKT+điểm thi)/2).

20. (*) Tạo một file text có tên là “INPUT.TXT” có cấu trúc như sau :

- Dòng đầu tiên ghi hai số M và N (M,N là hai số nguyên dương nhập từ bàn phím).

- Trong M dòng tiếp theo mỗi dòng ghi N số nguyên ngẫu nhiên trong phạm vi từ 0 đến 100 (các số này cách nhau ít nhất một khoảng trắng).

Hãy đọc dữ liệu từ file trên và lưu vào mảng hai chiều. Rồi thực hiện các công việc sau:

• Tìm giá trị lớn nhất của ma trận.

• Đếm số lượng số chẵn , lẽ, nguyên tố có trong ma trận.

• Hãy tính tổng các phần tử trên mỗi dòng của ma trận.

Hãy ghi kết quả này vào filetext có tên là “OUTPUT.TXT”

21. (**) Xét dãy số a1, a2, …, aN. Một đoạn con của dãy là dãy các phần tử liên tiếp nhau được xác định bởi chỉ số của số bắt đầu (L) và chỉ số của số cuối cùng (R).Tổng các số trên đoạn được gọi là tổng đoạn.

Yêu cầu : Cho dãy ( aN ), hãy tìm đoạn con có tổng đoạn lớn nhất (T)

Dữ liêu được cho trong tập tin văn bản SUMMAX.INP

- Dòng thứ nhất chứ số nguyên N ( 0 < N <= 30000 )

- N dòng tiếp theo, mỗi dòng chứa một số là các số của dãy đã cho theo đúng thứ tự. Giá trị tuyệt đối của mội số không vượt quá 30000

Kết quả tìm được ghi vào tập tin văn bản SUMMAX.OUT gồm 1 dòng ghi 3 số T, L, R.

Ví dụ :

22. (*) Cho dãy ( aN ), hãy tìm đoạn con tăng dần có tổng lớn nhất

Dữ liệu : được cho trong tập tin AMAX.INP

- Dòng 1 chứa số nguyên N ( 0 < N <= 30000 ).

- N dòng tiếp theo, mỗi dòng chứa một số là các số của dãy đãy cho theo đúng thứ tụ. Giá trị tuyệt đối của mỗi số không vược quá 30000.

Kết quả tìm được ghi vàp tin văn bản AMAX.OUT gồm hai dòng:

- Dòng 1 ghi tổng của dãy con.

- Dòng 2 ghi mảng con tăng dần có tổng lớn nhất.

23. Viết chương trình nhập lý lịch một nhân viên vào danh sách các nhân viên. Khi không nhập nữa bấm phím Esc và ghi vào tập tin NHANVIEN.DAT sau đó :

• Đọc từ tập tin NHANVIEN.DAT vừa tạo và in danh sách các nhân viên lên màn hình.

• Tìm và in lý lịch một nhân viên bằng các nhập và họ tên hoặc mã số nhân viên.

24. (**) Để lắp ráp một máy vi tính hoàn chỉnh cần phải có tối thiểu 10 linh kiện loại A và có thể lắp bổ sung thêm vào khoảng tối đa 8 linh kiện loại B. Tại một cửa hàng vi tính cần quản lý bán hàng các loại linh kiện tại cửa hàng. Thông tin về một loại linh kiện gồm có: Tên linh kiện, quy cách , loại, đơn giá loại 1 ( chất lượng tốt – số nguyên), đơn giá loại 2 ( chất lượng thường – số nguyên ). Viết chương trình thực hiện những công việc sau :

• Nhập vào thông tin của các loại linh kiện có ở cửa hàng. Xuất danh sách các linh kiện đã nhập theo thứ tự tăng dần của loại linh kiện và tên linh kiện. Cho biết đã có đủ 10 linh kiện loại A cần thiết để lắp ráp máy tính hay chưa?

• Với giả định là cửa hàng đã có đủ 10 linh kiện loại A để lắp ráp máy. Nhập vào một số tiền để lắp ráp một máy tính. Có thể lắp được một máy tính hoàn chỉnh với các linh kiện toàn bộ theo đơn giá loại 1 hay đơn giá loại 2 hay không? Nếu số tiền trong khoảng giữa thì hãy tìm 1 phương án gồm những linh kiện theo đơn giá 1 và linh kiện theo đơn giá 2 để lắp?

• Tất cả dữ liệu phải lưu ở tập tin.

PHỤ LỤC

HƯỚNG DẪN VIẾT CHƯƠNG TRÌNH

TRÊN MÔI TRƯỜNG BORLAND C++ 3.1 (BC31)

I. CÀI ĐẶT BC3.1

�� Vào thư mục BC3.1 trên đĩa CD chạy file install.exe.



�� Nhấn Enter.



�� Gõ vào ổ chứa thư mục nguồn chứa BC3.1 (Ví dụ trên:Giả sử ổ đĩa chứa thư mục BC3.1 trên đĩa CD là D:)  Nhấn Enter.



�� Enter tiếp (có thể gõ lại đường dẫn chứa BC3.1 nếu bước trên gõ sai).



�� Chọn đường dẫn và tên thư mục cần cài đặt BC3.1 lên đĩa cứng.

Ví dụ: Cần cài BC3.1 lên ổ đĩa C: tên thư mục là BC31.

- Để thay đổi thư mục và ổ đĩa cài đặt  di chuyển vệt sáng (dùng phím mũi tên ) đến dòng Directories … như hình trên  sau đó nhấn Enter.



- Nhấn tiếp Enter.



- Gõ tên ổ đĩa và tên thư mục cần cài đặt trong textbox �� Enter.

- Sau đó nhấn ESC.

- Tiếp tục nhấn phím ESC.



- Tiếp theo kiểm tra xem thư mục cài Windows có đúng đường dẫn như dòng Windows Dir hay không (dòng thứ 2). Nếu không đúng thì thay đổi thư mục cho đúng, di chuyển vệt sáng đến đó, thao tác tương tự như thay đổi thư mục BC3.1.

- Thường thì không cần thay đổi vì các máy có cài Windows mặc định là C:\Windows.

- Di chuyển vệt sáng đến dòng Start Installation nhấn Enter bắt đầu quá trình cài đặt.





Luu ý: Ở bước này chỉ thay đổi thư mục cài đặt BC3.1, thư mục Windows (nếu có) còn những mục khác không thay đổi.

�� Quá trình cài đặt đang thực hiện.



�� Nếu trong quá trình cài đặt gập thông báo sau:



Nhấn phím C để tiếp tục.



Quá trình cài đặt hoàn tất, nhấn phím ESC cho đến khi mất màn hình cài đặt.

�� Tạo một thư mục để lưu bài tập, chẳng hạn D:\BaiTap để làm thư mục làm việc của C, trong quá trình làm bài hay biên dịch chạy chương trình thì tất cả các file đó đều nằm trong thư mục BaiTap cho dễ quản lý.

�� Tạo Shortcut Borland C++3.1 (File bc.exe trong thư mục BIN của thư mục BC31 vừa cài đặt)  Chọn Properties  Chọn Tab Program gõ vào mục Cmd line và Working giống như hình sau nếu cài đặt BC3.1 trên ổ đĩa C:\BC3.1. Nhấn OK.

- Cmd line (đường dẫn đến file chạy BC): C:\BC3.1\BIN\BC.EXE.

- Working (thư mục mới vừa tạo để lưu bài làm ): D:\Bai tap



Lưu ý: Đúng đường dẫn thư mục.



II. CÁC BƯỚC VIẾT CHƯƠNG TRÌNH

a. Chuẩn bị viết chương trình

• Khởi động BC3.1



• Vào menu Options\Environment\Editor chỉnh lại Tab size là 4.





b. Các phím chức năng chính

• F3: Mở file chương trình có sẵn.

• F2: Lưu file

Lưu ý : Chọn đường dẫn và đặt tên file cho đúng. Tên có tối đa 8 ký tự, phần đuôi không cần nhập vào (mặc định là *.cpp).

• F5: Phóng to hoặc trở về kích thước bình thường của cửa sổ soạn thảo.

• F6: Chuyển qua lại các cửa sổ soạn thảo (nếu mở nhiều cửa sổ).

• F9: Biên dịch chương trình. Mục đích là kiểm tra lỗi chương trình.

• Ctr+F9: Thực thi chương trình (Run) khi chương trình không có lỗi.

• Alt+F5: Xem lại màn hình kết quả chương trình đã chạy trước đó.



c. Biên dịch và sửa lỗi

• Sau khi soạn thảo xong chương trình nhấn F2 đặt tên chương trình, để đảm bảo chương trình có thể thực thi được, ta phải nhấn F9 để biên dịch.

• Nếu không có lỗi, ta có thể nhấn Ctr+F9 để thực thi chương trình.

• Nếu máy bị loop nhấn Ctrl+Break+Enter để trở về màn hình soạn thảo.

• Ngược lại, ta cần phải sửa lỗi cho đến khi hết lỗi.

• Các bước thực hiện khi có lỗi:

i). Khi hiển thị màn hình báo lỗi, ta phải nhấn phím Enter để xuất hiện cửa sổ mô tả lỗi (không nhấn phím ESC).

ii). Sử dụng phím mũi tên lên xuống để duyệt lên xuống và xem mô tả lỗi. Khi di chuyển để ý quan sát vệt sáng bên trên khung cửa sổ soạn thảo chương trình. Thông thường vệt sáng sẽ cho biết vị trí lỗi (có thể ngay chính tại dòng có lỗi hoặc trên hoặc dưới một dòng). Có nhiều cách sửa lỗi, nhưng để đơn giản chúng ta nên sửa lỗi từ trên xuống.



d. Một số lỗi thường gặp

LỖI CÚ PHÁP

1) Statement missing ; : Thiếu dấu; khi kết thúc 1 lệnh  Bổ sung thêm dấu ; vào sau

khai báo biến hay kết thúc một lệnh.

Sai:

int a


scanf(“%d”,&a)

Sửa thành:

int a;


scanf(“%d”,&a)

2) Compound statement missing } : Thiếu dấu } khi kết thúc khối lệnh hay làm  Bổ sung thêm dấu } vào tương ứng

Sai :

void main()

{

int a;


scanf(“%d”,&a);

if(a>0)


printf(“Duong”);
Sửa thành:

void main()

{

int a;


scanf(“%d”,&a);

if(a>0)


printf(“Duong”);

}

3) Unexpected } : Thiếu dấu { khi bắt đầu khối lệnh, hàm hay dư dấu }  Kiểm tra xem có

dư dấu } hoặc thiếu dấu { và sửa tương ứng.



Sai :

void main()

{

int a;


scanf(“%d”,&a);

if(a>0)


printf(“Duong”);

}

}



Sửa thành:

void main()

{

int a;


scanf(“%d”,&a);

if(a>0)


printf(“Duong”);

}

4) Misplaced else : Chấm phẩy sau phát biểu if hoặc khối lệnh thực hiện trong phát biểu if chưa đặt trong cặp dấu ngoặc {}


Sai :

if (a%2);

printf(“a le”);

else


if(a>10)

printf(“a chan”);

printf(“, > 10”);

else


printf(“a < 10”);

Sửa thành:

if (a%2)


printf(“a le”);

else


if(a>10)

{

printf(“a chan ”);



printf(“, > 10”);

}

else



printf(“a < 10”);

5) For statement missing ; : Thiếu thành phần trong cú pháp của vòng lập for hoặc quên dùng dấu chấm phẩy (;) để ngăn cách các thành phần , … ( Phải có đủ 2 dấu chấm phẩy)  Kiển tra cho đúng cú pháp: for(; ; ) Trong biểu thức gán hay nhiều thành phần thì mỗiphần cách nhau bởi dấu phẩy (,)



tải về 0.58 Mb.

Chia sẻ với bạn bè của bạn:
1   2   3   4   5   6




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương