Tải bản đầy đủ (.pdf) (22 trang)

Bài giảng ngôn ngữ lập trình c chương 4 GV dương khai phong

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (194.05 KB, 22 trang )

TIN HỌC ĐẠI CƯƠNG
Ngơn ngữ lập trình: C
Lý thuyết: 6 buổi
Thực hành: 8 buổi
GVHD: Dương Khai Phong
Email:


NỘI DUNG CÁC BUỔI HỌC
1.
2.
3.
4.
5.
6.

Tổng quan về C (chương 1,2)
Các cấu trúc điều khiển trong C (chương 3)
Hàm và cấu trúc chương trình (chương 4)
Mảng, chuỗi và con trỏ (chương 5)
Kiểu cấu trúc, đệ qui, tập tin (chương 6,7,8)
Ôn tập


CHƯƠNG 4: HÀM VÀ CẤU TRÚC CHƯƠNG TRÌNH
1.

Chương trình và hàm trong C.

2.


Cách viết một hàm.

3.

Phân loại hàm trong C.
a)

Hàm với đối số là tham trị.

b)

Hàm với đối số là tham biến.


1. CHƯƠNG TRÌNH VÀ HÀM TRONG C
a. Chương trình là gì?
 Chương trình là một tập hợp gồm một hay nhiều hàm. Trong
đó bắt buộc phải có hàm main().
 Một chương trình bắt đầu thực hiện từ câu lệnh đầu tiên của
hàm main() cho đến khi gặp dấu ngoặc } cuối cùng của hàm này.
b. Hàm là gì?
 Hàm là một đoạn chương trình độc lập thực hiện trọn vẹn một
công việc nhất định, rổi trả về một giá trị cho chương trình gọi
nó.
 Lưu ý:
- Hàm là một đơn vị độc lập của chương trình.
- Khơng cho phép xây dựng một hàm bên trong một hàm.


1. CHƯƠNG TRÌNH VÀ HÀM TRONG C

* Cấu trúc của một chương trình:
1. <Khai báo thư viện>
2. <Khai báo hằng,biến tồn cục>
3. <Khai báo các hàm>
4. <Chương trình chính / hay hàm main>
5. <Định nghĩa hàm>
 Lưu ý: việc truyền dữ liệu từ hàm này sang hàm
khác được thực hiện theo một trong 2 cách:
 Sử dụng đối số của hàm
 Sử dụng biến toàn cục


1. CHƯƠNG TRÌNH VÀ HÀM TRONG C
* Ví dụ: viết CT tính bình phương của một số ngun a
 Cách 1:
#include “stdio.h”
#include “conio.h”
void main()
{
int a,binhphuong;
printf (“Nhap a = ”);
scanf(“%d”,&a);
binhphuong=a*a;
printf (“Binh phuong của
%d là %d”,a,binhphuong);
}

 Cách 2: dùng hàm
#include “stdio.h”
#include “conio.h”

int binhphuong(int i);
void main()
{ int a,kq;
printf (“Nhap a = ”);
scanf(“%d”,&a);
kq=binhphuong(a);
printf (“Binh phuong của %d là
%d”,a,kq);
}
int binhphuong(int i)
{
int kq;
kq=i*i;
return kq;
}


2. CÁCH VIẾT MỘT HÀM
* Cú pháp khai báo chung:
<Kiểu dữ liệu trả về> <Tên_hàm>([Danh sách các tham
số nếu có]);
Trong đó:
• <Kiểu dữ liệu trả về>: int,float,char,... Nếu hàm khơng
có kiểu dữ liệu trả về thì ta dùng kiểu void.
Ví dụ: int binhphuong(int a), void xuat()

<Tên_hàm> : cần đặt tên sao cho gợi nhớ chức n8ang
của hàm.
• [Danh sách các tham số nếu có]: tùy theo chức năng
của hàm mà danh sách này có hay khơng có tham số,

các tham số cách nhau bởi dấu phẩy “,”



2. CÁCH VIẾT MỘT HÀM
* Cú pháp định nghĩa chung: thường được định nghĩa
bên dưới hàm main()
<Kiểu dữ liệu trả về> <Tên_hàm>([Danh sách các tham
số nếu có])
{
<Khối lệnh>
[return giá_tri_nếu có;]
}


2. CÁC VÍ DỤ CÁCH VIẾT HÀM
* Ví dụ 1: viết chương trình tính S,P hình chữ nhật bằng
cách dùng hàm.
#include “stdio.h”
#include “conio.h”
int tinhP(int dai,int rong);
int tinhS(int dai,int rong);
void main()
{ int dai,rong;
printf (“Nhap dai,rong: ”);
scanf(“%d %d”,&dai,&rong);
printf (“Chu vi hcn là %d”,tinhP(dai,rong));
printf (“Dien tich hcn là %d”,tinhS(dai,rong));
}
// Định nghĩa các hàm


int tinhP(int dai,int rong)
{
int P;
P=(dai+rong)*2;
return P;
}
int tinhS(int dai,int rong)
{
int S;
S=dai*rong;
return S;
}


2. CÁC VÍ DỤ CÁCH VIẾT HÀM
* Ví dụ 2: viết chương trình giải ptb1 ax+b=0 dùng hàm.
#include “stdio.h”
#include “conio.h”
void giaiPTB1(int a,int b);
void main()
{ int a,b;
printf (“Nhap a,b: ”);
scanf(“%d %d”,&a,&b);
giaiPTB1(a,b);
}
// Định nghĩa hàm giaiPTB1

void giaiPTB1(int a,int b)
{

float x;
if (a==0)
if (b==0)
printf (“pt VSN”);
else
printf (“pt VN”);
else
{
x=(float)-b/a;
printf (“pt co nghiem x=%.2f”,x);
}
}


2. CÁC VÍ DỤ CÁCH VIẾT HÀM
* Ví dụ 3: viết chương trình giải ptb2 ax^2+bx+c=0 dùng hàm.
#include “stdio.h”
#include “conio.h”
void giaiPTB1(int a,int b);
void giaiPTB2(int a,int bint c);
void main()
{ int a,b,c;
printf (“Nhap a,b,c: ”);
scanf(“%d %d %d”,&a,&b,&c);
giaiPTB2(a,b,c);
}
// Định nghĩa các hàm

void giaiPTB1(int a,int b) {
// xem lại vi dụ 2

}
void giaiPTB2(int a,int b,int c)
{
if (a==0) // ptb1: bx+c=0
giaiPTB1(b,c);
else
{
float delta,x1,x2;
delta=b*b-4*a*c;
if (delta<0) …
if (delta==0) …
if (delta>0) …
}
}


3. PHÂN LOẠI HÀM TRONG C
* Xét ví dụ: viết CT hoán vị giá trị cho 2 số nguyên a,b như
sau:
Tạo 3 vùng nhớ chứa số nguyên:

void main()
{ int a,b,tam;
printf (“Nhap a,b: ”);
scanf(“%d %d”,&a,&b);
printf (“Truoc khi hvi a=%d b=%d”,a,b);
tam=a;
a=b;
b=tam;
printf (“Sau khi hvi a=%d b=%d”,a,b);

}
Nhap a,b: 5 6
Truoc khi hvi a=5 b=6
Sau khi hvi a=6 b=5

65 (-859…)
0fx.. a = rác
65 (-859…)
1fx.. b = rác
5 (…)
2fx.. tam = rác


3. PHÂN LOẠI HÀM TRONG C
* Xét ví dụ: viết CT hoán vị giá trị cho 2 số nguyên a,b bằng
cách dùng hàm như sau:

void main()
{ int a,b,tam;
printf (“Nhap a,b: ”);
scanf(“%d %d”,&a,&b);
// Xuat a,b
tam=a;
a=b;
b=tam;
// Xuat a,b da hoan vi
}


void hoanvi(int a,int b);

void main()
{ int a,b;
printf (“Nhap a,b: ”);
scanf(“%d %d”,&a,&b);
printf (“Truoc khi hoan vi a=%d b=%d”,a,b);
hoanvi(a,b);
printf (“Sau khi hoan vi a=%d b=%d”,a,b);
}
void hoanvi(int a,int b)
{ int tam;
tam=a;
a=b;
b=tam;
}


3. PHÂN LOẠI HÀM TRONG C
* Cách thực thi chương trình:

void hoanvi(int a,int b);
void main()
{ int a,b;
printf (“Nhap a,b: ”);
scanf(“%d %d”,&a,&b);
printf (“Truoc a=%d b=%d”,a,b);
hoanvi(a,b);
printf (“Sau a=%d b=%d”,a,b);
}
void hoanvi(int a,int b)
{ int tam;

tam=a;
Sau khi kết thúc hàm
a=b;
b=tam; hoanvi 2 vùng nhớ phụ
}
được giải phóng

Tạo 2 vùng nhớ chứa số nguyên:
0fx.. a= giá tri rác (-859…)
1fx.. b= giá tri rác (-859…)
0fx.. a= 5
1fx.. b= 6

Không
đổi

Tạo 2 vùng nhớ phụ khác:
2ffx. a'= 5 (lấy giá trị từ a)
3ffx. b'= 6 (lấy giá trị từ b)
Thực hiện các lệnh để hoán vị:
2ffx. a'= 6 (hoán vị a=b)
3ffx. b'= 5 (hoán vị b=tam)


3. PHÂN LOẠI HÀM TRONG C
* Cách khắc phục: truy cập trực tiếp đến địa chỉ vùng nhớ

void hoanvi(int &a,int &b);
void main()
{ int a,b;

printf (“Nhap a,b: ”);
scanf(“%d %d”,&a,&b);
printf (“Truoc a=%d b=%d”,a,b);
hoanvi(a,b);
printf (“Sau a=%d b=%d”,a,b);
}
void hoanvi(int &a,int &b)
{ int tam;
tam=a;
a=b;
b=tam;
}

Tạo 2 vùng nhớ chứa số nguyên:
65 (-859…)
0fx.. a = rác
65 (-859…)
1fx.. b = rác

Tạo 1 vùng nhớ:
5 (-859…)
1fx.. tam = rác


3. PHÂN LOẠI HÀM TRONG C
* Nhận xét: từ ví dụ trên, ta phân loại hàm trong C theo
2 dạng cơ bản sau:
a/ Hàm với đối số là tham trị (tham số vào/trang 98)
b/ Hàm với đối số là tham biến (tham số ra/trang 98)
 Lưu ý:

 Ta có thể xây dựng hàm vừa có tham trị vừa có
tham biến.
 Tham số khi khai báo hàm gọi chung là tham số
hình thức.
Tham số khi gọi hàm trong CT gọi là tham số
thực.


3. PHÂN LOẠI HÀM TRONG C
a/ Hàm với đối số là tham trị:
 Định nghĩa: là hàm không làm thay đổi giá trị của
các tham số truyền vào khi hàm kết thúc.
 Khai báo:
<Kiểu_data_trả_về> <Tên_hàm>([DS_các tham_số])


Ví dụ:
float tinhDTB(float van,float toan);
float rutcan_bac_hai(float so);



3. PHÂN LOẠI HÀM TRONG C
b/ Hàm với đối số là tham biến:
 Định nghĩa: là hàm làm thay đổi giá trị của các
tham số truyền vào khi hàm kết thúc.
 Khai báo cơ bản:
<Kiểu_data_trả_về> <Tên_hàm>([&DS_các tham_số])



Ví dụ:
void tinhDTB(float van,float toan, float &DTB);
float rutcan_bac_hai(float so, float &kq);



3. PHÂN LOẠI HÀM TRONG C
* Các vấn đề liên quan đến biến: (xem trang 100)
a/ Địa chỉ của biến: là địa chỉ vùng nhớ của máy
tính khi ta khai báo biến (qui ước: đó là số thứ tự của
byte đầu tiên trong một dãy các byte liên tiếp)
=> Cú pháp để lấy địa chỉ của biến: &<Tên_biến>
b/ Biến con trỏ: là một loại biến dùng để lưu địa chỉ
của biến. (phụ thuộc vào kiểu dữ liệu của biến)
=> Cú pháp khai báo biến con trỏ:
<Kiểu_data> *<Tên_biến>;
=> Qui tắc sử dụng: biến con trỏ bắt buộc phải sử
dụng kết hợp với địa chỉ của vùng nhớ.


3. PHÂN LOẠI HÀM TRONG C
* Ví dụ: cách sử dụng biến con trỏ:

void main()
{
int a=5;
printf(“Truoc a=%d”,a);
int *p; // khai báo con trỏ
p=&a; // gán vào địa chỉ biến a
*p=7; // Thay đổi giá trị biến a

printf(“Sau: a=%d”,a);
}
Truoc a=5
Sau a=7

Tạo vùng nhớ chứa số
nguyên a:
0fx.. a = 57
1fx.. p

NULL


3. PHÂN LOẠI HÀM TRONG C
* Các vấn đề liên quan đến biến: (xem trang 115,117)
c/ Biến cục bộ (biến nội): là các biến khai báo bên
trong thân của một hàm
Thời gian tồn tại: từ lúc hàm bắt đầu cho đến khi hàm đó
kết thúc (như vậy các biến khai báo trong hàm main() tồn
tại cho đến khi kết thúc chương trình)
 Phạm vi sử dụng: chỉ sử dụng bên trong hàm mà nó
được khai báo


d/ Biến tồn cục (biến ngoại): là các biến được khai
báo bên ngoài các hàm
gian tồn tại: tồn tại trong suốt chương trình
 Phạm vi sử dụng: từ vị trí nó được khai báo cho đến cuối
chương trình.
Thời



3. PHÂN LOẠI HÀM TRONG C
* Bảng tóm tắt về cách dùng hàm:
Hàm
Đối số là
tham trị
Đối số là
tham biến
(thay đổi
giá trị của
tham số
truyền
vào)

Tham số hình thức
trong khai báo hàm
int binhphuong(int a)
Khai báo dạng địa chỉ của biến
void hoanvi(int &a,int &b)

Tham số thực
trong hàm main
int a,kq;
kq=binhphuong(a);
int a=5,b=6;
hoanvi(a,b);

Khai báo dạng biến con trỏ
void hoanvi(int *a,int *b)


int a=5,b=6;
hoanvi(&a,&b);



×