Lập trình căn bản Tóm tắt lý thuyết và bài tập



tải về 1.01 Mb.
trang2/6
Chuyển đổi dữ liệu25.11.2017
Kích1.01 Mb.
#2884
1   2   3   4   5   6

I.2 Khai báo hàm con

Tên hàm ([ danh sách các tham số])

I.3 Cách xây dựng một hàm con

a. Kiểu dữ liệu của hàm : Gồm 2 loại :

void : Hàm không trả về giá trị. Những hàm loại này thường rơi vào những nhóm chức năng: Nhập / xuất dữ liệu , thống kê, sắp xếp, liệt kê.



void Tên_hàm (danh sách các tham số)

{

Khai báo các biến cục bộ

Các câu lệnh / khối lệnh hay lời gọi đến hàm khác.

}

Kiểu dữ liệu cơ bản hay kiểu dữ liệu có cấu trúc: Kiểu dữ liệu tùy theo mục đích của hàm cần trả về giá trị gì thông qua việc phân tích bài toán. Những hàm loại này thường sử dụng trong các trường hợp: Đếm, kiểm tra, tìm kiếm, tính trung bình, tổng, tích, …



Tên_hàm ([danh sách các tham số])

{

kq;

Khai báo các biến cục bộ

Các câu lệnh / khối lệnh hay lời gọi đến hàm khác.

return kq;

}

b. Tham số : Xác định dựa vào dữ liệu đầu vào của bài toán (Input). Gồm 2 loại

Tham số không là con trỏ (tham trị): Không thay đổi hoặc không cần lấy giá trị mới của tham số sau lời gọi hàm. Tham số dạng này chỉ mang ý nghĩa là dữ liệu đầu vào.

Tham số con trỏ (tham biến): Có sự thay đổi giá trị của tham số trong quá trình thực hiện và cần lấy lại giá trị đó sau khi ra khỏi hàm. Ứng dụng của tham số loại này có thể là dữ liệu đầu ra (kết quả) hoặc cũng có thể vừa là dữ liệu đầu vào vừa là dữ liệu đầu ra. Lưu ý : phải có dấu & trước tên tham số

c. Tên hàm : Đặt tên theo quy ước đặt tên trong C sao cho tên gọi đúng với chức năng hay mục đích thực hiện của hàm và gợi nhớ.

d. Ví dụ

Ví dụ 1: Viết chương trình nhập số nguyên dương n và in ra màn hình các ước số của n

Phân tích bài toán:

Input: n

- Giá trị n không bị thay đổi trong quá trình tìm ước số do đó tham số của hàm là tham trị.

Output: In ra các ước số của n

Xác định tên hàm: Hàm này dùng in ra các ước số của n nên có thể đặt là LietKeUocSo



#include

#include

void LietKeUocSo (int n)

{

int i;

for( i=1; i<=n; i++)

printf(“%5d”, i);

}

void main()

{

int n;

printf(“Nhap n = ”); scanf(“%d”,&n);

printf("Cac uoc so cua n : " );

LietKeUocSo(n);

getch( );

}

Ví dụ 2: Viết chương trình nhập số nguyên dương n và tính tổng S = 1+2+ …+ n, với n>0

Phân tích bài toán:

Input: n

- Giá trị n không thay đổi trong quá trình tính tổng  tham số của hàm không là tham trị.

Output: Tổng S

- Trả về giá trị của S.

- S là tổng các số nguyên dương nên S cũng là số nguyên dương.

Xác định tên hàm: Hàm này dùng tính tổng S nên có thể đặt là TongS.



#include

#include

int TongS ( int n)

{

int S=0, i=1;

while(i<=n)

{

S+=i;

i++;

}

return S;

}

void main()

{

int n, kq;

printf(“Nhap n = ”); scanf(“%d”,&n);

kq = TongS ( n );

printf(“Tong can tinh la: %d ”, kq);

getch( );

}

II. BÀI TẬP

II.1. Bài tập cơ bản

1. Cài đặt lại tất cả các bài tập ở chương 2 theo phương pháp hàm.

2. Viết chương trình tính diện tích và chu vi của hình chữ nhật với chiều dài và chiều rộng được nhập từ bàn phím.

3. Viết chương trình tính diện tích và chu vi hình tròn với bán kính được nhập từ bàn phím.

4. Nhập số nguyên dương n (n>0). Liệt kê tất cả các số nguyên tố nhỏ hơn n.

5. Nhập số nguyên dương n (n>0). Liệt kê n số chính phương đầu tiên.

6. Nhập số nguyên dương n (n>0). Đếm xem có bao nhiêu số hoàn thiện nhỏ hơn n.

7. Nhập số nguyên dương n (0 <= n< 1000) và in ra cách đọc của n.

Ví dụ: Nhập n = 105. In ra màn hình: Mot tram le nam.

8. Viết chương trình tính tiền thuê máy dịch vụ Internet và in ra màn hình kết quả. Với dữ liệu nhập vào là giờ bắt đầu thuê (GBD), giờ kết thúc thuê (GKT), số máy thuê (SoMay).

- Điều kiện cho dữ liệu nhập: 6<=GBD

- Đơn giá: 2500đ cho mỗi giờ máy trước 17:30 và 3000đ cho mỗi giờ máy sau 17:30.

9. Viết chương trình tính tiền lương ngày cho công nhân, cho biết trước giờ vào ca, giờ ra ca của mỗi người.

Giả sử rằng:

- Tiền trả cho mỗi giờ trước 12 giờ là 6000đ và sau 12 giờ là 7500đ.

- Giờ vào ca sớm nhất : 6 giờ sáng và giờ ra ca trễ nhất : 18 giờ (giờ nhập vào là số nguyên)

10. Nhập vào 3 số thực a, b, c và kiểm tra xem chúng có thành lập thành 3 cạnh của một tam giác hay không? Nếu có hãy tính diện tích, chiều dài mỗi đường cao của tam giác và in kết quả ra màn hình.

- Công thức tính diện tích s = sqrt(p*(p-a)*(p-b)*(p-c) ) (Với p là nữa chu vi của tam giác).

- Công thức tính các đường cao: ha = 2s/a, hb=2s/b, hc=2s/c.

11. Nhập vào 6 số thực a, b, c, d, e, f . Giải hệ phương trình sau :

12. Viết chương trình nhập 2 số nguyên dương a, b. Tìm USCLN và BSCNN của a,b.

13. Viết chương trình tính tổng nghịch đảo của n giai thừa.

14. Cho 2 số nguyên a, b. Viết hàm hoán vị giá trị 2 số trên.

15. (*) Viết chương trình nhập số nguyên dương n gồm 5 chữ số, kiểm tra xem các chữ số n có phải là số đối xứng hay không. Ví dụ: Đối xứng: 13531 , Không đối xứng: 13921

16. Viết chương trình nhập số nguyên dương n gồm k chữ số , đếm xem n có bao nhiêu chữ số chẵn và bao nhiêu chữ số lẻ.

17. Viết chương trình nhập số nguyên dương n gồm k chữ số, đếm xem n có bao nhiêu chữ số là số nguyên tố.

18. Viết chương trình nhập số nguyên dương n gồm k chữ số, tính tổng các ước số dương của n. Ví dụ: Nhập n=6 , Tổng các ước số từ 1 đến n: 1+2+3+6=12.

19. Viết chương trình nhập số nguyên dương n gồm k chữ số , tìm ước số lẻ lớn nhất của n. Ví dụ: Ước số lẻ lớn nhất của 27 là 9.

20. Viết chương trình nhập số nguyên dương n gồm k chữ số, kiểm tra xem các chữ số của n có toàn lẻ hay toàn chẵn không.

21. (*) Viết chương trình nhập số nguyên dương n gồm k chữ số, sắp xếp các chữ số của n theo thứ tự tăng dần. Ví dụ: Nhập n=1536 , Kết quả sau khi sắp xếp: 1356.

II.2. Bài tập luyện tập và nâng cao

22. Viết chương trình nhập số nguyên dương n gồm k chữ số , sau đó nhập một số nguyên x, tìm vị trí xuất hiện của chữ số có giá trị x trong n.

Ví dụ: Nhập n=1526, x=2 , Kết quả: Chu so 2 o vi tri thu 3.

23. Viết chương trình nhập số nguyên dương n gồm k chữ số, kiểm tra xem các chữ số của n có được sắp thứ tự không. Ví dụ: Nhập n=1569 hoặc n=8521 , Kết quả: Có thứ tự.

24. Viết chương trình nhập 2 số a, b sao cho: số lớn nhất trong 2 số phải là một số dương và chia hết cho 7. Nếu nhập sai phải yêu cầu nhập lại cho đến khi đúng.

25. Viết chương trình nhập số nguyên dương n gồm k chữ số, tính giá trị trung bình các chữ số chẵn trong n.

26. (*) Viết chương trình in ra màn hình ngày/tháng/năm của ngày hiện tại, cho phép sử dụng các phím mũi tên lên, xuống để tăng hoặc giảm một ngày.

27. (*) Viết chương trình in ra màn hình giờ:phút:giây hiện tại, cho phép sử dụng các phím mũi tên lên, xuống để tăng hoặc giảm một giây.



PHẦN 4

MẢNG MỘT CHIỀU

I. TÓM TẮT LÝ THUYẾT

I.1. Khái niệm

Mảng thực chất là một biến được cấp phát bộ nhớ liên tục và bao gồm nhiều biến thành phần. Các thành phần của mảng là tập hợp các biến có cùng kiểu dữ liệu và cùng tên. Do đó để truy xuất các biến thành phần, ta dùng cơ chế chỉ mục.



I.2. Khai báo mảng

Để khai báo một mảng, ta có 2 cách khai báo sau :

�� Cách 1: Con trỏ hằng

< Kiểu dữ liệu > < Tên mảng > [ < Số phần tử tối đa của mảng> ] ;

Ví dụ:

int a[100]; // Khai bao mang so nguyen a gom 100 phan tu

float b[50]; // Khai bao mang so thuc b gom 50 phan tu

�� Cách 2: Con trỏ



< Kiểu dữ liệu > *< Tên mảng >;

Ví dụ :

int *p; // khai bao con tro p

�� Lưu ý: Khi sử dụng biến con trỏ để truy xuất mảng, theo cách như trên thì thực chất con trỏ p chỉ chiếm 2 byte bộ nhớ để chứa địa chỉ mà thôi. Để tạo mảng chứa dữ liệu thành phần thì ta phải cấp phát vùng nhớ cho con trỏ p. Dùng hàm : malloc trong thư viện để cấp phát vùng nhớ.



Tên con trỏ = (kiểu dữ liệu *) malloc(100);

Ví dụ:

int *px; //Khai báo con trỏ px

px = (int *) malloc (100); //Cấp phát 100 ô nhớ kiểu int cho con trỏ px

Sau khi sử dụng xong thì nên giải phóng vùng nhớ bằng hàm free



free (p) ; // giải phóng vùng nhớ cho con trỏ p.

I.3. Truy xuất phần tử của mảng

Với khái niệm và cách khai báo như trên ta có hình dạng của mảng một chiều như sau:

Ví dụ : int A[5] // Khai báo mảng A gồm tối đa 5 phần tử nguyên.



Ví dụ minh hoạ: Khai báo và gán giá trị cho mảng

#include

#include

void main ( )

{

clrscr ( );

int a[4] = {5,9,3,8};

for (int i = 0; i < 4 ; i++)

printf (“ a [ %d ] = %d \n”, i , a[i] );

getch ( );

}

Đối với con trỏ: Lấy địa chỉ của phần tử trong mảng ta dùng dấu “&”

Ví dụ:


int a[7];

int *p = a[3]; //Lấy địa chỉ phần tử thứ 3

Ví dụ :


int a[7];

int *px;

px = a; //px trỏ tới phần tử thứ 0

px = px + 4; //px trỏ tới phần tử thứ 4

Từ ví dụ trên ta có thể mô hình hoá mảng như sau:





Ví dụ minh hoạ: Viết chương trình nhập vào mảng một chiều n phần tử kiểu số nguyên, xuất mảng vừa nhập ra màn hình

#include

#include

void nhap_mang(int a[10], int &n)

{

int i;

printf(“nhap vao so phan tu mang n=”);

scanf(“%d”,&n);

for(i=0;i

{

printf (“ a [ %d ] = “, i );

scanf (“ %d”, &a[i] );

}

}

void xuat_mang(int a[10], int n)

{

int i;

printf (“ \n Noi dung mang vua nhap: “);

for (i = 0; i

printf (“ %5d “,a[i]);

}

void main ( )

{

int a[10], i;

nhap_mang(a,n);

xuat_mang(a,n);

getch ( );

}

II. BÀI TẬP

II.1. Một số kĩ thuật cơ bản

a. Kĩ thuật đặt cờ hiệu : Kĩ thuật này thường được áp dụng cho những bài toán “kiểm tra”.

Ví dụ 1 : Viết hàm kiểm tra xem mảng các số nguyên có thứ tự tăng dần không?

(Trả về 1: Nếu mảng tăng dần, ngược lại trả về 0).

int KiemTraTang (int a[ ], int n)

{

int i, flag = 1;

for ( i = 0; i < n-1; i ++ )

if ( a[i] > a[i+1] ) // Vi phạm điều kiện tăng dần

{

flag = 0;

break;

}

return flag;

}

Ví dụ 2 : Viết hàm kiểm tra xem trong mảng các số nguyên có tồn tại số nguyên lẻ lớn hơn 100 hay không?

(Trả về 1: Nếu có tồn tại số lẻ và lớn hơn 100, ngược lại trả về 0).

int KiemTraLe (int a[ ], int n)

{

int i, flag = 0;

for ( i = 0; i < n; i ++ )

if ( a[i] % 2 != 0 && a[i][j] > 100 ) //Gặp phần tử thoả

{

flag = 1;

break;

}

return flag;

}

b. Kĩ thuật đặt lính canh : Kĩ thuật này thường được áp dụng cho những bài tập về “tìm kiếm”, “liệt kê” theo một điều kiện nhất định nào đó.

Ví dụ : Viết hàm tìm và trả về giá trị lớn nhất trong mảng một chiều các số nguyên.

int TimMax (int a[], int n)

{

int max, i = 1;

max = a[0];

while ( i < n )

{

if ( a[i] > max )

max = a[i] ;

i++;

}

return max;

}

II.2. Bài tập cơ bản

a. Nhập, xuất mảng

1. Viết chương trình nhập xuất mảng một chiều các số thực.

2. Viết chương trình nhập ngẫu nhiên mảng một chiều các số nguyên, xuất mảng vừa nhập ra màn hình.

3. Viết chương trình nhập mảng các số thực và in các phần tử âm trong mảng.

4. Viết chương trình nhập mảng các số nguyên và in các phần tử lẻ có trong mảng.

5. Viết chương trình nhập vào mảng một chiều các số nguyên và in ra các phần tử chẵn < 20

6. Viết chương trình nhập vào mảng một chiều các số nguyên và in ra màn hình các phần tử là số nguyên tố.

7. Viết chương trình nhập vào số nguyên n và liệt kê các số nguyên tố nhỏ hơn n, nếu mảng không tồn tại số nguyên tố nào nhỏ hơn n thì phải xuất ra một câu thông báo.

8. Viết chương trình nhập vào mảng một chiều các số nguyên và xuất ra màn hình các phần tử là số chính phương nằm tại những vị trí lẻ trong mảng.

b. Tìm kiếm trên mảng một chiều

Phương pháp cơ bản :

Viết hàm tìm phần tử có giá trị x xuất hiện đầu tiên trong mảng một chiều.

(Nếu tìm thấy trả về vị trí xuất hiện x, ngược lại trả về -1)

int TimX (int a[], int n)

{

int x, i;

for ( i = 0; i < n ; i ++)

if ( x==a[i] )

return i;

return -1;

}

9. Viết hàm tìm vị trí phần tử có giá trị x xuất hiện cuối cùng trong mảng.

10. Viết hàm tìm vị trí của phần tử nhỏ nhất trong mảng các số nguyên.

11. Viết hàm tìm vị trí của phần tử lớn nhất trong mảng các số nguyên.

12. Viết hàm in vị trí các phần tử nguyên tố trong mảng các số nguyên.

13. Viết hàm in vị trí các phần tử nguyên tố lớn hơn 23.

14. Viết hàm tìm vị trí phần tử âm đầu tiên trong mảng. Nếu không có phần tử âm trả về –1.

15. Viết hàm tìm vị trí phần tử âm lớn nhất trong mảng.

16. Viết hàm tìm vị trí phần tử dương đầu tiên trong mảng. Nếu không có phần tử dương trả về –1.

17. Viết hàm tìm vị trí phần tử dương bé nhất trong mảng.

18. Viết hàm in các phần tử trong mảng là bội của 3 và 5.

19. Viết hàm tìm số chẵn cuối cùng có trong mảng, nếu không tồn tại số chẵn hàm trả về -1

20. Viết hàm tìm số lẻ lớn nhất có trong mảng, nếu không tồn tại số lẻ hàm trả về -1.

21. Viết hàm tìm và đổi chỗ phần tử lớn nhất với phần tử nhỏ nhất trong mảng.

22. Nhập vào X. Viết hàm in ra màn hình những phần tử trong mảng có giá trị từ 1 đến X.

23. Viết chương trình nhập vào một dãy số a gồm n số thực ( 100 ≤ n ), nhập vào dãy số b gồm m số thực ( 100 ≤ m ).

• In ra những phần tử chỉ xuất hiện trong dãy a mà không xuất hiện trong dãy b.

• In ra những phần tử xuất hiện ở cả hai dãy.



c. Đếm – Tần suất

Phương pháp cơ bản : Viết hàm đếm phần tử chia hết cho 5 trong mảng các số nguyên.

int Dem (int a[], int n )

{

int i, dem = 0;

for ( i = 0; i < n ; i++ )

if ( a[i] % 5 == 0 )

dem++;

return dem;

}

24. Viết hàm đếm các phần tử âm, dương trong mảng.

25. Viết hàm đếm các phần tử chẵn, lẻ trong mảng.

26. Viết hàm đếm số lần xuất hiện của phần tử x trong mảng.

27. Viết hàm đếm các phần tử nhỏ hơn x trong mảng.

28. Viết hàm đếm các phần tử là số nguyên tố trong mảng.

29. Viết hàm đếm các phần tử là số hoàn thiện trong mảng.

30. Viết hàm đếm các phần tử là bội của 3 và 5 trong mảng các số nguyên.



d. Tính tổng – Trung bình có điều kiện

Phương pháp cơ bản : Viết hàm tính tổng các phần tử trong mảng.

int TinhTong (int a[], int n )

{

int i, tong = 0;

for ( i = 0; i < n; i++ )

tong = tong + a[i] ;

return tong;

}

Viết hàm tính giá trị trung bình các phần tử có giá trị âm trong mảng.

Đối với hàm tính trung bình có điều kiện phải lưu ý khi chia giá trị (Có thể mảng không có phần tử nào thoả điều kiện, nếu ta chia tức là chia cho 0).

float TrungBinhAm (int a[], int n )

{

int i, tong = 0, spt=0;

for ( i = 0; i < n; i++ )

if( a[i]<0 )

{

tong = tong + a[i] ;

spt++;

}

if(spt==0)

return 0;

return 1.0*tong/spt;

}

Bài tập

31. Viết hàm tính tổng các phần tử chẵn trong mảng.

32. Viết hàm tính tổng các phần tử lẻ trong mảng các số nguyên.

33. Viết hàm tính tổng các phần tử nguyên tố trong mảng.

34. Viết hàm tính tổng các phần tử nằm ở vị trí chẵn trong mảng các số nguyên.

35. Viết hàm tính tổng các phần tử nằm ở vị trí nguyên tố trong mảng.

36. Viết hàm tính tổng các phần tử chia hết cho 5 có trong mảng.

37. Viết hàm tính tổng các phần tử cực đại trong mảng các số nguyên (phần tử cực đại là phần tử lớn hơn các phần tử xung quanh nó). Ví dụ : 1 5 2 6 3 5 1 8 6

38. Viết hàm tính tổng các phần tử cực tiểu trong mảng các số nguyên ( phần tử cực tiểu là phần tử nhỏ hơn các phần tử xung quanh nó ). Ví dụ : 6 4 2 9 5 3 7 1 5 8

39. Viết hàm tính tổng các phần tử là bội của 3 và 5 trong mảng các số nguyên.

40. Viết hàm tính tổng các phần tử là số hoàn thiện trong mảng các số nguyên.

41. Viết hàm tính giá trị trung bình của các số hoàn thiện trong mảng các số nguyên.



e. Sắp xếp

Kĩ thuật cơ bản : Viết hàm sắp xếp mảng theo thứ tự tăng dần.

void HoanVi (int &a, int &b)

{

int tam ;

tam= a;

a = b;

b = tam;

}

void SapTang (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]);

}

Bài tập

42. Viết hàm sắp xếp mảng theo thứ tự giảm dần.

43. Viết hàm sắp xếp mảng theo thứ tự tăng dần của các phần tử là số nguyên tố.

44. Viết hàm sắp xếp các phần tử lẻ tăng dần.

45. Viết hàm sắp xếp các phần tử chẵn giảm dần.

46. Viết hàm sắp xếp các phần tử chẵn nằm bên trái theo thứ tự tăng dần còn các phần tử lẻ bên phải theo thứ tự giảm dần.

47. Viết hàm sắp xếp các phần tử âm giảm dần từ trái sang phải, phần tử dương tăng dần từ phải sang trái.

f. Xoá

Kĩ thuật cơ bản : Duyệt mảng từ trái sang phải . Xuất phát từ vị trí cần xoá tiến hành dời lần lượt các phần tử về phía trước cho đến khi kết thúc mảng, sau đó giảm kích thước mảng. Vấn đề đặt ra là tìm vị trí cần xóa theo điều kiện bài toán rồi thực hiện xóa.

Viết hàm xoá phần tử đầu tiên của mảng.

void XoaDau (int a[], int &n)

{

for (int i = 0; i < n-1 ; i++)

a[i] = a[i+1];

n--;

}

Viết hàm xoá phần tử tại vị trí (vitri) cho trước trong mảng.

void XoaTaiViTri (int a[], int &n, int vitri)

{

for (int i = vitri; i < n-1 ; i++)

a[i] = a[i+1];

n--;

}

Bài tập

48. Viết hàm xoá phần tử tại vị trí lẻ trong mảng.

49. Viết hàm xoá phần tử có giá trị lớn nhất trong mảng.

50. Nhập vào giá trị X. Viết hàm xoá tất cả các phần tử có giá trị nhỏ hơn X.

51. Nhập vào giá trị X. Viết hàm xoá phần tử có giá trị gần X nhất.

g. Chèn

Kĩ thuật cơ bản : Duyệt mảng từ phải sang trái. Xuất phát từ cuối mảng tiến hành đẩy lần lượt các phần tử về phía sau cho đến vị trí cần chèn, chèn phần tử cần chèn vào vị trí chèn và tăng kích thước mảng. Trước khi chèn ta phải xác định vị trí cần chèn theo điều kiện bài toán.

Thêm phần tử có giá trị X vào cuối mảng.

void ThemCuoi (int a[], int &n, int X)

{

a[n]=X;

n++;

}

Chèn phần tử có giá trị X vào mảng tại vị trí cho trước

void ChenX (int a[], int &n, int X, int vitri)

{

for (int i = n; i >vitri ; i--)

a[i] = a[i-1] ;

a[vitri] = X;

n++;

}



tải về 1.01 Mb.

Chia sẻ với bạn bè của bạn:
1   2   3   4   5   6




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©tieuluan.info 2022
được sử dụng cho việc quản lý

    Quê hương