Tuesday, August 18, 2015

[Bài tập mẫu] Mảng và Con trỏ trong C/C++

I. CÂU HỎI

a. Câu hỏi về mảng

1. Các kiểu dữ liệu nào của C có thể được dùng trong mảng?
2. Điều gì xãy ra nếu chương trình truy cập đến một phần tử có chỉ số nằm ngoài phạm vi mảng?
3. Mảng được khai báo sau đây có bao nhiêu phần tử?
int array[2][3][5][8];
Tên của phần tử thứ 10 là gì?
4.  Viết câu lệnh khai báo một mảng nguyên có 10 phần tử và khởi tạo tất cả các phần tử là 1.
5. Cho mảng sau, viết mã để khởi tạo tất cả các phần tử là 88:
int eightyeight[88];
6. Cho mảng sau, viết mã để khởi tạo tất cả các phần tử là 0:
int stuff[12][10];
7. Tìm điểm sai trong đoạn mã sau:
int x, y;
int array[10][3]; main(){
 for (x = 0; x < 3; x++) for (y = 0; y < 10; y++) array[x][y] = 0;
 return 0;
}
8. Tìm điểm sai trong đoạn mã sau:
int array[10];
int x = 1;
main(){
 for (x = 1; x <= 10; x++) array[x] = 99;
 return 0;
}
9.  Viết chương trình tạo ra các số ngẫu nhiên cho mảng a[5][4]. Hiển thị ra màn hình các giá trị của mảng theo từng cột.
10. Viết chương trình khởi tạo mảng một chiều gồm 1000 số ngẫu nhiên. Hiển thị giá trị trung bình và giá trị các phần tử mảng, và sau mỗi 10 giá trị hiển thị thì tạm dừng màn hình.
11. Viết chương trình khởi tạo mảng một chiều gồm 10 phần tử, mỗi phần tử có giá trị bằng chỉ số của nó.
12. Sửa lại chương trình ở câu 9, sau khi hiển thị các giá trị khởi tạo, chương trình sẽ sao chép các giá trị vào một mảng mới và thêm vào 10 cho mỗi giá trị. Hiển thị ra màn hình giá trị các phần tử của mảng mới.

 Câu trả lời về mảng

1. Tất cả kiểu dữ liệu của C.
2. Chương trình vẫn được dịch và chạy nhưng tạo ra kết quả không dự đoán được.
3.
2*3*5*8 =240. array[0][0][1][1]
4.
 int array[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
5.
int eightyeight[88]; int x;
for ( x = 0; x < 88; x++ )
eightyeight[x] = 88;
6. Đoạn mã như sau:
int stuff[12][10];
int sub1, sub2;
for (sub1 = 0; sub1 < 12; sub1++)
          for (sub2 = 0; sub2 < 10; sub2++)
                   stuff[sub1][sub2] = 0;
7. Mảng có kích thước 10*3 nhưng được khởi tạo như mảng kích thước 3*10. Có thể sửa lại theo một trong hai cách:
Cách 1:
int x, y;
int array[10][3];
main()
{
 for (x = 0; x < 3; x++)
  for (y = 0; y < 10; y++)
   array[y][x] = 0;
 return 0;
}
Cách 2:
int x, y;
int array[10][3]; main()
{
 for (x = 0; x < 10; x++)
  for (y = 0; y < 3; y++)
   array[x][y] = 0;
 return 0;
}
8. Chương trình này đã khởi tạo một phần tử nằm ngoài phạm vi. Ta không thể khởi tạo cho array[10] vì nó không tồn tại. Câu lệnh for nên sửa lại theo một trong những cách sau:
int array[10];
int x = 1;
main(){
 for (x = 0; x <= 9; x++) array[x] = 99;
 return 0;
}
9.
/* Using two-dimensional arrays and rand() */
#include <stdio.h>
#include <stdlib.h>
/* Declare the array */
int array[5][4];
int a, b; main()
{
 for (a = 0; a < 5; a++)
  for (b = 0; b < 4; b++)
   array[a][b] = rand();
 /* Now print the array elements */
 for (a = 0; a < 5; a++){
  for (b = 0; b < 4; b++)
   printf("%d\t", array[a][b]); printf("\n"); /* go to a new line */
 }
 return 0;
}
10.
#include <stdio.h>
#include <stdlib.h>
int random[1000];
int a, b, c;
long total = 0; main(){
 for (a = 0; a < 1000; a++){
  random[a] = rand(); total += random[a];
 }
 printf("\n\nAverage is: %ld\n", total / 1000);
 /* Now display the array elements 10 at a time */
 for (a = 0; a < 1000; a++){
  printf("\nrandom[%d] = ", a);
  printf("%d", random[a]);
  if (a % 10 == 0 && a > 0){
   printf("\nPress Enter to continue, CTRL-C to quit.");
   getchar();
  }
 }
 return 0;
} /* end of main() */
11.
Cách 1.
#include <stdio.h>
int elements[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int idx;
main(){
 for (idx = 0; idx < 10; idx++){
  printf("\nelements[%d] = %d ", idx, elements[idx]);
 }
 return 0;
} /* end of main() */
Cách 2
#include <stdio.h>
int elements[10];
int idx; main()
{
 for (idx = 0; idx < 10; idx++)
  elements[idx] = idx;
 for (idx = 0; idx < 10; idx++)
  printf("\nelements[%d] = %d ", idx, elements[idx]);
 return 0;
}
12.
#include <stdio.h>
int elements[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int new_array[10];
int idx; main()
{
 for (idx = 0; idx < 10; idx++)
  new_array[idx] = elements[idx] + 10;
 for (idx = 0; idx < 10; idx++)
  printf("\nelements[%d] = %d \tnew_array[%d] = %d", idx, elements[idx], idx, new_array[idx]);
 return 0;
}

b. Câu hỏi về con trỏ

1. Toán tử gì được dùng để xác định địa chỉ của một biến?
2. Toán tử gì được dùng để xác định giá trị ở vị trí được trỏ bởi một con trỏ? địa chỉ của một biến?
3. Con trỏ là gì?
4. Truy cập gián tiếp là gì?
5. Mảng được lưu trữ trong bộ nhớ như thế nào?
6. Chỉ ra hai cách để nhận được địa chỉ phần tử đầu tiên của mảng data[].
7. Nếu mảng được truyền đến một hàm, hai cách gì để nhận biết mảng kết thúc ở đâu?
8. Sáu toán tử gì có thể thực hiện với con trỏ?
9.  Giả sử bạn có hai con trỏ. Nếu con trỏ đầu tiên trỏ đến phần tử thứ ba trong một mảng kiểu int, con trỏ thứ hai trỏ đến phần tử thứ tư. Việc trừ con trỏ thứ hai cho con trỏ đầu cho kết quả gì?
10. Giả sử cost là một tên biến.
Làm thế nào để khai báo và khởi tạo một con trỏ có tên p_cost trỏ đến biến đó.
Làm thế nào để gán giá trị 100 cho biến cost bằng cách dùng cả truy cập trực tiếp và gián tiếp.
Làm thế nào để in giá trị của con trỏ p_cost và giá trị con trỏ p_cost trỏ đến.
11. Làm thế nào để gán địa chỉ của biến thực có tên là radius cho một viến con trỏ. 12. Hai cách để gán giá trị 100 cho phần tử thứ ba của mảng data[].
13. Viết một hàm có tên là sumarrays() có đối số là hai mảng, tính tổng giá trị cả hai mảng và trả về tổng đó. Viết chương trình minh họa.
14. Viết lệnh khai báo biến con trỏ, khai báo và khởi gán con trỏ trỏ tới biến, khai báo và khởi gán con trỏ trỏ đến con trỏ.
15. Xét khai báo
float x;
float *px = &x;
float **ppx = &px;
Để gán 100 cho biến x, ta có thể viết như sau hay không?
*ppx = 100;
16. Viết một nguyên mẫu hàm với đối là một mảng con trỏ kiểu char và trả về void. 17. Con trỏ trỏ đến hàm là gì?
18. Viết một khai báo con trỏ trỏ đến hàm trả về kiểu char và có đối là một mảng con trỏ kiểu char.
19. Khai báo sau có gì sai:
char *ptr(char *x[]);
20. Giải thích các khai báo sau:
int *var1;
int var2;
int **var3;
21. Giải thích các khai báo sau:
int a[3][12];
int(*b)[12];
int *c[12];
22. Giải thích các khai báo sau:
char *z[10];
char *y(int field);
char(*x)(int field);
23. Viết một khai báo con trỏ trỏ đến hàm có đối kiểu nguyên và trả về biến kiểu float.
24. Viết một khai báo mảng con trỏ trỏ đến hàm có đối là chuỗi ký tự và trả về số nguyên.
25. Viết lệnh khai báo mảng 10 con trỏ kiểu char.
26. Có điểm gì sai trong đoạn mã sau:
int x[3][12];
int *ptr[12];
ptr = x;

Trả lời câu hỏi về con trỏ

1. Toán tử lấy địa chỉ & .
2. Toán tử * .
3. Con trỏ là biến chứa địa chỉ của biến khác.
4.  Truy cập gián tiếp là truy cập đến nội dung của một biến bằng cách dùng con trỏ trỏ tới biến đó.
5. Các phần tử mảng được lưu trữ ở các vùng nhớ liên tiếp
6. &data[0] hoặc data
7.  Cách thứ nhất là truyền chiều dài của mảng như tham số đến hàm. Cách thứ hai là dùng một giá trị đặc biệt trong mảng, chẳng hạn NULL làm dấu hiệu kết thúc mảng.
8. Gán, truy cập gián tiếp, lấy địa chỉ, tăng, giảm và so sánh.
9.   Hiệu hai con trỏ trả về số phần tử giữa chúng. Trong trường hợp này là 1. Kích thước các phần tử mảng là không liên quan.
10.
int *p_cost;
p_cost = &cost;
Truy cập trực tiếp :cost = 100;
truy cập gián tiếp : *p_cost = 100;
printf("Pointer value: %d, points at value: %d", p_cost, *p_cost);
11.
  float *variable = &radius;
12.
data[2] = 100;
 *(data + 2) = 100;
13.
#include <stdio.h>
#define MAX1 5
#define MAX2 8
int array1[MAX1] = { 1, 2, 3, 4, 5 };
int array2[MAX2] = { 1, 2, 3, 4, 5, 6, 7, 8 }; int total;
int sumarrays(int x1[], int len_x1, int x2[], int len_x2);
main()
{
 total = sumarrays(array1, MAX1, array2, MAX2); printf("The total is %d\n", total);
 return 0;
}
int sumarrays(int x1[], int len_x1, int x2[], int len_x2)
{
 int total = 0, count = 0;
 for (count = 0; count < len_x1; count++) total += x1[count];
 for (count = 0; count < len_x2; count++) total += x2[count];
 return total;
}
14.
float x;
float *px = &x; float **ppx = &px;
15. Lệnh gán sẽ gán 100 cho px thay vì x, sửa lại như sau:
**ppx = 100;
16.
void func1(char *p[]);
17. Con trỏ đến hàm là một biến lưu giữ địa chỉ của hàm trong bộ nhớ.
18.
 char (*ptr)(char *x[]);
19. Không sai. Dòng này này là một nguyên mẫu hàm trả về con trỏ kiểu char.
20.
a. var1 là con trỏ kiểu int
b. var2 là biến nguyên.
c.var3 là con trỏ trỏ đến con trỏ kiểu int.
21.
a. a là mảng 36 (3 * 12) phần tử nguyên.
b.  b là con trỏ trỏ đến mảng 12 phần tử nguyên.
c.  c là mảng 12 con trỏ nguyên.
22.
a. z là mảng 10 con trỏ ký tự.
b.  y là hàm có đối là field kiểu int và trả về con trỏ kiểu ký tự.
c.  x là con trỏ trỏ đến hàm có đối là fied kiểu int và trả về ký tự.
23.
float (*func)(int field);
24.
 int (*menu_option[10])(char *title);
25.
 char *ptrs[10];
26. ptr được khai báo là mảng 12 con trỏ kiểu nguyên, không phải là con trỏ trỏ đến mảng 12 phần tử nguyên. Sửa lại là:
int x[3][12];
int(*ptr)[12];
ptr = x;

Câu hỏi về lớp lưu trữ biến

1.  Sự khác nhau quan trọng nhất giữa lớp lưu trữ địa phương và lớp lưu trữ ngoài là gì?
2. Vị trí của biến ảnh hưởng đến lớp lưu trữ của nó như thế nào?
3.  Khi định nghĩa một biến địa phương, hai tùy chọn gì ảnh hưởng đối với thời gian tồn tại của biến?
4.  Chương trình có thể khởi tạo các biến tĩnh và tự động khi chúng được định nghĩa. Việc khởi tạo thực hiện khi nào.?
5. Biến thanh ghi luôn luôn được đặt trong thanh ghi. Đúng hay sai?
6. Biến toàn cục không được khởi tạo chứa giá trị gì?
7. Biến địa phương không được khởi tạo chứa giá trị gì?
8.  Một hàm cần ghi nhận giá trị của biến địa phương kiểu int giữa các lần gọi thì biến nên được khai báo thế nào?
9. Viết một khai báo cho biến thanh ghi kiểu int.
10. Sửa lại chương trình sau cho khỏi bị lỗi:
/* Illustrates variable scope. */
#include <stdio.h>
void print_value(void); main()
{
	int x = 999; printf("%d\n", x); print_value(); return 0;
}
void print_value(void)
{
	printf("%d\n", x);
}
11. Viết chương trình khai báo một biến toàn cục kiểu int có tên là var. Khởi tại cho biến var một giá trị nào đó. Chương trình in giá trị của var trong một hàm nào đó (không phải hàm main()). Có cần phải truyền var như là tham số của hàm hay không?
12.  Sửa lại chương trình ở ví dụ trên, trong đó var là biến địa phương trong hàm main(). Chương trình vẫn in giá trị của var trong một hàm nào đó (không phải hàm main()). Có cần phải truyền var như là tham số của hàm hay không?
13. Trong chương trình thì biến toàn cục và biến địa phương trùng tên được không? Viết chương trình minh họa.
14. Có điểm gì sai trong đoạn mã sau:
void a_sample_function(void)
{
	int ctr1;
	for (ctr1 = 0; ctr1 < 25; ctr1++)
		printf("*");
	puts("\nThis is a sample function");
	{
		char star = '*';
		puts("\nIt has a problem\n");
		for (int ctr2 = 0; ctr2 < 25; ctr2++)
		{
			printf("%c", star);
		}
	}
}
15. Có điểm gì sai trong đoạn mã sau:
/*Count the number of even numbers between 0 and 100. */
#include <stdio.h>
main()
{
	int x = 1;
	static int tally = 0; 
	for (x = 0; x < 101; x++)
	{
		if (x % 2 == 0) /*if x is even...*/
			tally++; /*add 1 to tally.*/
	}
	printf("There are %d even numbers.\n", tally);
	return 0;
}
16. Có điểm gì sai trong đoạn mã sau:
#include <stdio.h>
void print_function(char star);
int ctr;
main()
{
	char star; print_function(star);
	return 0;
}
void print_function(char star)
{
	char dash;
	for (ctr = 0; ctr < 25; ctr++)
	{
		printf("%c%c", star, dash);
	}
}
17. Chương trình sau cho kết quả gì?
#include <stdio.h>
void print_letter2(void); /* function prototype */
int ctr;
char letter1 = 'X';
char letter2 = '=';
main()
{
	for (ctr = 0; ctr < 10; ctr++)
	{
		printf("%c", letter1); print_letter2();
	}
	return 0;
}
void print_letter2(void)
{
	for (ctr = 0; ctr < 2; ctr++) printf("%c", letter2);
}
18. Viết lại chương trình trên!

Trả lời phần lưu trữ biến

1.  Biến địa phương chỉ hiệu lực trong hàm mà nó định nghĩa. Biến ngoài tác động toàn bộ chương trình.
2.  Biến định nghĩa trong hàm là biến địa phương. Biến được định nghĩa bên ngoài mọi hàm là biến ngoài.
3.  Tự động (mặc định ) hoặc tĩnh. Biến tự động được tạo ra mỗi khi hàm được gọi và bị hủy bỏ khi hàm kết thúc. Biến tĩnh cho phép lưu giữ lại giá trị giữa các lời gọi hàm.
4. Biến tự động được khởi tạo mỗi khi hàm được gọi. Biến tĩnh được khởi tạo chỉ ở lần đầu tiên hàm được gọi.
5. Sai.
6. Biến toàn cục không được khởi tạo sẽ được tự động khởi tạo là 0.
7. Biến địa phương không được khởi tạo sẽ không được tự động khởi tạo.
8. Khai báo là biến tĩnh
9. register int x = 0;
10.
/* Illustrates variable scope. */
#include <stdio.h>
void print_value(int x); main()
{
	int x = 999; printf("%d", x);
	print_value(x);
	return 0;
}
void print_value(int x)
{
	printf("%d", x);
}
11. Vì var là biến toàn cục, không cần phải truyền nó như tham số
/* Using a global variable */
#include <stdio.h>
int var = 99;
void print_value(void); main()
{
	print_value(); return 0;
}
void print_value(void)
{
	printf("The value is %d\n", var);
}
12. Phải truyền biến var để in trong hàm khác
/* Using a local variable*/
#include <stdio.h>
void print_value(int var);
main()
{
	int var = 99; print_value(var); return 0;
}
void print_value(int var)
{
	printf("The value is %d\n", var);
}

    
    
13. Biến toàn cục và biến địa phương có thể trùng tên.
/* Using a global */
#include <stdio.h> int var = 99;
void print_func(void); main()
{
	int var = 77;
	printf("Printing in function with local and global:");
	printf("\nThe Value of var is %d", var);
	print_func(); return 0;
}
void print_func(void)
{
	printf("\nPrinting in function only global:");
	printf("\nThe value of var is %d\n", var);
}

14.
#include <stdio.h>
void a_sample_function();
main()
{
	a_sample_function();
	return 0;
}
void a_sample_function(void)
{
	int ctr1,ctr2;
	for (ctr1 = 0; ctr1 < 25; ctr1++) 
		printf("*");
	puts("\nThis is a sample function");
	{
		char star = '*';
		int ctr2; /* fix */
		puts("\nIt has a problem\n");
		for (ctr2 = 0; ctr2 < 25; ctr2++)
		{
			printf("%c", star);
		}
	}
}
15. Không có gì sai, nhưng nên sửa lại tốt hơn. 16. Không có gì sai! 17. Chương trình sẽ in vô hạn: X==X==X==X==X==X==X==X==X==X==X==X==X==X==X==X==X==... 18.
#include <stdio.h>
void print_letter2(void); main()
{
	char letter1 = 'X'; int ctr;
	for (ctr = 0; ctr < 10; ctr++)
	{
		printf("%c", letter1);
		print_letter2();
	}
	return 0;
}
void print_letter2(void)
{
	char letter2 = '=';
	int ctr; /* this is a local variable */ /* it is different from ctr in main() */
	for (ctr = 0; ctr < 2; ctr++)
		printf("%c", letter2);
}

 II. BÀI TẬP

Bài 1. Khởi tạo mảng các số ngẫu nhiên từ 0 đến 127.
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
void main(void)
{
	int a[128], i, j, x, kt;
	printf("Cac so ngau nhien tu 0 den 127\n\n");
	for (i = 0; i < 128; i++)
	{
		do
		{
			x = rand() % 128; j = 0; kt = 0;
			while ((j <= i) && !kt)
			{
				if (x == a[j]) kt = 1; else j = j + 1;
			}
		} while (kt); a[i] = x;
	}
	for (i = 0; i < 128; i++)
	{
		printf("%4d", a[i]);
		if ((i + 1) % 10 == 0)printf("\n");
	}
	getch();
}
Bài 2. Cho biết kết quả của việc thực hiện chương trình sau:
#include <stdio.h>
#include <conio.h>
void main()
{
	int ar[] = { 10, 15, 4, 25, 3, -4 }, *p, i;
	p = &ar[2];
	printf("Cac gia tri cua mang:\n\n");
	for (i = 0; i < 6; i++)
		printf("ar[%d]=%4d\n", i, ar[i]);
	printf("\nCho biet gia tri cua cac bieu thuc\n\n");
	printf("a) *(p+1)= %d\n\n", *(p + 1));
	printf("b) p[-1]= %d\n\n", p[-1]);
	printf("c) (ar-p)=%d\n\n", (ar - p));
	printf("d) ar[*p++]=%d\n\n", ar[*p++]);
	printf("e) *(ar+ar[2])=%d\n\n", *(ar + ar[2]));
	getch();
}
Bài 3. Viết chương trình sắp xếp mảng các số nguyên có kích thước không quá 100 và sắp xếp theo thứ tự tăng.
/*Sap xep noi bot*/ #include <stdlib.h>
#include <stdio.h>
#include <conio.h>
	void main()
{
	int a[100], cs[100], i, j, n, x, kt;
	do
	{
		printf("Kich thuoc cua mang N=");
		scanf("%d", &n);
		if (n > 100 || n < 0)
			printf("\n nhap lai!");
	} while (n >= 100 && n <= 0);
	for (i = 0; i < n; i++)
	{
		x = rand() % n;
		a[i] = x;
	}
	for (i = 0; i < n; i++)
		cs[i] = i;
	printf("Mang truoc khi sap xep:\n\n");
	for (i = 0; i < n; i++)
	{
		printf("%4d", a[cs[i]]);
		if ((i + 1) % 10 == 0)
			printf("\n");
	}
	for (i = 0; i < n - 1; i++)
	{
		for (j = i + 1; j<n; j++)
			if (a[cs[i]]>a[cs[j]])
			{
				x = cs[i];
				cs[i] = cs[j];
				cs[j] = x;
			}
	}
	printf("Mang sau khi sap xep:\n\n");
	for (i = 0; i < n; i++)
	{
		printf("%4d", a[cs[i]]);
		if ((i + 1) % 10 == 0)
			printf("\n");
	}
	getch();
}
Bài 4. Viết chương trình nhập một dãy n số thực bằng cách dùng biến con trỏ, cấp phát bộ nhớ cho dãy rồi sắp xếp theo thứ tự tăng dần.
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
	int n;
	printf("\n So phan tu cua day N=");
	scanf("%d", &n);
	float *x = (float*)
		malloc(n*sizeof(float));
	for (int i = 0; i < n; i++)
	{
		printf("\n X[%d]=", i);
		scanf("%f", x + i);
	}
	for (int i = 0; i < n - 1; ++i)
		for (int j = i + 1; j<n; ++j)
			if (x[i]>x[j])
			{
				float tg = x[i];
				x[i] = x[j];
				x[j] = tg;
			}
			printf("\n Day sau khi sap xep\n");
			for (i = 0; i < n; ++i)
				printf("%0.2f ", x[i]);
			getch();

}
Bài 5. Viết chương trình nhập một mảng thực cấp không quá 20x20 và tìm giá trị lớn nhất trong các phần tử của mảng.
#include <conio.h>
#include <stdio.h>
void main()
{
	float a[20][20], smax; int m, n, i, j, imax, jmax;
	puts(" Cho biet so hang va so cot cua ma tran: ");
	scanf("%d%d", &m, &n);
	for (i = 0; i < m; ++i)
		for (j = 0; j < n; ++j)
		{
			printf("\n a[%d][%d]=", i, j);
			scanf("%f", &a[i][j]);
		}
		smax = a[0][0];
		for (i = 0; i < m; ++i)
			for (j = 0; j < n; ++j)
				if (smax < a[i][j])
					smax = a[i][j];
		puts("\n\n Ma tran");
		for (i = 0; i < m; ++i)
			for (j = 0; j < n; ++j)
			{
				if (j == 0) puts("");
				printf("%6.1f", a[i][j]);
			}
			puts("\n\n Phan tu max:");
			printf("\n Co gia tri=%6.1f", smax);
			getch();

}
Bài 6. Hãy viết một hàm gọi là merge_arrays() nhận vào hai mảng một chiều đã được sắp xếp và trộn chúng thành một mảng cũng được sắp xếp. Khi thực hiện, không được chuyển hai mảng vào một mảng rồi sắp xếp lại. Hàm có tiêu đề như sau: void merge_arrays(double a[],double b[],double c[], int n, int m) ở đây, a và b là hai mảng đã sắp xếp và c là mảng chứa kết quả trộn.
#include<stdlib.h>
#include<stdio.h>
#include <conio.h>
void merge_arrays(double a[], double b[], double c[], int n, int m);
void encoder(double a[], int n); void index(double a[], int n); 
void display(double a[], int n); main()
{
	double a[100], b[100], c[200]; int n, m;
	do
	{
		printf("Kich thuoc mang A, N=");
		scanf("%d", &n); if (n > 100 || n < 0)
			printf("\n Ban phai nhap lai!");
	} while (n >= 100 && n <= 0);
	encoder(a, n);
	do
	{
		printf("Kich thuoc mang B, M=");
		scanf("%d", &m); if (m > 100 || m < 0)
			printf("\n Ban phai nhap lai!");
	} while (m >= 100 && m <= 0);
	encoder(b, m); index(a, n);
	index(b, m);
	printf("\n Mang A sau khi sap tang:\n\n");
	display(a, n);
	printf("\n Mang B sau khi sap tang:\n\n");
	display(b, m);
	merge_arrays(a, b, c, n, m); printf("\nMang sau khi tron:\n");
	display(c, n + m);
	getch();
}

void merge_arrays(double a[], double b[], double c[], int n, int m)
{
	int i = 0, j = 0, k = 0; while ((i < n) && (j < m))
	{
		if (a[i] <= b[j])
		{
			c[k] = a[i];
			i += 1;
		}
		else
		{
			c[k] = b[j];
			j += 1;
		}
		k += 1;
	}
	while (i < n)
	{
		c[k] = a[i];
		i += 1;
		k += 1;
	}
	while (j < m)
	{
		c[k] = b[j];
		j += 1;
		k += 1;
	}
}

void encoder(double a[], int n)
{
	int i;
	for (i = 0; i < n; i++)a[i] = rand();
}

void index(double a[], int n) {
	int i, j;
	double x; for (i = 0; i < n - 1; i++)
		for (j = i + 1; j<n; j++) if (a[i]>a[j])
		{
			x = a[i];
			a[i] = a[j];
			a[j] = x;
		}
}
void display(double a[], int n) {
	int i;
	for (i = 0; i < n; i++)
	{
		printf("%6.1f ", a[i]);
		if ((i + 1) % 20 == 0)printf("\n");
	}
}

                    
Bài 7. Hãy viết chương trình thực hiện các công việc sau: a) Khởi tạo mảng ngẫu nhiên. b)  Thông báo lên màn hình phần tử bé nhất và lớn nhất trong dãy. c)   Thông báo lên màn hình tổng các số âm và trung bình cộng các số dương của dãy trên d)  Nhập vào một số nguyên x. Thông báo lên màn hình số nguyên x đó có trong dãy trên hay không. e)   Kiểm tra xem dãy ở trên đã được sắp xếp tăng dần chưa, nếu chưa thì tiến hành sắp xếp dãy nó tăng dần và in dãy sau khi sắp xếp ra màn hình.
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
void encoder(int a[], int n); void index(int a[], int n);
void display(int a[], int n); void min_max(int a[], int n);
void sum(int a[], int n); void search(int a[], int n);
void test(int a[], int n); void main()
{
	int a[100]; int n;
	do {
		printf("Kich thuoc mang A, N="); scanf("%d", &n); if (n > 100 || n < 0) printf("\n Ban phai nhap lai!");
	} while (n >= 100 && n <= 0); encoder(a, n); display(a, n);
	min_max(a, n); sum(a, n); search(a, n); test(a, n);
	getch();
}
void encoder(int a[], int n)
{
	int i;
	printf("\nKhoi tao mang ngau nhien gom %d phan tu. \n", n);
	for (i = 0; i < n; i++)a[i] = rand();
}

void index(int a[], int n)
{
	int i, j, x; for (i = 0; i < n - 1; i++)
		for (j = i + 1; j<n; j++) if (a[i]>a[j])
		{
			x = a[i];
			a[i] = a[j];
			a[j] = x;
		}
}

void display(int a[], int n) {
	int i;
	for (i = 0; i < n; i++)
	{
		printf("%6d", a[i]);
		if ((i + 1) % 20 == 0)printf("\n");
	}
}
void min_max(int a[], int n)
{
	int i;
	int min = a[0], max = a[0]; for (i = 1; i < n; i++)
	{
		if (min > a[i])min = a[i];
		if (max < a[i])max = a[i];
	}
	printf("\n Gia tri lon nhat : %d\n", max);
	printf("\n Gia tri nho     : %d\n", min);
}

void sum(int a[], int n)
{
	int i, count = 0;
	double av;
	double sum1 = 0, sum2 = 0;
	for (i = 0; i < n; i++)
	{
		if (a[i] > 0){
			sum1 = sum1 + a[i]; count += 1;
		}
		if (a[i] < 0) sum2 += +a[i];
	}
	printf("\n Tong gia tri cac phan tu am : %d\n", sum2); av = sum1 / count;
	printf("\n    Trung   binh   cac   so   duong :%6.0f\n", av);
}

void search(int a[], int n)
{
	int x;
	int i = 0;
	printf("\n    NHap          gia     tri      can    tim    X       =");
	scanf("%d", &x);
	while ((i < n) && (a[i] != x))i += 1;
	if (i == n)printf("\n%d Khong co trong day \n", x);
	else printf("\n %d tim thay o chi so %d\n", x, i);
}

void test(int a[], int n)
{
	int i = 0;;
	while ((a[i] <= a[i + 1]) && (i < n - 1))i += 1; if (i != n - 1)
	{
		printf("\n Mang chua duoc sap xep, cho sap xep!\n");
		index(a, n);
	}
	printf("\n Mang sau khi sap xep tang:\n"); display(a, n);
}
Bài 8. Cho một mảng A gồm n phần tử nguyên đã được sắp xếp (tăng dần hoặc giảm dần). Nhập vào một số nguyên x, tiến hành chèn số x này vào mảng A sao cho thứ tự trong mảng không thay đổi.
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

void encoder(int a[], int n);
void index(int a[], int n);
void display(int a[], int n);
void insert(int a[], int n, int x);
void main()
{
	int a[100]; int n, x;
	do {
		printf("Kich thuoc mang A, N=");
		scanf("%d", &n);
		if (n > 100 || n < 0) printf("\n Ban phai nhap lai!");
	} while (n >= 100 && n <= 0);
	encoder(a, n);
	index(a, n);
	printf("\n Mang A sau khi sap xep:\n");
	display(a, n);
	printf("\nNhap gia tri can chen, X=");
	scanf("%d", &x);
	n += 1;
	insert(a, n, x);
	printf("\nMang sau khi chen %d:\n", x);
	display(a, n);
	getch();
}
void insert(int a[], int n, int x)
{
	int i = 0, j;
	while ((a[i] <= x) && (i < n - 1))i += 1;
	if (i != n - 1)
		for (j = n - 1; j > i; a[j--] = a[j - 1]);
	a[i] = x;
}
void encoder(int a[], int n)
{
	int i;
	for (i = 0; i < n; i++)
		a[i] = rand();
}

void index(int a[], int n)
{
	int i, j; int x;
	for (i = 0; i < n - 1; i++) for (j = i + 1; j<n; j++)
		if (a[i]>a[j])
		{
			x = a[i];
			a[i] = a[j];
			a[j] = x;
		}
}

void display(int a[], int n) {
	int i;
	for (i = 0; i < n; i++)
	{
		printf("%6d", a[i]);
		if ((i + 1) % 10 == 0)printf("\n");
	}
}
Bài 9. Cho một ma trận A cấp m x n của các số nguyên. Viết chương trình thực hiện các công việc sau : a)     Thông báo lên màn hình phần tử lớn nhất và bé nhất của ma trận A. b)    Đếm xem trong ma trận A có bao nhiêu phần tử bằng với số nguyên x được nhập từ bàn phím và thông báo vị trí của chúng b) Tiến hành sắp xếp lại ma trận A theo yêu cầu sau : -   Mỗi hàng sắp xếp tăng dần theo hàng. -   Sắp xếp giảm dần theo tổng của mỗi hàng -   In ma trận sau khi sắp xếp ra màn hình.
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
void encoder(int a[][50], int n); void index(int a[][50], int n);
void display(int a[][50], int n); void count(int a[][50], int n, int x);
void min_max(int a[][50], int n);
void main()
{
	int a[50][50]; int n, x;
	do {
		printf("Kich thuoc mang N=");
		scanf("%d", &n);
		if (n > 50 || n < 0) printf("\n Ban phai nhap lai!");
	} while (n >= 50 && n <= 0);
	encoder(a, n);
	printf("\nMang :\n\n");
	display(a, n);
	printf("\na) Tim gia tri Min va Max \n\n");
	min_max(a, n);

	printf("\nb) Dem so phan tu co gia tri = x\n");
	printf("\nNhap gia tri x = ");
	scanf("%d", &x);
	count(a, n, x);
	printf("\nc) Sap xep mang A:\n\n");
	index(a, n);
	printf("\n Mang A sau khi sap xep:\n\n");
	display(a, n);
	getch();
}

void min_max(int a[][50], int n)
{
	int min = a[0][0], max = a[0][0], i, j;
	for (i = 0; i < n; i++)
		for (j = 0; j<n; j++)
		{
			if (a[i][j]>max) max = a[i][j];
			if (a[i][j] < min) min = a[i][j];
		}
		printf("\nGia tri min :%d", min);
		printf("\nGia tri Max :%d", max);
}
void count(int a[][50], int n, int x) {
	int i, j, count = 0;
	printf("\nDanh sach cac phan tu co gia tri = %d\n", x);
	for (i = 0; i < n; i++)
		for (j = 0; j < n; j++)
			if (a[i][j] == x)
			{
				count += 1;
				printf("\nSo phan tu:%d ", count);
				printf("Hang :%3d va cot:%3d ", i + 1, j + 1);
			}
			if (count == 0)printf("\nKhong co phan tu = %d ", x);
}
void encoder(int a[][50], int n)
{
	int i, j;
	for (i = 0; i < n; i++)
		for (j = 0; j < n; j++)a[i][j] = rand();
}

void index(int a[][50], int n)
{
	int i, j, t = 1, k; while (t == 1)
	{
		t = 0;
		k = a[0][0];
		for (i = 0; i < n; i++)
			for (j = 0; j < n; j++)
			{
				if (k > a[i][j])t = 1;
				k = a[i][j];
			}
			if (t >= 1)
			{
				for (i = 0; i < n; i++)
				{
					for (j = 0; j<n - 1; j++)
						if (a[i][j]>a[i][j + 1])
						{
							k = a[i][j];
							a[i][j] = a[i][j + 1];
							a[i][j + 1] = k;
						}
						if (i<n - 1)
							if (a[i][n - 1]>a[i + 1][0])
							{
								k = a[i][n - 1];
								a[i][n - 1] = a[i + 1][0];
								a[i + 1][0] = k;
							}
				}
			}
	}
}

void display(int a[][50], int n) {
	int i, j;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
			printf("%6d", a[i][j]);
		printf("\n");
	}
}
Bài 10. Viết chương trình in tất cả phương án chia n viên bi cho m người.
#include <stdio.h>
#include <conio.h>
int a[100];
int i, j, m, n; void inkq() {
	j += 1;
	printf("\n Cach thu %d : ", j);
	for (i = 1; i <= n; i++)
		printf("%d ", a[i]);
}
void chia(int m, int n)
{
	a[n] += 1;
	if (m > 1) chia(m - 1, n);
	else
		inkq(); a[n] -= 1;
	if (n > 1) chia(m, n - 1);
}
void main()
{
	do
	{
		printf("\n Cho so bi m = ");
		scanf("%d", &m);
		printf("\n Cho so nguoi n = ");
		scanf("%d", &n);
	} while (m <= 0 || n <= 0);
	for (i = 1; i <= n; i++) a[i] = 0;
	j = 0;
	chia(m, n);
	getch();
}
Bài 11. Viết chương trình liệt kê tất cả các hoán vị của tập {1,2,...,n}
#include <stdio.h>
#include <conio.h>
#define MAX 10
int mang[MAX], n;
void swap(int *x, int *y)
{
	int tmp; tmp = *x; *x = *y; *y = tmp;
}
void hoanvi(int k)
{
	int j;
	if (k == 1)
	{
		printf("\n");
		for (j = 0; j < n; j++) printf("%d ", mang[j]);
	}
	else
		for (j = k - 1; j >= 0; j--)
		{
			swap(&mang[k - 1], &mang[j]);
			hoanvi(k - 1);
			swap(&mang[j], &mang[k - 1]);
		}
}
void main()
{
	int i;
	printf("\nCho biet so phan tu (N < 10) : ");
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		mang[i] = i;
	hoanvi(n);
	getch();
}
Bài 12. Nhập dãy số thực từ bàn phím, sắp xếp dãy theo thứ tự tăng dần và hiển thị ra màn hình.
#include <iostream>
#include <conio.h>
#include <stdio.h>
using namespace std;
void nhapds(double *a, int n)
{
	for (int i = 0; i < n; ++i)
	{
		cout << "\n Phan tu thu " << i << ":";
		cin >> a[i];
	}
}
void hv(double &x, double &y)
{
	double tam = x; x = y; y = tam;
}
void sapxep(double *a, int n)
{
	for (int i = 0; i < n - 1; ++i)
		for (int j = i + 1; j<n; ++j)
			if (a[i]>a[j])
				hv(a[i], a[j]);
}
void main()
{
	double x[100];
	int i, n;
	cout << "\n nhap so phan tu N = ";
	cin >> n;
	nhapds(x, n);
	sapxep(x, n);
	cout << "\nCac phan tu mang sau khi sap xep :";
	for (i = 0; i < n; ++i)
		printf("\n%6.2f", x[i]);
	getch();
}
Bài 13. Viết chương trình sau nhập một mảng thực kích thước không quá 20x20, in mảng đã nhập và các phần tử lớn nhất và nhỏ nhất trên mỗi hàng của mảng.
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <iomanip>
using namespace std;
void nhapmt(float a[20][20], int m, int n)
{
	for (int i = 0; i < m; ++i) for (int j = 0; j < n; ++j)
	{
		cout << "\n a[" << i << "," << j << "]=";
		cin >> a[i][j];
	}
}
void inmt(float a[20][20], int m, int n)
{
	cout << setiosflags(ios::showpoint) << setprecision(1);
	cout << "\nMang da nhap : ";
	for (int i = 0; i < m; ++i)
		for (int j = 0; j < n; ++j)
		{
			if (j == 0) cout << "\n";
			cout << setw(6) << a[i][j];
		}
}
void maxminds(float *x, int n, int &vtmax, int &vtmin)
{
	vtmax = vtmin = 0; for (int i = 1; i < n; ++i)
	{
		if (x[i] > x[vtmax]) vtmax = i;
		if (x[i] < x[vtmin]) vtmin = i;
	}
}
void main()
{
	float a[20][20]; int m, n;
	cout << "\n Nhap so hang va so cot : ";
	cin >> m >> n;
	nhapmt(a, m, n);
	inmt(a, m, n);
	float *p = (float*)a;
	int vtmax, vtmin;
	for (int i = 0; i < m; ++i)
	{
		p = ((float*)a) + i * 20;
		maxminds(p, n, vtmax, vtmin);
		printf("\n Hang %d phan tu max=%6.1f tai cot %d", i, p[vtmax], vtmax);
		printf("\n Phan tu min=%6.1f tai cot %d", p[vtmin], vtmin);
	}
	getch();
}
Bài 14. Viết chương trình sắp xếp tăng dần các phần tử của một mảng các số nguyên theo phương pháp quick sort
#include <iostream>
# include <conio.h>
using namespace std;
int a[5];
void sapxep(int l, int r); void main()
{
	int i;
	for (i = 0; i < 5; i++)
	{
		cout << "a[" << i << "]=";
		cin >> a[i];
	}
	sapxep(0, 4);
	for (i = 0; i < 5; i++)
		cout << a[i] << "\t";
	getch();
}
void   sapxep(int l, int r)
{
	int i, j, x, y; i = l; j = r; x = a[(l + r) / 2];
	do
	{
		while (a[i] < x) i = i + 1;
		while (x < a[j]) j = j - 1;
		if (i <= j)
		{
			y = a[i];
			a[i] = a[j];
			a[j] = y;
			i++; j--;
		}
	} while (i <= j);
	if (l < j) sapxep(l, j);
	if (i < r) sapxep(i, r);
}
Bài 15. Viết chương trình tính tổng theo hàng của ma trận cấp 3x5.
#include <iostream>
#include <conio.h>
using namespace std;
void tongh(int a[][5], int m, int n, int *th);
void main()
{
	int b[3][5]; int h[3]; int x;
	int i, j, m, n;
	cout << "\n nhap m va n : ";
	cin >> m >> n;
	for (i = 0; i < m; ++i)
		for (j = 0; j < n; ++j)
		{
			cout << "\n b[" << i << j << "]=";
			cin >> b[i][j];
		}
		tongh(b, m, n, h); for (i = 0; i < m; ++i)
			cout << "\n tong hang " << i << " " << h[i];
		getch();
}
void tongh(int a[][5], int m, int n, int *th) {
	int i, j;
	for (i = 0; i < m; ++i) {
		th[i] = 0;
		for (j = 0; j < n; ++j) th[i] += a[i][j];
	}
}
Bài 16. Cho biết kết quả việc thực hiện chương trình sau:
#include <iostream>
#include <conio.h>
using namespace std;
void main()
{
	int x = 10;
        int *px;
	px = &x; //con tro px tro toi bien x
	cout<<"\ndia chi cua bien x la :"<<&x;
	cout<<"\ndia chi cua con tro px la :"<<&px;
	cout<<"\nnoi dung cua bien x la :"<<x; //10
	cout << "\nnoi dung cua px (chua dia chi bien x) la :" << px;
	cout << "\nGia tri ma px tro den :" << *px; //10 getch();
}
Bài 17. Cho biết kết quả việc thực hiện chương trình sau:
#include <iostream>
#include <conio.h>
using namespace std;
void main()
{
	int k, a[10], *p, *q;
	for (k = 0; k < 10; k++)
		a[k] = 3 * k + 5;
	p = a; //p tro toi a
	q = p; //q tro toi vung ma p tro toi, tuc la tung phan tu mang a
	for (k = 0; k < 3; k++)
		cout << *(q + k) << ' '; //5 8 11
	p = q + 2; //huong p toi vung co dia chi q tro toi cong them 2 - pt thu 3 la 11
	cout << "\n";
	for (k = 0; k < 3; k++)
		cout << *(p + k) << ' '; // 11 14 17
	getch();
}
Bài 18. Cho biết kết quả của việc thực hiện chương trình sau:
#include <stdio.h>
#include <conio.h>
void next();
extern int a = 1, b = 2, c = 3; /* khai bao bien ngoai */
main()
{
	printf("\nGia tri a = %d b = %d va c = %d ", a, b, c); next();
	getch();
}
void next()
{
	printf("\nGia tri a = %d b = %d va c = %d  ", a, b, c);
}
/*ket qua in ra : Gia tri a=1 b=2 va c=3 Gia tri a=1 b=2 va c=3 */
Bài 19. Cho biết kết quả của việc thực hiện chương trình sau đây:
#include <stdio.h>
#include <conio.h>
void func(int i, int j, int k);
int a = 2, b = 4, c = 'D';
main()
{
	printf("\nTrong ham main : a = %d, b = %d, c = %d", a, b, c);
	func(a, b, c);
	printf("\nSau lan goi ham thu nhat : a = %d, b = %d, c = %d", a, b, c);
	func(a, b, c);
	printf("\nSau lan goi ham thu hai : a = %d, b = %d, c = %d", a, b, c);
	getch();
	return 0;
}
void func(int i, int j, int k)
{
	static int x;
	a = a + 2;
	i *= 3 + x; j = i * x++; k = (i + j) % 2;
	printf("\nTrong ham : a = %d, b = %d, c = %d", i, j, k);
}
Bài 20. Giải thích cách thức hoạt động của con trỏ hàm trong chương trình sau đây:
#include <stdio.h>
#include <conio.h>
#include <iostream>
void nhap(int &x, int &y);
void bp(int &x, int &y);
void lp(int &x, int &y);
void hv(int &x, int &y);
void hienthi(int a, int b);
void main()
{
	void(*pf)(int &, int &);
	bool thoat = false;
	int a = 2, b = 4;
	int chon;
	while (thoat == false)
	{
		printf("\n (0) Thoat (1)Nhap (2)Binh phuong (3)Lap phuong (4)Hoan vi \n");
		scanf("%d", &chon);
		switch (chon)
		{
		case 1: pf = nhap; break;
		case 2: pf = bp; break;
		case 3: pf = lp; break;
		case 4: pf = hv; break;
		default: thoat = true; break;
		}
		if (thoat) break;
		hienthi(a, b);
		pf(a, b);
		hienthi(a, b);
	}
	getch();
}
void hienthi(int x, int y)
{
	printf("\n a = %d, b = %d \n", x, y);
}
void bp(int &x, int &y)
{
	x *= x; y *= y;
}
void lp(int &x, int &y)
{
	x = x*x*x; y = y*y*y;
}
void hv(int &x, int &y)
{
	int tam = x;
	x = y;
	y = tam;
}
void nhap(int &x, int &y)
{
	printf("\n Nhap gia tri moi cua a : ");
	scanf("%d", &x);
	printf("\n Nhap gia tri moi cua b : ");
	scanf("%d", &y);
}

/*Trả lời: Chương trình định nghĩa 4 hàm tính bình phương, lũy thừa ba, nhập liệu.
Các hàm này có cùng kiểu trả về là void và có cùng số tham số là hai tham chiếu tới số nguyên int.
Trong hàm main khai báo một con trỏ hàm pf trỏ tới một hàm có kiểu trả về là void và có hai tham số
là hai tham chiếu tới số nguyên int. Chương trình yêu cầu người sử dụng chọn một trong 5 số, 
tùy theo số nhập vào mà con trỏ hàm pf gọi thực hiện hàm thích hợp.*/
Bài 21. Viết lại chương trình trên nhưng không sử dụng con trỏ hàm.
#include <stdio.h>
#include <conio.h>
#include <iostream>
void nhap(int &x, int &y);
void bp(int &x, int &y);
void lp(int &x, int &y);
void hv(int &x, int &y);
void hienthi(int a, int b);
void main()
{
	bool thoat = false; int a = 2, b = 4;
	int chon;
	while (thoat == false)
	{
		printf("\n (0) Thoat (1)Nhap (2)Binh phuong (3)Lap phuong (4)Hoan vi \n");
		scanf("%d", &chon); switch (chon)
		{
		case 1: hienthi(a, b); nhap(a, b); hienthi(a, b); break;
		case 2: hienthi(a, b); bp(a, b); hienthi(a, b); break;
		case 3: hienthi(a, b); lp(a, b); hienthi(a, b); break;
		case 4: hienthi(a, b); hv(a, b); hienthi(a, b); break;
		default: thoat = true; break;
		}
		if (thoat) break;
	}
	getch();
}
void hienthi(int x, int y)
{
	printf("\n a = %d, b = %d \n", x, y);
}
void bp(int &x, int &y)
{
	x *= x; y *= y;
}
void lp(int &x, int &y)
{
	x = x*x*x; y = y*y*y;
}

void hv(int &x, int &y)
{
	int tam = x;
	x = y;
	y = tam;
}
void nhap(int &x, int &y)
{
	printf("\n Nhap gia tri moi cua a : "); scanf("%d", &x);
	printf("\n Nhap gia tri moi cua b : "); scanf("%d", &y);
}
Bài 22. Giải thích cách thức hoạt động của mảng con trỏ hàm trong chương trình sau đây:
#include <stdio.h>
#include <conio.h>
#include <iostream>
void nhap(long &x, long &y);
void bp(long &x, long &y);
void lp(long &x, long &y);
void hv(long &x, long &y);
void hienthi(long a, long b);
void main()
{
	const int max = 5;
	void(*pfa[max])(long &, long &);
	long a = 1, b = 2; int chon;
	for (int i = 0; i<max; i++)
	{
		printf("\n (1)Nhap (2)Binh phuong (3)Lap phuong (4)Hoan vi \n");
		scanf("%d", &chon); switch (chon)
		{
		case 1: pfa[i] = nhap; break;
		case 2: pfa[i] = bp; break;
		case 3: pfa[i] = lp; break;
		case 4: pfa[i] = hv; break;
		default:pfa[i] = 0;
		}
	}
	for (int i = 0; i<max; i++)
	{
		pfa[i](a, b);
		hienthi(a, b);
	}
	getch();
}
void hienthi(long x, long y)
{
	printf("\n a = %ld, b = %ld \n", x, y);
}

void bp(long &x, long &y)
{
	x *= x; y *= y;
}

void lp(long &x, long &y)
{
	x = x*x*x; y = y*y*y;
}

void hv(long &x, long &y)
{
	long tam = x;
	x = y;
	y = tam;
}

void nhap(long &x, long &y)
{
	printf("\n Nhap gia tri moi cua a : "); scanf("%ld", &x);
	printf("\n Nhap gia tri moi cua b : "); scanf("%ld", &y);
}
Bài 23. Giải thích cách thức hoạt động của tham số hàm là con trỏ hàm trong chương trình sau đây:
#include <stdio.h>
#include <conio.h>
#include <iostream>
void nhap(int &x, int &y);
void bp(int &x, int &y);
void lp(int &x, int &y);
void hv(int &x, int &y);

void hienthi(void(*)(int &, int &), int &, int &);
void main()
{
	void(*pf)(int &, int &); bool thoat = false;
	int a = 2, b = 4; int chon;
	while (thoat == false)
	{
		printf("\n (0) Thoat (1)Nhap (2)Binh phuong (3)Lap phuong (4)Hoan vi \n");
		scanf("%d", &chon); switch (chon)
		{
		case 1: pf = nhap; break;
		case 2: pf = bp; break;
		case 3: pf = lp; break; 
		case 4: pf = hv; break;
		default: thoat = true; break;
		}
		if (thoat) break;
		hienthi(pf, a, b);
	}
	getch();
}
void hienthi(void(*pf)(int &, int &), int &x, int &y)
{
	printf("\n a = %d, b = %d \n", x, y); pf(x, y);
	printf("\n a = %d, b = %d \n", x, y);
}
void bp(int &x, int &y)
{
	x *= x; y *= y;
}
void lp(int &x, int &y)
{
	x = x*x*x; y = y*y*y;
}
void hv(int &x, int &y)
{
	int tam = x;
	x = y;
	y = tam;
}
void nhap(int &x, int &y)
{
	printf("\n Nhap gia tri moi cua a : ");
	scanf("%d", &x);
	printf("\n Nhap gia tri moi cua b : ");
	scanf("%d", &y);
}
Bài 24. Viết chương trình có sử dụng hàm với tham số là con trỏ hàm để tính max (x2, y2). Hàm tính max này được khai báo nguyên mẫu như sau:
#include <stdio.h>
#include <conio.h>
float bp(float x);
float lp(float x);
float lonnhat(float(*f)(float), float(*g)(float), float x);
float lonnhat(float (*f)(float),float (*g)(float),float x);
void main()
{
	float x, t;
	printf("\n Nhap x="); scanf("%f", &x);
	printf("\n %.2f binh phuong = %.2f", x, bp(x));
	printf("\n %.2f lap phuong = %.2f", x, lp(x));
	t = lonnhat(bp, lp, x);
	printf("\n Max la : %.2f", t);
	getch();
}
float lonnhat(float(*f)(float), float(*g)(float), float x)
{
	return (((*f)(x)>(*g)(x)) ? (*f)(x) : (*g)(x));
}
float bp(float x)
{
	return (x*x);
}
float lp(float x)
{
	return (x*x*x);
}

Cám ơn bạn đã đọc bài viết này. Hãy chia sẻ bài viết và bình luận ý kiến của bạn ở bên dưới.

Share this

Chào mừng bạn đến với SimpleCodeCJava Blog - Mục đích của chúng tôi khi thành lập blog này là muốn chia sẻ những kiến thức và kinh nghiệm lập trình mà chúng tôi đã học được với mong muốn giúp đỡ mọi người, giúp bạn rút ngắn được thời gian tìm hiểu cũng như việc giải quyết những vấn đề trong lập trình C và Java.

0 Comment to "[Bài tập mẫu] Mảng và Con trỏ trong C/C++ "