ThS Nguyễn Đỡnh Luyện Bộ mụn: Điện tử - Viễn thụng Trang 2 Phần thứ nhất Cơ sở của ngôn ngữ lập trình C++ Ngôn ngữ lập trình C++ là mức nâng cao cuả ngôn ngữ C.. Dennis Richie đã xây
Trang 1KHOA KỸ THUẬT VÀ CÔNG NGHỆ
- -
BÀI GIẢNG
Ngôn ngữ lập trình C/C++
Biên soạn: GVC ThS Nguyễn Đình Luyện
Bộ môn: Điện tử - Viễn thông
Tài liệu lưu hành nội bộ
Trang 2Phần thứ nhất
Ngôn ngữ lập trình C++ là mức nâng cao cuả ngôn ngữ C Dennis Richie đã xây dựng và lần
đầu tiên ứng dụng ngôn ngữ lập trình C vào máy tính DEC PDP-11 với hệ điều hành UNIX.Cũng phải nói C bắt nguồn từ một ngôn ngữ sớm hơn là BCPL Martin Richards và Ken Thomson đã tạo ra ngôn ngữ B và sau đó là hình thành ra ngôn ngữ C vào năm 1970
Sau một thời gian dài hai tác giả Brian Kernighan và Dennis Richie đã cho ấn hành cuốn sách "The C Programming Language" ( nhà xuất bản Prentice-Hall 1978).Dù sao , ngôn ngữ mới được hình thành nên chưa có chuẩn mực Do đó vào mùa hè 1983 ANSI (American National Standards Institute) đã lập một ủy ban để thực hiện việc tiêu chuẩn hóa ngôn ngữ C.Cuối cùng vào khoảng 1990, TURBO C đã được ra đời dựa trên chuẩn của ANSI
Trình biên dịch (compiler) của Turbo C rất hiệu quả , nhanh và thích hợp cho cả môi trường lập trình modul cũng như lập trình theo dòng lệnh truyền thống mà đại đa số những người lập trình sử dụng.Cần phân biệt giữa hai cách "Dịch" ,đó là dịch theo từng dòng lệnh - interpreter từ trên xuống dưới tuần tự như ngôn ngữ BASIC và "biên dịch"-compiler là đọc toàn bộ chương trình rồi chuyển thành mã đối tượng (object code) Mã đối tượng cũng chính
là mã nhị phân hay mã máy và máy tính có thể thực hiện nhanh chóng
C là ngôn ngữ có cấu trúc (structured language) tức là bao hàm các khối mà ta gọi là chương trình con hay hàm (functions)
Ngôn ngữ lập trình được chia thành 3 cấp (theo nghĩa gần gũi với ngôn ngữ máy):
- Cấp cao : Ada, Modula-2, Pascal, Borland Delphi,COBOL,FORTRAN,BASIC
- Cấp trung : C, FORTH ,Macro Assembly language
- Cấp thấp : Assembly language , Machine Code
Nếu nói C++ là C tốt hơn ,hoàn hảo hơn như vậy còn chưa đủ C++ đáp ứng cho những người lập trình có phong cách "lập trình hướng đối tượng" (Object Oriented Programming -OOP)
C++ do Bjarne Stroustrup đề xuất vào năm 1980 tại phòng thí nghiệm Bell ở New Jersey Đầu tiên gọi là " C với lớp " ( C with class ) Tên này được đổi thành C++ ( C plus plus ) vào năm 1983 Kể từ đó C++ đã trải qua hai lần chỉnh lý cơ bản vào năm 1985 và 1990 Dự thảo
về tiêu chuẩn hóa C++ được đề nghị lần đầu vào ngày 25-1-1994 ủy ban ANSI C++ thực ra vẫn còn giữ lại được những đặc thù do Stroustrup đề ra và cũng như có bổ xung thêm một số nét mới Thật ra cho đến nay để công bố một ANSI C++ hoàn hảo là chưa có Tuy nhiên những gì đã có trên mọi tài liệu sách vở và các chương trình lớn nhỏ của C++ cũng đủ đảm bảo tính ổn định của ngôn ngữ lập trình C++, mà điều đáng quan tâm là lập trình hướng đối tượng
Trang 3Ngôn ngữ C/C++ do nhiều hãng viết như : + Borland
+ Microsoft + AT & T Thực ra về tinh thần bản chất của ngôn ngữ C++ không thay đổi là mấy nhưng tùy ý người lập trình thích và quen sử dụng của hãng nào là do mình chọn lựa Tuy vậy môi trường
sử dụng C++ như DOS , Windows, UNIX , OS/2 là khác nhau Đại đa số những người lập trình chuyên nghiệp cũng như người mới bắt đầu đều ưa chuộng Borland C++
Từ những năm 1990 trở lại nay ta có thể kể ra các ấn bản C++ :
******
Trang 4
Chương trình được viết trong ô chữ nhật là đày đủ ,còn các số đánh ở ngoài từ 1 -10 là để phục
vụ cho việc giải thích
Dòng 1 :gọi tệp tiêu đề <iostream.h > để cho các hàm vào/ra màn hình như cout<<
2 : tệp tiêu đề <conio.h> để cho các hàm clrscr() và hàm getch()
4 : Hàm main() bắt buộc phải có trong bất kể chương trình C++ nào
5 : Dấu { để mở khối hàm main()
6 : Hàm để xóa màn hình
7 : Hàm in ra một chuỗi ký tự ra màn hình
8 : Hàm đợi gõ một phím từ bàn phím
9 : Hàm return 0 hay viết return(0) phải có đối với C++
10 : Dấu } để đóng khối của hàm main()
Sau khi đã soạn thảo xong chương trình ,ta ấn phím F2 ,đặt tên cho chương trình đó để cất (save) vào đĩa cứng hoặc đĩa mềm Để chạy được chương trình ta ấn hai phím Ctrl và F9
Lưu ý khi soạn thảo chương trình ta không gõ vào các số từ dòng 1 đến dòng 10
Trang 5
Kết quả sẽ hiện lên :
C + + chao cac ban !
Một chương trình C++ thứ hai rất đúng cú pháp ,kích thước nhỏ nhất nhưng không làm một việc gì cả (không có một ý nghĩa thực tế nào )
đã có ở trong C thì C++ đều thừa hưởng được cả Thực ra trong C không cần lệnh return 0 ở cuối chương trình nhưng để CT3 chạy trong C++ không bị cảnh báo ta vẫn viết lệnh đó
- Hai chương trình CT1 và CT3 không khác nhau nhiều lắm Dù sao đây cũng là chương trình
đơn giản đàu tiên Sau này các bạn sẽ dần dần thấy được sức mạnh của ngôn ngữ C++ so với C như thế nào
Trang 6
- Đa phần các chương trình viết trong Turbo C có đuôi c có thể chạy được trong C++,nhưng rất nhiều chương trình viết trong C++ không thể chạy được trong C Thậm chí ngay trong C++ nếu viết chương trình trong C++ ở những version mới nhất như ở Borland C++ 4.0 hay 4.5 có khi cũng không chạy được trong TC++ 1.0 hay Borland C ++ 3.0
- Một chương trình C++ , ngoài hàm main() bắt buộc còn có nhiều hàm con khác.Các
hàm đó nằm ở ngoài hàm main() Cấu trúc chủ yếu của một chương trình C++ như sau :
#include <iostream.h>
#include <conio.h>
#include < > //co nhieu include khac nhau
float ham1(); //Khai bao ham bat buoc -prototype function
- Sách này viết cho người mới bắt đầu (beginers ) không cần phải biết một tý nào về ngôn ngữ
C cả ,nghĩa là không cần học C vẫn tiến thẳng vao C++ được.Đồng thời nó cũng làm tài liệu học tập tốt cho các bạn biết lập trình khá về C cũng như hiểu biết căn bản về C++
I.2 Các từ khóa (keywords)
Từ khóa là những từ căn bản do chuẩn ANSI và C++ đưa ra để người lập trình sử dụng trong chương trình
Trang 7Tất cả các từ khóa đều viết thường Không được dùng từ khóa để đặt tên biến ,hàm ,
- Các từ khóa của ANSI C :
asm default for short union
const extern register switch
continue float return typedef
-Các từ khóa của dự thảo ANSI C++
Ngoài 33 từ khóa của ANSI C còn có thêm 13 từ khóa sau :
delete class public template overload
protected operator virtual catch
- Các từ khóa của Borland C++ (Tính đến version 4.5)
_huge _interrupt _loadds _near _pascal
cdecl except huge loadds seg
fastcall finally interrupt saveregs stdcall
fastcall _import import
I.3 Biến -Tên
- Biến do người lập trình đặt tên ,tuyệt đói không được trùng với bất cứ từ khóa nào đã kể ra ở
trên
- Biến trước khi sử dụng ,cần phải được khai báo kiểu
- Biến có thể được gán một ký tự ,một hằng số (int,float,double,long .),một chuỗi ký
tự,một mảng
- Tên biến (hoặc tên hàm ) (còn gọi là Identifiers) :
-Gồm các chữ cái thường ,chữ hoa và dấu gạch dưới :
a b c d e f g h i j k l m n o p q r s t u v w x y z _
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Trang 8Identifiers chỉ có hai điều kiện :
1 Ký tự đầu tiên phải là chữ cái hoặc dấu gạch dưới ( _ )
Hanoi 6hanoi (sai vì có số đầu )
ha_noi ha!noi (sai vì có dấu lạ !)
so_int1 static (sai vì sử dụng từ khóa)
enumfloat $v1 (sai vì có dấu $ )
I.4 Các kiểu khai báo
Có 3 kiểu khai báo chính :
- Kiểu nguyên (integer) ,cách viết trong C++ là : int
- Kiểu dấu phẩy động (floating point) ,cách viết trong C++ : float
- Kiểu ký tự , chuỗi (char ) , cách viết trong C++ : char
Trong Bảng I.1 nêu tóm tắt các kiểu khai báo dữ liệu (hằng hệ cơ số 10):
Bảng I1
Kiểu dữ liệu Khai báo Độ dài Phạm vi giá trị
trong C++ (bit) Nguyên int 16 -32768 đến 32767
Nguyên ngắn short int 16 -32768 đến 32767
Nguyên dương unsigned int 16 0 đến 65535
Ký tự,chuỗi char 8 -128 đến 127
Ký tự không dấu unsigned char 8 0 đến 255
Nguyên dài long int 32 -2147483648 đến
2147483647 Nguyên dương unsigned long 32 0 đến 4294967295
Dấu phẩy động float 32 3.4E-38 đến 1.7E+38
Chính xác kép double 64 1.7E-308 đến 1.7E+308
Chính xác kép dài long double 80 3.4E-4932 đến 1.1E+4932
Trang 9
Hằng số có các loại :Hằng số thập phân,hằng số bát phân (hệ cơ số 8),hằng số thập lục phân
(hệ Hexadecimal - cơ số 16) ,hằng ký tự
Sau một hằng có một tiếp vĩ (đuôi) L hoăc l :đó là hằng kiểu long , có duôi U hoặc u đó là
hằng kiểu unsigned (kiểu không dấu hay là hằng không âm )
unsigned long truncated Hằng hệ 16 - Hexadecimal
unsigned long truncated
Kiểu dữ liệu của hằng ở trong các kiểu được liệ kê dưới đây không phải cần gán bất cứ một
đuôi U hoặc u nào cả
int , unsigned int , long int , unsigned long int
Nếu hằng có đuôi U hoặc u thì dữ liệu của nó sẽ thuộc kiểu long int , unsigned long int
Nếu hằng có kiểu đuôi L hoặc l thì dữ liệu của nó thuộc kiểu long int , unsigned long int
Nếu hằng có bao gồm cả đuôi u và l ( hoặc U và L ) thì dữ liệu của nó thuộc kiểu unsigned
long int
Cách viết hằng số như sau gồm các số từ 0 - 9 :
+ Hằng nguyên : 123 5487 9999 55L 7643l
+ Hằng hệ bát phân gồm các số từ 0 - 7 : 0167 0757 01 0777
+ Hằng hệ thập lục phân (16) gồm cac chữ số từ 0 -9 ,a,b,c,d,e,f Chữ số đầu tiên luôn luôn là
số 0,tiếp đến chữ x và theo sau là các chữ số nói trên Ví dụ : 0x36 0x5feb
+ Hằng số dấu phẩy động (kể cả double và long double ) :
126.0 3.1415926 0.014 126 .015
+ Hằng ký tự ( Character constants ) ,hằng chuỗi (string) :
Một hằng ký tự là một hoặc nhiều ký tự được đóng trong một cặp dấu nháy đơn hay nháy kép
.Ví dụ như "A", "=", "\n" Trong C ,hằng ký tự đơn có kiểu int , tức là có độ dài 16 bit
Trang 10Ví dụ : "ha noi " , " thành công"
Một hằng string dài có thể viết trên nhiều dòng khác nhau ,nhưng mỗi lần xuống dòng ta phải
dùng dấu gạch chéo ngược \ ,ví dụ :
"đây là một dòng dài ta phải xuống dòng mới khác\
để các bạn lưu ý đừng quên"
Chuỗi thoát (Escape sequences)
Chuỗi thoát luôn phải dùng dấu gạch chéo ngược \ :
\a : phát tiếng loa ; \b :lùi về dấu cách (backspace )
\n : xuống dòng (newline) ; \t :sang phải 8 ký tự (horizontal tab )
\v : xuống dưới 8 dòng (vertical tab) ; \' :Dấu nháy đơn
\" : dấu nháy kép ; \r :Trỏ lại đầu dòng (carriage return )
\\ : Dấu gạch chéo ; \f :sang trang (formfeed)
\? : Dấu chấm hỏi ; \000 :ASCII số bát phân (hệ octal)
\00 : ASCII số hệ 16 (hexa)
Ví dụ : Trong hằng string có sử dụng dấu nháy kép ,ta viết như sau là hợp lệ:
"Cô Thu nói\"Chào anh ! \""
Hằng string là một mảng gồm có N ký tự,nhưng trong vùng nhớ phải luôn giành N+1
ô nhớ vì ký tự cuối cùng của nó bắt buộc là ký tự 0 (ASCII NUL ) '\0'
- Trong C++ biến có thể được khai báo ở vị trí ngay trước khi nó được sử dụng
- Nhiều biến có cùng một kiểu có thể nằm sau từ khóa kiểu và tách nhau bởi dấu
phẩy Khi khai báo ta có thể gán giá trị cụ thể cho biến Lệnh gán thực hiện băng toán tử dấu bằng = Ví dụ :
int bien1,bien2 = 75 ; float bf1,bf2 = 4.567,bf3 ; char a , b[1] = 'x' , xau [6] ="Hello" ;
- Muốn chuyển kiểu khai báo cho một biến ,ta có hai cách trong C++ :
ví dụ : int a=14,b=4; Khi thực hiện phép chia nếu viết a/b thì kết quả chỉ cho giá trị nguyên 3.Nếu ta chuyển kiểu (float)a/b hoặc float(a/b) sẽ cho kết quả 3.5 Cách viết chuyển kiểu (float)a/b là của ngôn ngữ C.Còn cách viết float(a/b) là của C++.Tất nhiên ở trong C++ cả hai cách viết đều hợp lệ
Trong C++,với một biểu thức số học có nhiều biến được khai báo theo nhiều kiểu khác nhau thì chương trình khi được thực hiện sẽ tự động chuyển thành kiểu phức tạp nhất
Trang 11I.5 Biểu thức số học và lôgic
Biểu thức số học là một biểu thức toán học chứa nhiều phép tính số học Tên một biến được gán bởi biểu thức số học luôn nằm ở phía bên trái của lệnh gán , còn bên phải là biểu thức số học Nếu có 2 biến A1 và A2 thì biểu thức số học (được gán tên BT1) sau đây là hợp lệ : BT1 = 5+A1-3*A2 ; Biểu thức số học ,tùy thuộc cách khai báo biến ,nó luôn có giá trị hoặc nguyên,hoặc float,hoặc double I.5.1 Toán tử số học Để tính toán các biểu thức số học ,có 5 toán tử số học sau đây :
Toán tử Chức năng int a=14 , b=4 ; Kết quả * nhân (a*b) 56
/ chia (a/b) 3
+ cộng (a+b) 18
- trừ (a-b) 10
% chia lấy phần dư (a%b) 2
I.5.2 Toán tử quan hệ Toán tử quan hệ chỉ cho kết quả giá trị đúng (true) khác 0 ,giá trị sai (false ) bằng 0 Toán tử Chức năng int a=15,b=4; Kết quả < bé hơn (a<b) sai
<= bé hơn và bằng (a<=b) sai > lớn hơn (a>b) đúng
>= lớn hơn và bằng (a>=b) sai
== bằng (a==b) sai != không bằng (a!=b) đúng
I.5.3 Toán tử Lôgic
Có ba toán tử logic : "và" ,"hoặc" và "phủ định"
&& (AND)
|| (OR)
! (NOT)
Ba toán tử logic kết hợp lại để tạo thành các biểu thức logic sẽ cho kết quả giá trị biểu thức logic
là 1 (True :đúng) hoặc 0 (False:sai).Biểu thức logic thương được dùng trong câu lệnh điều kiện
Ví dụ : (A<B) &&(B<C) cho giá trị đúng khi A=5,B=12, C=20 ;
((A<=B) &&(B<=C)) || ((C>=D)&&(D>=E))
Đối với toán tử phủ định (NOT):
- Nếu có (A>=B) là biểu thức quan hệ thì sẽ tương đương với cách viết logic :
!(A<B)
- Nếu có (A!=B) thì ta có thể viết cách tương đương !(A==B)
I.5.4 Toán tử tăng , giảm
-Khi một biến tăng lên một đơn vị ,ta có thể viết : i=i+1;
Trang 12Lệnh này tương đương với cách viết : i++ ;
-Tương tự với lệnh giảm một đơn vị i= i-1; sẽ tương đương với i ;
- Có 2 loại :tăng (hoặc giảm) trước và tăng (hoặc giảm) sau ++i : Biến i được tăng trước
i++ : i được tăng sau i : i được giảm trước i : i được giảm sau Ví dụ : gán giá trị i=5 Lệnh Trước khi thực hiện Trong khi thực hiện Sau khi thực hiện
i++ i= 5 5 6
++i 5 6 6
i 5 5 4
i 5 4 4
- Nếu một biến có kiểu float thì bước tăng ,giảm là bước kiểu float float a,b,c,d,buoc = 0.15; a = a+buoc ; Hoặc viết tương đương : a += buoc ; b = b-buoc ; Hoặc viết tương đương : b- = buoc ; c = c*buoc ; tương đương : c *= buoc ;
d = d/buoc ; tương đương : d/ = buoc ;
I.5.5 Toán tử thực hiện phép tính với bit (bitwise) Bit là đơn vị tính nhị phân (binary) chỉ có giá tri 1 hoặc 0 Các toán tử bit ở đây giống như toán tử logic trong điện tử số ~ là NOT bit & AND | OR ^ XOR << Left Shift Dịch trái >> Right Shift Dịch phải Bit Bit NOT AND OR XOR
A B ~A A & B A | B A ^ B 0 0 1 0 0 0
0 1 1 0 1 1
1 0 0 0 1 1
1 1 0 1 1 0
Ví dụ : A = 4564 có mã nhị phân 0001 0001 1101 0100 mã hexa là 0x11d4 B = 13667 0011 0101 0110 0011 mã hexa là 0x3563 A & B 0001 0001 0100 0000 A | B 0011 0101 1111 0111 A ^ B 0010 0100 0011 0111 + Toán tử dịch trái bit << :
num = 201 hệ 10 tương ứng 0x00C9 hệ Hexa
Trang 13() [] -> :: từ trái qua phải
! ~ - ++ & * phải qua trái
sizeof new delete * -> / % trái qua phải
+ - trái qua phải
<< >> trái qua phải
< <= > >= trái qua phải
== != trái qua phải
^ trai qua phải
&& trái qua phải
|| trái qua phải
? phải qua trái
= *= /= %= += -= phải qua trái
&= ^= |= , trái qua phải
Bài tập Chương I
1 Hãy định nghiã biến Cho biết các biến sau đây ,biến nào là hợp lệ và biến nào là không hợp
lệ :
Ha noi, Viet_nam , 1a2 ; bien$1, num12345, extern , _float1
2 Nêu phạm vi giá trị của các loai khai báo biến : int ,unsigned int, unsigned char,
float,long int,double,long double
3 Cho biết kết quả các phép tính sau ,khi biết : int x=21,y=5;
x/y = ? ; x%y = ? ; float(x/y) = ?
Giá trị đúng hay sai : x<y ; x==y; x>=y; x>y
4 Cho a=2540 ,b=1467.Hãy tính giá trị với các phép tính bit sau :
a & b ; a|b; a ^ b; a>>b; a<<b ;
Trang 14chương II
Các lệnh vào - ra của c ++
Việc trao đổi thông tin giữa máy tính và người thông qua nhiều thiết bị Một trong số đó
có thể kể tới là :màn hình,bàn phím, đĩa cứng ,đĩa mềm,máy in ,các cards vào / ra ở các cổng
có vùng địa chỉ tự do Chương này ta xét tới các lệnh và các chương trình vào từ bàn phím và
ra màn hình ,ra máy in là chủ yếu
II.1 Các lệnh xuất dữ liệu ra màn hình
Trong C và C ++ có nhiều hàm xuất dữ liệu ra màn hình như :
- prìntf ; cout<< ; putc ; puts ;
II.1.1 Xuất dữ liệu ra màn hình trong C :
Đầu chương trình luôn dùng tệp tiêu đề #include <stdio.h>
Hàm xuất dữ liệu ra màn hình trong C là :
printf("C chao cac ban ! ") ;
Xuất dữ liệu theo kiểu số , ký tự,chuỗi ,trong C có quy cách riêng
-In ra số dạng mã ASCII (bát phân -hệ 8) : %o hoặc %#o (Chữ o)
-In ra số dạng mã thập lục phân (hệ 16) : %x hoặc %#x
Trang 15printf("\tMa ASCII (decimal) : %d\n",kt);
printf("\tMa ASCII (Octal) : %o\n",kt);
printf("\tMa ASCII (Hexa) : %x\n",kt);
printf("\tMa ASCII (Octal) : %#o\n",kt);
printf("\tMa ASCII (Hexa) : %#x\n",kt);
printf("\tChuoi ky tu : %s\n",chuoi);
printf("\tSo nguyen : %d\n",so_int);
printf("\tSo float :%8.4f\n",so_float);
printf("\tSo double : %e\n",so_doub);
getch();
return 0;
}
Kết quả :
Ky tu : A
Ma ASCII (decimal) : 65
Ma ASCII (Octal) : 101
Ma ASCII (Hexa) : 0x41
Ma ASCII (Octal) : 0101
Ma ASCII (Hexa) : 0x41
Chuoi ki tu : Ha noi So nguyen : 12345
So float : 12.7655
So double : 1.276543e+05
Khi ta muốn in kết quả nhiều số thực (hoặc nguyên) ,Trong cặp dấu " " có bao nhiêu chỉ thị %f ,thì sau dấu phảy có bấy nhiêu chữ số và chúng cách nhau bởi dấu phẩy Ví dụ sau cũng nêu lên cả cách căn lề trái trong C :
Ví dụ 2.2 :
#include<stdio.h>
#include<conio.h>
main()
{
printf("%8.2f %8.2f %8.2f\n",3.01,12.35,5.3247);
printf("%8.2f %8.2f %8.2f\n",300.25,1251.473,8546.397);
getch();
return 0;
}
Kết quả : Căn lề trái và sau dấu phẩy có hai chữ số :
Đây lại là một ví dụ về phương thức in ra một dòng vừa kết hợp cả chuỗi ký tự lẫn cả số nguyên (hoặc số float ) :
Ví dụ 2.3
#include<stdio.h>
#include<conio.h>
Trang 16Kết quả : Thu do Ha noi cach Hai phong khoang chung 100 Km
II.1.2.Xuất dữ liệu ra màn hình trong C++
Toán tử xuất dữ liệu ra màn hình trong C ++ :
cout<<"Số nguyen"<<134;
Đầu chương trình luôn có tệp tiêu đề #include <iostream.h>
Toán tử cout<< chỉ có trong chương trình C++ và không có trong C
- Lệnh xuống một dòng mới có nhiều cách viết như sau :
Dùng \n ở đầu câu hoặc cuối câu chú thích
cout<<"\n Ha noi "; cout<<" Ha noi \n" ;
Dùng \n trong cặp dấu nháy đơn '\n' Hoặc nháy kép "\n"
cout<<"Ha noi"<<'\n'; cout<<"Viet nam"<<"\n";
Cuối câu lệnh ,muốn xuống dòng ta viết : endl;
cout<<" Gia tri nguyen : "<< 567 <<endl;
Trang 17Trong C,ta có thể quy định số chữ số sau dấu phẩy của số float Tương tự ,trong C++,ta
có hai cách để định dạng số chữ số sau dấu phẩy
cout<<dec<<" So thap phan :"<<n
<<" , Tuong ung So bat phan :"<<oct<<n
<<" va tuong ung So Hex :"
<<hex<<n<<"\n";
cout<<setprecision(4);
cout<<" So float :"<<a<<"\n";
cout<<" So double :"<<b<<endl;
Ky tu 'A' theo ma ASCII 65
Ky tu theo ma ASCII (voi n=65) :A
So thap phan :98 , Tuong ung So bat phan :142 va tuong ung
Trang 18Hàm cout<< chỉ dùng trong C++.Tuy nhiên hàm printf(" ", ); còn có nhiều dạng
khác ,nó dùng cả trong C ,C++ ,Borlandc C++.Ngoài ra còn có một số hàm như put() ,putc()
,puts(), cũng có chức năng xuất dữ liệu ra màn hình
1.Hàm cprintf (" "); để in chuỗi ký tự ở trong cửa sổ (window) và nếu có hàm đặt
màu cho dữ liệu in ra textcolor(màu) đi kèm
//Tao mot cua so Text
//Ca man hinh co 25 dong,80 cot
window(10,10,60,24); //Tu cot 10,dong 10 den
//cot 60 dong 24 //In ra mot it dong text trong cua so co mau la cay
cprintf(" Chao cac ban yeu C++ \r\n");
getch();
return 0;
}
Kết quả : Chao cac ban yeu C++
( Màu của dong chữ là GREEN )
2 Hàm sprintf(buffer," Chu thich %f ",so)
Hàm này có thêm một tham số là vùng đệm (buffer) ,đó là một mảng (về sau ta sẽ xét
kỹ tới mảng).Ví dụ sau có sử dụng hằng số pi mà trong C++ nó được định nghĩa là M_PI (luôn
viết in hoa M_PI=3.14159 ) và phải sử dụng #include<math.h>
Trang 19
Kết quả : So PI co gia tri la 3.141593
3 Hàm in ra một ký tự : putc(kytu) ;putch(kytu); và putchar(kytu);
Đối số trong các hàm này là một số nguyên
Cả 3 hàm này có chức năng như nhau Ví dụ sau ta sử dụng cả 3 hàm trong một chương trình ở đây có dùng lệnh lặp for(dau;cuoi;buoc_tang) { } trong đó dau la giá tri dầu ,cuối là giá trị cuối của biểu thức ,buoc_tang là bước tăng (hoặc giảm) có thể có giá trị int hoặc float Vòng lặp for ta sẽ xét ở chương sau
//ham putc() bat buoc phai co
// doi chi thi stdout (xem muc ham getc() // xet o ham nhap tu ban phim duoi day putc(c,stdout);
Kết quả : In ra 3 dòng giống nhau nếu mỗi lần ta gõ một phím
4 Hàm in ra một chuỗi ký tự puts("chuoi ky tu");
Chuỗi ở trong hàm puts(" "); phải để trong cặp dấu ngoặc kép
puts(" Chao mung ban den voi C++");
puts(" ,mot ngon ngu lap trinh day thuyet phuc !"; getch();
Trang 20return 0;
}
Ket qua : Chao mung ban den voi C++,mot ngon ngu lap
trinh day thuyet phuc !
5 Hàm in ra một chuỗi từ vùng đệm puttext(x1,y1,x2,y2,buffer)
-Hàm puttext thường sử dụng cùng với hàm gettext(x1,y1,x2,y2,buffer) Hàm puttext() gửi chuỗi text vào vùng nhớ.Hàm gettext () gọi chuỗi text từ vùng nhớ ra ô chữ nhật trên màn hình x1 :điểm trái; y1:điểm đỉnh; x2:điểm phải; y2:điểm đáy dưới.Vùng nhớ giành cho
/* Lay noi dung Text trong o chu nhat
cua man hinh gui vao bo nho */
gettext(20, 12, 36, 21,buffer);
clrscr();
/* Lay noi dung da gui trong bo nho
ra lai man hinh */
II.2.1 Nhập dữ liệu trong C nhờ hàm scanf( "%f",&bien)
-Trong hàm scanf ( ) chỉ thị "%f" nói rằng biến nhập vào có kiểu float
Trang 21- "%d" : Nhập biến số nguyên , là địa chỉ &bien
- "%u" : Nhập biên nguyên dương &bien
- "%ld" : Nhập số nguyên kiểu long int &bien
printf(" Nhap vao so double d1 , d2 ");
scanf("%lf %lf",&d1 ,&d2);
printf(" Nhap vao ky tu kt1 : ");
scanf("%c",kt1);
printf(" Nhap vao chuoi ky tu ch1 : ");
scanf("%lf",ch1);
printf(" So int da nhap la n1 = %d \n",n1);
printf(" So long int da nhap la n2 = %ld\n",n2);
printf(" So float da nhap la f1 = %f \n",f1);
printf(" So double da nhap la %lf %lf \n",d1,d2); printf(" Ky tu da nhap la : %c \n",kt1);
printf(" Chuoi da nhap la : %s \n",ch1);
getch();
return 0;
}
II.2.2 Hàm nhập dữ liệu từ bàn phím cin>> của C++
Hàm cin>> dùng để nhập dữ liệu từ bàn phím trong C++.Dữ liệu phai tuân theo các điều kiện sau :
- Là các hằng kiểu int, float, char
Trang 22- Là chuỗi thì phải là các ký tự liên tiềp loại trừ 3 "ký tự trắng " đó là dấu cách(space bar), dấu TAB và phím Enter
Ví dụ 2.12 : Chương trình tính diện tích hình tròn và chu vi vòng tròn :
cout<<"Chuong trinh tinh chu vi"
<<" va dien tich hinh tron\n";
cout<<" Cho biet gia tri ban kinh R: ";
cout<<"Chu vi duong tron la: "<<CV<<"\n";
cout<<"\nDien tich hinh tron la: "<<DT<<endl;
cout<<"Cho biet ten ban: ";
//Go lien tuc cac ky tu khong co dau cach
Trang 23Ví dụ 2.14 : Vào số nguyên, số thực, và một chuỗi, sau đó in ra màn hình
cin>> có thể vào một lúc với nhiều biến khác kiểu nhau như trong lệnh sau đây:
n>>i>>f>>s ; các biến cách nhau dấu >>
// Vao so nguyen,so thuc,chuoi
Hàm getc( ) trong cặp dấu ngoặc đơn thường có đối stdin Đối này được xác định trước
và sẽ mở thông việc vào /ra một cách tự động khi chương trình bắt đầu chạy Các đối chỉ thị nhìn chung có các loại sau :
stdin : standart input device ( vào chuẩn )
stdout : standart output device ( ra chuẩn )
stderr : standart error device ( báo lỗi chuẩn )
stdaux : standart auxiliary device ( bổ trợ chuẩn)
stdprn : standart printer device ( chuẩn cho máy in)
Trang 24cout<<"\n ASCII (dec) = "<<dec<< (int)c;
- Đứng thành một lệnh độc lập, thường ở cuối chương trình của hàm để đợi gõ một phím
- Gán một ký tự gõ từ bàn phím cho một biến kiểu char Hàm này không có đối
cout<< "\n Ky tu da nhap la: "<< c;
cout<< "\n ASCII (dec) = "<<dec<<int(c);
cout<< "\n ASCII (oct) = "<<oct<<int(c);
cout<<" \n ASCII (hex) = "<<hex<<int(c);
getch();
return 0;
}
3 Hàm getchar()
Hàm getchar() không có đối được dùng để gõ một ký tự từ bàn phím và gán cho một biến
ký tự Chức năng này giống hàm getch()
Trang 25cout<<"\n Cho vao 1 ki tu : ";
c = getchar();
cout<<"\n Ki tu = "<< c;
cout<<"\n ASCII hex = 0x"<<hex<< (int)c;
cout<<"\n ASCII dec = "<<dec<< (int)c;
getch();
return 0;
}
4 Hàm nhập một chuỗi bao gồm cả ký tự trắng gets(chuoi)
Hàm cin>> khi thực hiện nhập một chuỗi bao gồm cả ký tự trắng
Cho biet ten ban : Tran van Anh
Dung ham cout<< ,Ten ban la : Tran van Anh Dung ham puts(ten),Ten ban van la Tran van Anh
5.Hàm gettext (x1,y1,x2,y2,buffer)
Hàm gettext() như đã nói ở trên thường đi kèm với hàm puttext() ,được dùng để gửi một chuỗi ký tự vào một vùng nhớ và sau đó có thể lấy ra để hiển thị lên một ô chữ nhật trên màn hình
Ví dụ 2.19
// gettext.cpp
#include <conio.h>
Trang 266 Hàm đợi gõ một phím bất kỳ từ bàn phím kbhit()
Hàm kbhit() thường dùng trong các vòng lặp while và do while nhằm thực hiện khi gõ một phím bất kỳ để thoat ra ngoài
Kết quả chương trình trên cứ tính tổng và in giá trị liên tục trên màn hình cho tới khi ta
gõ vào một phím bất kỳ thì chương trình sẽ thoát ra khỏi vòng lặp Vòng lặp do while luôn
có dấu đóng khối { } ta sẽ xét sau
Trên đây ta chỉ mới nêu ra các hàm cơ bản để in dữ liệu ra màn hình và nhập dữ liệu vào
từ bàn phím Ngoài ra còn nhiều hàm khác để in ra màn hình trong kỹ thuật đồ họa Phần này
sẽ được xét ở một chương sau
Trang 27
II.3 In dữ liệu ra máy in
Muốn in kết quả ra máy in ta dùng hàm : fprintf(stdprn,"Chú dẫn %f",biến float); Trong đó ta đã dùng đối chỉ thị stdprn như đã nói ở trên Khi thực hiện lệnh này máy in
sẽ in dòng chú thích trong cặp dấu ngoặc kép và biến có kiểu xác định theo %d hoặc %f hay
1 Viết chương trình in ra các số nguyên int,float ,ký tự nhờ hàm cout<<
2 Nhập từ bàn phím sô i1=1254768; i2=66;f=12.8765498;kytu=A; Hãy in số i1,số i2,in mã ASCII của i2=66;In số f với độ chính xác sau dấu phẩy bằng 4 chữ số và ký tự A In giá trị int cua ký tự A theo Decimal và Hexadecimal
3 Nhập một chuỗi có họ đêm và tên theo hàm nào là hợp lệ (bao gồm cả dấu cách ) Sau
đó cho in chuỗi ký tự ấy ra màn hình
4 Trong một ô chữ nhật (2,2,60,15) , dùng hàm gets(chuoi) để nhạp và dưa ra ô chữ nhật trên màn hình rồi sử dụng hàm gettext() và puttext() để gửi vào bộ nhớ sau đó lấy từ bộ nhớ
đưa trở lai màn hình
5 Viết một chương trình nhập vào số float ,họ tên,địa chỉ,số điện toại của bạn và in ra máy in
Trang 28
chương III
Lệnh chu trình và lệnh điều kiện
Hai toán tử làm nền tảng cho hầu hết các chương trình trong nhiều loại ngôn ngữ lập trình là toán
tử chu trình (vòng lặp) và toán tử điều kiện (hay chọn lựa)
Trong C++ có 4 loại toán tử chu trình :
- Toán tử for( ; ; )
- Toán tử do while( )
- Toán tử while( )
- Toán tử goto nhãn (label)
Hai loại toán tử điều kiện :
- Toán tử if else
- Toán tử switch case
III.1 Các toán tử chu trình
hoặc sau for có nhiều câu lệnh ta phải đóng khối { } :
for(n = giá trị đầu ; n<giá trị cuối; bước của n )
Trang 29Sau đây ta xét một số ví dụ của vòng lặp for theo nhiều dạng khác nhau
+ Ví dụ 3.1 : In các ký tự theo mã ASCII
// In cac ky tu ascii theo ma Decimal
+ Trong vòng for giá trị đầu , giá trị cuối có thể gán mã ASCII hệ thập phân và nếu ta gõ vào
phím có mã ASCII bằng giá trị cuối thì chương trình sẽ thoát ra Khi ta gõ bất kỳ ký tự nào trên bàn phím thì nó cũng sẽ hiện ra màn hình
Trang 30+ Các biểu thức trong cặp ngoặc đơn có thể gán bởi một hàm , chẳng hạn hàm gán ký tự
c=getch() Ban đầu c nhận một ký tự từ bàn phím và hiện lên màn hinh Nếu gõ đúng ký tự
q thì chương trình sẽ dừng Ví dụ 3.3 cho kết quả không khác nhiều lắm với ví dụ 3.2
+ Vòng lặp for rất đa dạng Ví dụ sau có hai biến nguyên ì và j cùng thay đổi đồng thời Bước
tăng i và bước giảm j ( i++ và j - - ) là 1 đơn vị ,đồng thời giá trị cuối của j >1 , giá trị đàu j=4 rồi
đến j=3 ,và cuối cùng j=2 , còn i cứ tăng từ i=2 rồi =3,=4,=5 Như vậy trong vòng lặp có 2 biến số thay đổi mà j có 3 giá trị còn i có 4 giá trị thì kết quả màn hình chỉ hiển thị 3 cặp giá trị của i và j mà thôi.Nghĩa là vòng lặp for lúc này sẽ dừng lại ở điều kiện sớm hơn ,tức là (j>1).Đièu cần chú ý là giữa 2 biến thay đổi i và j phải đặt dấu phẩy (,) chứ không phải dấu chấm phẩy (;)
Trang 31Chú ý : - Trong vòng for của ví dụ trên nếu bỏ điều kiện i<6 tức là ta chỉ cần viết :
for (x=1 , y=6 ; x<4 || y>1 ; x++ , y - - )
thì chương trình vẫn cho cùng một kết quả
- Nếu viết for(i
- Nếu trong vòng for ta thay điều kiện hai biến bằng lệnh "và" : &&
như ví dụ 3.5 sau đây thì kết quả sẽ khác
+ Nếu khai báo biến thay đổi trong vòng for là int thì bước tăng có thể là một số nguyên
=1,2, ,còn nếu khai báo biến là float thì bước tăng là một só float
Sau đây là ví dụ biến int i lùi còn biến float f tăng
//buoc giam so int voi buoc=-5
cout<<" Gia tri i = ";
Trang 32for(i=20;i>-20;i=i-5)
cout<<i<<" ";
//Buoc tang so float voi buoc =0.5
cout<<" Gia tri f = ";
+ Khi muèn in ra mét b¶ng ch÷ nhËt ta cã thÓ dïng hai vßng lÆp for lång nhau
Sau for thø nhÊt ph¶i cã cÆp dÊu më { vµ } vµ lÖnh cout<<"\n\t"; Sù ph©n bè
c¸c sè trong b¶ng hiÓn thÞ kÕt qu¶ bao gåm sè cét vµ sè hµng t¹o c¸ch nhau hoÆc dïng
TAB ,hoÆc dïng sè
VÝ dô 3.7 : LÖnh for lång nhau
// Lenh for long nhau
Trang 33+ Giá trị cuối trong vòng for là điều kiện hết lặp Nó là một hàm nhận một ký tự từ bàn phím như getch() hoặc đợi gõ một phím như hàm kbhit() Trong ví dụ sau có biến i và nó được hiện ra màn
hình Nếu i có kiểu unsigned int thì i hiện chính xác đến 65535 Thời gian
càng lâu ta mới gõ kbhit() thì số hiển thị càng lớn Nếu khai i có kiểu unsigned long thì quá
trình chạy chương trình càng lâu
Ví dụ 3.8 : Lệnh for có điều kiện đợi gõ một phím
// Lenh for dieu kien doi go mot phim
+ Một điều lý thú trong vòng for là mỗi tham số trong vòng for đều nhận một lệnh hợp lệ trong
C++.Sau đây ta có thể nêu ra 3 trường hợp thiếu vắng một,hai và cả 3 tham số nhưng chương trình vẫn hoạt đông
Trang 34Kết quả : Chao ! 5
Chao ! 5 Chao ! 5
Chương trình này lặp lại kết quả vô tận Muốn thoát ta bấm hai phím Ctrl & Break
Kết quả chương trình này cũng in ra giá trị a=3 và vòng lặp là vô tận
+ Khi trong vòng lặp for thiếu tham số tăng (hoặc giảm),ta có thể viết lệnh tăng (giảm ra ngoài
Trang 35for(a=500;a>200;)
{
cout<<" \ta = "<<a<<"\n";
a - =100; //Tham so giam dua ra ngoai for
Trang 36{
if(x%2) continue; // in các số lẻ cout<<x<<“ “;
Ví dụ 3.16 : Vòng lặp lồng nhau in số nguyên tố từ 0 đến 1000
// Vong lap long nhau in so nguyen to tu 0 den 1000
Trang 38main() {
char ch;
cout<<" Enter your Message\n";
ch=getche();
while(ch!='\r') {
cout<<' '<<ch+1<<"\t";
ch=getche();
} return 0;
}
Ví dụ 3.18 : Cho biết độ dài một dòng ( từ 1 đến 79 ) và in ra dấu chấm
// Cho biet do dai cua 1 dong tu 0 den 79 & in ra dau cham
Trang 39Chú ý : * Lệnh while(i) tương đương while(i!=0), tức là khi i khác 0, vòng lặp tiếp tục thực hiện
Nếu có while(!i) tương đương while(i==0), vòng lặp tiếp tục thực hiện khi i = 0
float so, tong=0.0;
cout<<“ Hay cho vao mot so : “;
cin>>so;
while(so>0)
{
tong=tong+so; // Thực hiện cộng dồn
Trang 40while(i>0 && i<i+20) // Trong khi sè tháa m·n trong 20 sè nguyªn
{ // liªn tiÕp nhau
NÕu nhËp sè nguyªn b¾t ®Çu tõ sè lín h¬n 32767 th× ph¶i khai b¸o i thuéc kiÓu double
Vßng lÆp while cßn cho phÐp ta nhËp sè ngay trong ®iÒu kiÖn