Đ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", &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 */

Sự khác nhau giữa C và C++, chuyển nhanh từ C sang C++ và ngược lại

Với mục đích tổng hợp toàn bộ sự biệt giữa C và C++ để mọi người có thể dễ dàng chuyển từ C sang C++ hoặc từ C++ sang C.
C không có:

  • Ngoại lệ (exception)
  • Kiểm tra miền giá trị (range-checking)
  • Thu hồi bộ nhớ (garbage collection)
  • Lập trình hướng đối tượng (object-oriented programming)
  • Đa hình (polymorphism)
  • STD
  • . . .

C là ngôn ngữ lập trình bậc thấp hơn C++, gần với ngôn ngữ máy hơn C++ => C ‘chạy nhanh’ hơn C++

Nhập xuất dữ liệu

C C++
Nhập xuất từ bàn phím, màn hình printf(chuỗi định dạng, tham số 1, tham số 2, …)
scanf(chuỗi định dạng, tham số 1, tham số 2, …)
Xem cụ thể tại: http://yeulaptrinh.pw/1549/nhap-xuat-trong-c/
cin >> biến
cout << biến
Xem cụ thể tại: http://yeulaptrinh.pw/1154/nhap-xuat-du-lieu-tu-ban-phim-trong-c/
Nhập xuất từ file Chi tiết tại: Chi tiết tại: http://yeulaptrinh.pw/1236/nhap-xuat-du-lieu-tu-file-trong-c/