Dòng 1: #include : bï lánh tiÃn xċ lý, thông báo cho trình biên dách C đã thêm táp tiêu đà stdio.h trong ch¤¢ng trình tr¤ñc khi biên dách mã nguén, stdio là các chuÁn đ¿u vào/đ¿u ra, cho
GIðI THIàU NGÔN NGČ C
TÀP KÝ TĎ HĀP Là TRONG C
TÁp ký tď
Mỗi ngôn ngữ lập trình đều có những ký tự riêng biệt Các ký tự này được nhóm lại theo nhiều cách khác nhau để tạo nên các từ Sau đó, các từ lại được liên kết theo một nguyên tắc nhất định để tạo thành các câu lệnh Một chương trình bao gồm nhiều câu lệnh thực hiện một thuật toán nào đó.
Ngụn ngč C đÔāc xõy dďng trờn bù ký tď gộm:
- 26 chč cái latinh: a, b, c,&, x, y, z hoÁc chč cái hoa: A, B, C, ,
- Các ký tď toán hãc: +, - , *, /, =, (, ),
- Các ký tď đÁc biát khác nh¤: , : ; [ ] { } ? ! \ & | % # $, v.v
- DÃu cỏch thďc sď là mùt khoÁng cỏch dựng đÅ tỏch cỏc tĉ
b ? a : b);
- Phộp thay thÁ macro đÂn giÁn chò là thay nùi dung macro vào vỏ trớ tên cąa nó do vÁy s¿ không có c¢ chÁ kiÅm tra kiÅu
Khi định nghĩa các macro có tham số, việc không sử dụng dấu ngoặc có thể dẫn đến kết quả không như mong muốn Ví dụ, với macro #define bp(a) a*a, khi sử dụng bp(x + y), kết quả sẽ là x + y * x + y, không đúng với ý định ban đầu Do đó, để tránh sai sót, chúng ta nên sử dụng dấu ngoặc cho các tham số trong macro, như #define bp(a) (a)*(a).
Trong phần này, chúng ta sẽ cung cấp một số thông tin và khai báo nguyên mẫu để giải thích cấu trúc chương trình, không nhằm mục đích trình bày chi tiết về hàm và các thành phần cụ thể, vì những nội dung đó sẽ được trình bày trong phần đánh nghĩa hàm.
Nguyờn m¿u mùt hàm là dũng khai bỏo cung cÃp cỏc thụng tin: tờn hàm, kiÅu hàm, sỗ đỗi sỗ và kiÅu tĉng đỗi sỗ cąa hàm
Cú pháp khai báo nguyên m¿u
([khai bỏo đỗi]);
Cho các khai bao nguyên m¿u sau đây: int min (int, int); float binhphuong (float y); float giatri(int, float);
Phân khai bỏ đổi của nguyên mẫu, mặc đớch là xác định số đổi số và kiểu của tầng đổi số Do vậy, bạn cần phải viết tên của đổi số theo kiểu của chúng, và bạn phải liệt kê đây là kiểu của tầng đổi số.
1.3.2.5 Phần định nghĩa các cấu trúc
Ngoài những kiểu chuẩn đã được cung cấp sẵn của ngôn ngữ, ngôn ngữ lập trình còn hỗ trợ định nghĩa ra các kiểu mũi tên, trong đó các kiểu này được tạo ra bằng cách sử dụng từ khóa typedef (type define).
Vủi cỳ phỏp nhÔ sau: typedef ;
Trong đú, tên kiểu mũi là tên kiểu được tạo ra theo quy tắc và tên của ngôn ngữ, trong khi mô tả kiểu là phần chúng ta đánh nghĩa các thành phần cấu thành lên kiểu mũi.
Cho hai đánh ngh*a cÃu trúc sau đây: typedef unsigned char byte; typedef long nguyen_dai;
Trong ngôn ngữ lập trình, kiểu dữ liệu byte thường được sử dụng để định nghĩa các biến có tên như a và b, với cú pháp khai báo là: byte a, b; trong đó byte là kiểu dữ liệu tương ứng với unsigned char Đồng thời, kiểu dữ liệu nguyên dài được biểu diễn bằng từ khóa long.
Trong phần này, chúng ta sẽ đánh giá các hàm của ngôn ngữ lập trình, bao gồm định nghĩa hàm, các tham số của hàm và thân hàm Việc hiểu rõ cấu trúc và chức năng của hàm là rất quan trọng để tối ưu hóa quá trình lập trình.
([khai bỏo đỗi])
Xõy dďng hàm tỡm sỗ bộ nhÃt cąa hai sỗ nguyờn a, b int max( int a, int b)
1.3.2.7 Hàm main() Đõy là thành ph¿n b¿t buùc duy nhÃt trong mùt chÔÂng trỡnh C, thõn cąa hàm main() b¿t đ¿u tĉ sau dÃu mừ múc mừ ngoÁc {cho tủi dÃu múc đúng ngoÁc} Khụng giỗng nhÔ chÔÂng trỡnh cąa Pascal luụn cú ph¿n chÔÂng trỡnh chớnh, chÔÂng trỡnh trong C đÔāc phõn thành cỏc hàm đùc lÁp cỏc hàm cú cỳ phỏp nhÔ nhau và cựng mćc và mùt hàm đÁm nhiỏm ph¿n thân chính cąa ch¤¢ng trình, tćc là ch¤¢ng trình s¿ b¿t đ¿u đ¤āc thďc hiỏn tĉ dũng lỏnh đ¿u tiờn và kÁt thỳc sau lỏnh cuỗi cựng trong thõn hàm main()
KIÄU DČ LIàU TRONG C
KiÅu dč liáu d¿n xuÃt
short int e; long int f; long double g;
1.4.2.1 Bổ từ signed và unsigned
Khi khai báo mút số nguyên, mảng đỏnh đúng là số nguyên có dấu (âm, dương) Bởi vì ký hiệu signed và unsigned đều xác định dạng thể hiện dấu của các kiểu dữ liệu ký tự hoặc số nguyên.
Có hai kiểu dữ liệu trong lập trình là char và int, trong đó int có thể có dấu âm hoặc không Theo quy định, kiểu int được xem là kiểu có dấu, cho phép lưu trữ các số âm Để sử dụng kiểu không có dấu, lập trình viên cần khai báo unsigned int Ngoài ra, thay vì sử dụng unsigned int, người ta cũng có thể sử dụng kiểu int, nhưng điều này chỉ áp dụng cho trường hợp không cần lưu trữ số âm.
Khai báo unsigned int a và unsigned a đ¤āc ch¤¢ng trình xem là t¤¢ng đ¤¢ng nhau
Kiểu unsigned cho rừ ràng mút biến cho cú thể nhấn giỏ trỏ động Bởi cách này thường được sử dụng với kiểu int và trong một vài trường hợp có thể được áp dụng với kiểu dữ liệu float, nhưng điều này làm mất tính linh động của mẫu lệnh.
Vủi viỏc thờm bở tĉ unsigned vào trÔủc kiÅu dč liỏu int, miÃn giỏ trỏ cąa cỏc sỗ dÔÂng này đÔāc tăng lờn gÃp đụi
Khi khai báo biến `unsigned int a;`, phạm vi của biến a sẽ là [0, 65535], khác với phạm vi [-32768, 32767] của kiểu `int` Đặc thù của C không xác định rõ ràng kiểu `char` có dấu hay không có dấu, và điều này phụ thuộc vào quy định của nhà phát hành trình biên dịch Do đó, để tránh sai sót khi làm việc trên nhiều loại trình biên dịch C khác nhau, cần khai báo rõ ràng các kiểu dữ liệu là signed hay unsigned khi làm việc với kiểu `char` Điều này đặc biệt quan trọng khi sử dụng kiểu `char` như một kiểu "ký tự".
Ví dā 1.21 unsigned char g; signed char t;
Các kiểu dữ liệu char, signed char và unsigned char là những loại khác nhau trong lập trình Ngoài ra, các hàm chuẩn và dãy ký tự sử dụng các kiểu char không có định tính, nhiều trình biên dịch C có thể gặp lỗi nếu các kiểu ký tự khác được sử dụng thay thế cho dãy ký tự khi truyền vào các hàm này.
BÁng 1.3 KiÅu dč liáu char
KiÅu Ph¿m vi Kớch thÔủc
[signed] char -128 đÁn 127 1byte unsigned char 0 đÁn 255 1byte
Ví dā 1.22 Đo¿n ch¤¢ng trình sau minh hãa sď khác nhau giča hai kiÅu char char ch1; unsigned char ch2; ch1 = 200; ch2 = 200;
Khi sử dụng câu lệnh in printf(\n' hoặc dữ liệu sau khoảng trống, điều này sẽ ảnh hưởng đến các hàm nhập dữ liệu sau đó.
Hàm gets() trong ngôn ngữ lập trình C được sử dụng để đọc một dòng dữ liệu từ chuẩn đầu vào (stdin) và lưu vào một biến chuỗi Khi chương trình đọc dữ liệu vào biến chuỗi, hàm gets sẽ tự động bỏ ký tự xuống dòng Nội dung phần 2.2.1.1 sẽ giới thiệu cách đọc dữ liệu chuỗi từ console bằng hàm gets() trong C và so sánh sự khác biệt giữa hàm gets() và hàm scanf().
Cú pháp: char *gets(char *str)
- str là con trồ kiÅu char trồ tủi vựng nhủ chća dóy ký tď
Hàm gets() là một hàm trong C được sử dụng để ghi nhận chuỗi ký tự từ stdin, cho đến khi gặp ký tự newline ('\n') Ký tự newline sẽ bị loại bỏ khỏi stdin, nhưng không được đưa vào chuỗi Chuỗi được đọc sẽ được bổ sung thêm ký tự null ('\0') và được lưu trữ trong biến mà con trỏ str trỏ tới Hàm này trả về độ dài của chuỗi đã đọc.
Cú thÅ sċ dăng cỳ phỏp sau: gets(); vủi variable_name: biÁn ghi nhÁn chuíi ký tď nhÁp vào
TrÔủc khi sċ dăng hàm gets(), phÁi khai bỏo thÔ viỏn
ViÁt ch¤¢ng trình nhÁp vào tên tr¤óng và hiÅn thá ra màn hình
1 // Vi du ve ham gets()
KÁt quÁ ch¤¢ng trình:
Truong Dai hoc Cong nghe GTVT
============Truong Dai hoc Cong nghe GTVT
- Hàm scanf() cũng đ¤āc sċ dăng đÅ nhÁp dč liáu tĉ thiÁt bá chuÁn, tuy nhiên giča hàm scanf() và hàm gets() khác nhau:
Hàm scanf() trong C có thể dừng lại khi gặp ký tự trắng, dấu phẩy hoặc End Of File (EOF), điều này khiến việc sử dụng hàm scanf() để nhập chuỗi có chứa ký tự trắng trở nên khó khăn Ngược lại, hàm gets() sẽ dừng lại khi người dùng nhấn phím Enter, cho phép nhập chuỗi mà không bị giới hạn bởi ký tự trắng.
- Hàm scanf() có thÅ đãc nhiÃu giá trá cąa các kiÅu dč liáu khác nhau, trong khi hàm gets() chò nhÁn kiÅu dč liỏu chuới ký tď
Ví dă sau đây so sánh sď khác nhau giča hàm gets() và hàm scanf()
5 printf("Nhap vao mot chuoi su dung ham gets(): \n");
7 printf("Chuoi ky tu vua nhap su dung ham gets() : %s\n", str);
8 printf("Nhap vao mot chuoi su dung ham scanf(): \n");
10 printf("Chuoi ky tu vua nhap su dung ham scanf() : %s\n", str);
KÁt quÁ ch¤¢ng trình:
Nhap vao mot chuoi su dung ham gets():
Truong Dai hoc Cong nghe GTVT
Chuoi ky tu vua nhap su dung ham gets(): Truong Dai hoc Cong nghe GTVT
Nhap vao mot chuoi su dung ham scanf():
Truong Dai hoc Cong nghe GTVT
Chuoi ky tu vua nhap su dung ham scanf(): Truong
Cú pháp: int getchar(void);
Chąc năng: Hàm getchar() đóc mùt ký tď đ¿u vào stdin (tĉ bàn phớm)
Hàm trÁ và ký tď đãc đ¤āc, nÁu thành công, trÁ và EOF nÁu thÃt b¿i
Muỗn sċ dăng hàm getchar(), phÁi khai bỏo thÔ viỏn ) Ngược lại, nếu có lỗi, hàm trả về EOF.
PhÁi khai bỏo thÔ viỏn trÔủc khi sċ dăng hàm puts()
ViÁt ch¤¢ng trình nhÁp vào 1 chuíi ký tď, sċ dăng hàm puts() in chuíi vĉa nhÁp ra màn hình
5 printf("Nhap vao chuoi ky tu: \n");
6 //Nhap chuoi su dung ham gets()
8 printf("Chuoi vua duoc nhap la - ");
9 //In chuoi ra man hinh
KÁt quÁ ch¤¢ng trình:
Nhap vao chuoi ky tu:
Chuoi vua duoc nhap la - Ha Noi!
Hàm puts() đơn giản hơn hàm printf() trong việc hiển thị chuỗi văn bản, vì nó chỉ cần một tham số là chuỗi cần in ra Tuy nhiên, nếu chuỗi chứa các ký tự đặc biệt như % hay ?, hàm printf() sẽ xử lý chúng một cách linh hoạt hơn và cho ra kết quả khác Đặc biệt, khi chuỗi đầu vào là một chuỗi không được định nghĩa trước, việc sử dụng hàm printf() có thể dẫn đến các thông báo lỗi không mong muốn.
Hàm puts() cho phép di chuyển con trỏ đến vị trí tiếp theo trong luồng đầu ra Nếu không muốn di chuyển con trỏ, chúng ta có thể sử dụng hàm fputs(str, stdout) để ghi chuỗi mà không thay đổi vị trí của con trỏ.
Cú pháp: int putchar(int ch);
Trong đú: ch là mó ASCII cąa ký tď muỗn in ra màn hỡnh
Hàm trÁ và ký tď có mã ASCII lên stdout, nÁu thành công NÁu gÁp líi hàm trÁ và EOF
4 // Khoi tao ky tu de ghi
2.2.3 Các hàm vào ra trên màn hình, bàn phím
Cú pháp: int getch(void);
TrÁ và giá trá: hàm getch() trÁ và ký tď đãc tĉ bàn phím
MợT Sổ VÍ DĂ
ViÁt ch¤¢ng trình đãc tên, hã và năm sinh và hiÅn thá tên và năm cąa ng¤ói vĉa nhÁp
10 printf("Nhap vao nam sinh: ");
12 printf("%s %s %d\n", firstname, lastname, bir_year);
ViÁt chÔÂng trỡnh nhÁp vào thụng tin cąa mùt sinh viờn gộm: masv, hoten, diemtoan, diemanh
Yêu cÅu: a Tính tongdiem = diemtoan + diemanh b In thông tin cąa sinh viên đó lên màn hình gém: masv, hoten, tongdiem
- Xác đánh các biÁn đ¿u vào: masv (KiÅu char), hoten (KiÅu char), diemtoan (KiÅu float), diemanh (KiÅu float);
- Sċ dăng cõu lỏnh nhÁp, xuÃt, tớnh tởng điÅm;
- In thông tin cąa các sinh viên
7 float d_toan, d_anh, tong_diem;
8 printf("Nhap ma sinh vien: ");
10 puts("Nhap ho ten: "); gets(ht);
14 printf("Nhap diem tieng anh: ");
17 puts("Ma Sv: "); puts(masv);
18 puts("Ho ten: "); puts(ht);
19 printf("Tong diem: = %3.2f",tong_diem);
Nhap ma sinh vien: sv01
A BÀI TÀP CÓ LòI GIÀI
ViÁt chÔÂng trỡnh đởi tĉ đù C sang đù F
Thang đo độ C, hay còn gọi là thang đo Celsius, được phát triển bởi nhà thiên văn học người Thụy Điển, ông Anders Celsius Trong thang đo này, nước đóng băng ở 0 độ C và sôi ở 100 độ C.
Thang đo Fahrenheit đ¤āc phát triÅn bõi nhà vÁt lý ng¤ói Đćc Daniel Gabriel Fahrenheit Trong thang đo Fahrenheit, nÔủc đúng băng ừ 32 đù và sụi ừ 212 đù
Cụng thćc chuyÅn đởi tĉ centigrade sang Fahrenheit là:
- NhÁp vào nhiỏt đù ừ đù C;
- Sċ dăng cụng thćc tớnh đÅ chuyÅn sang đù F;
- In kÁt quÁ ra màn hỡnh, vủi đỏnh d¿ng chò gộm 2 chč sỗ thÁp phõn
6 printf("Nhap nhiet do (do C): ");
9 printf("Do F tuong ung la: %2.2f \n", do_f);
ViÁt ch¤¢ng trình tính thÅ tích hình c¿u, khi biÁt bán kính cąa hình c¿u Công thćc tính thÅ tích hình c¿u:
- NhÁp bán kinh cąa hình c¿u
- Sċ dăng công thćc tính V = đÅ tính thÅ tích hình c¿u
- In kÁt quÁ ra màn hỡnh, vủi đỏnh d¿ng chò gộm 2 chč sỗ thÁp phõn
5 float r; // ban kinh cua hinh cau
6 float V; // the tich cua hinh cau
7 printf("Nhap vao ban kinh cua hinh cau: ");
10 printf("The tich cua hinh cau ban kinh %.2f la %5.2f.\n", r, V);
KÁt quÁ căa ch¤¢ng trình
Nhap vao ban kinh cua hinh cau: 6
The tich cua hinh cau ban kinh 6.00 la 904.78
ViÁt ch¤¢ng trình tính chu vi và dián tích cąa hình chč nhÁt, khi biÁt chiÃu dài và chiÃu rùng
Chu vi cąa hỡnh chč nhÁt CV = 2*(a + b) vủi a, b là chiÃu dài và chiÃu rùng cąa hỡnh chč nhÁt;
Dián tích cąa hình chč nhÁt S = a * b
- NhÁp vào chiÃu dài và chiÃu rùng cąa hỡnh chč nhÁt;
- Sċ dăng công thćc tính chu vi và dián tính hình chč nhÁt đÅ tính
- In kÁt quÁ ra màn hình
7 printf("Nhap chieu dai cua hinh chu nhat: ");
9 printf("Nhap chieu rong cua hinh chu nhat: ");
11 cv = 2.0 * (chieu_dai + chieu_rong);
13 printf("Chu vi cua hinh chu nhat la % 4.2f\n", cv);
14 printf("Dien tich cua hinh chu nhat la %4.2f\n", S);
Nhap chieu dai cua hinh chu nhat: 8.2
Nhap chieu rong cua hinh chu nhat: 6.4
Chu vi cua hinh chu nhat la 29.20
Dien tich cua hinh chu nhat la 52.48
ViÁt ch¤¢ng trình nhÁp vào thói gian di chuyÅn cąa các ph¤¢ng tián (tớnh theo giú và phỳt) Quy đởi thúi gian di chuyÅn sang phỳt
KÁt quÁ mong muỗn: 277 phỳt
- NhÁp vào sỗ giú di chuyÅn sỗ phỳt di chuyÅn
- Sċ dăng cụng thćc chuyÅn đởi: sỗ phỳt (tởng) = Sỗ giú * 60 + sỗ phỳt
- In kÁt quÁ ra màn hình
2 #define M 60 // so phut cua mot gio
7 int tot_mins; //tong so phut
13 printf("Tong cong co: %d phut.\n", tot_mins);
ViÁt chÔÂng trỡnh thďc hiỏn phộp cùng, trĉ, nhõn, chia hai sỗ, chia lÃy d¤
Phác thÁo ch¤¢ng trình:
- NhÁp vào hai sỗ (kiÅu nguyờn hoÁc kiÅu thďc)
- Sċ dăng cỏc cụng thćc tớnh tởng, tớnh hiỏu, tớnh tớch, tớnh thÔÂng cąa hai sỗ
- In các kÁt quÁ thu đ¤āc ra màn hình
6 int tong, hieu, tich, mod;
8 printf("Nhap vao hai so cach nhau dau phay : ");
15 printf("Tong cua hai so = %d\n", tong); // in tong
16 printf("Hieu cua hai so = %d\n", hieu); // in hieu
17 printf("Tich cua hai so = %d\n", tich); //in tich
18 printf("Thuong cua hai so= %4.2f\n", thuong); // in thuong
19 printf("Du cua phep chia = %d\n", mod); // chia lay du
Nhap vao hai so cach nhau dau phay : 12, 6
ViÁt ch¤¢ng trình in lên màn hình dòng chč max thì gán b cho max;
9 printf("Gia tri lon nhat la: %d",max);
KÁt quÁ in ra màn hình:
Gia tri lon nhat la: 6
ViÁt chÔÂng trỡnh nhÁp vào tuởi cąa mùt ngÔúi, nÁu tuởi ngÔúi đú
> 18 tuởi thỡ in ra màn hỡnh 2 dũng:
Dũng 2: B¿n đą tuởi đÅ bồ phiÁu
NÁu tuởi ngÔúi đú < 18 tuởi thỡ khụng thďc hiỏn gỡ cÁ
- NhÁp vào tuởi cąa mùt ngÔúi
- KiÅm tra: nÁu tuởi 18 thỡ in ra 2 dũng nhÔ trờn
- NÁu tuởi < 18 thỡ khụng in gỡ cÁ
7 printf("Nhap vao ten cua ban:");
10 printf("Nhap vao tuoi cua ban %s: ", ten);
14 printf("Tuoi cua ban %s la 18+ \n",ten);
15 printf("Ban %s du tuoi de bo phieu",ten);
Nhap vao ten cua ban: Kien
Nhap vao tuoi cua ban Kien: 21
Tuoi cua ban Kien la 18+
Ban Kien du tuoi de bo phieu
3.1.1.2 Câu lệnh điều kiện đầy đủ
Câu lệnh điều kiện được sử dụng để thực hiện các hành động khi điều kiện đúng Trong trường hợp điều kiện sai, khối lệnh if sẽ bị bỏ qua, và chương trình sẽ thực hiện các câu lệnh khác Trong hầu hết các chương trình, chúng ta thường muốn tựa vào giá trị của điều kiện để quyết định xem chương trình sẽ thực hiện một hoặc nhiều câu lệnh nào đó Cú pháp của câu lệnh điều kiện là if (biểu thức).
Trong đó: expression: điÃu kiỏn, là mùt biÅu thćc logic statement block 1, statement block 2: khỗi cỏc cõu lỏnh đÔāc thďc thi b Ho¿t đùng
Dựa vào biểu thức điều kiện đúng hoặc sai, chương trình sẽ thực hiện khối lệnh tổng cộng Nếu biểu thức điều kiện đúng, thì thực hiện khối lệnh 1; nếu biểu thức điều kiện sai, thì thực hiện khối lệnh 2 Sự điều chỉnh khối lệnh này giúp tối ưu hóa quy trình xử lý trong lập trình.
Hỡnh 3.3 SÂ độ khỗi biÅu diòn cõu lỏnh if đ¿y đą
Kiểm tra ký tự nhập vào từ người dùng Nếu ký tự này nằm trong khoảng từ 'a' đến 'z', chuyển đổi nó sang chữ in hoa và in ra Ngược lại, in ra thông báo "Ký tự bạn vừa nhập là: c".
CÁC C Â U TRÚC PHÂN NHÁNH VÀ VềNG L ắ P
CÂU TRÚC VÒNG LÀP (FOR, WHILE, DO& WHILE)
NÁu in ra màn hình 10 dòng trong khi mãi viếc trong t¿m kiÅm soát, nhưng vẫn cần in ra 1000 dũng Việc này có thể gây ra sự khó chịu nhất định, do số dũng code lÁp đi lÁp l¿i.
Chương trình dài dòng và lặp lại nhiều lần sẽ gây khó khăn cho việc hiểu rõ và tái sử dụng mã nguồn Giải pháp hiệu quả là sử dụng vòng lặp, giúp chương trình chạy nhanh hơn, gọn gàng hơn và dễ dàng tái sử dụng mã.
Trong mút vũng lÁp, mút chÔÂng trỡnh thực hiện chuỗi các câu lệnh nhiều lần cho đến khi điều kiện bỏ sai được thỏa mãn Mút vũng lÁp bao gồm hai phần: phần thân của vòng lÁp và câu lệnh điều khiển Câu lệnh điều khiển là sự kết hợp của mút số điều kiện, điều khiển sự thực thi của phần thân vũng lÁp cho đến khi điều kiện được đánh trừ thành sai.
CÃu trúc lÁp bao gém:
3.2.1.1 Cú pháp for (Exp1; Exp2; Exp3) statement;
- Exp1: BiÅu thćc khõi t¿o cho biÁn;
- Exp2: BiÅu thćc điÃu kián - điÃu kián lÁp;
- Exp3: BÔủc nhÁy - thay đởi giỏ trỏ cąa biÁn vũng lÁp
- statement: câu lánh đ¤āc thďc thi, có thÅ là câu lánh đ¢n, hoÁc câu lánh ghép
Exp1, Exp2, Exp3 có thÅ v¿ng mÁt trong câu lánh nh¤ng các dÃu chÃm phÁy phÁi xuÃt hián trong cÃu trúc
BÔủc 2: KiÅm tra điÃu kiỏn exp2
- NÁu điÃu kiỏn đỳng thỡ thďc hiỏn lỏnh statement và sang bÔủc 3
- NÁu điÃu kiỏn sai sang bÔủc 4
BÔủc 3: Thďc hiỏn exp3 và quay l¿i bÔủc 2
BÔủc 4: Thoỏt khồi vũng lÁp
Hỡnh 3.7 SÂ độ khỗi biÅu diòn vũng lÁp for
Khai bỏo biÁn tởng s, khừi t¿o giỏ trỏ ban đ¿u s = 0 ĐÅ tớnh tởng cỏc sỗ tĉ 1 đÁn 10, ta sċ dăng mùt biÁn i Ban đ¿u gỏn i
= 0, cho i ch¿y tĉ 1 đÁn 10, ćng vủi mới i ta cùng vào s nhÔ sau:
Vủi i = 10, s10 = (0 + 1 + 2 + 3 + & + 9) + 10 = s9 + 10 = s9 + i , tăng i = 11, dĉng ch¤¢ng trình
+ Vủi i 10 thỡ thďc hiỏn tớnh tởng, nÁu i > 10 thỡ dĉng chÔÂng trình
+ Vủi mới giỏ trỏ biÁn i ta cú hai biÅu thćc giỗng nhau: i + 1 và s + i
Chú ý: ủ CÃu trỳc for cú thÅ lộng vào nhau
ViÁt ch¤¢ng trình in ra hình chč nhÁt sao nh¤ sau:
Hỡnh chč nhÁt sao cú 5 hàng và 10 cùt là ma trÁn 5 10 Đỗi vủi 5 hàng: ta dựng biÁn ch¿y i tĉ 0 đÁn 4
Vủi i = 0, hàng đ¿u thỡ phÁi in ra đÔāc 10 cùt *, ta dựng biÁn ch¿y j, duyỏt cùt tĉ 0 đÁn 9
Vủi i = 1 hàng thć hai cũng phÁi in ra đÔāc 10 cùt *, ta dựng biÁn ch¿y j, duyỏt cùt tĉ 0 đÁn 9
Vủi i = 4, hàng thć 5 cũng phÁi in ra đÔāc 10 cùt *, ta dựng biÁn ch¿y j, duyỏt cùt tĉ 0 đÁn 9
Ta thÃy i duyát tĉ 0 đÁn 4, lÁp đi lÁp l¿i công viác biÁn j duyát tĉ 0 đÁn 9 và in ra dÃu *
Dựng mùt vũng for cho biÁn ch¿y i, ćng vủi mới i dựng mùt vũng for cho biÁn ch¿y j
ViÁt chÔÂng trỡnh in ra trờn màn hỡnh mùt ma trÁn cú n dũng m cùt nh¤ sau:
5 printf("\n Nhap vao so dong va so cot :");
Nhap vao so dong va so cot :7 8
7 8 9 10 11 12 13 14 ò Trong câu lánh for, có thÅ s¿ không có ph¿n Exp1 (ph¿n khõi t¿o) int i; i = 0; for (; i < 10; i++) printf( 0 nhÁp tĉ bàn phím) nh¤ sau: n = 4
- KiÅm tra điÃu kiỏn n đÔāc nhÁp vào đÁm bÁo lủn hÂn 0
- Vủi mới dũng in ra sỗ dÃu * bÁng đỳng thć tď dũng
8 // Kiem tra dieu kien cua n
11 printf("Phai nhap n > 0 \nNhap lai n: ");
14 // In ra tam giac vuong co chieu cao n
NhÁp vào mùt sỗ n (n > 0), kiÅm tra xem sỗ đú cú phÁi là sỗ hoàn hÁo không?
In ra cỏc sỗ hoàn hÁo nhồ hÂn n (sỗ hoàn hÁo là sỗ cú tởng cỏc Ôủc chớnh nú, chẳng h¿n 6 cú cỏc Ôủc 1, 2, 3 và 1 + 2 + 3 = 6)
Kiểm tra số nháp vào một số hoàn hảo là một quá trình xác định xem số đó có phải là số hoàn hảo hay không Để thực hiện việc này, chúng ta cần xác định các ước của số đó (trong đó ước là số n) và tính tổng các ước này Nếu tổng các ước bằng chính số nháp, thì kết luận đó là số hoàn hảo; ngược lại, nếu không bằng, thì số đó không phải là số hoàn hảo.
Để liệt kê tất cả các số hoàn hảo nhỏ hơn n, chúng ta kiểm tra từng số trong phạm vi từ 0 đến n, theo bước 1 Nếu số đó là số hoàn hảo, chúng ta sẽ in số đó ra, ngược lại sẽ bỏ qua và kiểm tra số tiếp theo.
9 if (sum == n) printf("%u la so hoan hao",n);
10 else printf("%u khong la so hoan hao",n);
11 printf( "\nCac so hoan hao nho hon %u: ", n );
50 khong la so hoan hao
Cac so hoan hao nho hon 50: 6 28
NhÁp mùt sỗ nguyờn dÔÂng n XuÃt ra sỗ ngÔāc l¿i
Liệu pháp thực hiện phép chia của số và nháp cho 10, kết quả thu được sẽ là phép chia cho 10, và vui lòng lấy phần dư Trong các số dư thu được, các phép chia sẽ được hiển thị trên màn hình.
7 printf("So dao cua %d la ", n);
ViÁt chÔÂng trỡnh tớnh căn sỗ liờn tăc sau:
Dò dàng nhÁn thÃy cụng thćc truy hội cąa căn liờn tăc trờn: ĐiÃu kián đ¿u: √
√ NhÔ vÁy, ta c¿n thďc hiỏn mùt vũng lÁp vủi biÁn đÁm k ch¿y tĉ 2 (vỡ s1 ćng vủi k = 1 đó đÔāc tớnh) đÁn n BiÅu thćc trong thõn vũng lÁp:
3.2.2.1 Cú pháp while (expression) statement;
- expression: BiÅu thćc điÃu kián
- statement: khỗi lỏnh (là cõu lỏnh đÂn hoÁc cõu lỏnh ghộp), gói là thân vòng lÁp
Chĉng nào biÅu thćc điÃu kián còn đúng thì thďc hián lánh, biÅu thćc điÃu kiỏn sai thỡ thoỏt khồi vũng lÁp
Hỡnh 3.8 SÂ độ khỗi biÅu diòn vũng lÁp while L¤u ý:
Câu lánh while có thÅ léng vào nhau: if (n < 10 && m < 20)
NhÁp mùt sỗ nguyờn dÔÂng n XuÃt ra sỗ ngÔāc l¿i
Để giải bài toán 3.23, chúng ta sử dụng vòng lặp for, tuy nhiên, trong vòng lặp này cần loại bỏ hai biểu thức Exp1 và Exp3 do không có biến chạy và bậc nhảy Cần xem xét điều kiện dừng của vòng lặp Bài toán này không biết trước số lần lặp lại.
Và chĉng nào điÃu kiỏn cũn đỳng n khỏc 0 thỡ thďc hiỏn phộp lÃy sỗ đÂn vỏ (n%10) và bồ sỗ đÂn vỏ (n/10)
Dùng while xċ lý nh¤ sau:
7 printf("So dao cua %d la ", n);
Qua ví dă 3.23 và 3.25, ta thÃy bài toán này dùng vòng lÁp while gãn và rõ ràng h¢n
VÁy nhčng bài toỏn biÁt trÔủc sỗ l¿n lÁp ta dựng for;
Bài toỏn khụng biÁt trÔủc sỗ l¿n lÁp ta dựng while
ViÁt chÔÂng trỡnh chuyÅn sỗ nhỏ phõn sang hỏ thÁp phõn
Phác hãa lói giÁi Đởi hỏ nhỏ phõn sang hỏ thÁp phõn:
Ta dựng mùt biÁn donvi đÅ l¿n lÔāt lÃy chč sỗ hàng đÂn vỏ cąa sỗ nhỏ phõn
BiÁn decimal đÅ tớnh sỗ thÁp phõn
BiÁn num đÅ lÃy ph¿n nguyờn sau khi bồ hàng đÂn vỏ
BiÁn base là c sỗ 2, ban đ¿u base = 1 = 2 0
Chĉng nào biÁn num cũn lủn hÂn 0 thỡ thďc hiỏn cỏc thao tỏc trờn
5 int num, binary, decimal = 0, base = 1, donvi;
6 printf("\nNhap so nhi phan(1 & 0): ");
16 printf("So nhi phan = %d \n", binary);
17 printf("Gia tri he thap phan = %d \n", decimal);
Gia tri he thap phan = 11
ViÁt chÔÂng trỡnh đởi hỏ thÁp phõn sang hỏ nhỏ phõn
Phác hãa lói giÁi Đởi hỏ thÁp phõn sang hỏ nhỏ phõn:
Ta lÃy sỗ thÁp phõn chia d¿n cho 2 chĉng nào thÔÂng = 0 thỡ phộp chia dĉng, cỏch chuyÅn đởi đÔāc lÃy tĉ dÔủi lờn
BiÁn ng đÅ l¤u ph¿n d¤ cąa phép chia decimal cho 2
BiÁn base =1 míi l¿n lÁp tăng d¿n lên 10 l¿n
BiÁn num đÅ lÃy ph¿n nguyên sau khi decimal chia cho 2
BiÁn binary đÅ lÔu cỏc sỗ dÔ cąa phộp chia decimal cho 2
Chĉng nào biÁn num cũn lủn hÂn 0 thỡ thďc hiỏn cỏc thao tỏc trờn
Hỡnh 3.9 ChuyÅn sỗ thÁp phõn sang sỗ nhỏ phõn
5 unsigned long num, binary = 0, decimal, base = 1, ng;
6 printf("\nNhap so nguyen he thap phan: ");
16 printf("So thap phan = %d \n", decimal);
17 printf("So nhi phan = %d \n", binary);
Nhap so nguyen he thap phan: 125
3.2.3 CÃu trúc vòng l¿p do & while
- expression: BiÅu thćc điÃu kiỏn, là mùt biÅu thćc logic
- statement: Câu lánh trong vòng lÁp
BÔủc 1: Thďc hiỏn cỏc lỏnh bờn trong thõn vũng lÁp do&while BÔủc 2: KiÅm tra điÃu kiỏn, chĉng nào điÃu kiỏn cũn đỳng thỡ thďc hiỏn lỏnh, điÃu kiỏn sai thỡ thoỏt khồi vũng lÁp
Hỡnh 3.10 SÂ độ khỗi biÅu diòn vũng lÁp do& while
L¤u ý: ủ Cõu lỏnh do& while cú thÅ lộng nhau do
} while (a < 20); ò Câu lánh do& while s¿ đ¤āc thďc hián ít nhÃt 1 l¿n do
ViÁt ch¤¢ng trình thďc hián các yêu c¿u sau:
Nhập vào 3 số thực a, b, c trên bàn phím Đầu tiên, kiểm tra xem a, b, c có lập thành ba cạnh của một tam giác hay không Nếu có, tiếp tục xác định loại tam giác: cân, đều, vuông hay thường Cuối cùng, tính chu vi và diện tích của tam giác, sau đó in kết quả ra màn hình.
KÁt quÁ mong đāi: Không là ba c¿nh tam giác
KÁt quÁ mong đāi: Tam giác th¤óng
Để giải quyết bài toán này, chúng ta sẽ sử dụng cấu trúc lặp do while, trong đó điều kiện sẽ được kiểm tra sau khi thực hiện khối lệnh Cụ thể, chúng ta sẽ viết ràng buộc cho các biến a, b, c để đảm bảo rằng các giá trị này thỏa mãn yêu cầu đề bài.
21 if (a == b && b == c) printf( 1000000) và sỗ tiÃn s¿ nhÁn đÔāc b (ràng buùc điÃu kiỏn b > a) Yờu c¿u in ra sỗ năm c¿n gċi, biÁt mćc lãi xuÃt 8 % /năm
- Tớnh theo cụng thćc lói kộp, lói nhÁp vỗn:
+ Lói = gỗc*(1+lói suÃt)^n - gỗc
+ Sỗ tiÃn rỳt ra = gỗc*(1+lói suÃt kỳ)^n (cụng thćc cąa FV) vủi n là sỗ năm gċi
- Sċ dăng hàm pow (x, y) đÅ tính x^y (chú ý khai báo táp tiêu đÃ
9 printf("Nhap vao so tien can gui: ");
13 if (sotiengui 0) và thực hiện các yêu cầu sau: a Xác định số chữ số của n b Tìm chữ số cuối cùng của n c Tìm chữ số đầu tiên của n d Tính tổng các chữ số của n e Tìm số đảo ngược của n.
T¿i sao chúng ta c¿n hàm? Có ba lý do sau đây đ¤āc đ¤a ra giÁi thích cho lý do t¿i sao trong mùt chÔÂng trỡnh nờn cú cỏc hàm:
Hàm là công cụ quan trọng giúp chúng ta quản lý và tối ưu hóa mã nguồn trong lập trình Thay vì phải sao chép và dán mã nhiều lần trong một phần mềm, chúng ta có thể tạo ra một hàm và gọi nó từ nhiều nơi Điều này không chỉ giúp giảm thiểu việc sửa đổi mã ở nhiều vị trí khác nhau mà còn làm cho chương trình trở nên gọn gàng và dễ bảo trì hơn.
Hàm độc lập có cấu trúc giống các mô-đun, cho phép xử lý nhiều dữ liệu hiệu quả Việc đọc và sử dụng hàm này giúp tiết kiệm thời gian và nâng cao hiệu suất làm việc Các hàm được chia theo các mã độc lập, tạo điều kiện thuận lợi cho việc quản lý và vận hành dữ liệu.
Thế bào, hàm cung cấp sức trẻ trung Chúng ta có thể sử dụng các hàm như các thành phần mà không phải lo lắng về việc hoạt động bên trong của nó.
ChÔÂng 4 cąa giỏo trỡnh, giủi thiỏu cỏc khỏi niỏm và hàm, cỏch thćc khai bỏo hàm, truyÃn cỏc tham sỗ cho hàm và cỏch gói hàm trong chÔÂng trỡnh
Hàm là một công cụ quan trọng trong lập trình, cho phép thực hiện một khối công việc nhiều lần trong quá trình chạy chương trình Việc sử dụng hàm giúp tổ chức mã nguồn một cách hiệu quả, giảm thiểu sự phức tạp và tăng tính tái sử dụng trong lập trình.
Xem xét ví dă sau đây:
ViÁt chÔÂng trỡnh nhÁp vào ba sỗ nguyờn a, b, c L¿n lÔāt tớnh tởng a + b, a + c, b + c và in kÁt quÁ ra màn hình
5 printf("Nhap vao ba so: ");
Ch¤¢ng trình có nhčng công viác đ¤āc lÁp l¿i, chẳng h¿n các công viác õ dòng lánh 7 đÁn dòng lánh 9, dòng lánh 10 đÁn dòng lánh 12
Có thÅ xây dďng các hàm thÅ hián các công viác đó nh¤ sau:
2 void tong(int x, int y); // khai bao phuong thuc tong
6 printf("Nhap vao ba so: ");
13 void tong(int x,int y) // dinh nghia ham tinh tong
4.1.1.2 Phân loại hàm a Th° viện chuẩn
Các hàm trong thư viện chuẩn của ngôn ngữ C là những hàm được sử dụng để thực hiện các công việc tính toán trong toán học, xử lý đầu vào và đầu ra (I/O), cũng như xử lý chuỗi, v.v.
Các hàm trong táp tiêu chuẩn được sử dụng để thực hiện các thao tác đầu ra, trong đó hàm printf() là hàm phổ biến nhất để hiển thị dữ liệu trên màn hình Khi khai báo táp tiêu chuẩn này, các hàm có sẵn sẽ được sử dụng để in thông tin ra màn hình.
Cú rít nhiều hàm định nghĩa trong cục mút thư viện, chẳng hạn như trong thư viện , ngoài hàm printf(), còn có nhiều hàm như scanf(), fprintf(), getchar(), v.v Những hàm này sẽ được sử dụng khi đã khai báo tham số.
Hàm trong lập trình được chia thành hai loại chính: hàm có giá trị trả về như sqrt() và abs(), và hàm không có giá trị trả về như exit() và getch() Ngoài ra, người dùng cũng có thể định nghĩa các hàm riêng của mình.
Ngôn ngč C cho phép lÁp trình viên xác đánh các hàm Hàm đ¤āc t¿o bõi ng¤ói dùng đ¤āc gãi là hàm do ng¤ói dùng đánh ngh*a
Hàm do ng¤ói lÁp trình tď đánh ngh*a: có 2 lo¿i: o Hàm có giá trá trÁ vÃ: tong(), nguyento(), v.v o Hàm không có giá trá trÁ vÃ: nhapmang(), xuatmang(), v.v
4.1.1.3 ¯u điểm của hàm do ng°ời dùng định nghĩa
- ChÔÂng trỡnh dò hiÅu, dò duy trỡ và dò gÿ lới
- Tái sċ dăng mã trong nhiÃu ch¤¢ng trình khác
Mút chương trình lùn có thể được phân chia thành các mụ đun nhỏ hơn Điều này cho phép mút dạy ấn lùn có thể chia sẻ cho nhiều lập trình viên cùng thực hiện.
4.1.1.4 Cách xác định một hàm
Mùt hàm c¿n phÁi xỏc đỏnh 3 thụng tin:
- Tham sỗ cąa hàm (dč liỏu vào)
- KiÅu dč liáu trÁ và (kiÅu hàm)
4.1.2.1 Cấu trúc ch°¡ng trình chứa hàm
Trong đó: functionName(): tên cąa hàm
Chương trình bắt đầu thực thi từ hàm main() Khi trình biên dịch gặp hàm functionName() trong hàm main(), điều khiển chương trình sẽ chuyển đến hàm void functionName() Tại đây, trình biên dịch sẽ thực thi các mã lệnh bên trong hàm cho đến khi hoàn tất Sau khi tất cả mã trong thân hàm void functionName() được thực thi, điều khiển chương trình sẽ quay lại câu lệnh tiếp theo sau lệnh gọi hàm functionName() trong hàm main().
Hình 4.1 Minh hãa cách thćc thďc thi hàm functionName()
4.1.2.2 Khai báo hàm a Khai báo nguyên mẫu hàm
Mẫu nguyên mẫu hàm đần gián là một tài liệu quan trọng để khai báo hàm, bao gồm tên, tham số và kiểu trả về của hàm, không chỉ là thân hàm Mẫu nguyên mẫu hàm cung cấp thông tin cho trình biên dịch biết hàm này có thể được sử dụng sau này trong chương trình.
THAO TÁC XĊ LÝ VðI TàP
tĉ mỏy tớnh này sang mỏy tớnh khỏc mà khụng cú bÃt kỳ thay đởi nào
Mút tỏp là một tài nguyên được sử dụng để lưu trữ thông tin lâu dài, có thể truy cập dễ dàng cho các chương trình máy tính.
Tập tin trên RAM lưu trữ dữ liệu dưới dạng nhị phân (0 hoặc 1), nhưng loại thông tin mà chúng ta có thể nhận được phụ thuộc vào định dạng của tập tin và cách mà phần mềm xử lý nó Ví dụ, tệp png được chuyển đổi thành hình ảnh, trong khi Microsoft Word chuyển đổi dãy bit thành văn bản.
Trong ngụn ngữ lập trình C, Tóp là kiểu dữ liệu động, được sử dụng để xác định một stream và chứa các thông tin cần thiết để điều khiển, bao gồm một con trỏ trỏ đến buffer của nó, các thuộc tính và trạng thái của nó.
Trong ngôn ngč lÁp trình C, có hai lo¿i táp đ¤āc đà cÁp:
Các tệp văn bản là các tệp txt, có thể được tạo bằng Notepad hoặc bất kỳ trình soạn thảo văn bản đơn giản nào Khi mở các tệp này, chúng ta sẽ thấy nội dung trong tệp dưới dạng văn bản thuần túy, có thể dễ dàng chỉnh sửa hoặc xóa nội dung.
Các táp nhá phân chą yÁu là các táp bin trong máy tính, cho phép lưu trữ dữ liệu một cách hiệu quả Thay vì lưu trữ dữ liệu trong văn bản thuần túy, các táp này giúp quản lý và tổ chức thông tin một cách linh hoạt hơn.
(0 và 1) Chúng có thÅ chća l¤āng dč liáu cao h¢n, không thÅ đãc đ¤āc dò dàng và cung cÃp bÁo mÁt tỗt hÂn cỏc tỏp văn bÁn
7.2 THAO TÁC XĈ LÝ VðI TÈP
7.2.1 Cỏc thao tỏc vủi tẫp tin
Trong ngữ ngữ lập trình C, có thể thực hiện bốn thao tác chính trên tệp, bao gồm: tạo một tệp mới, mở tệp tin hiện có, đóng tệp tin và đọc cũng như ghi nội dung trong tệp tin.
Khi làm viỏc vủi cỏc tỏp, b¿n c¿n khai bỏo mùt con trồ cąa lo¿i tỏp Khai báo này là c¿n thiÁt đÅ liên l¿c giča các tÁp tin và ch¤¢ng trình
Trong đú fptr là biÁn con trồ, đ¿i diỏn cho tỏp tin
Trong đú f1, f2 là cỏc biÁn con trồ, đ¿i diỏn cho tỏp tin
Viác mõ táp đ¤āc thďc hián thông hàm fopen() trong th¤ vián
Cỳ phỏp mừ mùt tỏp tin tiờu chuÁn I/O: ptr = fopen("fileopen","mode")
Ví dā 7.2 fopen("E:\\cprogram\\data1.txt","w");
Để tạo tệp tin data1.txt trong thư mục mặc định E:\cprogram (nơi lưu trữ các chương trình viết bằng ngôn ngữ C), hàm fopen() sẽ được sử dụng để tạo tệp tin với tên data1.txt Tệp tin này sẽ được ghi theo chế độ