Bài 117: Viết chương trình cấp phát động cho mảng a có N phần tử, nhập vào giá trị
các phần tử và ghi ra file văn bản ma.txt thành 2 cột. Cột thứ nhất chứa chỉ số i và
cột thứ hai chứa giá trị của a[i]. Sắp xếp mảng theo thứ tự tăng dần rồi ghi vào file
văn bản mb.txt. Đọc dữ liệu từ 1 trong 2 file và in ra màn hình? (X)
#include
#include
268 trang |
Chia sẻ: chaien | Lượt xem: 2046 | Lượt tải: 3
Bạn đang xem trước 20 trang tài liệu Đồ án Lý thuyết và bài tập ngôn ngữ lập trình c, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ừ biến thứ nhất là HocSinh[0] đến biến
cuối cùng là HocSinh[n-1], nếu thành phần NamSinh của biến nào mà bằng y thì in ra màn hình
thành phần HoTen của biến đó cũng như tăng biến Dem lên 1 đơn vị.
Nếu thấy Dem = 0 thì xuất ra màn hình dòng chữ “Không tìm thấy thông tin”
d) Ở trong bài này mình sử dùng khá nhiều lệnh xóa bộ nhớ đệm bàn phím fflush(stdin). Nếu
không dùng lệnh này thì các kí tự đặc biệt sẽ lưu lại cho thông tin của biến HocSinh tiếp theo,
như thế kết quả sẽ không chính xác cũng như việc nhập không như ta mong muốn.
* Màn hình kết quả như sau:
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
219
Bài 113: Bài toán quản lý sinh viên:
- Nhập vào một danh sách sinh viên bao gồm các thông tin: Họ tên, điểm Toán,
điểm Tin học. Tính và thêm thông tin điểm trung bình vào danh sách sinh viên.
- Sắp xếp và in danh sách thông tin của sinh viên theo thứ tự điểm trung bình
giảm dần? (X)
#include
#include
#include
struct SinhVien {char HoTen[100];float DiemToan;float DiemTin; float
DiemTB;};
main()
{
int n,i,j;
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
220
struct SinhVien SV[100],TrungGian;
printf("\n Nhap vao so luong sinh vien: ");
scanf("%d",&n);
fflush(stdin);
printf(" Nhap vao thong tin cho tung sinh vien:\n");
for(i=0;i<n;i++)
{
printf(" Nhap thong tin cho sinh vien thu %d:\n",i+1);
printf("\tHo va Ten: ");gets(SV[i].HoTen);fflush(stdin);
printf("\tDiem Toan la: ");scanf("%f",&SV[i].DiemToan);
printf("\tDiem Tin la: ");scanf("%f",&SV[i].DiemTin);
SV[i].DiemTB=(SV[i].DiemToan+SV[i].DiemTin)/2;
fflush(stdin);
}
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(SV[i].DiemTB<SV[j].DiemTB)
{
TrungGian=SV[i];
SV[i]=SV[j];
SV[j]=TrungGian;
}
printf(" => Danh sach sinh vien theo thu tu diem trung binh giam dan
la:\n\n");
for(i=0;i<n;i++)
printf("\t%s\t%.1f\n",SV[i].HoTen,SV[i].DiemTB);
getch();
return main();
}
* Giải thích:
- Xây dựng một kiểu cấu trúc dạng SinhVien gồm 4 thành phần: HoTen có kiểu xâu kí tự;
DiemToan, DiemTin và DiemTB có kiểu số thực float. Trong chương trình chính, ta khai báo
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
221
một mảng gồm tối đa 100 biến SV có kiểu SinhVien. Thực hiện nhập vào số lượng biến SV cần
thiết và gán giá trị cho n.
a) Nhập vào các thành phần DiemToan và DiemTin cho từng biến SV[i] với giá trị i chạy từ 0
đến n – 1. Nhập xong thông tin của biến SV[i] nào thì tính luôn thành phần DiemTB của biến
SV[i] đó bằng cách lấy trung bình cộng của 2 thành phần vừa nhập.
b) Sắp xếp các biến SV[i] theo chiều có DiemTB giảm dần: Dùng 2 vòng for lồng nhau với
biến i chạy từ 0 đến n – 2 và biến j chạy từ i + 1 đến n – 1. Nếu biến SV[i] mà có DiemTB nhỏ
hơn DiemTB của biến SV[j] thì thực hiện đổi chỗ cho nhau nhờ biến TrungGian (thuật toán này
tương tự như thuật toán sắp xếp dãy số theo chiều giảm dần). Cuối cùng in kết quả ra màn hình
gồm 2 thành phần là HoTen và DiemTB của các biến SV[i].
* Màn hình kết quả như sau:
Bài 114: Bài toán quản lý thư viện:
- Nhập vào thông tin các sách trong thư viện: Tên sách, tác giả, thể loại, năm
xuất bản.
- In ra danh sách các sách thuộc thể loại văn học.
- Tìm kiếm sách của tác giả “Lê Lựu” xuất bản vào những năm 90’s.
#include
#include
#include
struct ThongTin {char TenSach[100];char TacGia[100];char TheLoai[100];int
NamXB;};
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
222
main()
{
int i,n;
struct ThongTin Sach[100];
printf("\n Nhap vao so luong sach: ");
scanf("%d",&n);
printf(" Nhap vao thong tin cho tung quyen sach:\n");
fflush(stdin);
for(i=0;i<n;i++)
{
printf(" Nhap thong tin cho quyen sach thu %d:\n",i+1);
printf("\tTen sach: ");gets(Sach[i].TenSach);fflush(stdin);
printf("\tTac gia: ");gets(Sach[i].TacGia);fflush(stdin);
printf("\tThe loai: ");gets(Sach[i].TheLoai);fflush(stdin);
printf("\tNam xuat ban: ");scanf("%d",&Sach[i].NamXB);
fflush(stdin);
}
printf("\n => Cac sach thuoc the loai van hoc la:\n\t");
for(i=0;i<n;i++)
if(strcmp(Sach[i].TheLoai,"Van hoc")==0)
printf("%s\n\t",Sach[i].TenSach);
printf("\n => Sach cua Le Luu xuat ban vao nhung nam 90's la:\n\t");
for(i=0;i<n;i++)
if(strcmp(Sach[i].TacGia,"Le
Luu")==0&&Sach[i].NamXB>=1990&&Sach[i].NamXB<=1999)
printf("%s\n\t",Sach[i].TenSach);
getch();
}
* Giải thích:
a) Khai báo một kiểu cấu trúc dạng ThongTin gồm 4 thành phần: TenSach, TacGia,
TheLoai có kiểu xâu kí tự và NamXB có kiểu số nguyên. Trong chương trình chính, ta khai báo
một mảng gồm tối đa 100 biến Sach có kiểu ThongTin và tùy chọn nhập vào số lượng sách cần
thiết theo ý muốn của mỗi người. Vòng lặp for với biến i chạy từ 0 đến n – 1 (n là số lượng sách).
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
223
Biến i chạy đến đầu thì truy cập tới từng thành phần của Sach[i] và nhập thông tin cho các thành
phần đó.
b) In ra các sách thuộc thể loại văn học: dùng hàm strcmp() để so sánh chuỗi kí tự "Van hoc"
với thành phần TheLoai của biến Sach[i], nếu thấy chúng bằng nhau (giá trị của hàm = 0) thì in
ra màn hình TenSach của biến Sach[i].
c) In ra các sách của Lê Hựu được xuất bản vào những năm 90’s (tức là những năm từ 1990
đến 1999): Nếu biến Sach[i] nào thỏa mãn 3 điều kiện là Sach[i].TacGia = "Le Luu" và
Sach[i].NamXB 1990 và Sach[i].NamXB 1999 thì in ra màn hình TenSach.
* Màn hình kết quả như sau:
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
224
CHƯƠNG VIII. KIỂU FILE
Bài 115: Tạo ra một tệp gồm tên và điểm của các sinh viên trong lớp, với tên và điểm
được nhập từ bàn phím?
#include
#include
main()
{
int i,n;
FILE *f;
struct hihihi {char Ten[100];float Diem;}SinhVien[100];
printf("\n Nhap vao so luong sinh vien: ");
scanf("%d",&n);
f=fopen("hoangtronghus.doc","w");
fflush(stdin);
for(i=0;i<n;i++)
{
printf(" Nhap vao Ten va Diem cua sinh vien thu %d:\n\t",i+1);
gets(SinhVien[i].Ten);printf("\t");scanf("%f",&SinhVien[i].Diem);printf("\r");
fprintf(f,"%s\t\t%0.2f\n",SinhVien[i].Ten,SinhVien[i].Diem);
fflush(stdin);
}
fclose(f);
printf("\n => Ban hay vao thu muc luu file .c nay va mo file
hoangtronghus.doc len de xem ket qua.Thank!");
getch();
}
* Giải thích:
- Đây là bài tập tương đối tổng hợp nhiều loại kiến thức: vòng lặp; mảng và con trỏ; kiểu
dữ liệu cấu trúc; mở, đóng và ghi dữ liệu vào file,
a) Khai báo: n là tổng số sinh viên mà chúng ta sẽ nhập vào, i là biến chạy trong vòng lặp for
để nhập và ghi thông tin của từng sinh viên vào file, con trỏ *f có kiểu FILE để thực hiện các
thao tác với file dữ liệu.
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
225
b) Mỗi một biến SinhVien là một kiểu cấu trúc gồm 2 thành phần là Ten có kiểu kí tự và
Diem có kiểu số thực. Nhưng lại có nhiều kiểu cấu trúc dựa theo số lượng các thành phần cũng
như sự kết hợp giữa các thành phần ấy, cho nên mình lại định nghĩa các biến SinhVien có kiểu
hihihi. Hay nói cách khác, kiểu hihihi cũng là kiểu cấu trúc nhưng chỉ là trường hợp riêng của
kiểu cấu trúc. Khai báo sẵn một mảng gồm tối đa 100 biến SinhVien có kiểu hihihi (cấp phát tĩnh
một vùng nhớ chứa tối đa 100 sinh viên có kiểu hihihi).
c) Lệnh f=fopen("hoangtronghus.doc","w") là lệnh dùng con trỏ f để mở và ghi một file mới
có tên là hoangtronghus và có định dạng là document (định dạng này dùng Microsoft Word để
mở).
Lệnh fflush(stdin) là lệnh xóa bộ nhớ đệm liên quan đến bàn phím. Vì hàm gets() có thể
đọc được các kí tự đặc biệt như dấu cách, kí tự enter nên trước khi nhập thông tin cho sinh viên
thì ta phải xóa những kí tự không cần thiết đã được tạo ra trước đó. Từ nội dung kiểu dữ liệu cấu
trúc và dữ liệu file trở về sau thì lệnh fflush(stdin) rất hay được sử dụng.
d) Nhập thông tin cho từng sinh viên: Vì mỗi sinh viên có hai thành phần nên ta phải nhập
từng thành phần đó cho từng sinh viên. Nhập thành phần nào thì đọc từ bàn phím thành phần đó
và lưu vào địa chỉ tương ứng. Ví dụ: nhập tên sinh viên có dạng xâu thì dùng hàm gets() để đọc
và lưu vào địa chỉ Ten là tên của xâu đó, xâu Ten[100] là một mảng một chiều nên bản thân tên
xâu đã là địa chỉ; còn nhập điểm cho sinh viên thì phải có toán tử & để lưu vào địa chỉ cho biến
Diem.
Nhập hết thông tin của sinh viên nào thì ghi vào file đến đó. Sử dụng hàm fprintf() để ghi
theo định dạng. Trong bài, mình sử dụng nhiều dấu như “\t\t\r\n” chỉ mang tính thẩm mỹ, mọi
người có thể dùng hoặc không.
e) Khi thực hiện xong xuôi các công việc ở trên về khai báo, mở file, nhập và ghi thông tin vào
file thì phải có bước đóng file để đảm bảo an toàn dữ liệu khi gọi file để đọc hay ghi ở một
chương trình tiếp theo.
Lưu ý là khi ta nhập thông tin xong cho tất cả sinh viên thì trên màn hình sẽ hiện ra dòng
chữ hướng dẫn tìm tới thư mục của file kết quả để mở lên xem. Và vì mình không để đường dẫn
tới địa chỉ lưu file kết quả nên máy sẽ mặc định lưu file mới tạo ra trong cùng thư mục với file
chạy chương trình ***.c Kết quả thông tin của các sinh viên không được hiển thị trên màn hình
do ta không viết lệnh in ra màn hình. Ah còn nữa, phần định dạng cho file kết quả thì mình thích
định dạng đuôi gì cũng được miễn sao là định dạng file văn bản (doc, data, txt, cpp, c, pas,
java,)
* Màn hình kết quả như sau:
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
226
Như trong bài này mình để file chạy chương trình C ở ngoài desktop nên file mới được tạo
ra là hoangtronghus.doc cũng nằm ngoài desktop, chúng ta chỉ cần click chuột vào để xem kết
quả. Mình ra desktop mở file word lên và được kết quả như sau:
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
227
Bài 116: Cho hàm số y = sin(x) xác định trong khoảng – x . Viết chương trình
tính các giá trị của y trong khoảng x vừa cho, với bước tăng liên tiếp giữa các điểm
hoành độ x là
100
2
h (có nghĩa là
100
2
iii xx ). Ghi giá trị của x và y thành 2 cột
vào một file văn bản có tên là data.txt. Đọc giá trị của x và y từ file data.txt và in ra
màn hình? (X)
#include
#include
#include
#define pi 3.14159265358979
struct ToaDo{float x;float y;};
main()
{
float i;
int j,Dem=0;
struct ToaDo a[200];
FILE *f;
printf("\n Ket qua duoc luu trong file data.txt tren o D.\n");
f=fopen("D:/data.txt","w");
for(i=-pi;i<=pi;i=i+2*pi/100)
Dem++;
fprintf(f,"\t%d\n\n",Dem);
for(i=-pi;i<=pi;i=i+2*pi/100)
fprintf(f,"\t%9.6f\t%9.6f\n",i,sin(i));
fclose (f);
printf(" Nhan phim bat ki de xem ket qua: ");
getch();
f=fopen("D:/data.txt","r");
fscanf(f,"%d",&Dem);
for(j=0;j<Dem;j++)
fscanf(f,"%f%f",&a[j].x,&a[j].y);
printf("\n => Day la ket qua sau khi doc file data.txt\n\n");
printf("\t x\t\t y=sin(x)\n\t---------\t---------\n\n");
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
228
for(j=0;j<Dem;j++)
printf("\t%9.6f\t%9.6f\n",a[j].x,a[j].y);
getch();
}
* Giải thích:
a) Mở một file mới để ghi dữ liệu vào đó, file này có tên data.txt và lưu vào ổ D. Vì giá trị của
i lấy trong đoạn [–, ] và mỗi bước tăng i là 2/100 nên sẽ chia đoạn trên thành 100 phần bằng
nhau và có tất cả 101 giá trị của i. Tuy nhiên, so sự sai lệch nhất định nào đó về số khai báo
ban đầu nên điểm cuối cùng vượt ra khỏi giá trị và ta chỉ có tất cả 100 điểm với 99 khoảng
cách mà thôi. Vòng for đầu tiên đếm số lượng các giá trị của i và gán cho biến Dem. Vòng for
thứ hai với biến i chạy từ – đến , chạy đến đâu thì ghi vào file data.txt hai giá trị là i và sin(i).
Khi chạy xong vòng for thì dùng lệnh đóng file fclose() và đến đây ta đã tạo được file dữ liệu đầu
ra là data.txt gồm 100 dòng trong đó mỗi dòng gồm 2 giá trị là i và sin(i).
b) Tiếp theo ta dùng lệnh đọc file data.txt f=fopen("D:/data.txt","r"); giá trị đầu tiên tìm
được sẽ gán cho biến Dem. Các giá trị tiếp theo được gán tương ứng cho các thành phần của
biến a[i], mảng các biến a[i] được khai báo kiểu cấu trúc ToaDo với 2 thành phần là x và y và
cả x và y đều có kiểu số thực.
c) In ra màn hình các thông tin đọc được từ file data.txt: thực chất là in ra thông tin của các
biến có kiểu cấu trúc mà ta đã ghi thông tin ở bước b. In ra thông tin về thành phần của từng
biến a[i] sao cho mỗi thành phần cách nhau bằng 1 tab và xong mỗi biến a[i] thì xuống dòng để
in thông tin cho biến khác. Dấu “%9.6f” có nghĩa rằng sẽ dành một vị trí là 9bit để in cho kết
quả trong đó 6bit in cho các chữ số sau dấu phẩy thập phân, 1bit in cho dấu phẩy và 2bit in cho
phần nguyên; làm như thế để cho kết quả hiện ra sẽ có dấu phẩy thẳng hàng nhau.
* Kết quả trên file đầu ra data.txt (vì có tận 100 dòng kết quả nên mình chỉ lấy một phần làm
đại diện):
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
229
* Màn hình kết quả như sau (tương tự file đầu ra, mình chỉ lấy một phần kết quả để hiện ra trên
màn hình):
Bài 117: Viết chương trình cấp phát động cho mảng a có N phần tử, nhập vào giá trị
các phần tử và ghi ra file văn bản ma.txt thành 2 cột. Cột thứ nhất chứa chỉ số i và
cột thứ hai chứa giá trị của a[i]. Sắp xếp mảng theo thứ tự tăng dần rồi ghi vào file
văn bản mb.txt. Đọc dữ liệu từ 1 trong 2 file và in ra màn hình? (X)
#include
#include
struct ToaDo{int x;float y;};
main()
{
int i,j,N;
float *a,TrungGian;
struct ToaDo b[100];
FILE *fa, *fb;
printf("\n Nhap vao so nguyen duong N: ");
scanf("%d",&N);
a=(float*)malloc(N*sizeof(float));
fa=fopen("D:/ma.txt","w");
fprintf(fa,"%d\n",N);
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
230
printf(" Nhap vao cac phan tu cua mang a: ");
for(i=1;i<=N;i++)
scanf("%f",a+i);
for(i=1;i<=N;i++)
fprintf(fa,"%d\t%f\n",i,*(a+i));
fclose(fa);
printf(" Moi ban vao o D va mo file ma.txt len de xem!\n");
for(i=1;i<N;i++)
for(j=i+1;j<=N;j++)
if(*(a+i)>*(a+j))
{
TrungGian=*(a+i);
*(a+i)=*(a+j);
*(a+j)=TrungGian;
}
fb=fopen("D:/mb.txt","w");
fprintf(fb,"%d\n",N);
for(i=1;i<=N;i++)
fprintf(fb,"%f\n",*(a+i));
fclose(fb);
printf(" Moi ban vao o D va mo file mb.txt len de xem!\n\n");
printf(" => Doc du lieu tu file ma.txt la:\n");
fa=fopen("D:/ma.txt","r");
fscanf(fa,"%d",&N);
for(i=1;i<=N;i++)
fscanf(fa,"%d%f",&b[i].x,&b[i].y);
for(i=1;i<=N;i++)
printf("\t%d\t%f\n",b[i].x,b[i].y);
printf("\n => Doc du lieu tu file mb.txt la:\n");
fb=fopen("D:/mb.txt","r");
fscanf(fb,"%d",&N);
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
231
for(i=1;i<=N;i++)
fscanf(fb,"%f",a+i);
for(i=1;i<=N;i++)
printf("\t%f\n",*(a+i));
getch();
return 0;
}
* Giải thích:
- Đề bài chỉ yêu cầu in ra màn hình một trong hai file vừa tạo ra nhưng mình viết chương
trình để in ra màn hình cả 2 file đó.
a) Cấp phát động cho mảng a có N phần tử: Thực hiện cấp phát bình thường và sử dụng con
trỏ *a để cấp phát với cú pháp của hàm malloc. Giả sử các phần tử của mảng a đều có kiểu số
thực nên phải khai báo con trỏ dưới dạng thực float. Cấu trúc cấp phát như sau:
a=(float*)malloc(N*sizeof(float));
Chương trình sẽ dành ra 4N (byte) để chứa vùng dữ liệu cho mảng a (vì kiểu float có kích cỡ
4byte) và con trỏ a sẽ trỏ tới phần tử đầu tiên của mảng.
- Nhập vào N là số phần tử và nhập vào các phần tử của mảng.
b) Ghi thông tin ra file văn bản ma.txt: Đầu tiên mở một file và đặt tên là ma.txt bằng con trỏ
*fa và in giá trị N lên dòng đầu tiên của file đó. Các giá trị *(a+i) được ghi lên file ma.txt nhờ
lệnh fprintf(), mỗi dòng ghi 2 giá trị là biến chạy i có kiểu nguyên và giá trị của phần tử *(a + i)
có kiểu thực.
c) Ghi thông tin ra file văn bản mb.txt gồm những phần tử được sắp xếp theo chiều tăng dần:
Thực hiện sắp xếp tăng dần dãy các phần tử *(a + i) với i chạy từ 1 đến N. Tiếp theo, mở một file
mới có tên mb.txt và tạo đường dẫn vào ổ D, dùng con trỏ *fb. Dòng đầu tiên trong file mb.txt
chứa giá trị N và N dòng tiếp theo mỗi dòng chứa một giá trị *(a + i) sau khi đã được sắp xếp
tăng dần.
d) Đọc và in ra màn hình file ma.txt: Dùng lệnh mở file và đọc thông tin từ file ma.txt. Lưu giá
trị ban đầu tìm được cho biến N. Các phần tử tiếp theo được đọc và lưu vào cho các thành phần
của các biến cấu trúc b[i]. Muốn in ra màn hình thì chỉ cần truy cập đến từng thành phần của
biến b[i] sau đó xuất ra màn hình có N + 1 dòng trong đó dòng đầu tiên chứa giá trị N và N
dòng tiếp theo mỗi dòng chứa 2 giá trị tương ứng là 2 thành phần của biến cấu trúc.
e) Đọc và in ra màn hình file mb.txt: Dùng lệnh mở file và đọc thông tin từ file mb.txt. Lưu giá
trị đầu tiên tìm được cho biến N. Các phần tử tiếp theo được lưu cho biến ở dạng con trỏ (a + i)
sau đó xuất ra màn hình giá trị mà con trỏ (a + i) trỏ tới, đó là *(a + i). Mỗi dòng chỉ in ra một
phần tử *(a + i).
* Màn hình kết quả như sau:
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
232
Bài 118: (Mai Siêu Phong)
Mai Siêu Phong có thú vui sưu tầm đầu lâu. Mỗi ngày chị Phong thu thập một
cơ số đầu lâu rồi bỏ vào quan tài lưu trữ thành 5 buổi. Tuy nhiên do bị mắc bệnh
hay quên nên chị ta không nhớ mình đã thu thập được tổng cộng bao nhiều đầu lâu
và số đầu lâu lớn nhất cũng như nhỏ nhất mình thu thập được trong một ngày là bao
nhiêu. Hãy giúp chị Phong thống kê lại công việc này!
Dữ liệu đầu vào có dạng sau:
MSP.INP
- Dòng đầu chứa số nguyên dương M – là số ngày chị Phong đi thu thập đầu
lâu.
- M dòng tiếp theo, mỗi dòng chứa 5 số thể hiện số đầu lâu thu thập được trong
ngày.
Dữ liệu đầu ra có dạng sau:
MSP.OUT
- Dòng đầu là số đầu lâu lớn nhất mà chị Phong đã từng thu thập được .
- M dòng tiếp theo, mỗi dòng chứa 2 số thể hiện số đầu lâu bé nhất và lớn nhất
thu thập được trong ngày.
Ví dụ:
MSP.INP MSP.OUT
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
233
4 12
12 0 8 3 11 0 12
0 0 5 5 3 0 5
4 1 9 2 0 0 9
8 3 1 5 1 1 8
(Đề này bị thiếu một phần tử ở dòng cuối, từ dòng thứ 2 đến dòng thứ 5 thì mỗi dòng phải
có 5 số trong khi dòng thứ 5 chỉ có 4 số. Mình tự ý thêm vào số 1 ở cuối. Nếu không thêm
vào cho đủ thì không thể truy cập đến từng phần tử theo kiểu mảng 2 chiều được).
#include
#include
main()
{
int M,i,j,Max,Min,LonNhat,a[100][100];
FILE *f;
f=fopen("D:/MSP.INP.c","r");
fscanf(f,"%d",&M);
for(i=0;i<M;i++)
for(j=0;j<5;j++)
fscanf(f,"%d",&a[i][j]);
f=fopen("D:/MSP.OUT.doc","w");
LonNhat=a[0][0];
for(i=0;i<M;i++)
for(j=0;j<5;j++)
if(a[i][j]>LonNhat)LonNhat=a[i][j];
fprintf(f,"%d\n",LonNhat);
for(i=0;i<M;i++)
{
Max=a[i][0];
Min=a[i][0];
for(j=0;j<5;j++)
{
if(a[i][j]>Max)Max=a[i][j];
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
234
if(a[i][j]<Min)Min=a[i][j];
}
fprintf(f,"%d%6d\n",Min,Max);
}
fclose(f);
printf("\n\n => Moi ban vao o D sau do mo file MSP.OUT len de xem ket
qua.Thank!\n");
getch();
return main();
}
* Giải thích:
- Đề bài cho mỗi dòng có 5 số nhưng dòng thứ 5 trong MSP.INP chỉ có 4 số nên mình tự ý
thêm vào số 1 (mình nghĩ thầy viết thiếu). Nếu không đủ 5 số thì không thể truy nhập tới phần tử
theo cách của mảng 2 chiều được mà chỉ truy nhập theo dạng mảng 1 chiều, như thế sẽ không
tính được phần tử lớn nhất và nhỏ nhất trên dòng thứ i.
a) Đầu tiên tạo ra tệp MSP.INP bằng bất kì trình soạn thảo văn bản nào và lưu vào vị trí nào
đó. Ở đây, mình tạo ra file đầu vào trên chính trình soạn thảo của Dev – Cpp và lưu với đuôi .c
sau đó copy file vừa tạo vào ổ D. Mình tạo file nguồn MSP.INP như hình dưới đây (giống với file
nguồn trong ví dụ, các bạn có thể tạo file nguồn khác) và phần tử đầu tiên chính là số dòng:
Trong chương trình chính, ta khai báo các biến cần sử dụng: M là tổng số dòng, i và j là
biến để chạy trong vòng lặp for, LonNhat là biến để xác định số đầu lâu lớn nhất mà chị Phong
đã từng thu thập được, biến Max để xác định số đầu lâu lớn nhất trong từng ngày và biến Min để
xác định số đầu lâu nhỏ nhất trong từng ngày, con trỏ *f để trỏ tới file cần thực hiện – con trỏ
này có dạng FILE. Ta thấy phần dữ liệu đầu vào có dạng ma trận 4 hàng 5 cột nên cần khai báo
thêm mảng 2 chiều a[100][100] có tối đa 100 hàng và 100 cột.
b) Các lệnh:
- Lệnh mở file để đọc: f=fopen("D:/MSP.INP.c","r"); chỉ rõ đường dẫn tới file cần mở
cũng như tên file cần mở là MSP.INP.c và chế độ mở file là mở để đọc (r = read = đọc). Công
việc mở file có thể thành công hay không thành công và được gán cho con trỏ f.
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
235
- Lệnh fscanf(f,"%d",&M); là lệnh đọc từ file nguồn rồi lưu giá trị đầu tiên mà nó tìm thấy
cho biến M. Giá trị M chính là số dòng. Như vậy là ta đã xác định được dữ liệu đầu vào có M
dòng và 5 cột.
- Các vòng lặp for lồng nhau với biến i chạy từ 0 đến M – 1 và biến j chạy từ 0 đến 4. Các
biến i, j chạy tới đâu thì đọc từ file nguồn đến đó và lưu vào cho phần tử a[i][j]. Lệnh đọc từ file
là fscanf() tương tự với lệnh đọc từ bàn phím là scanf().
- Lệnh f=fopen("D:/MSP.OUT.doc","w"); là lệnh mở một file mới cho mục đích ghi dữ
liệu vào file đó (ghi đè), lệnh này được gán cho con trỏ f. Sau khi tạo ra file MSP.OUT.doc thì
lưu vào ổ D.
Đến đây ta đã có toàn bộ dữ liệu file nguồn MSP.INP.c được nạp vào máy và xác định
được địa chỉ của dữ liệu đầu ra là file MSP.OUT.doc trong ổ D. Dữ liệu đầu ra có thể định dạng
ở nhiều loại khác nhau, mình lấy định dạng document làm ví dụ (.doc – file word).
c) Tìm số đầu lâu lớn nhất mà chị Phong đã từng thu thập được: sử dụng biến LonNhat, ban
đầu gán biến LonNhat bằng phần tử đầu tiên LonNhat = a[0][0], sau đó duyệt từng phần tử của
mảng 2 chiều nếu thấy a[i][j] > LonNhat thì gán lại giá trị LonNhat = a[i][j]. Sau khi tính xong
giá trị LonNhat thì ghi nó lên dòng đầu tiên của file MSP.OUT.doc bằng lệnh fprintf().
d) Tìm số đầu lâu lớn nhất và số đầu lâu nhỏ nhất trong 1 ngày: thực chất là tìm giá trị lớn
nhất và giá trị nhỏ nhất trên từng dòng của mảng 2 chiều, sử dụng biến Max và Min. Gán Max
cũng như Min bằng phần tử đầu tiên của dòng đó: Max = Min = a[i][0], sau đó duyệt từng phần
tử trên dòng i nếu thấy a[i][j] > Max thì gán lại Max = a[i][j] và nếu thấy a[i][j] < Min thì gán
lại Min = a[i][j]. Sau khi tìm xong phần tử lớn nhất và nhỏ nhất trên dòng thứ i thì ghi 2 giá trị
đó lên file MSP.OUT.doc bằng lệnh fprintf(), ghi xong thì xuống dòng.
e) Sau khi thực hiện xong các công việc trên thì phải có bước đóng file bằng lệnh fclose(f); thì
dữ liệu mới có thể lưu lại được khi gọi file để sử dụng cho chương trình khác.
Tất cả các bước chúng ta làm ở trên chỉ sử dụng dữ liệu đầu vào có sẵn và lưu vào file
khác mà ta xác định địa chỉ cho nó. Các kết quả này chúng ta không đưa ra màn hình nên khi
chạy chương trình thì trên màn hình không có thông tin gì cả. Mình chỉ xuất ra màn hình dòng
chữ hướng dẫn người lập trình vào ổ D và mở file MSP.OUT.doc lên để xem kết quả.
Những bài tập dạng VÀO/ RA file như bài này thì chỉ thêm các lệnh đọc file, ghi file,
đóng file,còn các công việc khác thì tương tự như thao tác với mảng 1 chiều, 2 chiều, xâu kí tự,
con trỏ, dữ kiệu kiểu cấu trúc,
* Màn hình kết quả như sau:
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
236
Sau đó, vào ổ D và mở file word MSP.OUT lên xem thì được kết quả như sau:
Bài 119: (Ma trận trôn ốc)
Ma trận trôn ốc là ma trận có các phần tử được sắp xếp dạng xoáy trôn ốc
(theo chiều kim đồng hồ) bắt đầu từ phần tử 1 ở góc trên bên trái cho đến phần tử
NxN với N là số cho trước. Cho trước số N hãy in ra ma trận trôn ốc tương ứng.
Dữ liệu đầu vào có dạng sau:
MTTO.INP
- Chỉ có một dòng chứa số nguyên dương N.
Dữ liệu đầu ra có dạng sau:
MTTO.OUT
- Ma trận vuông cấp NxN với các phần tử dạng xoáy trôn ốc.
Ví dụ:
MTTO.INP MTTO.OUT
4 1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
#include
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
237
#include
main()
{
int N,GiaTri=1,CotTrai=0,HangTren=0,CotPhai,HangDuoi;
int i,j,k,h,a[100][100];
FILE *f;
f=fopen("D:/MTTO.INP.c","r");
fscanf(f,"%d",&N);
CotPhai=N-1;
HangDuoi=N-1;
while(GiaTri<=N*N)
{
for(i=CotTrai;(i<=CotPhai)&&(GiaTri<= N*N);i++,GiaTri++)
a[HangTren][i]=GiaTri;
HangTren++;
for(j=HangTren;(j<=HangDuoi)&&(GiaTri<= N*N);j++,GiaTri++)
a[j][CotPhai]=GiaTri;
CotPhai--;
for(k=CotPhai;(k>=CotTrai)&&(GiaTri<= N*N);k--,GiaTri++)
a[HangDuoi][k]=GiaTri;
HangDuoi--;
for(h=HangDuoi;(h>=HangTren)&&(GiaTri<= N*N);h--,GiaTri++)
a[h][CotTrai]=GiaTri;
CotTrai++;
}
f=fopen("D:/MTTO.OUT.doc","w");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
fprintf(f,"%5d",a[i][j]);
fprintf(f,"\n");
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
238
}
fclose(f);
printf("\n\n => Moi ban vao o D sau do mo file word MTTO.OUT len de
xem ket qua.Thank!\n");
getch();
return main();
}
* Giải thích:
a) Trước tiên khai báo các biến cần sử dụng cho chương trình: Cách làm bài này là dùng 4
biến đại diện cho hàng trên, hàng dưới, cột trái, cột phải là HangTren, HangDuoi, CotTrai,
CotPhai để đánh dấu. HangTren là hàng từ trên xuống với giá trị ban đầu bằng 0, HangDuoi là
hàng từ dưới lên với giá trị ban đầu bằng N – 1 (N là kích cỡ của ma trận), CotTrai là cột từ trái
sang phải với giá trị ban đầu bằng 0 và CotPhai là cột từ bên phải lùi lại trái với giá trị ban đầu
bằng N – 1.
b) Khai báo một con trỏ dạng FILE *f và thực hiên mở file MTTO.INP.c lên để đọc. File
MTTO.INP.c được người lập trình tạo ra từ trước và copy vào ổ D. Đọc từ file nguồn và lưu giá
trị tìm được cho biến N là kích cỡ của ma trận. Viết file nguồn thì chỉ cần viết duy nhất một phần
tử dạng số trong trình soạn thảo của Dev – Cpp, màn hình file nguồn MTTO.INP như sau (nhập
giá trị ví dụ bằng 10):
c) Sử dụng vòng lặp while để tìm phần tử ở chỉ số tương ứng. Khi điều kiện số phần tử còn
nhỏ hơn hoặc bằng N2 – là số phần tử của ma trận thì thực hiện vòng 4 vòng for bên trong. Vòng
for thứ nhất để ghi các phần tử trên hàng đầu tiên theo chiều từ trái sang phải. Vòng for thứ hai
để ghi các phần tử ở cột ngoài cùng bên phải theo chiều từ trên xuống dưới. Vòng for thứ ba để
ghi các phần tử ở hàng dưới cùng theo chiều từ phải sang trái. Vòng for thứ tư để ghi các phần
tử ở cột đầu tiên theo chiều từ dưới lên trên. Sau mỗi vòng lặp while thì CotTrai và HangTren
đều tăng lên 1 đơn vị còn CotPhai và HangDuoi đều giảm xuống1 đơn vị.
Vòng while cứ lặp đi lặp lại như thế cho tới khi số phần tử bằng N2.
Để hiểu rõ hơn, mình giả sử lấy N = 4 và minh họa kết quả cho vòng lặp while đầu tiên như
sau:
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
239
+ Trong vòng for thứ nhất, i chạy từ 0 đến 3 và biến HangTren = 0, sau mỗi một lượt thì i
tăng lên 1 đơn vị và biến GiaTri cũng tăng lên 1 đơn vị. Biến GiaTri được khởi tạo ban đầu bằng
1. Như vậy sau vòng for thứ nhất ta có các kết quả:
a[0][0] = 1; a[0][1] = 2; a[0][2] = 3; a[0][3] = 4.
Tăng biến HangTren lên 1 đơn vị: HangTren = 1. Biến GiaTri lúc này đang nhận giá trị 4.
+ Trong vòng for thứ hai, j chạy từ HangTren đến 3 mà theo kết quả vòng for thứ nhất thì
HangTren = 1 do đó j chạy từ 1 đến 3. Lúc này CotPhai đang nhận giá trị 3. Như vậy sau vòng
for thứ hai ta có các kết quả:
a[1][3] = 5; a[2][3] = 6; a[3][3] = 7.
Giảm CotPhai xuống 1 đơn vị: CotPhai = 2. Biến GiaTri lúc này đang nhận giá trị 7.
+ Trong vòng for thứ ba, k chạy từ CotPhai đến CotTrai mà theo khởi tạo ban đầu CotTrai
= 0 và theo vòng for thứ hai thì CotPhai = 2 do đó k chạy lùi từ 2 về 0. HangDuoi đang nhận giá
trị khởi tạo ban đầu là 3. Như vậy sau vòng for thứ ba ta có các kết quả:
a[3][2] = 8; a[3][1] = 9; a[3][0] = 10.
Giảm HangDuoi xuống 1 đơn vị: HangDuoi = 2. Biến GiaTri lúc này đang nhận giá trị 10.
+ Trong vòng for thứ tư, h chạy từ HangDuoi đến HangTren mà theo vòng for thứ ba thì
HangDuoi = 2 và theo vòng for thứ nhất thì HangTren = 1 do đó h chạy lùi từ 2 đến 1. CotTrai
lúc này đang nhận giá trị khởi tạo bằng 0. Như vậy sau vòng for thứ 4 ta có các kết quả sau:
a[2][0] = 11; a[1][0] = 12.
Tăng CotTrai lên 1 đơn vị: CotTrai = 1. Biến GiaTri lúc này đang nhận giá trị 12.
Vậy, sau 4 vòng for đầu tiên (hay sau vòng while thứ nhất) thì chỉ có các phần tử màu đỏ
của ma trận mới có giá trị (bảng dưới):
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
a[3][0] a[3][1] a[3][2] a[3][3]
Tương đương với kết quả nhận được là:
1 2 3 4
12 a[1][1] a[1][2] 5
11 a[2][1] a[2][2] 6
10 9 8 7
Tiếp tục sang vòng while tiếp theo khi điều kiện GiaTri N2 còn thỏa mãn. Lưu ý là sang
vòng while tiếp theo thì các biến HangTren, HangDuoi, CotTrai, CotPhai đã được thay đổi sang
giá trị mới.
d) Mở lên một file mới có dạng MTTO.OUT.doc để ghi kết quả vào file đó, dùng lệnh fopen.
Mình để đường dẫn tới nơi lưu file là ổ D.
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
240
Sau khi đã có tất cả các phần tử ma trận trôn ốc thì làm công việc ghi các phần tử đó lên
file đầu ra MTTO.OUT.doc nhờ lệnh fprintf(). Ghi các phần tử vào ma trận trôn ốc thì ghi tuần
tự với chỉ số i, j như bình thường.
Ghi xong dữ liệu vào file đầu ra thì phải dùng lệnh đóng file fclose(f), cứ thao tác với việc
ghi file thì phải có bước này và các bài liên quan đến ghi file về sau mình sẽ luôn dùng lệnh
fclose() với ý nghĩa như thế. Tương tự bài trước thì chương trình chỉ in kết quả lên file đầu ra
chứ màn hình thì không có thông tin gì cả, mình chỉ in ra dòng hướng dẫn tới nơi lưu file đầu ra
mà thôi.
* Màn hình kết quả như sau:
Sau khi vào ổ D và mở file word MTTO.OUT lên thì được kết quả như sau:
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
241
Bài 120: (Điểm yên ngựa)
Trong một ma trận MxN, phần tử a[i][j] được gọi là điểm yên ngựa của ma
trận nếu như nó là phần tử nhỏ nhất trên hàng i và lớn nhất trên cột j của ma trận.
Cho ma trận MxN, hãy tìm điểm yên ngựa của ma trận trên.
Dữ liệu đầu vào có dạng sau:
YENNGUA.INP
- Dòng đầu chứa hai số nguyên dương M, N
- M dòng tiếp theo, mỗi dòng chứa N số thực thể hiện là số phần tử của ma
trận.
Dữ liệu đầu ra có dạng sau:
YENNGUA.OUT
- Giá trị điểm yên ngựa.
Ví dụ:
YENNGUA.INP YENNGUA.OUT
3 2 20
15 10
30 20
40 14
#include
#include
int Min(int a[][100],int b,int x,int N);
int Max(int a[][100],int b,int x,int M);
main()
{
int a[100][100],M,N,i,j;
FILE *f;
f=fopen("D:/YENNGUA.INP.c","r");
fscanf(f,"%d%d",&M,&N);
for(i=0;i<M;i++)
for(j=0;j<N;j++)
fscanf(f,"%d",&a[i][j]);
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
242
printf("\n\n => Moi ban vao o D va mo file word YENNGUA.OUT de xem
ket qua!");
f=fopen("D:/YENNGUA.OUT.doc","w");
for(i=0;i<M;i++)
for(j=0;j<N;j++)
if(Min(a,a[i][j],i,N)==1&&Max(a,a[i][j],j,M)==1)
fprintf(f,"%d",a[i][j]);
fclose(f);
getch();
return 0;
}
int Min(int a[][100],int b,int x,int N)
{
int k=1,j;
for(j=0;j<N;j++)
if(b>a[x][j])k=0;
return (k);
}
int Max(int a[][100],int b,int x,int M)
{
int k=1,i;
for(i=0;i<M;i++)
if(b<a[i][x])k=0;
return (k);
}
* Giải thích:
a) Tạo thông tin và lưu cho file đầu vào tên là YENNGUA.INP sau đó copy vào ổ D. Ví dụ tạo
file thông tin đầu vào như sau: (dùng luôn trình soạn thảo văn bản của Dev – Cpp để viết thông
tin nguồn)
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
243
b) Đọc từ file YENNGUA.INP.c và lưu hai giá trị đầu tiên cho biến M và N là số hàng và số
cột của ma trận. Các giá trị tiếp theo được lưu cho biến a[i][j] tương ứng (i chạy từ 0 đến M – 1
và j chạy từ 0 đến N – 1). Sau khi có giá trị a[i][j] của ma trận a thì tiến hành tìm điểm yên ngựa
của ma trận đó, điểm yên ngựa chính là phần tử nhỏ nhất trên hàng i và lớn nhất trên cột j.
c) Để xác định một giá trị nào đó có phải là điểm yên ngựa hay không thì viết thêm hàm để
kiểm tra. Hàm Min để xác định xem a[i][j] có phải là nhỏ nhất trên hàng i hay không và hàm
Max để xác định xem a[i][j] có phải là lớn nhất trên cột j hay không.
Trong hàm Min() thì các đối số truyền cho hàm gồm ma trận a, giá trị a[i][j], chỉ số hàng i
và tổng số cột N. Ban đầu giả sử giá trị a[i][j] là nhỏ nhất trên hàng i (gán k = 1) sau đó so sánh
giá trị a[i][j] với các giá trị từ a[i][0] đến a[i][N – 1] nếu thấy a[i][j] lớn hơn bất kì một giá trị
nào thì chứng tỏ a[i][j] không phải là nhỏ nhất trên dòng thứ i (gán lại k = 0). Trả về giá trị k
cho tên hàm.
Trong hàm Max() thì các đối số truyền cho hàm gồm ma trận a, giá trị a[i][j], chỉ số cột j
và tổng số hàng M. Ban đầu giả sử giá trị a[i][j] là lớn nhất trên cột j (gán k = 1) sau đó so sánh
giá trị a[i][j] với các giá trị từ a[0][j] đến a[M – 1][j] nếu thấy a[i][j] nhỏ hơn bất kì một giá
trị nào thì chứng tỏ a[i][j] không phải là lớn nhất trên cột j (gán lại k = 0). Trả về giá trị k cho
tên hàm.
* Màn hình kết quả như sau:
Sau khi vào ổ D và mở file word YENNGUA.OUT thì được kết quả là giá trị 21:
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
244
Bài 121: (Tam giác Pascal)
Tam giác Pascal là tam giác có dạng sau:
14641
1331
121
11
1
Dữ liệu đầu vào có dạng sau:
PASCAL.INP
- Chỉ có 1 dòng chứa số nguyên dương N là chiều cao của tam giác.
Dữ liệu đầu ra có dạng sau:
PASCAL.OUT
- Tam giác Pascal có chiều cao N giống với dạng như trên. (X)
Ví dụ:
PASCAL.INP PASCAL.OUT
5 (Như hình trên)
#include
#include
main()
{
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
245
int i,j,N,a[100][100],Trang;
FILE *f;
f=fopen("D:/PASCAL.INP.c","r");
fscanf(f,"%d",&N);
for(i=1;i<=N;i++)
{
a[i][1]=1;
a[i][i]=1;
}
for(i=3;i<=N;i++)
for(j=2;j<i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
f=fopen("D:/PASCAL.OUT.doc","w");
for(i=1;i<=N;i++)
{
Trang=25-2*i;
for(j=1;j<=Trang;j++)
fprintf(f," ");
for(j=1;j<=i;j++)
fprintf(f,"%4d",a[i][j]);
fprintf(f,"\n");
}
fclose(f);
printf("\n\n => Moi ban vao o D va mo file word PASCAL.OUT de xem ket
qua! ");
getch();
}
* Giải thích:
- Tương tự như những bài tập trước, nếu đề bài yêu cầu dùng file đầu vào và xuất ra file
đầu ra thì phải tạo trước thông tin cho file đầu vào cũng như sử dụng các lệnh mở file để đọc, ghi
file và đóng file với việc khai báo một con trỏ dạng FILE. Với các bài sau mà cùng dạng này thì
mình sẽ không giải thích lại các bước như trên nữa.
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
246
a) Các phần tử của tam giác Pascal có dạng khối nên dùng thêm một mảng 2 chiều để lưu các
phần tử này. Vấn đề quan trọng nhất của bài toán này chính là xác định được giá trị của các
phần tử tương ứng. Ta thấy rằng trong tam giác Pascal thì trên dòng thứ i sẽ có i phần tử và
phần tử đầu tiên cũng như phần tử cuối cùng của dòng thứ i đều bằng 1. Chính vì vậy, ta sử dụng
vòng for với biến i chạy từ 1 đến N, chạy tới dòng nào thì gán giá trị đầu tiên và giá trị cuối cùng
của dòng đó bằng 1 (a[i][1] = a[i][i] = 1).
Tiếp đến là các giá trị bên trong của mỗi dòng i thì sử dụng công thức tổ hợp để tính:
1
11
k
n
k
n
k
n CCC
Hay: a[i][j] = a[i-1][j-1] + a[i-1][j] với biến j chạy từ 2 đến i – 1.
b) Các kết quả tính được ở câu a được ghi vào cho file PASCAL.OUT định dạng document
(file word). Tuy nhiên, để in ra dưới dạng tam giác cân thì phải chèn thêm các kí tự trắng vào
đằng trước các dòng. Dòng đầu chèn nhiều kí tự trắng nhất, dòng 2 chèn ít kí tự trắng hơn dòng
1 và dòng 3 chèn ít hơn dòng 2,Biến Trang là để xác định số kí tự trắng cần chèn vào cho mỗi
dòng, mình khởi tạo bằng 25 (các bạn có thể khởi tạo bằng 30, 40 tùy ý miễn sao đảm bảo tính
thẩm mỹ cho hình tam giác là được) và dòng sau được chèn ít hơn dòng trước nó 2 kí tự trắng.
* Màn hình kết quả như sau:
Sau khi mở file word PASCAL.OUT trong ổ cứng D thì được kết quả như sau (với file đầu
vào chứa giá trị bằng 8):
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
247
Bài 122: (Thay từ)
Cho file D1.INP chứa một đoạn văn bản và D2.INP chứa N dòng, mỗi dòng
gồm 2 từ: nguồn và đích trong đó nguồn là các từ xuất hiện trong D1.INP cần thay
thế bởi đích. Hãy thay thế các từ này và lưu kết quả vào file KQ.OUT
Ví dụ:
D1.INP D2.INP
Xin chào lớp học Lập trình C khóa
2012. Chúc các bạn thi tốt!
bạn em
! .
khóa Khóa
KQ.OUT
Xin chào lớp học Lập trình C Khóa 2012. Chúc các em thi tốt.
Bài 123: (Tấm Cám)
Ngày xửa ngày xưa, nhà kia có hai chị em cùng cha khác mẹ, chị là Tấm, em là
Cám. Mẹ Tấm mất sớm, ít năm sau thì cha Tấm cũng qua đời. Tấm ở với dì ghẻ là
mẹ Cám. Tấm rất muốn đi dữ lễ hội nhưng Cám ghen ghét không muốn chị đi vì sợ
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
248
mình thua thiệt. Cám bầy mưu nhờ dì ghẻ bắt Tấm phải đếm đủ số bi mới cho đi.
Với số lượng bi cho trước, Tấm phải chuyển sang dạng nhị phân từ phần tử 0 cho
đến số bi đó. Tấm rất cô đơn và thất vọng. Hãy giúp Tấm giải quyết khó khăn này.
Dữ liệu đầu vào có dạng sau:
TAM.INP
- Một dòng chứa số nguyên dương N là số lượng bi.
Dữ liệu đầu ra có dạng sau:
TAM.OUT
N + 1 dòng, mỗi dòng là một dãy số nhị phân thể hiện một số từ 0 đến N.
Ví dụ:
TAM.INP TAM.OUT
4 000
001
010
011
100
#include
#include
void MaNhiPhan(int a,FILE *f);
main()
{
int N,i;
FILE *fa,*fb;
fa=fopen("D:/TAM.INP.c","r");
fscanf(fa,"%d",&N);
fb=fopen("D:/TAM.OUT.doc","w");
for(i=0;i<=N;i++)
MaNhiPhan(i,fb);
printf("\n => Moi ban vao o cung D va mo file word TAM.OUT de xem
ket qua!\n");
getch();
}
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
249
void MaNhiPhan(int a,FILE *f)
{
int b[100],i=0,j;
do
{
b[i]=a%2;
a=a/2;
i++;
}
while (a>0);
for(j=i-1;j>=0;j--)
fprintf(f,"%d",b[j]);
fprintf(f,"\n");
}
* Giải thích:
Bài 124: (Siêu nguyên tố)
Số siêu nguyên tố là số nguyên tố mà khi bỏ đi một số tùy ý các chữ số bên phải
của nó thì phần còn lại vẫn tạo thành số nguyên tố. VD: 7333 là số siêu nguyên tố do
733, 73 và 7 đều là các số nguyên tố. Cho trước một số nguyên dương N, hãy tìm tất
cả các số siêu nguyên tố có N chữ số.
Dữ liệu đầu vào có dạng sau:
SNT.INP
- Một dòng chứa số nguyên dương N
Dữ liệu đầu ra có dạng sau:
SNT.OUT
- Một số lượng dòng trong đó mỗi dòng là một số siêu nguyên tố có N chữ số.
Ví dụ:
SNT.INP SNT.OUT
2 23
29
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
250
31
37
53
59
71
73
79
#include
#include
#include
int NguyenTo(int a);
int SieuNguyenTo(int b,int n);
main()
{
int N,i;
FILE *fa,*fb;
fa=fopen("D:/SNT.INP.c","r");
fscanf(fa,"%d",&N);
fb=fopen("D:/SNT.OUT.doc","w");
for(i=pow(10,N-1);i<pow(10,N);i++)
if(SieuNguyenTo(i,N)==1)
fprintf(fb,"%d\n",i);
printf("\n => Moi ban vao o cung D va mo file word SNT.OUT de xem ket
qua!\n");
getch();
return 0;
}
int NguyenTo(int a)
{ int i,k=0;
if(a>=2)
{
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
251
for(i=2;a%i!=0;i++);
if(i==a)k=1;
}
return (k);
}
int SieuNguyenTo(int b,int n)
{
int k=1,i;
for(i=1;i<n;i++)
if(NguyenTo(b)==0||NguyenTo(b/pow(10,i))==0)k=0;
return (k);
}
* Giải thích:
CHƯƠNG IX. ĐỒ HỌA
CHƯƠNG X. MỘT SỐ ĐỀ THI ĐẶC BIỆT
CHƯƠNG XI. MỘT SỐ CHƯƠNG TRÌNH VIRUS ĐƠN GIẢN
Bài 149:
CHƯƠNG XII. ỨNG DỤNG LẬP TRÌNH C VÀO CÁC BÀI TOÁN THỰC
TẾ VÀ CÁC BÀI TOÁN CHUYÊN NGÀNH
Do C là một ngôn ngữ bậc trung nên nó thích hợp với việc viết phần mềm hệ thống
hơn là các phần mềm ứng dụng. Tuy nhiên, nếu sử dụng C để viết chương trình giải quyết
các bài toán nhỏ, hay gặp trong thực tế cũng như trong các môn học của sinh viên thì
cũng là một lựa chọn hợp lý. Với những ứng dụng nhỏ và không cần giao diện đẹp thì
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
252
hiệu quả làm việc trong C sẽ khiến bạn hài lòng. Đối với những dạng bài tập mà chúng ta
học ở trường thì hầu hết đều có thể viết lại bằng ngôn ngữ C. Dưới đây mình có làm một
số bài liên quan đến môn Giải tích, Xác suất – Thống kê, Địa Lý, Khí hậu,.Do điều kiện
không cho phép nên mình không làm được nhiều bài tập, mình chỉ giới thiệu những bài có
tính khái quát và có thể do đề bài yêu cầu nhiều nội dung nên chương trình khá dài. Mình
sẽ cố gắng giải thích dễ hiểu nhất có thể, hy vọng các bạn có thể hiểu ý mình. Thank!
----------------------------------------------------------------------------------------------- ------------
Bài 150: Có hai người cùng thực hiện một công việc nào đó. Xác suất thực hiện
thành công của người thứ nhất là a và xác suất thực hiện thành công của người thứ
hai là b (với 0 < a, b <1). Mỗi người được thực hiện công việc đó n lần (n nguyên
dương). Gọi X và Y lần lượt là số lần thực hiện thành công của người thứ nhất và
người thứ hai:
a) Lập bảng phân phối xác suất của X và Y. Tính EX, EY, DX, DY, X, Y
b) Tính xác suất để số lần thực hiện thành công của hai người là như nhau.
c) Tính xác suất để số lần thành công của người thứ nhất lớn hơn của người thứ
hai.
d) Gọi Z là tổng số lần thực hiện thành công của cả hai người (Z = X + Y). Lập
bảng phân phối xác suất của Z. Tính EZ, DZ, Z
e) Z có phân phối nhị thức hay không.
g) Tính xác suất để đại lượng ngẫu nhiên G = 2X + 3Y là một số chẵn.
h) Nếu người thứ nhất thực hiện một lần không thành công thì bị phạt 3 cái tát
còn người thứ hai thực hiện một lần không thành công thì bị phạt 2 cú đấm. Tính số
đơn vị đau trung bình mà cả 2 người bị phạt, biết rằng 1 cái tát bằng 1,5 đơn vị đau
và 1 cú đấm bằng 2 đơn vị đau.
Mỗi người thực hiện công việc là độc lập với nhau, các giá trị a, b, n là bất kỳ
và được nhập từ bàn phím.
Lời giải:
#include
#include
#include
int GiaiThua (int x);
int ToHop (int y,int z);
float KyVong(float z[],int n);
float PhuongSai(float k[],int n);
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
253
void SapXep(float m[],int n);
main()
{
int n,i,j,k,l,o;
float
a,b,p,M,H,V,KV,X[100],Y[100],Z[100],G[100],P1[100],P2[100],Q1[100],Q2[
100],R[100],T[100],W[100],L[100];
tieptuc:printf("\n Nhap vao xac suat thanh cong tuong ung cua hai nguoi:
");
scanf("%f%f",&a,&b);
while(a=1||b=1)
{ printf(" Nhap lai cac xac suat: ");
scanf("%f%f",&a,&b);
}
printf(" Nhap vao so lan duoc thuc hien: ");
scanf("%d",&n);
while (n<=0)
{ printf(" Nhap lai so lan thuc hien: ");
scanf("%d",&n);
}
printf("\n a)\n => Bang phan phoi xac suat cua X la:\n\n");
for(i=0;i<=n;i++)
X[i]=ToHop(i,n)*pow(a,i)*pow(1-a,n-i);
printf("\tX |");
for(i=0;i<=n;i++)
printf("%8d",i);
printf("\n ");
for(i=1;i<=15+8*(n+1);i++)
printf("-");
printf("\n P(X = xi) | ");
for(i=0;i<=n;i++)
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
254
printf("%.4f ",X[i]);
printf("\n\n Ky vong cua X la: EX = %.4f",KyVong(X,n));
printf("\n Phuong sai cua X la: DX = %.4f",PhuongSai(X,n));
printf("\n Do lech chuan cua X la: Delta(X) =
%.4f\n",sqrt(PhuongSai(X,n)));
printf("\n => Bang phan phoi xac suat cua Y la:\n\n");
for(i=0;i<=n;i++)
Y[i]=ToHop(i,n)*pow(b,i)*pow(1-b,n-i);
printf("\tY |");
for(i=0;i<=n;i++)
printf("%8d",i);
printf("\n ");
for(i=1;i<=15+8*(n+1);i++)
printf("-");
printf("\n P(Y = yi) | ");
for(i=0;i<=n;i++)
printf("%.4f ",Y[i]);
printf("\n\n Ky vong cua Y la: EY = %.4f",KyVong(Y,n));
printf("\n Phuong sai cua Y la: DY = %.4f",PhuongSai(Y,n));
printf("\n Do lech chuan cua Y la: Delta(Y) =
%.4f\n",sqrt(PhuongSai(Y,n)));
printf("\n b)\n => Xac suat de so lan thuc hien thanh cong cua hai nguoi
bang nhau la: ");
M=0;
for(i=0;i<=n;i++)
M+=X[i]*Y[i];
printf("%.4f\n",M);
printf("\n c)\n => Xac suat de so lan thanh cong cua nguoi thu nhat lon
hon cua nguoi thu hai la: ");
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
255
H=0;
for(i=0;i<=n;i++)
for(j=0;j<i;j++)
H+=X[i]*Y[j];
printf("%.4f\n",H);
printf("\n d)\n Z la tong so lan thuc hien thanh cong cua hai nguoi.\n");
printf(" => Bang phan phoi xac suat cua Z la:\n\n");
for(i=0;i<=2*n;i++)
{ Z[i]=0;
for(j=0;j<=n;j++)
for(k=0;k<=n;k++)
if(i==j+k)
Z[i]+=X[j]*Y[k];
}
printf("\tZ |");
for(i=0;i<=2*n;i++)
printf("%8d",i);
printf("\n ");
for(i=1;i<=15+8*(2*n+1);i++)
printf("-");
printf("\n P(Z = zi) | ");
for(i=0;i<=2*n;i++)
printf("%.4f ",Z[i]);
printf("\n\n Ky vong cua Z la: EZ = %.4f",KyVong(Z,2*n));
printf("\n Phuong sai cua Z la: DZ = %.4f",PhuongSai(Z,2*n));
printf("\n Do lech chuan cua Z la: Delta(Z) =
%.4f\n",sqrt(PhuongSai(Z,2*n)));
printf("\n e)\n");
k=1;
p=1-pow(Z[0],(float)1/2/n);
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
256
for(i=0;i<=2*n;i++)
if(fabs(Z[i]-ToHop(i,2*n)*pow(p,i)*pow(1-p,2*n-i))>0.000001)
k=0;
if(k==0)printf(" => Z khong co phan phoi nhi thuc.\n");
else printf(" => Z co phan phoi nhi thuc.\n");
printf("\n g)\n Dai luong ngau nhien G = 2X + 3Y.\n");
printf(" => Bang phan phoi xac suat cua G la:\n\n");
for(i=0;i<=5*n;i++)
{ G[i]=0;
for(j=0;j<=n;j++)
for(k=0;k<=n;k++)
if(i==2*j+3*k)
G[i]+=X[j]*Y[k];
}
printf("\tG |");
for(i=0;i<=5*n;i++)
printf("%8d",i);
printf("\n ");
for(i=1;i<=15+8*(5*n+1);i++)
printf("-");
printf("\n P(G = gi) | ");
for(i=0;i<=5*n;i++)
printf("%.4f ",G[i]);
printf("\n\n => Xac suat de G = 2X + 3Y la mot so chan bang: ");
V=0;
for(i=0;i<=5*n;i++)
if(i%2==0)V+=G[i];
printf("%.4f\n",V);
printf("\n h)\n => Bang phan bo xac suat so don vi dau cua nguoi thu
nhat:\n\n");
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
257
a=1-a;
b=1-b;
for(i=0;i<=n;i++)
P1[i]=4.5*i;
for(i=0;i<=n;i++)
P2[i]=ToHop(i,n)*pow(a,i)*pow(1-a,n-i);
printf("\tR |");
for(i=0;i<=n;i++)
printf("%8.1f",P1[i]);
printf("\n ");
for(i=1;i<=15+8*(n+1);i++)
printf("-");
printf("\n P(R = ri) | ");
for(i=0;i<=n;i++)
printf("%.4f ",P2[i]);
printf("\n\n Bang phan bo xac suat so don vi dau cua nguoi thu
hai:\n\n");
for(i=0;i<=n;i++)
Q1[i]=4*i;
for(i=0;i<=n;i++)
Q2[i]=ToHop(i,n)*pow(b,i)*pow(1-b,n-i);
printf("\tT |");
for(i=0;i<=n;i++)
printf("%8.1f",Q1[i]);
printf("\n ");
for(i=1;i<=15+8*(n+1);i++)
printf("-");
printf("\n P(T = ti) | ");
for(i=0;i<=n;i++)
printf("%.4f ",Q2[i]);
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
258
k=0;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
{ R[k]=P1[i]+Q1[j];
k++;
}
SapXep(R,k);
W[0]=R[0];
i=1;
for(j=1;j<k;j++)
if(R[j]!=R[j-1])
{ W[i]=R[j];
i++;
}
l=i;
for(i=0;i<l;i++)
{ L[i]=0;
for(j=0;j<=n;j++)
for(k=0;k<=n;k++)
if(W[i]==P1[j]+Q1[k])
L[i]+=P2[j]*Q2[k];
}
printf("\n\n Bang phan bo xac suat cua tong so don vi dau la:\n\n");
n=l;
printf("\tK |");
for(i=0;i<n;i++)
printf("%7.1f",W[i]);
printf("\n ");
for(i=1;i<=15+7*n;i++)
printf("-");
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
259
printf("\n P(K = ki) | ");
for(i=0;i<n;i++)
printf("%.4f ",L[i]);
KV=0;
for(i=0;i<n;i++)
KV+=W[i]*L[i];
printf("\n\n => So don vi dau trung binh ma ca hai nguoi bi phat la:
%.4f\n\n",KV);
getch();
printf(" Nhap vao phim 1 de tiep tuc, nhap phim khac de thoat: ");
scanf("%d",&o);
if(o==1)
{printf("\n\n");
for(i=1;i<=148;i++)
printf("_");printf("\n");
goto tieptuc;
}
else
printf("\n\n\n\t\t\t*The end*\n\t\t Chuc cac ban may man!\n");
for(i=1;i<=148;i++)
printf("_");printf("\n");
getch();
}
int GiaiThua (int x)
{
if(x<=1)return 1;
else return x*GiaiThua(x-1);
}
int ToHop (int y,int z)
{
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
260
return GiaiThua(z)/GiaiThua(y)/GiaiThua(z-y);
}
float KyVong(float z[],int n)
{
int i;
float EX=0;
for(i=0;i<=n;i++)
EX+=i*z[i];
return (EX);
}
float PhuongSai(float k[],int n)
{
int i;
float EX2=0;
for(i=0;i<=n;i++)
EX2+=i*i*k[i];
return (EX2-pow(KyVong(k,n),2));
}
void SapXep(float m[],int n)
{
int i,j;
float TrungGian;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(m[i]>m[j])
{ TrungGian=m[i];
m[i]=m[j];
m[j]=TrungGian;
}
}
* Giải thích:
In xong 03/11/2013
Hoàng Văn Trọng – 0974.971.149
261
Bài 200:
*Hết*
----------------------------------------------------------------------------------------------------
Mọi người có thể vào địa chỉ sau để download file pdf này cũng như phần
mềm C/C++ và tài liệu hướng dẫn học C, các bài tập – bài thi của những lớp khác,
trường khác,
Mail: dhkhtnhn334@gmail.com
Mật khẩu: daihoctunhien
Sau đó vào thư mục: HỌC TẬP/ THCS 3 ở khung bên trái.
Mình sẽ cố gắng cập nhật liên tục các bài tập theo từng buổi học!
Lưu ý: Phần mềm C/C++ đã được cài đặt sẵn, chỉ cần copy cả folder vào ổ C và
đưa biểu tượng ra desktop là chạy bình thường.
Có gì thắc mắc thì liên hệ với mình: 0974.971.149
Mail : hoangtronghus@yahoo.com.vn
Các file đính kèm theo tài liệu này:
- ngon_ngu_lap_trinh_c_8205.pdf