BÀI TẬP C++ CÓ LỜI GIẢI – Link tài liệu

Đây là danh mục bài tập C++ này chia làm 9 phần, mỗi phần có từ 3 đến 5 bài tập kèm lời giải chi tiết, với cấp độ khó tăng dần. Ban đầu bạn sẽ bắt đầu từ những bài tập C++ cơ bản, như mô phỏng phép tính 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 đó.v.v…

Dần dần sẽ là những bài nâng cao, 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.

BÀI TẬP C++ SỐ 1

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

In ra màn hình mô phỏng phép nhân 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

#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 viết 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 chuỗi

Viết hàm kiểm tra tính đối xứng của 1 chỗi ký tự. Trong hàm main nhập chuỗi ký tự từ bàn phím và cho biết chuỗi đó 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 chuoi ki tu : \n");
    fflush(stdin);
    gets(s);
    if (doixung(s))
      printf("Chuoi doi xung !");
    else printf("Chuoi 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 chuỗi

Viết hàm thống kê tần số xuất hiện mỗi ký tự trong một chuỗi ký tự. Hàm main nhập chuỗi 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 chuoi ki tu : \n");
    fflush(stdin);
    gets(s);
    thongke(s);
    printf("Tan so cac ky tu trong chuoi 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 chuỗi ký tự

Viết một hàm chuẩn hóa chuỗi ký tự: biến đổi chuỗi ký tự thành chuỗi sao cho trong chuỗi 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 chuỗi ký tự. Hàm main sử dụng các hàm này để nhập chuỗi ký tự từ bàn phím, in ra chuỗi trước và sau khi chuẩn hóa, số từ trong chuỗi và 1 từ dài nhất trong chuỗi đó.

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 chuoi ki tu : \n");
  gets(s);
  printf("\nChuoi ban dau:\n");
  puts(s);
  chuanhoa(s);
  printf("\nChuoi da chuan hoa:\n");
  puts(s);
  printf("\nSo tu cua chuoi : %d\n", sotu(s));
  printf("\nTu dai nhat trong chuoi : %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 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",
        ++i, p -> ma, p -> ten, p -> sotrang, p -> namxb);
    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ự.

#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

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

  • Facebook

  • Twitter

  • LinkedIn

  • More

Điều hướng bài viết