Professional Documents
Culture Documents
BÀI GIẢNG
1
Trường ĐH CNTP TP.HCM
Khoa: CÔNG NGHỆ THÔNG TIN BÀI 1. KIỂU DỮ LIỆU VÀ
Bộ môn: CÔNG NGHỆ PHẦN MỀM PHÉP TOÁN
Môn: TH NGÔN NGỮ LẬP TRÌNH
A. MỤC TIÊU:
Tạo được một chương trình viết bằng ngôn ngữ C/C++.
Sử dụng được hàm nhập, xuất chuẩn
Sử dụng được các chuỗi định dạng khác nhau khi xuất dữ liệu
Vận dụng được các kiểu dữ liệu và biến trong lập trình
Vận dụng được các toán tử để giải quyết bài toán
Phân biệt được các kiểu dữ liệu trong lập trình
C. VẬT LIỆU
Visual C++.Net.
Phần mềm hỗ trợ dạy học: NetOp School hoặc NetSupport School.
2
– Chọn Visual C++ Win32 Console Application Đặt tên (Name) và chọn thư
mục lưu Project (Location) Chọn OK.
3
– Chọn Empty project, sau đó chọn Finish.
– Nhấn chuột phải vào Source files trên thanh Solution Explorer (bên phải) Add
New Item
4
– Chọn C++ File Đặt tên File (Name) Add.
– Sau đó viết code vào màn hình soạn thảo
– Thực thi chương trình: Nhấn phím F5 hoặc vào Debug Start Debugging.
2. Các kiểu dữ liệu cơ sở
– Kiểu số nguyên
– Kiểu số thực:
– Kiểu ký tự:
Tên kiểu: char
Miền giá trị: 256 ký tự trong bảng mã ASCII.
Kiểu kí tự chính là kiểu số nguyên và nó lưu tất cả dữ liệu ở dạng số và không lưu
trực tiếp ký tự mà chỉ lưu mã ASCII của ký tự đó.
Mã ASCII từ ‘A’ đến ‘Z’ là 65 đến 90
Mã ASCII từ ‘a’ đến ‘z’ là 97 đến 122.
5
– Kiểu luận lý: Trong C chuẩn, không có kiểu luận lý. Giá trị sai (false) là 0, giá trị
đúng (true) là khác 0 (thường là 1). Trong C++, kiểu luận lý là bool
6
5. Ép kiểu dữ liệu
– Ngầm định: Kiểu dữ liệu đích phải có dãy giá trị lớn hơn kiểu dữ liệu nguồn
Ví dụ: chuyển từ int sang float.
int a = 10;
float f = a;
– Tường minh: Thay đổi kiểu dữ liệu có dãy giá trị lớn sang dãy giá trị nhỏ hơn
Ví dụ: chuyển từ float sang int
float f = 10.51;
int a = (int) f;
6. Câu lệnh nhập xuất
– Thư viện:
#include <stdio.h> (standard input/output)
7
Đều tăng <biến> thêm 1 đơn vị
Cách sử dụng như nhau nếu chúng nằm độc lập
– Khác nhau giữa ++<biến> và <biến>++
Khi chúng nằm trong một biểu thức.
++<biến> sẽ tăng <biến> trước khi thực hiện biểu thức
<biến>++ sẽ thực hiện biểu thức trước khi tăng <biến>
Ví dụ:
int i = 1;
int b = 10 + ++i; // (1) sẽ khác với int b = 10 + i++(2). Biểu thức thức (1) b
sẽ có kết quả là 12. Biểu thức (2) b sẽ có kết quả là 11.
– Tương tự cho toán tử --
9. Toán tử điều kiện
– Cú pháp: <biểu thức 1> ? <biểu thức 2> : <biểu thức 3>
<biểu thức 1> đúng thì giá trị là <biểu thức 2>.
<biểu thức 1> sai thì giá trị là <biểu thức 3>.
Ví dụ:
s1 = (1 > 2) ? 2912 : 1706;
int s2 = 0;
1 < 2 ? s2 = 2912 : s2 = 1706;
Kết quả: s1 = 1706, s2 = 2912
10. Các bước thực hiện bài thực hành
– Bước 1: Phân tích bài toán.
– Bước 2: Cài đặt chương trình.
– Bước 3: Kiểm tra và chạy thử.
8
2. Viết chương trình nhập vào 1 số nguyên, xuất ra màn hình số vừa nhập.
#include<stdio.h>
#include<conio.h>
void main()
{
int a;
printf("Nhap so nguyen a: ");
scanf("%d", &a);
printf("So nguyen vua nhap la: %d", a);
getch();
}
3. Viết chương trình nhập vào 2 số nguyên, tính và xuất kết quả tổng, tích, hiệu
và thương 2 số nguyên vừa nhập.
#include<stdio.h>
#include<conio.h>
void main()
{
int a, b;
printf("Nhap 2 so nguyen: ");
scanf("%d%d", &a, &b);
int tong = a + b;
int hieu = a - b;
int tich = a * b;
//Ep kieu tu so nguyen sang so thuc
float thuong = (float)a/(float)b;
printf("Tong = %d\n", tong);
printf("Hieu = %d\n", hieu);
printf("Tich = %d\n", tich);
//In ra so thuc co 1 chu so thap phan
printf ("Thuong = %0.1f", thuong);
getch();
}
4. Tính tiền khách ở trong tháng.
– Nhập vào ngày đến ở khách sạn, nhập ngày rời khỏi khách sạn.
– Tính tổng số ngày khách đã ở trong tháng.
– Tính tiền khách phải trả, biết rằng đơn giá tuần là 650 và đơn giá ngày là 100.
#include<stdio.h>
#include<conio.h>
void main()
{
int nv, nr;
printf("Nhap vao ngay vao, ngay ra: ");
9
scanf("%d%d", &nv, &nr);
int tong = nr - nv;
printf("Tong so ngay khach o trong thang: %d\n", tong);
int tien = tong/7 * 650 + tong % 7 * 100;
printf("Tien khach phai tra la: %d", tien);
getch();
}
5. Tình diện tích hình tròn. Gợi ý: sử dụng hằng số pi để thực hiện
#include<stdio.h>
#include<conio.h>
void main()
{
const float pi = 3.14;
float r;
printf("Nhap ban kinh: ");
scanf("%f", &r);
float dt = pi * r * r;
printf("Dien tich: %0.2f", dt);
getch();
}
6. Nhập vào 2 số nguyên a,b. Tìm số lớn nhất trong 2 số.
#include<stdio.h>
#include<conio.h>
void main()
{
int a, b;
printf("Nhap 2 so nguyen: ");
scanf("%d%d", &a, &b);
int max = (a>b)?a:b;
printf("Max = %d", max);
getch();
}
7. Nhập chương trình sau, thực thi và xem kết quả để phân biệt sự giống và
khác nhau của toán tử 1 ngôi.
#include<stdio.h>
#include<conio.h>
void main()
{
int i = 1;
printf("i = %d\n", i);
int bt = 10 + ++i;
printf("Ket qua cua bieu thuc: 10 + ++i la: %d; gia tri cua
i la: %d\n", bt, i);
10
i = 1;
printf("Khoi tao lai gia tri i = %d\n", i);
bt = 10 + i++;
printf("Ket qua cua bieu thuc: 10 + i++ la: %d; gia tri cua
i la: %d\n", bt, i);
getch();
}
8. Nhập mã ASCII. Nếu mã ASCII là của 26 chữ cái tiếng Anh (A -> Z) thì in ra
kết quả là “là chữ cái”, ngược lại in ra ký tự tương ứng với mã đó.
#include<stdio.h>
#include<conio.h>
void main()
{
int as;
printf("Nhap ma ASCII: ");
scanf("%d", &as);
((as >= 65 && as <= 90) || (as >= 97 && as <=
122))?(printf("La chu cai")):(printf("Ky tu: %c", as));
getch();
}
11
Hướng dẫn:
- 2 số nguyên được nhập từ bàn phím
- Tính thương của 2 số nguyên (bài tập mẫu hướng dẫn 6 trang 6)
- Tính làm tròn thương bằng cách +0.5 cho thương và ép về số nguyên
- Xuất phần thương có 1 chữ số thập phân
4. Viết chương trình để có kết quả như sau:
Hướng dẫn:
- 2 số nguyên (đơn giá tuần, đơn giá ngày) là hằng số
- 1 số nguyên (tổng số ngày) được nhập từ phím
- Tính số tuần dựa vào phần nguyên khi chia tổng số ngày cho 7
- Tính số ngày lẻ dựa vào hiệu của tổng ngày và (số tuần *7)
- Tính tiền phải trả dựa vào tổng tiền thuê theo tuần và tiền thuê theo ngày lẻ.
5. Viết chương trình để tính tiền sân bóng đá như sau:
- Tính tiền giờ dựa vào giờ vào và giờ ra. Mỗi giờ là 200,000
- Tính tiền nước uống dựa vào số bình nước đã uống. Mỗi bình nước 20,000
- Tính tổng tiền: tiền giờ + tiền nước uống.
6. Nhập tuổi của 1 người. In ra năm sinh của người đó.
7. Nhập 4 số nguyên. Tính tổng 2 số đầu, tính hiệu hai số cuối. Tính thương cho tổng
2 số đầu và tổng 2 số cuối. In thương với 0 số thập phân và 1 số thập phân.
8. Nhập năm sinh. Tính tuổi tương ứng. Nếu tuổi >= 18 thì in ra: “đủ tuổi đi làm”,
ngược lại in ra: “còn tuổi đi học”.
9. Viết chương trình tính giá trị của biểu thức f, với x là số nguyên, f(x) là biểu thức
số học kiểu số thực)
3x 2 4 x 5
f ( x)
2 x 1
10. Viết chương trình tính biểu thức sau (x là số nguyên, f(x) là số thực)
3x 5 2 x x 1
f ( x)
5x 2 3
12
- Tiền = số lượng * đơn giá
- Thuế giá trị gia tăng = 10% *tiền
3. Nhập điểm thi và hệ số 3 môn Toán, Lý, Hóa của một sinh viên. Tính điểm trung
bình của sinh viên đó.
4. Nhập 2 cạnh của hình chữ nhật (là số nguyên). Tính diện tích, chu vi và độ dài
đường chéo (số thực) của hình chữ nhật.
5. Nhập vào 1 ký tự, kiểm tra ký tự đó là: kí tự in hoa, kí tự thường hay ký tự khác.
6. Nhập 1 ký tự. Kiểm tra ký tự đó có thuộc 26 chữ cái tiếng Anh hay không?
7. Viết chương trình giải phương trình bậc nhất: ax + b = 0 (a khác 0), với a, b là số
nguyên, x là số thực.
i. Nhập hai số nguyên. In ra giá trị lớn nhất và giá trị nhỏ nhất trong 2 số vừa nhập
8. Nhập 3 số nguyên. In ra giá trị lớn nhất và giá trị nhỏ nhất trong 3 số vừa nhập.
9. Viết chương trình để có kết quả như sau:
13
Trường ĐH CNTP TP.HCM
Khoa: CÔNG NGHỆ THÔNG TIN BÀI 2. CẤU TRÚC ĐIỀU
Bộ môn: CÔNG NGHỆ PHẦN MỀM KIỆN
Môn: TH NGÔN NGỮ LẬP TRÌNH
A. MỤC TIÊU:
Áp dụng được cấu trúc điều khiển để xây dựng cách giải bài toán thực tế.
Phân tích được các trường hợp rẽ nhánh của bài toán.
Cài đặt được bài toán rẽ nhánh sử dụng câu lệnh if, if..else…
Cài đặt được bài toán có cấu trúc rẻ nhánh switch…case…
Phân biệt được sự khác nhau giữa cấu trúc if…else…và switch…case…
C. VẬT LIỆU
Visual C++.Net.
Phần mềm hỗ trợ dạy học: NetOp School hoặc NetSupport School.
14
}
2. Câu lệnh if…else…
Sử dụng khi rẽ nhánh chỉ có 2 trường hợp trái ngược nhau xảy ra. Nếu không
thực hiện trường hợp này thì phải thực hiện trường hợp kia và ngược lại.
Ví dụ: Nếu sinh viên có điểm trung bình lớn hơn hoặc bằng 4.0 thì đậu, ngược
lại thì rớt. Ta thấy trong ví dụ này, bất kỳ sinh viên nào cũng chỉ có thể rơi vào trường hợp
“đậu” hoặc “rớt”, không có trường hợp khác.
Sinh viên có điểm trung bình lơn hơn hoặc bằng 4.0: “đậu”.
Sinh viên lớp khác: “rớt”.
Cú pháp:
if(<biểu thức điều kiện>)
{
// Câu lệnh khi thõa điều kiện
}
else
{
//Câu lệnh khi không thõa điều kiện
}
Ví dụ:
if(dtb>=4.0)
printf("Dau");
else
printf("rot");
3. Câu if lồng nhau:
Sử dụng khi rẽ nhánh có từ 3 trường hợp trở lên.
Cú pháp
if(<biểu thức điều kiện 1>)
{
// Câu lệnh khi thõa điều kiện
}
else if(<biểu thức điều kiện 2>)
{
//Câu lệnh khi không thõa điều kiện
}
else if(<biểu thức điều kiện 3>)
{
}
...
else
{
//Câu lệnh khi không thõa các điều kiên trên
}
15
Ví dụ: Căn cứ vào điểm trung bình ta xếp loại sinh viên như sau:
Nếu đtb>=8.0 thì xếp loại giỏi
Nếu 8.0>dtb>=6.5 thì xếp loại khá
Nếu 6.5>dtb>=5.0 thì xếp loại trung bình
Còn lại thì xếp loại yếu
Như vậy, ta viết đoạn chương trình thực hiện yêu cầu trên bằng cách sử dụng cấu trúc
if lồng nhau như sau;
if(dtb>=8.0)
printf("Xep loại gioi");
else if(dtb>=6.5)
printf("Xep loai kha");
else if(dtb>=5.0)
printf("Xep loai trung binh");
else
printf("Xep loại Yeu"):
4. Một vài chú ý:
Biểu thức điều kiện trong cấu trúc if, if…else… phải là một mệnh đề có giá
trị đúng hoặc sai.
Biểu thức điều kiện có thể chỉ gồm một biểu thức đơn giản hoặc có thể là sự
kết hợp của nhiều biểu thức điều kiện thông qua các phép toán và (&&), hoặc (||), phủ định (!).
5. Câu lệnh switch…case…
Sử dụng khi bài toán rẽ nhánh có nhiều trường hợp (thường là từ 3 trở lên) và
mỗi trường hợp là một giá trị cụ thể (có kiểu giá trị số nguyên hoặc ký tự)
VD: Nếu xếp hạng 1 bạn được thưởng 10 cuốn tập, xếp hạng 2 bạn được
thưởng 8 cuốn tập, xếp hạng 3 bạn được thưởng 5 cuốn tập, xếp hạng 4 bạn được thưởng 3
cuốn tập, còn lại bạn không được thưởng.
Hạng 1: 10 cuốn tập
Hạng 2: 8 cuốn tập
Hạng 3: 5 cuốn tập
Hạng 4: 3 cuốn tập
Còn lại: 0 cuốn tập
Cú pháp:
switch(<bieuthuc>)
{
case <giá trị 1>:
{
//xử lý khi biểu thức bằng giá trị 1
}break;
case <giá trị 2>:
{
16
//xử lý khi biểu thức bằng giá trị 2
}break;
case <giá trị 3>:
{
//xử lý khi biểu thức bằng giá trị 2
}break;
...
default:
//xử lý khi biểu thức không bằng các giá trị trên
}
Ví dụ:
switch(xephang)
{
case 1:
{
printf("Thuong 10 cuon tap");
}break;
case 2:
{
printf("Thuong 8 cuon tap");
}break;
case 3:
{
printf("Thuong 5 cuon tap");
}break;
case 4:
{
printf("Thuong 3 cuon tap");
}break;
default:
printf(" Ban khong duoc thuong tap");
}
Mỗi trường hợp (case) trong câu lệnh switch phải kết thúc bằng lệnh break;
Kiểu trả về của <biểu thức> trong câu lện switch phải có cùng kiểu với các <gia
tri1>, <gia tri 2>,…
Cần xác định đúng biểu thức rẽ nhánh trong câu lệnh switch…case. Biểu thức rẽ
nhánh là biểu thức có thể nhận các giá trị khác nhau nhưng trong mỗi trường hợp
chỉ nhận 1 giá trị duy nhất. Biểu thức có thể là một biến.
17
1. Nhập vào điểm trung bình môn Ngôn ngữ lập trình của sinh viên. In ra màn
hình cho biết sinh viên đó đậu hay rớt biết rằng nếu điểm trung bình lớn hơn hoặc
bằng 4.0 thì đậu ngược lại là rớt.
Bước 1: Phân tích bài toán
- Nhập điểm trung bình
- Xuất ra kết quả đậu hay rớt dựa vào điểm trung bình đã nhập.
- 01 biến dtb (điểm trung bình) có kiểu là số thực
- Bài toán có 2 trường hợp là đậu, rớt => sử dụng cấu trúc if…else…
- Biều thức điều kiện: dtb>=4.0
Bước 2: Cài đặt chương trình
- Tạo project mới (giống các bài thực hành trước): File new Project
- Chọn ngôn ngữ là C++
- Khai báo thư viện và viết hàm main
#include "stdio.h"
#include "conio.h"
- Khai báo và nhập dữ liệu
float dtb;
printf("nhap diem trung binh mon NNLT");
scanf("%f",&dtb);
- Cài đặt câu lệnh rẽ nhánh
if(dtb >=4.0)
printf("Dau");
else
printf("Rot");
Bước 3: Kiểm tra, sửa lỗi và chạy thử
2. Nhập vào một số nguyên, cho biết số vừa nhập có là số chẵn hay không?
Bước 1: Phân tích bài toán
- Nhập số nguyên bất kỳ
- Xuất ra kết quả số chẵn hoặc không làm gì cả
- 01 biến n có kiểu là số nguyên (int)
- Bài toán có 1 trường hợp là số chẵn => sử dụng cấu trúc if…
- Biểu thức điều kiện: n%2==0
Bước 2: Cài đặt chương trình
- Khai báo thư viện và viết hàm main
#include "stdio.h"
#include "conio.h"
- Khai báo và nhập dữ liệu
int n;
printf("nhap vap mot so nguyen:");
18
scanf("%d",&n);
- Cài đặt câu lệnh rẽ nhánh
if(n%2==0)
printf("%d la so chan", n);
Bước 3: Kiểm tra, sửa lỗi và chạy thử
3. Nhập vào một năm, cho biết năm vừa nhập có phải là năm nhuận hay không.
Biết rằng năm nhuận là năm chia hết cho 4 mà không chia hết cho 100 hoặc năm
chia hết cho 400? Ví dụ: 1996 là năm nhuận vì 1996 chia hết cho 4 và không chia hết
cho 100
Bước 1: Phân tích bài toán
- Nhập vào một năm (số nguyên)
- Xuất ra kết quả là năm nhuận hoặc năm không nhuận
- 01 biến nam (năm) có kiểu là số nguyên (int)
- Bài toán có 2 trường hợp là năm nhuận, năm không nhuận => sử dụng cấu trúc
if…else…
- Biểu thức điều kiện: (nam%4==0 && nam%100!=0)||(nam%400==0)
Bước 2: Cài đặt chương trình
- Khai báo thư viện và viết hàm main
#include "stdio.h"
#include "conio.h"
- Khai báo và nhập dữ liệu
int nam;
printf("nhap vao nam can kiem tra:");
scanf("%d",&nam);
- Cài đặt câu lệnh rẽ nhánh
if((nam%4==0 && nam%100!=0) || (nam%400))
printf("%d la nam nhuan", nam);
else
printf("%d khong phai la nam nhuan", nam);
Bước 3: Kiểm tra, sửa lỗi và chạy thử
4. Một môn học lý thuyết thường có 03 cột điểm hệ số 10: điểm tiểu luận, điểm
giữa kỳ, điểm cuối kỳ có tỉ lệ lần lượt là 20%, 30%, 50%. Hãy cho biết điểm chữ của
môn học khi người dùng nhập vào điểm tiểu luận, điểm giữa kỳ và điểm cuối kỳ. Giả
sử rằng cách qui đổi điểm hệ số 10 sang điểm chữ như sau:
Điểm hệ 10 điểm chữ
Điểm hệ 10 >=8.5 A
19
8.5> điểm hệ 10 >=7.0 B
7.0> điểm hệ 10>=5.5 C
5.5>điểm hệ 10 >=4.0 D
4.0> điểm hệ 10 F
20
5. Nhập vào 2 số nguyên a và b, nhập vào một phép toán +, -, *, /. Hãy in ra màn
hình kết quả của phép toán vừa nhập với 2 số hạng là a, b đã nhập
Bước 1: Phân tích bài toán
- Nhập 2 số nguyên bất kỳ, nhập 1 phép toán
- Xuất ra kết quả của phép toán vừa nhập
- 02 biến số nguyên (int), 01 biến lưu phép toán (biến pheptoan, kiểu char), 01
biến luu kết quả (biên kết quả kiểu int)
- Bài toán có 4 trường hợp của phép toán: +,-,*,/ => dùng cấu trúc
switch…case
- Biều thức rẽ nhánh: biến pheptoan
Bước 2: Cài đặt chương trình
- Khai báo và nhập dữ liệu
int a,b, ketqua=0;
printf("nhap vao 2 so nguyen:");
scanf("%d%d",&a,&b);
flushall();
char pheptoan;
printf("nhap vao phep toan ban muon tinh:");
scanf("%c", &pheptoan);
Lưu ý: trước khi nhập phép toán phải có câu lệnh flushall(); để xóa bỏ các giá
trị còn lưu trong vùng đệm
- Cài đặt câu lệnh rẽ nhánh
switch(pheptoan)
{
case '+': ketqua=a+b; break;
case '-': ketqua=a-b;break;
case '*': ketqua=a*b;break;
case '/': ketqua=a/b;break;
}
Bước 3: Kiểm tra, sửa lỗi và chạy thử
6. Nhập một tháng (nhập bằng số), in ra màn hình tháng đó bằng tiếng Anh
tương tứng (January, February, March, April, May, June, July, August, September,
October, November, December). Nếu nhập tháng không đúng in ra màn hình
“Month is invalid”
Bước 1: Phân tích bài toán
- Nhập vào một số tháng bằng số nguyên
- Xuất tháng đó ra màn hình bằng tiếng Anh tương ứng
- 01 biến thang có kiểu là số nguyên (int)
- Bài toán có 12 trường hợp hợp lệ và 01 trường hợp không hợp lệ => sử dụng
switch…case…
- Biều thức rẽ nhánh: sử dụng biến thang
21
Bước 2: Cài đặt chương trình
- Khai báo thư viện và viết hàm main
- Khai báo và nhập dữ liệu
int thang;
printf("nhap vao mot thang cua nam:");
scanf("%d",&thang);
- Cài đặt câu lệnh rẽ nhánh
switch(thang)
{
case 1: printf("January"); break;
case 2: printf("February"); break;
case 3: printf("March"; break;
case 4: printf("April"); break;
case 5: printf("May"); break;
case 6: printf("June"); break;
case 7: printf("July"); break;
case 8: printf("August"); break;
case 9: printf("September"); break;
case 10: printf("October"); break;
case 11: printf("November"); break;
case 12: printf("December"); break;
default: printf("Month is invalid");
}
Bước 3: Kiểm tra, sửa lỗi và chạy thử
III. Bài tập ở lớp
1. Viết chương trình nhập vào 2 số a, b. Tìm số lớn nhất giữa 2 số.
2. Viết chương trình nhập vào một số nguyên, kiểm tra số đã nhập là số âm hay số
dương
3. Viết chương trình nhập vào 2 số nguyên, so sánh 2 giá trị vừa nhập vào (“Bằng
nhau, nhỏ hơn, lớn hơn”).
4. Nhập vào thứ tự của tháng, cho biết tháng đó có bao nhiêu ngày.
5. Viết một chương trình tính chu vi, diện tích theo dạng menu cho phép người dùng
chọn lựa một trong các hình bên dưới (dùng cấu trúc switch…case)
1. Hình vuông
2. Hình chữ nhật
3. Hình tròn
6. Viết chương trình nhập vào 2 số a,b. Kiểm tra a có là bội số của b không.
7. Viết chương trình nhập vào đơn giá 1 mặt hàng, và số lượng bán của mặt hàng.
Tính tiền khách phải trả, với thông tin như sau:
Thành tiền: đơn giá * số lượng
Giảm giá: Nếu thành tiền > 100, thì giảm 3% thành tiền, ngược lại không giảm
Tổng tiền phải trả: thành tiền – giảm giá.
22
8. Viết chương trình hỗ trợ cách giải phương trình bậc 1 (ax + b = 0)
9. Nhập vào 1 số bất kỳ (09), cho biết cách đọc số vừa nhập
10. Viết một chương trình dạng menu cho phép người dùng chọn một trong các chức
năng bên dưới:
1. In ra màn hình “Xin chào các bạn”
2. Chức năng đổi nhiệt độ C sang độ F
3. Chức năng tính chu vi và diện tích hình tròn
23
Trường ĐH CNTP TP.HCM
Khoa: CÔNG NGHỆ THÔNG TIN BÀI 3. CẤU TRÚC LẶP
Bộ môn: CÔNG NGHỆ PHẦN MỀM FOR
Môn: TH NGÔN NGỮ LẬP TRÌNH
A. MỤC TIÊU:
Phân tích được công việc lặp của bài toán.
Áp dụng được cấu trúc lặp để xây dựng cách giải bài toán thực tế
Cài đặt được bài toán lặp sử dụng câu lệnh for
Kết hợp cấu trúc lặp for có lồng cấu trúc điều kiện if, if…else…, switch…case.
C. VẬT LIỆU
Visual C++.Net.
Phần mềm hỗ trợ dạy học: NetOp School hoặc NetSupport School.
24
II. Bài tập mẫu hướng dẫn thực hành
1. In ra màn hình 10 lần câu “Xin chao cac ban” (mỗi câu nằm trên 1 dòng)
Bước 1: Phân tích bài toán
- Xuất ra 10 lần câu “Xin chao cac ban”. Mỗi câu nằm trên một dòng
- Bài toán có phép lặp với số lần lặp là 10=> sử dụng vòng lặp for
- Công việc cần lặp: In ra màn hình câu nói “Xin chao cac ban”
Bước 2: Cài đặt chương trình
- Khai báo thư viện và viết hàm main
#include "stdio.h"
#include "conio.h"
- Khai báo và nhập dữ liệu: không có
- Cài đặt câu lệnh rẽ nhánh
for(int i=0; i<10; i++)
{
printf("\n Xin chhao cac ban");
}
Bước 3: Kiểm tra, sửa lỗi và chạy thử
25
S = S + i*i;
}
printf("\n Tong S=%d",S);
Bước 3: Kiểm tra, sửa lỗi và chạy thử
Lưu ý: Cách xác định các thành phần của vòng lặp for cho bài toán tính giá trị của một
biểu thức:
- Lấy công thức cuối cùng của biểu thức (n2).
- Xác định là biểu thức dùng tính tổng hay tính nhân , thay n bằng i. ta sẽ được công
thức lặp (i2 => công thức là S=S+i2)
- Áp dụng công thức sử dụng i vào số hạng đầu tiên ta sẽ tính được giá trị ban đầu của
i (i2=1 => i=1)
Ví dụ: Xác định công thức vòng lặp cho biểu thức: S=1/1 + 1/2 +1/3 +…+1/n;
- Công thức cuối: 1/n
- Công thức tính tổng: S=S+1/i (thay n bằng i).
- Giá trị lặp ban đầu của i là 1(i=1) vì 1/i=1/1
3. Nhập vào số nguyên dương n. Cho biết số nguyên dương n có bao nhiêu ước
là số nguyên dương.
Bước 1: Phân tích bài toán
- Nhập vào số nguyên dương n
- Đếm số ước nguyên dương của n đã nhập
- 02 biến n, dem là các số nguyên (int)
- Để đếm số ước của n ta cần lần lượt kiểm tra tất cả các số từ 1 tới n xem có
phải là ước của n không. Nếu n chia hết cho số nào thì số đó là ước và ta sẽ đếm số đó. Vậy
bài toán có công việc lặp với số lần lặp là từ 1 tới n, do đó dùng vòng lặp for
- Câu lệnh lặp: Mỗi lần lặp cần phải kiểm tra xem n có chia hết cho i không.
Nếu chia hết thì đếm, câu lệnh lặp có sử dụng lệnh rẽ nhánh if (vì chỉ có một trường hợp rẽ
nhánh): nếu n%i==0 thì dem++
Bước 2: Cài đặt chương trình
- Khai báo thư viện và viết hàm main
- Khai báo, nhập dữ liệu
int n;
printf("\n Nhap vao 1 so nguyen duong:");
scanf("%d", &n);
26
dem++;
}
printf("\n So uoc cua %d la: %d",n,dem);
Bước 3: Kiểm tra, sửa lỗi và chạy thử
27
Trường: ĐH CNTP TP.HCM
Khoa:CÔNG NGHỆ THÔNG TIN
Bộ môn:CÔNG NGHỆ PHẦN MỀM BÀI 4. CẤU TRÚC LẶP KHÁC
Môn:TH NGÔN NGỮ LẬP TRÌNH
A. MỤC TIÊU:
Xác định các bài toán cần sử dụng cấu trúc lặp
Áp dụng được cấu trúc lặp while, do...while để xây dựng cách giải bài toán thực tế.
Phân tích được công việc lặp của bài toán.
Cài đặt được bài toán lặp sử dụng câu lệnh while, do...while
Kết hợp cấu trúc lặp có lồng cấu trúc điều kiện if, if…else…, switch…case
Phân biệt sự khác nhau khi sử dụng cấu trúc for, while, do…while…
Áp dụng được các từ khóa break, continue lồng vào trong vòng lặp
B. DỤNG CỤ - THIẾT BỊ THÍ NGHIỆM CHO MỘT SV:
STT Chủng loại – Quy cách vật tư Số lượng Đơn vị Ghi chú
1 Máy tính (có thể là máy bàn hoặc laptop). 1 Chiếc
C. VẬT LIỆU
Visual C++.Net.
Phần mềm hỗ trợ dạy học: NetOp School hoặc NetSupport School.
29
- 02 biến số nguyên (int), 01 biến ucln (int)
- Sử dụng thuật tóan Euclid => số lần lặp của bài toán không xác định => sử
dụng vòng lặp while
- Thuật toán euclid tìm UCLN của a và b
Nếu a=b thì UCLN =a;
Nếu a>b thi UCLN(a,b)=UCLN(a-b,b)
Nếu a<b thi UCLN(a,b)=UCLN(a,b-a)
Bước 2: Cài đặt chương trình
- Khai báo thư viện và viết hàm main
- Khai báo và nhập dữ liệu
int a,b;
printf("\n nhap vao 2 so a va b:");
scanf("%d%d",&a,&b);
- Cài đặt câu lệnh lặp
while (a!=b)
{
if(a>b)
a = a- b;
else
b = b - a;
}
printf("UCLN la: %d", a);
Bước 3: Kiểm tra, sửa lỗi và chạy thử
2. Xây dựng một menu chương trình cho phép người dùng lựa chọn gồm các
yêu cầu sau:
1. In ra màn hình từ hello
2. In ra màn hình câu Vòng lặp for
3. In ra màn hình câu Vòng lặp while
4. Thoát chương trình.
Sau khi lựa chọn chức năng, chương trình sẽ thực hiện theo đúng chức năng đã chọn
rồi lại tiếp tục hiển thị menu. Chương trình chỉ dừng lại (kết thúc khi người dùng bấm phím số
4)
Bước 1: Phân tích bài toán
- Xuất ra màn hình menu theo yêu cầu
- Sử dụng 01 biến luachon là số nguyên (int)
- Menu này xuất hiện ít nhất 1 lần (cho lần chọn đầu tiên) và lặp đi lặp lại nhiều
lần => dùng cấu trúc lặp do…while
Bước 2: Cài đặt chương trình
- Cài đặt chương trình
int luachon;
30
do
{
printf("1. In ra man hinh tu Hello. \n");
printf("2. In ra man hinh Vong lap for \n");
printf("3. In ra man hinh Vong lap while \n");
printf("4. Thoat chuong trinh \n");
} while (luachon!=4);
Bước 3: Kiểm tra, sửa lỗi và chạy thử
3. Viết chương trình nhập vào một số nguyên dương n. Tính tổng các chữ số có
trong số nguyên dương n
Bước 1: Phân tích bài toán
- Nhập vào số nguyên dương n
- Tính tổng các chữ số có trong số nguyên dương n
- Cách thực hiện, ví dụ với n=629
tong=0;
n=629>0, tong=tong+ hàng đơn vị của n (số 9), cách lấy hàng đơn vị của
n (số 9) là n=n%10, sau đó gán lại giá trị cho n (62) bằng cách n=n/10
n=62>0 : tong=tong+ hàng đơn vị của n (số 2), cách lấy hàng đơn vị của n
(số 2) là n=n%10, sau đó gán lại giá trị cho n (6) bằng cách n=n/10
n=6>0: tong=tong+ hàng đơn vị của n (số 6), cách lấy hàng đơn vị của n
(số 6) là n=n%10, sau đó gán lại giá trị cho n (0) bằng cách n=n/10
n=0:dừng
- Ta thấy việc tong=tong+hang đơn vị của n và n=n/10 được lặp lại nhiều lần
nhưng không biết cụ thể bao nhiêu lần. Do đó ta phải dùng vòng lặp while.
32
Trường ĐH CNTP TP.HCM
Khoa: CÔNG NGHỆ THÔNG TIN BÀI 5. HÀM
Bộ môn: CÔNG NGHỆ PHẦN MỀM
Môn: TH NGÔN NGỮ LẬP TRÌNH
A. MỤC TIÊU:
Trình bày được các thành phần của một hàm trong C/C++.
Cài đặt được hàm trong C/C++.
Gọi được hàm và truyền được tham số trong C/C++.
Phân biệt tham trị và tham biến.
Xây dựng được hàm đệ qui trong C/C++.
C. VẬT LIỆU
Visual C++.Net.
Phần mềm hỗ trợ dạy học: NetOp School hoặc NetSupport School.
33
Processing: S=bán kính * bán kính * PI
(Trong đó, PI là hằng số có giá trị là 3.1416)
4. Hàm đệ qui:
Hàm đệ qui là hàm gọi lại chính nó trong thân hàm. Xây dựng hàm đệ qui cần xác
định 2 điều kiện sau:
Điều kiện dừng: là trường hợp mà hàm trả về kết quả trực tiếp
Điều kiện đệ qui: trường hợp mà hàm gọi lại chính nó ở mức độ nhỏ hơn
<kiểu trả về> <Tên hàm> (<danh sách tham số>)
{
if (<thõa điều kiện dừng>)
{
//xử lý
return <giá trị>
else
{
//xử lý
//gọi lại chính nó <Tên hàm> (<tham số>);
}
}
Vi dụ: Viết hàm tính tổng S=1 + 2 + 3 +…+ n
Điều kiện dừng: n=1 => S(1)=1
Điều kiện đệ qui: n>1: S(n)=n+S(n-1)
int Tong(int n)
{
if(n==1)
return 1;
else
return n+Tong(n-1);
}
II. Bài tập mẫu hướng dẫn thực hành
Các bước thực hiện
Bước 1: Xác định tên hàm, input, output, thuật toán
Bước 2: Cài đặt chương trình
Bước 3: Gọi hàm trong chương trình chính.
35
1. Viết hàm tìm ước chung lớn nhất của 2 số nguyên dương a và b. Viết hàm
main tính ước chung lớn nhất cho 2 số nguyên nhập vào từ bàn phím, sử dụng hàm đã
viết ở trên
Bước 1: Xác định tên hàm, input, output, thuật toán
- Tên hàm: UCLN (ước chung lớn nhất)
- Input: 2 số nguyên a, b (kiểu int)
- Output: ước chung lớn nhất của a,b là 1 số nguyên
- Sử dụng thuật toán euclid => số lần lặp của bài toán không xác định => sử dụng
vòng lặp while
- Thuật toán euclid tìm UCLN của a và b
Nếu a=b thì UCLN =a;
Nếu a>b thi UCLN(a,b)=UCLN(a-b,b)
Nếu a<b thi UCLN(a,b)=UCLN(a,b-a)
Bước 2: Cài đặt chương trình
- Cài đặt hàm
int UCLN(int a, int b)
{
while (a!=b)
{
if(a>b)
a = a - b;
else
b = b - a;
}
return a;
}
- Gọi hàm
int x,y;
printf("\n nhap vao 2 so nguyen duong:");
scanf("%d%d",&x,&y);
int uc = UCLN(x,y);
printf("Uoc chung lon nhat can tim la:%d", uc);
2. Viết hàm kiểm tra số nguyên dương n có phải là số nguyên tố hay không?
Viết hàm main minh họa kiểm tra số nguyên nhập vào từ bàn phím có phải là số nguyên
tố hay không?
Bước 1: Xác định tên hàm, input, output, thuật toán
- Tên hàm: ktraSNT (kiểm tra số nguyên tố)
- Input: 01 số nguyên dương n (kiểu int)
- Output: có hoặc không, đúng hoặc sai, true hoặc false => kiểu trả về là int (1:
đúng, 0: sai)
36
- Thuật toán:
Đếm số ước của n.
So sánh số ước của n với 2. Nếu số ước bằng 2 thì đó là số nguyên tố, ngược lại
không phải số nguyên tố
Bước 2: Cài đặt chương trình
- Cài đặt hàm
int KT_SNT(int n)
{
//dem so uoc cua n;
int demuoc=0;
for(int i=1; i<=n; i++)
if(n%i==0)
demuoc++;
//so sanh so uoc voi 2
if(demuoc==2)
return 1; //la so nguyen to
return 0; //khong la so nguyen to
}
- Gọi hàm
int so;
printf("\n nhap vao so nguyen muon kiem tra:");
scanf("%d",&so);
int kq = KT_SNT(so);
if(kq==1)
printf("\n Day la so nguyen to");
else
printf("\n Day khong phai la so nguyen to");
37
return x*LuyThua(x,n-1);
}
- Cách gọi hàm giống hàm bình thường
S(n) = 2 2 2 ... 2
6. Viết hàm tính tổng S(n) bên dưới bằng cách sử dụng hàm đệ qui.Viết hàm main
thực thi
1 1 1
S (n) 1 ...
2 3 n
7. Viết hàm tính n! bằng cách sử dụng hàm đệ qui. Viết hàm main thực thi.
n!=1*2*3*…*n
IV. Bài tập về nhà:
1. Viết hàm xuất số đảo của số nguyên dương n, n nhập từ phím. Viết hàm chương
trình thực thị
2. Nhập vào số nguyên dương h, viết chương trình in ra màn hình một trong các tam
giác sau (người dùng trùy chọn)
38
3. Viết chương trình tính tổng S(n)=1-2+3-4+ … +(-1)n-1n, trong đó n là số nguyên
dương, n nhập từ bàn phím.
1 1 1
S (n) ...
4. Viết chương trình tính tổng 2 4 2n , trong đó n là số nguyên
dương, n nhập từ bàn phím.
1 1 1
S (n) 1 ...
5. Viết chương trình tính tổng 3 5 2n 1 , , trong đó n là số
nguyên dương, n nhập từ bàn phím.
39
Trường ĐH CNTP TP.HCM
Khoa: CÔNG NGHỆ THÔNG TIN BÀI 6. MẢNG 1 CHIỀU
Bộ môn: CÔNG NGHỆ PHẦN MỀM
Môn: TH NGÔN NGỮ LẬP TRÌNH
A. MỤC TIÊU:
Khai báo được cấu trúc dữ liệu mảng 1 chiều.
Phân tích được tình huống sử dụng mảng 1 chiều để lưu trữ dữ liệu.
Cài đặt được các hàm nhập, xuất, xử lý dữ liệu trong các thao tác tính tổng, đếm giá trị
phần tử.
Áp dụng được mảng 1 chiều để xây dựng cách giải bài toán đơn giản trên tập hợp.
C. VẬT LIỆU
Visual C++.Net.
Phần mềm hỗ trợ dạy học: NetOp School hoặc NetSupport School.
40
Trong đó:
i là chỉ số của mảng (i[0,9]).
a[i] là giá trị của phần tử thứ i
2. Tham số mảng của một hàm
<Kiểu dữ liệu> <Tên hàm> (<kiểu dữ liệu mảng> <Tên mảng>[], int <ten so phan tu>)
{
//Khởi tạo các biến
//Duyệt mảng để tính toán
//Trả về giá trị
}
3. Những thao tác trên mảng:
Xử lý mảng là việc xử lý nhóm các phần tử trong mảng lần lượt từng phần tử một.
Duyệt theo chiều xuôi
Duyệt mảng không có điều kiện:
for(int i=0;i<n;i++)
{
//xử lý a[i];
}
Ví dụ:
for(int i=0; i<5; i++)
printf("%5d", a[i]);
Duyệt mảng có điều kiện
for(int i=0;i<n;i++)
{
if(<Điều kiện>)
//xử lý a[i];
}
Ví dụ:
int S=0;
for(int i=0; i<5; i++)
if(a[i]%2==0)
S = S + a[i];
printf("\n Tong cac so chan trong mang la: %d", S);
Duyệt theo chiều ngược
Duyệt mảng không có điều kiện:
for(int i=n-1;i>=0;i--)
{
//xử lý a[i];
41
}
Duyệt mảng có điều kiện
for(int i=n-1;i>=0;i--)
{
if(<Điều kiện>)
//xử lý a[i];
}
42
Viết hàm main để thực thi chương trình.
void main()
{
int A[MAXSIZE];
int N;
NhapMang1C_SoNguyen(A, N);
printf("\nNoi dung cua mang la: ");
XuatMang1C_SoNguyen(A, N);
getch();
}
2. Bổ sung vào bài 1 các thao tác sau (Lưu ý: Viết chương trình dạng hàm):
Xuất các giá trị chẵn của mảng ra màn hình.
Tính tổng các giá trị mảng.
Tính tổng chẵn trong mảng
Hướng dẫn:
Bổ sung các định nghĩa hàm cần thiết cho chương trình như sau:
//======================================================
void Xuat_SoChan(int a[], int n)
{
for(int i=0; i<n; i++)
if(a[i]%2 == 0)
printf("%4d", a[i]);
}
int TongMang (int a[], int n)
{
int t=0;
for(int i=0; i<n; i++)
t = t + a[i];
return t;
}
int TongChan (int a[], int n)
{
int t=0;
for(int i=0; i<n; i++)
if(a[i]%2 == 0)
t = t + a[i]);
return t;
}
Bổ sung vào hàm main để thực thi chương trình.
void main()
43
{
int A[MAXSIZE], N;
//************************************************
TaoMang1C_SoNguyen(A, N);
printf("\nNoi dung cua mang vua tao la:");
XuatMang1C_SoNguyen(A,N);
//************************************************
Xuat_SoChan(A, N);
int t = TongMang(A,N);
printf("\Tong cua mang la:%d", t);
int tc = TongChan(A,N);
printf("\Tong cua cac gia tri chan trong mang la:%d", tc);
}
III. Bài tập ở lớp
Cho một mảng 1 chiều chứa các số nguyên. Hãy viết một chương trình cho phép người
dùng chọn một trong các yêu cầu sau:
1. Tạo một mảng 1 chiều chứa n số nguyên.
2. Xuất một mảng 1 chiều chứa n số nguyên.
3. Tính giá trị trung bình các phần tử trong mảng.
4. Tìm giá trị lớn nhất trong mảng.
5. Xuất ra danh sách các phần tử ở vị trí chẵn trong mảng.
6. Đếm phần tử dương trong mảng.
7. Đếm số lần phần tử x xuất hiện trong mảng.
8. Tìm vị trị của giá trị x trong mảng, x nhập từ phím.
9. Tìm vị trí phần tử nhỏ nhất trong mảng.
10. Đếm số nguyên tố trong mảng.
44
Trường ĐH CNTP TP.HCM
Khoa: CÔNG NGHỆ THÔNG TIN
Bộ môn: CÔNG NGHỆ PHẦN MỀM
BÀI 7. MẢNG 1 CHIỀU (tt)
Môn: TH NGÔN NGỮ LẬP TRÌNH
A. MỤC TIÊU:
Phân tích được tình huống sử dụng mảng 1 chiều để lưu trữ dữ liệu.
Áp dụng được mảng 1 chiều để xây dựng các hàm tìm kiếm, sắp xếp, tìm tập hợp con
trong trên tập hợp dữ liệu ban đầu.
Cài đặt được hàm nhập, xuất, xử lý dữ liệu trong các thao tác tính tổng, đếm giá trị phần
tử.
Vận dụng được mảng 1 chiều trong các bài toán cụ thể
C. VẬT LIỆU
Visual C++.Net.
Phần mềm hỗ trợ dạy học: NetOp School hoặc NetSupport School.
45
if(a[i]<0)
printf("%4d", a[i]);
}
3. Tính tổng các giá trị lẻ trong mảng 1 chiều.
int TongMang_SoLe(int a[], int n)
{//Dùng kỹ thuật tính tổng
int s=0;
for(int i=0; i<n; i++)
if(a[i]%2 != 0)
s = s + a[i]; //s += a[i];
return s;
}
4. Kiểm tra mảng số nguyên có tồn tại giá trị 0 hay không? Nếu có thì trả về 1,
ngược lại trả về 0.
int KiemTraGiaTriKhong(int a[], int n)
{//Dùng kỹ thuật cờ hiệu
int flag=0;
for(int i=0; i<n && !flag; i++)
if(a[i] == 0)
flag=1;
return flag;
}
5. Sắp xếp các phần tử của mảng số nguyên tăng dần.
void SapXepTangDan(int a[], int n)
{//Dùng kỹ thuật sắp xếp
for(int i=0; i<n-1; i++)
for(int j=i+1; j<n; j++)
if(a[i] > a[j])
HoanVi(a[i], a[j]);
}
6. Thêm một phần tử có giá trị x vào đầu mảng.
void ThemPhanTuDau(int a[], int &n, int x)
{//Dùng kỹ thuật thêm
for(int i=n; i>0; i--)
a[i] = a[i-1];
a[0]=x;
n++;
}
7. Xóa một phần tử ở đầu mảng.
void XoaPhanTuDau(int a[], int &n)
{//Dùng kỹ thuật xóa
for(int i=0; i<n-1; i++)
46
a[i] = a[i+1];
n--;
}
47
Sắp xếp các giá trị của mảng theo thứ tự tăng dần.
Xuất ra màn hình những giá trị là số chính phương.
Hướng dẫn:
Khai báo thêm các thư viện cơ bản cho chương trình.
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
Khai báo hằng số cho chương trình.
const int MAXSIZE=1000; //Hoặc dùng lệnh define
Viết các định nghĩa hàm cần thiết cho chương trình như sau:
//========================================================
void TaoMang1C_SoNguyen(int a[], int &n)
{
do
{
printf("Cho biet so phan tu cua mang: ");
scanf("%d", &n);
} while(n<=0);
srand((unsigned)time(NULL));
for(int i=0; i<n; i++)
a[i] = (rand()%199)-99; //giá trị từ -99 đến 99
}
//===========================================================
void XuatMang1C_SoNguyen(int a[], int n)
{
for(int i=0; i<n; i++)
printf("%4d", a[i]);
}
//==============================================================
void ThemPhanTu(int a[], int &n, int x, int vt)
{
if(vt>=0 && vt<=n)
{
for(int i=n; i>vt; i--)
a[i] = a[i-1]; //Dịch các phần tử sang phải 1 vị trí
a[vt]=x; //Thêm x vào vị trí vt
n++; //Tăng số phần tử lên 1
}
else
printf("\nVi tri %d khong hop le.", vt);
}
//========================================================
int TimPhanTu(int a[], int n, int x)
{
for(int i=0; i<n; i++)
48
if(a[i] == x)
return i; //Tìm thấy x tại vị trí thứ i
return -1; //Không tìm thấy x trong mảng
}
//=============================================================
void XoaPhanTu(int a[], int &n, int x)
{
int vt=TimPhanTu(a, n, x); //Tìm vị trí x trong mảng
if(vt==-1)
printf("\nKhong tim thay phan tu %d muon xoa.", x);
else
{
for(int i=vt; i<=n-2; i++)
a[i] = a[i+1]; //Dịch các phần tử sang trái 1 vị trí
n--; //Giảm số phần tử bớt 1
}
}
//===========================================================
void SapXepTang(int a[], int n)
{
for(int i=0; i<n-1; i++)
for(int j=i+1; j<n; j++)
if(a[i]>a[j])
{ //Doi cho hai phan tu a[i], a[j] voi nhau
int tam = a[i];
a[i] = a[j];
a[j] = tam;
}
}
//===========================================================
int KiemTraSoChinhPhuong(int x)
{
if(x>=0)
{
int cx=sqrt((double)x);
if(cx*cx == x)
return 1; // x là số chính phương
}
return 0; // x không phải là số chính phương
}
//=============================================================
void LietKeSoChinhPhuong(int a[], int n)
{
printf("\nDanh sach cac so chinh phuong cua mang: ");
for(int i=0; i<n; i++)
{
int kq = KiemTraSoChinhPhuong(a[i]);
if(kq==1)
printf("%4d", a[i]);
49
}
}
Viết hàm main để thực thi chương trình.
void Menu()
{
printf("\n************************************************");
printf("\n* MENU *");
printf("\n*----------------------------------------------*");
printf("\n* 1. Khoi tao mang *");
printf("\n* 2. Xuat noi dung cua mang *");
printf("\n* 3. Them mot phan tu vao mang *");
printf("\n* 4. Xoa mot phan tu cua mang *");
printf("\n* 5. Sap xep mang tang dan *");
printf("\n* 6. Liet ke nhung so chinh phuong cua mang *");
printf("\n* 0. Thoat chuong trinh *");
printf("\n************************************************");
}
//=====================================================
void main()
{
int A[MAXSIZE], N;
int PhimChon, key, x, vt;
do
{
Menu();
printf("\nHay chon mot chuc nang cua chuong trinh: ");
scanf("%d", &PhimChon);
switch(PhimChon)
{
case 1:
TaoMang1C_SoNguyen(A, N);
printf("\nNoi dung cua mang vua tao la:");
XuatMang1C_SoNguyen(A,N);
break;
case 2:
printf("\nNoi dung cua mang la: ");
XuatMang1C_SoNguyen(A,N);
break;
case 3:
printf("\nNhap phan tu muon them: ");
scanf_s("%d", &x);
printf("\nNhap vi tri muon them: ");
scanf_s("%d", &vt);
ThemPhanTu(A, N, x, vt);
printf("\nSau khi them %d la: ", x);
XuatMang1C_SoNguyen(A, N);
break;
case 4:
printf("\nBan hay cho biet phan tu muon xoa: ");
50
scanf("%d", &x);
XoaPhanTu(A, N, x);
printf("\nMang sau khi xoa %d la: ", x);
XuatMang1C_SoNguyen(A, N);
break;
case 5:
SapXepTang(A, N);
printf("\nMang sau duoc sap xep tang dan la: ");
XuatMang1C_SoNguyen(A, N);
break;
case 6:
LietKeSoChinhPhuong(A, N);
break;
case 0: exit(1);
}
}while(1);
getch();
}
52
Trường ĐH CNTP TP.HCM
Khoa: CÔNG NGHỆ THÔNG TIN
Bộ môn: CÔNG NGHỆ PHẦN MỀM
BÀI 8. MẢNG 2 CHIỀU
Môn: TH NGÔN NGỮ LẬP TRÌNH
A. MỤC TIÊU:
Khai báo được biến kiểu mảng 2 chiều (ma trận).
Phân tích được tình huống sử dụng ma trận để lưu trữ dữ liệu.
Cài đặt được hàm nhập, xuất, xử lý dữ liệu bằng cách sử dụng ma trận.
Phân tích được tình huống sử dụng ma trận vuông để lưu trữ dữ liệu.
Cài đặt được hàm nhập, xuất, xử lý dữ liệu bằng cách sử dụng ma trận vuông.
Vận dụng được ma trận, ma trận vuông trong từng bài toán cụ thể.
C. VẬT LIỆU
Visual C++.Net.
Phần mềm hỗ trợ dạy học: NetOp School hoặc NetSupport School.
54
printf("Cho biet so cot cua mang: ");
scanf_s("%d", &n);
}while(n<=0);
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
{
printf("Gia tri phan tu a[%d][%d]=", i, j);
scanf_s("%d", &a[i][j]);
}
}
//===========================================================
void XuatMaTran_SoNguyen(int a[][MAXCOL], int m, int n)
{
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
printf("%5d", a[i][j]);
printf("\n");
}
}
Viết hàm main để thực thi chương trình.
void main()
{
int A[MAXROW][MAXCOL];
int M, N;
NhapMaTran_SoNguyen(A, M, N);
printf("\nNoi dung cua mang la: \n");
XuatMaTran_SoNguyen(A, M, N);
_getch();
}
2. Cho ma trận chứa các số nguyên. Viết chương trình theo kiểu menu cho phép
người dùng chọn thực hiện một trong các thao tác sau (Lưu ý: Viết chương trình dạng
hàm):
Nhập ma trận số nguyên bằng cách tạo giá trị ngẫu nhiên cho các phần
tử của ma trận
Xuất ma trận số nguyên
Xuất các giá trị của ma trận ra màn hình.
Tính và xuất tổng các phần tử ma trận.
Tìm max/min của các phần tử ma trận.
Sắp xếp các giá trị của ma trận theo thứ tự tăng dần.
Hướng dẫn:
Khai báo thêm các thư viện cơ bản cho chương trình.
#include<conio.h>
#include<stdio.h>
55
#include<stdlib.h>
#include<time.h>
#include<math.h>
Khai báo hằng số cho chương trình.
#define MAXROW 100 //số dòng tối đa
#define MAXCOL 100 //số cột tối đa
Viết các định nghĩa hàm cần thiết cho chương trình như sau:
//============================================================
void TaoMaTran_SoNguyen(int a[][MAXCOL], int &m, int &n)
{
do
{
printf("Cho biet so dong cua mang: ");
scanf_s("%d", &m);
}while(m<=0);
do
{
printf("Cho biet so cot cua mang: ");
scanf_s("%d", &n);
}while(n<=0);
srand((unsigned)time(NULL));
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
a[i][j]= (rand()%199)-99;
}
//=========================================================
void XuatMaTran_SoNguyen(int a[][MAXCOL], int m, int n)
{
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
printf("%5d", a[i][j]);
printf("\n");
}
}
//==========================================================
int TongMaTran(int a[][MAXCOL], int m, int n)
{
int sum=0;
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
sum+=a[i][j];
return sum;
56
}
//===========================================================
int MaxMaTran(int a[][MAXCOL], int m, int n)
{
int max=a[0][0];
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
if(max<a[i][j])
max=a[i][j];
return max;
}
//===========================================================
int MinMaTran(int a[][MAXCOL], int m, int n)
{
int min=a[0][0];
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
if(min>a[i][j])
min=a[i][j];
return min;
}
//========================================================
void HoanVi(int &x, int &y)
{
int temp=x;
x=y;
y=temp;
}
//=========================================================
void SapXepMaTranTang(int a[][MAXCOL], int m, int n)
{
int sopt=m*n;
for(int i=0; i<sopt-1; i++)
for(int j=i+1; j<sopt; j++)
if(a[i/n][i%n]>a[j/n][j%n])
HoanVi(a[i/n][i%n], a[j/n][j%n]);
}
Viết hàm main để thực thi chương trình.
//===============================================================
void Menu()
{
printf("\n************************************************");
printf("\n* MENU *");
57
printf("\n*----------------------------------------------*");
printf("\n* 1. Khoi tao ma tran *");
printf("\n* 2. Xuat noi dung cua ma tran *");
printf("\n* 3. Tong gia tri cac phan tu cua ma tran *");
printf("\n* 4. Gia tri phan tu lon nhat, nho nhat *");
printf("\n* 5. Sap xep ma tran tang dan *");
printf("\n* 0. Thoat chuong trinh *");
printf("\n************************************************");
}
//======================================================
void main()
{
int A[MAXROW][MAXCOL];
int M, N;
int PhimChon,Sum, Max, Min;
do
{
Menu();
printf("\nHay chon mot chuc nang cua chuong trinh: ");
scanf("%d", &PhimChon);
switch(PhimChon)
{
case 1:
TaoMaTran_SoNguyen(A, M, N);
printf("\nNoi dung cua ma tran vua tao la: \n");
XuatMaTran_SoNguyen(A, M, N);
break;
case 2:
printf("\nNoi dung cua ma tran la: \n");
XuatMaTran_SoNguyen(A, M, N);
break;
case 3:
Sum=TongMaTran(A, M, N);
printf("\nTong gia tri cac phan tu cua ma tran: %d",
Sum);
break;
case 4:
Max=MaxMaTran(A, M, N);
Min=MaxMaTran(A, M, N);
printf("\nGia tri phan tu lon nhat cua ma tran: %d",
Max);
printf("\nGia tri phan tu nho nhat cua ma tran: %d",
Min);
break;
case 5:
SapXepMaTranTang(A, M, N);
printf("\nNoi dung cua ma tran sau khi sap xep tang
la: \n");
XuatMaTran_SoNguyen(A, M, N);
58
break;
case 0: exit(1);
}
}while(1);
}
59
Tính tổng các phần tử chẵn thuộc tam giác trên.
Tính tổng các phần tử lẻ thuộc tam giác dưới.
Sắp xếp ma trận theo quy tắc các phần tử trên dòng được sắp tăng dần
Sắp xếp ma trận theo quy tắc tổng các dòng tăng dần
Đếm số phần tử cực đại trong ma trận. biết phần tử cực đại là phần tử lớn hơn
các phần tử xung quanh nó.
60
Trường ĐH CNTP TP.HCM
Khoa: CÔNG NGHỆ THÔNG TIN
Bộ môn: CÔNG NGHỆ PHẦN MỀM
BÀI 9. FILE
Môn: TH NGÔN NGỮ LẬP TRÌNH
A. MỤC TIÊU:
Khai báo được biến kiểu mở file, đóng file.
Trình bày được cách đọc một số nguyên, cách đọc một dòng dữ liệu lưu trong file.
Phân tích được tình huống sử dụng file để đọc, lưu dữ liệu.
Cài đặt được hàm nhập dữ liệu từ file, xuất dữ liệu hiển thị ra màn hình, và xử lý dữ liệu
trong bài toán cụ thể
Vận dụng được cách đọc, lưu file để giải quyết bài toán cụ thể
C. VẬT LIỆU
Visual C++.Net.
Phần mềm hỗ trợ dạy học: NetOp School hoặc NetSupport School.
f = fopen("input.txt","rt");
fscanf(f,"%d",&a);
fscanf(f,"%d",&b);
fscanf(f,"%d",&c);
printf("3 gia tri lan luot la: %d, %d, %d", a, b, c);
getch();
}
3. Đọc file txt kiểu chuỗi
Cú pháp:
char * fgets (char*s,int n,f);
Đọc 1 dòng dữ liệu tối đa n byte trong f vào chuỗi s, ngược lại trả về NULL.
62
Ví dụ:
Nội dung file txt là:
Xin chao cac ban!
Cách thức gọi hàm:
void main()
{
FILE*f;
f = fopen("input.txt","rt");
char a[50];
fgets (a,50,f);
printf("\n chuoi la: %s",a);
}
Hướng dẫn
#include "stdio.h"
#include "conio.h"
void main()
{
int n;
int a[50];
63
getch();
}
2. Cho file txt chứa thông tin:
121
Nguyen Thi Thuy
23
Đọc giá trị từng dòng dữ liệu của file
Xuất các dữ liệu ra màn hinh
#include "stdio.h"
#include "conio.h"
void main()
{
//Mo file de doc
FILE*f;
f = fopen("input.txt","rt");
//Doc tung dong du lieu luu vao bien tuong ung
char ms[15];
char ten[50];
char tuoi[10];
fgets (ms,50,f);
fgets (ten,50,f);
fgets (tuoi,50,f);
//in ket qua ra man hinh
printf("\n ma so la: %s",ms);
printf("\n ten la: %s",ten);
printf("\n tuoi la: %s",tuoi);
getch();
}
III. Bài tập ở lớp
1. Cho file txt lưu ma trận theo cấu trúc như mẫu sau:
Dòng đầu tiên là số dòng m của ma trận
Dòng thứ 2 là số cột n của ma trận
Các dòng tiếp theo lưu m*n phần tử của ma trận
Ví dụ:
3
4
4581
9-2 8 5
8527
64
- Đọc nội dung file và ghi dữ liệu vào biến ma trận
- Tính tổng giá trị chẵn mảng 1 chiều
2. Cho file txt lưu danh sách thí sinh theo cấu trúc như mẫu sau:
Dòng đầu tiên là số lượng thí sinh N
4 dòng tiếp theo lưu thông tin 1 thí sinh gồm (mã số thí sinh, tên thí sinh, năm
sinh, quê quán của thí sinh đó)
Thông tin các thí sinh còn lại lưu trên (N-1)*4 dòng còn lại
Ví dụ:
2
01
Nguyễn văn A
1996
Bến tre
02
Nguyễn Thi N
1987
Hậu giang
- Đọc file và xuất nội dung file ra màn hình
- Xuất tên, tuổi của từng thí sinh ra màn hình
65
Trường ĐH CNTP TP.HCM
Khoa: CÔNG NGHỆ THÔNG TIN
Bộ môn: CÔNG NGHỆ PHẦN MỀM
BÀI 10. CẤU TRÚC
Môn: TH NGÔN NGỮ LẬP TRÌNH
A. MỤC TIÊU:
Định nghĩa được biến kiểu cấu trúc trong bài toán cụ thể
Khai báo được biến kiểu cấu trúc.
Phân tích được tình huống sử dụng cấu trúc để lưu trữ dữ liệu.
Cài đặt được hàm nhập, xuất, xử lý dữ liệu bằng cách sử dụng kiểu cấu trúc
Vận dụng được kiểu cấu trúc để giải quyết bài toán cụ thể
C. VẬT LIỆU
Visual C++.Net.
Phần mềm hỗ trợ dạy học: NetOp School hoặc NetSupport School.
67
int Dai;
int Rong;
};
Viết các định nghĩa hàm cần thiết cho chương trình như sau:
void NhapThongTinHCN(HinhChuNhat &pHcn)
{
printf("Moi ban nhap chieu dai hcn=");
scanf_s("%d",&pHcn.Dai);
printf("Moi ban nhap chieu rong hcn=");
scanf_s("%d",&pHcn.Rong);
}
//=======================================================
void XuatThongTinHCN(HinhChuNhat pHcn)
{
printf("Chieu dai hcn la=%d",pHcn.Dai);
printf("\nChieu rong hcn la=%d",pHcn.Rong);
}
//=========================================================
void TinhChuViHCN(HinhChuNhat pHcn)
{
printf("\nChu vi hcn la=%d",(pHcn.Dai+pHcn.Rong)*2);
}
//======================================================
void TinhDienTichHCN(HinhChuNhat pHcn)
{
printf("\nDien tich hcn la=%d",pHcn.Dai*pHcn.Rong);
}
Viết hàm main để thực thi chương trình.
void main()
{
HinhChuNhat hinhchunhat;
NhapThongTinHCN(hinhchunhat);
XuatThongTinHCN(hinhchunhat);
TinhChuViHCN(hinhchunhat);
TinhDienTichHCN(hinhchunhat);
getch();
}
III. Bài tập ở lớp
1. Khai báo cấu trúc PhanSo cần thiết lưu trữ thông tin phân số, sau đó thực hiện các
chức năng:
Viết hàm nhập vào phân số.
Viết hàm xuất phân số.
68
So sánh phân số với 1 (nhỏ hơn, lớn hơn, bằng).
Viết hàm tối giản phân số.
Viết hàm quy đồng 2 phân số.
Nhập vào 2 phân số. Tính tổng, hiệu, tích và thương của hai phân số.
2. Khai báo cấu trúc NhanVien lưu trữ thông tin:
Mã số nhân viên
Tên nhân viên
Số ngày công
Lương 1 ngày công
Chức vụ
Sau đó thực hiện các chức năng:
Nhập thông tin cho 1 nhân viên
Tính lương cho 1 nhân viên
Tính tiền thưởng cho nhân viên, biết rằng thưởng 50$ cho nhân viên làm trên
24 ngày.
Tính tiền phụ cấp chức vụ:
Giám đốc: 100$
Phó giám đốc: 80$
Trưởng phòng: 40$
Phó phòng: 20$
Tính tiền lương thực lãnh cho nhân viên
3. Khai báo cấu trúc Sinh viên lưu trữ thông tin:
Mã sinh viên
Tên sinh viên
Điểm toán
Điểm lý
Điểm hóa
Sau đó thực hiện các chức năng:
Đọc thông tin cho 1 sinh viên từ file txt có nội dung sau:
2001
Nguyen Van A
7
8
3
Xuất thông tin cho sinh viên
Tính điểm trung bình cho 1 sinh viên
Xếp loại cho sinh viên
69
4. Khai báo cấu trúc Taxi lưu trữ thông tin:
Mã số
Tên tài xế
Địa chỉ đón khách
Số km đã chạy
Số chỗ ngồi của xe taxi
Sau đó thực hiện các chức năng:
Đọc thông tin cho 1 taxi từ file txt có nội dung sau:
2
Anh
140 Le Trong Tan, phuong Tay Thanh, quan Tan Phu, TPHCM
23
7
Xuất thông tin taxi
Kiểm tra tài xế tên t (nhập từ phím) có chạy taxi đang lưu không?
Kiểm tra taxi có chạy trên quận/huyện q (người dùng nhập vào) không?
Viết hàm hiển thị số chỗ ngồi của xe taxi
Viết hàm tính tiền xe taxi theo bảng giá
Bảng giá Số chỗ ngồi
Số km 4 chỗ 7 chỗ
1-5 12 15
6-10 11 14
>10 9 10
71
Trường ĐH CNTP TP.HCM
Khoa: CÔNG NGHỆ THÔNG TIN BÀI 11. MẢNG CẤU
Bộ môn: CÔNG NGHỆ PHẦN MỀM TRÚC
Môn: TH NGÔN NGỮ LẬP TRÌNH
A. MỤC TIÊU:
Định nghĩa được kiểu cấu trúc trong bài toán cụ thể
Khai báo được biến kiểu mảng cấu trúc.
Phân tích được tình huống sử dụng mảng cấu trúc để lưu trữ dữ liệu.
Cài đặt được hàm nhập, xuất, xử lý dữ liệu bằng cách sử dụng mảng cấu trúc
Vận dụng được kiểu mảng cấu trúc để giải quyết bài toán cụ thể
C. VẬT LIỆU
Visual C++.Net.
Phần mềm hỗ trợ dạy học: NetOp School hoặc NetSupport School.
Hướng dẫn:
Khai báo thêm các thư viện cơ bản cho chương trình.
#include<stdio.h>
#include<conio.h>
#include <math.h>
Khai báo struct CongNhan cho chương trình.
struct CongNhan
{
char ten[50];
int namsinh;
int giolam;
};
Viết các định nghĩa hàm cần thiết cho chương trình như sau:
void NhapMangCN(int &n, CongNhan a[])
{
do
{
printf("Cho biet so cong nhan: ");
scanf_s("%d", &n);
}while(n<=0);
for(int i=0; i<n; i++)
{
printf("Thong tin cong nhan thu %d la:", i+1);
printf("\nTen la:");
fflush(stdin);
73
gets_s(a[i].ten,100);
printf("Nam Sinh:");
scanf_s("%d", &a[i].namsinh);
printf("Gio lam:");
scanf_s("%d", &a[i].giolam);
}
//=====================================================
void XuatMangCN(CongNhan a[], int n)
{
for(int i=0; i<n; i++)
{
printf("\n====================================");
printf("\nThong tin cong nhan thu %d la:", i+1);
printf("\nTen la: %s",a[i].ten);
printf("\nNam Sinh la %d:",a[i].namsinh);
printf("\nGio lam %d:",a[i].giolam);
}
}
//========================================================
void XuatCN(CongNhan pCN,int i)
{
printf("\nThong tin cong nhan nhan thuong la:", i+1);
printf("\nTen la: %s",pCN.ten);
printf("\nNam Sinh la %d:",pCN.namsinh);
printf("\nGio lam %d:",pCN.giolam);
}
//======================================================
void ThuongCN(CongNhan a[], int n)
{
printf("\n====================================");
printf("\nDanh sach cong nhan nhan thuong:");
for(int i=0; i<n; i++)
{
if(a[i].giolam>40)
{
XuatCN(a[i],i);
}
}
}
//======================================================
74
void InsertionSort(CongNhan a[], int n)
{
for(int i=1; i<n; i++)
{
CongNhan x=a[i];
for(int j=i-1; (j>=0 && a[j].giolam<x.giolam); j--)
{
a[j+1]=a[j];
a[j]=x;
}
}
}
//====================================================
void SapXep(CongNhan a[], int n)
{
InsertionSort(a,n);
}
75
Nhập vào vị trí 1 thí sinh, tính điểm ưu tiên của thí sinh vừa nhập. Điểm ưu tiên: nếu
là khu vực 3 được 2 điểm, nếu là khu vực 2 thì cộng 1 điểm, các khu vực khác là không.
Nhập vào vị trí của 1 thí sinh, tính tổng điểm của thí sinh vừa nhập. Tổng điểm =
điểm toán + điểm lý + điểm hóa + điêm cộng + điểm ưu tiên.
In danh sách thí sinh (tên, điểm toán, điểm lý, điểm hóa, điểm cộng, điểm ưu tiên,
tổng điểm)
In danh sách thi sinh đậu (tổng điểm lớn hơn hoặc bằng15).
Nhập mã số thí sinh, xuất thông tin thí sinh (tên, điểm toán, điểm lý, điểm hóa, điểm
cộng, điểm ưu tiên, tổng điểm.
Tìm điểm toán cao nhất, sau đó tìm thí sinh có điểm toán cao nhất
In thông tin thí sinh đậu thủ khoa
Tính tỉ lệ % đậu của kì thi.
Gợi ý:
struct ThiSinh
{
char mats[10];
char hten[50];
float toan, ly, hoa;
char kvthi[30];
char loaiTN [10];
};
2. Tạo file txt lưu thông tin N nhân viên theo định dạng sau:
Dòng đầu tiên lưu số lượng nhân viên N
7xN dòng tiếp theo lưu mã số (không có hai người trùng mã số), họ, tên, ngày sinh,
nơi sinh, ngày công tác, lương. Mỗi thông tin được nằm trên 1 dòng.
Ví dụ:
3
001
Nguyen
Van
23/07/1990
Kiên Giang
10/03/2008
3000
002
Tran Van
Hau
5/10/1988
Ha Tien
76
14/03/2005
5000
004
Truong
Hung
10/4/1987
Nam Dinh
03/07/2005
4000
77
Nhập mảng gồm n nhân viên bằng cách đọc dữ liệu từ file.
Xuất mảng nhân viên.
In danh sách lương thực lãnh của nhân viên gồm các thông tin: mã nhân viên, tên
nhân viên, thực lãnh. Trong đó, thực lãnh = hệ số lương * lương cơ bản + phụ cấp chức vụ, trong
đó lương cơ bản là 1 hằng số có giá trị 1,210 VNĐ. Phụ cấp chức vụ: phụ cấp 500 VNĐ cho giám
đốc và 300VNĐ cho trưởng phòng.
Tính tổng lương của tất cả nhân viên
Tìm lương thực lãnh cao nhất
Tìm thông tin nhân viên có lương thực lãnh cao nhất.
In ra bảng lương danh sách nhân viên theo thứ tự mã số nhân viên giảm dần
2. Tạo file txt lưu thông tin N môn học theo định dạng sau:
Dòng đầu tiên lưu số lượng môn N
N dòng tiếp theo lưu Mã số môn, Tên môn, Số tiết, Hình thức. Mỗi môn được nằm
trên 1 dòng, mỗi thông tin ngăn cách nhau bởi dấu #.
Ví dụ:
4
L1 # Ngon ngu lap trinh # 30 # Ly thuyet
L2 # Thuc hanh Cau truc du lieu # 60 # Thuc hanh
L3 # Huong doi tuong # 45 # Ly thuyet
L5 # Toan Cao cap # 45 # Lý thuyet
Sau đó viết hàm thực hiện các chức năng sau:
Nhập mảng gồm N môn học bằng cách đọc dữ liệu từ file.
Xuất mảng môn học.
In thông tin môn học có thông tin không đúng (môn học lý thuyết clà bội của 15 và
môn học thực hành là bội của 30)
In danh sách số tín chỉ theo từng môn học, biết rằng số tín chỉ = số tiết / 15 (đối với
môn học lý thuyết) , và số tín chỉ = số tiết / 30 (đối với môn học thực hành). Ghi chú, không in
môn học không đúng thông tin.
Hiệu chỉnh thông tin môn học cho phù hợp (chỉ cho phép hiệu chỉnh số tiết và hình
thức).
Xóa môn học khi nhập vào tên môn học.
Thêm 1 môn học mới vào cuối danh sách môn học.
78
Trường ĐH CNTP TP.HCM
Khoa: CÔNG NGHỆ THÔNG TIN BÀI 12. STRUCT CON
Bộ môn: CÔNG NGHỆ PHẦN MỀM TRỎ, STRUCT ĐỆ QUY
Môn: TH NGÔN NGỮ LẬP TRÌNH
A. MỤC TIÊU:
Hiểu được cấu trúc dữ liệu kiểu struct con trỏ.
Phân tích được tình huống sử dụng struct con trỏ để lưu trữ dữ liệu.
Cài đặt được hàm nhập, xuất, xử lý dữ liệu bằng cách sử dụng struct con trỏ.
Vận dụng được kiểu struct con trỏ để giải quyết bài toán cụ thể
Cài đặt được các hàm có sử dụng struct đệ quy.
Vận dụng được kiểu struct đệ quy để giải quyết bài toán
C. VẬT LIỆU
Visual C++.Net.
Phần mềm hỗ trợ dạy học: NetOp School hoặc NetSupport School.
80
int namsinh;
int giolam;
};
.
Viết các định nghĩa hàm cần thiết cho chương trình như sau:
void NhapCN(int &n, CongNhan *p)
{
do
{
printf("Cho biet so cong nhan: ");
scanf_s("%d", &n);
}while(n<=0);
for(int i=0; i<n; i++)
{
printf("Thong tin cong nhan thu %d la:", i+1);
printf("\nTen la:");
fflush(stdin);
gets_s((p+i)->ten,100);
printf("Nam Sinh:");
scanf_s("%d",&(p+i)->namsinh);
printf("Gio lam:");
scanf_s("%d", &(p+i)->giolam);
}
}
//=====================================================
void XuatCN(CongNhan *p, int n)
{
for(int i=0; i<n; i++)
{
printf("\n====================================");
printf("\nThong tin cong nhan thu %d la:", i+1);
printf("\nTen la: %s",(p+i)->ten);
printf("\nNam Sinh la %d:",(p+i)->namsinh);
printf("\nGio lam %d:",(p+i)->giolam);
}
}
81
p=A;// Gán mảng A cho con trỏ p
NhapPointCN(N,p);
XuatPointCN(p,N);
getch();
}
III. Bài tập ở lớp
Sử dụng struct con trỏ viết chương trình quản lý một lớp học có tối đa 50 học sinh,
mỗi học sinh được mô tả bằng các thông tin: mã số(int), họ và tên, phái, điểm học kỳ I, điểm
học kỳ II. Hãy viết chương trình quản lý lớp học này với các thao tác sau:
Nhập danh sách lớp.
In ra danh sách lớp theo thứ tự mã số (gồm số thứ tự, họ vàtên).
In ra danh sách lớp theo thứ tự của họ vàtên.
Tìm vị trí của một học sinh theo khi nhập họ vàtên.
In ra danh sách các học sinh có điểm trung bình của năm học < 5.0
Thêm một học sinh vào danh sách
Xóa một học sinh trong danh sách.
IV. Bài tập về nhà
Sử dụng struct con trỏ viết chương trình nhập danh sách gồm N học viên gồm các
thông tin như: Họ, tên, điểm c, điểm c#, sau đó tính điểm trung bình (điemTB) = (diemC*2 +
diemC#)/3.
Và xét kết quả đậu hay rớt theo qui ước sau : nếu điểm trung bình >= 5 thì kết quả đậu.
Nếu điểm trung bình <5 thì kết qua rớt. Nếu điểm trung bình = 4 mà phái = "Nữ" thì kết quả
là đậu.
In danh sách vừa nhập gồm họ tên, phái, điểm c, điểm c#, điểm TB, kết quả.
Sắp xếp giảm dần theo điểm trung bình và in ra.
Nhập vào tên cần tìm và tìm trong danh sách học viên nếu không tìm thấy thì in ra
học viên có tên không tìm thấy. Nếu có nhiều học viên có cùng tên cần tìm thì hãy in ra
người cuối cùng được tìm thấy. (*)
Yêu cầu như (*) nhưng in ra 2 người tìm thấy đầu tiên (nếu có nhiều người).
Yêu cầu như (*) nhưng in ra người đầu tiên và người cuối cùng (nếu có nhiều
ngưòi).
82
PHỤ LỤC
HƯỚNG DẪN TÌM LỖI VÀ SỬA LỖI (DEBUG) CHƯƠNG TRÌNH
I. Khái niệm Debug
Debug là quá trình tìm kiếm và sửa lỗi của chương trình. Quá trình debug thường mất
nhiều thời gian hơn việc viết chương trình, vì những lỗi liên quan đến logic thường rất khó
phát hiện. Visual Studio cung cấp cho chúng ta khá nhiều công cụ trực quan để đơn giản hoá
quá trình debug, giúp ta tiến hành tìm và sửa lỗi chương trình một cách dễ dàng hơn.
II. Một số khái niệm liên quan
1. Chạy chương trình
Một chương trình sẽ lần lượt duyệt qua các dòng code có trong hàm main. Trong
đó, có những đoạn “thẳng”, có những đoạn “rẽ nhánh” (if/switch), có những đoạn “vòng”
(for/while/…), có những đoạn đường nhỏ hơn (các function). Để sửa lỗi chương trình, cần tìm
ra được những “đoạn rối” của nó, tức là xác định xem đoạn code ở vị trí nào có khả năng phát
sinh lỗi.
2. Breakpoints
Breakpoints là vị trí mà chương trình sẽ dừng lại để lập trình viên xem xét sự thay
đổi của các biến qua từng dòng lệnh, từ đó phát hiện ra vị trí dòng code bị lỗi.
Breakpoint được kí hiệu bằng chấm tròn màu đỏ ở đầu dòng code. Để tạo ra một
breakpoint, cách đơn giản nhất là click chuột vào đầu dòng code (như trong hình). Để huỷ
breakpoint, chỉ cần click chuột vào breakpoint đó một lần nữa. Ngoài ra các bạn cũng có thể
tạo/huỷ breakpoint bằng phím F9.
83
3. Watch Windows
Trong quá trình Debug, sau khi chương trình dừng lại ở một breakpoint nào đó,
điều cần thiết của chúng ta là kiểm tra sự thay đổi giá trị của các biến, hàm, … qua từng dòng
code để nhìn ra sai sót trong thuật toán. Watch windows là tập hợp các công cụ giúp giúp lập
trình viên quan sát được giá trị hiện tại của biến. Các cửa sổ này có thể được tìm thấy trong
menu Debug → Windows (chỉ xuất hiện khi đang trong quá trình debug).
4. Data Tip
Khi di chuyển con trỏ chuột đến tên biến ở bất kì vị trí nào trong phạm vi cặp dấu
{ } (scope) hiện tại, giá trị của biến sẽ được hiển thị trên màn hình. Khi đó, các bạn có thể
“ghim” biến đó lên màn hình để tiện quan sát, hoặc add vào cửa sổ Watch, copy giá trị, thay
đổi giá trị của biến, …
5. Locals
Cửa sổ Locals sẽ hiển thị tất cả các biến có liên quan đến dòng code hiện tại một
cách tự động. Các biến hiển thị ở đây sẽ được thay đổi qua từng dòng code. Ngoài ra, màu sắc
của các biến giúp ta phân biệt được những biến nào vừa thay đổi giá trị.
6. Autos
Tương tự như Locals, cửa sổ Autos hiển thị các biến vừa được sử dụng trong các
dòng code trước. Visual Studio sẽ tự động nhận diện biến nào không còn cần thiết và loại bỏ
ra khỏi cửa sổ Autos.
7. Watch
84
Visual Studio không thể nhận diện được tất cả những gì lập trình viên cần. Trong
một số trường hợp, chúng ta cần theo dõi cụ thể một giá trị nào đó, chẳng hạn như phần tử thứ
10 trong một mảng số nguyên hay kí tự thứ 5 của chuỗi “Stdio Tutorial”, … Chúng ta sẽ cần
sử dụng đến cửa sổ Watch. Nó cho phép lập trình viên nhập vào tên biến, hàm, … cụ thể
trong scope hiện tại. Giá trị của các biến, hàm sẽ được hiển thị bên cạnh tên biến.
85
F5: Bắt đầu quá trình Debug.
Shift + F5: Thoát Debug.
Ctrl + F5: Chạy chương trình không dùng công cụ Debug
F9: Tạo/huỷ một breakpoint.
F10: Step Over.
F11: Step Into.
Shift + F11: Step Out.
86