Tải bản đầy đủ (.pdf) (53 trang)

Kỹ thuật lập trình Ôn Tập Function, Array, Struct

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (966.96 KB, 53 trang )

Ôn Tập
Function, Array, Struct
Trịnh Tấn Đạt
Khoa CNTT - Đại Học Sài Gòn
Email:
Website: />

Nội dung


Hàm



Mảng
o 1D-Array
o 2D-Array



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)



Macro 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;

}


Macro vs. Function
Ví dụ: tìm số lớn nhất giữa 2 số a và b
Macro

Function

#include <stdio.h>
#define MAX(A, B) ((A) > (B) ? (A) : (B))
int main()
{
int a = 5, b = 7;
float c = 5.6, d = 4.5;
printf("\nMAX= %d", MAX(a, b));
return 0 ;
}


#include <stdio.h>
int timMax(int, int); // prototype
int main()
{
int a = 5, b = 7;
printf("\nMAX= %d", timMax (a, b));
return 0 ;
}
int timMax(int x, int y)
{
return ((x) > (y) ? (x) : (y));
}
Định nghĩa hàm

Gọi hàm


Ví dụ
Tính x^n

#include <iostream>
using namespace std;
// khai bao prototype
int power(int, int);
void power_2(int, int);
// ham tinh so mu
int power(int ix, int in)
{
int i, ip = 1;
for(i = 1; i <= in; i++)

ip *= ix;
return ip;
}

void power_2(int ix, int in)
{
int i, ip = 1;
for(i = 1; i <= in; i++)
ip *= ix;
cout<<"ket qua:" <}
int main()
{
int kq = power(2, 3);
cout<<"2^3 =" <power_2(2,3);
return 0;
}


Ví Dụ

Tăng giá trị của biến lên một đơn vị

Tham chiếu và tham trị

#include <stdio.h>
void thamtri(int ix, int iy)
{
ix += 1; //cong ix them 1

iy += 1; //cong iy them 1
}
void thamchieu(int &ix, int &iy)
{
ix += 1; //cong ix them 1
iy += 1; //cong iy them 1
}

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.

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);

return 0;
}

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.



Ví dụ:
Biến tồn cục (global variable)
và biến cục bộ (local variable)

#include <iostream>
using namespace std;
void local_func();
int global_var = 10; // Biến toàn cục
int main()
{
cout<<"global var = " << global_var <local_func();
// ra khoi ham local_func()
cout<<"global var = " << global_var<return 0;
}
void local_func()
{
cout<<"global var in locAl function = " << global_var <int global_var = 5; // biến cục bộ
cout<<"local var = " <::global_var = 20;
cout<<"local var = " <cout<<"global var in locAl function = " << ::global_var <}


Array: 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ố (chỉ dùng cho các dãy vùng nhớ liên tiếp)
<Kiểu_Cơ_Sở> <Tên_Biến_Mảng>[<Số_Phần_Tử>];

Ví dụ: Mảng a có 5 phần tử
int a[10]; // (khai báo 10 ô nhớ, nhưng số lượng phần tử của mảng là 5)
a[0] = 1;
a[1] = 10;
a[2] = 21;
a[3] = -1;
a[4] = -4;


Lưu ý:


Không thể dùng biến mảng như thông thường.
int a[6];
a = -2; // ERROR
cout<


Mà phải dùng từng phần tử trong chúng. Mỗi phần tử được dùng như một biến
đơn.
int a[6];
a[1] = -2;
cin>>a[0]; // nhập vào a[0]
cout<


Biến mảng là tham số của hàm
▪ Tham số được khai báo như khai báo biến mảng.
Ví dụ: void SapXepTang(int a[100]);
Tham số kiểu mảng truyền cho hàm chính là địa chỉ của phần tử đầu tiên của mảng
Có thể khơng cần xác định số phần tử của mảng
Mảng được chuyển tham chiếu (Mảng có thể thay đổi nội dung sau khi thực hiện hàm)

Ví dụ: Hàm xuất nội dung một mảng các số nguyên:
void xuatMang(int a[], int N);
Ví dụ: Hàm nhập nội dung một mảng các số nguyên:
void nhapMang(int a[], int &N); // lưu ý khi nhập N trong hàm


Biến mảng là tham số của hàm
Lưu ý: Số lượng phần tử thực sự truyền qua biến khác
void SapXepTang(int a[100], int N);
void SapXepTang(int a[], int N);

int tinhtongMang(int A[], int N);
Lời gọi hàm void sapxepTang(int A[], int N);
void xoaDau(int A[], int &N);
int main()
{
int a[100], n;
tinhtongMang(a,n);
sapxepTang(a,n);
xoaDau(a,n);
}



Ví dụ:
void NhapMang(int a[], int &n)
{
cout<<"Nhap so luong phan tu n:";
cin>>n;
for (int i = 0; i < n; i++)
{
cout<<"Nhap phan tu thu "<< i <<" :";
cin>>a[i];
// có thể dùng scanf để nhập
// scanf("%d", &a[i]);
}
}
void XuatMang(int a[], int n)
{
cout<<"Cac phan tu cua mang:";
for (int i = 0; i < n; i++)
cout<cout<}

#include <iostream>
using namespace std;
void NhapMang(int a[], int &n); // prototype
void XuatMang(int a[], int n); // prototype
int main()
{
int A[100]; // khai báo biến mảng
int N; // số lượng phần tử trong mảng
NhapMang(A,N);

XuatMang(A,N);
return 0;
}


Hàm Tìm Kiếm
int TimKiem(int a[], int n, int x)
{
for (int i= 0; i < n; i++)
if (a[i] == x)
return i;
return -1;
}

#include <iostream>
using namespace std;
void NhapMang(int a[], int &n);
void XuatMang(int a[], int n);
int TimKiem(int a[], int n, int x);
int main()
{
int A[100], N, x, k;
NhapMang(A,N);
XuatMang(A,N);
cout<<"tim phan tu x:";
cin>>x;
k = TimKiem(A,N,x);
if (k!=-1)
cout<<"\n x tai vi tri:"<else

cout<<"\n khong tim thay";
return 0;
}


Ví dụ:
Tính tổng
int TimKiem(int a[], int n)
{
int tong = 0;
for (int i= 0; i < n; i++)
if (a[i] thỏa yêu cầu bài toán) // tùy yêu cầu điều kiện khác nhau
tong = tong + a[i];

return tong;
}


Ví dụ
Đếm số lượng phần tử thỏa điều kiện
int Demsoluong(int a[], int n)
{
int dem = 0;
for (int i= 0; i < n; i++)
if (a[i] thỏa yêu cầu bài toán) // tùy yêu cầu điều kiện khác nhau
dem++;
return dem;

}



Ví dụ: Kỹ thuật đặt cờ hiệu
Kiểm tra mảng a có phải là mảng tồn các số ngun tố hay không?
int LaSNT(int n)
{
int i, dem = 0;
for (i = 1; i <= n; i++)
if (n%i == 0)
dem++;
if (dem == 2)
return 1;
return 0;

}

int KiemTra(int a[], int n)
{
int flag = 1; // thảo đk
for (int i = 0; i < n ; i++)
{
if (LaSNT(a[i]) == 0) //không
{
flag = 0;
break;
}
}
if (flag == 1)
return 1;
else
return 0;

}

là SNT


Ví dụ: Kỹ thuật đặt lính canh
int TimMax(int a[], int n)
{
int max = a[0]; // max là lính canh
for (int i = 1; i < n; i++)
if (a[i] > max)
max = a[i];
return max;
}


Ví dụ : Kỹ thuật cầm canh (Sentinel)
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?????

int TimKiem(int a[], int n, int x)
{
int i = 0;
while ((ii++;
if(i==n)
return -1; //khơng tìm thấy
return i; //tìm được tại vị trí i

}


Sắp xếp trên mảng
void SapXepTang(int a[], int n)
{
int i, j;
for (i = 0; i < n – 1; i++)
{
for (j = i + 1; j < n; j++)
{
if (a[i] > a[j])
HoanVi(a[i], a[j]);
}
}
}
void HoanVi(int &x, int &y)
{
int tam = x; x = y; y = tam;
}


Ví 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


2D - Array
Cú pháp dùng cho mảng hai chiều (2D-Array):
<Kiểu_Cơ_Sở> <Tên_Biến_Mảng>[<N1>] [<N2>];
N1, N2: số lượng phần tử mỗi chiều

Ví dụ: int A[3][4]; // mảng 2 chiều A có 3 dịng và 4 cột
0
A

0
1

2

1

2

3

Ví dụ:
int a[10][20], b[10][20];
float c[5][10];
char d[10][20];


Truy xuất đến một phần tử
Thông qua chỉ số: truy xuất thơng tên mảng và chỉ số tại dịng và cột tương ứng
<tên biến mảng>[<chỉ số dòng>][<chỉ số cột>];
B[0][3]
int B[3][5];

B[1][0]

1


6

-2

3

0

37

43

51

1

93

34

0

Truy xuất phần tử tại dòng i, cột j: B[i][j]
Các truy xuất
Hợp lệ: B[0][0], B[0][1], …, B[2][2], B[2][3]
Không hợp lệ: B[-1][0], B[4][4], B[3][7]

B[2][3]



Truyền mảng cho hàm
❖ Truyền mảng cho hàm
Số lượng phần tử thực sự truyền qua biến khác
void XuatMangHaiChieu(int a[50][100], int m, int n);
void XuatMangHaiChieu (int a[][100], int m, int n);

m là số dòng, n là số cột

Lời gọi hàm
void NhapMangHaiChieu(int a[][100], int &m, int &n);
void XuatMangHaiChieu(int a[][100], int m, int n);
void main()
{
int a[50][100], m, n;
NhapMangHaiChieu (a, m, n);
XuatMangHaiChieu (a, m, n);
}


Hàm nhập mảng và xuất mảng
void NhapMangHaiChieu(int a[][MAXC], int &m, int &n)
{
cout<<"Nhap so dong, so cot cua mang:";
cin>>m>>n;
int i, j;
for (i=0; ifor (j=0; j{
cout<<"Nhap phan tu:";

cin>>a[i][j];
}
}
void XuatMangHaiChieu(int a[][MAXC], int m, int n)
{
int i, j;
for (i=0; i{
for (j=0; jcout<cout<}

}

#include <iostream>
#define MAXD 50
#define MAXC 100
void NhapMangHaiChieu(int a[][MAXC], int &m, int &n);
void XuatMangHaiChieu(int a[][MAXC], int m, int n);
int main()
{
int a[MAXD][MAXC];
int n,m;
NhapMangHaiChieu(a,m,n);
XuatMangHaiChieu(a,m,n);
return 0;
}
// hàm nhập mảng
// hàm xuất mảng



Hàm nhập mảng và xuất mảng
void xuatmang(int a[][MAX], int m , int n)
{ int i , j;
for(i =0; i{
for(j=0; j
{
cout<}
cout << endl; // in xuống dòng

}
}

Goi ham trong ham main
int main()
{
int a[MAX][MAX];
int n,m;
nhapmang(a,m,n);
xuatmang(a,m,n);
return 0;
}


×