Bài 2 : Những Vấn Đề Cơ Bản Trong C++

1181

Ở bài viết mình đã giới thiệu với các bạn thế nào là lập trình hướng đối tượng c++  và ở bài viết này mình cùng các bạn sẽ đi làm rõ vấn đề cơ bản trong lập trình c++ là gì? Nào chúng ta cùng bắt đầu nhé

Vấn đề cơ bản trong c++

1. Cấu trúc chương trình

Xét ví dụ sau:

#include <iostream>
using namespace std;
int main()
{
  cout << “Hello world \n”;
  return 0;
}
  • #include: yêu cầu chương trình dịch chèn thêm file vào mã nguồn.
  • using namespace
  • cout nằm trong namespace std;
  • Hàm main()
  • Câu lệnh: kết thúc bởi dấu “;”
  • Câu chú thích: Câu chú thích bắt đầu bằng dấu // hoặc nằm trong /* */.

2. Biến

  • Phải khai báo biến trước khi sử dụng
  • Có thể khai báo biến ở mọi nới trong chương trình
  • Tên biến
  • Phân biệt chữ hoa, chữ thường
  • Sử dụng các ký tự từ a-z, 0-9 và dấu “_”
  • Ví dụ:
    • nint var1;
    • nint var2=10;

Kiểu giữ liệu đơn giản

  • Kiểu nguyên: int, long, short
  • Kiểu ký tự: char – lưu mã ASCII của ký tự
  • Ký tự nằm trong dấu ‘’. Ví dụ: ‘a’
  • Ký tự đặc biệt: \n, \tab, \\, \’, \”, …
  • Kiểu không dấu: unsigned char, unsigned int, unsigned short, unsigned long
  • Kiểu dấu phẩy động: float, double, long double
  • Kiểu bool: có giá trị True/False

table-c

Kiểu String

  • string không phải là kiểu cơ bản trong C++
  • string được định nghĩa trong lớp chuẩn string
#include <iostream>
#include <string>
using namespace std;
int main ()
{
	string mystring;
	mystring = "This is the initial string content";
	cout << mystring << endl;
	mystring = "This is a different string content";
	cout << mystring << endl;
	return 0;
}

Biến hằng (Constant Variables)

  • Giá trị của hằng không thay đổi.
  • Có 2 cách khai báo hằng:
    • const float PI=3.14;
    • #define PI 3.14
      • Định nghĩa ở đầu chương trình
      • Không xác định kiểu của PI

3. Toán Tử

Toán tử toán học

  • +, -, *, /, %
int i = 1/3;  // kết quả i = 0
float x = 1.0/3;    // kết quả x=0.3333
int j = 7 % 3;     // kết quả j=1
  • ++, —
int i=3;
int j=7;
cout << 10 * i++;    // hiển thị 30, sau đó i=4
cout <<  10 * ++j;  // hiển thị 80, sau đó j=8
  • +=, -=, *=, /=
  float x=6.0;
  x+=3.5; tương tự x=x+3.5;

Toán tử quan hệ

  • So sánh 2 giá trị.
  • Kết quả trả về là true hoặc false
  • >, <, ==, !=, >=, <=
  • Ví dụ:

int x=44;
int y=12;
(x == y)   // false
(x >= y)   // true
(x != y)    // true

Toán tử logic

  • logical and : &&
    • (x >= 5) && ( x <= 15)   // true  nếu x nằm trong [5,15]
  •  logical or : ||
    • (x == 5) || ( x == 10)   // true nếu x=5 hoặc x=10
  •  logical negation : !
    • ! (x == 5)                      // true nếu x khác 5
    • Tương tự x != 5
  • Toán tử điều kiện (conditional operator) : ? … :
  • <condition> ? <true expression> : < false expression>
    • Ví dụ:

      min = (alpha<beta) ? alpha : beta;

    • Tương tự

       

      if (alpha < beta)
      min = alpha;
      else
      min = beta;

       

4. Thao tác vào ra chuẩn

  • Sử dụng đối tượng stream để thực hiện các thao tác input/output
  • Được khai báo trong header file iostream

Sử dụng cout

  • cout là một đối tượng được định nghĩa trước trong C++, tương ứng với luồng ra chuẩn (standard output stream).
  • Toán tử << là toán tử chèn, định hướng nội dung cần hiển thị.
  • Ví dụ:
string str=”Hello world”;
int i=8;
cout << str << endl;  // endl (hoặc \n) là dấu hiệu xuống dòng.
cout << ”i=” << i << endl;
  • Để định dạng nội dung hiển thị, sử dụng setw (nằm trong iomanip)
    • cout<< setw(12) << str << setw(5) << i;
    • Kết quả: Hello world     8

Sử dụng cin

  • cin là toán tử được định nghĩa trước trong C++, tương ứng với luồng vào chuẩn (standard input stream).
  • Toán tử >> đưa nội dung từ luồng vào chuẩn vào biến.
  • Ví dụ :
int temperature;
	cout << ”Enter temperature in Celsius: ”;
	cin >> temperature;
int a,b;
	cin>>a>>b;	// tương đương		cin>>a;
						cin>>b;

Cin và String

  • cin>>mystring
  • cin dừng khi nhập dấu cách
  • Để lưu cả dòng khi nhập, sử dụng getline
#include <iostream>
		#include <string>
		using namespace std;
		int main ()
		{
			string mystr;
			cout << "What's your name? ";
			getline (cin, mystr);
			cout << "Hello " << mystr << ".\n";
			cout << "What is your favorite team? ";
			getline (cin, mystr);
			cout << "I like " << mystr << " too!\n";
			return 0;
		}

Header File và Library File

  • Một số nhiệm vụ được thực hiện bởi Library Function.
  • Header File chứa khai báo các hàm mà ta cần sử dụng trong chương trình.
  • Ví dụ:
  • #include <math.h>
  • #include ”myprog.h”
  • <>: yêu cầu chương trình dịch tìm từ thư mục chuẩn.
  • ” ” : yêu cầu chương trình dịch tìm từ thư mục hiện tại.
  • Nếu không include Header File thích hợp thì chương trình dịch sẽ báo lỗi.

header

5. Các câu lệnh

  • Vòng lặp
  • Rẽ nhánh
  • Một số lệnh điều khiển khác

Vòng lặp for

vong-lap-for-c2

int i;
for (i=1; i<=15; i++) // thân vòng lặp for có 1 lệnh
   cout << i*i << ” ”;  
cout << endl;

for (i=1; i<=15; i++)   // thân vòng lặp for có nhiều lệnh
{
   cout << setw(4) << i << ” ”;  
   // setw(n) gán kích thước của trường hiển thị bằng n
   int cube = i*i*i;
   cout << setw(6) << cube << endl;
}

Vòng lặp while

  • Vòng lặp while được sử dụng khi không biết trước số lần lặp.
  • Lặp cho đến khi biểu thức kiểm tra vẫn có giá trị True.
  • Ví dụ:

 

char c=’n’;
  while ( c != ’y’)
{
  cout << ”Do you want to continue: (y/n)” << endl;
  cin >> c;
}

 while ( c != ’y’ )   ⇐ test expression

{

}

vong-lap-while-c2

Vòng lặp do

  • Trong vòng lặp do, biểu thức kiểm tra được đánh giá ở cuối vòng lặp.
  • Thân vòng lặp được thực hiện ít nhất một lần.
  • Ví dụ:
char c;
	do
	{
		cout << ”Do you want to continue: (y/n)” << endl;
		cin >> c;
	}
	while ( c != ’y’);
do 
{  … } 
while ( c != ’y’ ); <===  test expression

vong-lap-do-c2

Lệnh if-else

  • Phụ thuộc vào điều kiện kiểm tra là true hay false để quyết định nhánh thực hiện
  • Ví dụ:
int x;
	cout << ”Enter a number: ”;
	cin >> x;
	if ( x > 100)
		cout << x << ” is greater than 100” << endl;
	else
		cout << x << ” is not greater than 100” << endl;
if ( x > 100) <====== test expression
{  
 … 
} 
 else
{
 …
}

if-else-c2

Lệnh switch

  • Lệnh switch được sử dụng khi có nhiều nhánh rẽ  phụ thuộc vào giá trị của cùng một biến.
switch(<variable>)
{
   case <constant1>:
      …
      break;
   case <constant2>:
      …
      break;
   default :
     …
} 
char c; 
cout << ”Enter your choice (a/b/c) : ”; 
cin >> c;
switch (c)
{
    case ’a’:
      cout << ”You picked a!” << endl;
      break;
   case ’b’:
      cout << ”You picked b!” << endl;
      break; 
   case ’c’:
      cout << ”You picked c!” << endl;
      break;
   default:
     cout << ”You picked neither a,b,c !” << endl;
 }

switch-c2

Một số lệnh điều khiển khác

  • break: thoát khỏi vòng lặp hoặc switch
  • continue: trở lại đầu vòng lặp.
  • goto: nhảy tới một nhãn xác định

6. Kiểu dữ liệu cấu trúc

  • Structure là một tập hợp các biến đơn giản, tương tự như record trong Pascal.
  • Khai báo Structure:

 

truct part
{
  int modelnumber;
  int partnumber;
  float cost;
};
  • Định nghĩa biến kiểu Structure:

part part1;

  • Khởi tạo các thành phần của Structure: part part1={6244, 373, 217.55};
  • Truy cập vào các thành phần của Structure

part1.modelnumber = 6244;

part.modelnumber = 6244; //sai

  • Hai biến cùng kiểu structure có thể gán cho nhau

part part2;

part2=part1;

Structure lồng

  • Thành phần của Structure có thể là một structure khác.

  struct Distance               struct Room

  {                                        {

      int feet;                                 Distance length;

      float inches;                         Distance width;

  };                                        };

  • Truy cập vào các thành phần của Structure lồng

  Room dining;

 dining.length.feet=13;

  • Khởi tạo Structure lồng:

  Room dining = {{13, 6.5}, {10, 0.0}};

7. Kiểu liệt kê (Enumeration)

  • Định nghĩa enum:

enum days_of_week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
  • Khai báo biến kiểu enum
  days_of_enum day1, day2;
  • Giá trị của các biến kiểu enum là những giá trị mà enum đã định nghĩa trước.
  • Các giá trị của enum được lưu dưới dạng số nguyên, bắt đầu từ 0.
    • Ta có thể thay đổi giá trị nguyên của giá trị đầu trong enum
 enum days_of_week {Sun=1, Mon, Tue, Wed, Thu, Fri, Sat};

  days_of_enum day=Mon;

  cout << day; // Hiển thị 2

8. Hàm

  • Khai báo hàm xác định tên hàm, kiểu trả về, và các tham số cần thiết trong lời gọi hàm.
    • Khai báo hàm thường nằm trong Header File (.h)
  • Định nghĩa hàm chứa thân hàm.
    • Định nghĩa hàm thường nằm trong source file (.cpp)
  • Ví dụ
nint fac(int);  // function declaration

nint fac(int n)  // function definition
  {
  int result=1;
       for (int i=1; i<=n; i++)
  result*=i;
  return result;
  }
int x=7;
  cout << ”fac(” << x <<”)=” << fac(x);  // call to a function;

Truyền trị (Passing by Value)

  • Khi truyền trị, hàm sẽ tạo ra một biến cục bộ để lưu giá trị của biến được truyền.
  • Giá trị của biến được truyền không thay đổi.
  • Ví dụ:
void f(int val) 
	{
		   val++;
		}
	int x=4;
	f(x);  
	cout << x;  // x = 4

Truyền tham chiếu (Passing by Reference)

  • Tham chiếu cung cấp bí danh (alias) cho biến.
  • Khi truyền tham số theo kiểu tham chiếu thì biến cục bộ là bí danh của biến được truyền.
  • Địa chỉ của biến được truyền cho hàm.
  • Hàm có thể truy cập trực tiếp trên biến được truyền.
  • Ví dụ:
	void swap (int & a, int& b)  
	{
	    int tmp;
	    tmp = a;
	    a = b;
	    b = tmp;
	}
	int x=3; int y=5;
	swap(x,y); // a,b là bí danh của x,y

Tham số hằng

  • Tham chiếu hằng không cho phép hàm thay đổi giá trị của biến được truyền.
  • Ví dụ:
	void f( int& a, const int& b )   // b là tham số hằng
	{
			a=5;   // ok
			b=7;   // fail
	}

Hàm có tham số mặc định

#include <math.h>
	double logn (double x, double base=10)  // mặc định gán base = 10
	{
		return log(x)/log(base);
	}
	double y=5.6;
	cout << ”log(y) = ” << logn(y) << endl;   // sử dụng giá trị mặc định
	cout  << ”ln(y) = ” << logn(y,2.71828) << endl;  // base = e
	cout << ”ld(y) = ” << logn(y,2) << endl;  // base = 2

Hàm không có kiểu trả về

  • Sử dụng kiểu void
  • void cũng được sử dụng để khai báo hàm không có tham số.
#include <iostream>
using namespace std;
void printmessage ()
{
	cout << "I'm a function!";
}
int main ()
{
	printmessage ();
	return 0;
}
void printmessage (void)
{
	cout << "I'm a function!";
}

Inline Fuction

inline-function

Chồng hàm (Overloaded Function)

  • Hàm chồng thực hiện các nhiệm vụ khác nhau phụ thuộc vào các tham số truyền.
  • Ví dụ:
void print(int a)   // in số nguyên
	{
		   cout << ”integer : ” << a;
	}
	void print(string s)  // in xâu ký tự
	{
	   cout << ”string : ” << s;
	}
	int x=4; print(x);
    string st=“Hello”; print(st);

Phạm vi của biến

  • Một khối lệnh (block) nằm trong dấu { … }
  • Phạm vi của biến là khối lệnh mà biến được khai báo
  • Biến được khai báo ở ngoài hàm là biến toàn cục (global variable), ở trong hàm là biến cục bộ (local variable).

Trên đây là những kiến thức mình tổng hợp về các vấn đề cơ bản trong lập trình hướng đối tượng c++ , nó hơi dài nhưng hi vọng các bạn có thể từ từ thấu hiểu được hết. Chúc các bạn thành công

Nguồn : lập trình c++

 

No votes yet.
Please wait...

BÌNH LUẬN