Chuyển đến nội dung chính

Bài đăng

Đang hiển thị bài đăng từ tháng bảy, 2013

[C\C++] Ví dụ sử dụng cấu trúc trong lập trình C\C++ [struct SV]

Ví dụ: Viết các hàm thực hiện
 - Nhập thông tin SV gồm: họ tên, địa chỉ, tuổi, điểm toán, lý, hóa  - Tính điểm tổng kết  - In thông tin sinh viên
  Ví dụ nhập thông tin cho 1 sinh viên
[Code Turbo C++]
#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>

// Dinh nghia cau truc SV
struct SV{
 char ht[30],dc[50];
 int tuoi;
 float dT,dL, dH;
};

// Khai bao bien cau truc
SV a;

// Ham nhap thong tin
void NhapTT(){   fflush(stdin); // xu ly bo dem cho viec nhap mot xau
  cout<<"\n NHAP THONG TIN CHO SINH VIEN ";
  cout<<"\n - Ho ten: "; gets(a.ht);
  cout<<"\n - Dia chi: "; gets(a.dc);
  cout<<"\n - Tuoi: "; cin>>a.tuoi;
  cout<<"\n - Diem toan: "; cin>>a.dT;
  cout<<"\n - Diem ly: "; cin>>a.dL;
  cout<<"\n - Diem hoa: "; cin>>a.dH;
 }

// Ham Tinh diem
float TinhDiem(){
 return (a.dT+a.dL+a.dH)/3;
}

// Ham In tho…

[C\C++] Tính Định thức của ma trận [Xử lý ma trận - mảng 2 chiều]

Ý tưởng thuật toán: ta tiến hành phân rã ma trận A = L.U .

Ta có:Det(A)=Det(L)*Det(U) Det(L) = 1 nên Det(A) = Det(U).

Ví dụ ma trận:



[Code Turbo C++]
#include "conio.h" #include "iostream.h" #define max 100
/*Nhap ma tran*/ void Nhap(float A[max][max],int n) {   for(int i = 0; i<n; i++)     for(int j = 0; j<n; j++) {       cout<<"a["<<i<<"]["<<j<<"] = ";       cin>>A[i][j];    } }
/*Xuat ma tran*/ void XuatMaTran(float A[max][max], int n) {   cout<<"\n";   for(int i=0 ; i<n; i++){     cout<<endl;     for(int j=0 ; j<n; j++)       cout<<A[i][j]<<"\t";  } }
/*Phan ra A = LU*/ void PhanRaLU(float A[max][max], float L[max][max], float U[max][max], int n) {   for(int k = 0; k<n; k++) {   U[k][k] = A[k][k];   L[k][k] = 1;   for(int i=k+1; i<n; i++) {     L[i][k] = A[i][k]/U[k][k];     U[k][i] = A[k][i];     U[i][k] = 0;     L[k][i] = 0;   }   …

[C\C++] Giải hệ phương trình tuyến tính dựa vào phân rã LU [Xử lý ma trận - mảng 2 chiều]

Ý tưởng giải thuật: cho hệ phương trình tuyến tính tổng quát A.X = B . Ta tiến hành phân rã A = L.U . Trong đó, L là ma trận tam giác dưới và U là ma trận tam giác trên.
Khi đó,
[Code Turbo C++]

#include "conio.h"
#include "iostream.h"
#define max 100

/*Nhap ma tran he so*/
void Nhap(float A[max][max],int n) {
 for(int i = 0; i<n; i++)
   for(int j = 0; j<n; j++) {
    cout<<"a["<<i<<"]["<<j<<"] = ";
    cin>>A[i][j];
  }
}

/*Nhap ma tran he so tu do*/
void Nhap(float B[max],int n) {
  for(int i = 0; i<n; i++) {
   cout<<"b["<<i<<"] = ";
   cin>>B[i];
 }
}

/*Xuat ma tran he so tu do*/
void Xuat(float B[max],int n) {
    cout<<"(";
    for(int i = 0; i<n-1; i++)
     cout<<B[i]<<",";
   cout<<B[n-1]<<")";
}

/*Xuat ma tran*/
void Xuat(float A[max][max], int n) {
  cout<<"\n"…

[C\C++] Thuật toán phân rã ma trận A = LU [Xử lý ma trận - mảng 2 chiều]

Bài toán: Quá trình chuyển hoá ma trận A ban đầu thành tích hai ma trận tam giác L.U dựa vào phép khử Gauss được thực hiện bằng các phép nhân ma trận. Thuật toán này được gọi là thuật toán Crout. Quá trình Crout bao gồm nhiều bước hồi quy. Nếu ma trận A có cấp n x n ta cần n -1 bước. Thuật toán được thể hiện cụ thể như sau:


[Code Turbo C++]
#include "iostream.h" #define max 100
// ham nhap ma tran void Nhap(float A[max][max],int n) {  for(int i = 0; i<n; i++)   for(int j = 0; j<n; j++) {    cout<<"a["<<i<<"]["<<j<<"] = ";    cin>>A[i][j];   } }
// ham xuat ma tran void XuatMaTran(float A[max][max], int n) {  cout<<"\n";  for(int i=0 ; i<n; i++){    cout<<endl;    for(int j=0 ; j<n; j++)      cout<<A[i][j]<<"\t";   } }
/*Phan ra A = LU*/ void PhanRaLU(float A[max][max], float L[max][max], float U[max][max], int n) {  for(int k =0; k<n; k++) {   U[k][k] =…

[C\C++] Giải hệ phương trình tuyến tính dạng tam giác dưới [Xử lý ma trận - mảng 2 chiều]

Bài toán: Viết chương trình giải hệ phương trình tuyến trính dạng tam giác dưới



[Code Turbo C++]

#include "conio.h"
#include "iostream.h"
#define max 100
//Nhap ma tran tam giac duoi
void Nhap(float A[max][max],int n) {
for(int i = 0; i<n; i++)
for(int j = 0; j<=i; j++) {
cout<<"a["<<i<<"]["<<j<<"] = ";
cin>>A[i][j];
}
}
/*Nhap ma tran he so tu do*/
void Nhap(float B[max],int n) {
for(int i = 0; i<n; i++) {
cout<<"b["<<i<<"] = ";
cin>>B[i];
}
}
/*Xuat ma tran he so tu do*/
void Xuat(float B[max],int n) {
cout<<"(";
for(int i = 0; i<n-1; i++)
cout<<B[i]<<",";
cout<<B[n-1]<<")";
}
/*Xuat ma tran*/
void Xuat(float A[max][max], int n) {
cout<<"\n";
for(int i=0 ; i<n; i++){
cout<<endl;
for(int j=0 ; j<n; j++)
if(i<j)
cout<<"0\t";
else
cout<<A[i][j]<<"\t";
}
}
/…

[C\C++] Giải hệ phương trình tuyến tính dạng tam giác trên [Xử lý ma trận - mảng 2 chiều]

Bài toán: Viết chương trình giải hệ phương trình tuyến tính dạng tam giác trên



[Code Turbo C++ 3.0]
#include "conio.h"
#include "iostream.h"
#define max 100
//Nhap ma tran tam giac tren
void Nhap(float A[max][max],int n) {
for(int i = 0; i<n; i++)
for(int j = i; j<n; j++) {
cout<<"a["<<i<<"]["<<j<<"] = ";
cin>>A[i][j];
}
}
/*Nhap ma tran he so tu do*/
void Nhap(float B[max],int n) {
for(int i = 0; i<n; i++) {
cout<<"b["<<i<<"] = ";
cin>>B[i];
}
}
/*Xuat ma tran he so tu do*/
void Xuat(float B[max],int n) {
cout<<"(";
for(int i = 0; i<n-1; i++)
cout<<B[i]<<",";
cout<<B[n-1]<<")";
}
/*Xuat ma tran*/
void Xuat(float A[max][max], int n) {
cout<<"\n";
for(int i=0 ; i<n; i++){
cout<<endl;
for(int j=0 ; j<n; j++)
if(i>j)
cout<<"0\t";
else
cout<<A[i][j]<<"\t";
}

[C\C++] Một số phép toán cơ bản trên ma trận [Xử lý ma trận - mảng 2 chiều]

Bài toán: Viết chương trình thực hiện các phép toán trên ma trận:
[Code Turbo C++ 3.0]

#include "conio.h"
#include "iostream.h"
#define max 100
/*Nhap ma tran he so*/
void NhapMaTran(float A[max][max], int m, int n, char ch) {
for(int i = 0; i<m; i++)
for(int j = 0; j<n; j++) {
cout<<ch<<"["<<i<<"]["<<j<<"] = ";
cin>>A[i][j];
}
}
/*Xuat ma tran*/
void XuatMaTran(float A[max][max], int m, int n) {
for(int i=0 ; i<m; i++){
cout<<endl;
for(int j=0 ; j<n; j++)
cout<<A[i][j]<<"\t";
}
}
/*C = A+B*/
void CongMaTran(float A[max][max], float B[max][max], float C[max][max], int m, int n) {
for(int i = 0; i<m; i++)
for(int j = 0; j<n; j++)
C[i][j] = A[i][j]+B[i][j];
}
/*A cap mxn * B cap nxp = C cap mxp*/
void NhanMaTran(float A[max][max],float B[max][max], float C[max][max],int m,int n,int p)
{
for(int i = 0; i<m; i++)
for(int k = 0; k<p; k++) {
C[i][k]=0;
for(int j = 0; j<n; j++)
C…

[C\C++] Nhập xuất ma trân [Xử lý ma trận - mảng 2 chiều]

Bài toán: Viết chương trình nhập vào ma trận chứa các số thực có kích thức không quá 100. In ma trận (theo dạng bảng số) ra màn hình.
Ví dụ: 

[Code Turbo C++]


#include <conio.h>
#include <iostream.h>
#define max 100
float A[max][max];  // khai bao ma tran A
/*Nhap ma tran he so*/
void NhapMaTran(int m, int n) {
 for(int i = 0; i<m; i++)
  for(int j = 0; j<n; j++) {
    cout<<"a["<<i<<"]["<<j<<"] = ";
    cin>>A[i][j];
  }
}
/*Xuat ma tran*/
void XuatMaTran(int m, int n) {
  for(int i=0 ; i<m; i++){
    cout<<endl;
    for(int j=0 ; j<n; j++)
     cout<<A[i][j]<<"\t";
  }
}
/*Chuong trinh chinh*/
void main() {
  int m, n;
  clrscr();
// nhap kich thuoc ma tran
  do{
  cout<<"Nhap so dong m = ";
  cin>>m;
  if (m<1||m>max) cout<<"\n nhap lai m";
 }while(m<1||m>max);
do{
  cout<<"Nhap so dong n = ";
  cin>…

[ Search ] Tìm kiếm nhị phân [Code C++]

Thuật toán tìm kiếm nhị phân - Binary sort 

Ý tưởng của thuật toán: 
Phép tìm kiếm nhị phân được thực hiện trên dãy khoá có thứ tự (xét dãy tăng dần):
 a[0]<=a[1]<=a[2]<=...<=a[n-1]. Giá trị cần tìm x.

Chia đôi dãy khoá cần tìm kiếm. So sánh khoá giữa dãy với x, có 3 trường hợp xãy ra:
-  Giá trị khoá này bằng x, tìm kiếm thành công
-  Giá trị khoá này lớn hơn x, thì ta tiến hành tìm x với nữa bên trái của khoá này
-  Giá trị khoá này nhỏ hơn x, thì ta tiến hành tìm x với nữa bên phải của khoá này

Trường hợp tìm kiếm thất bại khi dãy khoá cần tìm không có phần tử nào.

Cài đặt Thuật toán [code Turbo C\C++]:

/*Thuật toán tìm kiếm nhị phân không đệ quy*/

int BinarySearch(int x, int a[],int n) // Tìm khoá x trong dãy a1,a2…,an
{

 int  left =0; //Left trỏ về chỉ số đầu dãy
 int right =n-1; //right trỏ về vị trí cuối dãy
 int mid; // mid trỏ vào giữa dãy
 int found = 0; //dùng để xác tìm thành công hay không (0: không tìm thấy, 1: tìm thấy)

 while (left <= right && found…

[ Search ] Tìm kiếm tuần tự [Code C++]

Thuật toán tìm kiếm tuần tự - Sequential search

Ý tưởng thuật toán: xét dãy số cần tìm có n phần tử: a[0], a[1], a[2], ... , a[n-1]. Giá trị cần tìm là x.
 - Bắt đầu từ khoá đầu tiên, lần lượt so sánh khoá x với khoá tương ứng trong dãy.
 - Quá trình tìm kiếm kết thúc khi tìm được khoá thoả mãn hoặc đi đến hết dãy hoặc gặp điều kiện dừng vòng lặp.

Ví dụ: Cho dãy số a[]={1,25,6,5,2,37,40}; tìm phần tử x=37
Kết quả là tìm thấy x trong dãy.

Cài đặt thuật toán:
Có 2 thuật toán tìm tuần tự trên dãy khoá đầu vào khác nhau. 

[Code Turbo C++]

+ Trên dãy khoá chưa sắp xếp

int SequentialSearch(int x, int a[],int  n){
 int i =1;
  while (i <n &&a[i]!=x)
    i = i+1;
  return (i);  // nếu giá trị trả về là i<=n-1 (tìm thấy), i=n (không tìm thấy)
}

+ Trên dãy khoá đã được sắp xếp

int SequentialSearch (int x, int a[], int n){
  int i =1;
  while (i <=n && a[i]<x) i = i+1;

  if (a[i]==x) return 1;
  else return 0; // giá trị trả về là 1 (tìm thấy), 0 (không tìm thấy)
}

// Đề ngh…

[ Sort ] Thuật toán Insert-Sort [Code C++]

 Thuật toán Insert-Sort

Ý tưởng thuật toán: xét dãy n phần tử a[0], a[1], a[2] ,..., a[n-1].
- Xem dãy gồm 1 phần tử a[0] là dãy có thứ tự.
- Thêm a[1] vào dãy có thứ tự a[0] sao cho dãy mới a[0], a[1] là dãy có thứ tự. Nếu a[1] < a[0] ta đổi chỗ a[1] với a[0].
- Thêm a[2] vào dãy có thứ tự a[0], a[1] sao cho dãy mới a[0], a[1], a[2] là dãy có thứ tự.
- Tương tự, tiếp tục như thế đến n – 1 bước ta sẽ có dãy có thứ tự.

Ví dụ: sử dụng thuật toán Insertion Sort sắp xếp dãy {3,7,22,3,1,5,8,4,3,9} theo thứ tự tăng dần.


Kết quả sau khi đã thực hiện thuật toán: {1,3,3,3,4,5,7,9,22}
Cài đặt thuật toán:
[Code Turbo C++]
#include <iostream.h>
#include <conio.h>
#define max 100
//nhap day
void NhapDay(int a[],int n) {
   for(int i=0; i<n; i++) {
    cout<<"\n a["<<i<<"] =";
    cin>>a[i];
   }
}
//xuat day
void XuatDay(int a[],int n) {
   cout<<"\n IN DAY: ";
   for(int i=0; i<n; i++)
     cout<<a[i]<<&quo…

[ Sort ] Thuật toán Selection-Sort [Code C++]

 Thuật toán Selection-Sort

Ý tưởng thuật toán: xét dãy n phần tử a[0], a[1], a[2] ,..., a[n-1].  - Chọn trong dãy a[0], a[1], a[2] ,..., a[n-1] ra phần tử có khỏa nhỏ nhất và đổi chỗ nó với a[0].
 - Chọn trong dãy a[1], a[1], a[2] ,..., a[n-1] ra phần tử có khỏa nhỏ nhất và đổi chỗ nó với a[1].
 - Tương tự, tiếp tục như thế sau n – 1 bước ta thu được danh sách có thứ tự.

Ví dụ: Sau 9 bước lặp ta thu được dãy đã được sắp xếp: {2, 3, 4, 5, 6, 6, 7, 7, 8, 9}.
[Mô phỏng]

Kết quả sau 9 bước lặp ta thu được dãy đã được sắp xếp: {2, 3, 4, 5, 6, 6, 7, 7, 8, 9}.

Cài đặt thuật toán:

[Code Turbo C++]

#include <iostream.h>
#include <conio.h>
#define max 100
//nhap day
void NhapDay(int a[],int n) {
  for(int i=0; i<n; i++) {
    cout<<"\n a["<<i<<"] =";
    cin>>a[i];
  }
}
//xuat day
void XuatDay(int a[],int n) {
  cout<<"\n IN DAY: ";
  for(int i=0; i<n; i++)
    cout<<a[i]<<"\t";
}
//hoan vi 2 phan …

[ Sort ] Thuật toán Bubble-Sort [Code C++]

Thuật toán Bubble-Sort

Ý tưởng thuật toán:  - Xuất phát từ phần tử cuối danh sách ta tiến hành so sánh với phần tử bên trái của nó.
 - Nếu phần tử đang xét có khóa nhỏ hơn phần tử bên trái của nó ta tiến đưa nó về bên trái của dãy bằng cách hoán vị với phần tử bên trái của nó.
 - Tiếp tục thực hiện như thế đối với bài toán có n phần tử thì sau n – 1 bước ta thu được danh
sách tăng dần.

Ví dụ: sử dụng thuật toán Bubble Sort sắp xếp dãy số {3, 10, 4, 6, 2, 6, 15, 3, 9,7} theo thứ tự tăng dần.


Sau 9 bước lặp ta thu được dãy đã được sắp xếp: {2, 3, 3, 4, 6, 6, 7, 9, 10, 15}.

Cài đặt thuật toán:
[ Code Turbo C++]

#include <iostream.h>
#include <conio.h>
#define max 100
//nhap day
void NhapDay(int a[],int n) {
  for(int i=0; i<n; i++) {
   cout<<"\n a["<<i<<"] =";
   cin>>a[i];
  }
}
//xuat day
void XuatDay(int a[],int n) {
  cout<<"\n IN DAY: ";
  for(int i=0; i<n; i++)
cout<<a[i]<<"\t";
}
//ho…