baigiangtongquat

Download Report

Transcript baigiangtongquat

Môn Phương pháp lập trình, cài đặt bằng ngôn ngữ C, công cụ soản thảo C- Free 4.0
Môn này rất quan trọng và rất khó, năm nào cũng rớt 90% . Môn này là tiền đề để học các
môn còn lại : Cấu trúc dữ liệu, Java , C#...
LÀM SAO ĐỂ CHẠY 1 CHƯƠNG TRÌNH C
Trong 1 chương trình có 1 hàm tên là main , hàm này dùng để chạy chương trình
Trong chương trình C :
Để xuất dữ liệu ta dùng luồng xuất cout<<
Để nhập dữ liệu ta dùng luồng nhập cin>>
2 luồng nhập xuất này nằm trong thư viện iostream.h . Do đó ta phải include vào:
- Tập tin C++ lưu với đuôi là .cpp, bản Cfree 4.0 hàm main dùng void, từ 5.0 trở lên dùng int
Dòng lệnh trên sẽ xuất dòng chữ : Que huong la chum khe ngot.
Để chạy chương trình ta nhấn phím F5
cout<<“\t”  xuất ra phím tab
Hãy xuất ra màn hình đoạn văn dưới:
cout<<“\n”  xuống dòng
Đêm thu buồn lắm chị hằng ơi
Trần thế nay em chán nửa rồi
cung quế có ai ngồi đó chửa
- chuỗi phải để trong nháy đối
cành đa xin chị nhắc lên cho
- Kết thúc 1 câu lệnh phải có dấu chấm phẩy
Học về các kiểu dữ liệu trong C
Học cách khai báo biến, sử dụng biến
-----------------------------------------------Trong C có rất nhiều kiểu dữ liệu, ở đây ta tiếp cận 3 kiểu dữ liệu chính:
- Kiểu số nguyên, khai báo là int
- Kiểu số thực, khai báo là float
- Kiểu ký tự, khai báo
là char
*** Kiểu int chỉ chấp nhập số nguyên âm hoặc dương, tức là nó không chấp
nhận các số có chữ số thập phân ( ví dụ: số 5, số 6 thì chấp nhập, còn 5.3, 6.5 là
không chấp nhận)
*** Kiểu float chấp nhập số nguyên âm, số nguyên dương , và số có chứa chữ số
thập phân ( ví dụ: số 5, 6, 5.3, 6.5 đều được chấp nhận)
*** kiểu ký tự :chỉ chấp nhập 1 ký tự ( ví dụ : ‘a’ , ‘b’ , ‘z’ …)
---------------------------------------------------------Cách khai báo 1 biến như thế nào?
Kiểu_dữ_liệu
tên_biến ;
Tên biến không được để khoảng trắng, không được chứa chữ số đằng trước, Nếu muốn khai
báo nhiều biến cùng nằm trên 1 dòng thì các biến này cách nhau bởi dấu phẩy
Ví dụ 1: Hãy khai báo một biến tên là x có kiểu dữ liệu là kiểu nguyên
int
x;
hoặc
int
x=10;
Tức là ta có thể kết hợp khai báo biến và khởi tạo giá trị cho biến luôn
Ví dụ 2: Khai báo biến x, y, z có cùng kiểu số thực:
float x, y, z ;
Khai báo hằng số như thế nào?
Giống như khai báo biến, nhưng ở đây chúng ta thêm từ khóa const đằng trước kiểu dữ liệu
- Đặc điểm của hằng là không thể thay đổi được giá trị khi đã khai báo. Tức là nếu như
chúng ta cố gắng gán giá trị PI = một giá trị nào khác thì sẽ báo lỗi.
- Trước khi làm 1 bài toán, chúng ta phải đọc kỹ đề bài để kiểm tra DỮ LIỆU ĐẦU VÀO trước.
INPUT
(dữ liệu đầu
vào)
PROCESS
OUTPUT
(dữ liệu đầu
ra)
Bán kính R
Cv=2*Pi*R
Dt=Pi*r2
CV
Dt
Cạnh a
Cv=4*a
Dt=a*a
Cv
dt
Các hàm toán học, lượng giác:
#include<math.h>
1) Tính căn bậc 2: cout<< sqrt(4);
sqrt là 1 hàm có sẵn, đối số truyền vào là 1 số bất kỳtrả về căn bậc 2
2) Hàm tính lũy thừa pow(x,y) tính lũy thừa xy
ví dụ : pow(3,4) 34
3) Hàm tính giá trị tuyệt đối : abs(x)
Ví dụ: abs(-4) 4
Các hàm lượng giác:
Tính theo radian. Tức là khi nhập vào 1 góc có 1 độ nào đó thì phải đổi độ này ra radian
Cách đổi từ độ  radian : radian=độ*PI/180
Hàm sin dùng công thức : sin(radian)
Hàm cos dùng công thức : cos(radian)
Hàm tag dùng công thức : tan(radian)
Hàm cotag dùng công thức: 1/tan(radian)
Học về toán tử 3 ngôi
Biểu thức điều kiện ? Biểu thức A : Biểu thức B
Nếu biểu thức điều kiện là đúng thì biểu thức A sẽ thực hiện
Nếu biểu thức điều kiện là sai thì biểu thức B sẽ thực hiện
Ví dụ:
int ketqua=7;
cout<<(ketqua>=5? “Đậu” : “rớt”);
Ở đây : ketqua>=5 là biểu thức điều kiện. Ta thấy ketqua=7, tức là hỏi xem
7>=5 hay không  ta thấy đúng  biểu thức điều kiện ĐÚNG= biểu thức A
thực hiện
Mà biểu thức A chính là chữ “ĐẬU”
xuất ra chữ Đậu
Học về toán tử %
Toán tử % dùng để lấy số dư của phép chia. Nó chỉ chấp nhận kiểu số nguyên
mà thôi.
ví dụ:
int x=10;
int sodu=10%3; sodu=1
float y=10;
int sodu=y%3 ;  báo lỗi vì y có kiểu số thực, mà % chỉ cho số nguyên
A% B
Nếu A% B mà bằng 0 tức là A chia hết cho B
if(A%B==0)
{ cout<<“A chia hết cho B”;
}
Nếu A%2 mà bằng 0 tức là A là số chẵn
if(A%2==0)
{
cout<<“A là số chẵn”
}
Toán tử % chỉ chấn nhận kiểu số nguyên : int, unsigned int, short.
Ví dụ 1:
float A=7;
if(A%2==0)  báo lỗi ngay vì A có kiểu số thực
{
}
Ví dụ 2:
int A=7;
if(A%2!=0) đúng
{
cout<<“A là số lẻ”;
}
Mã ASCII – ép kiểu
Trong máy tính, mỗi một ký tự, mỗi 1 con số đều có 1 mã số riêng không trùng nhau, mã
số này được gọi là mã ASCII
Ví dụ:
Nhập vào số 1, hỏi xem số 1 có mã ASCII là bao nhiêu?
Nhập và ký tự A, ký tự a. hỏi mã ASCII lần lượt là bao nhiêu
void main()
{
}
Từ C Free 4.0 trở xuống thì sài void main, các phiên bản trở lên dùng int main()
HỌC ép kiểu :
- Ép kiểu rộng : sẽ không làm mất mát dữ liệu
- Ép kiểu hẹp : sẽ làm mất mát dữ liệu
int n =5;
float f=(float)n; ép kiểu rộng (ép từ kiểu nhỏ qua kiểu lớn  ko mất dữ liệu)
float k=5.5;
int t =(int)k; ép kiểu ép hẹp (ép từ kiểu lớn qua kiểu nhỏ mất dữ liệu, vì kết quả
chỉ còn 5 chứ không còn 5.5)
Chú ý: Không phải lúc nào cũng ép kiểu được, thông thường ta ép từ số thực qua số
nguyên, hoặc ngược lại. Nếu ta cố tình ép từ kiểu chuỗi qua kiểu số ngoặc ngược lại thì
sẽ bị báo lỗi vì do kiểu dữ liệu không tương thích
Vậy giả sử nhập n =789 tức là xuất ra màn hình số gì ? 987
Bây giờ ta chạy ta cho 1 số cụ thể, ở đây là số 789:
n=789;
int tam=n;
int s1=tam%10=789%10=9 (% là phép chia lấy dư, 789 chia 10 = 78 dư 9)
tam=tam/10 =789/10=78
int s2 = tam%10 =78%10 =8
tam=tam/10 = 78/10=7
int s3 =tam%10 = 7%10 =7
tam =tam/10 =7/10= 0ngừng, ko tính nữa
Suy ra số ngược của n = s1*100 + s2*10+s3 = 9*100+ 8*10+7 =900+80+7 =987
Cấu trúc điều khiển if else
Ta nên có ngoặc nhọn để bao bọc
Có 3 dạng cơ bản mà chúng ta thường gặp như sau:
thân hàm if cho dù bên trong nó
1) chỉ có một mình hàm if
chỉ có 1 dòng lệnh
if(điều kiện )
{
các biểu thức trong if
}
Nếu điều kiện đúng thì các biểu thức trong if sẽ được thực hiện
Chú ý:
Điều kiện có thể là kiểu luận lý (true hoặc false), hoặc là kiểu nguyên. Nếu là kiểu
nguyên thì số 0 là đại diện cho false, các số khác không là đại diện cho true
Ví dụ 1:
Ví dụ 3:
bool b=true;
if(0)
if(b==true)
{
{
cout<<“Không bao giờ vào đây được”;
cout<<“xử lý cái gì đó”;
}
}
Ví dụ 2:
if(100)
{
cout<<“xử lý cái gì đó”;
}
Cấu trúc điều khiển if else
Có 3 dạng cơ bản mà chúng ta thường gặp như sau:
2) Dạng có if và có else
if(điều kiện)
Cách thực hiện:
{
Khi điều kiện đúng thì các biểu thức ở bên
cout<<“Điều kiện đúng thì vào đây”;
trong hàm if sẽ được thực hiện, khi điều
}
kiện sai thì các biểu thức bên trong else
else
được thực hiện
{
cout<<“Điều kiện sai thì vào đây”;
}
Ví dụ: Nhập vào điểm cho sinh viên, nếu điểm >=5 thì ghi đậu, ngược lại ghi rớt
Cấu trúc điều khiển if else
Có 3 dạng cơ bản mà chúng ta thường gặp như sau:
3) Kết hợp if, else if , else
Những lỗi thường gặp :
if(điều kiện 1)
Các điều kiện kế tiếp ta hay quên
{
else if (điều kiện) mà chỉ gõ else (điều kiện)
cout<<“điều kiện 1 đúng thì vào đây”;
 bị sai. Đã có điều kiện thì phải gõ else if
}
else if(điều kiện 2)
{
cout<<“Điều kiện 2 đúng thì vào đây”;
}
else if(điều kiện n)
{
cout<<“Điều kiện n đúng thì vào đây”;
}
else
{
cout<<“các điều kiện khác vào đây”;
}
Ví dụ: Nhập điểm, nếu điểm >=9 ghi là xuất sắc, nếu
điểm >=8 ghi là giỏi, nếu điểm >=7 ghi là khá, nếu
điểm >=5 ghi là trung bình, còn lại ghi là yếu.
Một số lưu khi so sánh:
1) So sánh bằng : gõ 2 dấu bằng (==)
Nếu ta gõ 1 dấu bằng (=) thì nó sẽ trở thành phép gán và làm thay đổi giá trị của
biến (gây sai chương trình)
2) So sánh lớn hơn hoặc bằng (>=) . So sánh nhỏ hơn hoặc bằng (<=)
3) So sánh khác dùng !=
4) Chúng ta có thể kết hợp các điều kiện:
- điều kiện và dùng 2 ký tự && (dùng 1 ký tự & là sai thì nó là toán tử trên bit)
- điều kiện hoặc dùng 2 ký tự || (dùng 2 ký tự gạch đứng, dùng 1 ký tự là sai)
Ví dụ: Nếu điểm lớn hơn hoặc bằng 7 và nhỏ hơn hoặc bằng 8 thì thưởng 100 nghìn
if(diem >=7 && diem<=8)
{
cout<<“thuong 100 nghin”
}
Nếu phải kết hợp nhiều điều kiện với nhau thì ta nên để trong ngoặc đơn.
Ví dụ: Kiểm tra xem một năm bất kỳ nhập vào từ bàn phím 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 những không chia hết cho 100 hoặc
chia hết cho 400.
if((nam % 4==0 && nam%100!=0) || nam%400==0)
{
cout<<“nhuần nhuần”;
}
Bài tập chương 3
Bài tập chương 3
Bài tập chương 3
Bài tập chương 3
Bài tập chương 3
Cấu trúc Switch case
Chấp nhận kiểu nguyên ( int, unsigned int, char)
switch(điều kiên)
{
case giá trị 1:
break;
case giá trị 2:
break;
…….
default:
//khi tất cả điều kiện đều ko nhảy vào bất kỳ case nào thì nó sẽ vào default
}
Có thể kết hợp nhiều case lại với:
switch(điều kiện)
{
case giá trị 1 :
NHập vào 1 tháng bất kỳ, kiểm tra xem tháng có bao
case giá trị 2:
nhiêu ngày, nếu là tháng 2 thì kiểm tra năm nhuần
break;
}
Ví dụ 1 : Nhập vào 1 tháng bất kỳ, xuất ra số ngày của
tháng đó.
Biết rằng các tháng 1,3,5,7,8,10,12 có 31 ngày.
Tháng 4,6,9,11 có 30 ngày
Tháng 2, nếu là năm nhuần có 29 ngày, ngược lại 28
ngày
Ví dụ 2: Nhập vào 1 tháng, hỏi tháng này thuộc quý
mấy.
Biết rằng, 1 năm có 4 quý
Tháng 1,2,3 là quý 1
Tháng 4,5,6 là quý 2
Tháng 7,8,9 là quý 3
Tháng 10,11,12 là quý 4
Ví dụ 3: Nhập 2 số a,b, và
Ký tự ch
Nếu + cộng
- trừ
- Vân vân
Sửa lại ví dụ 1:
Cấu trúc vòng lặp : for, while, do … while
Chú ý: các cấu trúc này rất khó và rất quan trọng
1) Vòng lặp for
for(khởi tạo ; điều kiện ; bước nhảy)
{
//thân vòng lặp
}
Cách thực hiện:
1. đầu tiên khởi tạo sẽ thực thi trước
Sau đó Điều kiện sẽ kiểm tra liền, nếu điều kiện đúng thì
thân vòng lặp mới được thực hiện
2. Thân vòng lặp thực hiện xong thì Bước nhảy sẽ thực
hiện
3. BƯớc nhảy làm xong thì điều kiện sẽ kiểm tra liền, nếu
điều kiện đúng thì thực thi
**** Như vậy vòng for sẽ kết thúc khi điều kiện sai
1) Vòng lặp for
Khởi tạo
biến
Điều
kiện
Điều kiện đúng
Bước
nhảy
làm
Thân vòng
lặp làm
Kết
thúc
Điều kiện sai
Thử chạy tay với n =5
ThÔng thường nếu chỉ có 1 vòng for, thì
các biến bên trong của for ta đặt tên là i
i++ là gì ? i++ tức là ta muốn tăng i lên 1
đơn vị . Bởi vì i ++ tương đương với i=i+1
Như vậy nếu ta muốn tăng i lên 2 lần thì
sao?
i=i+2 hoặc i+=2
Khởi tạo n =5, s =0;
Vòng for chạy thực tế trong máy như sau:
1) khởi tạo i =1, kiểm tra liền 
hỏi i<=n??  1 <=5 ???đúng  làm body for.
làm s=s+is=0+1=1
2) Body for làm xong thì bước nhảy làm  làm
i++  i=i+1=1+1=2, kiểm tra liền  hỏi i<=n ??
 2<=5 ???đúng  làm body for:
làm s=s+I =1+2=3
3) Body làm xong  bước nhảy làm i++i=3
 kiểm tra liền, kiểm tra i<=n??? 3<=5đúng
làm body for:
làm s=s+I =3+3=6
4) Body xong thì b nhảy làmi++i=4, kiểm tra
liền i<=n 4<=5??đúnglàm body for:
làm s=s+i=6+4=10
5) Body xong thì làm b nhảy, i++i=5, kiểm tra
liền i<=n 5<=5 ??đúng lam body for
s=s+i=10+5=15
6)Body xong, b nhảy làm i++i=6, kiểm tra
liền i<=n 6<=5sai ngừng for
ta dc s=15
Nếu bước nhảy bằng 1 (i++) thì ta
kiểm tra là số chẵn mới cộng dồn
(i%2==0)
Vì bước nhảy bằng 2 (i=i+2) và khởi
tạo bắt đầu từ 2 nên chắc chắn
luôn là số chẵn nhanh hơn
Vòng lặp while và do …. While
while(điều kiện )
{
//thân vòng lặp
}
- Nếu điều kiện đúng thì thân vòng
lặp đc thực hiện, nếu đk sai thì
kết thúc vòng lặp
- Trong hàm while thì thân vòng
lặp có thể KHÔNG ĐƯỢC thực thi
lần nào cả
do
{
//thân vòng lặp
}while(điều kiện);
-
Thân vòng ít nhất được thực
thi 1 lần
- Hàm do while sẽ thực thi
xong rồi mới kiểm tra điều
kiện
Thông thường ta sử dụng while, do … while để thiết lập vòng lặp vĩnh cửu để thực các dòng
lệnh liên tục nào đó.
ta sẽ kết hợp với từ khóa break để thoát khỏi vòng lặp vĩnh cửu.
- Dùng break để thoát khỏi vòng lặp vĩnh cửu.
Hoặc nếu chúng ta muốn thoát khỏi vòng lặp ở
vị trí nào thì cứ gọi break tại vị trí đó
- Dùng continue để bỏ qua các lệnh ở bên dưới
và tiếp tục quay lại thực hiện các lệnh bên trên
#include<iostream.h>
void main()
{
int n; int s=0;
cout<<"Nhap n: "; cin>> n;
for(int i=1; i<=n; i++)
{
s=s+i;
}
cout<<s;
}
1
pow(x,y)  tính xy
Ví dụ pow(3,4) 34
#include<math.h>
xi
n
X2*i
1
X2*i+1)
1
S=x;
For(int i=1;i<=n;i++)
{
}
n
n
1
1
n
unsigned int n;
Giả sử ta có biểu thức A % B:
1) Toán tử % chỉ chấp nhận kiểu dữ liệu là số nguyên
2) Nếu A%B bằng 0 thì có nghĩa là A chia hết cho B, hay B là ước số của A
Nếu A%2 ==0  A là số chẵn
Nếu A%2 !=0  A là số lẻ
chú ý : NếU B ==0 sẽ báo lỗi, tức là mẫu số phải khác không
Khai bao bien phai khoi tao
gia tri luon
int tong=0;
Số nguyên tố : là số chỉ có 2 ước số (chia hết cho 1 và chính nó)
3,5,7 …
Số hoàn thiện : là số mà tổng các ước số không kể nó bằng chính nó
6=1+2+3 ; 28 = 1+2+4+7+14
Số thịnh vượng : là số mà tổng các ước số không kể nó thì lớn hơn nó
12<1+2+3+4+6
(a)
(e)
(b)
Học Hàm:
Một số khái niệm cần nắm:
- Prototype
- Function Body
- Truyền Tham Trị
- Truyền Tham Biến
- Tham số thực
- Tham số hình thức
- Parameter
- Return type
Tại sao chúng ta phải viết chương trình dưới dạng hàm
Hàm đôi khi còn được gọi là Chương Trình Con
Lý do chính:
- Được sử dụng lại coding đỡ mất thời gian
- Dễ sửa chữa lỗi
- Chia để trị : phân nhỏ chương trình lớn thành các
chương trình con để dễ xử lý
Prototype Function Header: Chỉ chứa tên hàm, các đối số và kết thúc bởi dấu ;
Prototype
- Tham số thực là gì ?
- Tham số hình thức là gì?
Function body
Vậy từ khóa return có tác dụng gì trong hàm?
Khi một hàm muốn trả về một giá trị nào đó
thì chúng ta dùng return . Bất kỳ kiểu dữ liệu
nào của hàm cũng có thể sử dụng return
NGOẠI TRỪ kiểu void
SAI
Hàm có kiểu void đôi khi được gọi là Thủ Tục
Ngay chỗ gọi hàm, các đối số truyền vào 
tham số thực
Khi thực thi, chương trình sẽ sao chép địa chỉ
của k cho a, của m cho b
Chỗ khai báo parameter  tham số hình thức
Truyền tham trị và truyền tham b iến:
N=5
N=5
Hàm nào đó
Đổi N = 8
Truyền tham trị: Sau khi thoát khỏi
hàm nó vẫn giữ giá trị gốc
N=8
N=5
Hàm nào đó
Đổi N = 8
Truyền tham biến: Sau khi thoát khỏi
hàm, nó sẽ lấy giá trị bị thay đổi
trong hàm
Gọi hàm truyền tham trị
Gọi hàm truyền tham biến
Tìm số lớn nhất
Bài 33
Bài 48
Học về Mảng 1 chiều:
Mảng là 1 đối tượng dùng để lưu trữ các phần tử có cùng 1 kiểu dữ liệu
Chỉ số mảng bắt đầu được tính từ 0 cho tới n-1
Tức là nếu như mảng có 10 phần tử, thì vị trí sẽ được tính từ số 0 cho tới 9. Với 0
là vị trí của phần tử số 1, số 1 là vị trí của phần tử số 2 ….
i=0
i=1
i=2
i=3
i=4
i=5
Mảng M có 6 phần tử
9
M[0]
0
8
7
10
M[4]
50
N=6
M[i]
Là phần tử tại
vị trí thứ i
Đối với duyệt mảng, người ta thường dùng vòng for, ít khi dùng vòng while, do.. while
Cách khai báo mảng 1 chiều như thế nào?
Đã nói tới mảng thì ta phải nói tới khả năng lưu trữ tối đã của mảng, do đó ta thường khai
báo 1 biến lưu trữ giá trị TỐI ĐA mà mảng có thể lưu trữ
Như vậy theo khai báo ở trên thì biến MAX có giá trị là 100
- Khai báo mảng :
Kiểu_Dữ_Liệu
Tên_Mảng [Số_phần_Tử_của_mảng] ;
ví dụ:
hãy khai bảo 1 mảng nguyên có 10 phần tử
int M[10];
int Q[10];
Hãy khai bảo 1 mảng nguyên có MAX phần tử
int P[MAX];
Hãy khai báo 1 mảng số thực có MAX phần tử
float R[MAX]
Như vậy khi duyệt mảng thì các chỉ số không được vượt quá hoặc bằng số phần
tử của mảng
Cách nhập dữ liệu cho từng phần tử trong
mảng như thế nào?
Có 2 cách nhập dữ liệu cho từng phần tử trong
mảng:
- cách 1: nhập bằng tay từ bàn phím
- cách 2: cho máy tự động nhập
Chúng ta nên kết hợp hàm (hôm bữa học) để
nhập và xuất mảng
Nhập mảng tự động bằng máy:
Để khởi tạo xuất ra các số ngẫu nhiên, ta phải viết hàm này trước:
Hàm trên có ý nghĩa là yêu cầu máy tính khởi động để tạo các số ngẫu nhiên : Tức là
mỗi lần chạy chương trình thì nó sẽ tự động phát sinh ra các con số có giá trị khác nhau
**** nếu như không có dòng này thì mỗi lần chạy chương trình sẽ cho ra có số ngẫu
nhiên GIỐNG NHAU.
Để lấy giá trị ngẫu nhiên , ta dùng công thức bên dưới:
rand()%n : Tức lấy lấy các giá trị ngẫu nhiên từ 0 cho tới n-1
Như vậy nếu ta gọi rand()%100 : tức là lấy giá trị ngẫu nhiên từ 0 99
Đề bài : Hãy xuất các số ngẫu nhiên từ -55 cho tới 150
(-77 88) Rand()%n -77=88 n=166
(3095)  rand()%n +30=95n=66
(-55150)Rand()%n -55 =150 n=206
Mảng ngẫu nhiên
Bài tập phần mảng 1 chiều:
Bài 1: Viết chương trình cho phép nhập/ xuất 1 mảng bất kỳ và thực hiện các yêu cầu sau:
a) Xuất ra các số lẻ trong mảng
b) Xuất ra các số nguyên tố trong mảng
c) Với K là 1 số nhập vào từ bàn phím, kiểm tra xem K xuất hiện bao nhiêu lần trong mảng
d) Tính tổng tất cả các phần tử trong mảng
*** Yêu cầu tất cả các câu ad phải dùng hàm để viết
Mảng 2 chiều:
- Cách khao báo mảng 2 chiều như thế nào
- Cách duyệt tất cả các phần tử trong mảng 2 chiều.
Trường hợp đặc biệt: Ma Trận Vuông, giới hạn của chúng ta là học
ma trận vuông, tức là mảng 2 chiều mà có số dòng và số cột bằng
nhau
Kiểu_Dữ_Liệu Tên_Mảng [Số_dòng] [Số_cột] ;
Ví dụ 1: int M[5][3];
Tức là khai báo 1 mảng 2 chiều tên là M, có 5 dòng, 3 cột
tổng số phần tử trong mảng = 5*3 =15 phần tử
Ví dụ 2: float K[3][4];
khai báo 1 mảng 2 chiều tên là K có kiểu số thực, số
dòng là 3, số cột là 4 tổng số phần tử là 4*3=12;
- Tương tự như mảng 1 chiều, chỉ số của các phần tử được
đánh dấu từ số 0 cho tới số dòng -1 hoặc số cột -1
Giả sử ta có mảng M 2 chiều, có 4 dòng và 5 cột
Chiều duyệt theo cột, thường đặt tên là j
j =2
j =3
M[0][2]
0
M[0][3]
12
M[0][4]
3
i =1
M[1][0]
2
M[1][1]
8
M[1][2]
15
M[1][3]
7
M[1][4]
5
i =2
M[2][0]
10
M[2][1]
8
M[2][2]
19
M[2][3]
13
M[2][4]
18
i =3
M[3][0]
17
M[3][1]
86
M[3][2]
78
M[3][3]
46
M[3][4]
0
j =4
j =1
M[0][1]
2
j =0
Chiều duyệt theo dòng, thường đặt tên là i
i =0
M[0][0]
9
Tức là để truy suất 1
phần tử tại dòng thứ ivà
tại cột thứ j thì ta viết:
M[i][j]
- Ví dụ, muốn lấy phần
tử tại dòng 2, cột 3 thì
ta viết M[2][3]
Thông thường, người ta sử dụng 2 vòn for lồng nhau để duyệt mảng 2
chiều. Vòng for ngoài duyệt theo dòng, vòng for trong duyệt theo cột
Ma Trận vuông : mảng 2chiều có số cột
và số dòng bằng nhau
Cách khai báo sẽ thay đổi 1 ít so với mảng 2
chiều bình thường.
Vì ma trận vuông là ma trận có số cột và số
dòng bằng nhau, nên ta thường khai báo
CẤP của mà trận thay vì khai báo số dòng, số
cột.
- Nếu nói ma trận vuông cấp 3  có 3*3
=9 phần tử
- Tức là khi nói tới ma trận vuông thì người
ta nói tới cấp. Nếu ma trận là cấp N thì số
phần tử của nó sẽ là N2
- Hãy viết các hàm để thực hiện yêu cầu:
- + Xuất đường chéo chính
- + xuất đường chéo phụ
- + Xuất các số nguyên tố trên mỗi dòng
- + Tính tổng các số chẵn trên đường chéo chính
*** Đường chéo chính là đường chéo mà i=j
*** Đường chéo phụ là đường mà i+j =n-1
Con trỏ và chuỗi ký tự
- Cách khai báo con trỏ:
Kiểu_dữ_liệu
* tên_con_trỏ;
- Khai báo con trỏ thì bắt buộc phải xin cấp phát bộ nhớ trước khi sử dụng
tên_con_trỏ = new kiểu_dữ_liệu;
- Để lấy giá trị của 1 biến con trỏ  dùng dấu * trước biến
- để lấy địa chỉ ô nhớ mà con trỏ đang trỏ tới  dùng dấu &
- Khi 2 đối tượng cùng trỏ tới 1 địa chỉ của ô nhớ nào đó , thì bất kỳ sự thay đổi nào của 1
đối tượng nào đó đều làm đối tượng kia bị ảnh hưởng
- Để cấp phát bộ nhớ cho con trỏ chúng ta dùng từ khóa new . Khi xin cấp phát bộ nhớ thì
bắt buộc phải kiểm tra hệ điều hành có cấp phát bộ nhớ cho con trỏ đó hay không/ Nếu
HĐH cấp phát thành công thì ta mới sử dụng, còn không thì thoát chương trình+
int *M;
int n;
cout<<"Nhap vao kich thuoc cua mang: ";
cin>>n;
M=new int[n];
if(M==NULL)
{
cout<<"Cap phat khong duoc";
exit(0);
}
chú ý phải kiểm tra có bị NULL hay không
Sau khi sử dụng con trỏ xong, bắt buộc phải hủy cấp phát bộ nhớ trước đó, nếu
như chúng ta không hủy thì chương trình sẽ dễ bị Memory Leakgây ảnh hưởng
tới tài nguyên của máy tính.
Dùng từ khóa delete để hủy bộ nhớ
if(M!=NULL)
{
delete M;
M=NULL;
}
Kiểu dữ liệu có cấu trúc:
Ví dụ mở đầu: Trường đại học XYZ cần viết 1 phần mềm quản lý sinh
viên, thông tin cần lưu trữ cho mỗi sinh viên bao gồm: mã sinh viên, họ
tên, tuổi, quê quán, lớp học…..
Trong trường hợp này chúng ta cần giải quyết vấn đề : 1 dữ liệu có
khả năng chứa nhiều thông tin trong nó
để giải quyết vấn đề này ta dùng kiểu dữ liệu có Cấu Trúc
Cách khai báo:
Từ khóa typedef dùng để định nghĩa một kiểu dữ liệu
mới
Khi ta khai báo: SinhVien teo;
Thì teo chính là 1 đối tượng có kiểu dữ liệu là SinhVien
nó tương tự như ta khai báo int x ;
Vậy để lấy các thông tin bên trong của teo thì làm
như thế nào?
Những thông tin mà nằm bên trong 1 cấu trúc
(struct) thì được gọi là các thuộc tính của cấu trúc đó
Tức là teo là 1 đối tượng cụ thể, teo có 4 thuộc tính
đó là: ma, ten,dtb,lop
để truy suất tới các thuộc tính ta dùng:
.
tên_đối_tượng thuộc_tính
Cách nhập dữ liệu có kiểu chuỗi
từ bàn phím:
dung gets
Viết chương trình quản lý sinh viên
int r=strcmp (chuỗi_a , chuỗi_b);
Nếu Chuỗi a = chuỗi b r=0
Nếu Chuỗi a > chuỗi br=1
Nếu chuỗi a < chuỗi b r=-1
Sắp xếp
Sắp xếp
Sắp xếp
Học về xử lý tập tin:
Viết chương trình quản lý sản phẩm, mỗi sản phẩm
cần lưu các thông tin: mã sản phẩm, tên sản phẩm,
xuất xứ, số lượng, đơn giá, thành tiền. yêu cầu thực
hiện các chức năng sau:
1) Cho phép nhập xuất danh sách sản phẩm
2) Thống kê những sản phẩm có đơn giá >=500
3) Xuất ra những sản phẩm có xuất xứ từ trung quốc
4) Sắp xếp sản phẩm theo xuất xứ tăng dần, nếu xuất
xứ trùng nhau thì sắp xếp theo số lượng giảm dần
5) Lưu toàn bộ thông tin từ bộ nhớ xuống ổ cứng/
đọc toàn bộ thông tin từ ổ cứng lên bộ nhớ
Giải thích chi tiết phần lưu tập tin:
Dùng thư viện này để tương tác tập tin
#include <stdio.h>
Dùng hàm fopen để mở 1 tập tin, có rất nhiều kiểu mở. Ở đây chúng ta học 2 kiểu
đó là mở lên để ghi và mở lên để đọc
FILE *fopen( const char *fname, const char *mode );
1
Mở lên để ghi , đối số thứ 2 của fopen nhập là “wb”
Đã tương tác tập tin thì thường xảy ra lỗi với tập tin: tập tin không tạo được do cấp
quyền, do sai đường dẫn…, hoặc ổ đĩa chỉ đọc. Do đó ta luôn luôn kiểm tra con trỏ
myFile có bị NULL hay không, nếu NULL tức là thất bại
Hàm fwrite dùng để lưu, đối số 1 là địa chỉ đối tượng cần lưu, đối số 2 là kích thước của
từng phần tử , đối số thứ 3 là n số lượng phần tử muốn lưu, đối số thứ 4 là nơi lưu. Hàm
trả về số phần tử bị ảnh hưởng trong tập tin.
Phải đóng tập tin để kết thúc quá trình lưu
1
Mở lên để đọc, đối số thứ 2 của fopen nhập là “rb”
Ở đây ta cho đọc tối đa MAX, nhưng chương trình sẽ tự động đọc những gì thực có
trong tập tin và trả về số phần tử đọc được cho biết r. như vậy ta gán lại n=r là xong
Nhớ đóng tập tin khi đã đọc xong:
Viết chương trình quản lý nhân viên: gồm có mã , tên
- sử dụng kiểu dữ liệu có cấu trúc
- Cho phép nhập/ xuất
Xuất theo yêu cầu dưới:
Bảng mã ký tự đặc biệt