Trường THPT Phù Cát 2
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Trường THPT Phù Cát 2

Chào mừng các bạn đến với diễn đàn trường THPT số 2 Phù Cát
 
Trang ChínhTrang Chính  Tìm kiếmTìm kiếm  Latest imagesLatest images  Đăng kýĐăng ký  Đăng Nhập  
nguyenhoangnguyenhuy_vtlt nhắn với ♥ PHÓNG VỆ TINH VINASAT 2
gửi vào lúc Thu May 10, 2012 1:28 pm ...
: Vào ngày 16/5/2012, Vệ tinh Vinasat 2 của Việt Nam sẽ phóng lên quỹ đạo địa tĩnh 131,8 độ Đông bằng tên lửa đẩy Arian 5 từ bãi phóng Kouru, nơi đã phóng thành công vệ tinh Vinasat 1. Được truyền hình trực tiếp trên kênh VTV1 vào lúc 05h13' - 07h13' sáng theo giờ Hà Nội. Đây là vệ tinh được coi là chiến lực của …
nguyenhoangnguyenhuy_vtlt nhắn với ♥ HOẠT ĐỘNG MÙA HÈ XANH
gửi vào lúc Thu May 10, 2012 1:12 pm ...
: Mùa hè xanh thì lại sắp đến với chúng ta rồi. Không biết là các ban đã và đang chuẩn bị gì cho kế hoạch mùa hè xanh của mình chưa.
nguyenhoangnguyenhuy_vtlt nhắn với ♥ NGHỊ QUYẾT TRUNG ƯƠNG IV
gửi vào lúc Thu May 10, 2012 1:08 pm ...
: Nghị quyết Trung Ương IV mà Đảng ta đã đặt ra nhiều cấp bách giải quyết nhất hiện nay. Các bạn đã và đang góp những gì mà nghị quyết Trung Ương IV đưa ra chưa.
nguyenhoangnguyenhuy_vtlt nhắn với ♥ GỢI Ý CẢI CÁCH HÀNH CHÍNH
gửi vào lúc Thu May 10, 2012 1:05 pm ...
: Nguyên Huy xin gợi ý cho các bạn rằng. Việc cải cách hành chính là vấn đề cần và rất cần nhất hiện nay. Vì cải cách hành chính là giảm bớt thời gian, chi phí tiền của nhà nước và của nhân dân. Đồng thời cải cách hành chính để giảm bớt các tệ nạn quan liêu, tham nhũng giấy tờ hiện nay.
nguyenhoangnguyenhuy_vtlt nhắn với ♥ VẤN ĐỀ CẢI CÁCH HÀNH CHÍNH
gửi vào lúc Thu May 10, 2012 1:02 pm ...
: Cải cách hành chính là gì? Có phải nên cải cách hành chính hay không? Các bạn nghĩ như thế nào về vấn đề này.
nguyenhoangnguyenhuy_vtlt nhắn với ♥ NGÀY SINH CỦA BÁC
gửi vào lúc Thu May 10, 2012 12:58 pm ...
: Ngày (19/5/1890 - 19/5/2012) là ngày sinh Chủ tịch Hồ Chí Minh và kỉ niêm 122 năm ngày sinh của Bác.
kenboy nhắn với ♥ vancan.info/forum/forum.php
gửi vào lúc Mon May 07, 2012 11:54 pm ...
: minh moi lam xong web truong .moi nguoi ghe tham web minh nha
nguyenhoangnguyenhuy_vtlt nhắn với ♥ Mùa hè nóng
gửi vào lúc Mon May 07, 2012 10:10 pm ...
: Mùa hè miền Trung lại nóng và nóng lên rồi. Chúng ta phải hành động để làm nó mát trở lại bạn nhé!
nguyenhoangnguyenhuy_vtlt nhắn với ♥ CHÚC THI TỐT NGHIỆP NĂM 2012
gửi vào lúc Mon May 07, 2012 10:06 pm ...
: Kì thi tốt nghiệp năm 2012 gần tới rồi. Nguyên Huy xin chúc cho các em là học sinh trường Phù Cát 2 học tốt và thi tốt nhé!
Gửi đến :
Nội dung thông điệp


CÁC KIẾN THỨC CƠ BẢN CỦA NGÔN NGỮ C phần 2Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down
Sun Jan 16, 2011 4:50 pm
CÁC KIẾN THỨC CƠ BẢN CỦA NGÔN NGỮ C phần 2 Bgavatar_06
CÁC KIẾN THỨC CƠ BẢN CỦA NGÔN NGỮ C phần 2 Bgavatar_01CÁC KIẾN THỨC CƠ BẢN CỦA NGÔN NGỮ C phần 2 Bgavatar_02_newsCÁC KIẾN THỨC CƠ BẢN CỦA NGÔN NGỮ C phần 2 Bgavatar_03
CÁC KIẾN THỨC CƠ BẢN CỦA NGÔN NGỮ C phần 2 Bgavatar_04_newCÁC KIẾN THỨC CƠ BẢN CỦA NGÔN NGỮ C phần 2 Bgavatar_06_news
CÁC KIẾN THỨC CƠ BẢN CỦA NGÔN NGỮ C phần 2 Bgavatar_07CÁC KIẾN THỨC CƠ BẢN CỦA NGÔN NGỮ C phần 2 Bgavatar_08_newsCÁC KIẾN THỨC CƠ BẢN CỦA NGÔN NGỮ C phần 2 Bgavatar_09
[Thành viên] - letranhoangtai
Binh Nhất
Binh Nhất
Sinh Nhật Sinh Nhật : 30/06/1991
Tổng số bài gửi : 25
Điểm cống hiến : 60
Cảm ơn : 3
Ngày tham gia : 08/01/2011
Tuổi : 32
Đến từ Đến từ : Cát tài- Phù cát
Nghề nghiệp Nghề nghiệp : Sinh viên

CÁC KIẾN THỨC CƠ BẢN CỦA NGÔN NGỮ C phần 2 Vide

Bài gửiTiêu đề: CÁC KIẾN THỨC CƠ BẢN CỦA NGÔN NGỮ C phần 2

Tiêu d?: CÁC KIẾN THỨC CƠ BẢN CỦA NGÔN NGỮ C phần 2

CHƯƠNG 3 : CẤU TRÚC ÐIỀU KHIỂN VÀ VÒNG LẶP



3.1/ a/Khái niệm : mọi chương trình đều có thể biểu diễn qua 3 cấu trúc :

- tuần tự : mặc định ( default)

- lựa chọn ( lệnh if hoặc lệnh switch)

- lặp ( for, while hoặc do while)

b/ Khối lệnh : là tập hợp các câu lệnh được khai báo bởi 2 dấu { và } .

không đặt dấu chấm phẩy ( ; ) sau một khối lệnh trừ một vài trường hợp đặc biệt.

3.2 / Các câu lệnh

3.2.1 Lệnh If :

- Cú pháp : If ( biểu thức) < lệnh> ;

- Diễn giải : nếu Biểu thức đúng ( khác 0 ) --> thực hiện

ngược lại nếu biểu thức sai ( = 0 ) -ă thực hiện lệnh đứng sau câu lệnh if.

- Hoặc : If ( biểu thức) ;

else < lệnh B);

+ Biểu thức : # 0 ( đúng) ----> < lệnh A>

=0 ( sai ) ---> < lệnh B>.

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



Chương trình viết bằng ngôn ngữ C gồm 1 dãy các hàm trong đó có 1 hàm chính là main và chương trình bắt đầu từ main.

4.1/ Khái niệm :

- Hàm là đoạn chương trình thực hiện trọn vẹn một công việc nhất định.

- Hàm chia cắt việc lớn bằng nhiều việc nhỏ. Nó giúp cho chương trình sáng sủa, dễ sửa, nhất là đối với các chương trình lớn.

4.2/ Khai báo hàm :

< Tên hàm > (< danh sách các đối số>)

< Khai báo biến >

{

< Khai báo thêm các biến >

< Các câu lệnh >

}

- Trong đó :

+ Tên hàm : buộc phải có.

+ Danh sách các đối số : không bắt buộc. Có hay không tuỳ theo chúng ta định dùng hàm đó làm gì.

+ Khai báo biến : Nếu Danh sách các đối số mà có thì phần này buộc phải có. Còn nếu không thì ngược lại có thể bỏ qua.

+ Phần trong { } : là thân hàm. Dấu { } là bắt buộc đối với mọi hàm.

+ < Khai báo tham biến > : ngay sau { và gọi là biến cục bộ dành riêng cho hàm sử dụng.

+ đối số luôn luôn truyền theo trị ( không thay đổi giá trị).

*Ví dụ : Hàm tính giai thừa : S = x 1 /1! + x 2 /2! + ....+ x n / n!

Cách 1 :

#Include <stdio.h>

#Include <conio.h>

float giaithua ( int n)

{

int i ;float KQ ;

for ( KQ=1,i =1 ; i<=n ; i ++ )

KQ = KQ * i ;

return KQ ;

}

Void main ( ) /* khai báo biến toàn cục nếu có */

{

int n ;

printf ( " Nhập n = " ); scanf ( " %d ", &n);

printf ( " %d giai thừa là % f ", n, giaithua (n) );

getch ();

}

Cách 2 :

#Include <stdio.h>

# Include<conio.h>

/*Khai báo prototype*/ mục đích hàm đặt ở đâu cũng được không cần trước hàm gọi

float giaithua ( int n );

void main ()

{

}

/* Chi tiết hàm giai thừa */

float giaithua ( int n)

{ ... return KQ };

Chú ý : - Kiểu của hàm cùng kiểu giá trị cần trả về.

- Các hàm độc lập, không được lồng nhau.

- Kiểu void tên hàm () : không cần trả về giá trị nào, hiểu ngầm là trả về int.

- ở cách 1 : hàm ở trên không được gọi hàm dười.

- ở cách 2 : các hàm gọi được lẫn nhau.

4.3 / Phạm vi của biến :

- Chẳng hạn trong ví dụ trên : biến n trong hàm main ( ) là cục bộ của main() chỉ có tác dụng trong hàm main() => trong hàm giai thừa có thẻ khai báo biến n trùng biến n của hàm main ( ) nhưng khác nhau và chỉ tồn tại trong 1 hàm.

Ví dụ : float giaithua (m);

{

int n ; float KQ = 1.0;

for ( n = 1; n<= m ; ++n )....

4.4 / Ðệ quy : giống như trong Pascal : hàm gọi đến chính nó.

* Ví dụ : Tính giai thừa :

giaithua ( n );

int n ;

{

if ( n = 0 ) return ( i ) ;

else return (giaithua ( n - 1 )*n );

}

- Chương trình sử dụng đệ quy thì dễ hiểu nhưng không tiết kiệm được bộ nhớ, không nhanh hơn.

4.5/ So sánh Lệnh trong Pascal và trong lập trình ngôn ngữ C.

- Giống nhau : + Cả Pascal và C đều có chương trình con.

- Khác nhau :

Pascal Ngôn ngữ C

Có thủ tục Chỉ có hàm

Có hàm Hàm có thể khai báo kiểu void ( không trả về giá trị nào cả, giống như thủ tục của Pascal

- Khai báo hàm

function Tên hàm (<danh sách biến) < kiểu hàm>;

< Khai báo các biến cục bộ>

Begin

< Các câu lệnh>

end; < Kiểu> tên hàm ( < danh sách các biến>)

{

< khai báo các biến cục bộ>

Các câu lệnh

}

Khai báo biến

<tên biến >: < kiểu biến>;

Ví dụ : Function max ( a, b : integer ) : integer

Begin

if a > b then max = a

Else max = b ;

End.

Trả về giá trị bằng phép gán max = giá trị ( trong đó max là tên hàm ). Khai báo biến

< kiểu biến> < tên biến >;

Ví dụ : int max ( a, b )

{

If ( a > b ) return ( a );

else return ( b );

}

- Trả về giá trị bằng câu lệnh return ( giá trị)

Kiểu tham số

+ Tham biến : truyền theo địa chỉ

+ Tham trị : truyền theo giá trị.

Tham biến trong Pascal

Procedure swap ( var x, y : real );

Var temp : real ;

Begin

Temp : = x ; x : = y ; y : = temp;

End.

- gọi hàm : swap ( a, b) Kiểu tham số

+ Chỉ có tham trị.

+ Muốn có tham biến bằng cách đưa con trỏ hình thức tham biến trong C.

Tham biến trong C

Void swap ( float *x, float * y )

{

float temp ;

temp = * x ; *x = * y ; * y = temp ;

}

swap ( &s, &b )

CHƯƠNG 5 : MẢNG VÀ BIẾN CON TRỎ
5.1/ Mảng : là tập hợp của các biến cùng kiểu được xếp liên tiếp nhau trong bộ nhớ trong.
5.1.1/ Mảng 1 chiều :
a/ Khái niệm : < kiểu phần tử > < tên mãng> [ < chỉ số > ]
Ví dụ : int a [5 ] ; => a [0] a[1] a[2] a [3] a [4] ( chỉ số chạy từ 0 đến n - 1 ).
Char S [20] ; => 'A' 'B' ...... 'X '
S[0]S[1] S[19]
b/ Cách nhập số liệu cho mảng từ bàn phím ( có thể dùng hàm Random C).
+ Mảng số nguyên :
Ví dụ : Nhập vào mảng số nguyên 5 phần tử
#include < stdio.h>
#include < conio.h>
#define n 5
main ()
{
int a [ n ] ; int i ;
for ( i = 0 ; i < n ; i ++ )
{
printf ( " a [ %d ] = " , i ); scanf ( " % d" , & a [ i ]);
}
/* Xuất số liệu mảng ra màn hình */
for ( i = 0 ; i < n ; ++ i)
printf ( " \\ n a [ % d ] = % d ", i , a [ i ]);
getch ();
}
+ Mảng số thực float :
#include
#include < conio.h>
#define n 5 ;
main ()
{
float a [ n ] , tam ;
.....scanf ( " % f " , &tam) ; /*nhập qua biến trung gian tạm */
a [ i ] = tam ;
c/Khởi tạo mảng :
a [ 5 ] = { 1,2,3,5,4 }a[0]=1 a[2]=2 .. a[4]=4
d/ Mảng ký tự :
- là chuỗi ký tự kết thúc bằng ký tự NULL có mã ASCII là 0 .
- Ví dụ : char S [3] = { 'L', '0', 'P'] : chuỗi này không đúng do thiếu chỗ cho ký tự kết thúc là NULL.
- Ta có thể gán :
char S [ 4 ] = " Lop "; Ngôn ngữ C sẽ tự động ghi ký tự kết thúc là NULL, tức là ' \\0 '.
char S[ ] = " Lop " ; Không cần khai báo số phần tử mãng.
* Ví dụ 1 : Nhập vàò một mảng số nguyên sau đó sắp xếp theo thứ tự tăng dần :
#include < stdio.h>
#define n 5
main ( )
{
int a [ n ] ; int i , j, t ;
for ( i = 0 ; i > n ; i ++ );
{
printf ( " nhập a [ % d] = " , i ); scanf ( " %d", & a [i ]);
}
/* Sắp xếp tăng dần */
for ( i = 0 ; i < n - 1 ; i ++)
for ( j = i + 1 ; j < n ; j ++ )
if ( a [ i ] < a [j ] )
{
t = a [ i ] ; a [ i ] = a [ j ]; a [j ] = t ;
}
/* in kết quả */
for ( i = 0 ; i < n ; i ++ )
printf ( " % 5d " , a [ i ] );
getch ( );
}
Ví dụ 2 : Làm lại ví dụ 1 nhưng viết riêng hàm sắp xếp và truyền tham số cho mảng 1 chiều
#include
#include
#define N 5
void sapxep ( int a [ ] , int n );
void main ( )
{
int a [ N ] ; int i ;

/* nhập 1 số liệu cho mãng */

for ( i = 0 ; i < N , i ++ )

{

printf ( " A [ %d ] = ", i ); scanf ( " %d ", & a [ i ] ); }

/* gọi hàm sắp xếp để sắp tăng dần */

sapxep ( a, N );

/* in kết quả */

for ( i = 0 ; i < N ; i ++ )

printf ( " %5d ", a [ i ] );

getch ( );

}

/* hàm sắp xếp tăng dần */

void sapxep ( int a [ ], int n )

{

int i, j, t ;

for ( i = 0 ; i > n - 1 ; i ++)

for ( j = i + 1 ; j < n ; j ++ )

if ( a [ i ] > a [ j ]

{

t = a [ i ] ; a [ i ] = a [ j ] ; a [j ] = t ;

}

* Ví dụ 3 : chuyển đổi 1 chuỗi ký tự thường thành Hoa.

Chú ý : + Hàm tolower ( ch ) : đổi 1 ký tự ch thành thường.

+ Hàm toupper ( ch ) : đổi ký tự ch thành Hoa.

+ Cả 2 hàm trên đều năm trong thư viện : < ctyte.h>

Giải : #include < stdio.h>

# include < ctyte.h>

#define n 20

main ( )

{

char s [ n ] ; int i ;

for ( i = 0 ; i < n ; i ++ )

s[ i ] = toupper ( getchar ( ) ) ; /* nhập ký tự và đổi thành hoa lưu vào mãng */

/* kết xuất chuỗi s */

for ( i = 0 ; i < n ; i ++ )

putchar ( s [ i ] ) ; /* putchar ( ch ) : in ký tự ch ra màn hình */

getch ( )

}

Bài tập : 1/ viết chương trình nhập số liệu cho mảng A gồm N phần tử và mảng B gồm n phần tử , sau đó ghép 2 mãng A và B thành mãng C gồm m + n phần tử và sắp xếp tăng dần ( Bài này phải dùng hàm nhập số liệu cho mảng và hàm sắp xếp).

- Tính tổng các phần tử âm, dương, số chẳn, số lẽ và tổng tất cả các phần tử của mãng

C [ m + n ].In các số lẻ trên 1 hàng và các số chẵn trên 1 hàng.

- Nhập vào một giá trị và tìm xem giá trị đó có thuộc vào mãng C không. Nếu có in ra tất cả các phần tử tìm được.

5.2/ Mãng nhiều chiều :

a/ Khai báo : < kiểu phần tử > < tên mãng > [ < chỉ số hàng > ] [ < chỉ số cột >]

*Ví dụ 1 : int a [ 3 ] [ 2 ] ; float b [ 3 ] [ 4 ] ; char c [5 ] [6 ] ;

=> a [ 0 ] [0 ] a [ 0 ] [ 1 ]

a [ 1 ] [ 0 ] a [ 1 ] [ 1]

a [ 2 ] [ 0 ] a [ 2 ] [ 1 ]

Ví dụ 2 : #define Hang 5

# define Cot 6

int a [ Hang ] [ Cot ] ;

=> ta có các biến chạy i ( chỉ số chạy từ 0 đến ( Dong - 1)).

ta có các biến chạy j ( chỉ số chạy từ 0 đến ( Cot - 1 )) .

a [0] [0] a [0][1] ...... a [ 0 ][Cot - 1]

a [1] [0] a [1][1] ...... a [a][Cot - 1]

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

a[Dong-1][0]...... . . . . . . . . a[Dong-1][Cot-1]

*Ví dụ : Viết chương trình tính tổng, tích các số trong mãng số thực a[3][2] ;

#include < stdio.h>

#define N 3

#define N 2

main ( )

{

int i , j ; float a [M][N] ; float tong, tich, tam ;

/* nhập số liệu */

for ( i = 0 ; i < M ; i ++ )

for ( j = 0 ; j < N ; j ++ )

{ printf ( " nhập a [ %d][%d] = " , i , j );

scanf ( " %f " , & tam ) ; a [i][j] = tam ;}

/* tính tổng */

Tong = 0 ; Tich = 1;

for ( i = 0 ; i < M ; i ++ )

for ( j = 0 ); j < N ; j ++ )

{

Tong = Tong + a [ i ][j] ; Tich = Tich * a [i][j] ; }

/* in kết quả */

printf ( " Tổng là tổng = %f, TONG );

printf ( " tích là TICH = %F, TICH );

getch ( ) ;

}

b/ Truyền tham số mãng nhiều chiều cho hàm ( tham số thực là tên mãng nhiều chiều )

- giả sử a là mãng 2 chiều : float a[M][N]

+ Chương trình gọi :

{ float a [M][N]

Tong ( a ) ; ( truyền địa chỉ của mãng cho hàm )

}

+ Chương trình bị gọi ( chương trình con ) :

float tong ( float a[ ][N] ) /* khai báo đối để nhận địa chỉ của mãng */

{

}

Note : hàm tong chỉ dùng được đối với các mãng hai chiều có N cột và số hàng không quan trọng, không khai báo ) :

* Ví dụ : Viết chương trình tính tổng của 2 ma trận cấp m x n theo công thức :

C[i][j] = a[i][j] + b [i][j]

#include

#define m 3

#define n 4

/* các prototype ( khai báo hàm )*/

void nhap ( int a[ ][N] , int M, int N );

void TongMT ( int a[ ][N], int b[ ][N] , int c [ ][N], int M , int N );

void InMT ( int c [ ][N], int M, int N );

/* chương trình chính */

{ int a [M][N], b[M][N], c[M][N] ;

/* gọi các hàm */

Nhap ( a, M ,N ) ; nhap ( b, M,N);

TONGMT ( a, b, c , M, N );

InMT ( c, M, N );

Getch ( ) ;

}

/* Hàm nhập số liệu cho mãng 2 chiều m x n phần tử */

void Nhap ( int a [ ][N] , int M , int N )

{

int i , j ;

for ( i= 0 ; i < M ; i ++ )

for ( j = 0 ; j < N ; j++ )

{

printf ( " a[%d][5d] = " , i , j ) ; scanf ( " %d " , &a [i][j]) ; }

return ;

}

Void TongMT ( int a [ ][N], int b [ ][N], int c [ ][N], int M , int N )

{

int i, j ;

for ( i = 0 ; i < M ; i ++ )

for ( j = 0 ; j < N ; j ++ )

c [i][j] = a [i][j] + b [i][j] ;

return ;

}

/* in kết quả */

void inMT ( int c[ ][N], int M, int N )

{

int i, j ;

for ( i = o ; i < M ; i ++ )

{ for ( j = 0 ; j < N ; j ++ )

printf ( " % 3d", a[i][j] );

printf ( " \\n " ) ; /* xuống dòng */

}

return ;

}

BàI TậP MãNG :

1/ cho mãng 2 chiều A, là ma trận vuông cấp n x n , lập chương trình :

a/ tính tổng tất cả các phần tử dương của mãng.

b/ tính tổng các phần tử A[i][j] mà i + j chia hết cho 5 .

c/ In ra các số nguyên tố theo từng hàng.

d/ Sắp xếp theo hàng.

e/ Sắp xếp theo cột .

f/ Tính tổng các phần tử trên đường chéo ( i = j ) , đường biên.

g/ Tìm max ; min theo từng hàng, cột và toàn bộ ma trận.

2/ Một chuỗi gọi là palindrone nếu nó không thay đổi khi ta đảo ngược thứ tự của các ký tự trong nó ( ví dụ " 12321 " )

. Lập chương trình đọc một chuỗi ( xâu ) ký tự và xác định xem có tính palondrone không.





5.3/ Biến con trỏ :

5.3.1/ Khái niệm con trỏ ( pointer ) và địa chỉ :

- Mỗi biến trong ngôn ngữ C đều có 1 tên và tương ứng với nó là một vùng nhớ dùng để chứa giá trị của nó. Tuỳ theo biến mà vùng nhớ dành cho biến có độ dài khác nhau. Ðịa chỉ của biến là sô thứ tự của byte đầu tiên tương ứng với biến đó. Ðịa chỉ của biến có kiểu khác nhau là khác nhau. Ðịa chỉ và biển kiểu int liên tiếp cách nhau 2 byte , biến kiểu float là 4 byte.

- Con trỏ là biến dùng để chứa địa chỉ của biến khác hoặc có thể là một hàm. Do có nhiều loại địa chỉ nên cũng có nhiều loại biến con trỏ. Con trỏ kiểu int dùng để chứa địa chỉ của kiểu int. Con trỏ kiểu float dùng để chứa địa chỉ kiểu float.

- Muốn sử dụng được pointer, trước tiên phải có được địa chỉ của biến mà ta cần quan tâm bằng phép toán lấy địa chỉ & . Kết quả của phép lấy địa chỉ & sẽ là 1 phần tử hằng.

* Ví dụ : int num ; => &num là địa chỉ của num.

int pnum ; /* pnum là 1 pointer chỉ đến một int */

pnum = & num ; /* pnum chứa địa chỉ biến int num*/

giả sử : num = 5 ; => * pnum = 5 /* do * là toán tử nội dung */

Hai câu lệnh sau đây là tương đương

Num = 100 ;

( * pnum ) = 100 ;

- Quy tắc khai báo biến con trỏ : < kiểu dữ liệu> * < tên biến con trỏ >

*Ví dụ 2 : int a, *p ;

a = 5 ; /* giả sử địa chỉ của a là < 106 > */

p = & a ; /* p = <106> */

p = a ; /* phép gán sai */

* p = a ; /* phép gán đúng */

scanf ( " %d " , &a ) ; tương đương scanf ( " %d , p ) ;

5.3.2/ tính toán trên biến con trỏ ( pointer )

a/ Hai biến con trỏ cùng kiểu có thể gán cho nhau :

Ví dụ 1 : int a, * p, *a ; float * f;

a = 5 ; p = &a ; q = p ; /* đúng */

f = p ; /* sai do khác kiểu */

f = ( float * )p ; /* đúng nhờ ép kiểu con trỏ nguyên về kiểu float */

Ví dụ 2 : int a ;

char *c ;

c = &a ; /* sai vì khác kiểu */

c = ( char*) /* đúng */

b/ Một biến pointer có thể được cộng, trừ với một số nguyên ( int , long ) để cho kết quả là một pointer.

* Ví dụ : int a , *p , * p10 ;

a = 5 ;

p = &a ;

p10 = p + 10 ;

Ví dụ : int V[10] ;/* mãng 10 phần tử */

int *p ;

p = & V[0];

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

{ *p = i ; /* gán giá trị i cho phần tử mà p đang trỏ đến */

p ++ /* p được tăng lên 1 để chỉ đến phần tử kế tiếp */

}

/* kết quả V[0] = 0 , V [ 1] = 1 ... V[9] = 9 * /

c/ Phép trừ 2 pointer cho kết quả là một số int biểu thị khoảng cách ( số phần tử ) giữa 2 pointer đó.

d/ Phép cộng 2 pointer là không hợp lệ, pointer không được nhân chia với 1 số nguyên hoặc nhân chia vơi nhau.

e/ p = NULL : là con trỏ p không trỏ đến đâu cả.

Chú ý : không được sử dụng biến con trỏ khi chưa được khởi gán .

Ví dụ : int a , *p ;

Scanf ( "%d", p ) ( sai )

=> thay bằng các lệnh : p = &a và scanf ( "%d" p ) ( đúng)

5.4/ Con trỏ mảng :

5.4.1/ Mãng 1 chiều và con trỏ :

- Trong ngôn ngữ C : giữa mãng và con trỏ có mối quan hệ chặt chẽ. Các phần tử của mãng có thể xác định nhờ chỉ số hoặc thông qua con trỏ.

- Ví dụ : int A[5] ; * p ;

P = A ;

+ mãng bố trí 5 ô nhớ liên tiếp ( mỗi ô chiếm 2 byte ).

+ Tên mãng là 1 hằng địa chỉ ( không thay đổi được ), chính là địa chỉ của phần tử đầu tiên. => A tương đương với &A[0]

(A + i ) tương đương với &A[i]

*(A + i ) tương đương với A[i]

p = A => p = &A[0] ( p trỏ tới phần tử A[0])

*(p + i ) tương đương với A[i].

=>bốn cách viết như sau là tương đương : A[i], * ( a + i ), * ( p + i ), p[i].

Ví dụ 2 : int a [5] ; *p ;

p = a ;

for ( i = 0; i < 5 ; ++ i)

scanf ( " %d ", &a[i]); ( 1)

scanf ( " %d ",a + i ); ( 2)

scanf ( " %d", p + i ); ( 3)

scanf ( " % d", p ++ ); ( 4)

scanf ( " %d ", a ++ ); sai vì địa chỉ của a là hằng.

- Các lệnh (1), (2), (3), (4) tương đương nhau.

Ví dụ 3 : Nhập 5 số nguyên vào 1 mãng gồm 5 phần tử ( a[5]) sau đó sắp xếp tăng dần, in ra số lớn nhất vf nhỏ nhất và tính tổng của 5 số đó.

#include

#define n 5

main ( )

{ int a [n], t , *p, i , j, ; int s ;

p = a ;

for ( i = 0; i < n ; i ++ )

{ printf ( " a[%d] = " , i ) ; scanf ( " %d ", p + i ) }

/* Sắp xếp tăng dần */

for ( i = 0 ; i < n-1 ; i ++ )

for ( j = i + 1 ; j

CHƯƠNG 6 : MỘT SỐ HÀM TRÊN CHUỖI KÝ TỰ



6.1/ Ký tự ( character ) :

- Ví dụ : char ch , ch1 ;

ch = 'a' ; /* Ðúng : ký tự chữ */

ch1 = '1' /* đúng : ký tự số */

- Ví dụ 2 : scanf ( "%c", &ch ) ; /* gõ A và Enter */

printf ("%c", ch) ; /* In ra chữ A */

printf("%d", ch) ; /* In ra 65 là mã ASCII của A */

* Hàm dùng cho kiểu ký tự :

char ch ;

ch = getchar ( ) ; ( Nhập 1 ký tự từ bàn phímm sau khi ấn Enter và ký tự nhập vào không hiện lên màn hinh ).

putchar (ch) ; in ký tự nằm trong biến ch ra màn hình.

putch ("\n") ; đưa dấu nháy về đầu dòng.ch = getche ( ) ; Nhập 1 ksy tự từ bàn phím và ký tự nhập vào sẽ hiển thị trên màn hình.



6.2/ Chuỗi ký tự : Ngôn ngữ C quan niệm 1 chuỗi ký tự là một mãng ký tự kết thúc bằng ký tự NULL ('\0') mã ASCII là 0.

- Ví dụ : char s[10] L E V A N A '\0'

s[0] s[1 ] s[3] s[4] s[5] s[7] s[8]

- Muốn nhập chuỗi ta thường dùng hàm gets(s)

- Muốn in chuỗi ta thường dùng hàm puts(s) : in xong xuống dòng.

6.3/ Một số hàm trên chuỗi : các hàm cơ bản trong thư viện string.h

a/ gets(s1) : nhập dữ liệu vào chuỗi s1.

b/ n = strlen(s1) : cho biết độ dài của chuỗi s1.

c/ n= strcmp (s1,s2) : so sánh 2 chuỗi s1,s2 ( so theo mã ASCII từng ký tự ).

+ nếu n>0 : s1> s2

n = 0 : s1=s2

n < 0 : s1<s2.

d/ strcpy ( đích , nguồn ) ; chép chuỗi nguồn vào chuỗi đích, gán chuỗi.

- Ví dụ : char [30] ;

Ten = "Nguyễn Văn Ðông "; ( sai ).

strcpy ( ten , "Nguyễn Văn Ðông ");

gets (ten ) : Nhập vào từ bàn phím.

e/ strcat (s1,s2) : nối s1 và s2 .

- Ví dụ : giá trị cảu s1 : " ABC" ; s2 : " ABE" => strcat(s1,s2 ) ; => " ABCABE";

f/ m = strncmp (s1, s2, n ) ; so sánh n ký tự đầu tiên của chuỗi s1 với s2.

- Ví dụ : m = strncmp ( s1, s2, 2 ) ; thì m = 0 do 2 ký tự đầu của chuỗi là :

+ s1 : "ABC" và s2 : " ABE" là giống nhau.

g/ strnpy ( s1, s2, n ) ; chép n phần tử đầu tiên của chuỗi s2 vào chuỗi s1.

- Ví dụ : strnpy ( s1, "xyz", 2 ) ;

Puts (s1); -ă " xyC".

h/ strncat ( s1,s2, n) ; nối n phần tử đầu tiên của s2 vào đuôi s1.

- Ví dụ : strncat ( s1 , "xyz", 2);

Puts(s1) ; => "ABCxy".

* Chú ý : + char s1[10], s2[4]

+ strcpy (s1,"ABCDE");

+ strcpy(s2,"ABCDE"); => "ABCD" ( do s[4] = "\0").

i/ Hàm strstr :

- char *p ;

p = strstr (s1,s2);

- Tìm xem chuỗi s2 có trong s1 hay không. Nếu có thì in ra cuỗi s1 tại vị trí đầu tiên mà nó thấy. Nếu không có thì in ra giá trị NULL.

- Ví dụ : s1: "abc abc ac"

s2 : "bc", s3 = "cd"

p= strstr (s1,s2);

puts (p) ; => " bc abc ac "

p = strstr ( s1, s3)

Ðoán thử puts(p) ; => p[(NULL)] .

k/ d= atoi ( chuỗi số ) ; chuyển chuỗi số thành int.

f = atof ( chuỗi số ) ; chuyển chuỗi số thành số thực( float ).

l = atol(chuỗi số ); chuyển chuỗi số thành long ( nguyên 4 byte).

- Ví dụ : char s[20] ;

Gets (s) ; nhập vào s từ bàn phím chuỗi " 123.45"

d=atoi(s) ; thì d = 123.

F = atof(s); thì f = 123.45

l/ toupper (ch) ; làm thay đổi ký tự ch thành chữ Hoa.

tolower(ch); làm thay đổi ký tự ch thành chữ thường.

* Chú ý :Muốn dùng các hàm về chuỗi phải khai báo đầu chương TRÌNH #INCLUDE &LT;STRING.H&GT;



BàI TậP :



1/ Nhập vào chuỗi sau đó xoá các khoảng trắng xong in ra màn hình.

2/ Nhập chuỗi và xoá các khoảng trắng thừa phía trước, sau và giữa 2 từ gút lại 1 khoảng trắng.

3/ Viết hàm nhập vào một chuỗi sau đó đổi ký tự đầu mỗi từ (chữ) thành Hoa, các ký tự còn lại của 1 từ là chữ thường.

4/ Nhập chuỗi password nếu kiểm tra đúng mới cho chạy chương trình đếm số từ trong 1 chuỗi số nguyên âm, phụ âm.

5/ Ðảo thức tự các từ của chuỗi. Ví dụ : s1="con mèo con cắn con chó con" đổi thành s2=" con chó con cắn con mèo con".

CHƯƠNG 7 : KIỂU CẤU TRÚC
- Khái niệm : Cấu trúc là một kiểu dữ liệu kiểu bản ghi(record) , cho phép nhiều loại dữ liệu được nhóm lại với nhau. ( Khái niệm cấu trúc trong C tương tự như pascal hay Foxpro).
7.1/ Khai báo kiểu cấu trúc :
a/ struct tên _ kiểu cấu trúc
{
khai báo các thành phần của nó ( các field và kiểu dữ liệu của field)
} < danh sách biến>;
- Ví dụ 1 : struct kieu HV ò-> tên kiểu cấu trúc.
{ char Ten[30] ;
int namsinh ;float diemTB ;
} HV ; ( biến HV)
- Ví dụ 2 : struct kieu HV
{
các thành phần
}
struct kieu HV HV ; /* khai báo biến theo cách 2 */
b/ Dùng toán tử typedef để khai báo kiểu cấu trúc ( định nghĩa kiểu mới) ;
- Ví dụ 3 : typedef struct
{ char Ten[30]

int namsinh ;

float diemTB ;

} kieu HV ;

kieu HV Hoc vien ;

kieu HV DSLop[20];

kieu HV Lop[ ] = { { "nguyễn văn Ðông", 1980, 10.0},

{ " Trần văn Tây", 1982, 5.5},

{ " Phạm văn Nam ", 1979, 9.5}

};

- Ví dụ 4 : struct ngay{

int ngay ;

char Thang[10];

int nam ;

} ;

type struct

{ char Ten[30] ;

ngay namsinh ; /* thành phần cấu trúc có kiểu cấu trúc*/

float diemTB;

} kieu HV ; kieu HV HV;

* Chú ý :

- Khai báo struct phải nằm ở vị trí toàn cục của chương trình, thường sau các #include.

- Cấu trúc thường dùng để xây dựng một bảng các cấu trúc.

+ Ví dụ : kieu HV DSLop[30] ; struct kieu HV person[50];

- Có thể truyền cấu trúc như một tham số hình thức, nhưng với những cấu trúc kích thước lớn sẽ không tối ưu về thời gian lẫn độ nhớ. Khi không nên sử dụng con trỏ cấu trúc.

+ Ví dụ : struc kieu HV *HV ;

7.2/ Truy cập đến các thành phần của kiểu cấu trúc :

Tên cấu trúc. Tên thành phần

Hoặc Tên cấu trúc. Tên cấu trúc con. Tên thành phần.

- Ví dụ : + nhập vào tên, năm sinh, điểm cho biến cấu trúc học viên ( ví dụ 3).

gets(hoc vien.ten) /* nhập " Phạm thị Bắc" và Enter */

scanf("%d ", & hoc vien.namsinh );

scanf("%f", &tam); hoc vien.diem = tam; (*)

+ Nhập năm sinh cho biến học viên ở ví dụ 4 :

scanf("%d",&hv.ngay.namsinh);

* Chú ý : Nếu các thành phần không phải là nguyên(int) => nhập qua trung gian như (*).

puts(hoc vien.ten); => " Phạm thị Bắc"

printf("%d%f", hoc vien.namsinh, hoc vien.diemTB);

* Lệnh gán : + Ta có thể gán 2 biến cấu trúc có cùng kiểu cho nhau :

Ví dụ : hv2=hv1;

+ Gán giá trị đầu cho biến cấu trúc và khai báo một mãng cấu TRÚC( XEM VÍ DỤ 3)

BàI TậP : viết chương trình nhập danh sách học viên gồm các trường họ tên, tuổi, điểm, và tìm kiếm trong dánhách có ai tên " Phạm Tèo " không.

Tên Tuổi điểm

HV [ 0] Nguyễn A 20 5.5

HV [1] Trần B 22 6.5

HV [2] Phạm Tèo 25 8.5

HV [3] Lê C 21 7.5

#include

#define n 10

typedef struct

{ char Ten[30];

int tuoi ;

float diem ;

} kieu HV ;

kieu HV HV[11]

void main( )

{ int i ; float tam ; kieu HV HV;

/* nhập dữ liệu cách 1*/

for ( i = 0 ; i < n ; i++)

{ printf ("\\n Nhập số liệu cho học viên thứ %d", i ) ;

printf (" Họ và tên = " ) ; gets ( hv[i].ten);

printf ("tuổi = "); scanf ( "%d" , &hv[i].tuoi);

printf("điểm = "); scanf ("%f*c", &tam ); hv[i].diem = tam ;

}

/* cách 2 nhập vào biến cấu trúc và gán hv[i] = h */

for ( i = 0 ; i

CHƯƠNG 8 : TRUYỀN SỐ LIỆU CHO HÀM



1/ Truyền đối số cho hàm main( ) :

- Ví dụ : ta muốn viết một chương trình có tên là Hello.că hello.exe khi chạy trên MS-DOS ta nhập các đối số vào chương trình. Ví dụ : c:> Tom and Jerry ( enter) máy sẽ in ra câu :

Chào Tom and Jerry.

- Viết chương trình trên như sau :

Void main ( int argc, char*argv[ ])

{

......

}

Trong đó :

+ argc : cho biết tổng số đối số truyền vào tính cả tên chương trình đối với ví dụ trên argc = 4. Mỗi đối số truyền vào được xem như là xâu ký tự.

+ mãng argv [ ] sẽ là con trỏ , trỏ lần lượt đến các đối số.

argv[0] -->"Hello"

argv[1] --> "Tom"

argv[2] --> "and"

argv[3] --> "Jerry"

void main ( int argc, char *argv[ ])

{ int i ;

printf("Chào !");

for ( i=1 ; i < argc ; i++)

printf("%s", argv[ i]);

}

2/ Truyền cấu trúc cho hàm - Hàm trên các cấu trúc :

- Chương trình gọi nhập học viên(HV).

- Chương trình bị gọi void nhap ( struct Kiểu HV HV[ ])

Hoặc void nhập (Kiểu HV HV[ ])

- Ví dụ : nhập danh sách lớp :

#include<stdio.h>

#include<conio.h>

#include<string.h> #define N 100

typedef struct

{ char ten[20] ; int tuoi ; float diem ; } kieu HV

/* khai báo hàm nhập dữ liệu*/

void nhap ( int n , Kieu HV HV [ ] )

{int i ; float t;

for ( i = 0; i< n ; i++)

{ printf ( " Nhập hv thử %d ", i++); scanf(....) }

/* chương trình chính */

main ( )

{ Kieu HV hv[n];

nhap ( n, hv);

}

* Hàm có thể trả về giá trị cấu trúc hoặc con trỏ cấu trúc :

+ Ví dụ : Hàm Kieu HV *ptim ( char*ten, KieuHV HV[ ] , int n) : có tác dụng tìm trong danh sách n học viên trong mãng HV[ ] người có tên và hàm trả về con trỏ, trỏ tới người tìm được hoặc trả về NULL nếu không tìm thấy .

+ Hàm Kieu HV tim( char*ten, KieuHV HV[ ], int n); : cũng với mục đích như hàm trên nhưng trả về giá trị của một cấu trúc.

+ Ví dụ :

#include"stdio.h"

#include"conio.h"

#include"string.h"

typedef struct

{ char ten[20] ; int tuổi ; float điểm } Kieu HV ;

Kieu HV *ptim ( char*ten, KieuHV HV[ ] , int n );

Kieu HV tim ( char *ten, Kieu HV hv[ ] , int n );

main( )

{ Kieu HV *p, ds[100],h ; int i, h, n ; char ten[20] ; float diem;

clrscr ( );

printf("\n Số người n = " ) ; scanf ("%d *c ",&n);

for ( i=0 ; i<n ; ++i)

{ printf("\họ tên "); gets(h.Tên) ; /* tự viết lấy*/

ds[i] = h ;

}

/* tìm kiếm 1 theo ten dùng hàm ptim*/

while (1)

{ printf ("\n Họ tên người cần tìm"); gets (tên);

if ((p =ptim ( ten, ds, n)) = = NULL)

printf("\n không tìm thấy ");

else

indanhsach(*p);

}

/* tìm kiếm theo tên dùng hàm tim*/

while(1)

{ printf("\n Họ tên cần tìm "); gets(ten);

if ( tim ( ten, ds, n).ten[0] = = 0 )

printf("\n Không tìm thấy");

else indanhsach ( tim ( ten, ds, n));

}

Kieu HV *ptim ( char*ten, Kieu HV hv[ ] , int n)

{ int i ;

for ( i= 0 ; i< n ; ++i)

if ( strcmp ( ten, hv[i].ten= = )return (&hv[ i]);

return (NULL);

}

Kieu HV tim (char*ten, Kieu HV hv[ ] , int n)

{ int i ; HV tam ;

tam.ten[0]=0;

for ( i=0 ; i<n ; ++i)

if(strcmp(ten,hv[i].ten = = )) return (hv[i]);

return ( tam);

}

void indanhsach (Kieu HV p)

{ printf("\n Họ tên % tuổi % điểm %f", p.ten, p.tuổi, p.diêm);

}

CHƯƠNG 9 : DANH SÁCH LIÊN KẾT ( MÓC NỐI)



- Danh sách liên kết : Nếu sử dụng mãng để quản lý danh sách sẽ rất tốn kèm và cứng nhắc trong thao tác ă khắc phục = danh sách liên kết.

- Danh sách liên kết gồm các phần tử . Mỗi phần tử có 2 vùng chính : vùng dữ liệu và vùng liên kết. Vùng liên kết là một hay nhiều con trỏ, trỏ đến các phần tử trước hoặc sau nó tùy thuộc vào yêu cầu của công việc.

- Khai báo danh sách liên kết :

Typedef struct Kieu du lieu

{ ;

Kiểu dữ liệu < các con trỏ >;

} Kiểu dữ liệu ;

- Dùng typedef struct kieu du lieu định nghĩa kiểu dữ liệu mới. Trong kiểu dữ liệu này có 2 phần, phần đầu tiên là phần khai báo các trường, phần thứ 2 là các con trỏ, trỏ đến chính kiểu dữ liệu đó, dòng cuối cùng là cần thiết để các con trỏ được phép khai báo chính là kiểu dữ liệu mà các con trỏ đó là thành phần.

- Ví dụ : typedef struct sinhvien

{ char hoten[30] ;

int diem ;

struct sinhvien *tiep ;

} sinhvien ;

sinhvien *head ; / con trỏ đặc biệt luôn trỏ tới đầu danh sách*/

- Mỗi một phần tử có một con trỏ, trỏ đến phần tử tiếp theo. Riêng phần tử cuối cùng con trỏ sẽ trỏ đến một kiểu đặc biệt : Kiểu NULL( nghĩa là con trỏ đó không trỏ đến một phần tử nào cả). Ban đầu con trỏ danh sách (head) được gán bằng NULL.

- Ðể cấp phát bộ nhớ, ta cần kiểm tra xem có đủ không ( tránh rối loạn chương trình)

- Ví dụ :

#define size of (sinhvien)

sinhvien *sv

sv=NULL ;

if ((sv = (sinhvien*)malloc (size sv) = = NULL)

{ printf (" không đủ bộ nhớ RAM \n");

getch ( );

return ;

}

- Hàm size of ( kiểu phần tử ) cho kích thước của kiểu phần tử bằng byte.

sv là con trỏ phụ cần thiết cho các thao tác trong chương trình. size sv có kích thước bằng vùng nhớ một phần tử ( nhờ sử dụng hàm size of( )). Cần gán sv = NULL đề phòng sinhvien đang trỏ vào một phần tử của danh sách. Khi thêm vào, chương trình sẽ tự động tìm vị trí thích hợp của phần tử mới. Do trong ngôn ngữ C không định nghĩa kiểu string như trong PASCAL, nên càn dùng hàm so sánh strcmp(st1,st2). Hàm này cho kết quả kiểu int sau khi so sánh st1 và st2 như sau :

< 0 nếu st1 < st2.

= 0 nếu st1 = st2.

> 0 nếu st1 >st2.

- Các trường hợp xảy ra khi thêm một phần tử vào một danh sách :

+ Nếu phần tử mới ở đầu danh sách , cần sửa lại con trỏ head.

+ Nếu đã có phần tử đó, phải lựa chọn liệu có ghi đè lên không?

+ Các trường hợp khác cần sửa lại con trỏ như sau : Giả sử cần chèn phần tử mới vào giữa phần tử 1 và 2 ta có :

......

- Ví dụ : Chương trình qủan lý sinh viên gồm : thêm, bớt, duyệt danh sách, tìm kiếm phần tử

/*********************

Chương trình qủan lý sinh viên

***********************/

#include

#include

#include< stdlib.h>

#include

#include

void taomenu( )

void themsv ( );

void timkiem ( );

void loaibo( );

void danhsach( );

void vitrihv (char st[ ], int d ); /* tìm vị trí hợp lý */

void lietke ( );

#define sizesv size of (sinhvien)

typedef(truct sinhvien)

{ char hoten[30] ;

int diem ;

struct sinhvien *tiep ;

} sinhvien ;

sinhvien *head;

sinhvien *sv ;

void main ( )

{ clrscr ( );

gotoxy(1,12);

printf (" chương trình quản lý danh sách sinh viên (DSLK)\n");

getch ( ) ;

taomenu ( );

} /* kết thúc hàm main ( ) */

void taomenu ( )

{ char ch ;

do

{ clrscr( );

printf(" thêm sinh viên tìm kiếm loại bỏ liệt kê Quit \n");

ch = toupper (getch());

switch (ch)

{ case "I' :themsv() ;break ;

case ' I ' : timkiem( ) ; break ;

case ' L; : loaibo( ) ;break ;

case ' D' : lietke( ) ; break ;

case ' Q ' : exit (1) ; break ;

default : break ;

}

}

while ( ch!= 'Q');

}

void themsv ( )

{ char tensv [30] ; int diem ;

clrscr ( );

printf(" thêm sinh viên vào danh sách \n");

gotoxy(1,10) ; printf(" họ và tên : "); gets( tensv);

printf("điểm :"); scanf("%d", &diem);

vitrihv ( tensv, diem);

}

void vitrihv( char st [ ] ) int d )

{ sinhvien *find = NULL , *next = NULL; int kq ; char ch ;

sv = NULL ;

if ((sv = ( sinhvien*) malloc ( sizesv )) = = NULL)

{ printf(" không đủ bộ nhớ \n") ; getch( ) ; return }

strcpy ( svă hoten, st);

svă diem = d ;

/* nếu danh sách ban đầu là rỗng */

if ( head = = NULL)

{ head = sv ; headă tiep = NULL ; }

else

{ /* tìm vị trí mới của phần tử trong danh sách */

find = head ; next = find ;

while ((find!=NULL) &&((kq=strcmp(findă hoten, sv ă hoten))< 0)

{ next = find ; find = findătiep ;}

if ( kq = = 0)

{ printf("sinh viên đã có trong danh sách . Ghi đè (Y/N) ? \n");

ch = getch( ); ch = toupper (ch);

if (ch = 'N')

{ free(sv) ; return ; }

else

find --> diem = d ;

free (sv) ;

return ;

}

/* nếu phần tử thêm vào đầu danh sách */

if (find = = head )

{ sv ă tiep = head ; head = sv ; }

else { sv ă tiep = find ; next ă tiep = sv ; }

}

}

void timkiem( )

{ char tensv[30] ; int kq ; clrscr ( );

printf(" tên sinh viên cần tìm :") ; gets(tensv);

if((tensv !=" " ) && (head1 = NULL))

{ sv = head ;

while ((sv! = NULL) &&((kq = strcmp(svăhoten, tensv))< 0)

sv = sv ă tiep ;

if(kq = = 0);

printf (" Họ và tên %s điểm %d", svăhoten, svă diem);

else printf (" không có sinh viên %s \n", tensv);

}

getch( ) ;

}

void loaibo( )

{ char tensv [30] ; int kq ; sinhvien *next ;

clrscr ( )

printf ( " tên sinh viên cần loại bỏ :"); scanf("%s", tensv );

iF((tensv!=NULL) && (head!= NULL))

{ sv = head ; next = sv ;

while ((kq = strcmp (svă hoten, tensv )) < 0)

{ next = sv ; sv = sv ă tiep ; }

if ( kq = = 0)

{ if ( sv = = head )

{ head = head ă tiep ; free (sv) ; return ; }

next ă tiep = sv ă tiep ;

free(sv);

}

else

{ printf (" không có tên %s \n", tensv );

}

}

}

void lietke( )

{ clrscr( )

sv = head ;

while ( sv! = NULL)

{ printf(" Họ và tên : %s \n" , svăhoten );

printf(" điểm : %d \n\n", svă diem);

sv = svătiep ;

}

getch( );

}



Bài tập : Hãy lập trình quản lý sinh viên sử dụng cấu trúc danh sách. Mỗi phần tử cấu trúc như sau : họ và tên, điểm.

Yêu cầu : - In danh sách sinh viên có điểm >= 7.

- Sắp xếp theo điểm .

- Loại bỏ sinh viên nào đó ( nhập tên vào ).




CÁC KIẾN THỨC CƠ BẢN CỦA NGÔN NGỮ C phần 2

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang
Trang 1 trong tổng số 1 trang
* Không dùng nh?ng ngôn t? thi?u l?ch s?.
* Bài vi?t suu t?m nên ghi rõ ngu?n.
* Tránh spam nh?m không liên quan d?n ch? d?.
Yêu c?u vi?t ti?ng Vi?t có d?u.
Permissions in this forum:Bạn không có quyền trả lời bài viết
Trường THPT Phù Cát 2 :: Khoa học tự nhiên :: Tin-
Free forum | ©phpBB | Free forum support | Báo cáo lạm dụng | Thảo luận mới nhất