ts. bùi ngọc thăng bộ môn khmt, trường Đại học...

29
TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CN

Upload: others

Post on 07-Sep-2019

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

TS. Bùi Ngọc ThăngBộ môn KHMT, Trường Đại học CN

Page 2: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Nội dungĐặt vấn đềMột số nguyên tắcCách khai báo và gọi thực hiệnNguyên mẫu (Prototype) của hàm Truyền tham số cho hàmCách thức C thực hiện các lời gọi hàm – ngăn

xếp (stack).

Page 3: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Đặt vấn đềViết chương trình tính S = a! + b! + c! với a, b, c là 3

số nguyên dương nhập từ bàn phím.

Chương trìnhchính

Nhậpa, b, c > 0

TínhS = a! + b! + c!

Xuấtkết quả S

Nhậpa > 0

Nhậpb > 0

Nhậpc > 0

Tínhs1=a!

Tínhs2=b!

Tínhs3=c!

Page 4: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Đặt vấn đề3 đoạn lệnh nhập a, b, c > 0

do {do {printf(printf(““Nhap mot so nguyen duong: Nhap mot so nguyen duong: ””););scanf(scanf(““%d%d””, &, &aa););

} while (} while (aa <= 0); <= 0);

do {do {printf(printf(““Nhap mot so nguyen duong: Nhap mot so nguyen duong: ””););scanf(scanf(““%d%d””, &, &bb););

} while (} while (bb <= 0); <= 0);

do {do {printf(printf(““Nhap mot so nguyen duong: Nhap mot so nguyen duong: ””););scanf(scanf(““%d%d””, &, &cc););

} while (} while (cc <= 0); <= 0);

Page 5: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Đặt vấn đề3 đoạn lệnh tính s1 = a!, s2 = b!, s3 = c!

{ Tính s1 = a! = 1 * 2 * … * a }{ Tính s1 = a! = 1 * 2 * … * a }s1s1 = 1; = 1;for (i = 2; i <= for (i = 2; i <= a a ; i++); i++)

s1s1 = = s1s1 * i; * i;

{ Tính s2 = b! = 1 * 2 * … * b }{ Tính s2 = b! = 1 * 2 * … * b }s2s2 = 1; = 1;for (i = 2; i <= for (i = 2; i <= b b ; i++); i++)

s2s2 = = s2s2 * i; * i;

{ Tính s3 = c! = 1 * 2 * … * c }{ Tính s3 = c! = 1 * 2 * … * c }s3s3 = 1; = 1;for (i = 2; i <= for (i = 2; i <= c c ; i++); i++)

s3s3 = = s3s3 * i; * i;

Page 6: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Đặt vấn đềGiải pháp => Viết 1 lần và sử dụng nhiều lần

Đoạn lệnh nhập tổng quát, với n = a, b, c

Đoạn lệnh tính giai thừa tổng quát, n = a, b, c

do {printf(“Nhap mot so nguyen duong: ”);scanf(“%d”, &n);

} while (n <= 0);

{ Tính s = n! = 1 * 2 * … * n }s = 1;for (i = 2; i <= n ; i++)

s = s * i;

Page 7: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

HàmKhái niệm

Một đoạn chương trình có tên, đầu vào và đầu ra.

Có chức năng giải quyết một số vấn đề chuyên biệt cho chương trình chính.

Được gọi nhiều lần với các tham số khác nhau.Được sử dụng khi có nhu cầu:

Tái sử dụng.Sửa lỗi và cải tiến.

Page 8: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Một số nguyên tắc

Các hàm trong NNLT C đều ngang cấp với nhau:Hàm không được định nghĩa lồng nhau.Thứ tự khai báo không quan trọng.

Hàm có thể nhận và xử lý nhiều tham số hoặc không có tham số nào

Hàm có thể trả về một giá trị hoặc không.Biến khai báo trong hàm F chỉ có giá trị trong F,

không sử dụng được biến này trong các hàm khác được.

Page 9: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Ví dụ: hàm tính xn

double Power(double x, int n){

double result = 1;

for(int i=1; i< n; i++)result *= x;

return result;}

double Power(double x, int n){

double result = 1;

for(int i=1; i< n; i++)result *= x;

return result;}

nhận vào 2 tham số khi được gọikiểu của giá trị trả về

giá trị được trả về qua lệnh return

Page 10: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Ví dụ: gọi thực hiện hàm Power

#include <stdio.h>

double Power(double, int);

int main(){

double m = Power(2, 3);printf(“3.5 ^ 4 = %lf”, Power(3.5, 4));return 0;

}

#include <stdio.h>

double Power(double, int);

int main(){

double m = Power(2, 3);printf(“3.5 ^ 4 = %lf”, Power(3.5, 4));return 0;

}

Chỉ thị cho chương trình biết prototype của hàm Power

3.5 và 4: 2 tham số thực sự

Page 11: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Một số lỗi thường gặp

#include <stdio.h>

int main(){

int m = Power(2, 3);printf(“3.5 ^ 4 = %lf”, Power(4));return 1.0;

}

#include <stdio.h>

int main(){

int m = Power(2, 3);printf(“3.5 ^ 4 = %lf”, Power(4));return 1.0;

}

Compiler không hiểu được hàm Power

giá trị trả về không khớp kiểu

hàm Power thiếu tham số

Page 12: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Nguyên mẫu (Prototypes)Dòng khai báo

double Power(double, int);được hiểu là khai báo prototype của hàm Power

Được dùng khi chương trình sử dụng một hàm trước khi khai báo.

Khai báo prototype thông báo cho trình biên dịch biết kiểu của giá trị trả về và mô tả chi tiết về các tham số của hàm.

Các hàm thư viện chuẩn được khai báo prototype trong các tập tin header (stdio.h, conio.h, …).

Các hàm do lập trình viên tự xây dựng phải tự khai báo prototype.

Page 13: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Hàm: dạng tổng quát

kiểu trả về tên hàm(danh sách tham số hình thức){

//khai báo các biến của hàm

//các lệnh thực thi

return giá trị trả về; //hàm void không có giá trị trả về}

kiểu trả về tên hàm(danh sách tham số hình thức){

//khai báo các biến của hàm

//các lệnh thực thi

return giá trị trả về; //hàm void không có giá trị trả về}

header của hàm

thân (body) hàm

Page 14: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Các bước viết hàmCần xác định các thông tin sau đây:

Tên hàm.Hàm sẽ thực hiện công việc gì.Các đầu vào (nếu có).Đầu ra (nếu có).

Tên hàmĐầu vào 1

Đầu vào 2

Đầu vào n

Đầu ra (nếu có)Các công việcsẽ thực hiện

Page 15: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

HàmVí dụ 2

Tên hàm: TinhTongCông việc: tính và trả về tổng 2 số nguyênĐầu vào: hai số nguyên x và yĐầu ra: một số nguyên có giá trị x + y

int TinhTong(int x, int y)int TinhTong(int x, int y){{

int s;int s;s = x + y;s = x + y;return s;return s;

}}

Page 16: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

float g=6.5;void main(){

int i = 5, j, k = 2;float f = 2.8F;d = 3.7;

}void F(int v){

double d, e = 0.0, f;i++; g--;f = 0.0;

}

float g=6.5;void main(){

int i = 5, j, k = 2;float f = 2.8F;d = 3.7;

}void F(int v){

double d, e = 0.0, f;i++; g--;f = 0.0;

}

Phạm vi tác dụng của biếnBiến toàn cục: khai báo

ngoài tất cả các hàm (kể cả hàm main) và có tác dụng lên toàn bộ chương trình.

Biến cục bộ: khai báo trong hàm hoặc khối { } và chỉ có tác dụng trong bản thân hàm hoặc khối đó (kể cả khối con nó). Biến cục bộ sẽ bị xóa khỏi bộ nhớ khi kết thúc khối khai báo nó.

compiler không chấp nhận “d”, “i”

“f” của hàm F, không phải của main

Page 17: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

int a;int a;int Ham1()int Ham1(){{

int a1;int a1;}}

int Ham2()int Ham2(){{

int a2;int a2;{{

int a21;int a21;}}

}}

void main()void main(){{

int a3;int a3;

}}

Page 18: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Một số lưu ýThông thường người ta thường đặt phần tiêu đề

hàm/nguyên mẫu hàm (prototype) trên hàm main và phần định nghĩa hàm dưới hàm main.

void XuatTong(int x, int y);void XuatTong(int x, int y); // prototype// prototype

void main()void main(){{

……}}

void XuatTong(int x, int y)void XuatTong(int x, int y){{

printf(printf(““%d cong %d bang %d%d cong %d bang %d””, x, y, x + y);, x, y, x + y);}}

Page 19: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Truyền tham số cho hàmC hỗ trợ 2 cách truyền tham số:

Truyền tham số bởi giá trị (truyền giá trị - call by value)

Truyền tham số bởi địa chỉ (truyền địa chỉ - call by address)

Mở rộng với C++ Truyền tham chiếu (call by reference)

Page 20: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Truyền giá trịHàm sẽ xử lý trên bản sao của tham sốHàm không thể thay đổi giá trị của tham số

được.Được dùng trong các trường hợp cần chuyển

dữ liệu vào bên trong hàm để xử lý, tính toánCác ví dụ trên đều dùng kiểu truyền tham số

bởi giá trịVí dụ hàm có sẵn của C truyền giá trị:

float sqrt(float);double pow(double, double);

Page 21: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Truyền giá trị - ví dụ#include <stdio.h>void change(int v);

int main(){

int var = 5;change(var);printf("main: var = %i\n", var);return 0;

}

void change(int v){

v *= 100;printf("change: v = %i\n", v);

}

#include <stdio.h>void change(int v);

int main(){

int var = 5;change(var);printf("main: var = %i\n", var);return 0;

}

void change(int v){

v *= 100;printf("change: v = %i\n", v);

}

change: v = 500main: var = 5

change: v = 500main: var = 5

hàm change không thay đổi giá trị của “var”

Page 22: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Truyền địa chỉHàm sẽ xử lý trên chính tham số nhờ vào địa

chỉ của chúngHàm có thể thay đổi giá trị của tham số.Được dùng trong các trường hợp cần chuyển

dữ liệu là kết quả xử lý được bên trong hàm ra “ngoài” cho các hàm khác sử dụng.

Ví dụ hàm có sẵn của C truyền địa chỉ:Ví dụ hàm có sẵn của C truyền địa chỉ:int scanf(const char *format, adr1, adr2, …);int scanf(const char *format, adr1, adr2, …);

functionfunctioninputsinputs outputsoutputs

Page 23: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Truyền địa chỉ - ví dụ#include <stdio.h>void change(int *v);

int main(){

int var = 5;change(&var);printf("main: var = %i\n", var);return 0;

}

void change(int *v){

(*v) *= 100;printf("change: *v = %i\n", (*v));

}

#include <stdio.h>void change(int *v);

int main(){

int var = 5;change(&var);printf("main: var = %i\n", var);return 0;

}

void change(int *v){

(*v) *= 100;printf("change: *v = %i\n", (*v));

}

change: *v = 500main: var = 500

change: *v = 500main: var = 500

v: tham số địa chỉ của số int, khai báo với dấu *

truyền địa chỉ của “var” vào hàm change

Page 24: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Phương thức trao đổi dữ liệuC dùng 1 stack để lưu trữ các biến cục bộ và các

chuyển các tham số cho hàm với mỗi lần gọi hàm thực hiệnHàm gọi (O) cất các tham số vào stack.Gọi thực hiện hàm được gọi (F).F nhận lấy các tham số từ stackF tạo các biến cục bộ ứng với các tham số trên stackKhi kết thúc, F cập nhật giá trị các tham số (ref) và

trả điều khiển cho OO nhận lấy các giá trị mới của tham số cũng như giá

trị trả về

Page 25: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

#include <stdio.h>double power(int, int);int main(void){

int x = 2;double d;d = power(x, 5);printf("%lf\n", d);return 0;

}double power(int n, int p){

double result = n;while(--p > 0)

result *= n;return result;

}

#include <stdio.h>double power(int, int);int main(void){

int x = 2;double d;d = power(x, 5);printf("%lf\n", d);return 0;

}double power(int n, int p){

double result = n;while(--p > 0)

result *= n;return result;

}

main: x2

main: d?

power: p5

power: n2

power: result32.0

Phương thức trao đổi dữ liệu

32.0

Page 26: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Tổng kếtKhai báo và gọi thực hiện hàmKhai báo prototypesTầm tác dụng của biếnTruyền tham số cho hàmVấn đề tổ chức dữ liệu trong chương trình

Page 27: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Bài tập thực hành1) Hàm nhận vào một số nguyên dương n và thực hiện:

a. Trả về số đảo của số đó.b. Có phải là số đối xứng (Trả về True/False)c. Có phải là số chính phương.d. Có phải là số nguyên tố.e. Tổng các chữ số lẻ. f. Tổng các chữ số nguyên tố.g. Tổng các chữ số chính phương.

Page 28: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Bài tập thực hành2) Hàm nhận vào một số nguyên dương n và thực hiện:

a. S = 1 + 2 + … + nb. S = 12 + 22 + … + n2

c. S = 1 + 1/2 + … + 1/nd. S = 1 * 2 * … * ne. S = 1! + 2! + … + n!

3) Hàm trả về USCLN của 2 số nguyên.

4) In ra n phần tử của dãy Fibonacy.

Page 29: TS. Bùi Ngọc Thăng Bộ môn KHMT, Trường Đại học CNuet.vnu.edu.vn/~tqlong/2016thcs4/slide5_function.pdfcủa giá trị trả về và mô tả chi tiết về các tham

Tài liệu tham khảo[PVA] Chương 6[K&R], Chapter 4