1 gioi thieu chung

43
NHẬP MÔN NHẬP MÔN LẬP TRÌNH LẬP TRÌNH Dành cho các lớp Dành cho các lớp Cao Đẳng Công Nghệ Thông Tin Cao Đẳng Công Nghệ Thông Tin

Upload: cuong

Post on 17-Jun-2015

1.562 views

Category:

News & Politics


0 download

TRANSCRIPT

Page 1: 1 Gioi Thieu Chung

NHẬP MÔNNHẬP MÔNLẬP TRÌNHLẬP TRÌNH

Dành cho các lớp Dành cho các lớp

Cao Đẳng Công Nghệ Thông TinCao Đẳng Công Nghệ Thông Tin

Page 2: 1 Gioi Thieu Chung

Đề cương bài giảngĐề cương bài giảng Thời lượng: 45 tiết lý thuyết – 45 tiết thực hànhThời lượng: 45 tiết lý thuyết – 45 tiết thực hành

Mục tiêu môn học: Mục tiêu môn học: Cung cấp cho sinh viên các kỹ năng cơ Cung cấp cho sinh viên các kỹ năng cơ bản để lập trình giải quyết các vấn đề, bài toán. Các chương bản để lập trình giải quyết các vấn đề, bài toán. Các chương trình được thể hiện bằng NNLT C. Riêng về ngôn ngữ lập trình được thể hiện bằng NNLT C. Riêng về ngôn ngữ lập trình C, các sinh viên được cung cấp các kỹ năng:trình C, các sinh viên được cung cấp các kỹ năng: Đọc và viết được chương trình đơn giảnĐọc và viết được chương trình đơn giản Hiểu cấu trúc ngôn ngữHiểu cấu trúc ngôn ngữ Sử dụng thành thạo các thư viện chuẩnSử dụng thành thạo các thư viện chuẩn Nhận biết và sửa chữa các lỗi thường gặp khi lập trìnhNhận biết và sửa chữa các lỗi thường gặp khi lập trình

Các môn học tiên quyết:Các môn học tiên quyết: không. không.

Nội dung bài giảngNội dung bài giảng::

Page 3: 1 Gioi Thieu Chung

Nội dung môn họcNội dung môn học

Tổng quanTổng quan Các kiểu dữ liệu cơ bảnCác kiểu dữ liệu cơ bản Lệnh nhập, xuất dữ liệuLệnh nhập, xuất dữ liệu Các cấu trúc điều khiểnCác cấu trúc điều khiển HàmHàm Con trỏCon trỏ MảngMảng Chuỗi ký tựChuỗi ký tự StructStruct

Page 4: 1 Gioi Thieu Chung

Tổng quanTổng quan

Khái niệm chương trình – lập trìnhKhái niệm chương trình – lập trình Cấu trúc một chương trình đơn giảnCấu trúc một chương trình đơn giản Khái niệm Thuật toán – biểu diễn thuật toánKhái niệm Thuật toán – biểu diễn thuật toán Khái niệm NNLT, sơ lược lịch sử phát triển NNLTKhái niệm NNLT, sơ lược lịch sử phát triển NNLT Ngôn ngữ lập trình CNgôn ngữ lập trình C

Page 5: 1 Gioi Thieu Chung

Các thành phần Các thành phần của chương trình của chương trình

CC

Page 6: 1 Gioi Thieu Chung

Ví dụ chương trình CVí dụ chương trình C

/*VIDU.CPP*/#include <stdio.h>

int main(){

printf(“Nhap mon lap trinh\n");printf(“Vi du don gian\n");

return 0;}

/*VIDU.CPP*/#include <stdio.h>

int main(){

printf(“Nhap mon lap trinh\n");printf(“Vi du don gian\n");

return 0;} Nhap mon lap trinh

Vi du don gian

Nhap mon lap trinhVi du don gian

Thư viện nhập xuất chuẩnThư viện nhập xuất chuẩnGhi chúGhi chú

Hàm mainHàm main

Báo CT kết thúc cho HĐHBáo CT kết thúc cho HĐH

Page 7: 1 Gioi Thieu Chung

Một số lưu ý từ ví dụMột số lưu ý từ ví dụ

Phần ghi chú được trình biên dịch bỏ quaPhần ghi chú được trình biên dịch bỏ qua Phân biệt chữ in hoa và chữ in thườngPhân biệt chữ in hoa và chữ in thường Câu lệnh luôn được kết thúc bằng dấu ;Câu lệnh luôn được kết thúc bằng dấu ; Chuỗi ký tự phải ghi giữa cặp nháy kép Chuỗi ký tự phải ghi giữa cặp nháy kép ““ In xuống dòng dùng ký tự \nIn xuống dòng dùng ký tự \n Chương trình nên thông báo kết quả thực hiện với hệ Chương trình nên thông báo kết quả thực hiện với hệ

thống: Tốt – 0, có lỗi – 1, 2, 3 … thống: Tốt – 0, có lỗi – 1, 2, 3 … Chương trình có một hàm mainChương trình có một hàm main

Page 8: 1 Gioi Thieu Chung

Ví dụ 2Ví dụ 2

#include <stdio.h>

int main(void){

int a, b;

printf(“Nhap 2 so ngguyen: ");scanf("%i %i", &a, &b);

printf("%i - %i = %i\n", a, b, a - b);

return 0;}

#include <stdio.h>

int main(void){

int a, b;

printf(“Nhap 2 so ngguyen: ");scanf("%i %i", &a, &b);

printf("%i - %i = %i\n", a, b, a - b);

return 0;}

Khai báo 2 biến số nguyên, “a” và “b”

Nhập 2 số nguyên vào a và b

Viết các biểu thức “a”, “b” và “a-b” theo định

dạng %i Nhap 2 so nguyen: 21 1721 - 17 = 4

Nhap 2 so nguyen: 21 1721 - 17 = 4

Page 9: 1 Gioi Thieu Chung

Biến – VariableBiến – Variable

int a, b; Chứa dữ liệu có thể thay đổi được trong chương trình.Chứa dữ liệu có thể thay đổi được trong chương trình. Muốn sử dụng phải khai báo.Muốn sử dụng phải khai báo. Tên: gồm chữ cái, ký số, dấu nối (_), không được bắt Tên: gồm chữ cái, ký số, dấu nối (_), không được bắt

đầu bằng ký số.đầu bằng ký số. Biến khai báo trong khối được gọi là biến cục bộ, Biến khai báo trong khối được gọi là biến cục bộ,

không thuộc khối nào được gọi là biến toàn cụckhông thuộc khối nào được gọi là biến toàn cục Có tác dụng trong toàn khối kể từ lúc được khai báo.Có tác dụng trong toàn khối kể từ lúc được khai báo.

Page 10: 1 Gioi Thieu Chung

Lệnh xuất - printfLệnh xuất - printf

Xuất dữ liệu ra màn hình:Xuất dữ liệu ra màn hình:

printf("%i - %i = %i\n", a, b, a - b); Các ký tự hằng được in nguyên vănCác ký tự hằng được in nguyên văn Các ký tự định dạng được thay bằng giá trị của biểu Các ký tự định dạng được thay bằng giá trị của biểu

thức tương ứng:thức tương ứng: %i: ký tự định dạng số nguyên kiểu int%i: ký tự định dạng số nguyên kiểu int Các ký tự điều khiển: \n – xuống dòng; \t – dấu tab; Các ký tự điều khiển: \n – xuống dòng; \t – dấu tab;

\\ – dấu \; \\\ – dấu \; \““– dấu – dấu ““ … … Thư viện:Thư viện: stdio.h

Page 11: 1 Gioi Thieu Chung

Lệnh nhập - scanfLệnh nhập - scanf

Nhập dữ liệu từ bàn phímNhập dữ liệu từ bàn phím

scanf("%i %i", &a, &b); Trong chuỗi định dạng chỉ có ký tự định dạng và Trong chuỗi định dạng chỉ có ký tự định dạng và

khoảng trắng.khoảng trắng. Dữ liệu phải được nhập vào các biến.Dữ liệu phải được nhập vào các biến. Trước tên biến phải ghi dấu Trước tên biến phải ghi dấu && - toán tử địa chỉ. Nếu - toán tử địa chỉ. Nếu

không có toán tử địa chỉ, giá trị của biến sẽ không không có toán tử địa chỉ, giá trị của biến sẽ không được cập nhậtđược cập nhật

Thư viện:Thư viện: stdio.h

Page 12: 1 Gioi Thieu Chung

Kiểu dữ liệu cơ sở Kiểu dữ liệu cơ sở trong Ctrong C

Page 13: 1 Gioi Thieu Chung

Các kiểu số nguyên của CCác kiểu số nguyên của C C hỗ trợ khá nhiều kiểu số nguyênC hỗ trợ khá nhiều kiểu số nguyên Các giá trị lớn nhất và nhỏ nhất được định nghĩa trong thư Các giá trị lớn nhất và nhỏ nhất được định nghĩa trong thư

viện “viện “limits.hlimits.h””

Kiểu định dạng kích thước nhỏ nhất lớn nhất

char %c 1 CHAR_MIN CHAR_MAX

unsigned char %c 1 0 UCHAR_MAX

short [int] %hi 2 SHRT_MIN SHRT_MAX

unsigned short %hu 2 0 USHRT_MAX

int %i 2 or 4 INT_MIN INT_MAX

unsigned int %u 2 or 4 0 UINT_MAX

long [int] %li 4 LONG_MIN LONG_MAX

unsigned long %lu 4 0 ULONG_MAX

Page 14: 1 Gioi Thieu Chung

Ví dụ về số nguyênVí dụ về số nguyên

#include <stdio.h>#include <limits.h>

int main(){

unsigned long big = ULONG_MAX;

printf("minimum int = %i, ", INT_MIN);printf("maximum int = %i\n", INT_MAX);printf("maximum unsigned = %u\n", UINT_MAX);printf("maximum long int = %li\n", LONG_MAX);printf("maximum unsigned long = %lu\n", big);

return 0;}

#include <stdio.h>#include <limits.h>

int main(){

unsigned long big = ULONG_MAX;

printf("minimum int = %i, ", INT_MIN);printf("maximum int = %i\n", INT_MAX);printf("maximum unsigned = %u\n", UINT_MAX);printf("maximum long int = %li\n", LONG_MAX);printf("maximum unsigned long = %lu\n", big);

return 0;} minimum int = -32768, maximum int = 32767

maximum unsigned = 65535maximum long int = 2147483647maximum unsigned long = 4294967295

minimum int = -32768, maximum int = 32767maximum unsigned = 65535maximum long int = 2147483647maximum unsigned long = 4294967295

Page 15: 1 Gioi Thieu Chung

#include <stdio.h>#include <limits.h>

int main(){

char lower_a = 'a';char lower_m = 'm';

printf("minimum char = %i, ", CHAR_MIN);printf("maximum char = %i\n", CHAR_MAX);

printf(“Sau '%c' la '%c'\n", lower_a, lower_a + 1);printf(“Ky tu in hoa '%c'\n", lower_m - 'a' + 'A');

return 0;}

#include <stdio.h>#include <limits.h>

int main(){

char lower_a = 'a';char lower_m = 'm';

printf("minimum char = %i, ", CHAR_MIN);printf("maximum char = %i\n", CHAR_MAX);

printf(“Sau '%c' la '%c'\n", lower_a, lower_a + 1);printf(“Ky tu in hoa '%c'\n", lower_m - 'a' + 'A');

return 0;} minimum char = -128, maximum char = 127

Sau 'a' la 'b'Ky tu in hoa 'M'

minimum char = -128, maximum char = 127Sau 'a' la 'b'Ky tu in hoa 'M'

In ra mã ASCII của ký tự

Ví dụ kiểu ký tựVí dụ kiểu ký tự

Trong NNLT C, Trong NNLT C, ký tựký tự chính là chính là số nguyênsố nguyên

Page 16: 1 Gioi Thieu Chung

Số nguyên trong các cơ số khácSố nguyên trong các cơ số khác Các hệ cơ số có thể thực hiện được: cơ số 8 (octal), cơ số Các hệ cơ số có thể thực hiện được: cơ số 8 (octal), cơ số

10 (decimal), cơ số 16 (hexadecimal)10 (decimal), cơ số 16 (hexadecimal)Số 0: số octal 0x: số

hexadecimal

#include <stdio.h>

int main(void){

int dec = 20, oct = 020, hex = 0x20;

printf("dec=%d, oct=%d, hex=%d\n", dec, oct, hex);printf("dec=%d, oct=%o, hex=%x\n", dec, oct, hex);

return 0;}

#include <stdio.h>

int main(void){

int dec = 20, oct = 020, hex = 0x20;

printf("dec=%d, oct=%d, hex=%d\n", dec, oct, hex);printf("dec=%d, oct=%o, hex=%x\n", dec, oct, hex);

return 0;}

dec=20, oct=16, hex=32dec=20, oct=20, hex=20

dec=20, oct=16, hex=32dec=20, oct=20, hex=20

Page 17: 1 Gioi Thieu Chung

Số thựcSố thực C hỗ trợ nhiều kiểu số thực lưu trữ dấu chấm động.C hỗ trợ nhiều kiểu số thực lưu trữ dấu chấm động. Các giá trị lớn nhất và nhỏ nhất được định nghĩa trong thư viện Các giá trị lớn nhất và nhỏ nhất được định nghĩa trong thư viện

““float.hfloat.h””

Kiểu định dạng kích thước nhỏ nhất lớn nhất

floatfloat %f %e %g 4 FLT_MINFLT_MAX

doubledouble %lf %le %lg 8 DBL_MINDBL_MAX

long doublelong double %Lf %Le %Lg 10 LDBL_MINLDBL_MAX

Page 18: 1 Gioi Thieu Chung

Ví dụ số thực:Ví dụ số thực:

#include <stdio.h>#include <float.h>

int main(void){

double f = 3.1416, g = 1.2e-5, h = 5000000000.0;

printf("f=%lf\tg=%lf\th=%lf\n", f, g, h);printf("f=%le\tg=%le\th=%le\n", f, g, h);printf("f=%lg\tg=%lg\th=%lg\n", f, g, h);

printf("f=%7.2lf\tg=%.2le\th=%.4lg\n", f, g, h);

return 0;}

#include <stdio.h>#include <float.h>

int main(void){

double f = 3.1416, g = 1.2e-5, h = 5000000000.0;

printf("f=%lf\tg=%lf\th=%lf\n", f, g, h);printf("f=%le\tg=%le\th=%le\n", f, g, h);printf("f=%lg\tg=%lg\th=%lg\n", f, g, h);

printf("f=%7.2lf\tg=%.2le\th=%.4lg\n", f, g, h);

return 0;}

f=3.141600 g=0.000012 h=5000000000.000000f=3.141600e+00 g=1.200000e-05 h=5.000000e+09f=3.1416 g=1.2e-05 h=5e+09f= 3.14 g=1.20e-05 h=5e+09

f=3.141600 g=0.000012 h=5000000000.000000f=3.141600e+00 g=1.200000e-05 h=5.000000e+09f=3.1416 g=1.2e-05 h=5e+09f= 3.14 g=1.20e-05 h=5e+09

Page 19: 1 Gioi Thieu Chung

Hằng – ConstantHằng – Constant

constconst int int days_in_weekdays_in_week = 7; = 7;

Chứa dữ liệu không thể thay đổi được trong chương trình.Chứa dữ liệu không thể thay đổi được trong chương trình. Muốn sử dụng phải khai báo.Muốn sử dụng phải khai báo. Phải có kiểu (tương tự như biến)Phải có kiểu (tương tự như biến) Hằng số có chứa “.” hoặc “e” có kiểu Hằng số có chứa “.” hoặc “e” có kiểu doubledouble (3.5, 1e-7, -1.29e15) (3.5, 1e-7, -1.29e15) Hằng số kiểu Hằng số kiểu floatfloat kết thúc bởi “F” (3.5F, 1e-7F) kết thúc bởi “F” (3.5F, 1e-7F) Hằng số kiểu Hằng số kiểu longlong doubldouble kết thúc bởi “L” (-1.29e15L, 1e-7L)e kết thúc bởi “L” (-1.29e15L, 1e-7L) Hằng số không có “.”, “e” hoặc “F” có kiểu Hằng số không có “.”, “e” hoặc “F” có kiểu int.int. Ví dụ: 10000, -35. Ví dụ: 10000, -35.

(Một vài trình biên dịch tự động chuyển thành (Một vài trình biên dịch tự động chuyển thành longlong intint nếu giá trị nếu giá trị hằng tràn kiểu hằng tràn kiểu intint))

Khai báo hằng Khai báo hằng longlong intint phải thêm vào cuối “L” (9000000L) phải thêm vào cuối “L” (9000000L)

Page 20: 1 Gioi Thieu Chung

Ví dụ về hằngVí dụ về hằngCác hằng pi, days_in_week, sunday được tạo với từ khóa constCác hằng pi, days_in_week, sunday được tạo với từ khóa const

#include <stdio.h>

int main(void){

const long double pi = 3.141592653590L;const int days_in_week = 7;const sunday = 0;

days_in_week = 5;

return 0;}

#include <stdio.h>

int main(void){

const long double pi = 3.141592653590L;const int days_in_week = 7;const sunday = 0;

days_in_week = 5;

return 0;}

LỗiLỗi

Page 21: 1 Gioi Thieu Chung

Hằng xử lý trước biên dịchHằng xử lý trước biên dịch

Các hằng có thể được xác lập trước khi biên dịchCác hằng có thể được xác lập trước khi biên dịch Bản chất là tìm kiếm và thay thếBản chất là tìm kiếm và thay thế Thường được đặt tên với các chữ cái in hoaThường được đặt tên với các chữ cái in hoa

#include <stdio.h>

#define PI 3.141592653590L#define DAYS_IN_WEEK 7#define SUNDAY 0

int day = SUNDAY;long flag = USE_API;

#include <stdio.h>

#define PI 3.141592653590L#define DAYS_IN_WEEK 7#define SUNDAY 0

int day = SUNDAY;long flag = USE_API;

Tìm từ “PI”, thay bằng 3.1415....

Không thay thế “PI”

Lưu ý: không có “=” và “;”

Page 22: 1 Gioi Thieu Chung

Toán tử trong CToán tử trong C

Page 23: 1 Gioi Thieu Chung

Toán tử trong CToán tử trong C

Phép toán số họcPhép toán số học Ép kiểuÉp kiểu Các toán tử trên bitCác toán tử trên bit Các toán tử so sánhCác toán tử so sánh Phép gánPhép gán Toán tử Toán tử sizeofsizeof Biểu thức điều kiệnBiểu thức điều kiện

Page 24: 1 Gioi Thieu Chung

Toán tử số họcToán tử số học

NNLT C hỗ trợ các phép toán số học:NNLT C hỗ trợ các phép toán số học:

++ cộngcộng

-- trừtrừ

** nhânnhân

// chiachia

%% chia lấy dưchia lấy dư

Lưu ý: Lưu ý: ““/” cho kết quả phụ thuộc vào kiểu của các toán hạng/” cho kết quả phụ thuộc vào kiểu của các toán hạng ““%” không thực hiện được với các số thực%” không thực hiện được với các số thực

Page 25: 1 Gioi Thieu Chung

Ví dụ về toán tử chia “/”Ví dụ về toán tử chia “/” Trình biên dịch dựa vào kiểu của các toán hạng để quyết Trình biên dịch dựa vào kiểu của các toán hạng để quyết

định phép chia tương ứngđịnh phép chia tương ứng

int main(void){

int i = 5, j = 4, k;double f = 5.0, g = 4.0, h;

k = i / j;h = f / g;h = i / j;

return 0;}

int main(void){

int i = 5, j = 4, k;double f = 5.0, g = 4.0, h;

k = i / j;h = f / g;h = i / j;

return 0;}

“i”, “j” kiểu int, “/” là phép chia lấy nguyên

k nhận giá trị 1

“f”, “g” kiểu double, “/” là phép chia số thực h nhận giá trị 1.25

Phép chia nguyên, bất kể “h” có kiểu double.

Kết quả là 1.00000

Page 26: 1 Gioi Thieu Chung

Ép kiểuÉp kiểu Ép kiểu làm thay đổi Ép kiểu làm thay đổi tạm thời tạm thời kiểu của một biến trong một kiểu của một biến trong một

biểu thức.biểu thức.int main(void){

int i = 5, j = 4;double f;

f = (double)i / j;f = i / (double)j;f = (double)i / (double)j;f = (double)(i / j);

return 0;}

int main(void){

int i = 5, j = 4;double f;

f = (double)i / j;f = i / (double)j;f = (double)i / (double)j;f = (double)(i / j);

return 0;}

Phép chia số nguyên được thực hiện, kết

quả, 1, được đổi sang kiểu double, 1.00000

Page 27: 1 Gioi Thieu Chung

Phép tăng (giảm) Phép tăng (giảm) 11

NNLT C có 2 toán tử đặc biệt hỗ trợ việc tăng (giảm) giá trị NNLT C có 2 toán tử đặc biệt hỗ trợ việc tăng (giảm) giá trị của một biến thay đổi 1 đơn vịcủa một biến thay đổi 1 đơn vị

++++ tăng 1tăng 1

---- giảm 1giảm 1

Các toán tử này có thể đặt ở trước hoặc sau biến.Các toán tử này có thể đặt ở trước hoặc sau biến.

int i = 5, j = 4;

i ++;-- j;++ i;

int i = 5, j = 4;

i ++;-- j;++ i;

“i” 6

“j” 3

“i” 7

Page 28: 1 Gioi Thieu Chung

Trước hay sau ?Trước hay sau ?Thứ tự thực hiện các toán tử ++ và -- phụ thuộc vào vị trí của Thứ tự thực hiện các toán tử ++ và -- phụ thuộc vào vị trí của chúng (trước hay sau) so với biến:chúng (trước hay sau) so với biến:

#include <stdio.h>

int main(void){

int i, j = 5;i = ++j;printf("i=%d, j=%d\n", i, j);j = 5;i = j++;printf("i=%d, j=%d\n", i, j);

return 0;}

#include <stdio.h>

int main(void){

int i, j = 5;i = ++j;printf("i=%d, j=%d\n", i, j);j = 5;i = j++;printf("i=%d, j=%d\n", i, j);

return 0;}

i=6, j=6i=5, j=6

i=6, j=6i=5, j=6

Tương đương: 1. j++; 2. i = j;

Tương đương: 1. i = j; 2. j++;

Page 29: 1 Gioi Thieu Chung

Kiểu luận lý trong CKiểu luận lý trong C

Trong C không có kiểu dữ liệu luận lý (thể hiện các Trong C không có kiểu dữ liệu luận lý (thể hiện các giá trị ĐÚNG – SAI), thay vào đó các biểu thức so giá trị ĐÚNG – SAI), thay vào đó các biểu thức so

sánh sẽ cho kết quả là sánh sẽ cho kết quả là SỐSỐ Giá trị Giá trị 00 (0.0) ứng với kết quả SAI (FALSE) (0.0) ứng với kết quả SAI (FALSE) Các giá trị khác như Các giá trị khác như 1, -3.5, -7, 10.4, … (khác không)1, -3.5, -7, 10.4, … (khác không)

đều được xem là ĐÚNG (TRUE)đều được xem là ĐÚNG (TRUE)

Page 30: 1 Gioi Thieu Chung

Các toán tử so sánhCác toán tử so sánh

NNLT C hỗ trợ các phép so sánh:NNLT C hỗ trợ các phép so sánh:

<< bé hơnbé hơn

<=<= bé hơn hay bằngbé hơn hay bằng

>> lớn hơnlớn hơn

>=>= lớn hơn hay bằnglớn hơn hay bằng

==== bằngbằng

!=!= không bằngkhông bằng

Tất cả đều cho kết quả Tất cả đều cho kết quả 11 khi so sánh đúng và khi so sánh đúng và 00 trong trong trường hợp ngược lại.trường hợp ngược lại.

Page 31: 1 Gioi Thieu Chung

Toán tử luận lýToán tử luận lý

NNLT C hỗ trợ các toán tử luận lý:NNLT C hỗ trợ các toán tử luận lý:

&&&& và (and)và (and)

|||| hoặc (or)hoặc (or)

!! phủ định (not)phủ định (not)

Tất cả đều cho kết quả 1 hoặc 0 tương ứng các trường hợp Tất cả đều cho kết quả 1 hoặc 0 tương ứng các trường hợp ĐÚNG hoặc SAIĐÚNG hoặc SAI

int i, j = 10, k = 28;

i = ((j > 5) && (k < 100)) || (k > 24);

int i, j = 10, k = 28;

i = ((j > 5) && (k < 100)) || (k > 24);

Page 32: 1 Gioi Thieu Chung

Toán tử luận lýToán tử luận lý

Lưu ý khi sử dụng các toán tử luận lý:Lưu ý khi sử dụng các toán tử luận lý:

Nếu không có các dấu (), các phép toán được thực hiện từ Nếu không có các dấu (), các phép toán được thực hiện từ trái sang phảitrái sang phải

if(i < 10 && a[i] > 0)printf("%i\n", a[i]);

if(i < 10 && a[i] > 0)printf("%i\n", a[i]);

“i < 10” được kiểm tra trước, nếu không đúng giá trị của biểu thức sẽ là 0 và “a[i] > 0” sẽ không được tính

if((i < 10) && (a[i] > 0))printf("%i\n", a[i]);

if((i < 10) && (a[i] > 0))printf("%i\n", a[i]);

Nên viết

Không nên:(a < b < c)Không nên:(a < b < c) Nên:((a < b) && (b< c)Nên:((a < b) && (b< c)

Page 33: 1 Gioi Thieu Chung

Toán tử trên bitToán tử trên bit

Các toán tử trên bit chỉ có tác dụng trên các kiểu số nguyên:Các toán tử trên bit chỉ có tác dụng trên các kiểu số nguyên:

&& AndAnd

|| OrOr

^̂ XOrXOr

>>>> Đẩy phảiĐẩy phải

<<<< Đẩy tráiĐẩy trái

Page 34: 1 Gioi Thieu Chung

Ví dụ về các toán tử trên bitVí dụ về các toán tử trên bit#include <stdio.h>

int main(void){

short a = 0x6eb9;short b = 0x5d27;unsigned short c = 7097;

printf("0x%x, ", a & b);printf("0x%x, ", a | b);printf("0x%x\n", a ^ b);

printf("%u, ", c << 2);printf("%u\n", c >> 1);

return 0;}

#include <stdio.h>

int main(void){

short a = 0x6eb9;short b = 0x5d27;unsigned short c = 7097;

printf("0x%x, ", a & b);printf("0x%x, ", a | b);printf("0x%x\n", a ^ b);

printf("%u, ", c << 2);printf("%u\n", c >> 1);

return 0;}

0x4c21, 0x7fbf, 0x339e28388, 3548

0x4c21, 0x7fbf, 0x339e28388, 3548

0x6eb9 0110 1110 1011 10010x5d27 0101 1101 0010 01110x4c21 0100 1100 0010 0001

0x6eb9 0110 1110 1011 10010x5d27 0101 1101 0010 01110x4c21 0100 1100 0010 0001

0x6eb9 0110 1110 1011 10010x5d27 0101 1101 0010 01110x7fbf 0111 1111 1011 1111

0x6eb9 0110 1110 1011 10010x5d27 0101 1101 0010 01110x7fbf 0111 1111 1011 1111

0x6eb9 0110 1110 1011 10010x5d27 0101 1101 0010 01110x339e 0011 0011 1001 1110

0x6eb9 0110 1110 1011 10010x5d27 0101 1101 0010 01110x339e 0011 0011 1001 1110

7097 0001 1011 1011 100128388 0110 1110 1110 0100

7097 0001 1011 1011 100128388 0110 1110 1110 0100

7097 0001 1011 1011 1001 3548 0000 1101 1101 1100

7097 0001 1011 1011 1001 3548 0000 1101 1101 1100

Page 35: 1 Gioi Thieu Chung

Phép gánPhép gán

Có thể sử dụng liên tiếp nhiều phép gánCó thể sử dụng liên tiếp nhiều phép gán Giá trị được gán sẽ sẵn sàng cho lệnh kế tiếpGiá trị được gán sẽ sẵn sàng cho lệnh kế tiếp

int i, j, k, l, m, n;

i = j = k = l = m = n = 22;

printf("%i\n", j = 93);

int i, j, k, l, m, n;

i = j = k = l = m = n = 22;

printf("%i\n", j = 93);

“n = 22” gán trước, lại gán “n” cho “m”, “m” cho “l”, … i, j, k, l, m, n đều nhận giá trị 22.

“j” được gán 93, giá trị 93 sẽ được in ra màn hình

Page 36: 1 Gioi Thieu Chung

Lưu ý:Lưu ý: Vế trái phép gán luôn phải là Vế trái phép gán luôn phải là biếnbiến Không được nhầm lẫn giữa so sánh bằng Không được nhầm lẫn giữa so sánh bằng “==” “==” và gánvà gán “=” “=”

#include <stdio.h>

int main(void){

int i = 0;

if(i = 0)printf("i nhan gia tri khong\n");

elseprintf(“i khac khong\n");

return 0;}

#include <stdio.h>

int main(void){

int i = 0;

if(i = 0)printf("i nhan gia tri khong\n");

elseprintf(“i khac khong\n");

return 0;}

i khac khongi khac khong

Phép gánPhép gán

Page 37: 1 Gioi Thieu Chung

Một số phép gán đặc biệtMột số phép gán đặc biệt Các phép gán kết hợp toán tử khác:Các phép gán kết hợp toán tử khác:

+=+= -=-= *=*= /=/= %=%=

&=&= |=|= ^=^=

<<=<<= >>=>>=

Tổng quát:Tổng quát:

biến biến opop= biểu thức= biểu thức

tương đương:tương đương:

biến = biến biến = biến opop (biểu thức) (biểu thức)

a += 27;a += 27;

a = a + 27;a = a + 27;f /= 9.2;f /= 9.2;

f = f / 9.2;f = f / 9.2;i *= j + 2;i *= j + 2;

i = i * (j + 2);i = i * (j + 2);

Page 38: 1 Gioi Thieu Chung

Toán tử Toán tử sizeofsizeof

sizeofsizeof(Obj)(Obj) Cho biết kích thước của đối tượng theo đơn vị byteCho biết kích thước của đối tượng theo đơn vị byte

#include <stdio.h>

int main(void){

long big;

printf("\"big\" is %u bytes\n", sizeof(big));printf("a short is %u bytes\n", sizeof(short));printf("a double is %u bytes\n", sizeof (double));

return 0;}

#include <stdio.h>

int main(void){

long big;

printf("\"big\" is %u bytes\n", sizeof(big));printf("a short is %u bytes\n", sizeof(short));printf("a double is %u bytes\n", sizeof (double));

return 0;}

"big" is 4 bytesa short is 2 bytesa double is 8 bytes

"big" is 4 bytesa short is 2 bytesa double is 8 bytes

Page 39: 1 Gioi Thieu Chung

Biểu thức chọn theo điều kiệnBiểu thức chọn theo điều kiện((điều kiệnđiều kiện) ? ) ? BT1BT1 : : BT2BT2

Biểu thức nhận giá trị Biểu thức nhận giá trị BT1BT1 nếu điều kiện khác 0 (ĐÚNG), nếu điều kiện khác 0 (ĐÚNG), các trường hợp khác nhận giá trị các trường hợp khác nhận giá trị BT2BT2

Có thể định nghĩa sẵn một macro để tìm số lớn:Có thể định nghĩa sẵn một macro để tìm số lớn:#define max(x, y) ((x>y) ? x : y)#define max(x, y) ((x>y) ? x : y)

int i, j = 100, k = -1;

i = (j > k) ? j : k;

int i, j = 100, k = -1;

i = (j > k) ? j : k;

int i, j = 100, k = -1;

i = (j < k) ? j : k;

int i, j = 100, k = -1;

i = (j < k) ? j : k;

Nếu (j > k)i = j;

Ngược lạii = k;

Nếu (j > k)i = j;

Ngược lạii = k;

Nếu (j < k)i = j;

Ngược lạii = k;

Nếu (j < k)i = j;

Ngược lạii = k;

Page 40: 1 Gioi Thieu Chung

Độ ưu tiên của toán tửĐộ ưu tiên của toán tử

Thứ tự thực hiện các toán tử trong một biểu thức phụ thuộc Thứ tự thực hiện các toán tử trong một biểu thức phụ thuộc vào vào độ ưu tiên độ ưu tiên của chúng.của chúng.

Có 15 mức ưu tiên.Có 15 mức ưu tiên. Thông thường, toán tử một ngôi có độ ưu tiên cao hơn toán Thông thường, toán tử một ngôi có độ ưu tiên cao hơn toán

tử hai ngôi.tử hai ngôi. Các cặp dấu ngoặc đơn () thường được dùng để chỉ rõ thứ tự Các cặp dấu ngoặc đơn () thường được dùng để chỉ rõ thứ tự

các toán tử.các toán tử.#include <stdio.h>int main(void){

int j = 3 * 4 + 48 / 7;printf("j = %i\n", j);

return 0;}

#include <stdio.h>int main(void){

int j = 3 * 4 + 48 / 7;printf("j = %i\n", j);

return 0;}

j = 18j = 18

Page 41: 1 Gioi Thieu Chung

Bảng thứ tự thực hiện các toán tửBảng thứ tự thực hiện các toán tửToán tử

Thứ tự (nếu cùng ĐƯT)() [] -> .

! ++ -- - + (cast) * & sizeof

* / %

+ -

<< >>

< <= >= >

== !=

&

|

^

&&

||

?:

= += -= *= /= %= …

Page 42: 1 Gioi Thieu Chung

Luyện tậpLuyện tập

#include <stdio.h>

int main(void){

int i = 0, j, k = 7, m = 5, n;j = m += 2;printf("j = %d\n", j);j = k++ > 7;printf("j = %d\n", j);j = i == 0 & k;printf("j = %d\n", j);n = !i > k >> 2;printf("n = %d\n", n);return 0;

}

#include <stdio.h>

int main(void){

int i = 0, j, k = 7, m = 5, n;j = m += 2;printf("j = %d\n", j);j = k++ > 7;printf("j = %d\n", j);j = i == 0 & k;printf("j = %d\n", j);n = !i > k >> 2;printf("n = %d\n", n);return 0;

}

Page 43: 1 Gioi Thieu Chung

Tóm lượcTóm lược

Một số thành phần của chương trình trong CMột số thành phần của chương trình trong C Hàm mainHàm main Lệnh xuất / nhập – printf / scanfLệnh xuất / nhập – printf / scanf BiếnBiến Các kiểu số nguyên và số thựcCác kiểu số nguyên và số thực Hằng – 2 cách khai báoHằng – 2 cách khai báo Sử dụng toán tử trong CSử dụng toán tử trong C