You are on page 1of 34

Kỹ thuật lập trình

Bài 1: Các vấn đề cơ bản

TS. Nguyễn Hiếu Cường


Bộ môn CNPM, Khoa CNTT, Trường ĐH GTVT
Email: cuonggt@gmail.com

Hà Nội, 2022
Giới thiệu môn học

 Tên học phần: “Kỹ thuật lập trình”


 Từ khóa 61 trở về trước gọi là “Lập trình nâng cao”

 Môn học tiên quyết: “Tin học đại cương”

 Hình thức học


 Học lý thuyết và làm bài tập trên lớp
 Thực hành có hướng dẫn trên phòng máy
 Làm bài tập và tự thực hành ở nhà

 Hình thức đánh giá


 Đánh giá quá trình 40%
 Thi kết thúc học phần 60%

2
Học liệu

 Tài liệu tham khảo chính


Phạm Văn Ất, Nguyễn Hiếu Cường, ... , “Lập trình nâng cao”,
NXB GTVT 2015.

 Môi trường lập trình:


 Desktop: DevC++
 Web: cpp.sh, ideone.com
 Mobile: CppDroid (for Android), CppCode (for iOS)

Tham khảo thêm và tra cứu thư viện C/C++:


 www.cprogramming.com
 www.cppreference.com

3
Nội dung chính của môn học

1. Các khái niệm cơ bản trong ngôn ngữ C

2. Hàm và tổ chức chương trình

3. Hàm và mảng

4. Đệ quy

5. Xử lý chuỗi ký tự

6. Thao tác trên các tệp tin

7. Tệp lưu cấu trúc

8. Cấp phát bộ nhớ

9. Danh sách liên kết


4
Giới thiệu ngôn ngữ C

 Dennis Ritchie, Ken Thompson (Bell Lab)


 Bắt đầu phát triển 1969 – 1973

 Xây dựng hệ điều hành UNIX

 Được sử dụng rộng rãi

 Đã được chuẩn hóa

 Liên tục phát triển (ANSI C, ..., C17)

 Là cơ sở cho nhiều ngôn ngữ lập trình


 C++, C#, Java, Objective-C...

5
Sử dụng ngôn ngữ C trong thực tế

Source: IEEE Spectrum Ranking, 2019

6
Ngôn ngữ lập trình

 Công cụ để xây dựng chương trình trên máy tính


 Ngôn ngữ bậc thấp và bậc cao
 Có nhiều loại ngôn ngữ (phụ thuộc mục đích sử dụng)

Chương trình bằng Chương trình bằng


Chương trình mã máy để máy
một ngôn ngữ
biên dịch tính hiểu và thực
(Pascal, C, ...)
hiện

Môi trường phát triển tích hợp (IDE):


Turbo C, Visual C, Dev C …

7
Viết chương trình

Cấu trúc dữ liệu + Thuật toán = Chương trình

8
Các thành phần cơ bản của C

 Tập ký tự
 Chữ cái, chữ số, các dấu toán học, các ký tự đặc biệt...
 Không có: các chữ cái Hy Lạp (∆, ∑ ...)

 Từ khóa
 if, for, switch, int, char, float...
 Không được dùng từ khóa để đặt tên

 Tên
 Tên hằng/ biến/ mảng...
 Phân biệt chữ hoa chữ thường (case sensitive)
 Cách đặt tên trong chương trình: có tính gợi nhớ

9
Ví dụ

#include <stdio.h>

#include <math.h>
%f float
int main()
%d int
{

float r,cv,dt;

printf("\nBan kinh r= ");

scanf("%f",&r);

cv = 2*M_PI*r; dt = M_PI*r*r;

printf("\nChu vi= %10.2f\nDien tich= %10.2f", cv,dt);

10
Biến

 Vùng bộ nhớ lưu giá trị trong thời gian chương trình thực hiện
 Có bao nhiêu kiểu dữ liệu thì có bấy nhiêu kiểu biến

 Biến cần khai báo trước khi sử dụng


 Cần khai báo ngay sau dấu {

 Có thể khởi gán giá trị cho biến ngay khi khai báo
int a, b = 20, c, d = 40;
float e = 35.1, x;
x = 23.0;
 Biến chỉ có tác dụng trong phạm vi đã khai báo

11
Mảng

 Mảng là tập các phần tử có cùng kiểu và có chung một tên

 Mảng cũng cần phải khai báo trước khi dùng


 Chỉ số mảng được tự động đánh số từ 0. Ví dụ:

int a[10], b[4][2];


thì các phần tử của mảng là:

a[0] a[1] a[2] a[3] a[4]


b[0][0] b[0][1]
b[1][0] b[1][1]
b[2][0] b[2][1]
b[3][0] b[3][1]

12
Biến cục bộ và biến toàn cục

 Biến cục bộ (local variables)


 Các biến và mảng khai báo trong khối { ... }

 Được cấp bộ nhớ và tồn tại chỉ trong thời gian hoạt động của khối

 Biến toàn cục (global variables)


 Khai báo trước tất cả các hàm, còn gọi là biến ngoài

 Tồn tại trong thời gian hoạt động của chương trình

 Biến toàn cục vs. Biến khai báo ở đầu hàm main()?
 Thời gian tồn tại giống nhau

 Phạm vi ảnh hưởng khác nhau

13
Các phép toán (toán tử)

14
Toán tử ++

15
Toán tử sizeof

16
Các câu lệnh điều khiển

 Lập trình cấu trúc


 Phân rã chương trình theo chức năng
 Sử dụng các lệnh (hoặc cấu trúc/ toán tử) điều khiển

 Các cấu trúc lựa chọn


 if
 switch

 Các cấu trúc lặp


 for
 while
 do while

 Các câu lệnh break, continue

17
Lựa chọn if

18
Lựa chọn if… else if

19
Lựa chọn if… else if

20
Lựa chọn switch

21
Ví dụ

Gi¶ sö ®Ótheo dâi tr×nh ®é cña c¸ n bé ta dï ng b¶ng m· sau:

M· Tr×nh ®é
1 S¬ cÊp
2 Trung cÊp
3 § ¹ i häc
4 Cao häc
5 Phã TiÕn sÜ
6 TiÕn sü
Ch­ ¬ng tr×nh ®Ótõ m· suy ra tr×nh ®é häc vÊn

22
Ví dụ

int ma; case 4:


printf("\n ma = "); printf(“Cao hoc \n");
scanf("%d",&ma); break;
switch(ma){ case 5:
case 1: printf(“Pho Tien si \n");
printf("So cap \n"); break;
break; case 6:
case 2: printf(“Tien si \n");
printf("Trung cap \n"); break;
break; default:
case 3: printf(“Ma sai\n");
printf(“Dai hoc \n"); }
break;

23
Câu lệnh for

 Cú pháp:
for (biÓu thøc 1; biÓu thøc 2; biÓu thøc 3)
Khèi lÖnh;

 Hoạt động:
1. X¸c ®Þnh biÓu thøc 1
2. X¸c ®Þnh biÓu thøc 2
3. Tïy thuéc vµo tÝnh ®óng, sai cña biÓu thøc 2, chän mét trong hai nh¸nh:
 NÕu biÓu thøc 2 cã gi¸ trÞ 0 (sai)  ra khái for vµ chuyÓn tíi c©u lÖnh sau th©n for
 NÕu biÓu thøc 2 cã gi¸ trÞ kh¸c 0 (®óng)  thùc hiÖn c¸c c©u lÖnh trong th©n for
4. TÝnh biÓu thøc 3, sau ®ã quay trë l¹i bư­íc 2 ®Ó b¾t ®Çu mét vßng lặp míi

April 9, 2024 | 24
Ví dụ (đảo dãy)

#include<stdio.h>
#include<string.h>
int main()
{
char s1[20], s2[20];
int n, i, j;
printf("Nhap day: ");
gets(s1);
n= strlen(s1);
for(i=0, j=n-1; i<=n-1, j>=0; i++, j--)
s2[i]= s1[j];
s2[n]='\0';
printf("\n%s", s2);
}

25
Câu lệnh while

 Cú pháp:
while (biÓu thøc)
Khèi lÖnh

 Hoạt động:
 X¸c ®Þnh gi¸ trÞ cña biÓu thøc (viÕt sau while)
 Tïy thuéc vµo tÝnh ®óng sai cña biÓu thøc nµy, m¸y sÏ lùa chän mét trong hai nh¸nh:
NÕu biÓu thøc cã gi¸ trÞ 0 (sai)  ra khái chu tr×nh vµ chuyÓn tíi c©u lÖnh sau th©n
while
NÕu biÓu thøc cã gi¸ trÞ kh¸c 0 (®óng)  thùc hiÖn c¸c lÖnh trong th©n while

26
Câu lệnh do while

 Cú pháp:
do
Khèi lÖnh
while (biÓu thøc);
 Hoạt động:
 Thùc hiÖn c¸c c©u lÖnh trong th©n do ... while
 Khi gÆp dÊu ngoÆc cuèi cïng cña th©n do ... while, m¸y sÏ x¸c ®Þnh gi¸ trÞ cña
biÓu thøc sau tõ khãa while
 M¸y sÏ ph©n nh¸nh theo gi¸ trÞ cña biÓu thøc võa nhËn ®ư­îc:
NÕu biÓu thøc cã gi¸ trÞ ®óng (kh¸c 0)  trë l¹i bư­íc 1 ®Ó tiÕp tôc vßng míi
NÕu biÓu thøc cã gi¸ trÞ sai (b»ng 0)  ra khái chu tr×nh vµ chuyÓn tíi c©u lÖnh ®øng sau
dÊu chÊm ph¶y ®Æt cuèi to¸n tö do while

27
Ví dụ

 Nhập hai số nguyên. Tính ước số chung lớn nhất của hai số đó.
// Thuật toán Euclid
while (a != b)
if(a > b)
a -= b;
else
b -= a;
printf(“UCLN = %d”, a);

 Làm bài trên, nhưng dùng do … while?

28
Ví dụ

 Nhập hai số nguyên. Tính ước số chung lớn nhất của hai số đó.
// Thuật toán Euclid
do
{
if(a > b)
a -= b;
if(b > a)
b -= a;
}
while (a != b);
printf(“UCLN = %d”, a);

29
Ví dụ (break)

 Nhập một số nguyên. Xác định xem số đó có phải số nguyên tố?

printf(“Nhap mot so nguyen: “);


scanf(“%d”, &n);
for(i = 2; i*i <= n; ++i)
if(n%i == 0)
break;
if(i*i <= n)
printf(“Khong la so nguyen to”);
else
printf(“La so nguyen to”);

30
Ví dụ (continue)

 Xác định kết quả của chương trình sau:

int main()
{
int i;
for(i= 1; i<100; i+=2)
{
if((i==5) || (i==7) || (i==93))
continue;
printf(“%5d”, i);
}
}

31
Tóm tắt

 Giới thiệu môn học

 Giới thiệu ngôn ngữ lập trình C

 Các khái niệm cơ bản trong C


 Kiểu dữ liệu, hằng, biến, mảng

 Khai báo biến / mảng và phạm vi của chúng

 Các câu lệnh điều khiển

 Lựa chọn: if, switch

 Lặp: for, while, do ... while

 break, continue, goto

32
Bài tập

1. Nhập n. Tính S = 1! + 2! + 3! + ... + n!

2. Nhập n. Tính S = 1! - 2! + 3! - ... + (-1)n-1n!

3. Nhập số nguyên n và số thực x. Tính:

s = x – x3/3! + x5/5! + ... + (-1)nx2n+1/(2n+1)!

4. Vừa gà vừa chó bó lại cho tròn, 36 con, 100 chân chẵn. Xác định số con mỗi loại.
5. Trăm trâu ăn trăm bó cỏ, con đứng ăn 5, con nằm ăn 3, lụ khụ trâu già 3 con 1 bó.
Xác định số trâu mỗi loại. [B3_tramtrau.c]

33
Bài tập

6. Nhập số nguyên có 3 chữ số. Tính tổng các chữ số của số đó.

7. Nhập số nguyên bất kỳ. Tính tổng các chữ số của số đó.
[B1_tong_chu_so.c]

8. Nhập số nguyên N có 3 chữ số. Xác định N có phải là số Armstrong?


[B3_Armstrong.c]

9. Tìm tất cả các số Armstrong có 3 chữ số. [B3_Armstrong_all.c]

34

You might also like