Tải bản đầy đủ (.pdf) (160 trang)

Bài giảng ngôn ngữ lập trình c c++

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.4 MB, 160 trang )

TRƯỜNG ĐẠI HỌC QUY NHƠN
KHOA 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ộ


1
GVC. NGUYN èNH LUYN

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 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 .


2
GVC. NGUYN èNH LUYN

Ngô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++ :
- Turbo C++ 1.0
- Turbo C++ 3.0
- Borland C++ 2.0
- Borland C++ 3.0 , 3.1
- Borland C++ 4.0 , 4.5 ,5.0
- Visual C++ 1.0 , 1.52 , 2.0
- Microsoft C++ 6.0 , 7.0
- ... v.v .....
C¸c version mới gần đây đòi hỏi cấu hình máy tính cao hơn . Ví dụ để cài đặt Turbo
C++ 3.0 cần 10Mb , Borland C++ 3.1 cần khoảng 50 Mb ,BorlandC++ 4.5 cần 120Mb ,5.0
cần 170 MB và Visual C++ 2.0 cần 200 Mb. Ngòai ra để chạy được các chương trình trên các
Version mới này cần phải có tốc độ CPU nhanh từ 66Mh trở lên và RAM phải ít nhất là 8Mb.
Nếu cấu hình máy kém thì chỉ nên chạy C++ với các version 1.0 , 3.0 hay Borland C++ 3.0 ,
3.1 là hợp lý.

******


3
GVC. NGUYN èNH LUYN

chương I


giới thiệu và những kiến thức cơ bản
của ngôn ngữ c + +
i.1 Một chương trình C++ điển hình.
Như nhiều loại ngôn ngữ lập trình khác ,đầu tiên ta nêu ra ví dụ điển hình về một chương
trình C++ làm việc như thế nào .
CT1 :
1 #include <iostream.h>
2 #include <conio.h>
3
4 main()
5
{
6
clrscr();
7
cout<<" C ++ chao cac ban ! ";
8
getch();
9
return 0;
10 }
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 .


4
GVC. NGUYN èNH LUYN

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 ) .
CT2:
#include <iostream.h>
#include <conio.h>
main()
{
return 0;
}
Trong chương trình không sử dụng một #include nào cả ,chỉ có một lệnh duy nhất là return(0)
nằm trong cặp dấu khối của hàm main() .
Bây giờ ta xét một chương trình viết theo ngôn ngữ C .
CT 3:
1
2
3

4
5
6
7
8
9
10

#include <stdio.h>
#include <conio.h>
main()
{
clrscr();
printf(" C chao cac ban ! ");
getch();
return 0;
}

- So sánh hai chương trình CT1 viÕt cho C++ vµ CT3 viÕt cho C chØ cã khác nhau ở dòng 1 là
thay #include<iostream.h> bằng #include<stdio.h> còn ở dòng 7 lệnh cout<< "...."; được
thay bằng hàm in ra màn hình printf("......"); Tuy nhiên C++ là C phát triển lên ,nên những gì
đà 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.


5
GVC. NGUYN èNH LUYN


- Đ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
void ham2(); ...
main()
{
int a; //Cac khai bao bien
...
lenh1;
...
lenh_m;
ham1();
lenh_j;
ham2();
getch();
return 0;
}
//Cac ham con
float ham1(int,float)
{ khai bao bien;
lenh_h1;
...

return(gia tri ham1);
}
void ham2()
{
...
}
- 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 .


6
GVC. NGUYN èNH LUYN

Tấ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
auto
break
case
char
const
continue

default
do
double

else
enum
extern
float

for
goto
if
int
long
register
return

short
signed
sizof
static
struct
switch
typedef

union
unsigned
void
volatile
while

-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
friend
private
new
this
protected
operator
virtual
catch

overload
inline

- Các từ khóa của Borland C++ (Tính đến version 4.5)
_AH
_BP
_es
_huge
__pascal
_SS
_DH
_DX
__cdecl
__seg
__fastcall
__thread
fastcall


_AL
_BX
_export
_interrupt
_saveregs
_CL
_DI
cdecl
__except
__pascal
__finally
__try
_import

_asm
_cdecl
_far
_loadds
_seg
_CS
_DL
near
__huge
__ds
__interrupt
__far
__import

_BH
_CH

_fastcall
_near
_SI
_cs
_DS
pascal
__loadds
__cs
__saveregs
huge

_BL
_ES
_FLAGS
_pascal
_SP
_CX
_ds
interrupt
__seg
__es
__stdcall
__near

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 :
abcdefghijklmnopqrstuvwxyz_
ABCDEFGHIJKLMNOPQRSTUVWXYZ


7
GVC. NGUYN èNH LUYN

- Các chữ số :
0123456789
Identifiers có độ dài bất kỳ đối với class , đối tượng ( objects ), hµm ( functions ), biÕn (
variables) , dïng định nghĩa kiểu dữ liệu ( user-defined data types ), .....
Identifiers có thể là bao hàm các chữ cái hoa từ A đến Z và các chữ cái thường từ a đến z , ký
tự gạch dưới ( _ ) và các chữ số từ 0 đến 9 .
Identifiers 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 ( _ )
2. Identifiers trong C++ có độ dài bất kỳ ,nhưng thông thường ta đặt tên càng ngắn càng
tốt ,miễn sao toát lên được ý nghĩa thực tế từ tên biến đó.
Sau đây nêu một số tên biến hợp lệ và không hợp lệ.
Biến hợp lệ :
Hanoi
ha_noi
so_int1
__enumfloat

Biến không hợp lệ :
ha!noi
static


6hanoi (sai vì có số đầu )
(sai vì có dấu lạ !)
(sai v× sư dơng tõ khãa)
$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
trong C++

Độ dài

Phạm vi giá trị
(bit)

Nguyên
Nguyên ngắn
Nguyên dương
Ký tự,chuỗi
Ký tự không dấu

Nguyên dài

int
short int
unsigned int
char
unsigned char
long int

16
16
16
8
8
32

Nguyên dương
Dấu phẩy động
Chính xác kép
Chính xác kép dài

unsigned long
float
double
long double

32
32
64
80


-32768 ®Õn 32767
-32768 ®Õn 32767
0 ®Õn 65535
-128 ®Õn 127
0 ®Õn 255
-2147483648 ®Õn
2147483647
0 ®Õn 4294967295
3.4E-38 ®Õn 1.7E+38
1.7E-308 ®Õn 1.7E+308
3.4E-4932 ®Õn 1.1E+4932


8
GVC. NGUYN èNH LUYN

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 ).
Hằng hệ cơ số 8 - Octal constants
00 to 077777
0100000 to 0177777
02000000 to 017777777777
020000000000 to 037777777777
> 037777777777
H»ng hƯ 16 - Hexadecimal
0x0000 ®Ðn 0x7FFF
0x8000 ®Õn 0xFFFF

0x10000 ®Õn 0x7FFFFFFF
0x80000000 đến 0xFFFFFFFF
> 0xFFFFFFFF

int
unsigned int
long
unsigned long
truncated
int
unsigned int
long
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ả
decimal
int , long int , unsigned long int
octal
int , unsigned int , long int , unsigned long
hexadecimal
int
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 .
Nh­ng trong C++ h»ng ký tù cã kiÓu char .
H»ng nhiều ký tự cả trong C và C++ đều có kiểu int và nằm trong cặp dấu nháy kép .
Ta còn gọi là hằng string


9
GVC. NGUYỄN ĐÌNH LUYỆN

VÝ 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 : xng 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 khai báo hoặc ở trên hàm main() , hoặc ở đầu hàm main() .
- 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" ;
- Mn chun 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 .
Ví dụ :
char kt ;
int i ;
float f ;
double d ;
ketqua=(kt/i)+(f*d)-(f+i) ;
Trong biĨu thøc nµy giá trị ketqua sẽ có kiểu double ,các biến kt , i , f đều tự động chuyển thành
kiểu double .


10
GVC. NGUYN èNH LUYN

I.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

*
/
+
%

nhân
chia
cộng
trừ
chia lấy phần dư

int a=14 , b=4 ;
(a*b)
(a/b)
(a+b)
(a-b)
(a%b)


Kết quả
56
3
18
10
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
bé hơn
bé hơn và bằng
lớn hơn
lớn hơn và bằng
bằng
không bằng

int a=15,b=4;
(a(a<=b)
(a>b)
(a>=b)

(a==b)
(a!=b)

Kết quả
sai
sai
đúng
sai
sai
đú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((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- 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;



11
GVC. NGUYN èNH LUYN

Lệ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
1

0
1
0
1

1
1
0
0

0
0
0
1


0
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



12
GVC. NGUYỄN ĐÌNH LUYỆN

NÕu cã lƯnh :
num<<2;
hƯ Hexa

0
0
c
9
BiĨu diƠn sè nhị phân của num là
0000 0000 1100 1001
num<<2 ; là dịch trái sang 2 bit :
hệ Hexa

0000 0011 0010 0100
0
3
2
4

Khi thực hiện toán tử dịch trái bit ,số ban đầu num = 201 hƯ 10 vµ lµ 0x00C9
sÏ trë thµnh số mới 804 hệ 10 và là 0x0324
Tương tự dịch ph¶i mét sè num =39470 hƯ 10
num>>2 ; sÏ trë thành số 9867 hệ 10.
Chú ý : Khi viết chương trình thực hiện các lệnh bitwise ,kết quả hiện lên màn hình luôn luôn là
số thập phân .
I.5.6 Thứ tự ưu tiên các toán tử và phép tính .
Toán tử

() [] -> :: .
! ~ - ++ -- & *
sizeof new delete .* -> / %
+ << >>
< <= > >=
== !=
^
&&
||
?
= *= /= %= += -=
&= ^= |= ,

Thø tự thực hiện
từ trái qua phải
phải qua trái
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<

1
GVC. NGUYN èNH LUYN

chươ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 ! ") ;
Xt d÷ liƯu theo kiĨu sè , ký tự,chuỗi ,trong C có quy cách riêng.
-In ký tự ta dùng
: %c
-In chuỗi (một mảng ký tự) : %s
-In sè nguyªn
: %d
-In sè float , double
: %8.3f .Trong ®ã 8 chØ ®é dµi sè toµn bé,3 chØ
r»ng cã 3 chữ số sau dấu phẩy ,f chỉ ra đó là số dấu phẩy độ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
Ví dụ 2.1:

/*

Chương trình in các loại dữ liệu trong C */

#include <stdio.h>
#include <conio.h>
#include <conio.h>
main()
{
char kt='A';
char chuoi[]="Ha noi";

int so_int = 12345;
float so_float = 12.76549;
double so_doub = 127654.32987;
clrscr();
printf("\n\t In ra man hinh cac kieu du lieu\n\n");
printf("\tKy tu
: %c\n",kt);


2
GVC. NGUYỄN ĐÌNH LUYỆN

printf("\tMa ASCII (decimal)
printf("\tMa ASCII (Octal)
printf("\tMa ASCII (Hexa)
printf("\tMa ASCII (Octal)
printf("\tMa ASCII (Hexa)
printf("\tChuoi ky tu
printf("\tSo nguyen
printf("\tSo float
printf("\tSo double
getch();
return 0;

: %d\n",kt);
: %o\n",kt);
: %x\n",kt);
: %#o\n",kt);
: %#x\n",kt);
: %s\n",chuoi);

: %d\n",so_int);
:%8.4f\n",so_float);
: %e\n",so_doub);

}
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ố :
3.01
12.35
5.32
300.25 1251.47
8546.39
Đâ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>


3
GVC. NGUYỄN ĐÌNH LUYỆN

main()
{
printf(" %s cach Hai phong khoang chung %d kilomet ",

"Thu do Ha noi",100);
getch();
return 0;
}
KÕ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 .
VÝ dô 2.4 :

//Vi du cout<<
#include<iostream.h>
#include<conio.h>
main()
{
int i,j;
double d;
i=10; j=25; d=99.101;
cout<<"Day la mot vai gia tri duoc in ra:"<<'\n';
cout<cout<<" ; "<cout<<" ; "<getch();
return 0;
}
KÕt qu¶ :


Day la mot vai gia tri in ra :
10 ; 25 ; 99.101
Chó ý : - Khi xuất số liệu ra màn hình, ta có thĨ dïng mét c©u lƯnh :
cout<- 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 <

4
GVC. NGUYN èNH LUYN

Trong 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 .
- Dùng hàm :
cout<Trong đó N là số chữ số sau dấu phẩy của số float .Khi sử dụng hàm này,cần đưa thêm
tệp tiêu đề
#include<iomanip.h> .
- Dùng lệnh :
cout.precision(N);
Ví dụ 2.5 // Chương trình in ra nhờ hàm cout<< ,có quy cách với số float
#include<iostream.h>
#include<conio.h>
#include<iomanip.h>
main()

{
clrscr();
char kt='A';
char chuoi[]="Viet nam";
int n=98;
float a=55.7654321;
float b=83467.5438765;
cout<<" Ky tu :"<cout<<" Ky tu 'A' theo ma ASCII "
<<(int)kt<<"\n";
cout<<" Ky tu theo ma ASCII (voi n=65):"
<<(char)65<<'\n';
cout<<<" , Tuong ung So bat phan :"<<<" va tuong ung So Hex :"
<cout<cout<<" So float :"<cout<<" So double :"<getch();
return 0;
}
KÕt qu¶ :
Ky tu : A
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
So Hex :62
So float :55.7654
So double :83467.5469

II.1.3 Một số hàm khác để xuất dữ liệu ra màn hình .


5
GVC. NGUYN èNH LUYN

Hà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 .
Ví dô 2.6

#include <conio.h>
main()
{
clrscr();
textcolor(GREEN);
//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> .
Ví dụ 2.7

#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
main()
{
clrscr();
char buffer[80];
sprintf(buffer," So PI co gia tri la %f ",M_PI);
cout<getch();
return 0;
}


6
GVC. NGUYỄN ĐÌNH LUYỆN

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 .
Ví dô 2.8

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
main()
{
clrscr();
for(int c=32;c<127;c++)
{
//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);
cout<<"\n";
getch();
putch(c);
getch();
cout<<"\n";
putchar(c);
getch();
return 0;
}
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 ngc kÐp .

VÝ dơ 2.9

#include <stdio.h>
#include <conio.h>
main()
{
clrscr();
puts(" Chao mung ban den voi C++");
puts(" ,mot ngon ngu lap trinh day thuyet phuc !";
getch();


7
GVC. NGUYỄN ĐÌNH LUYỆN

return 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
ô chữ nhật có m hàng và n cột chiếm hết n.m.2 bytes .
Trong chương trình sau đây sử dung hàm gotoxy(x1,y1) để đưa dòng Text tới tọa độ
điểm (x1,y1) .
VÝ dô 2.10

#include <conio.h>
main()

{
char buffer[512];
clrscr();
gotoxy(20, 12);
cprintf(" Day la Text .Go phim bat ky ...");
getch();
/* 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
*/
gotoxy(20, 12);
puttext(20, 12, 36, 21, buffer);
getch();
return 0;
}
KÕt qu¶ :

Day la Text . Go phim bat ky ...

II.2 C¸c hàm nhập dữ liêu từ bàn phím .
Trong C và C++ có nhiều hàm nhập dữ liệu từ bàn phím nh­ : scanf(&bien), getc(stdin)
,getch() ,getchar() ,getche() ,gets(buffer) , gettext(x1,y1,x2,y2,buffer) ...
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