Lập trình C Aptech - Bài 1: Những khái niệm cơ bản về ngôn ngữ C
Kết thúc bài học này, bạn có thể:
Phân biệt sự khác nhau giữa Câu lệnh, Chương trình và Phần mềm
Biết được quá trình hình thành C
Nên dùng C khi nào và tại sao
Nắm được cấu trúc một chương trình C
Hiểu rõ khái niệm giải thuật (algorithms)
Vẽ lưu đồ (flowchart)
Liệt kê các ký hiệu dùng trong lưu đồ
i cùng lúc. Vì vậy, đoạn mã tối ưu hơn cho ví dụ tìm số chẵn được viết ra như ví dụ 6. Ví dụ 6: BEGIN INPUT num r = num MOD 2 IF r = 0 DISPLAY “Even Number” ELSE DISPLAY “Odd Number” END IF END Lưu đồ cho đoạn mã giả trên thể hiện qua Hình 1.8. Yes No Hình 1.8: Số chẵn hay số lẻ Ða điều kiện sử dụng AND/OR Cấu trúc IF…ELSE làm giảm độ phức tạp, gia tăng tính hữu hiệu. Ở một mức độ nào đó, nó cũng nâng cao tính dễ đọc của mã. Các thí dụ IF chúng ta đã đề cập đến thời điểm này thì khá đơn giản. Chúng chỉ có một điều kiện trong IF để đánh giá. Thỉnh thoảng chúng ta phải kiểm tra cho hơn một điều kiện, thí dụ: Ðể xem xét nhà cung cấp có đạt MVS (nhà cung cấp quan trọng nhất) không?, một công ty sẽ kiểm tra xem nhà cung cấp đó đã có làm việc với công ty ít nhất 10 năm không? và đã có tổng doanh thu ít nhất 5,000,000 không?. Hai điều kiện thỏa mãn thì nhà cung cấp được xem như là một MVS. Do đó toán tử AND có thể được dùng trong câu lệnh ‘IF’ như trong ví dụ 7 sau: Ví dụ 7: BEGIN INPUT yearsWithUs INPUT bizDone IF yearsWithUs >= 10 AND bizDone >=5000000 DISPLAY “Classified as an MVS” ELSE DISPLAY “A little more effort required!” END IF END Ví dụ 7 cũng khá đơn giản, vì nó chỉ có 2 điều kiện. Ở tình huống thực tế, chúng ta có thể có nhiều điều kiện cần được kiểm tra. Nhưng chúng ta có thể dễ dàng dùng toán tử AND để nối những điều kiện lại giống như ta đã làm ở trên. Bây giờ, giả sử công ty trong ví dụ trên đổi quy định, họ quyết định đưa ra điều kiện dễ dàng hơn. Như là : Hoặc làm việc với công ty trên 10 năm hoặc có doanh số (giá trị thương mại,giao dịch) từ 5,000,000 trở lên. Vì vâỵ, ta thay thế toán tử AND bằng toán tử OR. Nhớ rằng toán tử OR cho ra giá trị True (đúng) nếu chỉ cần một điều kiện là True. Cấu trúc IF lồng nhau Một cách khác để thực hiện ví dụ 7 là sử dụng cấu trúc IF lồng nhau. Cấu trúc IF lồng nhau là câu lệnh IF này nằm trong trong câu lệnh IF khác. Chúng ta viết lại ví dụ 7 sử dụng cấu trúc IF lồng nhau ở ví dụ 8 như sau: Ví dụ 8: BEGIN INPUT yearsWithUs INPUT bizDone IF yearsWithUs >= 10 IF bizDone >=5000000 DISPLAY “Classified as an MVS” ELSE DISPLAY “A little more effort required!” END IF ELSE DISPLAY “A little more effort required!” END IF END Ðoạn mã trên thực hiện cùng nhiệm vụ nhưng không có ‘AND’. Tuy nhiên, chúng ta có một lệnh IF (kiểm tra xem bizDone lớn hơn hoặc bằng 5,000,000 hay không?) bên trong lệnh IF khác (kiểm tra xem yearsWithUs lớn hơn hoặc bằng 10 hay không?). Câu lệnh IF đầu tiên kiểm tra điều kiện thời gian nhà cung cấp làm việc với công ty có lớn hơn 10 năm hay không. Nếu dưới 10 năm (kết quả trả về là False), nó sẽ không công nhận nhà cung cấp là một MVS; Nếu thỏa điều kiện nó xét câu lệnh IF thứ hai, nó sẽ kiểm tra tới điều kiện bizDone lớn hơn hoặc bằng 5,000,000 hay không. Nếu thỏa điều kiện (kết quả trả về là True) lúc đó nhà cung cấp được xem là một MVS, nếu không thì một thông điệp báo rằng đó không là một MVS. Lưu đồ cho mã giả của ví dụ 8 được trình bày qua hình 1.9. No Yes No Yes Hình 1.9: Câu lệnh IF lồng nhau Mã giả trong trường hợp này của cấu trúc IF lồng nhau tại ví dụ 8 chưa hiệu quả. Câu lệnh thông báo không thỏa điều kiện MVS phải viết hai lần. Hơn nữa lập trình viên phải viết thêm mã nên trình biên dịch phải xét hai điều kiện của lệnh IF, do đó lãng phí thời gian. Ngược lại, nếu dùng toán tử AND chỉ xét tới điều kiện của câu lệnh IF một lần. Ðiều này không có nghĩa là cấu trúc IF lồng nhau nói chung là không hiệu quả. Nó tùy theo tình huống cụ thể mà ta dùng nó. Có khi dùng toán tử AND hiệu quả hơn, có khi dùng cấu trúc IF lồng nhau hiệu quả hơn. Chúng ta sẽ xét một ví dụ mà dùng cấu trúc IF lồng nhau hiệu quả hơn dùng toán tử AND. Một công ty định phần lương cơ bản cho công nhân dựa trên tiêu chuẩn như trong bảng 1.1. Grade Experience Salary E 2 2000 E 3 3000 M 2 3000 M 3 4000 Bảng 1.1: Lương cơ bản Vì vậy, nếu một công nhân được xếp loại là E và có hai năm kinh nghiệm thì lương là 2000, nếu ba năm kinh nghiệm thì lương là 3000. Mã giả dùng toán tử AND cho vấn đề trên như ví dụ 9: Ví dụ 9: BEGIN INPUT grade INPUT exp IF grade =”E” AND exp =2 salary=2000 ELSE IF grade = “E” AND exp=3 salary=3000 END IF END IF IF grade =”M” AND exp =2 salary=3000 ELSE IF grade = “M” AND exp=3 salary=4000 END IF END IF END Câu lệnh IF đầu tiên kiểm tra xếp loại và kinh nghiệm của công nhân. Nếu xếp loại là E và kinh nghiệm là 2 năm thì lương là 2000, ngoài ra nếu xếp loại E, nhưng có 3 năm kinh nghiệm thì lương là 3000. Nếu cả 2 điều kiện không thỏa thì câu lệnh IF thứ hai cũng tương tự sẽ kiểm điều kiện xếp loại và kinh nghiệm cho công nhân để phân định lương. Giả sử xếp loại của một công nhân là E và có hai năm kinh nghiệm. Lương người đó sẽ được tính theo mệnh đề IF đầu tiên. Phần còn lại của câu lệnh IF thứ nhất được bỏ qua. Tuy nhiên, điều kiện tại mệnh đề IF thứ hai sẽ được xét và tất nhiên là không thỏa, do đó nó kiểm tra mệnh đề ELSE của câu lệnh IF thứ 2 và kết quả cũng là False. Ðây quả là những bước thừa mà chương trình đã xét qua. Trong ví dụ, ta chỉ có hai câu lệnh IF bởi vì ta chỉ xét có hai loại là E và M. Nếu có khoảng 15 loại thì sẽ tốn thời gian và tài nguyên máy tính cho việc tính toán thừa mặc dù lương đã xác định tại câu lệnh IF đầu tiên. Ðây dứt khoát không phải là mã nguồn hiệu quả. Bây giờ chúng ta xét mã giả dùng cấu trúc IF lồng nhau đã được sửa đổi trong ví dụ 10. Ví dụ 10: BEGIN INPUT grade INPUT exp IF grade=”E” IF exp=2 salary = 2000 ELSE IF exp=3 salary=3000 END IF END IF ELSE IF grade=”M” IF exp=2 Salary=3000 ELSE IF exp=3 Salary=4000 END IF END IF END IF END IF END Ðoạn mã trên nhìn khó đọc. Tuy nhiên, nó đem lại hiệu suất cao hơn. Chúng ta xét cùng ví dụ như trên. Nếu công nhân được xếp loại là E và kinh nghiệm là 2 năm thì lương được tính là 2000 ngay trong bước đầu của câu lệnh IF. Sau đó, chương trình sẽ thoát ra vì không cần thực thi thêm bất cứ lệnh ELSE nào. Do đó, không có sự lãng phí và đoạn mã này mang lại hiệu suất cho chương trình và chương trình chạy nhanh hơn. Vòng lặp Một chương trình máy tính là một tập các câu lệnh sẽ được thực hiện tuần tự. Nó có thể lặp lại một số bước với số lần lặp xác định theo yêu cầu của bài toán hoặc đến khi một số điều kiện nhất định được thỏa. Chẳng hạn, ta muốn viết chương trình hiển thị tên của ta 5 lần. Ta xét mã giả dưới đây. Ví dụ 11: BEGIN DISPLAY “Scooby” DISPLAY “Scooby” DISPLAY “Scooby” DISPLAY “Scooby” DISPLAY “Scooby” END Nếu để hiển thị tên ta 1000 lần, nếu ta viết DISPLAY “Scooby” 1000 lần thì rất tốn công sức. Ta có thể tinh giản vấn đề bằng cách viết câu lệnh DISPLAY chỉ một lần, sau đó đặt nó trong cấu trúc vòng lặp, và chỉ thị máy tính thực hiện lặp 1000 lần cho câu lệnh trên. Ta xem mã giả của cấu trúc vòng lặp trong ví dụ 12 như sau: Ví dụ 12: Do loop 1000 times DISPLAY “Scooby” End loop Những câu lệnh nằm giữa Do loop và End loop (trong ví dụ trên là lệnh DISPLAY) được thực thi 1000 lần. Những câu lệnh này cùng với các lệnh do loop và end loop được gọi là cấu trúc vòng lặp. Cấu trúc vòng lặp giúp lập trình viên phát triển thành những chương trình lớn trong đó có thể yêu cầu thực thi hàng ngàn câu lệnh. Do loop…end loop là một dạng thức tổng quát của vòng lặp. Ví dụ sau là cách viết khác nhưng cũng dùng cấu trúc vòng lặp. Ví dụ 13: BEGIN cnt=0 WHILE (cnt < 1000) DO DISPLAY “Scooby” cnt=cnt+1 END DO END Lưu đồ cho mã giả trong ví dụ 13 được vẽ trong Hình 1.10. Yes No Hình 1.10: Cấu trúc vòng lặp Chú ý rằng Hình 1.10 không có ký hiệu đặc biệt nào để biểu diễn cho vòng lặp. Chúng ta dùng ký hiệu phân nhánh để kiểm tra điều kiện và quản lý hướng đi của của chương trình bằng các dòng chảy (flow_lines). Tóm tắt bài học Phần mềm là một tập hợp các chương trình. Một chương trình là một tập hợp các chỉ thị (lệnh). Những đoạn mã lệnh là cơ sở cho bất kỳ một chương trình C nào. Ngôn ngữ C có 32 từ khóa. Các bước cần thiết để giải quyết một bài toán là nghiên cứu chi tiết bài toán đó, thu thập thông tin thích hợp, xử lý thông tin và đi đến kết quả. Một giải thuật là một danh sách rút gọn và logic các bước để giải quyết vấn đề. Giải thuật được viết bằng mã giả hoặc lưu đồ. Mã giả là sự trình bày của giải thuật trong ngôn ngữ tương tự như mã thật Một lưu đồ là sự trình bày dưới dạng biểu đồ của một giải thuật. Lưu đồ có thể chia nhỏ thành nhiều phần và đầu nối dùng cho việc nối chúng lại tại nơi chúng bị chia cắt. Một chương trình có thể gặp một điều kiện dựa theo đó việc thực thi có thể được phân theo các nhánh rẽ khác nhau. Cấu trúc lệnh như vậy gọi là cấu trúc chọn lựa, điều kiện hay cấu trúc rẽ nhánh. Cấu trúc chọn cơ bản là cấu trúc “IF”. Cấu trúc IF …ELSE giúp lập trình viên chỉ làm so sánh đơn và sau đó thực thi các bước tùy theo kết quả của phép so sánh là True (đúng) hay False (sai). Cấu trúc IF lồng nhau là câu lệnh IF này nằm trong câu lệnh IF khác. Thông thường ta cần lặp lại một số bước với số lần lặp xác định theo yêu cầu của bài toán hoặc đến khi một số điều kiện nhất định được thỏa. Những cấu trúc giúp làm việc này gọi là cấu trúc vòng lặp. Kiểm tra tiến độ học tập C cho phép ____________ của mã và dữ liệu. Một là một sự trình bày dạng biểu đồ minh họa tính tuần tự của những hoạt động được thực thi nhằm đạt được một lời giải. Lưu đồ giúp chúng ta xem xét lại và gỡ rối chương trình một cách dễ dàng. (True / False) Một lưu đồ có thể có tuỳ ý số điểm bắt đầu và số điểm kết thúc. (True / False) Một ____ cơ bản là việc thực thi tuần tự những câu lệnh đến khi một điều kiện cụ thể nào đó là đúng (True) hay sai (False). Bài tập tự làm Viết một đoạn mã giả và vẽ một lưu đồ để nhập một giá trị là độ 0C (Celsius) và chuyển nó sang độ 0F (Fahrenheit). [Hướng dẫn: C/5 = (F-32)/9] Viết một đoạn mã giả và vẽ một lưu đồ để nhập điểm của một sinh viên cho các môn : Vật lý, Hóa học, và Sinh học. Sau đó hiển thị điểm trung bình và tổng của những điểm này.
File đính kèm:
- Lập trình C Aptech - Bài 1 Những khái niệm cơ bản về ngôn ngữ C.doc