Bạn quên Mật khẩu?
Hiện có 100 khách online
  • Increase font size
  • Default font size
  • Decrease font size
  • default color
  • green color
  • red color
ĐỀ CƯƠNG ÔN TẬP PHẦN LẬP TRÌNH C NÂNG CAO PDF. In Email

ĐỀ CƯƠNG ÔN TẬP PHẦN LẬP TRÌNH C NÂNG CAO

CHƯƠNG 1 – CÁC KHÁI NIỆM CƠ BẢN CỦA NGÔN NGỮ C

1.1. Từ vựng

1.2. Biểu thức

1.3. Nhập xuất dữ liệu

1.4. Cấu trúc của một chương trình C

1.5. Các tệp tiêu đề thông dụng

CHƯƠNG 2 – CÁC LỆNH ĐIỀU KHIỂN

2.1. Câu lệnh đơn

2.2. Khối lệnh

2.3. Câu lệnh if

2.4. Câu lệnh switch

2.5. Câu lệnh lặp for

2.6. Câu lệnh lặp while

2.7. Câu lệnh lặp do … while

CHƯƠNG 3 – CON TRỎ, MẢNG VÀ XÂU KÍ TỰ

3.1. Con trỏ

3.2. Liên hệ giữa con trỏ và mảng

3.3. Khái niệm xâu kí tự

3.4. Một số hàm xử lý xâu kí tự

3.5. Một số thao tác trên xâu kí tự

CHƯƠNG 4 – HÀM

4.1. Tổng quát về định nghĩa hàm

4.2. Tham số trong lời gọi hàm

4.3. Con trỏ tới hàm

a- Tổng số tiết của chương: 6 tiết                                  c- Số tiết thực hành, bài tập: 2 tiết

b- Số tiết lý thuyết: 3 tiết                                              d- Trao đổi và thảo luận: 1 tiết

CHƯƠNG 5 – KIỂU DỮ LIỆU CẤU TRÚC

5.1. Khai báo cấu trúc

5.2. Thao tác trên biến cấu trúc

5.3. Truyền biến cấu trúc cho hàm

5.4. Danh sách liên kết và cấu trúc tự trỏ

CHƯƠNG 6 - ĐỒ HỌA

6.1. Các chế độ đồ hoạ

6.2. Đặt mầu và mẫu tô cho các đường và các hình

6.3. Các hàm vẽ và tô

6.4. Khung nhìn / Cửa sổ (viewport)

6.5. Văn bản trong màn hình đồ hoạ

6.6. Cắt hình, dán hình và tạo hình ảnh chuyển động

CHƯƠNG 7 – THAO TÁC VỚI TỆP

7.1. Khái niệm

7.2. Các hàm thao tác với tệp

Tài liệu học tập và tham khảo

- Giáo trình chính:

[1].  Giáo trình Tin học C (Lập trình C nâng cao), Trường đại học Mỏ - Địa Chất, 2014

- Tài liệu tham khảo:

[2]. Giáo trình Kỹ thuật lập trình, Hoàng Kim Bảng, Trường đại học Mỏ-Địa chất, 2007.

[3]. Nguyễn Thanh Thuỷ, Trần Việt Linh, Lê Đăng Hưng, Lê Đức Trung. Nhập môn lập trình ngôn ngữ C. NXB KH&KT, 2003.

[4]. Nguyễn Châu Quốc Tâm, Cẩm Nang Tự Làm Chủ Microsoft Windows 7, NXB Thanh Niên, 2009

[5]. Phạm Văn Ất. Kỹ thuật lập trình C cơ sở và nâng cao. NXB KH&KT, 1995.


TÓM TẮT

Chương 1 – Những yếu tố cơ bản  của ngôn ngữ lập trình C

1- Các kiểu dữ liệu cơ sở

char, int, long, float, double

2- Khai báo biến

<kiểu dữ liệu> <danh sách biến> ;

Chú ý: Vừa khai báo biến vừa khởi tạo giá trị ban đầu, VD: int   i = 0 ;

- Toán tử lấy địa chỉ biến &

3- Khai báo mảng

<kiểu dữ liệu> <tên mảng> [chỉ số 1]  [chỉ số 2] …

VD: int  x[100] ;  float  a[20] [10] ;

Chú ý: Định nghĩa kiểu dữ liệu mảng bằng toán tử typedef

VD:

typedef  int  vecto [100] ;

typedef  float  matran [20] [10] ;

Khai báo mảng có kiểu vừa định nghĩa ở trên:

vecto  x, y;

matran  a, b, c ;

4- Các phép toán

a/ Các phép toán số học: +, -, *, /, %

Chú ý: Phép chia 2 toán hạng nguyên sẽ cho kết quả nguyên, VD: 1/2 cho kết quả là 0.

b/ Các phép toán quan hệ: ==, !=, <, <=, >, >= . Kết quả các phép quan hệ có thể là ≠ 0 (nghĩa là đúng), hoặc = 0 (nghĩa là sai).

c/  Các phép toán logic: &&, ||, !. Kết quả các phép quan hệ có thể là ≠ 0 (nghĩa là đúng), hoặc = 0 (nghĩa là sai).

d/ Lệnh gán: <biến>  =  <biểu thức> ;

Biểu thức gán:  <biến>  =  <biểu thức> (không có dấu chấm phẩy ở cuối).

e/ Biểu thức điều kiện: e1 ?  e2  :  e3 ;

f/ Các phép tăng, giảm 1:

n++ (dạng hậu tố)

++n (dạng tiền tố)

n - - (dạng hậu tố)

- - n (dạng tiền tố)

g/ Chuyển đổi kiểu giá trị

( <kiểu dữ liệu> ) <biểu thức>

VD: (long) sqrt (n)

h/ Một số hàm toán học thông dụng

fabs(x)

sin(x)

cos(x)

exp(x)

log(x)

log10(x)

sqrt(x)

pow(x, y)

5- Nhập, xuất dữ liệu

a/ Nhập:

- Lệnh scanf (“<xâu quy cách>” , <danh sách địa chỉ biến>);

- Hàm nhập xâu ký tự có chứa dấu cách: gets( <xâu>) ;

b/ Xuất:

Lệnh printf (“<xâu quy cách>” , < danh sách biểu thức>) ;

Một số định dạng nhập - xuất dữ liệu:

%d              cho kiểu dữ liệu int

%ld             cho kiểu dữ liệu long

%f               cho kiểu dữ liệu float

%lf              cho kiểu dữ liệu double

%c              cho kiểu dữ liệu char

%s              cho kiểu dữ liệu xâu ký tự char*

Chú ý: Định dạng xuất ra có độ rộng:

%wd           cho kiểu dữ liệu int

%ws            cho kiểu dữ liệu char *

%w.pf         cho kiểu dữ liệu float

Chương 2 – Các lệnh điều khiển

1- Lệnh đơn: Lệnh scanf, printf, lệnh gán, lệnh ++, lệnh --, lời gọi hàm…

2- Lệnh if

if ( <biểu thức> )  <lệnh> ;

if ( <biểu thức> )  <lệnh 1 >  ;  else  <lệnh 2 > ;

3- Lệnh switch

switch ( <biểu thức nguyên > )

{

case  <giá trị 1> :  <lệnh 1 > ;  break ;

case  <giá trị 2> :  <lệnh 2 > ;  break ;

. . . . .

case  <giá trị n> :  <lệnh n > ;  break ;

[default : <lệnh n+1> ;]

}

4- Lệnh lặp for

for ( <thành phần 1> ; <thành phần 2 > ; <thành phần 3> )  <lệnh> ;

VD: for (i=0; i < n; i++) s + = a[i] ;

5- Lệnh lặp while

while  ( <biểu thức> )

<lệnh> ;

6- Lệnh do … while

do      {

< lệnh>

}  while  ( <biểu thức> ) ;

Chú ý: Khi gặp lệnh break máy tính sẽ thoát ra khỏi vòng lặp trong cùng chứa nó.

7 – Mảng

<1>. Mảng 1 chiều

a. Khai báo mảng 1 chiều

Cách 1: Khai báo trực tiếp biến mảng

<kiểu dữ liệu> <tên mảng> [ <số phần tử tối đa của mảng>] ;

Cách 2: Khai báo một kiểu dữ liệu mới là mảng, sau đó sử dụng kiểu đó để khai báo biến.

Khai báo kiểu dữ liệu mảng 1 chiều sử dụng từ khóa typedef như sau:

typedef <kiểu d/l> <tên kiểu d/l mảng> [ <số ph/tử tối đa của mảng>] ;

Sử dụng kiểu dữ liệu mảng trên để khai báo biến mảng như sau:

<tên kiểu dữ liệu mảng>  <tên mảng> ;

b. Truy xuất phần tử mảng 1 chiều

<tên mảng> [ <chỉ số của phần tử> ]

<2>. Mảng 2 chiều

a. Khai báo mảng 2 chiều

- Khai báo trực tiếp mảng 2 chiều:

<kiểu dữ liệu> <tên mảng> [ <số dòng tối đa>] [<số cột tối đa>] ;

- Khai báo kiểu mảng 2 chiều, sau đó sử dụng kiểu này để khai báo mảng :

typedef <kiểu dữ liệu> <tên kiểu mảng> [ <số dòng tối đa>] [<số cột tối đa>] ;

Khai báo mảng :

<tên kiểu mảng>  <tên mảng>

b. Truy xuất phần tử mảng 2 chiều

<tên  mảng> [<chỉ số dòng>] [<chỉ số cột>]

<3>. Các thao tác trên mảng

- Nhập – Xuất mảng

- Tìm kiếm trên mảng: Tìm max, min, tìm những phần tử thoả mãn điều kiện nào đó; tìm phần tử bằng giá trị x nào đó, tìm vị trí đầu tiên v.v...

- Đếm các phần tử thoả mãn điều kiện nào đó.

- Tính tổng, trung bình cộng ... các phần tử mảng.

- Đổi chỗ 2 phần tử mảng.

- Đổi chỗ 2 hàng (hoặc 2 cột) ma trận

- Sắp xếp tăng (hoặc giảm).

- Chèn thêm phần tử; chèn thêm hàng, cột ma trận.

- Xoá bớt phần tử; xóa hàng (hoặc cột) ma trận.

8 – Xâu ký tự

- Khai báo biến xâu ký tự

char  <biến xâu> [<độ dài tối đa>] ;

- Lưu trữ xâu ký tự: Các ký tự sẽ được lưu trong mảng theo thứ tự từ trái sang phải và bắt đầu từ chỉ số 0 trở đi, ký tự cuối cùng dùng làm ký tự kết thúc xâu được C quy định là ký tự ‘\0’ (ký tự này có mã ASCII là 0, tức là ký tự NULL).

- Một số hàm xử lý xâu ký tự: puts(s), gets(s), strlen(s), strcpy(s,p), strcat(s, p), strcmp(s,p), strstr(s, p), strchr(s, c), strrev(s), strupr(s), strlwr(s).

- Một số thao tác trên xâu ký tự

(1)   Đếm ký tự:

dem = 0;

for(i=0; i < strlen(s); i++)

if(s[i] thoả mãn điều kiện) dem++;

printf(“So ky tu thoa man dieu kien la  %d “, dem);

(2)   Đếm từ:

dem = s[0] = = ‘ ‘ ? 0 : 1;

for (i=1; i < strlen(s); i++)

if((s[i] = = ‘ ‘) && (s[i-1] != ‘ ‘)) dem++;

printf(“So tu la  %d “, dem);

(3)   Xoá dấu trống ở đầu xâu:

while (s[0] == ' ') for(i=1;s[i]!=0;i++)s[i-1]=s[i];

Hoặc:

k=strlen(s);

i=0;

while (s[i] == ' ' && i < k) i++;

strcpy(&s[0],&s[i]);

(4)   Xoá dấu trống ở cuối xâu:

k = strlen(s);

while(s[k-1]==' ' && k>0) s[--k]=0;

(5)   Xoá dấu cách thừa giữa hai từ:

k = strlen(s);

for(i=1;i<k; )

if((s[i]==' ') && (s[i-1]==' '))

for(j=i;s[j]!=0;j++)s[j]=s[j+1];

else i++;

Hoặc:

k = strlen(s);

i=0;

while(i < k-1)

if(s[i]==' ' && s[i+1]==' ') strcpy(&s[i],&s[i+1]);

else i++;

Chương 3 – Con trỏ và cấp phát động bộ nhớ động

1- Khai báo con trỏ

<kiểu dữ liệu>  * <biến trỏ> ;

2- Khởi tạo con trỏ

<biến trỏ>  =  <địa chỉ> ;

VD:

float  *p , x ;

. . .

p = &x ;

3- Toán tử & và toán tử *

- Toán tử & để xác định địa chỉ của biến

- Toán tử * dùng để xác định giá trị của biến mà địa chỉ của nó là giá trị của con trỏ.

VD:
float  x, y, *p ;

. . .

p = &x ;

y = *p ;   // tuong duong voi lenh gan y = x ;

3- Liên hệ giữa con trỏ và mảng

Quy ước của C: Tên mảng chính là địa chỉ của phần tử đầu tiên trong mảng.

Vì vậy có thể gán tên mảng cho con trỏ.

VD:
float  a[100] , *p ;

. . .

p = a ;

Sau phép gán này chúng ta có thể sử dụng p như là một tên mảng.

Cách viết sau có tác dụng như nhau: a[i] , p[i]

4- Con trỏ 2 cấp

VD:

float  x, *p,  **pp ;

. . .

p  =  &x ;

pp = &p ;

5- Cấp phát bộ nhớ động: Dùng hàm malloc hoặc hàm calloc

a/ Cấp phát bộ nhớ động cho mảng 1 chiều

VD:

#include <alloc.h>

. . .

int  n  , i ;

float  *x ;

. . .

do

{

printf(“Nhap n > 0 : “);

scanf(“%d” , &n) ;

}  while (n <= 0 ) ;

x =  (float *) malloc(n * sizeof (float)) ;

// Hoặc  x = (float *) calloc(n , sizeof(float)) ;

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

{

printf (“x[%d] = “ , i+1);

scanf(“%f”, &x[i]);

}

. . .

free(x) ;

b/ Cấp phát bộ nhớ động cho mảng 2 chiều

VD:
int  m , n , i , j ;

float   **a;

. . .

do

{

printf(“Nhap m > 0 : “);

scanf(“%d” , &m) ;

printf(“Nhap n > 0 : “);

scanf(“%d” , &n) ;

}  while (m <= 0 || n <= 0 ) ;

a =  (float **) malloc(m * sizeof (float *)) ;

for (i=0; i < m; i++) a[i]  = (float *) malloc (n * sizeof (float));

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

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

{

printf(“a[%d] [%d] = “ , i+1, j+1);

scanf(“%f” , &tg );

a[i] [j]  =  tg ;

}

. . .

for(i=0; i < m; i++) free(a[i]) ;   free(a);

Chương 4 – Hàm

1- Khai báo hàm (nguyên mẫu hàm)

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

2- Định nghĩa hàm (xây dựng hàm)

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

{

<Các khai báo biến, mảng ...>

<Các câu lệnh>

}

3- Gọi hàm (sử dụng hàm)

<tên hàm> ([<danh sách tham số thực sự>])

4- Tham số

Tham số hình thức Tham số thực sự

<biến>                                                        <biểu thức>

<con trỏ>                                                    <địa chỉ biến>

<con trỏ>                                                    <tên mảng>

<tên mảmg 1 chiều> [ ]                               <tên mảmg>

5- Biến toàn cục và biến cục bộ

6 - Đệ quy

Hàm đệ quy được viết theo thuật toán sau :

if( trường hợp cơ sở)

{

Trình bày cách giải đã có

}

else

{

Gọi tới hàm đang lập với giá trị khác của tham số

}

Chú ý : Để viết được hàm đệ quy thì phải tìm được công thức truy hồi.

Chương 5 – Kiểu dữ liệu struct

1- Khai báo kiểu struct

typedef  struct

{

<kiểu dữ liệu 1> <tên trường 1> ;

<kiểu dữ liệu 2> <tên trường 2> ;

. . . . .

<kiểu dữ liệu n> <tên trường n> ;

}  <tên kiểu cấu trúc> ;

2- Khai báo biến hoặc mảng cấu trúc

<tên kiểu cấu trúc>  <danh sách biến hoặc mảng cấu trúc> ;

3- Truy nhập tới từng trường của cấu trúc

<biến cấu trúc> . <tên trường>

Hoặc nếu là biến trỏ cấu trúc:

<biến trỏ cấu trúc>  ->  <tên trường>

4- Các phép xử lý với cấu trúc

- Nhập 1 biến cấu trúc: Phải nhập dữ liệu cho từng trường của biến cấu trúc.

- Đưa giá trị của biến cấu trúc ra màn hình (hoặc tệp): Phải đưa giá trị của từng trường.

- Gán nội dung 2 biến cấu trúc cùng kiểu.

- Thao tác mảng cấu trúc:

* Nhập, xuất mảng cấu trúc.

* Tìm các cấu trúc thoả mãn điều kiện nào đó.

* Sắp xếp mảng cấu trúc theo một tiêu chuẩn nào đó.

* Chèn thêm, xoá bớt, sửa một số cấu trúc.

* Tính toán trên mảng các biến cấu trúc (tìm trung bình cộng, tổng ...)

Chương 6 – Đồ họa

1. Khởi động hệ đồ họa: Dùng hàm initgraph ( )

2. Đặt mầu và mẫu tô cho các đường và các hình

Mẫu tô cho đường

Hàm setlinestyle ( ) để thiết lập kiểu (style), mẫu (pattern) và bề dày (thickness) của đường.

Đặt mầu nền

Sử dụng hàm: setbkcolor ( int color ) ;

Đặt mầu tô

Sử dụng hàm: setcolor ( int  color ) ;

Số mầu và tên mầu tùy thuộc vào kiểu đồ họa.

3. Các hàm vẽ và tô

a. Vẽ điểm ảnh

Dạng hàm: putpixel ( x , y ,  color ) ;

b. Vẽ đoạn thẳng

-         Hàm: line ( x1 , y1 , x2 , y2 ) ;

vẽ đoạn thẳng nối hai điểm có tọa độ là (x1,y1) và (x2,y2) .

-         Hàm: linerel ( int  dx , int  dy ) ;

vẽ một đọan thẳng từ vị trí hiện tại của con trỏ màn hình (ký hiệu là (x,y)) đến điểm có tọa độ (x+dx , y+dy).

-         Hàm: lineto ( int  x , int  y ) ;

vẽ một đọan thẳng từ vị trí hiện tại của con trỏ màn hình đến điểm (x,y).

-         Hàm: moveto ( int  x , int  y ) ;

sẽ di chuyển con trỏ màn hình tới vị trí mới (x,y).

c. Vẽ và tô mầu hình chữ nhật

-         Hàm vẽ hình chữ nhật: rectangle ( trai  , tren  , phai  , duoi ) ;

sẽ vẽ hình chữ nhật có tọa độ đỉnh trên bên trái là (trai , tren) và đỉnh dưới bên phải là (phai , duoi).

-         Hàm tô mầu hình chữ nhật: bar ( trai  , tren  , phai  , duoi ) ;

d. Vẽ và tô mầu đa giác

-         Muốn vẽ một đường gấp khúc đi qua n điểm (x1, y1), (x2, y2). ..., (xn, yn), thì trước hết ta phải gán :

points[0] = x1, points[1] = y1, points[2] = x2, points[3] = y2 ...

Sau đó viết lời gọi hàm: drawpoly ( n , points ) ;

e. Vẽ hình tròn

-         Hàm arc ( x, y, gocdau, goccuoi , r );

sẽ vẽ một cung tròn, trong đó:

(x,y): Tọa độ của tâm của cung tròn

gocdau: góc bắt đầu (tính theo độ) của cung tròn.

goccuoi: góc kết thúc.

r: bán kính của cung tròn.

Nếu gocdau = 0 và goccuoi = 360 thì lời gọi arc ( ) sẽ vẽ một vòng tròn đầy đủ.

-         Hàm: circle ( x, y, r ) ;

sẽ vẽ một đường tròn có tâm là (x,y), bán kính là r.

-         Hàm: pieslice (x, y, gocdau, goccuoi, r ) ;

sẽ vẽ và tô mầu một hình quạt tròn.

f. Vẽ hình ellipse

-         Hàm ellipse ( x, y, gocdau, goccuoi, xr, yr ) ;

sẽ vẽ một cung ellipse, trong đó:

4. Khung nhìn/Cửa số (viewport)

Khung nhìn là một vùng hình chữ nhật trên màn hình đồ họa. Để thiết lập khung nhìn ta dùng hàm: setviewport ( int x1 , int y1 , int x2 , int y2 , int clip ) ;

trong đó:

(x1,y1): tọa độ góc trên bên trái của khung nhìn

(x2,y2): tọa độ góc dưới bên phải của khung nhìn

Bốn giá trị này phải thỏa mãn điều kiện:  0 £ x1 £ x2

0 £ y1 £ y2

clip: có thể nhận một trong hai giá trị sau:

clip = 0 không cho phép vẽ ra ngoài khung nhìn

clip = 1 cho phép vẽ ra ngoài khung nhìn

  • Tọa độ âm dương: Nhờ sử dụng khung nhìn ta có thể viết các chương trình đồ họa theo tọa độ âm dương. Muốn vậy ta thiết lập như sau:

int  xc , yc ;

xc = getmaxx ( ) / 2 ; yc = getmaxy ( ) / 2 ;

setviewport ( xc , yc , getmaxx ( ) , getmaxy ( ) , 0 ) ;

Như thế màn hình sẽ được chia làm 4 phần với tọa độ âm dương như sau:

Phần tư trái trên: x âm, y âm.

Phần tư trái dưới: x âm, y dương

Phần tư phải trên: x dương, y âm

Phần tư phải dưới: x dương, y dương.

5. Văn bản trong màn hình đồ họa

a. Hiển thị văn bản trên màn hình đồ họa

- Hàm: outtext ( char  *s ) ;

sẽ cho hiện chuỗi ký tự do s trỏ tới tại vị trí hiện tại của con trỏ màn hình.

-         Hàm: outtextxy ( int x , int y , char  *s ) ;

sẽ cho hiện chuỗi ký tự do s trỏ tới tại vị trí (x,y).

b. Font

Các font nằm trong các tệp tin có đuôi là .CHR; để chọn và nạp font ta dùng hàm: settextstyle ( int font , int direction , int charsize ) ;


Chương 7 – Tệp

1- Các thao tác tệp

a/  Khai báo biến tệp

FILE *<biến tệp> ;

b/ Mở tệp

- Mở tệp để đọc:

FILE * fopen(<tên tệp> , “r”) ;

- Mở tệp để ghi:

FILE * fopen(<tên tệp> , “w”) ;

c/ Đóng tệp

fclose(FILE *<biến tệp>) ;

VD:
FILE  *fvao, *fra ;

. . .

fvao = fopen(“solieu. inp” , “r” ) ;

fra = fopen (“ketqua. out “, “w” ) ;

. . .

fclose(fvao) ; fclose(fra) ;

d/ Đọc tệp kiểu văn bản

Lệnh: fscanf ( FILE  *<biến tệp> , “<xâu quy cách>” , <danh sách địa chỉ biến>);

e/ Ghi tệp văn bản:

Lệnh:  fprintf (FILE  *<biến tệp> , “<xâu quy cách>” , <danh sách biểu thức> ) ;

VD: Nhập số liệu từ tệp vào dãy số, sau đó sắp xếp tăng dần và ghi ra một tệp khác.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <alloc.h>

void main()

{

char tentep [15];

FILE *tepvao, *tepra;

float *x, tg;

int n, i, j;

printf("Ten tep du lieu vao: ");

fflush(stdin);

gets(tentep);

tepvao = fopen(tentep, "r");

printf("Ten tep ket qua: ");

fflush(stdin);

gets(tentep);

tepra = fopen(tentep, "w");

fscanf(tepvao,"%d", &n);

x=(float *) malloc(n * sizeof(float));

for (i=0; i<n; i++) fscanf(tepvao,"%f",&x[i]);

fclose(tepvao);

fprintf(tepra,"Day so nhap vao la:\n");

for(i=0; i<n; i++) fprintf(tepra,"%10.2f",x[i]);

// Sap xep tang dan

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

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

if(x[i] > x[j])

{tg = x[i]; x[i] = x[j]; x[j] = tg;}

fprintf(tepra,"\nDay so da sap xep tang dan la:\n");

for(i=0; i<n; i++) fprintf(tepra,"%10.2f",x[i]);

fclose(tepra);

free(x);

}

BÀI TẬP

1/ Bài tập về mảng 1 chiều, 2 chiều:

-         Nhập, xuất mảng

-         Tìm max, min

-         Tìm kiếm các phần tử thoả mãn điều kiện nào đó

-         Tìm vị trí của phần tử thoả mãn điều kiện nào đó

-         Đổi chỗ các phần tử. Đổi chỗ hàng, cột ma trận.

-         Sắp xếp các phần tử (tăng, giảm, lên đầu dãy, xuống cuối dãy). Sắp xếp hàng, cột ma trận.

-         Chèn thêm, xoá một hoặc nhiều phần tử. Chèn hàng, cột ma trận

-         Tính toán trên các phần tử (tổng, trung bình cộng …)

2/ Bài tập số học: Kiểm tra số có tính chất nào đó (ví dụ: số hoàn hảo, số nguyên tố, số Fibonaci, số chia hết (ước số), số đối xứng…);tìm USCLN, BSCNN, tách các chữ số…

3/ Bài tập về hình học giải tích: Giải tam giác, tìm những điểm thoả mãn điều kiện nào đó…

4/ Bài tập về đại số: Giải phương trình, bất phương trình, tính tổng chuỗi …

5/ Bài tập về danh sách (sử dụng kiểu dữ liệu struct): Sắp xếp danh sách, tìm kiếm trong danh sách, chèn bản ghi vào danh sách, xóa bản ghi trong danh sách, tính toán trên danh sách.

6/ Bài tập về đồ họa: Vẽ các hình

7/ Bài tập về tệp: Nhập các số liệu từ tệp đã có, ghi dữ liệu ra tệp.


MỘT SỐ VÍ DỤ

1/ Viết chương trình tính diện tích và thể tích hình cầu biết bán kính r và p có sẵn trong C ở dạng hằng M_PI. Sau đó thực hiện trên máy tính.

/* Chuong trinh tinh dien tich, the tich hinh cau */

#include <stdio.h>

#include <conio.h>

void main()

{

float r,s,v;

clrscr();

printf("Nhap ban kinh r = ");

scanf("%f",&r);

s = 4*M_PI*r*r;

v = s*r/3;

printf("\n Dien tich hinh cau = %8.2f",s);

printf("\n The tich hinh cau = %8.2f",v);

getch();

}

2/ Nhập một ký tự vào, sau đó in ra mã ASCII của ký tự đó dưới dạng thập phân / thập lục phân / bát phân.

// In ra ma ASCII, ky tu - thap phan - thap luc phan - bat phan

#include <stdio.h>

#include <conio.h>

void main()

{

char i;

clrscr();

//   printf("Bang ma ASCII\n");

//   for (i=0;i<=255;i++)

//      {

printf("Go vao mot ky tu : ");

scanf("%c",&i);

printf("Ma ASCII cua ky tu '%c' o dang he 10, he 16 va he 8 la:\n",i);

printf("%d   %x   %o\n",i,i,i);

getch();

//      }

}

3/ Nhập vào 3 số thực dùng làm số đo 3 cạnh của một tam giác, sau đó kiểm tra điều kiện tam giác và xác định xem tam giác tương ứng có tính chất gì: đều, vuông cân, cân, vuông hay thường.

/* Chuong trinh kiem tra tam giac deu, vuong can, can, vuong hay thuong */

#include <stdio.h>

#include <conio.h>

void main()

{

float a,b,c,a2,b2,c2;

clrscr();

printf("Nhap canh a = ");

scanf("%f",&a);

printf("Nhap canh b = ");

scanf("%f",&b);

printf("Nhap canh c = ");

scanf("%f",&c);

if ((a <= 0)||(b <= 0)||(c <= 0)||(a >= b+c)||(b >= a+c)||(c >= a+b))

{

printf ("\n3 so khong tao thanh mot tam giac !");

getch();

return;

}

printf("\n3 so da cho la 3 canh cua tam giac");

a2=a*a;

b2=b*b;

c2=c*c;

if (a2==b2 || b2==c2 || a2==c2)

if(a2==b2 && b2==c2) printf("\nDay la tam giac deu");

else if (a2==b2+c2 || b2==a2+c2 || c2==a2+b2)

printf("\nDay la tam giac vuong can");

else printf("\nDay la tam giac can");

else if (a2==b2+c2 || b2==a2+c2 || c2==a2+b2)

printf("\nDay la tam giac vuong");

else printf("\nDay la tam giac thuong");

getch();

}

4/ Nhập vào 1 số nguyên dương n, liệt kê các số nguyên tố nhỏ hơn n (số nguyên tố là số chỉ chia hết cho 1 và bản thân nó).

// Nhap n nguyen > 0, liet ke cac so nguyen to < n

#include <stdio.h>

#include <conio.h>

#include <math.h>

void main()

{

int n,i,j,ngto;

printf("n = ");

scanf("%d",&n);

printf("Cac so nguyen to < %d la:\n",n);

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

{

ngto=1;

for (j=2; j<=floor(sqrt(i)); j++)

if (i%j==0) { ngto = 0; break;}

if (ngto) printf("%d\n",i);

}

getch();

}

5/ Viết chương trình tìm và đổi chỗ phần tử lớn nhất với phần tử nhỏ nhất trong mảng 1 chiều các số thực.

#include <stdio.h>

#include <conio.h>

//Doi cho phan tu be nhat voi phan tu lon nhat trong mang

void main()

{

float x[100], tg;

int n, i, imin, imax;

clrscr();

do { printf("Nhap so phan tu n: ");

scanf("%d", &n); } while (n<=0 || n >= 100);

imin = imax = 0;

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

{

printf("Nhap phan tu thu %d = ",i+1);

scanf("%f", &x[i]);

if(x[imin] > x[i]) imin = i;

if(x[imax] < x[i]) imax = i;

}

//In ra day vua nhap vao

printf("\nDay so vua nhap vao:\n");

for(i=0; i<n; i++) printf("%8.3f", x[i]);

//Doi cho max va min

tg = x[imin]; x[imin] = x[imax]; x[imax] = tg;

//In day ket qua

printf("\nDay so da doi cho max voi min:\n");

for(i=0; i<n; i++) printf("%8.3f", x[i]);

getch();

}

6/ Viết chương trình đếm các dấu trống trong chuỗi.

// Dem cac dau trong cua xau

#include <stdio.h>

#include <conio.h>

void main()

{

char s[200];

int dem, i;

clrscr();

printf("Nhap xau ky tu: ");

fflush(stdin);

gets(s);

dem = 0;

i = 0;

while(s[i])

{

if(s[i] == ' ') dem++;

i++;

}

printf("Xau '%s' co %d dau trong", s, dem);

getch();

}

7/ Thực hiện cấp phát bộ nhớ động, nhập dữ liệu, in ra mảng 1 chiều, 2 chiều bằng con trỏ.

// Nhap du lieu cho mang 1 chieu, mang 2 chieu bang CON TRO

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

void main()

{

float *x, **a, temp;

int m,n,i,j;

clrscr();

do

{ printf("Nhap so phan cua mang 1 chieu m = ");

scanf("%d",&m);

} while (m<=0);

x=(float *) malloc(m*sizeof(float));

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

{

printf("Nhap phan tu thu %d: ",i+1);

scanf("%f",&x[i]);

}

printf("\nMang 1 chieu:\n");

for(i=0;i<m;i++) printf("%8.2f",x[i]);

free(x);

do

{ printf("\n\nNhap so hang cua mang 2 chieu m = ");

scanf("%d",&m);

printf("Nhap so cot cua mang 2 chieu n = ");

scanf("%d",&n);

} while (m<=0 || n<=0);

a=(float **) malloc(m*sizeof(float *));

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

a[i]=(float *) malloc(n*sizeof(float));

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

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

{

printf("Nhap phan tu [%d][%d]: ",i+1,j+1);

scanf("%f",&temp);

a[i][j]=temp;

}

printf("\nMang 2 chieu:\n");

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

{

for(j=0;j<n;j++) printf("%8.2f",a[i][j]);

printf("\n");

}

for(i=0;i<m;i++) free(a[i]);

free(a);

getch();

}

8/ Lập chương trình cấp phát bộ nhớ động và thực hiện các việc sau:

-         Nhập vào một dãy số thực.

-         In ra các số dương có mặt trong dãy số.

-         Tìm giá trị lớn nhất và nhỏ nhất trong số các giá trị của dãy số.

/* Thao tac tren day so */

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

void main()

{

float max=-1.e38, min=1.e38, *a, *ad;

int n,i,k;

clrscr();

printf("n = ");

scanf("%d",&n);

a=(float *) malloc(n*sizeof(float));

ad=(float *) malloc(n*sizeof(float));

k=-1;

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

{

printf("a[%d] = ",i+1);

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

if (a[i]>0) ad[++k]=a[i];

if(max<a[i]) max=a[i];

if(min>a[i]) min=a[i];

}

printf("\Cac so duong co mat trong day la:\n");

for(i=0;i<=k;i++) printf("%8.2f",ad[i]);

printf("\nMax = %8.2f",max);

printf("\nMin = %8.2f",min);

free(a);

free(ad);

getch();

}

9/ Lập chương trình cấp phát bộ nhớ động và thực hiện các việc sau:

-         Cộng hai ma trận cùng kích thước

-         Tìm ma trận chuyển vị.

-         Nhân vector với ma trận.

// Cong 2 ma tran, chuyen vi ma tran, nhan vector voi ma tran

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

void main()

{

float **a,**b,**c,**d,*x,*tich,temp;

int m,n,i,j;

clrscr();

printf("Nhap so hang cua ma tran m = ");

scanf("%d",&m);

printf("Nhap so cot cua ma tran n = ");

scanf("%d",&n);

a=(float**)malloc(m*sizeof(float*));

for(i=0;i<m;i++)a[i]=(float*)malloc(n*sizeof(float));

d=(float**)malloc(n*sizeof(float*));

for(i=0;i<n;i++)d[i]=(float*)malloc(m*sizeof(float));

printf("\nNhap ma tran A:\n");

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

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

{

printf("a[%d][%d] = ",i+1,j+1);

scanf("%f",&temp);

a[i][j]=temp;

d[j][i]=a[i][j];

}

b=(float**)malloc(m*sizeof(float*));

for(i=0;i<m;i++)b[i]=(float*)malloc(n*sizeof(float));

c=(float**)malloc(m*sizeof(float*));

for(i=0;i<m;i++)c[i]=(float*)malloc(n*sizeof(float));

printf("\nNhap ma tran B:\n");

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

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

{

printf("b[%d][%d] = ",i+1,j+1);

scanf("%f",&temp);

b[i][j]=temp;

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

}

x=(float*)malloc(m*sizeof(float));

printf("\nNhap vector x:\n");

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

{

printf("x[%d] = ",i+1);

scanf("%f",&x[i]);

}

tich=(float*)malloc(n*sizeof(float));

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

{

tich[j]=0.0;

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

tich[j] += x[i]*a[i][j];

}

//In ket qua

printf("\nMa tran A:\n");

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

{

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

printf("%8.2f",a[i][j]);

printf("\n");

}

printf("\nMa tran B:\n");

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

{

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

printf("%8.2f",b[i][j]);

printf("\n");

}

printf("\n\nKet qua\n");

printf("Ma tran tong C=A+B:\n");

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

{

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

printf("%8.2f",c[i][j]);

printf("\n");

}

printf("Ma tran chuyen vi A_t:\n");

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

{

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

printf("%8.2f",d[i][j]);

printf("\n");

}

printf("\nVector X:\n");

for(i=0;i<m;i++) printf("%8.2f",x[i]);

printf("\nTich cua vector X voi ma tran A:\n");

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

printf("%8.2f",tich[i]);

free(x); free(tich);

for(i=0;i<m;i++) {free(a[i]); free(b[i]); free(c[i]);}

free(a); free(b); free(c);

for(i=0;i<n;i++) free(d[i]); free(d);

getch();

}

10/ Viết hàm chương trình giải phương trình bậc nhất. Hàm thực hiện giải phương trình bậc nhất có 3 tham số hình thức trong đó 2 tham số đầu là các hệ số của phương trình, tham số thứ ba sử dụng để chứa nghiệm. Hàm trả về một số nguyên cho biết phương trình có nghiệm, vô nghiệm hay có vô số nghiệm.

// Giai phuong trinh bac 1: ax + b = 0

#include <stdio.h>

#include <conio.h>

int PTB1(float,float,float*);

void main()

{

float a,b,x;

clrscr();

printf("Nhap he so a = ");

scanf("%f",&a);

printf("Nhap he so b = ");

scanf("%f",&b);

if(PTB1(a,b,&x)==0) printf("Phuong trinh vo nghiem!");

if(PTB1(a,b,&x)==-1) printf("Phuong trinh vo so nghiem!");

if(PTB1(a,b,&x)==1) printf("Phuong trinh co 1 nghiem la %10.3f",x);

printf("\nAn 1 phim bat ky de ket thuc...");

getch();

}

int PTB1(float a,float b, float *x)

{

if(a==0.)

{  if(b==0.)return -1;

else return 0;

}

else {

*x = -b/a;

return 1;

}

}

// Giai phuong trinh bac 1: ax + b = 0

#include <stdio.h>

#include <conio.h>

int PTB1(float a,float b,float &x);

void main()

{

float a,b,x;

clrscr();

printf("Nhap he so a = ");

scanf("%f",&a);

printf("Nhap he so b = ");

scanf("%f",&b);

if(PTB1(a,b,x)==0) printf("Phuong trinh vo nghiem!");

if(PTB1(a,b,x)==-1) printf("Phuong trinh vo so nghiem!");

if(PTB1(a,b,x)==1) printf("Phuong trinh co 1 nghiem la %10.3f",x);

printf("\nAn 1 phim bat ky de ket thuc...");

getch();

}

int PTB1(float a,float b, float &x)

{

if(a==0.)

{  if(b==0.)return -1;

else return 0;

}

else {

x = -b/a;

return 1;

}

}

11/ Vào danh sách học sinh gồm họ tên, điểm thi. Sắp xếp theo thứ tự giảm dần của điểm thi. Tính điểm trung bình của lớp. Tính tỉ lệ phần trăm giỏi, khá, trung bình, kém.

/* Chuong trinh su ly danh sach: Nhap ho ten, diem thi. Tim diem trung binh

cua lop, ti le % gioi,kha,trung binh,kem. Sap xep theo thu tu giam

dan cua Diem thi */

#include <stdio.h>

#include <conio.h>

#include <string.h>

typedef struct

{

char ten[25];

float diem;

} hocsinh;

void main()

{

hocsinh hsinh[100],tg;

int n,i,j,demgioi=0,demkha=0,demtb=0,demkem=0;

float dtb=0.,tlgioi,tlkha,tltb,tlkem,x;

char tam[25];

clrscr();

printf("\nVao so hoc sinh n = ");

scanf("%d", &n);

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

{

printf("\nTen : ");

fflush(stdin);

gets(tam);

strcpy(hsinh[i].ten,tam);

printf("Diem : ");

scanf("%f",&x);

hsinh[i].diem = x;

dtb = dtb + hsinh[i].diem;

if (hsinh[i].diem >= 8)

demgioi++;

else

if (hsinh[i].diem >= 6.5)

demkha++;

else

if (hsinh[i].diem >= 5)

demtb++;

else demkem++;

}

dtb = dtb/n;

tlgioi = (float)(demgioi)/n*100;

tlkha = (float)(demkha)/n*100;

tltb = (float)(demtb)/n*100;

tlkem = (float)(demkem)/n*100;

// Sap xep theo thu tu giam dan cua Diem thi

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

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

if(hsinh[i].diem < hsinh[j].diem)

{

tg = hsinh[i];

hsinh[i] = hsinh[j];

hsinh[j] = tg;

}

printf("\nDANH SACH HOC SINH");

printf("\n          Ten\t\t\t\tDiem");

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

printf("\n%25s\t\t%.1f",hsinh[i].ten,hsinh[i].diem);

printf("\nDiem trung binh cua lop la : %.1f",dtb);

printf("\nTi le gioi la : %.1f %",tlgioi);

printf("\nTi le kha la : %.1f %",tlkha);

printf("\nTi le trung binh la : %.1f %",tltb);

printf("\nTi le kem la : %.1f %",tlkem);

getch();

}

12/ Viết chương trình tạo một tệp các số nguyên có tên là “SONGUYEN.DAT”, sau đó đọc dữ liệu từ tệp “SONGUYEN.DAT” và ghi các số chẵn vào tệp “SOCHAN.DAT”, và ghi các số lẻ vào tệp “SOLE.DAT”.

// Tao cac tep SONGUYEN.DAT, SOCHAN.DAT va SOLE.DAT

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

void main()

{

FILE *tepn, *tepc, *tepl;

long x[100], tg;

int n,i;

clrscr();

// Tao tep SONGUYEN.DAT

tepn = fopen("SONGUYEN.DAT", "w");

do {

printf("Nhap so luong cac phan tu n: ");

scanf("%d", &n);

} while(n<=0 || n>100);

fprintf(tepn,"%d\n",n);

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

{

printf("Nhap phan tu [%d] : ",i+1);

scanf("%ld", &tg);

fprintf(tepn,"%ld ",tg);

}

fclose(tepn);

// Nhap du lieu tu tep SONGUYEN.DAT va tao tep SOCHAN.DAT, tep SOLE.DAT

tepc = fopen("SOCHAN.DAT", "w");

tepl = fopen("SOLE.DAT", "w");

fprintf(tepc, "Cac so chan:\n");

fprintf(tepl, "Cac so le:\n");

tepn= fopen("SONGUYEN.DAT", "r");

fscanf(tepn,"%d",&n);

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

{

fscanf(tepn,"%ld", &tg);

if(tg % 2 == 0) fprintf(tepc,"%ld   ",tg);

else fprintf(tepl,"%ld   ", tg);

}

fclose(tepn);

fclose(tepc);

fclose(tepl);

}

13/ Vẽ hai hình hộp chữ nhật.

#include <conio.h>

#include <graphics.h>

void main()

{

int driver=DETECT,mode,x1,y1,x2,y2,sau;

initgraph(&driver, &mode, "c:\\tc\\bgi");

// Ve hinh hop thu nhat

x1 = 50; y1=50;

x2 = 200; y2 = 100;

sau = 10;

bar3d(x1,y1,x2,y2,sau,1);

// Ve hinh hop thu hai

x1 = 250; y1=150;

x2 = 500; y2 = 400;

sau = 50;

setcolor(CYAN);

setfillstyle(SLASH_FILL,YELLOW);

bar3d(x1,y1,x2,y2,sau,1);

getch();

closegraph();

}

14/ Vẽ đồ thị hàm cos x từ -4p đến 4p trong hệ trục tọa độ âm dương

// Do thi ham cos

#include <conio.h>

#include <graphics.h>

#include <math.h>

#define TILEX 20

#define TILEY 60

void main()

{

int driver=DETECT,mode,x,y,i;

initgraph(&driver, &mode, "c:\\tc\\bgi");

setviewport(getmaxx()/2,getmaxy()/2,getmaxx(),getmaxy(),0);

// Ke he truc toa do mau xanh lo

setcolor(CYAN);

line(-getmaxx()/2, 0, getmaxx()/2 ,0);

line(0, -getmaxy()/2, 0, getmaxy()/2);

// Ve duong cos x mau vang

for(i=-400; i<=400; ++i)

{

x = floor(2*M_PI*i*TILEX/200);

y = -floor(cos(2*M_PI*i/200)*TILEY);

putpixel(x,y,YELLOW);

}

getch();

closegraph();

}

Cập nhật lần cuối: Chủ nhật, 01 Tháng 5 2016 10:34