[r]
(1)Ph l c 4ụ ụ
Hàm v i đ i s b t đ nh Cớ ố ố ấ ị
Trong giáo trình C thường ch hỉ ướng d n cách xây d ng hàm v i đ i cẫ ự ố ố đ nh M i đ i c n có m t tham s (cùng ki u v i nó) l i g i hàm Tuy nhiên m tị ỗ ố ầ ộ ố ể ọ ộ vài hàm chu n c a C l i không nh v y, mà linh hoẩ ủ ậ ạt h n, ch ng dùng hàm printfơ ẳ hay scanf s tham s mà ta cung c p cho hàm không c đ nh c v s lố ố ấ ố ị ả ề ố ượng l nẫ ki u cách Ví d câu l nh:ể ụ ệ
printf(“\n T ng = %d “ , 3+4+5) ;ổ có tham s , nh ng câu l nh:ố ệ
printf(“\n Hà N i“ ) ;ộ ch có m t tham s ỉ ộ ố
Nh v y c n phân bi t khái ni m sau: ậ ầ ệ ệ
- Đ i s c đ nh đố ố ố ị ược khai báo dòng đ u c a hàm, có tên ki uầ ủ ể - Tham s ng v i đ i s c đ nh g i tham s c đ nhố ứ ố ố ố ị ọ ố ố ị
- Đ i b t đ nh đố ấ ị ược khai báo b i ba d u ch m: b t đ nh c v s lở ấ ấ ấ ị ả ề ố ượng ki uể - Tham s b t đ nh ( ng v i đ i b t đ nh) m t danh sách giá tr v i s lố ấ ị ứ ố ấ ị ộ ị ố ượng ki u tuỳ ý (không xác đ nh) ể ị
Trong ph l c s trình b y cách xây d ng hàm v i đ i s b t đ nh Công cụ ụ ẽ ầ ự ố ố ấ ị ụ ch y u đủ ế ược dùng tr danh sách ỏ
1 Bi n tr ế ỏ
Bi n tr (hay tr ) dùng đ ch a đ a ch c a bi n, m ng, hàm, Có nhi uế ỏ ỏ ể ứ ị ỉ ủ ế ả ề ki u đ a ch , v y có nhi u ki u tr Bi n tr để ị ỉ ậ ề ể ỏ ế ỏ ược khai báo theo m u:ẫ
Ki u *Tên_bi n_con_tr ;ể ế ỏ
Ví d :ụ
float px ; // px tr th c ỏ ự
Các phép toán quan tr ng tr g m:ọ ỏ
+ Gán đ a ch m t vùng nh cho tr (dùng toán t gán, phép l y đ a ch , hàmị ỉ ộ ỏ ấ ị ỉ c p phát b nh )ấ ộ
+ Truy nh p vào vùng nh thông qua tr , dùng phép toán:ậ ỏ *Tên_con_trỏ
(Đ ý có vùng nh : vùng nh c a bi n tr vùng nh mà đ a ch đ uể ớ ủ ế ỏ ị ỉ ầ c a ch a bi n tr )ủ ứ ế ỏ
+ C ng đ a ch đ tr ch a đ a ch c a ph n t ti p theo, dùng phép toán:ộ ị ỉ ể ỏ ứ ị ỉ ủ ầ ế ++ Tên_con_tr ho c Tên_con_tr ++ỏ ặ ỏ
Chú ý r ng phép tốn ch có th th c hi n đ i v i tr có ki u ằ ỉ ể ự ệ ố ỏ ể
2 Danh sách không ki uể
(2)Dùng tr có ki u ch qu n lý đỏ ể ỉ ả ược m t danh sách giá tr ki u, ví d d yộ ị ể ụ ẫ s th c, d y s nguyên, d y c u trúc, ố ự ẫ ố ẫ ấ
Khi c n qu n lý m t danh sách giá tr không ki u ta ph i dùng trầ ả ộ ị ể ả ỏ không ki u (void) khai báo nh sau:ể
void * Tên_con_tr ;ỏ
Con tr void có th ch a đ a ch có ki u b t kỳ, dùng đ tr đ n vùng nhỏ ể ứ ị ỉ ể ấ ể ỏ ế ch a danh sách c n qu n lý M t ý quan tr ng m i g i vào hay l y m tứ ầ ả ộ ọ ỗ ấ ộ giá tr t vùng nh , tuỳ theo ki u giá tr mà ta ph i dùng phép chuy n ki u thíchị ể ị ả ể ể h p đ i v i tr Ví d sau minh ho cách l p m t danh sách g m m t s nguyên,ợ ố ỏ ụ ậ ộ ộ ố m t s th c m t chu i ký t Chúng ta c n m t b nh đ ch a s nguyên, s th cộ ố ự ộ ỗ ự ầ ộ ộ ể ứ ố ố ự đ a ch chu i dùng tr void đ qu n lý vùng nh này.ị ỉ ỗ ỏ ể ả
void *list , *p ; // Con tr list tr t i đ u danh sách ỏ ỏ ầ // p dùng đ t qua ph n t c a danh sách ể ệ ầ ủ list=malloc(sizeof(int) + sizeof(float)+ sizeof(char*) ); p=list;
*((int*)p) = 12; // Đ a s nguyên 12 vào danh sách ố ((int*)p)++ ; // Chuy n sang ph n t ti p theo ể ầ ế *((float*)p) = 3.14; // Đ a s th c 3.14 vào danh sách ố ự ((float*)p)++ ; // Chuy n sang ph n t ti p theo ể ầ ế
*((char**)p) = “HA NOI”; // Đ a đ a ch chu i “HA NOI” ị ỉ ỗ // vào danh sách
// Nh n ph n t danh sách ậ ầ p=list; // V đ u danh sách ề ầ
int a = *((int*)p); // Nh n ph n t th nh t ậ ầ ứ ấ ((int*)p)++ ; // Chuy n sang ph n t ti p theo ể ầ ế float x= *((float*)p); // Nh n ph n t th hai ậ ầ ứ ((float*)p)++ ; // Chuy n sang ph n t ti p theo ể ầ ế char *str = *((char**)p) ; // Nh n ph n t th ba ậ ầ ứ
3 Hàm v i đ i s b t đ nh ớ ố ố ấ ị
+ Đ i b t đ nh bao gi đ t sau đố ấ ị ặ ược khai báo b ng d u ba ch m Víằ ấ ấ d ví d hàmụ ụ
void f(int n, char *s, ) ;
có đ i c đ nh n, s đ i b t đ nh.ố ố ị ố ấ ị
+ Đ nh n để ậ ược tham s b t đ nh l i g i hàm ta c n l u ý m sau:ố ấ ị ọ ầ ể - Các tham s b t đ nh ch a m t danh sách Đ nh n đố ấ ị ứ ộ ể ậ ược đ a ch đ u danhị ỉ ầ sách ta dùng m t tr void phép gán sau:ộ ỏ
(3)- Dùng m t tham s c đ nh ki u chu i đ quy đ nh s lộ ố ố ị ể ỗ ể ị ố ượng ki u c a m i thamể ủ ỗ s danh sách, ví d : ố ụ
“3i” hi u : tham s b t đ nh g m giá tr intể ố ấ ị ị “3f” hi u : tham s b t đ nh g m giá tr floatể ố ấ ị ị
“fiss” hi u có tham s b t đ nh có ki u l n lể ố ấ ị ể ầ ượt float, int, char*, char* M t bi t độ ế ược đ a ch đ u danh sách, bi t đị ỉ ầ ế ượ ố ược s l ng ki u c a m iể ủ ỗ tham s , d dàng nh n đố ễ ậ ược giá tr tham s đ s d ng thân hàm.ị ố ể ụ
Ví dụ sau minh ho cách xây d ng hàm v i tham s b t đ nh Hàm dùng đạ ự ố ấ ị ể in giá tr ki u int, float char Hàm có m t tham s c đ nh đ cho bi t có baoị ể ộ ố ố ị ể ế nhiêu giá tr ki u giá tr c n in Ki u quy đ nh nh sau: i int, f float, s làị ể ị ầ ể ị char* Tham s có cách vi t: l p (g m m t h ng s nguyên m t ch đ nhố ế ặ ộ ằ ố ộ ữ ị ki u) li t kê (m t d y ch đ nh ki u) Ví d :ể ệ ộ ẫ ữ ị ể ụ
“4s” có nghĩa in chu iỗ
“siif” có nghĩa in m t chu i, giá tr nguyên m t giá tr th c:ộ ỗ ị ộ ị ự #include <stdio.h>
#include <ctype.h> #include <string.h> #include <conio.h> #include <stdlib.h> #include <stdarg.h>
void InDanhSachGiaTri(char *st, ) {
void *list ; int gt_int ; float gt_float; char *gt_str; int n,i ; char kieu; int lap;
list = ; // list tro toi vung nho chua danh sach dia chi cac // tham so
lap = isdigit(st[0]) ; if (lap)
n=st[0] - '0' ; else
n=strlen(st);
printf("\n n= %d lap = %d",n,lap); getch(); for(i=0;i<n;++i)