Giáo trình Tin học cơ sở - Phần lập trình trên ngôn ngữ C - Vũ Bá Duy

I. Mở ĐầU.4

I.1. Bảng chữcái, tên và từkhoá .4

I.2.Các bước lập trình giải bài toán .5

II. BIếN, HằNG VÀ CÁC KIểU DữLIệU TRONG C .8

II.1.Biến .8

II.2. Hằng.10

II.3. Các kiểu dữliệu chuẩn đơn giản trong C.11

II.4. Biểu thức và các phép toán.13

III. CHƯƠNG TRÌNH C .26

III.1.Cấu trúc chương trình.27

III.2.Câu lệnh và dòng chú thích.31

III.3.Nhập và xuất dữliệu.33

IV - CÁC CấU TRÚC ĐIềU KHIểN CHƯƠNG TRÌNH .41

IV. Cấu trúc tuần tự. 41

IV.2.Cấu trúc rẽnhánh.42

IV.3.Cấu trúc switch. 46

IV.4.Cấu trúc while. 48

IV.5.Cấu trúc do . while. 53

IV.6.Cấu trúc for. 57

IV.7.Câu lệnh continue và break. 63

V - MảNG VÀ CON TRỏ.65

V.1. Khái niệm Mảng .65

V.2. Mảng 1 chiều.65

V.3 - Mảng 2 chiều.74

V.4 - Con trỏvà mảng .79

VI – CÁC VấN ĐềCƠBảN VềHÀM .88

VI.1 - Nguyên mẫu (prototype) hàm.88

VI.2 - Định nghĩa hàm.89

VI.3 - Lời gọi hàm và truyền tham số.90

TÀI LIệU THAM KHảO .95

pdf95 trang | Chuyên mục: Tin Học Đại Cương | Chia sẻ: dkS00TYs | Lượt xem: 1735 | Lượt tải: 4download
Tóm tắt nội dung Giáo trình Tin học cơ sở - Phần lập trình trên ngôn ngữ C - Vũ Bá Duy, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
in để ‘nhận diện’ 
- tên hàm 
- dữ liệu vào 
- kiểu quả trả về (kiểu hàm) 
Nói chung để xây dựng một hàm thường có hai phần đó là khai báo nguyên mẫu hàm và 
định nghĩa hàm. Vị trí của hai phần này bạn đọc xem lại phần cấu trúc chương trình. 
VI.1 - Nguyên mẫu (prototype) hàm 
 Nguyên mẫu hàm là dòng khai báo cho chương trình dịch biết các thông tin về hàm bao 
gồm: tên hàm, kiểu hàm và kiểu các tham số (đầu vào) của hàm. 
Cú pháp khai báo nguyên mẫu hàm 
 ([Các_khai_báo_kiểu_tham_số]); 
Trong đó 
à tên_hàm: là một tên hợp lệ theo quy tắc về tên của ngôn ngữ C. mỗi hàm có tên duy 
nhất và không được trùng với các từ khóa. Tên hàm sẽ được dùng để gọi hàm. 
à kiểu_hàm : Hàm có thể trả về một giá trị cho nơi gọi, giá trị đó thuộc một kiểu dữ 
liệu nào đó, kiểu đó được gọi là kiểu hàm. Kiểu hàm có thể là kiểu chuẩn cũng có 
thể là kiểu do người dùng định nghĩa. Nếu hàm không trả về giá trị thì kiểu hàm là 
void. 
à Các_khai_báo_kiểu_tham_số: Hàm có thể nhận dữ liệu vào thông qua các tham số 
của nó (tham số hình thức), các tham số này cũng thuộc kiểu dữ liệu xác định. Có thể 
Gi¸o tr×nh tin häc c¬ së II - Ngôn ngữ C 
 89
có nhiều tham số, các tham số cách nhau bởi dấu phẩy (,). Trong nguyên mẫu không 
bắt buộc phải có tên tham số nhưng kiểu của nó thì bắt buộc. Nếu hàm không có 
tham số chúng ta có thể để trống phần này hoặc có thể khai báo là void. 
Ví dụ: 
à int max(int a, int b); // khai báo nguyên mẫu hàm max, có hai tham số kiểu int, kết quả 
 trả về kiểu int 
à float f(float, int); // nguyên mẫu hàm f, có hai tham, tham số thứ nhất kiểu float, tham số 
 thứ 2 kiểu int, kết quả trả về kiểu float 
à void nhapmang(int a[], int ); // hàm nhapmang, kiểu void (không có giá trị trả về), tham 
 số thứ nhất là một mảng nguyên, tham số thứ 2 là một số nguyên 
à void g(); // hàm g không đối, không kiểu. 
VI.2 - Định nghĩa hàm 
Cú pháp: 
 ([khai_báo_tham_số]) 
 { 
 } 
 Dòng thứ nhất là tiêu đề hàm (dòng tiêu đề) chứa các thông tin về hàm: tên hàm, kiểu 
của hàm (hai thành phần này giống như trong nguyên mẫu hàm) và khai báo các tham số 
(tên và kiểu) của hàm, nếu có nhiều hơn một thì các tham số cách nhau bởi dấu phẩy(,). 
 Thân hàm là các lệnh nằm trong cặp { }, đây là các lệnh thực hiện chức năng của hàm. 
Trong hàm có thể có các định nghĩa biến, hằng hoặc kiểu dữ liệu; các thành phần này trỏ 
thành các thành phần cục bộ của hàm. 
 Nếu hàm có giá trị trả về (kiểu hàm khác void) thì trong thân hàm trước khi kết thúc 
phải có câu lệnh trả về giá trị: 
 return ; 
 sau lệnh return chính là giá trị trả về của hàm, nó phải có kiểu phù hợp với 
kiểu của hàm được khai báo trong dòng tiêu đề. Trường hợp hàm void chúng ta có thể 
dùng câu lệnh return (không có giá trị) để kết thúc hàm hoặc khi thực hiện xong lệnh 
cuối cùng (gặp } cuối cùng) hàm cũng kết thúc. 
 Ví dụ 1: Hàm max trả lại giá trị lớn nhất trong 2 số nguyên a, b 
 void max (int a, int b) 
 { if(a>b) 
 return a; 
 else 
 return b; 
 } 
Gi¸o tr×nh tin häc c¬ së II - Ngôn ngữ C 
 90
Ví dụ 2: Hàm nhập một mảng có n phần tử nguyên: 
à tên hàm: nhapmang 
à giá trị trả về: không trả về 
à tham số: có hai tham số là mảng cần nhập A và số phần tử cần nhập N 
 nguyên mẫu hàm như sau: 
 void nhapmang (int [], int); 
 định nghĩa hàm như sau: 
 void nhapmang (int A[], int N) { 
 int i; 
 printf("\nNhap mang co %d phan tu \n",N); 
 for(i=0;i<N; i++) 
{ printf("a[%d]= ",i); 
 scanf("%d",&a[i]); 
 } 
 return ; 
 } 
VI.3 - Lời gọi hàm và truyền tham số 
Một hàm có thể gọi thực hiện thông qua tên hàm, với những hàm có tham số thì trong 
lời gọi phải truyền cho hàm các tham số thực sự (đối số) tương ứng với các tham số hình 
thức. 
Khi hàm được gọi và truyền tham số phù hợp thì các lệnh trong thân hàm được thực 
hiên bắt đầu từ lệnh đầu tiên sau dấu mở móc { và kết thúc khi gặp lệnh return, exit hay 
gặp dấu đóng móc } kêt thúc hàm. 
 Cú pháp: 
 ([danh sách các tham số thực sự]); 
Các tham số thực sự phải phù hợp với các tham số hình thức: 
à số tham số thực sự phải bằng số tham số hình thức. 
à Tham số thực sự được truyền cho các tham số hình thức tuần tự từ trái sang phải, 
tham số thực sự thứ nhất truyền cho tham số hình thức thứ nhất, tham số thực sự 
thứ 2 truyền cho tham số hình thức thứ 2,.. kiểu của các tham số hình thức phải phù 
hợp với kiểu của các tham số hình thức. Sự phù hợp ở đây được hiểu là kiểu trùng 
nhau hoặc kiểu của tham số thực sự có thể ép về kiểu của tham số hình thức. 
 Ví dụ: giả sử có các hàm max, nhapmang như đã định nghĩa ở trên 
 int a=4, b=6,c; 
 int D[10]; 
Gi¸o tr×nh tin häc c¬ së II - Ngôn ngữ C 
 91
 c = max(a,b); 
 nhapmang(D,5); 
Lưu ý sau này chúng ta thấy hàm có thể có đối số thay đổi và chúng có thể được 
truyền tham số với giá trị ngầm định vì vậy tham số hình thức có thể ít hơn tham số 
thực sự. 
¾ Một số ví dụ 
Ví dụ VI.1: Viết chương trình nhập một số n từ bàn phím ( n >2), in các số nguyên tố từ 2 
tới n. 
Giải: Để in các số nguyên tố trong khoảng từ 2 tới n chúng ta thực hiện như sau: với mỗi 
số k ∈ [2,n] kiểm tra xem k có là nguyên tố hay không, nếu đúng thì in k ra màn hình. 
Vậy chúng ta sẽ xây dựng hàm để kiểm tra một số có là nguyên tố hay không, 
− tên hàm: nguyento 
− đầu vào: k là một số nguyên cần kiểm tra 
− giá trị trả về: 1 nếu đúng k là số nguyên tố, ngược lại trả về 0. 
#include 
#include 
#include 
int nguyento(int k);//nguyên mẫu hàm kiểm tra k là số nguyên tố 
void main(){ 
int k, n; 
do{ 
printf("\nNhap gia tri n (n>=2) = "); 
scanf("%d",&n); 
 } while(n<2); 
printf("\nCac so nguyen to tu 2 toi %d la \n",n); 
for(k=2; k<=n; k++) 
 if (nguyento(k)) printf("%d, ",k); 
} 
//-----định nghĩa hàm nguyento ------------ 
int nguyento(int k){ 
int i=2; 
 while((i<=sqrt(k))&&(k%i)) i++; 
 if(i>sqrt(k)) 
return 1; 
Gi¸o tr×nh tin häc c¬ së II - Ngôn ngữ C 
 92
else 
return 0; 
} 
( ví dụ VI.1 - in các số nguyên tố từ 2 tới n) 
Ví dụ VI.2 - Viết chương trình nhập 2 mảng A, B có n phần tử nguyên từ bàn phím, tính 
mảng tổng C = A+B, in 3 mảng A, B, C ra màn hình. 
Yêu cầu: 
- n <20; 
- chương trình gồm 3 hàm: hàm nhập mảng, hàm in mảng, hàm tổng hai mảng. 
Giải: Chúng ta cần xây dựng 3 hàm như sau 
1. Hàm nhập mảng 
− Tên hàm: nhapmang 
− Giá trị trả về: không trả về (void) 
− Tham số: mảng cần nhập ( int A[]) và số phần tử kiểu int 
− nguyên mẫu: void nhapmang( int A[], int n); 
2. Hàm in mảng 
− Tên hàm: inmang 
− Giá trị trả về: không trả về (void) 
− Tham số: mảng cần in ( int A[]) và số phần tử của mảng kiểu int 
− nguyên mẫu: void inmang( int A[], int n); 
3. Hàm tính tổng hai mảng 
− Tên hàm: tong 
− Giá trị trả về: không trả về (void) 
− Tham số: hai mang A, B, mảng kết quả C và số phần tử kiểu int 
− nguyên mẫu: void tong ( int A[], int B[], int C[], int n); 
Các bạn có chương trình minh họa như sau 
Gi¸o tr×nh tin häc c¬ së II - Ngôn ngữ C 
 93
#include 
#include 
void nhapmang(int a[], int n); 
void inmang(int a[], int n); 
void tong(int A[],int B[],int C[],int n); 
void main(){ 
clrscr(); 
const int max = 20; // 
int A[max], B[max],C[max]; 
int n; 
do{ 
printf("\nNhap so phan tu mang = "); 
scanf("%d",&n); 
} while(nmax); 
printf("\nNhap A \n"); 
nhapmang(A,n); 
printf("\nNhap B \n"); 
nhapmang(B,n); 
tong(A,B,C,n); 
printf("\nmang A: "); 
inmang(A,n); 
printf("\nmang B: "); 
inmang(B,n); 
printf("\nmang C: "); 
inmang(C,n); 
getch(); 
} 
void nhapmang(int a[], int n){ 
int i; 
printf("\nNhap mang co %d phan tu \n",n); 
for(i=0; i<n; i++) 
{ 
printf("pt thu [%d]= ",i); 
scanf("%d",&a[i]); 
} 
} 
void inmang(int a[], int n){ 
int i; 
for(i=0; i<n; i++) 
printf("%d ",a[i]); 
} 
void tong(int A[],int B[],int C[],int n){ 
 int i; 
 for (i = 0; i<n; i++) C[i]=A[i]+B[i]; 
 } 
Gi¸o tr×nh tin häc c¬ së II - Ngôn ngữ C 
 94
Hàm và truyền tham số 
Với C việc tryền tham số cho hàm được thực hiện qua cơ chế truyền tham trị. Tức là 
trong hàm chúng ta sử dụng tham số hình thức như là một bản sao dữ liệu của tham số 
được truyền cho hàm, do vậy chúng không làm thay đổi giá trị của tham số truyền vào. 
Hay nói khác đi, các tham số hình thức là các biến cụ bộ trong hàm, sự thay đổi của nó 
trong hàm không ảnh hưởng tới các biến bên ngoài. 
Vậy trong trường hợp thực sự cần thay đổi giá trị của tham số thì thế nào? chẳng hạn 
bạn cần hàm để hoán đổi giá trị của a và b. 
Nếu bạn viêt hàm 
void doicho(int x, int y) { 
int tg; 
tg = x; 
x=y; 
y=tg; 
} 
hàm này đúng cú pháp nhưng với các lệnh sau: 
int a = 4; 
int b = 6; 
printf ("\ntruoc khi goi ham doi cho a=%d, b=%d",a,b); 
doicho(a,b); 
printf ("\nsau khi goi ham doi cho a=%d, b=%d",a,b); 
kết quả in ra là 
truoc khi goi ham doi cho a=4,b=6 
sau khi goi ham doi cho a=4,b=6 
Rõ ràng hàm đổi chỗ (doicho) thực hiện không đúng, nguyên nhân là với hàm doicho 
x, y là hai biên cục bộ, khi gọi hàm doicho(a,b) chương trình dịch cấp phát vùng nhớ cho 
hai biến (tham số hình thức) x, y và sao chép giá trị của a vào x, b vào y, mọi thao tác 
trong hàm doicho đều thực hiên trên x, y mà không ảnh hưởng tới a và b, kết quả là a, b 
không đổi. 
Để khắc phục điều này chúng ta định nghĩa hàm với tham số là con trỏ và khi gọi các 
bạn hãy truyền cho nó địa chỉ của tham số thực sự, ví dụ: 
Gi¸o tr×nh tin häc c¬ së II - Ngôn ngữ C 
 95
void doicho2(int * x, int *y) { 
int tg; 
tg = *x; 
*x = *y; 
*y = tg; 
} 
Lúc này với các lệnh sau: 
int a = 4; 
int b = 6; 
printf ("\ntruoc khi goi ham doi cho a=%d, b=%d",a,b); 
doicho(&a,&b); 
printf ("\nsau khi goi ham doi cho a=%d, b=%d",a,b); 
kết quả in ra là 
truoc khi goi ham doi cho a = 4,b = 6 
sau khi goi ham doi cho a = 6 , b = 4 
-------------------------------- 
Tài liệu tham khảo 
1. Đỗ Phúc, Tạ Minh Châu - Kỹ thuật lập trình Turbo C 
2. Phạm Văn Ất - Kỹ thuật lập trình Turbo C - Cơ sở và nâng cao 
3. Scott Robert Ladd - C++ Kỹ thuật và ứng dụng, Nguyễn Hùng dịch 

File đính kèm:

  • pdfGiáo trình Tin học cơ sở - Phần lập trình trên ngôn ngữ C - Vũ Bá Duy.pdf
Tài liệu liên quan