Ngôn ngữ lập trình

Ngôn ngữ lập trình rất quan trọng và rất đa dạng. Lập trình viên thường học một vài ngôn ngữ nhưng vẫn có riêng một ngôn ngữ thiết yếu để làm việc...

Biến và Hằng trong PHP

Biến là gì?

  • Biến là một giá trị có thể thay đổi khi chương trình thực thi. Khi biến được tạo sẽ xuất hiện một vùng nhớ để lưu trữ.
  • Biến trong PHP chỉ tồn tại trong thời gian server phát sinh trang web. Sau khi đã phát trinh xong trang web, tất cả các biến đều bị xóa đi.
  • Một biến gồm 2 thành phàn cơ bản: tên biến và giá trị của biến

<?php

$firstName = “John”;

$lastName = “Smith”;

$number = 12;

?>

  • Quy định khi đặt tên biến:
    • Tên biến phải bắt đầu bằng 1 kí tự hoặc ký tự gạch dưới (ký hiệu _).
    • Tên biến chỉ bao gồm ký tự chữ, ký tự số và gạch dưới.
    • Không chứa ký tự khoảng trắng trong tên biến.
    • Phân biệt chữ hoa và chứ thường.
  • Giá trị
    • Khi các giá trị của biến được đặt trong dấu ngoặc kép (hoặc dấu ngoặc đơn) cho biết biến đó lưu trữ giá trị kiểu chuỗi.
    • Ngược lại cho biết biến đó lưu trữ giá trị kiểu số.
  • Ngoài kiều chuỗi, trong PHP còn có kiểu dữ liệu
    • Các kiểu dữ liệu thường được sử dụng trong PHP: string, numberic, bloolean, null, array, object.
    • Tạm thời chúng ta sẽ tập trung vào kiểu string và kiểu numberic. Các kiểu dữ liệu khác chúng ta sẽ được giới thiệu sau.
  • Chúng ta có 2 cách sau đề xác định kiểu dữ liệu của một biến nào đó:
    • Sử dụng hàm gettype()
    • Sử dụng hàm var_dump()
  • Có thể chuyển đổi dữ liệu của một biến nào đó hay không ?
    • Chúng ta hoàn toàn có thể chuyển đổi kiểu dữ liệu của một biến nào đó, bằng cách thực hiện một trong hai cách sau:
      • Sử dụng ép kiểu.
      • Sử dụng settype()
      • Để kiểm tra kiểu dữ liệu của một biến nào đó chúng ta có thể dùng các hàm is_numeric(), is_float(), is_string(), is_array(), is_object(), ….Hàm để kiểm tra kiểu dữ liệu của một biến:

Hằng số trong PHP

  • Khác với biến, hảng số là giá trị không thể thay đổi được.
  • Định nghĩa hằng
<?php

define(“PI”, 3.14);

echo “Value PI: ” . PI;

?>

Biến toàn cục, biến cục bộ là gì?

Biến toàn cục

  • Vị trí biến đặt bên ngoài tất cả các hàm, cấu trúc…
  • Các biến có ảnh hưởng tới toàn bộ chương trình

Biến cục bộ

  • Vị trí biến đặt bên trong hàm, cấu trúc…
  • Chỉ ảnh hưởng nội bộ bên trong hàm & cấu trúc đó

Điểm khác nhau giữa double và float

Đối với các số thực, chúng ta thường sử dụng float, double và double double.

floatdouble có gì khác nhau?

double có độ chính xác gấp 2 lần float.

float là 32 bit IEEE 754 single precision Floating Point Number, 1 bit cho dấu, (8 bit cho số mũ và 23 * cho giá trị), tức là float có 7 chữ số thập phân có độ chính xác.

double là 64 bit IEEE 754 double precision Floating Point Number (1 bit cho dấu, 11 bit cho số mũ và 52 bit cho giá trị), nghĩa là double có 15 chữ số thập phân có độ chính xác.

Điểm mạnh hơn của C so với các ngôn ngữ khác

C là một ngôn ngữ lập trình cấp trung (middle level language) phát triển bởi Dennis Ritchie trong những năm đầu của thập kỷ 70 khi đang làm việc tại AT & T Bell Labs ở Mỹ. Mục tiêu phát triển NNLT C trong bối cảnh thiết kế lại hệ điều hành UNIX để cho phép nó được sử dụng trên nhiều máy tính.

Là một ngôn ngữ bậc cao (high level language), B cho phép sản xuất mã nhanh hơn nhiều so với hợp ngữ (assembly language). Tuy nhiên, B bị ảnh hưởng bởi những hạn chế vì nó không có các kiểu dữ liệu (data-types) và không cung cấp việc sử dụng “cấu trúc” (structures)

Những trở ngại này đã trở thành động lực cho Ritchie phát triển một ngôn ngữ lập trình mới mang tên C. Ông giữ lại hầu hết các cú pháp của ngôn ngữ B và thêm các kiểu dữ liệu và nhiều thay đổi cần thiết khác. Cuối cùng C đã được phát triển trong giai đoạn 1971-73, bao gồm cả chức năng cấp cao và các tính năng chi tiết được yêu cầu để lập trình một hệ điều hành. Do đó, nhiều thành phần trong UNIX hay bao gồm bản thân hạt nhân UNIX cuối cùng đã được viết lại bằng C.
Do đó, nhiều thành phần UNIX bao gồm bản thân hạt nhân UNIX cuối cùng đã được viết lại trong C.

Điểm mạnh của ngôn ngữ C

  • Là một ngôn ngữ cấp trung, C kết hợp các tính năng của cả hai ngôn ngữ cấp cao và cấp thấp. Nó có thể được sử dụng cho lập trình thâm nhập sâu vào phần cứng, chẳng hạn như lập trình nhúng, lập trình hệ điều hành… và nó cũng hỗ trợ chức năng của các ngôn ngữ lập trình bậc cao, chẳng hạn như scripting cho software applications…
  • C là một ngôn ngữ lập trình có cấu trúc cho phép một chương trình phức tạp được chia thành các chương trình đơn giản gọi là các hàm. Nó cũng cho phép di chuyển dữ liệu dễ dàng giữa các hàm mà ta vẫn thường thấy ở các ngôn ngữ lập trình hiện đại.
  • Các tính năng khác nhau của C bao gồm truy cập trực tiếp các API phần cứng của máy, sự hiện diện của trình biên dịch C, sử dụng tài nguyên máy và cấp phát bộ nhớ động làm cho ngôn ngữ C là sự lựa chọn tối ưu cho các ứng dụng scripting và trình điều khiển các hệ thống nhúng.
  • Ngôn ngữ C phân biệt chữ hoa và chữ thường có nghĩa chữ thường và chữ hoa được coi như khác nhau.
  • C rất tiện dụng và được sử dụng cho các ứng dụng hệ thống, tạo thành một phần lớn của hệ điều hành Windows, UNIX và Linux.
  • C là một ngôn ngữ lập trình đa mục đích và hiệu quả, có thể làm việc trên các ứng dụng doanh nghiệp, game, đồ hoạ, và các ứng dụng yêu cầu tính toán, tài chính, chứng khoán…
  • Ngôn ngữ C có một thư viện phong phú cung cấp một số chức năng tích hợp. Nó cũng cung cấp sự phân bổ bộ nhớ động.
  • C thực hiện các thuật toán và cấu trúc dữ liệu nhanh chóng, tạo điều kiện tính toán nhanh hơn trong các chương trình. Điều này đã thể hiện trong sự sử dụng C trong các ứng dụng yêu cầu độ tinh toán cao hơn như MATLAB và Mathematica.
  • C nhanh hơn hầu hết các ngôn ngữ khác như Python, C++, Java… Đó là một lý do thuyết phục để một vài người sử dụng C thay cho C++…

 

Minh xin kết thúc bài viết ở đây. Nếu các bạn có ý kiến thì xin để lại ở phần comment

Xử lý chuỗi ký tự trong c

Đọc chuỗi ký tự

Khi đọc một chuỗi ký tự bạn cần lưu ý phân biệt 2 cách đọc chuỗi ký tự dưới đây:

Kiểu 1: dùng printf()

char a[100];

scanf("%s", &amp;a); // đọc chuỗi ký tự đầu tiên, không chứa dấu cách
Chú ý là hàm scanf chỉ đọc được một từ chứ không đọc được một đoạn

Ví dụ xâu nhập vào là “xin chao yeu lap trinh” thì đọc bằng scanf chỉ được “xin”. đọc scanf lần thứ 2 thì được “chao”

Để đọc hết cả dòng thì ta phải sử dụng hàm gets()

Kiểu 2: dùng gets()

Đọc hết từng dòng một

Ví dụ input là:

xin chào
yêu lập trình
thì đọc lần thứ nhất ta được xâu “xin chào”, lần thứ 2 ta được xâu “yêu lập trình”

Một số hàm xử lý xâu

Chuyển đổi xâu kí tự sang các kiểu số.

Vì một xâu kí tự có thể biểu diễn nhiều kiểu dữ liệu khác như dạng số nên việc chuyển đổi nội dung như vậy sang dạng số là rất hữu ích. Ví dụ, một xâu có thể mang giá trị “1977” đó là một chuỗi gồm 5 kí tự (kể cả kí tự null). Trong thư viện cstdlib (stdlib.h) đã cung cấp 3 macro/hàm hữu ích sau:

  • atoi: chuyển xâu thành kiểu int.
  • atol: chuyển xâu thành kiểu long.
  • atof: chuyển xâu thành kiểu float.

Tất cả các hàm này nhận một tham số và trả về giá trị số (int, long hoặc float). Các hàm này khi kết hợp với phương thức getline của cin là một cách đáng tin cậy hơn phương thức cin>> cổ điển khi yêu cầu người sử dụng nhập vào một số:

#include <iostream.h> #include <stdlib.h> int main (){ char mybuffer [100]; float price; int quantity; cout << “Enter price: “; cin.getline (mybuffer,100); price = atof (mybuffer); cout << “Enter quantity: “; cin.getline (mybuffer,100); quantity = atoi (mybuffer); cout << “Total price: ” << price*quantity; return 0;

}

Chạy chương trình:

Enter price: 2.75

Enter quantity: 21

Total price: 57.75

Các hàm xử lí xâu kí tự

Các hàm xử lí xâu kí tự nằm trong thư viện cstring (string.h), khi lập trình các bài toán liên quan đến xâu và các hàm xử lí xâu ta phải khai báo thư viện này. Dưới đây là giới thiệu lướt qua của các hàm thông dụng nhất:

Hàm strcpy(s, t);

Gán nội dung của xâu t cho xâu s (không được dùng dấu ‘=’). Hàm sẽ sao chép toàn bộ nội dung của xâu t (kể cả kí tự kết thúc xâu) vào cho xâu s. Để sử dụng hàm này cần đảm bảo độ dài của mảng s ít nhất cũng bằng độ dài của mảng t. Trong trường hợp ngược lại kí tự kết thúc xâu sẽ không được ghi vào s và điều này có thể gây treo máy khi chạy chương trình.

Ví dụ:

char s[10], t[10] ;

t = “Face” ; // không được dùng s = t ; // không được dùng

strcpy(t, “Face”) ; // được, gán “Face” cho t strcpy(s, t) ; // được, sao chép t sang s

cout << s << ” to ” << t ; // in ra: Face to Face

Hàm strncpy(s, t, n);

Sao chép n kí tự của t vào s. Hàm này chỉ làm nhiệm vụ sao chép, không tự động gắn kí tự kết thúc xâu cho s. Do vậy NLT phải thêm câu lệnh đặt kí tự ‘\0’ vào cuối xâu s sau khi sao chép xong.

Ví dụ:

char s[10], t[10] = “Steven”;

strncpy(s, t, 5) ; // copy 5 kí tự “Steve” vào s s[5] = ‘\0’ ; // đặt dấu kết thúc xâu

cout << s << ” is young brother of ” << t ;

// in câu: Steve is young brother of Steven

Một sử dụng có ích của hàm này là copy một xâu con bất kỳ của t và đặt vào s. Ví dụ cần copy xâu con dài 2 kí tự bắtđầu từ kí tự thứ 3 của xâu t và đặt vào s, ta viết strncpy(s, t+3, 2);

Ngoài ra xâu con được copy có thể được đặt vào vị trí bất kỳ của s (không nhất  thiết phải từ đầu xâu s) chẳng hạn đặt vào từ vị trí thứ 5, ta viết strncpy(s+5, t+3, 2);

Câu lệnh này có nghĩa: lấy 2 kí tự thứ 3 và thứ 4 của xâu t đặt vào 2 ô thứ 5 và thứ 6 của xâu s. Trên cơ sở này chúng ta có thể viết các đoạn chương trình ngắn để thay thế một đoạn con bất kỳ nào đó trong s bởi một đoạn con bất kỳ (có độ dài tương đương) trong t.

Hàm strcat(s, t);

Nối một bản sao của t vào sau s (thay cho phép +). Hiển nhiên hàm sẽ loại bỏ kí tự kết thúc xâu s trước khi nối thêm t. Việc nối sẽ đảm bảo lấy cả kí tự kết thúc của xâu t vào cho s (nếu s đủ chỗ) vì vậy NLT không cần thêm kí tự này vào cuối xâu. Tuy nhiên, hàm không kiểm tra xem liệu độ dài của s có đủ chỗ để nối thêm nội dung, việc kiểm tra này phải do NLT đảm nhiệm. Ví dụ:

char a[100] = “John”, b[4] = “Peter”; strcat(a,“and”);

strcat(a,b);

cout<<a // John and Peter

chars[100],t[100]=”Steve”; strncpy(s,t,3);s[3]=’\0′; // s = “Ste”

strcat(s,”p”); // s = “Step”

cout<<t<<“goes”<<s<<“by”<<s; // Steve goes Step by Step

Hàm strncat(s, t, n);

Nối bản sao n kí tự đầu tiên của xâu t vào sau xâu s. Hàm tự động đặt thêm dấu kết thúc xâu vào s sau khi nối xong (tương phản với strncpy()). Cũng giống strcat hàm đòi hỏi độ dài của s phải đủ chứa kết quả. Tương tự, có thể sử dụng cách viết strncat(s, t+k, n);

để nối n kí tự từ vị trí thứ k của xâu t cho s.

Ví dụ:

char s[20] = “Nha ” ; char t[] = “vua chua”

strncat(s, t, 3); // s = “Nha vua”

hoặc:

strncat(s, t+4, 4); // s = “Nha chua”

Hàm strcmp(s, t);

Hàm so sánh 2 xâu s và t (thay cho các phép toán so sánh). Giá trị trả lại là hiệu 2 kí tự khác nhau đầu tiên của s và t. Từ đó, nếu s1 < s2 thì hàm trả lại giá trị âm, bằng 0 nếu s1==s2, và dương nếu s1 > s2. Trong trường hợp chỉ quan tâm đến so sánh bằng, nếu hàm trả lại giá trị 0 là 2 xâu bằng nhau và nếu giá trị trả lại khác 0 là 2 xâu khác nhau.

Ví dụ: if (strcmp(s,t)) cout << “s khác t”; else cout << “s bằng t” ;

Hàm strncmp(s, t);

Giống hàm strcmp(s, t) nhưng chỉ so sánh tối đa n kí tự đầu tiên của hai xâu. Ví dụ:

char s[] = “Ha Noi” , t[] = “Ha noi” ; cout << strcmp(s,t) ; // -32 (vì ‘N’ = 78, ‘n’ = 110)

cout << strncmp(s, t, 3);// 0 (vì 3 kí tự đầu của s và t là như nhau)

Hàm strcmpi(s, t);

Như strcmp(s, t) nhưng không phân biệt chữ hoa, thường. Ví dụ:

char s[] = “Ha Noi” , t[] = “ha noi” ; cout << strcmpi(s, t) ;// 0 (vì s = t) Hàm strupr(s);

Hàm đổi xâu s thành in hoa, và cũng trả lại xâu in hoa đó. Ví dụ:

char s[10] = “Ha noi”; cout << strupr(s); // HA NOI cout << s; // HA NOI (s cũng thành in hoa)

Hàm strlwr(s);

Hàm đổi xâu s thành in thuờng, kết quả trả lại là xâu s. Ví dụ:

char s[10] = “Ha Noi” ; cout << strlwr(s); // ha noi

cout << s; // ha noi (s cũng thành in thường)

Hàm strlen(s);

Hàm trả giá trị là độ dài thực của xâu s. Ví dụ:

char s[10] = “Ha Noi” ; cout << strlen(s) ; // 5

 

Hàm atoi trong C/C++ – chuyển xâu thành số nguyên

Mô tả

Chuyển chuỗi kí tự thành số nguyên

Khai báo

int atoi(const char *str)

  • str là chuỗi ký tự cần chuyển sang số nguyên. VD: str=”5678123″

Ví dụ:

  • atoi(“101”);
  • atoi(‘5’);

Cần khai báo thư viện stdlib.h trước khi sử dụng.

Giá trị trả về

Trả về số nguyên kiểu int. Nếu xâu không có dạng số nguyên thì trả về giá trị 0

Ví dụ

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main () {
   int val;
   char str[20];
 
   strcpy(str, "98993489");
   val = atoi(str);
   printf("String value = %s, Int value = %d\n", str, val);
 
   strcpy(str, "tutorialspoint.com");
   val = atoi(str);
   printf("String value = %s, Int value = %d\n", str, val);
 
   return(0);
}

Kết quả:

String value = 98993489, Int value = 98993489
String value = tutorialspoint.com, Int value = 0

Nhập xuất dữ liệu trong C

Nhập dữ liệu từ bàn phím ta dùng hàm scanf()

Xuất dữ liệu ra màn hình ta dùng hàm printf()

hàm printf

Dùng để in kết qua ra thiết bị vào ra chuẩn, đơn giản trong trường hợp này là màn hình.

Khi sử dụng phải khai báo tiền xử lý #include <stdio.h>

Dữ liệu được in ra tùy theo chuỗi định dạng và tham số được truyền vào.

Cú pháp:

  • printf(chuỗi định dạng, tham số 1, tham số 2,…)

Ví dụ:

char ten[10] = "YeuLapTrinh";
int tuoi = 20;
printf("Xin chao %s, %d tuoi", ten, tuoi);
Chuỗi định dạng: gồm 2 loại
  • Chuỗi ký tự: ghi thế nào in ra thế ấy
  • Mã định dạng: cho phép kết xuất giá trị của các đối mục ra màn hình

Tham số

  • Có thể là biến, hằng, hoặc biểu thức được định trị trước khi in ra
  • Bắt đầu bằng ký từ % và kết thức bởi ký tự chuyển dạng. Ví dụ, %s có nghĩa là chen tham số là một xâu vào. Tương tự như vậy, %d có nghĩa là chèn tham số là một số nguyên vào đây
%c Ký tự đơn
%s Chuỗi
%d Số nguyên thập phân CÓ dấu
%f Ký hiệu thập phân
%e Số có mũ
%x Số nguyên thập phân KHÔNG dấu
%u Số nguyên hex không dấu
%o Số nguyên bát phân không dấu
l: Tiền tố dùng kèm với %d, %x, %u, %o, chỉ số nguyên dài
Vd: %ld, %lx…

hàm scanf

Khi sử dụng phải khai báo tiền xử lý #include <stdio.h>

Cú pháp:

  • scanf(chuỗi định dạng, tham số 1, tham số 2,…)

Tương tự như hàm printf ở trên. Tuy nhiên, các tham số của scanf phải được truyền vào dưới dạng con trở. Vì vậy, ngoại trừ kiểu xâu đã được coi là kiểu con trỏ, chũng ta phải sử dụng toán tử lấy địa chỉ & trước các biến kiểu khác. Ví dụ:

char ten[50]; /* bien kieu xau */
int tuoi; /* bien kieu so nguyen */
scanf("%s",ten); /* nhap vao ten */
scanf("%d",&tuoi); /* nhap vao mot so nguyen */