Hướng dẫn cài đặt và sử dụng Dev-C++

Dev-C++ là một môi trường phát triển tích hợp tự do (IDE) được phân phối dưới hình thức giấy phép Công cộng GNU hỗ trợ việc lập trình bằng C/C++. Nó cũng nằm trong bộ trình dịch mã nguồn mở MinGW. Chương trình IDE này được viết bằng ngôn ngữ Delphi.  Dùng để soạn thảo và biên dịch chương trình viết bằng NNLT C/ C++.

dev-c-yeulaptrinh.pw

Mình khuyên các bạn nên dùng phiên bản: Dev-Cpp 5.11 TDM-GCC 4.9.2 Setup.exe

Link tải trực tiếp từ server Vietnam: Download here

Link tải từ trang chủ:  https://sourceforge.net/projects/orwelldevcpp/files/Setup%20Releases/

Link tải các phiên bản khác: http://www.bloodshed.net/dev/devcpp.html

Thực hiện chương trình

B1. Tạo tệp mới và soạn thảo mã nguồn

  • Vào File > New > Source File (Hoặc Project nếu chương trình gồm nhiều file > Chọn “Console Application” > Chọn C project hoặc C++ Project) hoặc nhấn Ctrl+N
  • Soạn thảo mã nguồn
  • Lưu: File/Save/ đặt tên (chọn đường dẫn nếu có) > OK

dev-c-1-yeulaptrinh.pw

B2. Dịch chương trình

Kích Menu Execute > Compile (Ctrl+ F9)

dev-c-2-yeulaptrinh.pw

Nếu xuất hiện lỗi cú pháp, hãy quan sát dòng lệnh được đánh dấu màu nâu trong mã nguồn và các dòng gợi ý nội dung lỗi. Ta xác định lỗi và tự sửa lại, sau đó Cltr+F9 để biên dịch lại đến khi chương trình hết lỗi.

dev-c-3-yeulaptrinh.pw

Một số lỗi hay gặp: thiếu dấu chấm phảy ;, ngoặc tròng (,), ngoặc móc {,}, các phép quan hệ, các lệnh if, for, while không đúng cú pháp …

B3. Chạy chương trình

Kích menu Execute > Run (Ctrl+ F10)

dev-c-4-yeulaptrinh.pw

Nếu không dừng màn hình để xem kết quả ta thêm vào lệnh system(“pause”) trước lệnh return 0; trong hàm main(); hoặc kích menu tools/Enviroment options/ General/ chọn Pause console programs after return

I.7.3. Debug chương trình

Để theo dõi quá trình thực hiện của máy trên từng dòng lệnh và các giá trị thay đổi của biến ta sử dụng chức năng debug của phần mềm DevC++ theo hướng dẫn sau:

Bước 1:  Giả sử ta có chương trình sau:

dev-c-5-yeulaptrinh.pw

  • Tạo Breakpoint để chỉ nơi bắt đầu theo dõi chương trình bằng cách kích chuột vào số thứ tự dòng, xuất hiện nền của dòng đó có màu đỏ, sau đó kích menu

Execute/ Debug (hoặc nhấn phím F5)

  • Để theo dõi máy thực hiện từng dòng lệnh ta nhấn phím F7 hoặc kích nút Next line (dòng có nền xanh là dòng máy đang thực hiện đến đó)
  • Để xem giá trị của biến nào, ta kích nút Add wacth, gõ tên biến vào hộp thoại mới xuất hiện/ OK … như hình dưới đây.

dev-c-6-yeulaptrinh.pw

Giải thích thêm cho hình trên:

  • Đầu tiên tạo Breakpoint tại dòng 11, nhấn F5. Nền xanh tại dòng này x=8, y=3, z là giá trị chưa xácđịnh cụ thể. Nhấn phím F7, dòng xanh nhảy xuống dòng 12. Lệnh z = ++x + y–; được thực hiện:
  • Lệnh ++x thực hiện nên x=9 đến lệnh z = x+y và z=12 sau đó đến y –, khi đó y=2 như kết quả hiện thời trên khung debug.
  • Bằng cách nhấn F7 tiếp cho đến khi kết thúc hoặc kích nút Stop Execute để ngừng debug chương trình.

Lưu ý:

  • Để soạn theo nhanh một tệp C++, tao có thể mở cửa sổ Codeblocks và kích menu File/ New/ Empty file, một file trắng xuất hiện và ta bắt đầu soạn thảo mã nguồn tại đây, lưu, dịch và thực hiện chương trình một cách bình thường và nhanh. Chỉ có tồn tại là làm theo cách này không Debug được mã nguồn. Nếu muốn debug thì phải thêm tệp này vào một project nào đó và debug như cách hướng dẫn ban đầu.
  • Hai trình biên dịch DevC++ và Codeblocks đểu có thể biên soạn, lưu trữ, dịch, debug và thực hiện tốt những chương trình soạn thảo bằng C++. Vậy ta sẽ chọn chương trình nào để thực hành các bài tập trên máy? Điều này có lẽ tùy thuộc vào người sử dụng yêu thích biên dịch nào… Nếu bạn là người bắt đầu cho cả hai loại trên, theo ý tác giả bạn nên chọn Codeblocks vì chỉ một lý do DEBUG!!! Bạn có thể tìm hiểu qua các phương tiện thông tin khác và chọn cho mình một trình biên dịch để bắt đầu ngay.

Tạo bảng trong MySQL

Bảng Là Gì?

Mỗi một cơ sở dữ liệu thường gồm một hoặc nhiều bảng khác nhau. Mỗi một bảng gồm có các trường (cột) khác nhau. Ví dụ như bảng dưới đây gồm có 5 cột là ID, Họ, Tên, Ngày SinhGiới Tính.

ID Họ Tên Ngày Sinh Giới Tính
001 Anh 01/01/1992 Nữ
002 Nguyễn Bình 01/02/1992 Nam
003 Nguyễn Chung 01/03/1992 Nam

Mỗi bảng sẽ chứa dữ liệu của cơ sở dữ liệu.

Câu Lệnh CREATE TABLE

Câu lệnh CREATE TABLE trong MySQL được sử dụng để tạo bảng.

CREATE TABLE table_name ( 
    column_1_name TYPE_1, 
    column_2_name TYPE_2, 
    column_3_name TYPE_3, 
    ... 
);

Trong đó:

  • table_name là tên bảng sẽ được tạo ra.
  • columm_1_name là tên của trường đầu tiên (tương tự column_2_name, column_3_name…).
  • TYPE_1 là kiểu dữ liệu của trường column_1_name (tương tự TYPE_2, TYPE_3…)

Tên bảng và cột thường sử dụng chữ thường và phân biệt bởi dấu gạch dưới _. Tên kiểu dữ liệu của cột được quy định sẵn trong MySQL như INTEGER dành cho kiểu số nguyên, VAR_CHAR dành cho kiểu chuỗi ký tự ngắn, TEXT dành cho kiểu văn bản…

Ví Dụ

Câu lệnh dưới đây tạo một bảng với tên là students trong đó gồm có 5 trường:

> CREATE TABLE students ( 
    id INT(3) NOT NULL AUTO_INCREMENT, 
    first_name VARCHAR(50) NOT NULL, 
    last_name VARCHAR(50) NOT NULL, 
    gender INT(1) NOT NULL, 
    birthday DATE, 
    PRIMARY KEY (id) 
);

Trong đó:

  • Cột id là cột với kiểu dữ liệu số nguyên với tối đa 3 chữ số INT(3), không được bỏ trống NOT NULL và tự động tăng AUTO INCREMENT
  • Cột first_name là cột có kiểu dữ liệu VAR_CHAR với tối đa 5 ký tự. Cột này cũng không được phép bỏ trống NOT NULL.
  • Cột last_name là cột có kiểu dữ liệu VAR_CHAR với tối đa 5 ký tự. Cột này cũng không được phép bỏ trống.
  • Cột gender là cột với kiểu dữ liệu số nguyên với tối đa 1 chữ số INT(3)
  • Cột birthday là cột với kiểu dữ liệu DATE

Ngoài ra cột id được đánh là khoá chính PRIMARY KEY trong bảng.

Tạo database trong MySQL

Sử Dụng MySQL Client

MySQL Client là một chương trình cho phép chúng ta tương tác với máy chủ cơ sở dữ liệu (hay MySQL Database Server) sử dụng cửa sổ dòng lệnh. Trên cửa sổ dòng lệnh chương trình MySQL Client được chạy thông qua sử dụng tập tin nhị phân mysql.

Trên Linux sau khi cài đặt MySQL Client thì bạn có thể chạy câu lệnh sau để kiểm tra phiên bản của MySQL Client:

$ mysql --v

Trên Windows nếu bạn cài đặt MySQL sử dụng XAMPP hoặc WAMP thì bạn cần chắc chắn rằng địa chỉ thư mục chứa tập tin mysql.exe được đưa vào biến môi trường Environment Variables.

Để Tạo database sử dụng MySQL Client chúng ta cần thực hiện qua hai bước:

  • Bước 1: Đăng nhập vào máy chủ cơ sở dữ liệu.
  • Bước 2: Thực hiện câu lệnh tạo cơ sở dữ liệu.

Đăng Nhập Vào Máy Chủ Cơ Sở Dữ Liệu

Để đăng nhập vào máy chru cơ sở dữ liệu bạn sử dụng câu lệnh sau:

$ mysql -u root -p

Sau khi gõ Enter, bạn sẽ được yêu cầu nhập mật khẩu cho người dùng root. Sau khi đăng nhập thành công, MySQL Client sẽ cung cấp một phiên làm việc mà ở đó bạn có thể gửi các câu lệnh tới máy chủ MySQL Server mà không phải đăng nhập lại.

Thực Hiện Việc Tạo Cơ Sở Dữ Liệu

Tiếp theo sau khi đăng nhập thành công, bạn chạy câu lệnh dưới đây để tạo cơ sở dữ liệu my_test_db:

> CREATE DATABASE my_test_db;

Lưu ý con trỏ trên cửa sổ dòng lệnh (hay command prompt) lúc này chuyển thành biểu tượng < thay vì biểu tượng $. Điều này có nghĩa rằng bạn đã đăng nhập thành công và đang trong phiên làm việc với máy chủ MySQL Server dưới tên người dùng là root.

Để kiểm tra lại cơ sở dữ liệu đã được tạo ra bằng câu lệnh sau:

> show databases

Sử Dụng MySQL Admin

Ngoài việc sử dụng chương trình MySQL Client để tạo cơ sở dữ liệu thì chúng ta có thể sử dụng một cách khác đó là thông qua chương trình MySQL Admin. Chương trình MySQL Admin được cài đặt mặc định cùng với chương trình MySQL Client khi cài đặt MySQL Server.

Trên cửa sổ dòng lệnh bạn chạy câu lệnh sau để tạo cơ sở dữ liệu với tên my_test_db:

$ mysqladmin -u root -p create my_test_db

Nhập mật khẩu cho người dùng root và sau đó kiểm tra lại cơ sở dữ liệu đã được tạo ra bằng câu lệnh sau:

$ mysqladmin -u root -p show databases

Chọn database trong MySQL

Một MySQL Database Server thường được dùng để lưu trữ nhiều cơ sở dữ liệu cùng một lúc. Khi làm việc với MySQL Database Server thông thường chúng ta sẽ gửi các câu truy vấn (query) tới một cơ sở dữ liệu nhất định.

Sau khi sử dụng MySQL Client để truy cập vào MySQL Database Server với tên người dùng root:

$ mysql -u root -p

Với mỗi câu truy vấn gửi tới một cơ sở dữ liệu chúng ta trên MySQL Database Server thì MySQL Database Server cần phải biết được rằng câu lệnh đó sẽ được chạy trên cơ sở dữ liệu nào.

Ví dụ sau khi đăng nhập vào MySQL Server sử dụng MySQL Client và chạy câu lệnh sau:

> SHOW TABLES;

MySQL Server sẽ báo lỗi No database selected về cho MySQL Client.

Để chọn cơ sở dữ liệu trên MySQL Server làm cơ sở dữ liệu mặc định khi làm việc bạn sử dụng câu lệnh sau:

> USE db_name

Trong đó db_name là tên của cơ sở dữ liệu bạn muốn chọn để lam việc.

Câu lệnh dưới đây chọn my_test_db làm cơ sở dữ liệu mặc định khi làm việc với MySQL Database Server:

> USE my_test_db;

Trong các câu lệnh tiếp sau đó MySQL Server sẽ áp dụng trên cơ sở dữ liệu my_test_db:

> SHOW TABLES;

Câu lệnh trên sẽ liệt kê ra các bảng (table) được tạo ra trên cơ sở dữ liệu my_test_db.

Để chuyển sang sử dụng cơ sở dữ liệu khác làm cơ sở dữ liệu mặc định khi làm việc với MySQL Database Server, bạn chạy câu lệnh sau:

> USE my_new_db;

Câu lệnh USE sẽ chỉ chọn cơ sở dữ liệu trong phiên làm việc hiện tại. Ở các phiên làm việc sau đó bạn cần chạy lại câu lệnh này.

STABLE – spoj

Đề bài:

Thuật toán:

  • BFS từ đỉnh S
  • Gọi bac[i] là đồ dài đường đi ngắn nhất từ s đến i
    • bac[i] = bac[j] + 1
    • với i kề j và j duyệt BFS trước i
  • ok[i] = 1 nếu i ổn định, ok[i] = 0 nếu i không ổn định.
  • Hãy tham khảo code để biết cách kiểm tra xem i có ổn định không

Code:

#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for (int i=(a),_b=(b);i<=_b;i=i+1)
#define FORD(i,b,a) for (int i=(b),_a=(a);i>=_a;i=i-1)
#define REP(i,n) for (int i=0,_n=(n);i<_n;i=i+1)
#define FORE(i,v) for (__typeof((v).begin()) i=(v).begin();i!=(v).end();i++)
#define ALL(v) (v).begin(),(v).end()
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define double db
typedef long long ll;
typedef pair<int,int> PII;
const ll mod=1000000007;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const int MAXN = 1E4+3;
const int oo = 1e9+3;
 
int n, m, s, u, v, res, bac[MAXN],adj[MAXN][MAXN];
bool ok[MAXN];
queue<int> q;
vector<int> a[MAXN];
 
int main() {
    	#ifndef ONLINE_JUDGE
    	freopen("test.inp", "r", stdin);
    	freopen("test.out", "w", stdout);
    	#endif
    cin >> n >> m >> s;
    FOR(i,1,m) {
        cin >> u >> v;
        if (!adj[u][v])
            a[u].push_back(v);
        adj[u][v] = 1;
    }
    q.push(s); bac[s] = 1;
    while (!q.empty()) {
        u = q.front();
        q.pop();
        for(int i=0; i<a[u].size(); i++)
        {
            v = a[u][i];
            if (!bac[v])
            {
                if (ok[u]) ok[v] = 1;
                bac[v] = bac[u] + 1;
                q.push(v);
            }
            else
            if (bac[v] == bac[u] + 1) ok[v] = 1;
        }
    }
    FOR(i,1,n) if (ok[i]) res++;
    cout << res;
	return 0;
}
const
  fi='stable.inp';
  fo='stable.out';
  maxn=10000;
  maxm=50000;
var
  link,head,ke : array[1..maxm] of longint;
  i,j,n,m,st,ans,s,dau,cuoi,u,v : longint;
  q,bac : array[1..maxn] of longint;
  ok : array[1..maxn] of boolean;
  a : array[1..maxn,1..maxn] of boolean;
procedure push(x : longint);
  begin
    inc(cuoi);
    q[cuoi] := x;
  end;
procedure add(i,u,v : longint);
  begin
    link[i] := head[u];
    head[u] := i;
    ke[i] := v;
  end;
begin
//  assign(input,fi);reset(input);
//  assign(output,fo);rewrite(output);
  read(n,m,s);
  for i := 1 to m do
    begin
      read(u,v);
      if a[u,v] = false then
      add(i,u,v);
      a[u,v] := true;
    end;
  dau := 1; cuoi := 0;
  push(s);
  bac[s] := 1;
  while (dau <= cuoi) do
    begin
      u := q[dau];
      inc(dau);
      i := head[u];
      while i <> 0 do
        begin
          v := ke[i];
          if bac[v] = 0 then
            begin
              if ok[u] then ok[v] := true;
              bac[v] := bac[u] + 1;
              push(v);
            end
            else
          if bac[v] = bac[u] + 1 then
            begin
              ok[v] := true;
            end;
          i := link[i];
        end;
    end;
  for i := 1 to n do
    if ok[i] then inc(ans);
  writeln(ans);
//  close(input);close(output);
end.

listgame – kattis

Đề bài
Thuật toán
Code

UPGRANET – spoj

Đề bài:


Thuật toán:


Ta thấy thông lượng truyền tin từ u đến v là giá trị lớn nhất của cạnh nhỏ nhất trên mọi con đường từ u đến v.
Vì vậy, ban đầu, ta sẽ xây dựng cây khung lớn nhất(tương tự như cây khung nhỏ nhất nhưng sort ngược lại).

Gọi dis(u,v) là cạnh có trọng số nhỏ nhất khi đi từ u đến v trên cây vừa tạo. Ta chọn nút 1 làm gốc, duyệt dfs để lưu trữ cạnh nhỏ nhất và các nút cha của u khi đi từ 1 đến u (đều dùng RMQ). Với mỗi 1 cạnh không nằm trong cây khung, ta tìm nút cha chung gần nhất(gọi là p), kết quả cộng thêm một lượng bằng hiệu của min(dis(u, p), dis(v, p)) và rọng số cạnh đang xét.

Code:


#include <bits/stdc++.h>
#define maxn 1000005
#define maxm 10000005
#define maxc 1000000007
#define mp make_pair
#define pb push_back
#define F first
#define S second
#define pii pair<long long, long long>
#define fort(i, a, b) for(int i = (a); i <= (b); i++)
#define ford(i, a, b) for(int i = (a); i >= (b); i--)
#define Task "UPGRANET"
#define fast ios_base::sync_with_stdio(0);cin.tie();cout.tie();
#define stop1 {cout << "-1\n"; return;}
#define stop2 {cout << "0\n"; return;}
#define stop3 {cout << "yes\n"; exit(0);}
#define skip1 {cout << "Yes\n"; continue;}
#define skip2 {cout << "No\n"; continue;}
#define ll long long
 
using namespace std;
 
ll n, m, root[maxn], h[maxn], res;
pii  par[maxn][20];
bool dd[maxn];
vector<pair<ll, ll> > ke[maxn];
struct canh
{
    ll u, v, w;
}ed[maxn];
 
void setup()
{
    cin >> n >> m;
    fort(i, 1, m)
        cin >> ed[i].u >> ed[i].v >> ed[i].w;
}
 
bool cmp(canh p, canh q)
{
    return p.w > q.w;
}
 
ll getroot(ll u)
{
    if(root[u] == 0) return u;
    return root[u] = getroot(root[u]);
}
 
void make_tree()
{
    sort(ed+1, ed+m+1, cmp);
    fort(i, 1, m)
    {
        ll p = getroot(ed[i].u);
        ll q = getroot(ed[i].v);
        if(p == q) continue;
        root[p] = q;
        dd[i] = 1;
        ke[ed[i].u].pb(mp(ed[i].v, ed[i].w));
        ke[ed[i].v].pb(mp(ed[i].u, ed[i].w));
    }
}
 
void dfs(ll u, ll tr)
{
    fort(i, 0, int(ke[u].size()) - 1)
    {
        ll v = ke[u][i].F;
        if(v == tr) continue;
        h[v] = h[u] + 1;
        par[v][0] = mp(u,ke[u][i].S);
        fort(j, 1, 18)
        {
            par[v][j].F = par[par[v][j-1].F][j-1].F;
            par[v][j].S = min(par[par[v][j-1].F][j-1].S, par[v][j-1].S);
        }
        dfs(v, u);
    }
}
 
pii lca(ll u, ll v)
{
    pii p;
    p.S = 1ll* maxc * maxc;
    if( h[u] > h[v])
        swap(u, v);
    ll diff = h[v] - h[u];
    ford(i, 18, 0)
        if((diff >> i) & 1)
        {
            p.S = min(p.S, par[v][i].S);
            v = par[v][i].F;
 
        }
    if(v == u) return mp(u, p.S);
    ford(i, 18, 0)
        if(par[u][i].F != par[v][i].F)
        {
            p.S = min(p.S, min(par[v][i].S, par[u][i].S));
            v = par[v][i].F;
            u = par[u][i].F;
        }
    return mp(par[u][0].F, min(p.S, min(par[u][0].S, par[v][0].S)));
}
 
void work()
{
    make_tree();
    h[1] = 1;
    dfs(1, 0);
    fort(i, 1, m)
        if(!dd[i])
        {
            pii l = lca(ed[i].u, ed[i].v);
            res += max(0ll, l.S - ed[i].w);
        }
    cout << res;
}
 
 
int main()
{
    fast
  //  freopen(Task".inp", "r", stdin);
  //  freopen(Task".out", "w", stdout);
    setup();
    work();
    return 0;
}

Cowboy