Bài giảng Kỹ thuật lập trình: Ôn tập giúp người học ôn tập lại các kiến thức: Hàm, mảng, kiểu struct, tạo số ngẫu nhiên trong C/C++, giới thiệu ma trận thưa (sparse matrix) vs. dense matrix (option). Mời các bạn cùng tham khảo.
Trang 1Ôn Tập Function, Array, Struct
Trịnh Tấn Đạt
Khoa CNTT - Đại Học Sài Gòn
Email: trinhtandat@sgu.edu.vn
Website: https://sites.google.com/site/ttdat88/
Trang 2▪ Tạo số ngẫu nhiên trong C/C++
▪ Giới thiệu Ma trận thưa (sparse matrix) vs dense matrix (option)
Trang 3Macro vs Function
▪ Macro: được dùng để chỉ những định nghĩa được viết ở phần Preprocessor, thay vìđặt nó vào trong phần thực thi của file nguồn
Ví dụ : #define TONG_HAI_SO(x, y) (x) +(y)
▪ Function: là một loại chương trình con, gồm tên hàm, các tham số và thân hàm(chứa các phát biểu chương trình), thực thi một việc cụ thể
Ví dụ: int TongHaiSo(int x, int y)
{
return x+y;
}
Trang 4int a = 5, b = 7;
printf("\nMAX= %d", timMax (a, b) );
return 0 ; }
int timMax( int x , int y ) {
return ((x) > (y) ? (x) : (y));
}
Gọi hàm
Định nghĩa hàm
Trang 5Ví Dụ
Hàm có giá trị trả về và hàm void
int main() {
// khai bao prototype
int power(int, int);
void power_2(int, int);
Trang 6Ví Dụ
Tham chiếu và tham trị
int main() {
int ia = 5, ib = 5;
thamtri(ia, ib);
// ia = 5 ; ib = 5 printf("a = %d, b = %d\n", ia, ib);
thamchieu(ia, ib);
// ia =6; ib= 6 printf("a = %d, b = %d\n", ia, ib);
Tăng giá trị của biến lên một đơn vị
toán tử địa chỉ &
tham số hình thức và tham số thực cùng địa chỉ mọi thay đổi đối với tham số hình thức cũng làm thay đổi tham số thực.
các thay đổi cho tham số hình thức (trong hàm) không làm thay đổi đối với tham số thực.
Trang 7printf("global_var in local func:%d\n", global_var); // 10
int global_var = 5; // biến cục bộ
printf("local_var:%d\n", global_var); // 5
}
Biến global_var = 5 khai báo trong hàm local_func chỉ có ảnh hưởng trong phạm vi hàm và chu trình sống của nó bắt đầu từ lúc gọi hàm đến khi thực hiện xong
Trang 8Array: 1D-Array
▪ Chỉ số của mảng bắt đầu từ 0 -> N-1 ( với N là số lượng phần tử của mảng)
▪ Toán tử [] : toán tử lấy chỉ số (chi dùng khi các dãy vùng nhớ liên tiếp)
Trang 9Ví dụ:
Các thao tác trên mảng #include <stdio.h>void nhapmang( int a[] , int);
void duyetmang( int a[] , int); int main()
{ int a[100]; int n;
Trang 10Ví dụ:
Tính tổng
Trang 11Ví dụ
Đếm số lượng phần tử thỏa điều kiện
Trang 12Ví dụ
Kỹ thuật đặt cờ hiệu
Ví dụ:Tìm số nguyên tố đầu tiên trong mảng
Trang 13Ví dụ
Xóa phần tử tại vị trí k
Trang 14Ví dụ:
Thêm một phần tử vào vị trí k
Trang 15Ví dụ
Tìm kiếm phần tử x trong mảng
Giả sử có đủ vùng nhớ để gán a[n] = x; trước vòng lặp while
- > chuyện gì xảy ra?????
Trang 16Ví dụ
Bài toán sắp xếp
Trang 17Ví dụ
Trộn 2 mảng một chiều a, b các phần tử xen kẽ nhau thành một mảng một chiều (a, b
có thể có số phần tử khác nhau)
Trang 18Ví dụ:
Sắp xếp các phần tử trên mảng sao cho các số dương tăng dần và các số âm giảm dần
Trang 19Array: 2D-Array
Trang 20Mảng 2 chiều
Trang 21Gán giá trị
Trang 22Nhập dữ liệu cho mảng 2 chiều
Ví dụ:
int ia[5][10];
Trang 23In dữ liệu từ mảng 2 chiều
Trang 24cout<<“nhap vao so dong”; cin>> m;
cout<<“nhap vao so cot”; cin>> n;
for(i =0; i<m;i++)
{
for(j=0; j<n; j++) {
cin>>a[i][j];
} }
}
Goi ham trong ham mainint main()
{int a[MAX][MAX];int n,m;
nhapmang(a,m,n);
return 0;
}
Trang 25cout<<a[i][j] << “ ”;
} cout << endl; // in xuống dòng
nhapmang(a,m,n); xuatmang(a,m,n);
return 0;
}
Trang 26Kỹ thuật đặt lính canh
Trang 27Kỹ thuật đặt cờ hiệu
Trang 28Sắp xếp
Trang 29a)
Trang 30b)
Trang 32Đối với mảng, chỉ có thể lưu nhiều thông tin có cùng kiểu dữ liệu Nhưng với
structure ta có thể lưu thông tin như một mảng có nhiều kiểu dữ liệu khác nhau.
Trang 33Cách khai báo biến có kiểu structure
Trang 34Tham chiếu các phần tử trong structure
Trang 35Ví dụ:
Trang 36Khai báo biến cấu trúc:
hoso nv1;
Trang 38/* Danh sach nhan vien */
snv[i].manv = atoi(ctam); // chuyen chuoi sang so
printf("Nhap vao ho ten: ");
gets(snv[i].hoten);
} //in danh sach nhan vien for(i = 0; i < in; i++)
printf("%5d %s\n", snv[i].manv, snv[i].hoten);
return 0;
}
Trang 39Bài Tập
Ôn tập lại các bài tập vể function, array và struct trong môn học cơ sơ lập trình
Trang 40Tạo ngẫu nhiên trong C/C++
▪ Hàm srand()
Cú pháp: void srand (unsigned int seed);
Dùng để khởi tạo một số ngẫu nhiên theo một số seed
Để cho mỗi số seed khác nhau người ta thường dùng kèm với unsigned int
time(NULL) trong thư viện time.h, hàm time(NULL) trả về số giây đã trôi qua kể từ
ngày 1/1/1970
▪ Hàm srand() thường được gọi trước khi gọi hàm rand()
Trang 41Tạo ngẫu nhiên trong C/C++
▪ Hàm rand()
Cú pháp: int rand(void);
Trả về một số nguyên giả random trong khoảng từ 0 đến RAND_MAX
Hằng RAND_MAX được định nghĩa trong stdlib.h đảm bảo ít nhất bằng 32767
Nếu chỉ dùng hàm rand() thì sẽ cho ra những số random giống nhau mỗi lần chạy, vì
vậy người ta thường khai báo srand(time(NULL)) trước để kết quả random mỗi lần
mỗi khác nhau
Để lấy số ngẫu nhiên từ 0 đến n, ta sử dụng rand()%(n+1)
Để lấy số ngẫu nhiên từ a đến b, ta sử dụng a + rand()%(b-a+1)
Trang 42Tạo ngẫu nhiên trong C/C++
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
Trang 43Câu hỏi
Phát sinh ngẫu nhiên mảng các số nguyên có K phần từ (100K 200) Yêu cầu cácphần tử được phát sinh ngẫu nhiên trong đoạn [1,10000]
Trang 44Tạo ngẫu nhiên trong C/C++
▪ Tạo ngẫu nhiên Số thực:
Để lấy giá trị từ 0.0 to 1.0
float r = static_cast (rand()) / static_cast (RAND_MAX);
Trang 45Tạo ngẫu nhiên trong C/C++
C code:
#include <stdio.h> /* printf, NULL */
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
int main() {
srand (time(NULL)); // seed initialization for (int i = 0; i < 10; ++i)
{ float r = (float) (rand()) / (float) (RAND_MAX); printf("%f\n", r);
}
return 0;
}
Trang 46Tạo ngẫu nhiên trong C/C++
C++ code
#include <iostream> /* std::cout, std::enld */
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
int main() {
srand (time(NULL)); // seed initialization for (int i = 0; i < 10; ++i)
{ float r = static_cast <float> (rand()) / static_cast <float> (RAND_MAX); std::cout << r << std::endl;
}
return 0;
}
Trang 47Sparse matrix vs Dense matrix
▪ Ma trận thưa (Sparse matrix) là loại ma trận có kích thước lớn nhưng phần lớn các
phần tử là 0
▪ Thực hiện tính tóa trên ma trận thưa, ta thường quan tâm đến không gian lưu trữ
và tốc độ tính toán sao cho tối ưu nhất
Trang 48Sparse matrix - applications
Ví dụ: The NYC subway system
Trang 49Sparse matrix - applications
Ví dụ: Computer vision – bài toán background subtraction
Trang 50Sparse matrix - applications
Ví dụ: Computer vision – bài toán background subtraction (2)
Trang 51Sparse matrix - applications
Ví dụ: Audio signal processing – baì toán lyric and music separation
Trang 52Sparse matrix - applications
Ví dụ: Face analysis system – baì toán illumination normalization
Trang 53Sparse matrix
▪ Lưu trữ ma trận thưa (có nhiều cách): chỉ lưu trữ thông tin của các phần tử khác 0Dùng Arrays
Dùng Linked Lists
DOK (Dictionary of keys)
LIL (List of lists)
COO (Coordinate list)
CSR (Compressed Sparse Row)
CSC (Compressed Sparse Column)
…
Trang 55Sparse matrix
Dùng Linked Lists
* Sẽ được học trong môn
Cấu trúc dữ liệu và giải
thuật
Trang 56Bài tập
Nhập ngẫu nhiên hai ma trận thưa kích thước NxN
A) Biễu diễn ma trận thưa bằng triples- (Row, Column, value)B) Tính tổng hai ma trận
C) Tìm ma trận chuyển vị
* Tìm hiểu thuật toán nhân nhanh hai ma trận thưa (option)