PHẦN 6: XÂY DỰNG CHƯƠNG TRÌNH CON (HÀM CON)

Một phần của tài liệu Hướng dẫn giải bài tập ngôn ngữ lập trình c (Trang 34 - 42)

Bài 6.01. Viết chương trình con in ra màn hình mảng 1 chiều số nguyên (hoặc

số thực) có định dạng và Bài 6.03. Viết chương trình con sinh ngẫu nhiên giá trị mảng 1 chiều (hoặc 2 chiều) số nguyên (hoặc số thực).

Hướng dẫn giải:

Để truyền tham số là 1 mảng vào hàm con, ta theo cú pháp

KDLTV TH(KDLM * tm, int spt) // ví dụ: void InMang (int *a, int n)

Chú thích: - KDLTV: kiểu dữ liệu mà hàm sẽ trả về - TH: tên hàm con

- KDLM: kiểu dữ liệu các phần tử trong mảng

- Dấu * chỉ địa chỉ mảng

- tm: tên mảng dữ liệu mà ta thao tác // là tham số hình thức - spt: số phần tử của mảng

#include"stdio.h" #include"conio.h" #include"alloc.h" #include"stdlib.h"

void NhapMang(int *a, int n)

{ int i;

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

a[i] = rand () % 100; }

void InMang(int *a, int k) // In mảng nguyên a có k phần tử

{ int i; // khai báo biến chạy là biến cục bộ

printf("\n"); // in dấu xuống dòng cho có phân cách for (i=0; i <k; i++)

printf ("%5d", a[i]); // in từng phần tử trên cùng 1 hàng printf("\n"); // in dấu xuống dòng

}

void main() { int n, i. *a;

printf("\n Chuong trinh sinh va in mang 1 chieu.\n"); do

{ printf("\n Nhap so phan tu >=1, n = "); scanf("%d", &n);

} while (n < 1); //randomize(); NhapMang(a, n);

printf("\nMang ngau nhien la:\n"); InMang(a, n);getch();

}

Bài 6.02. Viết chương trình con in ra màn hình ma trận (mảng 2 chiều) số

nguyên (hoặc số thực) có định dạng và Bài 6.03. Viết chương trình con sinh ngẫu nhiên giá trị mảng 1 chiều (hoặc 2 chiều) số nguyên (hoặc số thực).

#include"conio.h" #include"alloc.h" #include"stdlib.h"

void NhapMaTran(int **a, int m, int n) { int i, j;

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

a[i][j]=rand() % 100; } (adsbygoogle = window.adsbygoogle || []).push({});

void InMaTran(int **a, int m, int n) { int i, j; for(i=0;i<m;i++) { for(j=0;j<n;j++) printf("%5d", a[i][j]); printf("\n"); } } void main() { int m, n, i, j, **a;

printf("\n Chuong trinh sinh ngau nhien ma tran va in ra man hinh.\n"); do

{ printf("\n Nhap so hang >=1, m = "); scanf("%d", &m); printf("\n Nhap so cot >=1, n = "); scanf("%d", &n);

} while(n<1 || m < 1); a=(int**)malloc(m*sizeof(int*)); for(i=0;i<m;i++) a[i]=(int*)malloc(m*sizeof(int)); //randomize(); NhapMaTran(a, m, n);

printf("\n Ma tran ban dau la:\n"); InMaTran(a, m, n);

getch(); }

Bài 6.04. Viết chương trình con giải phương trình bậc nhất một ẩn số. Sau đó viết chương trình giải và biện luận phương trình bậc hai một ẩn số ax2 + bx + c = 0 có sử dụng chương trình con trên khi tham số a = 0. Các hệ số a, b, c là các số thực nhập từ bàn phím.

Hướng dẫn giải:

Chương trình con giải phương trình bậc 1 có 2 tham số được truyền vào là a và b. Cú pháp

void gptb1 (foat a, float b)

{ // các lệnh của giải phương trình bậc 1 với 1 ẩn số }

Với chương trình chính, sau khi nhập 3 tham số a, b, c thì ta kiểm tra:

Nếu a = 0 thì phương trình bậc 2 trở thành b.x + c = 0 =>> ta sẽ gọi hàm con gptb1 với 2 tham số thực sự là b và c; // Lệnh gọi hàm con: gptb1 (b, c);

Bài 6.05. Nhập từ bàn phím 10 đỉnh a1, a2, …, a10, trong đó ai = (xi, yi), i = 1… 10. Viết chương trình con tính độ dài đoạn thẳng khi biết tọa độ 2 điểm đầu mút. Dùng chương trình con này tính chu vi đa giác có 10 đỉnh theo đúng thứ tự ở trên. Xác định cặp đỉnh có khoảng cách lớn nhất.

#include"stdio.h" #include"conio.h" #include"alloc.h" #include"math.h"

float DdCanh(float x1, float y1, float x2, float y2) { return sqrt(pow(x1-x2, 2) + pow(y1-y2, 2)); }

void InMang (float *x, int n) { int i;

printf("\n");

for(i=1;i<= n; i++) printf(" %7.2f", x[i]); printf("\n");

}

void main(void) { int i, n, vt;

float *x, *y, *dd, cv;

printf("\n Chuong trinh tinh chu vi da giac n dinh lien tiep.\n"); do

{ printf("\n Nhap so dinh 0 < n < 10, n = "); scanf("%d", &n); } while(n <0||n >10); x=(float*)malloc((n+1)*sizeof(float)); y=(float*)malloc((n+1)*sizeof(float)); dd=(float*)malloc((n+1)*sizeof(float)); //randim for(i=1;i<=n;i++) { x[i]= rand() %20 - 10; y[i]= rand() %20 - 10; }

printf("\n Mang hoanh do ngau nhien la:\n"); InMang(x, n);

printf("\n Mang tung do ngau nhien la:\n"); InMang(x, n);

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

dd[i] = DdCanh(x[i], y[i], x[i+1], y[i+1]); dd[n] = DdCanh(x[1], y[1], x[n], y[n]);

InMang(dd, n); cv = 0;

for(i=1; i<=n; i++) cv += dd[i]; (adsbygoogle = window.adsbygoogle || []).push({});

printf("\n Chu vi da giac %d dinh = %7.2f \n", n, cv); vt=1;

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

if (dd[vt] < dd[i]) vt = i;

if(vt==10) printf("\n Cap dinh 1 va 10 co khoang cach lon nhat = %7.2f\n", dd[vt]);

else printf("\n Cap dinh %d va %d co khoang cach lon nhat = %7.2f\n", vt, vt+1, dd[vt]);

getch(); }

Bài 6.06. Viết chương trình con đổi giá trị 2 biến số. Dùng nó để sắp xếp dãy số

ngẫu nhiên theo chiều tăng (giảm) dần.

Bài 6.07. Viết chương trình con tìm số lớn (nhỏ) nhất trong 2 số. Dùng nó để

tìm số lớn (nhỏ) nhất trong mảng N số.

Bài 6.08. Viết chương trình con kiểm tra xem số K có là nguyên tố hay không?

Nhập vào từ bàn phím số N nguyên dương (N < 10.000). Tìm tất cả các số nguyên tố nhỏ hơn N. Ghi kết quả vào 1 mảng. Đọc từ mảng các số nguyên tố có giá trị lớn hơn Q, với Q nhập từ bàn phím.

Bài 6.09. Viết một hàm (funtion) tìm ước số chung lớn nhất (USCLN) của 2 số tự nhiên. Sau đó dùng hàm số đó để tìm ước số của N số được đưa vào từ bàn phím.

Bài 6.10. Viết chương trình con đổi 1 số từ hệ đếm A sang giá trị của hệ đếm B

(A, B bất kỳ)

Bài 6.11. Nhập từ bàn phím một ma trận n*m các số nguyên, n, m nhập từ bàn

phím và 0 < n, m < 37. Viết hàm tìm phần tử lớn nhất của một hàng trong ma trận. Giả sử n = m, hãy viết hàm tìm phần tử lớn nhất trong một hàng đồng thời là phần tử nhỏ nhất trong cột của ma trận.

Bài 6.12. Lập trình giải các bài toán sau: tháp Hà Nội; 8 quân hậu; mã đi tuần

(chú ý thử chạy với số lượng nhỏ, ví dụ tháp 5 tầng, bàn cờ có 5 x 5 ô)

Bài 6.13. Lập trình nhập vào 1 dãy số. Hãy chọn ra dãy con tăng dài nhất trong

dãy đã nhập.

Bài 6.14. Bài toán chia kẹo: Có N gói kẹo, mỗi gói có lần lượt k1, k2, k3, ..., kn cái kẹo. Không bóc các gói kẹo ra, hãy tìm cách chia số gói kẹo thành 2 phần sao cho số cái kẹo chênh nhau ít nhất.

Bài 6.15. Một đôi tất giá 1, 05 USD, một bó tất (12 đôi) giá 10, 25 USD, một

hộp tất (12 bó) giá 114 USD. Viết chương trình nhập vào số đôi tất cần mua (N) và tính ra số N1 hộp tất, N2 bó tất, N3 đôi tất sẽ mua sao cho tốn ít tiền nhất. Ví dụ: với N = 9 thì N1 = 0, N2 = 0, N3 = 9; với N = 10 thì N1 = 0, N2 = 1, N3 = 0. (đề thi Olympic tin học khối không chuyên ĐHHH 2006)

Một phần của tài liệu Hướng dẫn giải bài tập ngôn ngữ lập trình c (Trang 34 - 42)