Tin học đại cương - profthinh Giao trinh THDC C

141 83 0
Tin học đại cương - profthinh Giao trinh THDC C

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ThS Trần Thị Mỹ Tiên BÀI GIẢNG TIN HỌC ĐẠI CƯƠNG (Tài liệu dùng cho sinh viên khối ngành kĩ thuật) THÀNH PHỐ HỒ CHÍ MINH – NĂM 2013 MỤC LỤC PHẦN ĐẠI CƯƠNG VỀ TIN HỌC Chương CÁC KIẾN THỨC CƠ BẢN VỀ TIN HỌC 1.1 1.2 1.3 1.4 1.5 Giới thiệu máy tính điện tử Thông tin xử lí thơng tin Hệ đếm biểu diễn thơng tin máy tính Cấu trúc máy tính 16 Phần mềm máy tính 20 Chương HỆ ĐIỀU HÀNH VÀ CÁC CHƯƠNG TRÌNH TIỆN ÍCH 22 2.1 2.2 2.3 2.4 Khái niệm chức hệ điều hành 22 Phân loại hệ điều hành 29 Một số hệ điều hành phổ biến 29 Các chương trình tiện ích hệ điều hành Windows 30 Chương THUẬT TOÁN 34 3.1 3.2 3.3 3.4 Giới thiệu 34 Khái niệm thuật toán 34 Các phương pháp biểu diễn thuật toán 35 Các cấu trúc 38 PHẦN NGƠN NGỮ LẬP TRÌNH C 45 Chương TỔNG QUAN VỀ NGÔN NGỮ LẬP TRÌNH C 47 1.1 1.2 1.3 1.4 Giới thiệu ngôn ngữ C 47 Các thành phần ngôn ngữ C 48 Cấu trúc chương trình C 65 Biên dịch thực thi chương trình C 67 Chương NHẬP XUẤT DỮ LIỆU VÀ CÁC LỆNH ĐIỀU KHIỂN 70 2.1 Nhập xuất liệu 70 2.2 Các lệnh điều khiển 81 Chương HÀM VÀ TỔ CHỨC CHƯƠNG TRÌNH 100 3.1 3.2 3.3 3.4 3.5 3.6 Tổ chức chương trình thành chương trình 100 Định nghĩa hàm khai báo nguyên mẫu hàm 101 Lời gọi hàm 104 Truyền đối số cho hàm 107 Phạm vi biến 110 Hàm đệ quy 113 Chương MẢNG VÀ CON TRỎ 118 4.1 Mảng 118 4.2 Con trỏ 132 PHẦN ĐẠI CƯƠNG VỀ TIN HỌC Chương CÁC KIẾN THỨC CƠ BẢN VỀ TIN HỌC 1.1 Giới thiệu máy tính điện tử Máy tính công cụ mạnh mà người tạo Nó diện khắp nơi, từ trường học quan, ngân hàng, bệnh viện, siêu thị, nhà chúng ta,…Với phát triển vượt bậc lĩnh vực công nghệ thông tin, máy tính đa dạng tính kích cỡ, đáp ứng nhu cầu nhiều người tiêu dùng khác Thơng qua máy tính, xã hội tiếp cận thơng tin từ khắp nơi giới tin tức, thông tin dự báo thời tiết, tỉ số trận đấu, lịch trình chuyến bay, danh bạ điện thoại, đồ đường đi, … Mọi người gửi tin nhắn, chia sẻ sách, hình ảnh, nhạc, video, thực gọi, kết bạn mới, chia sẻ ý kiến, đặt vé máy bay, mua sắm, tham gia khóa học với máy tính có kết nối mạng internet Hình 1.1 - Ứng dụng tin học Dù nhà hay đường, người sử dụng máy tính để quản lí lịch biểu, kiểm tra tài khoản, chuyển tiền, tốn hóa đơn mua bán cổ phiếu Khi cơng nghệ phát triển máy tính trở thành phần sống hàng ngày Nhiều người tin rằng, có kiến thức kinh nghiệm sử dụng máy tính hiệu góp phần tạo nên thành cơng cho họ Vậy máy tính điện tử gì? Máy tính thiết bị điện tử hoạt động điều khiển thị lưu trữ nhớ Nó có khả đọc, xử lí, xuất lưu trữ liệu Rất nhiều kiểu liệu khác xử lí máy tính bao gồm liệu số (số nguyên, số thực), liệu kí tự (tên, địa chỉ,…), liệu đồ họa (hình vẽ, biểu đồ, ….), âm Trong đó, hai kiểu liệu phổ biến liệu số liệu kí tự 1.1.1 Lịch sử phát triển máy tính Năm 1945, Von Neumann người đề xuất nguyên lý làm việc máy tính số, Theo đó, máy tính làm việc theo chương trình lưu trữ nhớ với liệu liên quan Và máy tính điện tử “ENIAC” đời năm 1946 phát triển Eckert Mauchly Từ đến nay, phát triển máy tính trải qua nhiều hệ Thế hệ thứ (1940-1956): sử dụng số lượng lớn bóng đèn chân khơng UNIVAC ENIAC ví dụ điển hình thiết bị tính tốn nhanh thời kì Tuy nhiên, chúng thiết bị khổng lồ, chiếm diện tích lớn, tiêu thụ nhiều điện độ tin cậy thấp, thường xuyên bị trặc lỗi phần cứng Tốc độ tính tốn từ vài nghìn đến vài chục nghìn phép tính giây Phần mềm chưa phát triển, chủ yếu sử dụng ngơn ngữ máy để lập trình Dữ liệu đưa vào máy sử dụng thẻ đục lỗ Thế hệ máy tính đắt đến mức có phủ hay viện nghiên cứu lớn có đủ điều kiện để trì hoạt động chúng Thế hệ thứ hai (1956-1963): Bóng bán dẫn (Transistor) sử dụng để thay cho bóng đèn chân khơng Bóng bán dẫn giúp máy tính trở nên nhỏ gọn hơn, tiêu thụ điện hơn, nhớ có dung lượng lớn hơn, tin cậy Ở hệ bắt đầu chuyển từ mã nhị phân sang sử dụng kí tự ngơn ngữ bậc thấp cho phép lập trình viên viết thị từ Một số ngôn ngữ bậc cao phát triển thời gian này, chẳng hạn COBOL, FORTRAN, ALGOL, SNOBOL Thế hệ thứ (1964-1971): Phát triển mạch tích hợp (IC) cải tiến lớn giai đoạn Các bóng bán dẫn thu nhỏ tích hợp chip đơn, làm tăng đáng kể tốc độ hiệu suất máy tính Các ngơn ngữ bậc cao COBOL FORTRAN chuẩn hóa theo chuẩn ANSI Ngồi ra, số ngôn ngữ giới thiệu thời gian PL/I PASCAL BASIC Các tiến khác cần phải kể đến: người dùng tương tác với máy tính thơng qua bàn phím hình, hệ điều hành bắt đầu xuất cho phép máy tính chạy nhiều ứng dụng lúc Thế hệ thứ (1971-1989): Hàng ngàn mạch tích hợp xây dựng chip đơn gọi vi xử lí (microprocessor) Con chip Intel 4004 phát triển năm 1971 chứa tất thành phần máy tính, từ CPU, nhớ, điều khiển xuất/nhập Bên cạnh nhỏ gọn, máy tính trở nên mạnh mẽ với khả liên kết với qua hình thức kết nối mạng, đánh dấu phát triển Internet Máy tính hệ thứ cho thấy phát triển giao diện đồ họa, chuột thiết bị cầm tay Đĩa mềm sử dụng thay cho đĩa từ, hệ điều hành giới thiệu MS-DOS, MS-WINDOWS UNIX hệ điều hành độc quyền hãng Apple Thế hệ thứ (ngày nay): Lĩnh vực nghiên cứu chủ yếu tập trung vào việc phát triển máy tính biết suy nghĩ, có khả tự học, tự xử lí gọi trí tuệ nhân tạo Một số ứng dụng dùng rộng rãi, chẳng hạn nhận dạng hình ảnh, nhận dạng giọng nói, dịch thuật,… 1.1.2 Phân loại máy tính Dựa kích thước, kiến trúc vật lý, dung lượng nhớ, tốc độ xử lí, máy tính chia làm nhiều loại sơ đồ đây: Siêu máy tính: Là loại máy tính mạnh nhất, nhanh đắt nhất, nên thường sử dụng vào lĩnh vực quan trọng, tốn cần xử lí liệu lớn tính tốn phức tạp dự báo thời tiết, nghiên cứu biến đổi khí hậu, nghiên cứu lượng hạt nhân, khai thác dầu khí, thiết kế tên lửa, thiết kế máy bay,… Hình 1.2 – Siêu máy tính Máy tính lớn: Điểm khác biệt siêu máy tính máy tính lớn siêu máy tính tận dụng sức mạnh để thực vài chương trình nhanh có thể, máy tính lớn lại tập trung khả để thực nhiều chương trình đồng thời lúc Máy tính lớn chủ yếu sử dụng quan, doanh nghiệp lớn ngân hàng, hàng khơng, tổ chức phủ để chạy ứng dụng cần xử lý khối lượng liệu lớn Máy tính mini: Là máy tính với kích cỡ, tốc độ khả tầm trung Nó thuộc lớp máy tính đa người dùng, nằm khoảng máy tính lớn(hệ thống đa người dùng) máy tính cá nhân(hệ thống đơn người dùng) Máy tính mini thường dùng doanh nghiệp vừa nhỏ Máy vi tính: Là máy tính có kích thước nhỏ giá thành rẻ loại máy trên, phù hợp với nhiều người, nên dần sử dụng rộng rãi khắp nơi từ hộ gia đình, trường học, công ty nhỏ…Vào năm 1981, công ty IBM phát triển phiên máy vi tính có tên máy tính cá nhân (PC – Personal Computer) Hiện nay, có nhiều loại máy vi tính khác gồm desktop, laptop, thiết bị cầm tay hệ thống nhúng o Desktop: mơ hình PC phổ biến nay, chủ yếu sử dụng nhà văn phòng Nó thiết kế phù hợp với kích thước mặt bàn sử dụng cố định vị trí o Laptop: loại máy tính cá nhân, tích hợp hầu hết thành phần giống Desktop, có kích thước nhỏ gọn hơn, mang xách được, hoạt động pin, lực xử lí tốt nên ưa chuộng Hiện nay, nhiều thương hiệu laptop đời với tính năng, độ tin cậy, kích thước, giá khác như: Apple, Sony, Dell, HP, Acer,… mang lại đa dạng hóa cho thị trường máy tính giúp người dùng dễ dàng chọn lựa sản phẩm phù hợp với nhu cầu khả Bên cạnh đó, loại máy tính có nhiều dạng khác cần phải kể đến như: netbook, tablet PC, subnotebook, ultrabook,… o Các thiết bị cầm tay: thiết bị thiết kế nhỏ gọn, để gọn túi Tồn liệu chương trình lưu trữ vùng nhớ với dung lượng nhỏ thiết bị thẻ nhớ Một số loại thiết bị cầm tay phổ biến như: PDA, smartphone, mobile phone,… chủ yếu phục vụ nhu cầu giải trí, đọc sách, truy cập internet người dùng, thực thi ứng dụng đơn giản o Máy tính nhúng: thiết kế để thực chức định nhúng vào sản phẩm ô tô, ti vi, robot, ATM, máy bán vé tự động,…Ưu điểm hệ thống nhúng tối ưu để giảm thiểu chi phí, chẳng hạn khơng đòi hỏi bàn phím, chuột, hình Hình 1.3 – Máy tính nhúng Lưu ý: Cách phân loại mang tính tương đối Trong tương lai, loại máy tính có khả vượt trội so với 1.2 Thông tin xử lí thơng tin 1.2.1 Thơng tin liệu Trước tìm hiểu thơng tin xử lí máy tính, ta cần phân biệt hai khái niệm liệu thông tin Dữ liệu tập hợp tất thứ mà thu thập được, chưa qua xử lí bao gồm văn bản, số liệu, hình ảnh, audio video Thông tin liệu xử lí, tổ chức, có ý nghĩa hữu dụng với người Thơng tin sinh ra, lưu trữ, truyền đi, chép bị biến dạng Ta xét ví dụ sau: Một khách hàng đến siêu thị Co.op Mart Phan Văn Trị mua hàng, sau quầy tính tiền Nhân viên quầy nhập liệu mặt hàng vào máy tính Sau liệu xử lí xong khách hàng nhận hóa đơn tính tiền chứa thơng tin gồm tổng số tiền cần toán, số tiền thừa,….Thông tin tổng số tiền thu lưu nhớ máy tính siêu thị sử dụng chúng làm liệu đầu vào để thực trình thống kê, báo cáo tương lai Hình 1.4 – Ví dụ minh họa thơng tin liệu 1.2.2 Xử lí thơng tin Máy tính xử lí liệu (đầu vào) thành thơng tin (đầu ra) Dữ liệu thông tin thường lưu trữ nhớ máy tính để sử dụng tương lai Do đó, ta xem chu kỳ xử lí thơng tin tiến trình bao gồm ghi nhận liệu đầu vào, xử lí nó, xuất thơng tin có ý nghĩa hoạt động lưu trữ Hình 1.5 – Q trình xử lí thơng tin Thơng tin kết q trình xử lí liệu sau thơng tin trở thành liệu để thơng qua q trình xử lí khác tạo thơng tin 1.2.3 Đơn vị đo thơng tin Máy tính điện tử xây dựng từ bóng bán dẫn có hai trạng thái tắt mở Vì vậy, để biểu diễn thơng tin máy tính người ta sử dụng chữ số nhị phân Việc xử lí hai chữ số đơn giản hơn, rẻ đáng tin cậy so với việc sử dụng 10 chữ số hệ thập phân Mỗi chữ số nhị phân mang lượng thơng tin đối tượng xem đơn vị thơng tin Đơn vị gọi “bit” ta gọi bit Tuy nhiên, để dễ dàng việc biểu diễn thông tin, người ta nhóm dãy bit thành 1byte (B) Số lượng bit chọn số lượng cần thiết để biểu diễn mã hóa kí tự đơn Như vậy, thuật ngữ “byte” dùng để đơn vị lưu trữ liệu máy tính Ngồi ra, người ta dùng nhiều đơn vị khác bội byte sau: Đơn vị đo dung lượng lưu trữ thông tin 10 Kilobyte (KB) KB = 1,024 B = B Megabyte (MB) MB = 1,024 KB Gigabyte (GB) GB = 1,024 MB Terabyte (TB) TB = 1,024 GB Petabyte (PB) PB = 1,024 TB Exabyte (EB) EB = 1,024 PB Zettabyte (ZB) ZB = 1,024 EB Yottabyte (YB) YB = 1,024 ZB Bảng 1.1 - Các đơn vị đo dung lượng lưu trữ thông tin 1.3 Hệ đếm biểu diễn thơng tin máy tính 1.3.1 Hệ đếm Hệ đếm xác định phương pháp biểu diễn số sử dụng ký hiệu khác Một số biểu diễn khác hệ đếm khác Chẳng hạn như, hai số (2A)16 (52)8 có giá trị (42)10 Hệ đếm chia làm hai loại gồm hệ đếm theo vị trí hệ đếm khơng theo vị trí Trong phần xem xét hệ đếm theo vị trí Trong hệ đếm này, giá trị ký hiệu tính dựa vào thân ký hiệu đó, vị trí số, số hệ Giả sử, số biểu diễn dạng: Số có giá trị là: (*) Trong đó, S tập hợp ký hiệu, số k-1, k-2,…, 2, 1, vị trí của ký hiệu phần nguyên số, số -1, -2, …, -l vị trí ký hiệu phần thập phân số Mỗi hệ đếm theo vị trí số riêng, ký hiệu b tập hợp ký hiệu định Sau đây, ta xem xét hệ đếm theo vị trí gồm hệ thập phân, hệ nhị phân, hệ thập lục phân, hệ bát phân Để phân biệt số I hệ đếm khác ta sử dụng dấu ngoặc đơn số làm số: (I)b a Hệ thập phân (hệ số 10) Hệ thập phân hệ đếm có số b 10 sử dụng 10 ký hiệu sau để biểu diễn: S = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} Ngoài ký hiệu từ tập S, người ta sử dụng dấu -, dấu thập phân để biểu diễn số thập phân Dựa vào công thức (*) ta đánh giá giá trị số hệ thập phân Ví dụ: I = 224 b Hệ nhị phân (hệ số 2) Hệ nhị phân hệ đếm có số b sử dụng ký hiệu S = {0, 1} Hai ký hiệu gọi bit Đây hệ đếm mà máy tính sử dụng để biễu diễn thông tin Với số hệ nhị phân ta tính giá trị hệ thập phân dựa vào cơng thức (*) Ta làm tương tự với toán tìm phần tử có giá trị nhỏ mảng a f Sắp xếp mảng theo thứ tự - Yêu cầu toán: Cho mảng a gồm n phần tử Hãy xếp mảng a theo thứ tự tăng dần - Ý tưởng: Một mảng gọi tăng dần cặp phần tử mảng ln thỏa tính chất a[i] ≤ a[j], với i < j Vậy, để xếp mảng ta thực tìm tất cặp nghịch (khơng thỏa tính chất tăng dần) hốn vị chúng cho Ví dụ: Sắp xếp mảng số nguyên a gồm n phần tử theo thứ tự tăng dần int sort(int a[], int n) { int i,j; for(i = 0; i < n - 1; i++) for(j = i + 1; j < n; j++) { if(a[i] > a[j]) /*Hàm swap() hoán vị a[i] a[j] cho nhau*/ swap(&a[i],&a[j]); 10 } 11 } 4.1.2 Mảng hai chiều 4.1.2.1 Khai báo khởi tạo mảng Nếu mảng chiều có số, với mảng nhiều chiều có nhiều số Mảng hai chiều có hai số, mảng ba chiều có ba số,… Mảng nhiều chiều tập hợp phần tử có kiểu, phần tử mảng lại mảng khác Ta hiểu, giống khái niệm vector toán học Mảng nhiều chiều thường dùng để biểu diễn đối tượng đa chiều Chẳng hạn như, sử dụng mảng hai chiều để biểu diễn bàn cờ, bảng liệu, đồ thị, Cú pháp tổng quát để khai báo mảng nhiều chiều sau: [N1][N2]…[Nn] ; Trong đó, N1, N2,…, Nn tương ứng với số lượng phần tử chiều Tổng số lượng phần tử chứa mảng nhiều chiều (hay gọi kích thước mảng) N1*N2*…*Nn Dạng đơn giản thông dụng mảng nhiều chiều mảng hai chiều Một mảng hai chiều mảng chứa mảng chiều Để cho dễ hiểu người ta thường biểu diễn mảng hai chiều dạng ma trận gồm dòng cột Tuy nhiên, mặt vật lý phần tử mảng hai chiều lưu khối nhớ liên tục 126 Ví dụ 1: Khai báo mảng có kích thước 3x4 gồm phần tử có kiểu số nguyên int a[3,4]; /* Khai báo không hợp lệ */ int a[3][4]; /* Khai báo hợp lệ */ Mảng số nguyên a chứa 3x4 = 12 phần tử Mỗi phần tử có kiểu số nguyên chiếm bytes nhớ Vậy, tổng kích thước nhớ dùng để lưu trữ mảng hai chiều a 12*sizeof(int) = 12*2 = 24 bytes Ví dụ 2: Sử dụng mảng hai chiều để lưu bàn cờ carô, chứa kí tự ‘x’, ‘o’, ‘ ‘ const int ROW = 22; const int COL = 26; char checkerboard[ROW][COL]; Cũng mảng chiều, trước sử dụng mảng hai chiều ta cần phải khởi tạo giá trị cho thời điểm dịch thời điểm thực thi chương trình Ta khởi tạo cho mảng hai chiều khai báo theo nhiều cách khác Cách 1: Sử dụng cú pháp giống mảng chiều Ví dụ: int a[3][4] = {2,1,3,-1,-2,0,5,3,6,7,0,8}; Các phần tử mảng lưu vị trí liên tiếp nhớ Nên mặt vật lý, mảng a lưu trữ sau: Hiểu đơn giản mảng a có dạng: Với cách khởi tạo trên, cần phải lưu ý đến thứ tự giá trị khởi tạo gán cho phần tử mảng 127 Cách 2: Khởi tạo theo dòng, phần tử dòng nằm cặp dấu {} Lúc ta xem mảng hai chiều mảng gồm nhiều phần tử, phần tử dòng, dòng mảng chiều Cú pháp khởi tạo sau: [N1][N2] = { { giá_tri_1, giá_trị_2,…}, { giá_tri_1, giá_trị_2,…}, { giá_tri_1, giá_trị_2,…}, …}; Ví dụ 1: int a[3][4] = {{2,1,3,-1},{-2,0,5,3},{6,7,0,8}}; Mảng a cách khởi tạo tương đương với cách khởi tạo rõ ràng hơn, gây nhầm lẫn Ví dụ 2: Khởi tạo giá trị cho vài phần tử đầu mảng, phần tử lại tự động nhận giá trị int a[3][4] = {{2,1},{-2,0,5},{6,7,0,8}}; Ví dụ 3: Khởi tạo giá trị cho tất phần tử mảng int a[3][4] = {0}; Ta bỏ qua phần khai báo số lượng phần tử chiều thứ nhất, chiều lại bắt buộc phải khai báo rõ ràng Ví dụ 4: int b[3][] = {{2,1,3,-1},{-2,0,5,3},{6,7,0,8}}; /*lỗi*/ int b[][4] = {{2,1,3,-1}, {-2,0,5,3}, {6,7,0,8}}; /*hợp lệ*/ 4.1.2.2 Truy xuất liệu mảng Mỗi phần tử mảng hai chiều truy xuất thông qua hai số số dòng số cột Trong đó, số dòng có giá trị từ đến N1 - số cột có giá trị từ đến N2 – 1; với N1, N2 số dòng số cột mảng Mỗi phần tử có dạng là: tên_mảng[chỉ_số_dòng][chỉ_số_cột] 128 Ví dụ: Các phần tử hợp lệ mảng là: a[0][0], a[0][1],…, a[1][0], a[1][1],…, a[2][3] Còn phần tử khơng hợp lệ: a[-1][0], a[2][4], a[3][3], 4.1.2.3 Mảng hai chiều làm tham số cho hàm Tương tự mảng chiều, mảng hai chiều dùng làm tham số cho hàm Khi khai báo tham số mảng hai chiều, cần phải rõ số phần tử chiều, nhiên số phần tử chiều vắng Ví dụ: int sum_val(int a[][100], int nRow, int nCol); Bên cạnh việc truyền biến mảng, người ta dùng thêm hai tham số bổ sung tương ứng với số phần tử hai chiều để nhận vào kích thước mảng thực (đối số) thời điểm gọi hàm Hai tham số tùy chọn, khơng cần thiết khơng dùng tới chúng Ví dụ sau minh họa cho việc truyền mảng hai chiều vào hàm #include #include #define NROW /*NROW – số dòng */ #define NCOL /*NCOL – số cột */ int sum_val(int a[][NCOL]); int main(){ int arr2D[NROW][NCOL] = {{6,3,-1},{0,2,0}}; int sum = sum_val(arr2D); printf(“Tong cac phan tu la: %d \n“, sum); 10 getch(); 11 return 0; 12 } 13 int sum_val(int a[][NCOL]) 14 { 15 int s = 0, i, j; 16 for(i = 0; i < NROW; i++) 17 for(j = 0; j < NCOL; j++) 18 s += a[i][j]; 19 return s; 20 }  Kết chương trình: Tong cac phan tu la: 10 129 Cơ chế truyền mảng hai chiều cho hàm truyền địa Nghĩa là, giá trị thực truyền vào địa phần tử mảng, tên mảng chứa địa sở (arr2D == &arr2D[0][0]) Dựa địa đó, ta tính địa tất phần tử lại theo công thức: địa sở + (i*NCOL + j)*sizeof(kiểu_dữ_liệu) Trong đó, i j tương ứng với số dòng số cột, kiểu_dữ_liệu kiểu phần tử mảng Nếu trường hợp nhu cầu thay đổi giá trị phần tử mảng bên hàm, thêm từ khóa const khai báo tham số Ví dụ: int sum_val(const int a[][NCOL]); 4.1.2.4 Một số toán mảng hai chiều a Nhập liệu cho mảng - Yêu cầu toán: Nhập vào mảng a có kích thước mxn (1 MAX_ROW, ≤ n ≤ MAX_COL) ≤ m ≤ - Ý tưởng: trường hợp yêu cầu nhập vào mảng a mà số lượng phần tử thực chưa biết trước Khi đó, ta thực bước sau: o Bước 1: Khai báo mảng với số dòng MAX_ROW, số cột MAX_COL o Bước 2: Nhập vào số phần tử thực m, n chiều o Bước 3: Dùng hai lệnh for để nhập phần tử mảng Ví dụ: Nhập vào mảng số nguyên a gồm n phần tử (1 ≤ m ≤ 50, ≤ n ≤ 100) 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 130 #include #include #define MAX_ROW 50 #define MAX_COL 100 void input(int a[][MAX_COL],int m, int n); int main() { int arr2D[MAX_ROW][MAX_COL]; int m,n; printf("Nhap kich thuoc cua mang mxn: "); scanf("%d%d",&m, &n); input(arr2D,m,n); getch(); return 0; } void input(int a[][MAX_COL],int m, int n) { int i,j; printf("Nhap cac phan tu cua mang: "); for(i = 0; i < m; i++) for(j = 0; j < n; j++) { printf("a[%d][%d]= ",i,j); scanf("%d",&a[i][j]); } } Kết chương trình: Nhap so phan tu cua mang: a[0][0] = a[0][1] = a[0][2] = -1 a[1][0] = a[1][1] = a[1][2] = b Xuất liệu cho mảng - u cầu tốn: Cho mảng a có kích thước mxn Hiển thị giá trị phần tử mảng hình - Ý tưởng: Hiển thị phần tử mảng từ dòng đến dòng m – 1, dòng hiển thị giá trị cột thứ đến cột n – Ví dụ: Xuất mảng số nguyên a gồm n phần tử void display(int a[][MAX_COL],int m, int n) { int i,j; printf("Cac phan tu cua mang la:\n"); for(i = 0; i < m; i++) { for(j = 0; j < n; j++) printf("%d\t",a[i][j]); printf("\n"); 10 } 11 } c Tính tổng phần tử - Yêu cầu toán: Cho mảng a có kích thước mxn Tính tổng phần tử dòng cột đó, đường chéo chính, đường chéo phụ, … - Ý tưởng: Duyệt mảng thực cộng dồn phần tử nằm dòng cột u cầu Ví dụ: Tính tổng phần tử nằm cột mảng số ngun a có kích thước mxn int sum(int a[][MAX_COL],int m, int col) { int i, s = 0; for(i = 0; i < m; i++) /*duyệt dòng*/ { s += a[i][col]; } return s; } 131 4.2 Con trỏ 4.2.1 Khái niệm Con trỏ tính mạnh hữu ích ngơn ngữ lập trình C Nó cho phép lập trình viên viết đoạn mã để quản lý tương tác trực tiếp tới nhớ Tuy nhiên, vấn đề liên quan đến trỏ người dùng không nắm kĩ gây nhiều lỗi tiềm ẩn chương trình Như giới thiệu, biến đại lượng gồm có tên giá trị kèm với Giá trị biến lưu trữ nhớ nhớ Mỗi nhớ có kích thước khác ln gắn liền với địa Ta hình dung, nhớ máy tính giống dãy nhà, ngơi nhà tương ứng với nhớ Khi đó, biến xem người chủ sống nhà tên biến giống tên chủ nhà Khi ta viết dòng khai báo biến: int lena = 145; trình biên dịch thực dành riêng nhớ trống với kích thước bytes để lưu giá trị biến lena liên kết địa nhớ với tên biến Sau đó, lưu trữ giá trị 145 vào địa Khi biến khai báo xong, có hai thành phần liên quan địa biến giá trị biến Trong chương trình, giá trị biến truy xuất thơng qua tên biến Tuy nhiên, có trường hợp cần phải biết địa ô nhớ liên kết với biến để thao tác trực tiếp với nhớ mà khơng cần thơng qua biến Ví dụ sau minh họa trường hợp tạo biến khác để lưu trữ địa biến lena Hình 4.1 – Ví dụ minh họa tạo biến để lưu địa Khi đó, người ta gọi biến tom trỏ trỏ đến biến lena Như vậy, trỏ đơn giản biến lưu trữ địa biến khác Nghĩa là, giá trị trỏ địa nhớ nhớ Nó cung cấp phương thức gián tiếp để truy nhập đến ô nhớ Con trỏ thường sử dụng trường hợp: - Được sử dụng bên hàm để truy xuất đến giá trị biến nằm bên hàm - Truyền mảng chuỗi từ hàm đến hàm khác - Cần cấp phát vùng nhớ động giúp quản lí sử dụng nhớ cách hiệu - Xây dựng cấu trúc liệu cây, danh sách liên kết,… 4.2.2 Khai báo sử dụng trỏ Để lưu trữ địa biến, ta cần phải khai báo biến trỏ phù hợp với Việc khai báo biến trỏ thực theo cú pháp sau: 132 *; Trong đó, kiểu_dữ_liệu kiểu biến mà trỏ muốn trỏ đến Dấu ‘*’ kí hiệu trỏ áp dụng cho biến nằm sau Mỗi biến trỏ lệnh khai báo cần có dấu ‘*’ riêng Tên_con_trỏ đặt theo qui tắc đặt tên định danh học trước Ví dụ: int *p1, *p2; float *p3, var; Ở ví dụ trên, p1 p2 trỏ, trỏ đến vùng nhớ chứa liệu kiểu int, p3 trỏ, trỏ đến vùng nhớ chứa liệu kiểu float Còn var biến thơng thường có kiểu float Trình biên dịch khơng tự động khởi tạo giá trị cho trỏ Một trỏ chưa khởi tạo trỏ đến vùng nhớ không xác định gây kết khơng lường trước sử dụng Vì thế, trước sử dụng trỏ phải rõ địa ô nhớ mà trỏ đến cách gán sau: = &; Với ‘&’ toán tử lấy địa biến đặt trước tên biến Ngoài ra, khởi tạo cho trỏ giá trị (hay NULL) Một trỏ có giá trị NULL khơng trỏ tới nhớ cả, khác với trỏ chưa khởi tạo Ví dụ: int n = 4; int *pn = &n; /* lấy địa biến n gán cho pn */ char *ui; /* trỏ ui chưa khởi tạo */ float *null_p = NULL;/* trỏ null_p có giá trị */ Lưu ý: Địa ô nhớ số nguyên không dấu, nên kiểu liệu biến trỏ kiểu số nguyên Nên kích thước trỏ Trong trường hợp muốn xuất giá trị biến trỏ, ta sử dụng định dạng %u, %lu %x Khi biến trỏ khai báo khởi tạo xong, thường sử dụng hai trường hợp: sử dụng giá trị trỏ sử dụng giá trị ô nhớ mà trỏ trỏ tới Biến trỏ sử dụng biểu thức giống biến thơng thường Ví dụ sau minh họa trường hợp sử dụng biến trỏ biểu thức gán: int int int p = i = 5, j = 4; *p = &i; *q = &j; q; /* gán giá trị q cho p */ 133 Hình 4.2 – Minh họa sử dụng biến trỏ biểu thức gán Trong trường hợp muốn truy xuất đến giá trị ô nhớ mà trỏ trỏ tới, ta sử dụng toán tử ‘*’ đặt trước biến trỏ Ví dụ: #include #include int main() { int x = 7; int *px = &x; printf("Dia chi cua x: px = %x, &x = %x \n", px, &x); printf("Gia tri ban dau cua x: "); printf("*p = %d, x = %d\n",*px, x); *px = 12; /*thay đổi giá trị x thông qua biến px*/ 10 printf("Gia tri cua x sau thay doi: "); 11 printf("*p = %d, x = %d\n",*px,x); 12 getch(); 13 return 0; 14 } Kết chương trình: Dia chi cua x: px = 18ff28, &x = 18ff28 Gia tri ban dau cua x: *p = 7, x = Gia tri cua x sau thay doi: *p = 12, x = 12 Dưới minh họa việc sử dụng biến trỏ để thay đổi giá trị vùng nhớ mà tham chiếu tới: Hình 4.3 – Minh họa việc sử dụng biến trỏ 134 Cần phải lưu ý trường hợp, trỏ có giá trị NULL ta khơng nên sử dụng tốn tử ‘*’ gây lỗi thời gian thực thi chương trình Để tránh lỗi xảy ra, người ta thường xét điều kiện trỏ khác NULL trước sử dụng 4.2.3 Các phép toán số học trỏ C cho phép số phép toán số học thực trỏ gồm +, -, ++, , +=, -= Giả sử ta khai báo biến sau: int i = 1, var = 5; int *p1, *p2; p1 = &var; /* p1 = 1002 */ Ví dụ 1: Cộng /trừ trỏ với biến thông thường p2=p1+i; /* p2 bytes p2=p1-i; /* p2 bytes = so = so 1004, p2 trỏ sang phải i*sizeof(int) với p1 */ 1000, p2 trỏ sang trái i*sizeof(int) với p1 */ Ví dụ 2: Cộng /trừ trỏ với trỏ printf("p2 – p1 = %u\n",p2 – p1); Khi đó, p2 – p1 cho khoảng cách hai trỏ kiểu Lưu ý: Theo độ ưu tiên thứ tự kết hợp phép tốn *p1++  *(p1++), p1 trỏ đến ô nhớ sau ô nhớ chứa biến var Nếu muốn tăng giá trị biến var phải viết (*p1)++ Bên cạnh phép tốn số học, thực phép so sánh hai trỏ như: ==, !=, >, >=,

Ngày đăng: 11/12/2017, 17:13

Tài liệu cùng người dùng

Tài liệu liên quan