Bài tập C++ có lời giải (code mẫu)

Code C++ có rất nhiều điều bạn cần học và nên thực hành chăm chỉ. Những bài tập C++ kèm đáp án dưới đây sẽ giúp bạn sử dụng ngôn ngữ lập trình này dễ dàng hơn.

Dù code và cú pháp cơ bản ở ngôn ngữ lập trình C và C++ giống nhau. Tuy nhiên, là một ngôn ngữ lập trình ở cấp độ trung, C++ có lợi thế trong việc lập trình các ứng dụng cấp thấp và cấp cao hơn.

Điểm nổi bật của các chương trình C++

  • C++ là một ngôn ngữ đơn giản. Các chương trình được chia thành những đơn vị và các phần logic. Nó cũng hỗ trợ thư viện phong phú cùng nhiều kiểu dữ liệu khác nhau.
  • C++ không phải nền tảng độc lập như các chương trình được tạo trên Linux mà có thể không chạy trên windows.
  • Với ngôn ngữ C++, bạn có thể phát triển các ứng dụng quy mô lớn cũng như lập trình hệ thống.
  • Nó có sẵn một thư viện thuật toán cấu trúc dữ liệu, bao gồm cả thư viện bên thứ ba để phát triển ứng dụng thật nhanh.
  • Trong C++, không có chi phí xử lý bổ sung như thu gom rác, nhập dữ liệu linh động…
  • Hỗ trợ con trỏ để người dùng có thể trực tiếp thao tác trên địa chỉ lưu trữ.

Bên cạnh các bài tập Python, Java, Quản Trị Mạng cũng tổng hợp cho các bạn một số bài tập C++ cơ bản để luyện tập thêm trong quá trình học ngôn ngữ lập trình C++.

Danh mục bài tập C++ này được chia thành 9 phần, mỗi phần có từ 3 đến 5 bài, với cấp độ khó tăng dần. Ban đầu bạn sẽ "khởi động" với những bài tập C++ hết sức cơ bản, như mô phỏng phép nhân tay, in số tiền, kiểm tra một bộ 3 số xem có phải là cạnh của một tam giác không, tính chu vi, diện tích tam giác đó.

Dần dần sẽ là những bài khó hơn như tạo và quản lý danh sách sinh viên, tài liệu, in hoặc thực hiện các công việc khác theo yêu cầu cùa đề bài. Thậm chí là vẽ cả đồ thị của hàm lượng giác.

Danh mục bài tập C++

Bài tập C++ số 1

Câu 1: Mô phỏng phép nhân tay

Lập trình in ra màn hình mô phỏng phép nhân tay 2 số nguyên dương có 3 chữ số nhập từ bàn phím. Ví dụ với 2 số nhập vào là 763 và 589 thì phải in ra màn hình như sau:

Bài tập C++ số 1

Code mẫu:

#include<stdio.h>
#include<conio.h>
void
main ()
{
  int a, b;
  char dv, chuc, tram;
  clrscr ();
  printf ("Nhap so bi nhan co 3 chu so a=");
  scanf ("%d", &a);
  printf ("Nhap so nhan co 3 chu so b=");
  scanf ("%d", &b);
  dv = b % 10;
  chuc = b % 100 / 10;
  tram = b / 100;
  printf ("\nMo phong phep nhan tay\n\n");
  printf ("%20d\n", a);
  printf ("%15c%5d\n", 'x', b);
  printf ("%20s\n", "-------");
  printf ("%20d\n", a * dv);
  printf ("%19d\n", a * chuc);
  printf ("%18d\n", a * tram);
  printf ("%20s\n", "-------");
  printf ("%20ld\n", long (a) * b);
  getch ();

}

Câu 2: Nhập số tiền, in số tờ, mệnh giá

Một người cần rút một số tiền T từ ngân hàng và muốn tổng số tờ ít nhất. Cho biết có các loại tiền mệnh giá 100, 20, 5 và 1. Nhập từ bàn phím số tiền T và in ra số tờ mỗi loại mệnh giá và tổng số tờ nhận được.

Code mẫu:

#include <stdio.h>
#include <conio.h>
void
main ()
{
  int t, t100, t20, t5;
  clrscr ();
  printf ("Nhap so tien t=");
  scanf ("%d", &t);
  t100 = t / 100;
  t -= 100 * t100;
  t20 = t / 20;
  t -= 20 * t20;
  t5 = t / 5;
  t -= 5 * t5;
  printf ("So to cac loai menh gia la :\n");
  printf ("Loai 100 : %d to\n", t100);
  printf ("Loai 20 : %d to\n", t20);
  printf ("Loai 5 : %d to\n", t5);
  printf ("Loai 1 : %d to\n", t);
  printf ("Tong so to cac loai la : %d\n", t + t5 + t20 + t100);
  getch ();
}

Câu 3: Đổi số sang số La Mã

Hãy lập trình nhập 1 số nguyên dương nhỏ hơn 1000 và đổi sang số La mã tương ứng, in kết quả ra màn hình.

Code mẫu:

#include <conio.h>
#include <iostream.h>

void
main()
{
	int n, dv, ch, tr;
	clrscr();
	cout << "Nhap so nguyen duong < 1000 :\n";
	cin >> n;
	cout << "So " << n << " doi sang so La ma la :\n";
	tr = n / 100;
	n = n % 100;
	ch = n / 10;
	dv = n % 10;

	switch (tr)
	{
		case 1:
			cout << "C";
			break;
		case 2:
			cout << "CC";
			break;
		case 3:
			cout << "CCC";
			break;
		case 4:
			cout << "CD";
			break;
		case 5:
			cout << "D";
			break;
		case 6:
			cout << "DC";
			break;
		case 7:
			cout << "DCC";
			break;
		case 8:
			cout << "DCCC";
			break;
		case 9:
			cout << "CM";
	}

	switch (ch)
	{
		case 1:
			cout << "X";
			break;
		case 2:
			cout << "XX";
			break;
		case 3:
			cout << "XXX";
			break;
		case 4:
			cout << "XL";
			break;
		case 5:
			cout << "L";
			break;
		case 6:
			cout << "LX";
			break;
		case 7:
			cout << "LXX";
			break;
		case 8:
			cout << "LXXX";
			break;
		case 9:
			cout << "XC";
	}

	switch (dv)
	{
		case 1:
			cout << "I";
			break;
		case 2:
			cout << "II";
			break;
		case 3:
			cout << "III";
			break;
		case 4:
			cout << "IV";
			break;
		case 5:
			cout << "V";
			break;
		case 6:
			cout << "VI";
			break;
		case 7:
			cout << "VII";
			break;
		case 8:
			cout << "VIII";
			break;
		case 9:
			cout << "IX";
	}
	getch();
}

Câu 4: In cách đọc số

In ra màn hình cách đọc một số nguyên dương nhỏ hơn 1000000. Ví dụ số 726503 đọc là: bảy mươi hai vạn sáu ngàn năm trăm linh ba.

Code mẫu:

#include <iostream.h>
#include <conio.h>

void main()
{
	char doc[9][5] = { "mot", "hai", "ba", "bon", "nam", "sau", "bay", "tam", "chin" };
	int van, ngan, tram, chuc, donvi, chv, dv;
	long so;
	clrscr();

	cout << "Nhap so nguyen duong < 1000000 can doc = ";
	cin >> so;
	cout << "Cach doc so " << so << " la:\n";

	van = so / 10000;
	ngan = so / 1000 % 10;
	tram = so / 100 % 10;
	chuc = so / 10 % 10;
	donvi = so % 10;

	if (van)
	{
		chv = van / 10;
		dv = van % 10;
		if (chv == 1)
			cout << "muoi ";
		else if (chv > 1)
			cout << doc[chv - 1] << " muoi ";
		if (dv)
			cout << doc[dv - 1];
		cout << " van ";
	}

	if ((ngan == 0) && van)
		cout << " khong ngan ";
	else if (ngan)
		cout << doc[ngan - 1] << " ngan ";

	if ((tram == 0) && (van || ngan))
		cout << " khong tram ";
	else if (tram)
		cout << doc[tram - 1] << " tram ";

	if ((chuc == 0) && donvi && (van || ngan || tram))
		cout << "le ";
	else if (chuc == 1)
		cout << " muoi ";
	else
		cout << doc[chuc - 1] << " muoi ";
	if (donvi)
		cout << doc[donvi - 1];
	getch();
}

Câu 5: Giải phương trình bậc hai

Lập trình giải phương trình ax2 + bx + c = 0, các hệ số thực a, b, c nhập từ bàn phím.

Code mẫu:

#include <stdio.h>
#include <conio.h>
#include <math.h>

void main()
{
	float a, b, c, d;
	clrscr();
	printf("Nhap cac he so a, b, c : ");
	scanf("%f%f%f", &a, &b, &c);
	if (a)
	{
		d = b *b - 4 *a * c;
		if (d < 0) printf("Vo nghiem !");
		if (d == 0) printf("Nghiem kep x=%4.2f", -0.5 *b / a);
		if (d > 0)
		{
			printf("Hai nghiem phan biet :\n");
			printf("x1=%4.2f", 0.5 *(-b - sqrt(d)) / a);
			printf(" x2=%4.2f", 0.5 *(-b + sqrt(d)) / a);
		}
	}
	else if (b) printf("Mot nghiem x=%4.2f", -c / b);
	else if (c) printf("Vo nghiem !");
	else printf("Vo so nghiem !");
	getch();
}

Bài tập C++ số 2

Câu 1: Kiểm tra 3 số có phải cạnh tam giác không, nếu có là loại tam giác nào, tính chu vi, diện tích

Nhập 3 số thực a, b, c và kiểm tra 3 số đó có phải là 3 cạnh của 1 tam giác không? Nếu là 3 cạnh tam giác thì cho biết là tam giác nào trong các loại tam giác sau: đều, vuông cân, vuông, cân, thường và tính chu vi, diện tích của tam giác đó. In kết quả ra màn hình.

Code mẫu:

#include <stdio.h>
#include <conio.h>
#include <math.h>

void main()

{
	float a, b, c, p, s;
	int deu, vuong, can;
	clrscr();
	printf("Nhap cac so thuc a, b, c : ");
	scanf("%f%f%f", &a, &b, &c);

	if (a + b > c && a + c > b && b + c > a)
	{
		printf("La ba canh mot tam giac ");
		deu = (a == b) && (b == c);
		vuong = (a *a + b *b == c *c) || (a *a + c *c == b *b) || (b *b + c *c == a *a);
		can = (a == b) || (a == c) || (b == c);

		if (deu) printf(" deu\n");
		else if (vuong && can) printf(" vuong can\n");
		else if (vuong) printf(" vuong\n");
		else if (can) printf(" can\n");
		else printf(" thuong\n");
		p = (a + b + c) / 2;
		printf("Chu vi = %4.2f, Dien tich = %4.2f", 2 *p, sqrt(p *(p - a) *(p - b) *(p - c)));
	}
	else printf("Khong phai la ba canh mot tam giac\n");
	getch();
}

Câu 2: Tính số năm cần gửi tiết kiệm

Một người cần có một số tiền T, tích lũy bằng cách gửi tiết kiệm số tiền ban đầu là S với lãi suất có kỳ hạn theo năm là P% theo phương thức lũy tiến (lãi của mỗi năm được cộng vào với tiền gốc). Hãy nhập vào các số thực T, S, P và xác định số năm cần gửi tiết kiệm.

Code mẫu:

#include <stdio.h>
#include <conio.h>

void main()

{
	float s, t, p;
	int n;
	clrscr();

	printf("Nhap so tien ban dau : ");
	scanf("%f", &s);
	printf("Nhap so tien can co : ");
	scanf("%f", &t);
	printf("Nhap lai suat %% nam : ");
	scanf("%f", &p);

	for (p = 0.01 *p, n = 0; s < t; s += s *p, n++);
	printf("So nam can gui tiet kiem = %d\n", n);
	printf("Sau %d nam gui tiet kiem, so tien co la : %4.2f", n, s);

	getch();
}

Câu 3: In số PI tính được với sai số cho trước

Lập trình tính số PI với sai số eps cho trước nhập từ bàn phím. Biết rằng số PI tính theo công thức: PI = 4 - 4/3 + 4/5 - 4/7 +... tính tổng các số hạng có giá trị không nhỏ hơn eps. In ra số PI tính được và số PI của Turbo C++ với 10 chữ số thập phân để so sánh.

Code mẫu:

#include <stdio.h>
#include <conio.h>
#include <math.h>;//chua hang so pi la M_PI

void main()
{
	float pi, t, n, eps, dau;
	clrscr();
	printf("Nhap sai so eps=");
	scanf("%f", &eps);

	pi = 0;
	t = 4;
	n = dau = 1;

	do
	{
		pi += dau * t;
		n = n + 2;
		dau = -dau;
		t = 4 / n;
	} while (t >= eps);
	printf("\nSo PI tinh duoc voi sai so %12.10f, PI=%12.10f\n", eps, pi);
	printf("\nSo PI cua Turbo C++, PI=%12.10f\n", M_PI);
	getch();
}

Câu 4: Tìm và in số hoàn hảo

Tìm và in ra màn hình tất cả các số hoàn hảo không vượt quá số n cho trước nhập từ bàn phím. Số hoàn hảo là số bằng tổng các ước số của nó không kể ước số là chính số đó. Ví dụ số 6 là số hoàn hảo vì 6=1+2+3.

Code mẫu:

#include <stdio.h>
#include <conio.h>

void main()
{
	int n, i, j, s, ts;
	clrscr();
	printf("Nhap n=");
	scanf("%d", &n);
	printf("Cac so hoan hao khong vuot qua %d la :", n);

	for (ts = 0, i = 2; i <= n; i++)
	{
		s = 1;
		for (j = 2; j <= i / 2; j++)
			if (i % j == 0) s += j;
		if (s == i)
		{
			ts++;
			printf("\n %d = 1", i);
			for (j = 2; j <= i / 2; j++)
				if (i % j == 0) printf(" + %d", j);
		}
	}

	if (ts) printf("\nCo tat ca %d so hoan hao", ts);
	else printf("\nKhong co so hoan hao nao");
	getch();
}

Câu 5: Tìm và in các số nguyên tố nhỏ hơn n

Tìm và in ra màn hình tất cả các số nguyên tố không vượt quá số n cho trước nhập từ bàn phím. Số nguyên tố là số chỉ có ước số là 1 và chính số đó.

Code mẫu:

#include <stdio.h>
#include <conio.h>

void main()
{
	int n, i, j, d;
	clrscr();
	printf("Nhap gia tri N : ");
	scanf("%d", &n);
	printf("Cac so nguyen to khong vuot qua %d la :\n", n);

	for (d = 0, i = 2; i <= n; i++)
	{
		for (j = 2; j <= i / 2; j++)
			if (i % j == 0) break;
		if (j == i / 2 + 1)
		{
			d++;
			printf(" %d", i);
		}
	}
	printf("\nTong so co %d so nguyen to", d);
	getch();
}

Bài tập C++ số 3

Câu 1: Kiểm tra số chính phương

Viết 1 hàm kiểm tra 1 số có là chính phương hay không (số chính phương là số bằng bình phương của một số nguyên nào đó); một hàm kiểm tra 1 số có phải là số Pitago hay không (số Pitago là số chính phương và bằng tổng 2 số chính phương khác). Trong hàm main nhập số nguyên dương và sử dụng các hàm trên kiểm tra có là số chính phương? số Pitago?

Code mẫu:

#include <stdio.h>
#include <conio.h>
#include <math.h>

int socp(int);
int soptg(int);

void main()

{
	clrscr();
	int n;
	printf("Nhap so nguyen duong n=");
	scanf("%d", &n);
	if (socp(n)) printf("\n%d la so chinh phuong", n);
	else printf("\n%d khong phai so chinh phuong", n);
	if (soptg(n)) printf("\n%d la so Pitago", n);
	else printf("\n%d khong phai so Pitago", n);
	getch();
}

int socp(int n)
{
	int t = sqrt(n);
	if (n == t *t) return 1;
	else return 0;
}

int soptg(int n)
{
	int i;
	if (!socp(n)) return 0;
	else
	{
		for (i = 1; i < n; i++)
			if (socp(i) && socp(n - i)) break;
		if (i < n) return 1;
		else return 0;
	}
}

Câu 2: Giải bất phương trình bậc nhất

Lập trình giải bất phương trình ax+b>0 theo yêu cầu: Viết 1 hàm nhập các hệ số a, b; một hàm giải bất phương trình. Hàm main sử dụng các hàm đã viết và có thể chạy nhiều lần giải các bất phương trình khác nhau.

Code mẫu:

#include <conio.h>
#include <stdio.h>
#include <iostream.h>

void nhap(float &, float &);
void giaibpt(float, float);
void main()

{
	float a, b;
	char c;
	do {
		clrscr();
		nhap(a, b);
		giaibpt(a, b);
		fflush(stdin);
		cout << "\nTiep tuc ? (c/k):";
		cin >> c;
	} while ((c == 'c') || (c == 'C'));
}

void nhap(float &a, float &b)
{
	cout << "Nhap cac he so a, b :";
	cin >> a >> b;
}

void giaibpt(float a, float b)
{
	if (a > 0) cout << "Nghiem x>" << -b / a;
	else if (a < 0) cout << "Nghiem x<" << -b / a;
	else if (b > 0) cout << "Vo so nghiem";
	else cout << "Vo nghiem";
}

Câu 3: Viết hàm đệ quy tìm ước chung lớn nhất

Viết hàm đệ quy tìm ước số chung lớn nhất của 2 số tự nhiên; một hàm tìm bội số chung nhỏ nhất của 2 số tự nhiên. Hàm main sử dụng các hàm đã viết và có thể chạy nhiều lần để tìm ước số chung lớn nhất và bội số chung nhỏ nhất của các cặp số nguyên dương khác nhau. Yêu cầu kiểm tra dữ liệu nhập vào phải là các số nguyên dương.

Code mẫu:

#include <conio.h>
#include <stdio.h>
#include <iostream.h>

int usc(int, int);
int bsc(int, int);
void main()

{
	int a, b, d, p;
	char c;
	do {
		clrscr();
		do { 	cout << "Nhap 2 so nguyen duong a, b : ";
			cin >> a >> b;
		} while ((a <= 0) || (b <= 0));
		d = usc(a, b);
		p = bsc(a, b);
		cout << "USCLN(" << a << "," << b << ")=" << d;
		cout << "\nBSCNN(" << a << "," << b << ")=" << p;
		fflush(stdin);
		cout << "\nTiep tuc ? (c/k):";
		cin >> c;
	} while ((c == 'c') || (c == 'C'));
}

int usc(int a, int b)
{
	if (a *b == 0) return a + b;
	else if (a > b) return usc(a - b, b);
	else return usc(a, b - a);
}

int bsc(int a, int b)
{
	return a *b / usc(a, b);
}

Câu 4: Tính giai thừa cách của số nguyên dương n

Viết hàm đệ quy tính giai thừa cách của số nguyên dương n. Hàm main sử dụng hàm này và có thể chạy nhiều lần để tính cho nhiều số n khác nhau nhập từ bàn phím. Yêu cầu kiểm tra dữ liệu nhập vào phải là số nguyên dương. Công thức tính giai thừa cách của n: n!=1.3...n nếu n lẻ và n!=2.4...n nếu n chẵn.

Code mẫu:

#include <conio.h>
#include <stdio.h>
#include <iostream.h>

long gtc(long);
void main()
{
	long n;
	char c;
	do {
		clrscr();
		do { 	cout << "Nhap so nguyen duong n : ";
			cin >> n;
		} while (n < 1);
		cout << n << "!!=" << gtc(n);
		fflush(stdin);
		cout << "\nTiep tuc ? (c/k):";
		cin >> c;
	} while ((c == 'c') || (c == 'C'));
}

long gtc(long n)
{
	if ((n == 0) || (n == 1)) return 1;
	else return n* gtc(n - 2);
}

Câu 5: Viết hàm đệ quy giải bài toán tháp Hà Nội

Viết hàm đệ quy giải bài toán tháp Hà Nội: Cần chuyển n tầng tháp từ vị trí A sang vị trí B dùng vị trí C làm trung gian. Yêu cầu: Mỗi lần chỉ chuyển 1 tầng, chỉ được dùng các vị trí A, B, C để đặt các tầng tháp, không được đặt tầng lớn lên trên tầng nhỏ. Hàm main sử dụng hàm này và có thể chạy nhiều lần để tính cho nhiều số n khác nhau nhập từ bàn phím.

Code mẫu:

#include <conio.h>
#include <stdio.h>
#include <iostream.h>

int d;
void chuyen(int, char, char, char);
void main()
{
	int n;
	char c;
	do {
		clrscr();
		d = 0;
		do { 	cout << "Nhap so tang thap ( < 10), n=";
			cin >> n;
		} while ((n < 1) || (n > 9));
		chuyen(n, 'A', 'B', 'C');
		cout << "\nTong so lan chuyen=" << d;
		fflush(stdin);
		cout << "\nTiep tuc ? (c/k):";
		cin >> c;
	} while ((c == 'c') || (c == 'C'));
}

void chuyen(int n, char a, char b, char c)
{
	if (n == 1) cout << "\nLan chuyen " << ++d << " : Tu " << a << " sang " << b;
	else
	{
		chuyen(n - 1, a, c, b);
		chuyen(1, a, b, c);
		chuyen(n - 1, c, b, a);
	}
}

Bài tập C++ số 4

Câu 1: In các phần tử của mảng theo yêu cầu

Nhập mảng n số thực, tìm và in ra phần tử nhỏ nhất, lớn nhất, tính và in ra trung bình cộng của các phần tử trong mảng. In ra các phần tử nhỏ hơn, lớn hơn trung bình cộng.

Code mẫu:

#include <conio.h>
#include <iostream.h>
#define max 100

void main()
{
	int i, j, n;
	float a[max], tbc, pmax, pmin;
	clrscr();
	cout << "Nhap so phan tu n<" << max << ", n= ";
	cin >> n;
	cout << "Nhap cac phan tu cua mang :\n";
	for (i = 0; i < n; i++)
	{
		cout << "A[" << i + 1 << "]=";
		cin >> a[i];
	}

	pmax = pmin = tbc = a[0];
	for (i = 1; i < n; i++)
	{
		tbc += a[i];
		if (pmax < a[i]) pmax = a[i];
		if (pmin > a[i]) pmin = a[i];
	}

	tbc = tbc / n;
	cout << "\nPhan tu max=" << pmax;
	cout << "\nPhan tu min=" << pmin;
	cout << "\nGia tri TBC=" << tbc;
	cout << "\nCac phan tu<TBC:\n";
	for (i = 0; i < n; i++)
		if (a[i] < tbc) cout << a[i] << " ";
	cout << "\nCac phan tu > TBC:\n";
	for (i = 0; i < n; i++)
		if (a[i] > tbc) cout << a[i] << " ";
}

Câu 2: Nhập, sắp xếp, in mảng

Viết một hàm nhập mảng, một hàm sắp xếp mảng, một hàm in các phần tử của mảng ra màn hình. Hàm main sử dụng các hàm này để nhập mảng n phần tử, in ra mảng trước và sau khi sắp xếp.

Code mẫu:

#include <conio.h>
#include <iostream.h>
#define max 100

void nhap(int[], int);
void sapxep(int[], int);
void xuat(int[], int);

void main()
{
	int a[max], n;
	clrscr();
	cout << "Nhap so phan tu n<" << max << ", n= ";
	cin >> n;
	nhap(a, n);
	cout << "Mang truoc khi sap xep :\n";
	xuat(a, n);
	sapxep(a, n);
	cout << "\nMang sau khi sap xep :\n";
	xuat(a, n);
}

void nhap(int a[], int n)
{
	int i;
	cout << "Nhap cac phan tu cua mang :\n";
	for (i = 0; i < n; i++)
	{
		cout << "A[" << i + 1 << "]=";
		cin >> a[i];
	}
}

void xuat(int a[], int n)
{
	int i, j;
	for (i = 0; i < n; i++) cout << a[i] << " ";
}

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

Câu 3: Nhập, in mảng, đếm đoạn theo các tiêu chí

Viết một hàm nhập mảng, một hàm in các phần tử của mảng ra màn hình, một hàm đếm số các đoạn tăng, một hàm tìm đoạn tăng dài nhất trong mảng. Hàm main sử dụng các hàm này để nhập mảng n phần tử, in mảng, in số đoạn tăng và đoạn tăng dài nhất trong mảng.

Code mẫu:

#include <conio.h>
#include <iostream.h>
#define max 100

void nhap(int[], int);
void xuat(int[], int);
int sodoantang(int[], int);
void timdoantangmax(int[], int, int &, int &);

void main()
{
	int a[max], i, d, c, n;
	clrscr();
	cout << "Nhap so phan tu n<" << max << ", n= ";
	cin >> n;
	nhap(a, n);
	cout << "Mang da nhap:\n";
	xuat(a, n);
	cout << "\nSo doan tang :" << sodoantang(a, n) << endl;
	timdoantangmax(a, n, d, c);
	cout << "\nDoan tang dai nhat la : ";
	for (i = d; i <= c; i++) cout << a[i] << " ";
}

void nhap(int a[], int n)
{
	int i;
	cout << "Nhap cac phan tu cua mang :\n";
	for (i = 0; i < n; i++)
	{
		cout << "A[" << i + 1 << "]=";
		cin >> a[i];
	}
}

void xuat(int a[], int n)
{
	int i;
	for (i = 0; i < n; i++) cout << a[i] << " ";
}

int sodoantang(int a[], int n)
{
	int i, d;
	if (n > 0) d = 1;
	else d = 0;
	for (i = 0; i < n - 1; i++)
		if (a[i + 1] < a[i]) d++;
	return d;
}

void timdoantangmax(int a[], int n, int &d, int &c)
{
	int t, p;
	p = 0;
	d = c = 0;
	do {
		t = p;
		for (p = t;
			(p < n - 1) && (a[p] <= a[p + 1]); p++);
		if (p - t > c - d)
		{
			d = t;
			c = p;
		}

		if (p < n - 1) p++;
	} while (p < n - 1);
}

Câu 4: Nhập, in, tính tích 2 ma trận

Viết một hàm nhập các phần tử của ma trận 2 chiều, một hàm in ma trận theo hàng cột, một hàm nhân 2 ma trận. Hàm main sử dụng các hàm này để nhập ma trận A kích thước MxN và ma trận B kích thước NxP. In ra ma trận A, B và ma trận C là tích 2 ma trận A và B.

Code mẫu:

#include <conio.h>
#include <iostream.h>

int a[10][10], b[10][10], c[10][10];
void nhap(char, int, int);
void xuat(char, int, int);
void nhan(int, int, int);

void main()
{
	int m, n, p;
	clrscr();
	cout << "Nhap kich thuoc mang a: so hang, so cot<10, so hang m=";
	cin >> m;
	cout << "so cot n=";
	cin >> n;
	cout << "Nhap kich thuoc mang b: so hang = so cot mang a la " << n << ", so cot<10, so cot p=";
	cin >> p;
	cout << "Nhap mang a :\n";
	nhap('a', m, n);
	cout << "Nhap mang b :\n";
	nhap('b', n, p);
	cout << "\nMang A :\n";
	xuat('a', m, n);
	cout << "\n\nMang B :\n";
	xuat('b', n, p);
	nhan(m, n, p);
	cout << "\n\nMang C=AxB:\n";
	xuat('c', m, p);
}

void nhap(char k, int p, int q)
{
	int i, j, t;
	for (i = 0; i < p; i++)
	{
		cout << "Nhap cac phan tu hang thu " << i + 1 << ":\n";
		for (j = 0; j < q; j++)
		{
			cout << k << "[" << i + 1 << "," << j + 1 << "]=";
			cin >> t;
			switch (k)
			{
				case 'a':
					a[i][j] = t;
					break;
				case 'b':
					b[i][j] = t;
			}
		}
	}
}

void xuat(char k, int p, int q)
{
	int i, j;
	for (i = 0; i < p; i++)
	{
		cout << endl;
		for (j = 0; j < q; j++)
		{
			cout << " ";
			switch (k)
			{
				case 'a':
					cout << a[i][j];
					break;
				case 'b':
					cout << b[i][j];
					break;
				case 'c':
					cout << c[i][j];
			}
		}
	}
}

void nhan(int m, int n, int p)
{
	int i, j, k, s;
	for (i = 0; i < m; i++)
		for (j = 0; j < p; j++)
		{
			for (k = s = 0; k < n; k++) s += a[i][k] *b[k][j];
			c[i][j] = s;
		}
}

Câu 5: Nhập, in ma trận vuông, tính định thức

Viết một hàm nhập các phần tử của ma trận vuông cấp n, một hàm in ma trận theo cấu trúc hàng cột, một hàm tính định thức ma trận cấp n. Hàm main sử dụng các hàm này để nhập ma trận vuông cấp n, in ra ma trận, tính và in ra định thức của ma trận đó.

Code mẫu:

#include <conio.h>
#include <iostream.h>

float a[10][10];
int n;
void nhap();
void xuat();
void doicot(int, int);
void truhang(int, int);
float dinhthuc();

void main()
{
	clrscr();
	cout << "Nhap kich thuoc ma tran vuong a: so hang = so cot<10, n=";
	cin >> n;
	cout << "Nhap ma tran a :\n";
	nhap();
	cout << "\nMa tran A :\n";
	xuat();
	cout << "\n\nDinh thuc ma tran A :" << dinhthuc();
}

void nhap()
{
	int i, j, t;
	for (i = 0; i < n; i++)
	{
		cout << "Nhap cac phan tu hang thu " << i + 1 << ":\n";
		for (j = 0; j < n; j++)
		{
			cout << "A[" << i + 1 << "," << j + 1 << "]=";
			cin >> t;
			a[i][j] = t;
		}
	}
}

void xuat()
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		cout << endl;
		for (j = 0; j < n; j++)
		{
			cout << " ";
			cout << a[i][j];
		}
	}
}

void doicot(int k, int t)
{
	int i;
	float p;
	for (i = 0; i < n; i++)
	{
		p = a[i][k];
		a[i][k] = a[i][t];
		a[i][t] = p;
	}
}

void truhang(int h, int r)
{
	int i;
	float x;
	x = -a[h][h] / a[r][h];
	for (i = h; i < n; i++) a[r][i] = a[h][i] + x *a[r][i];
}

float dinhthuc()
{
	int i, j;
	float d = 1;
	for (i = 0; i < n - 1; i++)
	{
		if (a[i][i] == 0)
		{
			for (j = i + 1;
				(j < n) && (a[i][j] == 0); j++);
			if (j < n)
			{
				doicot(i, j);
				d = -d;
			}
			else d = 0;
		}

		if (d == 0) break;
		for (j = i + 1; j < n; j++)
			if (a[j][i]) truhang(i, j);
	}

	if (d)
		for (i = 0; i < n; i++) d = d *a[i][i];
	return d;
}

Bài tập C++ số 5

Câu 1: Kiểm tra tính đối xứng của một xâu

Viết hàm kiểm tra tính đối xứng của 1 xâu ký tự. Trong hàm main nhập xâu ký tự từ bàn phím và cho biết xâu đó có đối xứng không. Yêu cầu chương trình chạy nhiều lần.

Code mẫu:

#include <stdio.h>
#include <conio.h>
#include <string.h>

int doixung(char[]);

void main()
{
	char c, s[80];
	do {
		clrscr();
		printf("\nNhap xau ki tu : \n");
		fflush(stdin);
		gets(s);
		if (doixung(s)) printf("Xau doi xung !");
		else printf("Xau khong doi xung !");
		printf("\nTiep tuc ? (c/k):");
		fflush(stdin);
		c = getchar();
	} while ((c == 'c') || (c == 'C'));
}

int doixung(char s[])
{
	int i, n, d;
	n = strlen(s);
	d = 1;
	if (n > 0)
		for (i = 0;
			(i <= n / 2) && d; i++)
			d = (s[i] == s[n - 1 - i]);
	return d;
}

Câu 2: Thống kê số lần xuất hiện một ký tự trong xâu

Viết hàm thống kê tần số xuất hiện mỗi ký tự trong một xâu ký tự. Hàm main nhập xâu ký tự từ bàn phím và in ra tần số của mỗi ký tự. Yêu cầu chương trình chạy nhiều lần.

Code mẫu:

#include <stdio.h>
#include <conio.h>
#include <string.h>

int ts[128];
void thongke(char[]);

void main()
{
	char c, s[80];
	int i;
	do {
		clrscr();
		printf("\nNhap xau ki tu : \n");
		fflush(stdin);
		gets(s);
		thongke(s);
		printf("Tan so cac ky tu trong xau la :\n");
		for (i = 0; i < 128; i++)
			if (ts[i])
				if (i == 32) printf("\nDau cach : %d", ts[i]);
				else printf("\nKy tu %c : %d", i, ts[i]);
		printf("\nTiep tuc ? (c/k):");
		fflush(stdin);
		c = getchar();
	} while ((c == 'c') || (c == 'C'));
}

void thongke(char s[])
{
	int i, n;
	n = strlen(s);
	for (i = 0; i < 128; i++) ts[i] = 0;
	for (i = 0; i < n; i++) ts[s[i]]++;
}

Câu 3: Chuẩn hóa xâu ký tự

Viết một hàm chuẩn hóa xâu ký tự: biến đổi xâu ký tự thành xâu sao cho trong xâu không có 2 dấu cách liền nhau, một hàm tìm số từ của 1 xâu ký tự, một hàm tìm từ dài nhất trong 1 xâu ký tự. Hàm main sử dụng các hàm này để nhập xâu ký tự từ bàn phím, in ra xâu trước và sau khi chuẩn hóa, số từ trong xâu và 1 từ dài nhất trong xâu đó.

Code mẫu:

#include <stdio.h>
#include <conio.h>
#include <string.h>

void chuanhoa(char[]);
int sotu(char[]);
char *timtumax(char[]);

void main()
{
	char s[80];
	clrscr();
	printf("\nNhap xau ki tu : \n");
	gets(s);
	printf("\nXau ban dau:\n");
	puts(s);
	chuanhoa(s);
	printf("\nXau da chuan hoa:\n");
	puts(s);
	printf("\nSo tu cua xau : %d\n", sotu(s));
	printf("\nTu dai nhat trong xau : %s", timtumax(s));
}

void chuanhoa(char s[])
{
	int i, k, n;
	do {
		n = strlen(s);
		for (i = 0;
			(i < n - 1) && ((s[i] - 32) || (s[i + 1] - 32)); i++);
		if (i < n - 1)
			for (k = i; k < n; k++) s[k] = s[k + 1];
	} while (i < n - 1);
	if (s[0] == 32)
		for (i = 0;
			(i < n); i++) s[i] = s[i + 1];
}

int sotu(char s[])
{
	int i, n, d;
	n = strlen(s);
	if ((n > 0) && (s[0] - 32)) d = 1;
	else d = 0;
	for (i = 0; i < n - 1; i++)
		if ((s[i] == 32) && (s[i + 1] - 32)) d++;
	return d;
}

char *timtumax(char s[])
{
	int t, p, n, c, d;
	char x[80];
	d = 0;
	c = t = -1;
	n = strlen(s);
	do {
		do t++; while ((t < n) && (s[t] == 32));
		if (t == n) break;
		p = t;
		do p++; while ((p < n) && (s[p] - 32));
		p--;
		if (p - t > c - d)
		{
			d = t;
			c = p;
		}

		t = p + 1;
	} while (t < n);
	for (t = d; t <= c; t++) x[t - d] = s[t];
	x[t - d] = 0;
	return x;
}

Câu 4: Nhập mảng xâu ký tự và sắp xếp tăng dần

Viết 1 hàm nhập mảng xâu ký tự, 1 hàm sắp xếp mảng tăng dần. Hàm main sử dụng các hàm này nhập danh sách tên sinh viên và in ra danh sách theo thứ tự ABC của tên.

Code mẫu:

#include <stdio.h>
#include <conio.h>
#include <string.h>

char ds[100][10];
void nhap(int);
void sapxep(int);
void inds(int n);

void main()
{
	int n;
	clrscr();
	printf("\nNhap so luong sinh vien n=");
	scanf("%d", &n);
	nhap(n);
	printf("\nDanh sach theo thu tu nhap:\n");
	inds(n);
	sapxep(n);
	printf("\nDanh sach theo van ABC:\n");
	inds(n);
	getch();
}

void nhap(int n)
{
	int i;
	printf("Nhap ten %d sinh vien:\n", n);
	for (i = 0; i < n; i++)
	{
		printf("SV thu %d : ", i + 1);
		fflush(stdin);
		gets(ds[i]);
	}
}

void inds(int n)
{
	int i;
	for (i = 0; i < n; i++) puts(ds[i]);
}

void sapxep(int n)
{
	int i, j;
	char tg[10];
	for (i = 0; i < n - 1; i++)
		for (j = i + 1; j < n; j++)
			if (strcmpi(ds[i], ds[j]) > 0)
			{
				strcpy(tg, ds[i]);
				strcpy(ds[i], ds[j]);
				strcpy(ds[j], tg);
			}
}

Bài tập C++ số 6

Câu 1: Quản lý điểm số thí sinh bằng mảng

Sử dụng mảng cấu trúc lưu họ tên thí sinh, số báo danh, điểm thi các môn toán, lý, hóa và tổng điểm. Lập trình nhập dữ liệu cần thiết, và điểm chuẩn. In ra danh sách thí sinh cùng điểm các môn và tổng điểm; Danh sách thí sinh trúng tuyển (tổng điểm>=điểm chuẩn).

Code mẫu:

#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define max 50

void main()
{
	struct
	{
		char ht[30];
		char sbd[10];
		float dt, dl, dh, td;
	}

	a[max];
	float dc;
	int i, j, n;
	clrscr();
	cout << "Nhap so thi sinh n<=" << max << ", n= ";
	cin >> n;
	cout << "Nhap du lieu cua cac thi sinh :\n";
	for (i = 0; i < n; i++)
	{
		cout << "Thi sinh thu " << i + 1 << " :\n";
		cout << "Ho ten : ";
		gets(a[i].ht);
		cout << "So bao danh : ";
		gets(a[i].sbd);
		cout << "Diem toan : ";
		cin >> a[i].dt;
		cout << "Diem ly : ";
		cin >> a[i].dl;
		cout << "Diem hoa : ";
		cin >> a[i].dh;
		a[i].td = a[i].dt + a[i].dl + a[i].dh;
	}

	cout << "Nhap diem chuan dc=";
	cin >> dc;
	cout << "\nGo Enter Tiep tuc ...";
	getch();
	clrscr();
	cout << "\nDanh sach thi sinh :\n\n";
	printf("%-4s%-20s%-10s%-10s%-10s%-10s%-10s\n",
		"Stt", "Ho ten", "SBD", "Dtoan", "Dly", "Dhoa", "Tong");
	for (i = 0; i < n; i++)
		printf("%-4d%-20s%-10s%-10.1f%-10.1f%-10.1f%-10.1f\n",
			i + 1, a[i].ht, a[i].sbd, a[i].dt, a[i].dl, a[i].dh, a[i].td);
	cout << "\nGo Enter Tiep tuc ...";
	getch();
	clrscr();
	cout << "\nDanh sach thi sinh trung tuyen :\n\n";
	printf("%-4s%-20s%-10s%-10s%-10s%-10s%-10s\n",
		"Stt", "Ho ten", "SBD", "Dtoan", "Dly", "Dhoa", "Tong");
	for (i = 0, j = 0; i < n; i++)
		if (a[i].td >= dc)
		{
			j++;
			printf("%-4d%-20s%-10s%-10.1f%-10.1f%-10.1f%-10.1f\n",
				j, a[i].ht, a[i].sbd, a[i].dt, a[i].dl, a[i].dh, a[i].td);
		}

	cout << "\nGo Enter ket thuc ...";
	getch();
}

Câu 2: Quản lý tài liệu, in danh sách theo yêu cầu

Tạo danh sách liên kết chứa các tài liệu ngành công nghệ thông tin, mỗi tài liệu gồm: mã, tên tài liệu, số trang, năm xuất bản. Hãy in ra danh sách tất cả tài liệu và danh sách những tài liệu xuất bản từ năm 1998, yêu cầu in theo các cột, có kèm cột số thứ tự.

Code mẫu:

#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <string.h>

struct tailieu
{
	char ma[10];
	char ten[30];
	int sotrang, namxb;
	tailieu * next;
};

tailieu* nhap();
void xoa(tailieu*);

void main()
	{
		tailieu *p, *q, *head;
		int i;
		clrscr();
		head = nhap();;
		printf("\nGo Enter Tiep tuc ...");
		getch();
		clrscr();
		printf("\nDanh sach tai lieu :\n\n");
		printf("%-4s%-10s%-30s%-10s%-10s\n", "Stt", "Ma", "Ten tai lieu", "So tr", "Nam XB");
		p = head;
		i = 0;
		while (p != NULL)
		{
			printf("%-4d%-10s%-30s%-10d%-10d\n", ++i, p->ma, p->ten, p->sotrang, p->namxb);
			p = p->next;
		}

		printf("\nGo Enter Tiep tuc ...");
		getch();
		clrscr();
		printf("\nDanh sach tai lieu xuat ban tu nam 1998 :\n\n");
		printf("%-4s%-10s%-30s%-10s%-10s\n", "Stt", "Ma", "Ten tai lieu", "So tr", "Nam XB");
		p = head;
		i = 0;
		while (p != NULL)
		{
			if (p->namxb >= 1998) printf("%-4d%-10s%-30s%-10d%-10d\n", #ERROR!
				p = p->next;
			}
		}

		void xoa(tailieu *p)
		{
			tailieu * q;
			while (p != NULL)
			{
				q = p;
				p = p->next;
				delete q;
			}
		}

		tailieu* nhap()
		{
			tailieu *p, *q, *h;
			char s[10];
			h = NULL;
			printf("Nhap du lieu cua cac tai lieu, ket thuc go Enter :\n");
			printf("Tai lieu thu 1 :\n");
			printf("Ma so : ");
			gets(s);
			if (strcmp(s, ""))
			{
				p = new tailieu;
				strcpy(p->ma, s);
				printf("Ten tai lieu : ");
				gets(p->ten);
				printf("So trang : ");
				cin >> p->sotrang;
				printf("Nam xuat ban : ");
				cin >> p->namxb;
				p->next = NULL;
				h = p;
				q = p;
				printf("Tai lieu tiep theo :\n");
				printf("Ma so : ");
				gets(s);
				while (strcmp(s, ""))
				{
					p = new tailieu;
					strcpy(p->ma, s);
					printf("Ten tai lieu : ");
					gets(p->ten);
					printf("So trang : ");
					cin >> p->sotrang;
					printf("Nam xuat ban : ");
					cin >> p->namxb;
					p->next = NULL;
					q->next = p;
					q = p;
					printf("Tai lieu tiep theo :\n");
					printf("Ma so : ");
					gets(s);
				}
			}

			return h;
		}

Câu 3: Quản lý thanh toán tiền điện

Sử dụng mảng cấu trúc lưu họ tên chủ hộ, số điện tháng trước, số điện tháng này, số tiền phải trả. Lập trình nhập dữ liệu cần thiết, tiền điện dựa trên số điện trong tháng s=số điện tháng trước - số điện tháng này. Đơn giá quy định: 100 số đầu giá 550, 50 số tiếp theo giá 900, 50 số tiếp theo giá 1210, 50 số tiếp theo giá 1340, 50 số tiếp theo giá 1500, các số điện >300 theo giá 2000. In ra bảng thống kê thanh toán tiền điện của tất cả các thuê bao; bảng thống kê những hộ sử dụng theo từng loại: <=100 số, từ 101 đến 300 số và trên 300 số.

Code mẫu:

#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define max 100

struct thuebao
{
	char ht[30];
	float sdtt, sdtn, sotien;
};

thuebao nhap();
int thongke(thuebao[], int, float, float);
void xuat(thuebao[], int);

void main()
{
	thuebao a[max];
	float dc;
	int i, j, n, d;
	clrscr();
	cout << "Nhap so thue bao n<=" << max << ", n= ";
	cin >> n;
	cout << "Nhap du lieu cua cac thue bao :\n";
	for (i = 0; i < n; i++)
	{
		cout << "Thue bao thu " << i + 1 << " :\n";
		a[i] = nhap();
	}

	cout << "\nGo Enter Tiep tuc ...";
	getch();
	clrscr();
	cout << "\nBang thanh toan :\n\n";
	xuat(a, n);
	cout << "\nGo Enter Tiep tuc ...";
	getch();
	d = thongke(a, n, 0, 100);
	printf("\nSo thue bao su dung<=100 so la %d, chiem %2.1f %\n\n", d, (float) d / n *100);
	d = thongke(a, n, 101, 300);
	printf("\nSo thue bao su dung tu 101 den 300 so la %d, chiem %2.1f %\n\n", d, (float) d / n *100);
	d = thongke(a, n, 301, 3000);
	printf("\nSo thue bao su dung tu tren 300 so la %d, chiem %2.1f %\n\n", d, (float) d / n *100);
	cout << "\nGo Enter ket thuc ...";
	getch();
}

thuebao nhap()
{
	thuebao ah;
	float sd = 0;
	cout << "Ho ten : ";
	gets(ah.ht);
	do {
		if (sd < 0) cout << "Nhap sai ! Hay nhap lai :\n";
		cout << "So dien thang truoc : ";
		cin >> ah.sdtt;
		cout << "So dien thang nay : ";
		cin >> ah.sdtn;
		sd = ah.sdtn - ah.sdtt;
	} while (sd < 0);
	if (sd <= 100) ah.sotien = 550 * sd;
	else if (sd <= 150) ah.sotien = 55000.0 + 900 *(sd - 100);
	else if (sd <= 200) ah.sotien = 100000.0 + 1210 *(sd - 150);
	else if (sd <= 250) ah.sotien = 160500.0 + 1340 *(sd - 200);
	else if (sd <= 300) ah.sotien = 227500.0 + 1500 *(sd - 250);
	else ah.sotien = 302500.0 + 2000 *(sd - 300);
	return ah;
}

void xuat(thuebao x[], int k)
{
	int i, j;
	printf("%-4s%-20s%-15s%-15s%-15s\n",
		"Stt", "Ho ten", "SD thang truoc", "SD thang nay", "Tong so tien");
	for (i = 0, j = 0; i < k; i++)
	{
		j++;
		printf("%-4d%-20s%-15.0f%-15.0f%-15.0f\n",
			j, x[i].ht, x[i].sdtt, x[i].sdtn, x[i].sotien);
	}
}

int thongke(thuebao x[], int n, float cd, float ct)
{
	int i, d = 0;
	float sd;
	for (i = 0; i < n; i++)
	{
		sd = x[i].sdtn - x[i].sdtt;
		if ((sd >= cd) && (sd <= ct)) d++;
	}

	return d;
}

Bài tập C++ số 7

Câu 1: Tạo tệp số, đếm số, số lớn nhất, số nhỏ nhất

Tạo tệp chứa các số nguyên đọc từ bàn phím. Sau đó đọc từ tệp đã tạo để thống kê và in ra kết quả: số lượng các số trong tệp, số lượng các số dương, số lớn nhất, số nhỏ nhất.

Code mẫu:

#include <stdio.h>
#include <conio.h>

void main()
{
	int i, x, ts, sd, max, min;
	char t;
	FILE * fp;
	clrscr();
	fp = fopen("tepsn.dat", "w");
	printf("Nhap tung so nguyen :\n");
	i = 1;
	do {
		printf("So thu %d : ", i++);
		scanf("%d", &x);
		fprintf(fp, "%d ", x);
		printf("Tiep tuc nhap ? (c/k) : ");
		fflush(stdin);
		t = getchar();
	} while ((t == 'c') || (t == 'C'));
	fclose(fp);
	fp = fopen("tepsn.dat", "r");
	ts = sd = 0;
	if (!feof(fp))
	{
		fscanf(fp, "%d", &x);
		max = min = x;
		ts++;
		if (x > 0) sd++;
		while (!feof(fp))
		{
			fscanf(fp, "%d", &x);
			if (max < x) max = x;
			if (min > x) min = x;
			if (x > 0) sd++;
			ts++;
		}
	}

	if (x > 0) sd--;
	ts--;	//So nguyen sau cung duoc doc 2 lan
	fclose(fp);
	printf("Tat ca co %d so nguyen\n", ts);
	printf("Trong do so luong so duong = %d\n", sd);
	printf("Max=%d, Min=%d", max, min);
	getch();
}

Câu 2: Tạo tệp tên sinh viên, sắp xếp và in

Tạo tệp văn bản chứa danh sách họ tên sinh viên nhập từ bàn phím. Sau đó đọc từ tệp đã tạo vào 1 mảng; sắp xếp mảng tăng dần và in ra danh sách sinh viên đã sắp xếp kèm theo cột số thứ tự.

Code mẫu:

#include <stdio.h>
#include <conio.h>
#include <string.h>

void main()
{
	char i, s[30];
	FILE * f;
	clrscr();
	f = fopen("DSSV.TXT", "w");
	i = 1;
	printf("Nhap ho ten cua tung hoc sinh, ket thuc go Enter\n");
	do {
		printf("Ho ten hoc sinh thu %d : ", i++);
		gets(s);
		if (strlen(s) > 0)
		{
			strcat(s, "\n");
			fputs(s, f);
		}
	} while (strlen(s) > 0);
	fclose(f);
	clrscr();
	f = fopen("DSSV.TXT", "r");
	printf("Danh sach hoc sinh doc tu tep :\n\n");
	i = 1;
	while (fgets(s, 30, f))
	{
		printf("%d. ", i++);
		puts(s);
	}

	fclose(f);
	getch();
}

Câu 3: Tạo tệp danh sách hồ sơ sinh viên theo yêu cầu

Tạo tệp chứa danh sách hồ sơ sinh viên gồm mã số, họ tên, điểm trung bình. Sau đó đọc từ tệp đã tạo vào 1 mảng; sắp xếp mảng giảm dần theo điểm trung bình và in ra danh sách sinh viên theo các cột, có kèm theo cột chỉ số thứ tự.

Code mẫu:

#include <stdio.h>
#include <conio.h>

struct sv
{
	char maso[10];
	char ht[25];
	float dtb;
};

void main()
{
	int i, n;
	float d;
	sv bg;
	FILE * f;
	clrscr();
	f = fopen("HosoSV.DAT", "w+b");
	printf("Nhap so sv n=");
	scanf("%d", &n);
	fwrite(&n, sizeof(int), 1, f);
	for (i = 1; i <= n; i++)
	{
		printf("nhap du lieu cua sv thu %d :\n", i);
		fflush(stdin);
		printf("Ma so : ");
		gets(bg.maso);
		printf("Ho va ten : ");
		gets(bg.ht);
		printf("Diem TB : ");
		scanf("%f", &d);
		bg.dtb = d;
		fwrite(&bg, sizeof(sv), 1, f);
	}

	fclose(f);
	f = fopen("HosoSV.DAT", "rb");
	fread(&n, sizeof(int), 1, f);
	clrscr();
	gotoxy(10, 1);
	printf("Danh sach sinh vien\n\n");
	printf("%-10s%-25s%-10s\n\n", "Ma so", "Ho va ten", "Diem TB");
	for (i = 1; i <= n; i++)
	{
		fread(&bg, sizeof(sv), 1, f);
		printf("%-10s%-25s%-10.1f\n", bg.maso, bg.ht, bg.dtb);
	}

	fclose(f);
	printf("\nGo Enter ket thuc ...");
	getch();
}

Bài tập C++ số 8

Câu 1: Vẽ lá cờ đỏ sao vàng tại vị trí trung tâm màn hình.

Code mẫu:

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream.h>

void main()
{
	int gdrv = DETECT, gmode, errorcode, mx, my;
	initgraph(&gdrv, &gmode, "..\\BGI");
	errorcode = graphresult();
	if (errorcode != grOk)
	{
		printf("Graphics error : %s\n", grapherrormsg(errorcode));
		printf("Press any key to halt ...");
		getch();
		exit(1);
	}

	mx = getmaxx() / 2;
	my = getmaxy() / 2;
	setbkcolor(BLUE);
	setcolor(RED);
	setfillstyle(1, RED);
	bar(mx - 150, my - 100, mx + 150, my + 100);
	setcolor(YELLOW);
	setfillstyle(1, YELLOW);
	moveto(mx, my - 70);
	lineto(mx + 50, my + 60);
	lineto(mx - 70, my - 25);
	lineto(mx + 70, my - 25);
	lineto(mx - 50, my + 60);
	lineto(mx, my - 70);
	floodfill(mx, my, YELLOW);
	floodfill(mx, my - 30, YELLOW);
	floodfill(mx + 20, my + 30, YELLOW);
	floodfill(mx - 20, my + 30, YELLOW);
	floodfill(mx - 50, my - 20, YELLOW);
	floodfill(mx + 50, my - 20, YELLOW);
	getch();
	closegraph();
}

Câu 2: Vẽ mô phỏng tháp phát sóng ăng-ten.

Code mẫu:

#include <stdio.h>//ham printf
#include <graphics.h>
#include <conio.h>//ham getch(), kbhit()
#include <stdlib.h>//ham random, exit
#include <dos.h>//ham delay

const CHAM = 10;
int mx, my;
void khoitao();
void vecot();

void main()
{
	int dx = 10;
	khoitao();
	vecot();
	while (!kbhit())
	{
		setcolor(random(16));
		circle(mx, my, dx);
		delay(CHAM);
		dx = dx + 10;
		if (dx > 2 *my)
		{
			delay(20 *CHAM);
			dx = 10;
			vecot();
		}
	}

	closegraph();
}

void vecot()
{
	setbkcolor(BLUE);
	cleardevice();
	setcolor(RED);
	setfillstyle(6, LIGHTRED);
	line(mx, my, mx - 20, my + 15);
	line(mx, my, mx + 20, my + 15);
	line(mx - 20, my + 15, mx - 40, 2 *my);
	line(mx + 20, my + 15, mx + 40, 2 *my);
	line(mx - 40, 2 *my, mx + 40, 2 *my);
	floodfill(mx, my + 20, RED);
}

void khoitao()
{
	int gdrv = DETECT, gmode, errorcode;
	initgraph(&gdrv, &gmode, "..\\BGI");
	errorcode = graphresult();
	if (errorcode != grOk)
	{
		printf("Graphics error : %s\n", grapherrormsg(errorcode));
		printf("Press any key to halt ...");
		getch();
		exit(1);
	}

	mx = getmaxx() / 2;
	my = getmaxy() / 2;
}

Câu 3: Vẽ bầu trời sao trên màn hình.

Code mẫu:

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <dos.h>

struct point
{
	int x, y, s, c, h;
};

void vediem(point, int);
void main()
{
	point p[100];
	int gdrv = DETECT, gmode, errorcode, mx, my, i;
	initgraph(&gdrv, &gmode, "..\\BGI");
	errorcode = graphresult();
	if (errorcode != grOk)
	{
		printf("Graphics error : %s\n", grapherrormsg(errorcode));
		printf("Press any key to halt ...");
		getch();
		exit(1);
	}

	mx = getmaxx();
	my = getmaxy();
	randomize();
	for (i = 0; i < 100; i++)
	{
		p[i].x = random(mx);
		p[i].y = random(my);
		p[i].s = random(4);
		p[i].c = random(16);
		p[i].h = random(2);
	}

	while (!kbhit())
	{
		for (i = 0; i < 100; i++) vediem(p[i], 1);
		delay(100);
		for (i = 0; i < 100; i++) vediem(p[i], 0);
		for (i = 0; i < 100; i++)
		{
			if (p[i].h)
			{
				p[i].s++;
				if (p[i].s >= 3) p[i].h = 0;
			}
			else
			{
				p[i].s--;
				if (p[i].s <= 3) p[i].h = 1;
			}
		}
	}

	closegraph();
}

void vediem(point p, int v)
{
	int mau;
	if (v) mau = p.c;
	else mau = BLACK;
	setcolor(mau);
	switch (p.s)
	{
		case 0:
			putpixel(p.x, p.y, mau);
			break;
		case 1:
			line(p.x - 1, p.y, p.x + 1, p.y);
			line(p.x, p.y - 1, p.x, p.y + 1);
			break;
		case 2:
			line(p.x - 2, p.y, p.x + 2, p.y);
			line(p.x, p.y - 2, p.x, p.y + 2);
			break;
		case 3:
			line(p.x - 4, p.y, p.x + 4, p.y);
			line(p.x, p.y - 4, p.x, p.y + 4);
			rectangle(p.x - 1, p.y - 1, p.x + 1, p.y + 1);
	}
}

Câu 4: Vẽ đồ thị hàm số y=sinx.

Code mẫu:

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>

void main()
{
	int gdrv = DETECT, gmode, errorcode, mx, my;
	float x, y, k, kx;
	initgraph(&gdrv, &gmode, "..\\BGI");
	errorcode = graphresult();
	if (errorcode != grOk)
	{
		printf("Graphics error : %s\n", grapherrormsg(errorcode));
		printf("Press any key to halt ...");
		getch();
		exit(1);
	}

	mx = getmaxx() / 2;
	my = getmaxy() / 2;
	x = 0;
	kx = 2 *M_PI / mx;
	setbkcolor(BLUE);
	setcolor(WHITE);
	line(0, my, 2 *mx, my);
	line(mx, 0, mx, 2 *my);
	moveto(mx, 0);
	linerel(7, 7);
	moveto(mx, 0);
	linerel(-7, 7);
	moveto(2 *mx, my);
	linerel(-7, -7);
	moveto(2 *mx, my);
	linerel(-7, 7);
	setcolor(RED);
	k = 100;
	while (x < mx *2 - 10)
	{
		y = k* sin((x - mx) *kx);
		putpixel((int) floor(x), my - (int) floor(y), RED);
		x = x + 0.1;
	}

	settextstyle(1, 0, 2);
	setcolor(LIGHTGREEN);
	outtextxy(50, 10, "Do Thi Ham So");
	outtextxy(50, 40, " y = Sin(x)");
	settextstyle(2, 0, 5);
	outtextxy(mx + 7, my + 5, "0");
	line(mx + mx / 4, my - 2, mx + mx / 4, my + 2);
	line(mx - mx / 4, my - 2, mx - mx / 4, my + 2);
	line(mx / 4, my - 2, mx / 4, my + 2);
	line(2 *mx - mx / 4, my - 2, 2 *mx - mx / 4, my + 2);
	line(mx - 2, my - 100, mx + 2, my - 100);
	line(mx - 2, my + 100, mx + 2, my + 100);
	outtextxy(mx - 13, my - 107, "1");
	outtextxy(mx - 20, my + 90, "-1");
	moveto(mx + mx / 2 - 4, my + 17);
	lineto(mx + mx / 2 - 4, my + 9);
	lineto(mx + mx / 2 + 1, my + 9);
	lineto(mx + mx / 2 + 1, my + 17);
	moveto(mx / 2 - 4, my + 17);
	lineto(mx / 2 - 4, my + 9);
	lineto(mx / 2 + 1, my + 9);
	lineto(mx / 2 + 1, my + 17);
	line(mx / 2 - 10, my + 12, mx / 2 - 7, my + 12);
	getch();
	closegraph();
}

Câu 5: Vẽ quả bóng chuyển động trong khung chữ nhật.

Code mẫu:

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
#define R 7
#define MAU YELLOW
#define MAUNEN BLACK
#define CHAM 6

void bong();
void main()
{
	int gdrv = DETECT, gmode, errorcode;
	initgraph(&gdrv, &gmode, "..//BGI");
	errorcode = graphresult();
	if (errorcode != grOk)
	{
		printf("Graphics error : %s\n", grapherrormsg(errorcode));
		printf("Press any key to halt ...");
		getch();
		exit(1);
	}

	bong();
	closegraph();
}

void bong()
{
	int mx, my, dx, dy, x, y, d = 0;
	randomize();
	do {
		dx = random(3) - 1;
	} while (!dx);
	do {
		dy = random(3) - 1;
	} while (!dy);
	mx = getmaxx();
	my = getmaxy();
	x = mx / 2;
	y = my / 2;
	rectangle(0, 0, mx, my);
	do {
		setcolor(MAU);
		setfillstyle(1, MAU);
		fillellipse(x, y, R, R);
		delay(CHAM);
		setcolor(MAUNEN);
		setfillstyle(1, MAUNEN);
		fillellipse(x, y, R, R);
		x += dx;
		y += dy;
		if (x < R + 1 || x > mx - R - 1)
		{
			dx = -dx;
			x += 2 * dx;
			d = 1;
		}

		if (y < R + 1 || y > my - R - 1)
		{
			dy = -dy;
			y += 2 * dy;
			d = 1;
		}
	} while (!kbhit());
}

Bài tập C++ số 9

Câu 1: Tạo lớp vec-tơ theo yêu cầu

Tạo lớp vec-tơ có các thuộc tính kích thước và mảng chứa các thành phần của vecto; các phương thức: nhập, xuất, cộng 2 vecto. Hàm main sử dụng lớp vec-tơ để thực hiện nhập, xuất và tính tổng 2 vecto.

Code mẫu:

#include <iostream.h>
#include <conio.h>

class vecto
{
	int n;
	int *ptr;
	public:
		vecto(int n);
	~vecto();
	void inputvt();
	void sumvt(int *, int *);
	void displayvt(int*);
	void print();
};

vecto::vecto(int n1)
{
	int i;
	n = n1;
	ptr = new int[n1];
	for (i = 0; i < n; i++) ptr[i] = 0;
}

vecto::~vecto()
{
	delete[] ptr;
}

void vecto::inputvt()
{
	int i;
	cout << "\n input vecto:";
	for (i = 0; i < n; i++)
	{
		cout << "ptu[" << i << "]=";
		cin >> ptr[i];
	}
}

void vecto::displayvt(int *p)
{
	int i;
	for (i = 0; i < n; i++) p[i] = ptr[i];
}

void vecto::print()
{
	int i;
	for (i = 0; i < n; i++)
	{
		cout << ptr[i] << " ";
		cout << "\n";
	}
}

void vecto::sumvt(int *p, int *p1)
{
	int i;
	for (i = 0; i < n; i++) ptr[i] = p[i] + p1[i];
}

void main()
{
	int n, *p, *p1;
	clrscr();
	cout << "enter sign of vecto :" << '\n';
	cout << "n=";
	cin >> n;
	vecto a(n), b(n), c(n);
	cout << "input vecto a:" << endl;
	a.inputvt();
	cout << "input vecto b:" << endl;
	b.inputvt();
	a.displayvt(p);
	b.displayvt(p1);
	c.sumvt(p, p1);
	cout << "display input vecto:" << endl;
	cout << "\n display vecto a:" << endl;
	a.print();
	cout << "\ndisplay vecto b" << endl;
	b.print();
	cout << "\n display vecto tong c" << endl;
	c.print();
	getch();
}

Câu 2: Tạo lớp phân số theo yêu cầu

Tạo lớp phân số có các thuộc tính là tử và mẫu số; các phương thức: nhập, hiện, rút gọn, quy đồng mẫu số 2 phân số, cộng 2 phân số. Hàm main sử dụng lớp và thực hiện các phương thức này.

Code mẫu:

#include <conio.h>
#include <iostream.h>

int usc(int a, int b)
{
	int r = a % b;
	while (r)
	{
		a = b;
		b = r;
		r = a % b;
	}

	return b;
}

class phanso
{
	public:
		int tuso, mauso;
	void nhap()
	{
		cout << "Nhap tu so : ";
		cin >> tuso;
		cout << "Nhap mau so : ";
		cin >> mauso;
	}

	void hienphanso()
	{
		cout << tuso << "/" << mauso << "\n";
	}

	void quydong(phanso & b)
	{
		b.tuso = b.tuso * mauso;
		mauso = mauso *b.mauso;
		tuso = tuso *b.mauso;
		b.mauso = mauso;
	}

	phanso operator+(phanso b)
	{
		phanso c;
		c.tuso = tuso + b.tuso;
		c.mauso = mauso;
		return c;
	}

	void rutgon()
	{
		int u = usc(tuso, mauso);
		tuso = tuso / u;
		mauso = mauso / u;
	}
};

class phansomoi: public phanso
{
	public: phansomoi operator+(phansomoi b)
	{
		phansomoi c;
		c.tuso = tuso + b.tuso;
		c.mauso = mauso;
		return c;
	}

	phansomoi operator*(phansomoi b)
	{
		phansomoi c;
		c.tuso = tuso *b.tuso;
		c.mauso = mauso *b.mauso;
		return c;
	}
};

void main()
{
	clrscr();
	phansomoi x, y, kq;
	cout << "Nhap phan so thu nhat :" << endl;
	x.nhap();
	cout << "Nhap phan so thu hai :" << endl;
	y.nhap();
	cout << "Cac phan so da nhap la :" << endl;
	x.hienphanso();
	y.hienphanso();
	x.quydong(y);
	kq = x + y;
	kq.rutgon();
	cout << "Tong 2 phan so da nhap la :" << endl;
	kq.hienphanso();
	kq = x * y;
	kq.rutgon();
	cout << "Tich 2 phan so da nhap la :" << endl;
	kq.hienphanso();
	getch();
}

Câu 3: Tạo lớp hàng hóa theo yêu cầu

Tạo lớp hàng hóa có các thuộc tính là mã hàng, tên hàng, đơn vị tính, đơn giá, số lượng, thành tiền; các phương thức: nhập, tính thành tiền. Tạo lớp hàng hóa mới kế thừa lớp hàng hóa, thêm các thuộc tính: đơn giá vận chuyển và công vận chuyển tính bằng đơn giá vận chuyển nhân với số lượng; các phương thức: tính công vận chuyển, nhập và tính thành tiền. Hàm main sử dụng các lớp này và thực hiện các phương thức.

Code mẫu:

#include <conio.h>
#include <iostream.h>

class hanghoa
{
	public:
		char mahang[2];
	char tenhang[20];
	char donvitinh[10];
	float dongia, soluong, thanhtien;
	void nhap()
	{
		cout << "Nhap ma hang : ";
		cin >> mahang;
		cout << "Nhap ten hang : ";
		cin >> tenhang;
		cout << "Nhap don vi tinh : ";
		cin >> donvitinh;
		cout << "Nhap don gia : ";
		cin >> dongia;
		cout << "Nhap so luong : ";
		cin >> soluong;
	}

	void tinhthanhtien()
	{
		thanhtien = dongia * soluong;
	}
};

class hanghoamoi: public hanghoa
{
	public: float dongiavanchuyen, congvanchuyen;
	void nhap()
	{
		hanghoa::nhap();
		cout << "Nhap don gia van chuyen : ";
		cin >> dongiavanchuyen;
	}

	void tinhcongvanchuyen()
	{
		congvanchuyen = soluong * dongiavanchuyen;
	}

	void tinhthanhtien()
	{
		thanhtien = dongia *soluong + congvanchuyen;
	}
};

void main()
{
	hanghoamoi x;
	clrscr();
	x.nhap();
	x.tinhcongvanchuyen();
	x.tinhthanhtien();
	cout << "Thanh tien : " << x.thanhtien;
	getch();
}

Câu 4: Viết hàm nhập, xuất, sắp xếp mảng

Sử dụng khuôn mẫu viết các hàm nhập, xuất, sắp xếp mảng. Hàm main sử dụng các hàm khuôn mẫu này để nhập mảng n phần tử, in ra mảng trước và sau khi sắp xếp cho hai trường hợp: mảng số nguyên và mảng số thực.

Code mẫu:

#include <conio.h>
#include <iostream.h>

template < class T>
	void nhap(T a[], int n)
	{
		int i;
		cout << "Nhap cac phan tu cua mang :\n";
		for (i = 0; i < n; i++)
		{
			cout << "A[" << i + 1 << "]=";
			cin >> a[i];
		}
	}

template < class T>
	void xuat(T a[], int n)
	{
		int i, j;
		for (i = 0; i < n; i++) cout << a[i] << " ";
	}

template < class T>
	void sapxep(T a[], int n)
	{
		int i, j;
		T tg;
		for (i = 0; i < n - 1; i++)
			for (j = i + 1; j < n; j++)
				if (a[i] > a[j])
				{
					tg = a[i];
					a[i] = a[j];
					a[j] = tg;
				}
	}

void main()
{
	int a[100], n;
	float b[100];
	clrscr();
	cout << "Nhap so phan tu n= ";
	cin >> n;
	cout << "\nNhap mang so nguyen:\n";
	nhap(a, n);
	cout << "Mang truoc khi sap xep :\n";
	xuat(a, n);
	sapxep(a, n);
	cout << "\nMang sau khi sap xep :\n";
	xuat(a, n);
	cout << "\nNhap mang so thuc:\n";
	nhap(b, n);
	cout << "Mang truoc khi sap xep :\n";
	xuat(b, n);
	sapxep(b, n);
	cout << "\nMang sau khi sap xep :\n";
	xuat(b, n);
}

Bài tập C++ cơ bản về hàm và đệ quy

Câu 1: Viết chương trình C++ để kiểm tra chẵn lẻ

Code mẫu:

#include <iostream>
using namespace std;
 
int isEven(int num)
{
    return !(num & 1);
}
 
int main(){
 
    int num;
 
    // Nhập số từ người dùng
    cout<<"Enter any number: ";
    cin>>num;
 
    // Nếu hàm isEven() function trả về 0, thì số là số chẵn
    if(isEven(num))
    {
        //in số chẵn
        cout<<"The entered number is even.";
    }
    else
    {
        //in số lẻ
        cout<<"The entered number is odd.";
    }
 
    return 0;
 
}
 

Câu 2: Viết C++ kiểm tra số nguyên tố và armstrong.

Code mẫu:

#include <iostream>
#include <math.h>
using namespace std;
 
int checkPrimeNumber(int n);
int checkArmstrongNumber(int n);
 
int main(){
 
    int num, flag;
 
    cout<<"Enter a positive integer: ";
    cin>>num;
 
     // Kiểm tra số
    flag = checkPrimeNumber(num);
    if (flag == 1)
        cout<<num<<" is a prime number"<<endl;
    else
        cout<<num<<" is not a prime number"<<endl;
 
    // Kiểm tra số Armstrong 
    flag = checkArmstrongNumber(num);
    if (flag == 1)
        cout<<num<<" is a Armstrong number"<<endl;
    else
        cout<<num<<" is a not an Armstrong number"<<endl;
    return 0;
}
//hàm kiểm tra số nguyên tố
int checkPrimeNumber(int num)
{
    int i, flag = 1;
 
    for(i=2; i<=num/2; ++i)
    {
 
    // điều kiện cho số không phải nguyên tố
        if(num%i == 0)
        {
            flag = 0;
            break;
        }
    }
    return flag;
}
 
//hàm kiểm tra số Armstrong 
int checkArmstrongNumber(int number)
{
    int originalNumber, remainder, result = 0, num = 0, flag;
 
    originalNumber = number;
 
    while (originalNumber != 0)
    {
        originalNumber /= 10;
        ++num;
    }
 
    originalNumber = number;
 
    while (originalNumber != 0)
    {
        remainder = originalNumber%10;
        result += pow(remainder, num);
        originalNumber /= 10;
    }
 
    // điều kiện cho số Armstrong 
    if(result == number)
        flag = 1;
    else
        flag = 0;
 
    return flag;
}

Hy vọng những bài tập này sẽ hữu ích với các bạn. Chúc các bạn học tốt!

Tham khảo thêm: Bài tập Java cơ bản, có lời giải code mẫu

Thứ Sáu, 02/06/2023 16:49
4,157 👨 649.873
2 Bình luận
Sắp xếp theo
  • Phạm Yến
    Phạm Yến

    Một năm có 4 quý: quý 1 từ tháng 1 đến tháng 3; quý 2 từ tháng 4 đến

    tháng 6; quý 3 từ tháng 7 đến tháng 9; quý 4 từ tháng 10 đên tháng 12. Viết chương trình nhập vào 1 tháng, sau đó cho biết tháng đó là quý mấy?

    Thích Phản hồi 09:55 25/10
    • Thành Đạt Vũ
      Thành Đạt Vũ

      Mình chạy trên GDB vẫn bị báo sai😅

      Thích Phản hồi 20:17 20/11
      ❖ Lập trình C++