1. Trang chủ
  2. » Giáo án - Bài giảng

Bài giảng nhập môn lập trình hàm, cấu trúc trần phước tuấn

14 141 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 14
Dung lượng 271,98 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Th t khai báo không quan tr ng... Heap Data segment Stack.

Trang 1

Tr n Ph c Tu n

tranphuoctuan.khoatoan.dhsp@gmail.com http://baigiang.tranphuoctuan.com

M t s nguyên t c Cách khai báo và g i th c hi n Prototype c a hàm

Truy n tham s cho hàm

Bi n toàn c c, bi n c c b , bi n static, bi n thanh ghi,

… Cách th c C th c hi n các l i g i hàm – stack.

Trang 2

NH P MÔN L P TRÌNH 12/23/2009 3

Các hàm trong NNLT C u ngang c p v i nhau:

Hàm không c khai báo 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.

double Power(double x, int n)

{

double result;

for(result = 1; n; n ) result *= x;

return result;

}

{

double result;

for(result = 1; n; n ) result *= x;

return result;

}

nh n vào 2 tham s khi c g i

ki u c a giá tr tr

giá tr c tr qua l nh return

Trang 3

NH P MÔN L P TRÌNH 12/23/2009 5

#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

#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 không kh p ki u

hàm Power thi u tham s

Trang 4

NH P MÔN L P TRÌNH 12/23/2009 7

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.

ki u tr 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 ; //hàm void không có giá tr tr }

ki u tr 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 ; //hàm void không có giá tr tr }

header c a hàm

thân (body) hàm

Trang 5

NH P MÔN L P TRÌNH 12/23/2009 9

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;

}

Bi n toàn n c c c:

Không thu c kh i

nào, có tác d ng

trong toàn ch ng

trình k t khi khai

báo

Bi n c c b : khai

báo trong m t kh i,

ch có tác d ng

trong kh i này

compiler không

ch p nh n “d”, “i”

“f” c a hàm F, không

ph i c a main

C 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)

Trang 6

NH P MÔN L P TRÌNH 12/23/2009 11

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án

Cá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);

#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 = 500 main: var = 5

change: v = 500 main: var = 5

hàm change không thay i giá tr a “var”

Trang 7

NH P MÔN L P TRÌNH 12/23/2009 13

Hàm s x lý trên chính tham s nh vào a ch

c a chúng Hà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 :

int scanf(const char *format, adr1, adr2, …);

function

#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 = 500 main: var = 500

change: *v = 500 main: var = 500

a s int, khai

vào hàm change

Trang 8

NH P MÔN L P TRÌNH 12/23/2009 15

Hàm s x lý trên b n sao tham s và c p nh t l i b n chính ngay tr c khi hàm k t th úc.

Hà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.

Ch áp d ng c v i các trình biên d ch C++

#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 = 500 main: var = 500

change: v = 500 main: var = 500

v: tham s tham chi u, khai báo

i d u &

truy n “var” vào hàm change

Trang 9

NH P MÔN L P TRÌNH 12/23/2009 17

#include <stdio.h>

void function(int a, int *b, int &c);

int main()

{

int x = 3, y = 4, z = 5;

function(x, &y, z);

printf("%i %i %i\n", x, y, z);

return 0;

}

void function(int a, int *b, int &c)

{

a *= 2;

(*b) += a;

c = a + (*b);

printf("%i %i %i\n", a, *b, c);

}

#include <stdio.h>

void function(int a, int *b, int &c);

int main()

{

int x = 3, y = 4, z = 5;

function(x, &y, z);

printf("%i %i %i\n", x, y, z);

return 0;

}

void function(int a, int *b, int &c)

{

a *= 2;

(*b) += a;

c = a + (*b);

printf("%i %i %i\n", a, *b, c);

}

6 10 16

3 10 16

6 10 16

3 10 16

main

function

a b c

Ph ng th c trao i d li u

C dùng 1 stack 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 n

Hà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 stack

F t o các bi n c c b ng v i các tham s trên stack Khi k t thúc, F c p nh t giá tr các tham s (ref) và tr i u khi n cho O

O nh n l y các giá tr m i c a tham s c ng nh giá tr tr v

Trang 10

NH P MÔN L P TRÌNH 12/23/2009 19

#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: x 2

main: d

?

power: p 5

power: n 2

power: result 32.0

Ph ng th c trao i d li u

32.0

thúc.

Heap

Data segment Stack

Trang 11

NH P MÔN L P TRÌNH 12/23/2009 21

Khai báo và g i th c hi n hàm Khai báo prototypes

T m tác d ng c a bi n Truy n tham s cho hàm

V n t ch c d li u trong ch ng trình

Trang 12

NH P MÔN L P TRÌNH 12/23/2009 23

Khái ni m Khai báo Truy xu t các thành ph n

C u trúc & m ng Con tr n c u trúc

C u trúc là ki u d li u g m m t nhóm các thành ph n có ki u không gi ng nhau, m i thành ph n c xác nh b ng m t tên riêng

bi t.

Ki u c a m i thành ph n trong c u trúclà m t

ki u ã c nh ngh a tr c, k c m ng và các c u trúc khác.

Trang 13

NH P MÔN L P TRÌNH 12/23/2009 25

M t ki u c u trúc c nh ngh a v i t khóa struct

{

};

typedef struct TBook {

char title[80]; char author[80]; float price;

char isbn[20]; };

typedef struct TBook {

char title[80]; char author[80]; float price;

char isbn[20];

};

typedef struct TDate {

char day;

char month;

int year;

};

typedef struct TDate

{

char day;

char month;

int year;

};

typedef struct TStudent

{

char ID[10];

char firstname[10];

char lastname[20];

TDate dob;

float marks[10];

};

typedef struct TStudent

{

char ID[10];

char firstname[10];

char lastname[20];

TDate dob;

float marks[10];

};

//khai báo các bi n

TStudent list[100];

//khai báo các bi n

TBook book;

TStudent list[100];

Trang 14

NH P MÔN L P TRÌNH 12/23/2009 27

Các thành ph n c a m t bi n ki u c u trúc c truy xu t thông qua tên bi n, d u "." và tên thành ph n.

void Print(TStudent m) {

printf("Name : %s %s\n",

m.firstname, m.lastname);

printf("Student ID : %s\n", m.ID);

printf("Date of birth : %hi/%hi/%i",

m.dob.day, m.dob.month, m.dob.year); printf("Marks : ");

for (int i=0; i<10; i++)

printf("%.2f ", m.marks[i]);

}

void Print(TStudent m) {

printf("Name : %s %s\n",

m.firstname, m.lastname);

printf("Student ID : %s\n", m.ID);

printf("Date of birth : %hi/%hi/%i",

m.dob.day, m.dob.month, m.dob.year);

printf("Marks : ");

for (int i=0; i<10; i++)

printf("%.2f ", m.marks[i]);

}

void ReadInfo(TStudent &m)

{

printf("Type student ID: ");

scanf("%s", m.ID);

printf("Type first name: ");

gets(m.firstname);

printf("Type last name: ");

gets(m.lastname);

printf("Date of birth (d m y): ");

scanf("%hi %hi %i", &(m.dob.day),

&(m.dob.month), &(m.dob.year));

printf("Marks (10 floats): ");

for (int i=0; i<10; i++)

scanf("%f", &(m.marks[i]));

}

void ReadInfo(TStudent &m)

{

printf("Type student ID: ");

scanf("%s", m.ID);

printf("Type first name: ");

gets(m.firstname);

printf("Type last name: ");

gets(m.lastname);

printf("Date of birth (d m y): ");

scanf("%hi %hi %i", &(m.dob.day),

&(m.dob.month), &(m.dob.year));

printf("Marks (10 floats): ");

for (int i=0; i<10; i++)

scanf("%f", &(m.marks[i]));

}

Ngày đăng: 03/01/2016, 10:25

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm