Latest Post

Friday, January 6, 2012

printf

|0 comments
int printf ( const char * format, ... );
Print formatted data to stdout
Writes to the standard output (stdout) a sequence of data formatted as the format argument specifies. After the format parameter, the function expects at least as many additional arguments as specified in format.

Parameters

format
String that contains the text to be written to stdout. It can optionally contain embedded format tags that are substituted by the values specified in subsequent argument(s) and formatted as requested. The number of arguments following the format parameters should at least be as much as the number of format tags. The format tags follow this prototype: %[flags][width][.precision][length]specifier Where specifier is the most significant one and defines the type and the interpretation of the value of the coresponding argument:
specifierOutputExample
cCharactera
d or iSigned decimal integer392
eScientific notation (mantissa/exponent) using e character3.9265e+2
EScientific notation (mantissa/exponent) using E character3.9265E+2
fDecimal floating point392.65
gUse the shorter of %e or %f392.65
GUse the shorter of %E or %f392.65
oUnsigned octal610
sString of characterssample
uUnsigned decimal integer7235
xUnsigned hexadecimal integer7fa
XUnsigned hexadecimal integer (capital letters)7FA
pPointer addressB800:0000
nNothing printed. The argument must be a pointer to a signed int, where the number of characters written so far is stored.
%A % followed by another % character will write % to stdout.%
The tag can also contain flags, width, .precision and length sub-specifiers, which are optional and follow these specifications:
flagsdescription
-Left-justify within the given field width; Right justification is the default (see width sub-specifier).
+Forces to precede the result with a plus or minus sign (+ or -) even for positive numbers. By default, only negative numbers are preceded with a - sign.
(space)If no sign is going to be written, a blank space is inserted before the value.
#Used with o, x or X specifiers the value is preceeded with 0, 0x or 0X respectively for values different than zero.
Used with e, E and f, it forces the written output to contain a decimal point even if no digits would follow. By default, if no digits follow, no decimal point is written.
Used with g or G the result is the same as with e or E but trailing zeros are not removed.
0Left-pads the number with zeroes (0) instead of spaces, where padding is specified (see width sub-specifier).
widthdescription
(number)Minimum number of characters to be printed. If the value to be printed is shorter than this number, the result is padded with blank spaces. The value is not truncated even if the result is larger.
*The width is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.
.precisiondescription
.numberFor integer specifiers (d, i, o, u, x, X): precision specifies the minimum number of digits to be written. If the value to be written is shorter than this number, the result is padded with leading zeros. The value is not truncated even if the result is longer. A precision of 0 means that no character is written for the value 0.
For e, E and f specifiers: this is the number of digits to be printed after the decimal point.
For g and G specifiers: This is the maximum number of significant digits to be printed.
For s: this is the maximum number of characters to be printed. By default all characters are printed until the ending null character is encountered.
For c type: it has no effect.
When no precision is specified, the default is 1. If the period is specified without an explicit value for precision, 0 is assumed.
.*The precision is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.
lengthdescription
hThe argument is interpreted as a short int or unsigned short int (only applies to integer specifiers: i, d, o, u, x and X).
lThe argument is interpreted as a long int or unsigned long int for integer specifiers (i, d, o, u, x and X), and as a wide character or wide character string for specifiers c and s.
LThe argument is interpreted as a long double (only applies to floating point specifiers: e, E, f, g and G).
additional arguments
Depending on the format string, the function may expect a sequence of additional arguments, each containing one value to be inserted instead of each %-tag specified in the format parameter, if any. There should be the same number of these arguments as the number of %-tags that expect a value.

Return Value

On success, the total number of characters written is returned.
On failure, a negative number is returned.

Example:


#include "stdio.h"
#include "conio.h"
#include "math.h"
#include "string.h"


void main()
{
    printf ("Characters: %c %c \n", 'a', 65);
    printf ("Decimals: %d %ld\n", 1977, 650000L);
    printf ("Preceding with blanks: %10d \n", 1977);
    printf ("Preceding with zeros: %010d \n", 1977);
    printf ("Some different radixes: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100);
    printf ("floats: %4.2f %+.0e %E \n", 3.1416, 3.1416, 3.1416);
    printf ("Width trick: %*d \n", 5, 10);
    printf ("%s \n", "A string");
    getch();
}

Tuesday, January 3, 2012

Chuỗi ký tự trong C

|0 comments

Khái niệm

Chuỗi ký tự là một dãy gồm các ký tự hoặc một mảng các ký tự được kết thúc bằng ký tự '\0' (còn được gọi là ký tự NULL trong bảng mã Ascii).
Các hằng chuỗi ký tự được đặt trong cặp dấu nháy kép "".

Khai báo

Khai báo theo mảng

Cú pháp: char <Biến> [Chiều dài tối đa]
Ví dụ: Trong chương trình, ta có khai báo:
char Ten[12];
Trong khai báo này, bộ nhớ sẽ cung cấp 12-1 bytes để lưu trữ nội dung của chuỗi ký tự Ten; byte cuối cùng lưu trữ ký tự ‘\0’ để chấm dứt chuỗi.
Ghi chú:
  • Chiều dài tối đa không nên khai báo thừa để tránh lãng phí bộ nhớ, nhưng cũng không nên khai báo thiếu.

 Khai báo theo con trỏ

Cú pháp: char *<Biến>
Ví dụ: Trong chương trình, ta có khai báo:
char *Ten;
Trong khai báo này, bộ nhớ sẽ dành 2 byte để lưu trữ địa chỉ của biến con trỏ Ten đang chỉ đến, chưa cung cấp nơi để lưu trữ dữ liệu. Muốn có chỗ để lưu trữ dữ liệu, ta phải gọi đến hàm malloc() hoặc calloc() có trong “alloc.h”, sau đó mới gán dữ liệu cho biến.

 Vừa khai báo vừa gán giá trị

Ví dụ:
  1. #include<stdio.h>
    
  2. #include<conio.h>
    
  3. int main()
    
  4. {
    
  5. char Chuoi[]="Mau nang hay la mau mat em" ;
    
  6. printf("Vua khai bao vua gan trị : %s",Chuoi) ;
    
  7. system("pause");
    
  8. return 0; 
    
  9. }
    
Ghi chú: Chuỗi được khai báo là một mảng các ký tự nên các thao tác trên mảng có thể áp dụng đối với chuỗi ký tự.

 Các thao tác trên chuỗi ký tự

 Nhập xuất chuỗi

 Nhập chuỗi từ bàn phím

Để nhập một chuỗi ký tự từ bàn phím, ta sử dụng hàm gets()
Cú pháp: gets(<Biến chuỗi>)
Ví dụ:
char Ten[20];
gets(Ten);
Ta cũng có thể sử dụng hàm scanf() để nhập dữ liệu cho biến chuỗi, tuy nhiên lúc này ta chỉ có thể nhập được một chuỗi không có dấu khoảng trắng.
Ngoài ra, hàm cgets() (trong conio.h) cũng được sử dụng để nhập chuỗi.

Xuất chuỗi lên màn hình

Để xuất một chuỗi (biểu thức chuỗi) lên màn hình, ta sử dụng hàm puts().
Cú pháp: puts(<Biểu thức chuỗi>)
Ví dụ: Nhập vào một chuỗi và hiển thị trên màn hình chuỗi vừa nhập.
  1. #include<conio.h>
    
  2. #include<stdio.h>
    
  3. #include<string.h>
    
  4. int main()
    
  5. {
    
  6. char Ten[12];
    
  7. char queQuan[15];
    
  8. printf("Nhap Ten: ");fflush(stdin);gets(Ten);
    
  9. printf("Nhap Que Quan: ");fflush(stdin);gets(queQuan);
    
  10. printf("Chuoi vua nhap: ");puts(Ten);puts(queQuan);
    
  11. getch();
    
  12. return 0;
    
  13. }
    
Ngoài ra, ta có thể sử dụng hàm printf(), puts() (trong conio.h) để hiển thị chuỗi lên màn hình.

 Một số hàm xử lý chuỗi (trong string.h)

Cộng chuỗi - Hàm strcat()

Cú pháp: char *strcat(char *des, const char *source)
Hàm này có tác dụng ghép chuỗi nguồn vào chuỗi đích.
Ví dụ: Nhập vào họ lót và tên của một người, sau đó in cả họ và tên của họ lên màn hình.
  1. #include<conio.h>
    
  2. #include<stdio.h>
    
  3. #include<string.h>
    
  4. int main()
    
  5. {
    
  6. char HoLot[30], Ten[12];
    
  7. printf("Nhap Ho Lot: ");gets(HoLot);
    
  8. printf("Nhap Ten: ");gets(Ten);
    
  9. strcat(HoLot,Ten); /* Ghep Ten vao HoLot*/
    
  10. printf("Ho ten la: ");puts(HoLot);
    
  11. getch();
    
  12. return 0;
    
  13. }
    

 Xác định độ dài chuỗi - Hàm strlen()

Cú pháp: int strlen(const char* s)
Ví dụ: Sử dụng hàm strlen xác định độ dài một chuỗi nhập từ bàn phím.
  1. #include<conio.h>
    
  2. #include<stdio.h>
    
  3. #include<string.h>
    
  4. int main(){
    
  5. char Chuoi[255];
    
  6. int Dodai;
    
  7. printf("Nhap chuoi: ");gets(Chuoi);
    
  8. Dodai = strlen(Chuoi)
    
  9. printf("Chuoi vua nhap: ");puts(Chuoi);
    
  10. printf("Co do dai %d",Dodai);
    
  11. getch();
    
  12. return 0;
    
  13. }
    

 Đổi một ký tự thường thành ký tự hoa - Hàm toupper()

Hàm toupper() (trong ctype.h) được dùng để chuyển đổi một ký tự thường thành ký tự hoa.
Cú pháp: char toupper(char c)

 Đổi chuỗi chữ thường thành chuỗi chữ hoa, hàm strupr()

Hàm struppr() được dùng để chuyển đổi chuỗi chữ thường thành chuỗi chữ hoa, kết quả trả về của hàm là một con trỏ chỉ đến địa chỉ chuỗi được chuyển đổi.
Cú pháp: char* strupr(char *s)
Ví dụ: Viết chương trình nhập vào một chuỗi ký tự từ bàn phím. Sau đó sử dụng hàm strupr() để chuyển đổi chúng thành chuỗi chữ hoa.
  1. #include<conio.h>
    
  2. #include<stdio.h>
    
  3. #include<string.h>
    
  4. int main()
    
  5. {
    
  6. char Chuoi[255],*s;
    
  7. printf("Nhap chuoi: ");gets(Chuoi);
    
  8. s=strupr(Chuoi) ;
    
  9. printf(“Chuoi chu hoa:);puts(s);
    
  10. getch();
    
  11. return 0;
    
  12. }
    

 Đổi chuỗi chữ hoa thành chuỗi chữ thường, hàm strlwr()

Muốn chuyển đổi chuỗi chữ hoa thành chuỗi toàn chữ thường, ta sử dụng hàm strlwr(), các tham số của hàm tương tự như hàm strupr()
Cú pháp: char *strlwr(char *s)

Sao chép chuỗi, hàm strcpy()

Hàm này được dùng để sao chép toàn bộ nội dung của chuỗi nguồn vào chuỗi đích.
Cú pháp: char* strcpy(char *Des, const char *Source)
Ví dụ: Viết chương trình cho phép chép toàn bộ chuỗi nguồn vào chuỗi đích.
  1. #include<conio.h>
    
  2. #include<stdio.h>
    
  3. #include<string.h>
    
  4. int main()
    
  5. {
    
  6. char Chuoi[255],s[255];
    
  7. printf("Nhap chuoi: ");gets(Chuoi);
    
  8. strcpy(s,Chuoi);
    
  9. printf(“Chuoi dich:);puts(s);
    
  10. getch();
    
  11. return 0;
    
  12. }
    

Sao chép một phần chuỗi, hàm strncpy()

Hàm này cho phép chép n ký tự đầu tiên của chuỗi nguồn sang chuỗi đích.
Cú pháp: char *strncpy(char *Des, const char *Source, size_t n)

 Trích một phần chuỗi, hàm strchr()

Để trích một chuỗi con của một chuỗi ký tự bắt đầu từ một ký tự được chỉ định trong chuỗi cho đến hết chuỗi, ta sử dụng hàm strchr().
Cú pháp: char *strchr(const char *str, int c)
Ghi chú:
  • Nếu ký tự đã chỉ định không có trong chuỗi, kết quả trả về là NULL.
  • Kết quả trả về của hàm là một con trỏ, con trỏ này chỉ đến ký tự c được tìm thấy đầu tiên trong chuỗi str.

Tìm kiếm nội dung chuỗi, hàm strstr()

Hàm strstr() được sử dụng để tìm kiếm sự xuất hiện đầu tiên của chuỗi s2 trong chuỗi s1.
Cú pháp: char* strstr(const char *s1, const char *s2)
Kết quả trả về của hàm là một con trỏ chỉ đến phần tử đầu tiên của chuỗi s1 có chứa chuỗi s2 hoặc giá trị NULL nếu chuỗi s2 không có trong chuỗi s1.
Ví dụ: Viết chương trình sử dụng hàm strstr() để lấy ra một phần của chuỗi gốc bắt đầu từ chuỗi "hoc".
  1. #include<conio.h>
    
  2. #include<stdio.h>
    
  3. #include<string.h>
    
  4. int main()
    
  5. {
    
  6. char Chuoi[255],*s;
    
  7. printf("Nhap chuoi: ");gets(Chuoi);
    
  8. s=strstr(Chuoi,"hoc");
    
  9. printf("Chuoi trich ra: ");puts(s);
    
  10. getch();
    
  11. return 0;
    
  12. }
    

 So sánh chuỗi, hàm strcmp()

Để so sánh hai chuỗi theo từng ký tự trong bảng mã Ascii, ta có thể sử dụng hàm strcmp().
Cú pháp: int strcmp(const char *s1, const char *s2)
Hai chuỗi s1 và s2 được so sánh với nhau, kết quả trả về là một số nguyên (số này có được bằng cách lấy ký tự của s1 trừ ký tự của s2 tại vị trí đầu tiên xảy ra sự khác nhau).
  • Nếu kết quả là số âm, chuỗi s1 nhỏ hơn chuỗi s2.
  • Nếu kết quả là 0, hai chuỗi bằng nhau.
  • Nếu kết quả là số dương, chuỗi s1 lớn hơn chuỗi s2.

So sánh chuỗi, hàm stricmp()

Hàm này thực hiện việc so sánh trong n ký tự đầu tiên của 2 chuỗi s1 và s2, giữa chữ thường và chữ hoa không phân biệt.
Cú pháp: int stricmp(const char*s1, const char *s2)
Kết quả trả về tương tự như kết quả trả về của hàm strcmp()

Khởi tạo chuỗi, hàm memset()

Hàm này được sử dụng để đặt n ký tự đầu tiên của chuỗi là ký tự c.
Cú pháp: memset(char *Des, int c, size_t n)

 Đổi từ chuỗi ra số, hàm atoi(), atof(), atol() (trong stdlib.h)

Để chuyển đổi chuỗi ra số, ta sử dụng các hàm trên.
Cú pháp:
  • int atoi(const char *s): chuyển chuỗi thành số nguyên
  • long atol(const char *s): chuyển chuỗi thành số nguyên dài
  • float atof(const char *s): chuyển chuỗi thành số thực
Nếu chuyển đổi không thành công, kết quả trả về của các hàm là 0.
Ngoài ra, thư viện string.h còn hỗ trợ các hàm xử lý chuỗi khác, ta có thể đọc thêm trong phần trợ giúp.

Bài tập

1. Viết chương trình nhập một chuỗi ký tự từ bàn phím, xuất ra màn hình mã Ascii của từng ký tự có trong chuỗi.
2. Viết chương trình nhập một chuỗi ký tự từ bàn phím, xuất ra màn hình chuỗi đảo ngược của chuỗi đó. Ví dụ đảo của "abcd egh" là "hge dcba".
3. Viết chương trình nhập một chuỗi ký tự và kiểm tra xem chuổi đó có đối xứng không.
Ví dụ : Chuỗi ABCDEDCBA là chuỗi đối xứng.
4. Nhập vào một chuỗi bất kỳ, hãy đếm số lần xuất hiện của mỗi loại ký tự.
5. Viết chương trình nhập vào một chuỗi.
  • In ra màn hình từ bên trái nhất và phần còn lại của chuỗi. Ví dụ: "Nguyễn Văn Minh" in ra thành:
Nguyễn
Văn Minh
  • In ra màn hình từ bên phải nhất và phần còn lại của chuỗi. Ví dụ: "Nguyễn Văn Minh" in ra thành:
Minh
Nguyễn Văn
6. Viết chương trình nhập vào một chuỗi rồi xuất chuỗi đó ra màn hình dưới dạng mỗi từ một dòng.
Ví dụ: "Nguyễn Văn Minh"
In ra :
Nguyễn
Văn
Minh 
7. Viết chương trình nhập vào một chuỗi, in ra chuỗi đảo ngược của nó theo từng từ.
Ví dụ : chuỗi "Nguyễn Văn Minh" đảo thành "Minh Văn Nguyễn"
8. Viết chương trình đổi số tiền từ số thành chữ.
9. Viết chương trình nhập vào họ và tên của một người, cắt bỏ các khoảng trống không cần thiết (nếu có), tách tên ra khỏi họ và tên, in tên lên màn hình. Chú ý đến trường hợp cả họ và tên chỉ có một từ.
10. Viết chương trình nhập vào họ và tên của một người, cắt bỏ các khoảng trắng bên phải, trái và các khoảng trắng không có nghĩa trong chuỗi. In ra màn hình toàn bộ họ tên người đó dưới dạng chữ hoa, chữ thường.
11. Viết chương trình nhập vào một danh sách họ và tên của n người theo kiểu chữ thường, đổi các chữ cái đầu của họ, tên và chữ lót của mỗi người thành chữ hoa. In kết quả lên màn hình.
12. Viết chương trình nhập vào một danh sách họ và tên của n người, tách tên từng người ra khỏi họ và tên rồi sắp xếp danh sách tên theo thứ tự từ điển. In danh sách họ và tên sau khi đã sắp xếp.

Wednesday, December 28, 2011

Bài số 1

|0 comments
Bài số 1

Tuesday, December 27, 2011

Giới thiệu

|1 comments
Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Ken Thompson và Dennis Ritchie để dùng trong hệ điều hành UNIX. Từ dó, ngôn ngữ này đã lan rộng ra nhiều hệ điều hành khác và trở thành một những ngôn ngữ phổ dụng nhất. C là ngôn ngữ rất có hiệu quả và được ưa chuộng nhất để viết các phần mềm hệ thống, mặc dù nó cũng được dùng cho việc viết các ứng dụng. Ngoài ra, C cũng thường được dùng làm phương tiện giảng dạy trong khoa học máy tính mặc dù ngôn ngữ này không dược thiết kế dành cho người nhập môn.

Tổng quan

C là một ngôn ngữ lập trình tương đối nhỏ gọn vận hành gần với phần cứng và nó giống với ngôn ngữ Assembler hơn hầu hết các ngôn ngữ bậc cao. Hơn thế, C đôi khi được đánh giá như là "có khả năng di động", cho thấy sự khác nhau quan trọng giữa nó với ngôn ngữ bậc thấp như là Assembler, đó là việc mã C có thể được dịch và thi hành trong hầu hết các máy tính, hơn hẳn các ngôn ngữ hiện tại trong khi đó thì Assembler chỉ có thể chạy trong một số máy tính đặc biệt. Vì lý do này C được xem là ngôn ngữ bậc trung.
C đã được tạo ra với một mục tiêu là làm cho nó thuận tiện để viết các chương trình lớn với số lỗi ít hơn trong mẫu hình lập trình thủ tục mà lại không đặt gánh nặng lên vai người viết ra trình dịch C, là những người bề bộn với các đặc tả phức tạp của ngôn ngữ. Cuối cùng C có thêm những chức năng sau:
  • Một ngôn ngữ cốt lõi đơn giản, với các chức năng quan trọng chẳng hạn như là những hàm hay việc xử lý tập tin sẽ được cung cấp bởi các bộ thư viện các thủ tục.
  • Tập trung trên mẫu hình lập trình thủ tục, với các phương tiện lập trình theo kiểu cấu trúc.
  • Một hệ thống kiểu đơn giản nhằm loại bỏ nhiều phép toán không có ý nghĩa thực dụng.
  • Dùng ngôn ngữ tiền xử lý, tức là các câu lệnh tiền xử lý C, cho các nhiệm vụ như là định nghĩa các macro và hàm chứa nhiều tập tin mã nguồn (bằng cách dùng câu lệnh tiền xử lý dạng #include chẳng hạn).
  • Mức thấp của ngôn ngữ cho phép dùng tới bộ nhớ máy tính qua việc sử dụng kiểu dữ liệu pointer.
  • Số lượng từ khóa rất nhỏ gọn.
  • Các tham số được đưa vào các hàm bằng giá trị, không bằng địa chỉ.
  • Hàm các con trỏ cho phép hình thành một nền tảng ban đầu cho tính đóng và tính đa hình.
  • Hỗ trợ các bản ghi hay các kiểu dữ liệu kết hợp do người dùng từ khóa định nghĩa struct cho phép các dữ liệu liên hệ nhau có thể được tập hợp lại và được điều chỉnh như là toàn bộ.
Một số chức năng khác mà C không có (hay còn thiếu) nhưng có thể tìm thấy ở các ngôn ngữ khác bao gồm:
  • An toàn kiểu,
  • Tự động Thu dọn rác,
  • Các lớp hay các đối tượng cùng với các ứng xử của chúng (xem thêm OOP),
  • Các hàm lồng nhau,
  • Lập trình tiêu bản hay Lập trình phổ dụng,
  • Quá tải và Quá tải toán tử,
  • Các hỗ trợ cho đa luồng, đa nhiệm và mạng.
Mặc dù C còn thiếu nhiều chức năng hữu ích nhưng lý do quan trọng để C được chấp nhận vì nó cho phép các trình dịch mới được tạo ra một cách nhanh chóng trên các nền tảng mới và vì nó cho phép người lập trình dễ kiểm soát được những gì mà chương trình (do họ viết) thực thi. Đây là điểm thường làm cho mã C chạy hiệu quả hơn các ngôn ngữ khác. Thường thì chỉ có ngôn ngữ ASM chỉnh bằng tay chạy nhanh hơn (ngôn ngữ C), bởi vì ASM kiểm soát được toàn bộ máy. Mặc dù vậy, với sự phát triển các trình dịch C, và với sự phức tạp của các CPU hiện đại, C đã dần thu nhỏ khoảng cách khác biệt về vận tốc này.
Một lý do nữa cho việc C được sử dụng rộng rãi và hiệu quả là do các trình dịch, các thư viện và các phần mềm thông dịch của các ngôn ngữ bậc cao khác lại thường được tạo nên từ C.