1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Giáo trình Lập trình C (Nghề: Điện tử công nghiệp - Cao đẳng): Phần 2 - Trường CĐ nghề Việt Nam - Hàn Quốc thành phố Hà Nội

116 7 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 116
Dung lượng 1,16 MB

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

Nội dung

(NB) Giáo trình Lập trình C với mục tiêu giúp các bạn có thể nắm được cú pháp của ngôn ngữ lập trình C; Sử dụng được môi trường lập trình C để soạn thảo, biên dịch và hiệu chỉnh chương trình. Mời các bạn cùng tham khảo nội dung giáo trình phần 2 dưới đây.

Trang 1

Bài 5 Cấu trúc lệnh lặp Mục tiêu:

- Cung cấp các kiến thức cơ bản về cách sử dụng câu lệnh lặp với số lần biết trước và chưa biết trước

Nội dung:

5.1 Cấu trúc lặp với for và while

5.1.1 Cấu trúc lặp với câu lệnh for

Câu lệnh for dùng để xây dựng cấu trúc lặp có dạng sau:

for (biểu thức 1; biểu thức 2; biểu thức 3)

Lệnh hoặc khối lệnh ;

Câu lệnh for gồm ba biểu thức và thân for Thân for là một câu lệnh hoặc một khối lệnh viết sau từ khoá for Bất kỳ biểu thức nào trong ba biểu thức trên

có thể vắng mặt nhưng phải giữ dấu ;

Thông thường biểu thức 1 là câu lệnh gán để tạo giá trị ban đầu cho biến điều khiển, biểu thức 2 là một quan hệ logic biểu thị điều kiện để tiếp tục chu trình, biểu thức ba là một câu lệnh gán dùng để thay đổi giá trị biến điều khiển

Hoạt động của câu lệnh for:

Câu lệnh for hoạt động theo các bước sau:

Xác định biểu thức 1

Xác định biểu thức 2

Tuỳ thuộc vào tính đúng sai của biểu thức 2 để máy lựa chọn một trong hai nhánh:

Nếu biểu thức hai có giá trị 0 (sai), máy sẽ ra khỏi for và chuyển tới câu lệnh sau thân for

Nếu biểu thức hai có giá trị khác 0 (đúng), máy sẽ thực hiện các câu lệnh trong thân for

Tính biểu thức 3, sau đó quay lại bước 2 để bắt đầu một vòng mới của chu trình

Chú ý:

Nếu biểu thức 2 vắng mặt thì nó luôn được xem là đúng Trong trường hợp này việc ra khỏi chu trình for cần phải được thực hiện nhờ các lệnh break, goto hoặc return viết trong thân chu trình

Trang 2

Trong dấu ngoặc tròn sau từ khoá for gồm ba biểu thức phân cách nhau bởi dấu ; Trong mỗi biểu thức không những có thể viết một biểu thức mà có quyền viết một dãy biểu thức phân cách nhau bởi dấu phảy Khi đó các biểu thức trong mỗi phần được xác định từ trái sang phải Tính đúng sai của dãy biểu thức được tính là tính đúng sai của biểu thức cuối cùng trong dãy này

Trong thân của for ta có thể dùng thêm các câu lệnh for khác, vì thế ta có thể xây dựng các câu lệnh for lồng nhau

Khi gặp câu lệnh break trong thân for, máy ra sẽ ra khỏi câu lệnh for sâu nhất chứa câu lệnh này Trong thân for cũng có thể sử dụng câu lệnh goto để nhảy đến một ví trí mong muốn bất kỳ

Trang 3

5.1.2 Cấu trúc lặp với while

Câu lệnh while dùng để xây dựng chu trình lặp dạng:

while (biểu thức)

Trang 4

Lệnh hoặc khối lệnh;

Như vậy câu lệnh while gồm một biểu thức và thân chu trình Thân chu trình

có thể là một lệnh hoặc một khối lệnh

Hoạt động của chu trình như sau:

Máy xác định giá trị của biểu thức, tuỳ thuộc giá trị của nó máy sẽ chọn cách thực hiện như sau:

Nếu biểu thức có giá trị 0 (biểu thức sai), máy sẽ ra khỏi chu trình và chuyển tới thực hiện câu lệnh tiếp sau chu trình trong chương trình

Nếu biểu thức có giá trị khác không (biểu thức đúng), máy sẽ thực hiện lệnh hoặc khối lệnh trong thân của while Khi máy thực hiện xong khối lệnh này nó lại thực hiện xác định lại giá trị biểu thức rồi làm tiếp các bước như trên

Chú ý:

Trong các dấu ngoặc () sau while chẳng những có thể đặt một biểu thức mà còn có thể đặt một dãy biểu thức phân cách nhau bởi dấu phảy Tính đúng sai của dãy biểu thức được hiểu là tính đúng sai của biểu thức cuối cùng trong dãy Bên trong thân của một câu lệnh while lại có thể sử dụng các câu lệnh while khác bằng cách đó ta đi xây dựng được các chu trình lồng nhau

Khi gặp câu lệnh break trong thân while, máy sẽ ra khỏi câu lệnh while sâu nhất chứa câu lệnh này

Trong thân while có thể sử dụng câu lệnh goto để nhảy ra khỏi chu trình đến một vị trí mong muốn bất kỳ Ta cũng có thể sử dụng câu lệnh return trong thân while để ra khỏi một hàm nào đó

Trang 5

tong=tong+i; /*có thể viết là tong+=i*/

i=i+1;/*có thể viết là i++*/

Trang 6

Chu trình do while có dạng sau:

Hoạt động của chu trình như sau:

Máy thực hiện các lệnh trong thân chu trình

Khi thực hiện xong tất cả các lệnh trong thân của chu trình, máy sẽ xác định giá trị của biểu thức sau từ khoá while rồi quyết định thực hiện như sau:

Nếu biểu thức đúng (khác 0) máy sẽ thực hiện lặp lại khối lệnh của chu trình lần thứ hai rồi thực hiện kiểm tra lại biểu thức như trên

Nếu biểu thức sai (bằng 0) máy sẽ kết thúc chu trình và chuyển tới thực hiện lệnh đứng sau câu lệnh while

Chú ý:

Những điều lưu ý với câu lệnh while ở trên hoàn toàn đúng với do while

Trang 9

Đây là một bài tập đơn giản giúp bạn làm quen với cách sử dụng vòng lặp for trong C

printf("In cac so theo thu tu tang dan:\n");

for(i = start; i <= end; i++)

printf("%2d\n", i);

return 0;}

Trang 10

Biên dịch chương trình C trên sẽ cho kết quả:

Bài tập 2: In các số từ 1-10 theo thứ tự giảm dần?

Yêu cầu là in các số từ 1 tới 10 theo thứ tự giảm dần Với bài tập C này, chúng ta chỉ cần sử dụng một vòng lặp for trong C

printf("In cac so theo thu tu giam dan:\n");

for(i = end; i >= start; i )

Trang 11

Bài tập 3: In bảng số

In một bảng số thỏa mãn điều kiện:

Bảng số gồm 10 hàng và 10 cột

Các giá trị trong cột là liên tiếp nhau

Các giá trị trong hàng hơn kém nhau 10

Với bài tập C này, chúng ta sử dụng lồng vòng lặp: vòng lặp bên ngoài sẽ điều khiển các hàng và vòng lặp bên trong điều khiển các cột

Trang 12

Biên dịch chương trình C trên sẽ cho kết quả:

Bài tập 5: In bảng cửu chương rút gọn

Bảng cửu chương rút gọn là bảng có hàng là kết quả của phép nhân một số với các giá trị từ 1 tới 10 Chúng ta sẽ in 9 hàng tương ứng với các số từ 2 → 10 Với bài tập này, chúng ta sẽ sử dụng lồng vòng lặp: vòng lặp bên ngoài điều khiển số hàng và vòng lặp bên trong điều khiển số cột của bảng

Trang 13

printf("In bang cuu chuong rut gon:\n");

for(i = start; i <= end; i++) {

Biên dịch chương trình C trên sẽ cho kết quả:

Bài tập 6: In các số chẵn trong dãy từ 1-10

Yêu cầu là in các số chẵn trong dãy số từ 1 tới 10 bởi sử dụng vòng lặp trong ngôn ngữ C

Với bài tập C này, ngoài sử dụng vòng lặp, chúng ta cần kết hợp thêm một lệnh để kiểm tra điều kiện xem số đó là số chẵn hay lẻ, nếu là số chẵn thì in còn nếu là số lẻ thì không Chúng ta sử dụng lệnh IF và toán tử % (để lấy phần dư) trong C

Trang 14

Biên dịch chương trình C trên sẽ cho kết quả:

Bài tập C: in các số lẻ trong dãy từ 1-10

Yêu cầu là in các số lẻ trong dãy số từ 1 tới 10 bởi sử dụng vòng lặp trong ngôn ngữ C

Với bài tập C này, ngoài sử dụng vòng lặp, chúng ta cần kết hợp thêm một lệnh để kiểm tra điều kiện xem số đó là số chẵn hay lẻ, nếu là số lẻ thì in còn nếu

là số chẵn thì không Chúng ta sử dụng lệnh IF và toán tử % (để lấy phần dư) trong C

Chương trình C

Dưới đây là chương trình C để giải bài tập C trên:

Trang 15

++x ;

2 Tìm tất cả các số nguyên tố từ 2 đến 100 bằng lệnh For

3 Tìm các số nguyên có 3 chữ số sao cho tổng 3 chữ bằng tích 3 chữ Ví dụ: 123

4 Dùng lệnh while để viết chương trình tính:

S1 = 1 x 3 x 5 x 7 x 9 x ( 2n - 1 )

S2 = 2 x 4 x 6 x 8 x x (2n)

5 Làm lại bài trên bằng cách dùng do while

6 Viết chương trình nhập vào n số nguyên dương, tính trung bình cộng các

số chẵn

Trang 16

7 Viết chương trình nhập vào n số nguyên dương, tính trung bình cộng các

Trang 17

Bài 6 Các kiểu dữ liệu có cấu trúc Mục tiêu:

- Cung cấp khái niệm về chuỗi và các hàm xử lý chuỗi

- Cung cấp các kiến thức về tổ chức dữ liệu kiểu mảng

- Cung cấp các kiến thức về tổ chức dữ liệu kiểu cấu trúc

Nội dung:

6.1 Mảng

Mảng là một tập hợp các phần tử cố định có cùng một kiểu, gọi là kiểu phần

tử Kiểu phần tử có thể là có các kiểu bất kỳ: ký tự, số, chuỗi ký tự…; cũng có khi

ta sử dụng kiểu mảng để làm kiểu phần tử cho một mảng (trong trường hợp này

ta gọi là mảng của mảng hay mảng nhiều chiều)

Ta có thể chia mảng làm 2 loại: mảng 1 chiều và mảng nhiều chiều

Mảng là kiểu dữ liệu được sử dụng rất thường xuyên Chẳng hạn người ta cần quản lý một danh sách họ và tên của khoảng 100 sinh viên trong một lớp Nhận thấy rằng mỗi họ và tên để lưu trữ ta cần 1 biến kiểu chuỗi, như vậy 100 họ

và tên thì cần khai báo 100 biến kiểu chuỗi Nếu khai báo như thế này thì đoạn khai báo cũng như các thao tác trên các họ tên sẽ rất dài dòng và rắc rối Vì thế, kiểu dữ liệu mảng giúp ích ta trong trường hợp này; chỉ cần khai báo 1 biến, biến này có thể coi như là tương đương với 100 biến chuỗi ký tự; đó là 1 mảng mà các phần tử của nó là chuỗi ký tự Hay như để lưu trữ các từ khóa của ngôn ngữ lập trình C, ta cũng dùng đến một mảng để lưu trữ chúng

Trang 18

- Kiểu: mỗi phần tử của mảng có dữ liệu thuộc kiểu gì

- Ở đây, ta khai báo một biến mảng gồm có số phần tử phần tử, phần tử thứ nhất là tên mảng [0], phần tử cuối cùng là tên mảng[số phần tử -1]

Tên phần tửa[0] a[1]a[2]a[3]a[4]a[5]a[6]a[7] a[8] a[9]

* Khai báo mảng với số phần tử không xác định (khai báo không tường minh)

Cú pháp: <Kiểu> <Tên mảng> <[]>

Khi khai báo, không cho biết rõ số phần tử của mảng, kiểu khai báo này thường được áp dụng trong các trường hợp: vừa khai báo vừa gán giá trị, khai báo mảng là tham số hình thức của hàm

a Vừa khai báo vừa gán giá trị

Cú pháp:

<Kiểu> <Tên mảng> []= {Các giá trị cách nhau bởi dấu phẩy}

Nếu vừa khai báo vừa gán giá trị thì mặc nhiên C sẽ hiểu số phần tử của mảng là số giá trị mà chúng ta gán cho mảng trong cặp dấu {} Chúng ta có thể

sử dụng hàm sizeof() để lấy số phần tử của mảng như sau:

Số phần tử=sizeof(tên mảng)/ sizeof(kiểu)

b Khai báo mảng là tham số hình thức của hàm, trong trường hợp này ta không cần chỉ định số phần tử của mảng là bao nhiêu

6.1.1.2 Truy xuất từng phần tử của mảng

Mỗi phần tử của mảng được truy xuất thông qua Tên biến mảng theo sau là chỉ số nằm trong cặp dấu ngoặc vuông [ ] Chẳng hạn a[0] là phần tử đầu tiên của mảng a được khai báo ở trên Chỉ số của phần tử mảng là một biểu thức mà giá trị

là kiểu số nguyên

Với cách truy xuất theo kiểu này, Tên biến mảng[Chỉ số] có thể coi như là một biến có kiểu dữ liệu là kiểu được chỉ ra trong khai báo biến mảng

Trang 19

n lần Như vậy trong trường hợp này ta sử dụng 1 vòng lặp để in ra giá trị các phần tử

Ta có đoạn chương trình sau:

Trang 20

#include<conio.h>

#include<stdio.h>

int main()

{

Trang 21

NhiPhan[K]=Du; /* Lưu số dư vào mảng ở vị trí K*/

K++; /* Tăng K lên để lần kế lưu vào vị trí kế*/

Đầu tiên đưa phần tử thứ nhất so sánh với các phần tử còn lại, nếu nó lớn hơn một phần tử đang so sánh thì đổi chỗ hai phần tử cho nhau Sau đó tiếp tục so sánh phần tử thứ hai với các phần tử từ thứ ba trở đi cứ tiếp tục như vậy cho đến phần tử thứ n-1

Chương trình sẽ được chia thành các hàm Nhap (Nhập các số), SapXep (Sắp xếp) và InMang (In các số); các tham số hình thức của các hàm này là 1 mảng không chỉ định rõ số phần tử tối đa, nhưng ta cần có thêm số phần tử thực tế được

sử dụng của mảng là bao nhiêu, đây là một giá trị nguyên

#include<conio.h>

#include<stdio.h>

Trang 22

/*Nhap so phan tu mang*/

printf("So phan tu thuc te cua mang N= "); scanf("%d",&n); /*Nhap cac phan tu vao mang*/

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

{

printf("Phan tu thu %d: ",i);scanf("%d",&a[i]);

}

/*In cac phan tu vua nhap - mang chua sap xep*/

printf("\n Day vua nhap: ");

/*In mang sau khi sap xep*/

printf("\n Day da sap xep: ");

for(i=0;i<n;i++) printf("%3d",a[i]);

getch();

return 0;

}

Trang 23

<Kiểu> <Tên mảng><[Số phần tử chiều 1]><[Số phần tử chiều 2]>

Ví dụ: Người ta cần lưu trữ thông tin của một ma trận gồm các số thực Lúc này ta có thể khai báo một mảng 2 chiều như sau:

float m[8][9]; /* Khai báo mảng 2 chiều có 8*9 phần tử là số thực*/

Trong trường hợp này, ta đã khai báo cho một ma trận có tối đa là 8 dòng, mỗi dòng có tối đa là 9 cột Hình ảnh của ma trận này được cho trong hình sau:

* Khai báo mảng 2 chiều không tường minh

Để khai báo mảng 2 chiều không tường minh, ta vẫn phải chỉ ra số phần tử của chiều thứ hai (chiều cuối cùng)

Cú pháp: <Kiểu> <Tên mảng> <[]><[Số phần tử chiều 2]>

Cách khai báo này cũng được áp dụng trong trường hợp vừa khai báo, vừa gán trị hay đặt mảng 2 chiều là tham số hình thức của hàm

Trang 24

6.1.2.2 Truy xuất từng phần tử của mảng 2 chiều

Ta có thể truy xuất một phần tử của mảng hai chiều bằng cách viết ra tên mảng theo sau là hai chỉ số đặt trong hai cặp dấu ngoặc vuông Chẳng hạn ta viết m[2][3]

Với cách truy xuất theo cách này, Tên mảng[Chỉ số 1][Chỉ số 2] có thể coi

là 1 biến có kiểu được chỉ ra trong khai báo biến mảng

Ví dụ 1: Viết chương trình cho phép nhập 2 ma trận a, b có m dòng n cột, thực hiện phép toán cộng hai ma trận a,b và in ma trận kết quả lên màn hình Trong ví dụ này, ta sẽ sử dụng hàm để làm ngắn gọn hơn chương trình của ta

Ta sẽ viết các hàm: nhập 1 ma trận từ bàn phím, hiển thị ma trận lên màn hình, cộng 2 ma trận

printf("Phan tu o dong %d cot %d: ",i,j);

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

} }

void InMaTran(int a[][10], int M, int N)

Trang 25

printf("\n");

}

}

/* Cong 2 ma tran A & B ket qua la ma tran C*/

void CongMaTran(int a[][10],int b[][10],int M,int N,int c[][10]){ int i,j;

int c[10][10];/* Ma tran tong*/

printf("So dong M= "); scanf("%d",&M);

printf("So cot M= "); scanf("%d",&N);

printf("Nhap ma tran A\n");

Trang 26

6.2 Xâu ký tự

Xâu ký tự (chuỗi ký tự) là một dãy gồm các ký tự hoặc một mảng các ký tự được kết thúc bằng ký tự ‘\0’ (còn được gọi là ký tự NULL trong bảng mã ASCII) Các hằng chuỗi ký tự được đặt trong cặp dấu nháy kép

6.2.1 Khai báo

Cú pháp: char <Biến> [Chiều dài tối đa]

Ví dụ: Trong chương trình, ta có khai báo:

Ta có thể vừa khai báo vừa gán giá trị

Cú pháp: char <Biến>[]=<”Hằng chuỗi”>

Ví dụ:

#include<stdio.h>

#include<conio.h>

int main() {

char Chuoi[]="Mau nang hay la mau mat em” ; printf("Vua khai bao vua gan trị: %s”,Chuoi) ; getch();

Trang 27

Ví dụ: Trong chương trình, ta có khai báo:

* Xuất chuỗi lên màn hình

Để xuất một chuỗi (biểu thức chuỗi) lên màn hình, ta sử dụng hàm puts()

printf("Nhap chuoi: ");gets(Ten);

printf("Chuoi vua nhap: ");puts(Ten);

getch();

return 0;}

Ngoài ra, ta có thể sử dụng hàm printf(), cputs() (trong conio.h) để hiển thị chuỗi lên màn hình

Trang 28

6.2.2.2 Một số hàm xử lý chuỗi

* Cộng chuỗi - Hàm strcat()

Cú pháp: char *strcat(char *des, const char *source)

Hàm này có tác dụng ghép chuỗi nguồn (source) vào chuỗi đích (des)

Ví dụ: Nhập vào họ lót và tên của một người, sau đó in cả họ và tên của họ lên màn hình

char HoLot[30], Ten[12];

printf("Nhap Ho Lot: ");gets(HoLot);

printf("Nhap Ten: ");gets(Ten);

strcat(HoLot,Ten); /* Ghep Ten vao HoLot*/

printf("Ho ten la: ");puts(HoLot);

getch();

return 0;

}

* Xác định độ dài chuỗi - Hàm strlen()

Cú pháp: int strlen(const char* s)

Ví dụ: Sử dụng hàm strlen xác định độ dài một chuỗi nhập từ bàn phím

Trang 29

Dodai = strlen(Chuoi)

printf("Chuoi vua nhap: ");puts(Chuoi);

printf(“Co do dai %d”,Dodai);

getch();

return 0;}

* Đổi một ký tự thường thành ký tự hoa - Hàm toupper()

Hàm toupper() (trong ctype.h) được dùng để chuyển đổi một ký tự thường thành ký tự hoa

Cú pháp: char toupper(char c)

* Đổi chuỗi chữ thường thành chuỗi chữ hoa, hàm strupr()

Hàm struppr() được dùng để chuyển đổi chuỗi chữ thường thành chuỗi chữ hoa, kết quả trả về của hàm là một con trỏ chỉ đến địa chỉ chuỗi được chuyển đổi

* Đổi chuỗi chữ hoa thành chuỗi chữ thường, hàm strlwr()

Muốn chuyển đổi chuỗi chữ hoa thành chuỗi toàn chữ thường, ta sử dụng hàm strlwr(), các tham số của hàm tương tự như hàm strupr()

Trang 30

Cú pháp: char *strlwr(char *s)

* Sao chép chuỗi, hàm strcpy()

Hàm này được dùng để sao chép toàn bộ nội dung của chuỗi nguồn vào chuỗi đích

Cú pháp: char *strcpy(char *Des, const char *Source)

Ví dụ: Viết chương trình cho phép chép toàn bộ chuỗi nguồn vào chuỗi đích

* Sao chép một phần chuỗi, hàm strncpy()

Hàm này cho phép chép n ký tự đầu tiên của chuỗi nguồn sang chuỗi đích

Cú pháp: char *strncpy(char *Des, const char *Source, size_t n)

- Nếu ký tự đã chỉ định không có trong chuỗi, kết quả trả về là NULL

- Kết quả trả về của hàm là một con trỏ, con trỏ này chỉ đến ký tự c được tìm thấy đầu tiên trong chuỗi str

Trang 31

* Tìm kiếm nội dung chuỗi, hàm strstr()

Hàm strstr() được sử dụng để tìm kiếm sự xuất hiện đầu tiên của chuỗi s2 trong chuỗi s1

Cú pháp: char *strstr(const char *s1, const char *s2)

Kết quả trả về của hàm là một con trỏ chỉ đến phần tử đầu tiên của chuỗi s1

có chứa chuỗi s2 hoặc giá trị NULL nếu chuỗi s2 không có trong chuỗi s1

Ví dụ: Viết chương trình sử dụng hàm strstr() để lấy ra một phần của chuỗi gốc bắt đầu từ chuỗi “hoc”

Cú pháp: int strcmp(const char *s1, const char *s2)

Hai chuỗi s1 và s2 được so sánh với nhau, kết quả trả về là một số nguyên (số này có được bằng cách lấy ký tự của s1 trừ ký tự của s2 tại vị trí đầu tiên xảy

ra sự khác nhau)

- Nếu kết quả là số âm, chuỗi s1 nhỏ hơn chuỗi s2

- Nếu kết quả là 0, hai chuỗi bằng nhau

- Nếu kết quả là số dương, chuỗi s1 lớn hơn chuỗi s2

Trang 32

* So sánh chuỗi, hàm stricmp()

Hàm này thực hiện việc so sánh trong n ký tự đầu tiên của 2 chuỗi s1 và s2, giữa chữ thường và chữ hoa không phân biệt

Cú pháp: int stricmp(const char *s1, const char *s2)

Kết quả trả về tương tự như kết quả trả về của hàm strcmp()

* Khởi tạo chuỗi, hàm memset()

Hàm này được sử dụng để đặt n ký tự đầu tiên của chuỗi là ký tự c

Cú pháp: memset(char *Des, int c, size_t n)

* Đổi từ chuỗi ra số, hàm atoi(), atof(), atol() (trong stdlib.h)

Để chuyển đổi chuỗi ra số, ta sử dụng các hàm trên

Cú pháp: int atoi(const char *s): chuyển chuỗi thành số nguyên

long atol(const char *s): chuyển chuỗi thành số nguyên dài

float atof(const char *s): chuyển chuỗi thành số thực

Nếu chuyển đổi không thành công, kết quả trả về của các hàm là 0

Ngoài ra, thư viện string.h còn hỗ trợ các hàm xử lý chuỗi khác, ta có thể đọc thêm trong phần trợ giúp

Trang 33

Cách 2: Sử dụng từ khóa typedef để định nghĩa kiểu:

Ví dụ 1: Để quản lý ngày, tháng, năm của một ngày trong năm ta có thể khai báo kiểu cấu trúc gồm 3 thông tin: ngày, tháng, năm

struct NgayThang

{ unsigned char Ngay;

unsigned char Thang;

unsigned int Nam;

};

typedef struct

{ unsigned char Ngay;

unsigned char Thang;

unsigned int Nam;

} NgayThang;

Trang 34

Ví dụ 2: Mỗi sinh viên cần được quản lý bởi các thông tin: mã số sinh viên,

họ tên, ngày tháng năm sinh, giới tính, địa chỉ thường trú Lúc này ta có thể khai báo một struct gồm các thông tin trên

struct SinhVien

{ char MSSV[10];

6.3.2 Khai báo biến cấu trúc

Việc khai báo biến cấu trúc cũng tương tự như khai báo biến thuộc kiểu dữ liệu chuẩn

Cú pháp:

- Đối với cấu trúc được định nghĩa theo cách 1:

struct <Tên cấu trúc> <Biến 1> [, <Biến 2>…];

- Đối với các cấu trúc được định nghĩa theo cách 2:

<Tên cấu trúc> <Biến 1> [, <Biến 2>…];

Ví dụ: Khai báo biến NgaySinh có kiểu cấu trúc NgayThang; biến SV có kiểu cấu trúc SinhVien

struct NgayThang NgaySinh;

Trang 35

struct SinhVien SV;

NgayThang NgaySinh;

SinhVien SV;

6.3.3 Khởi tạo cấu trúc

Việc khởi tạo cấu trúc có thể được thực hiện trong lúc khai báo biến cấu trúc Các trường của cấu trúc được khởi tạo được đạt giữa 2 dấu { và }, chúng được phân cách nhau bởi dấu phẩy (,)

Ví dụ: Khởi tạo biến cấu trúc NgaySinh:

struct NgayThang NgaySinh ={29, 8, 1986};

6.3.4 Các thao tác trên biến kiểu cấu trúc

Truy xuất đến từng trường của biến cấu trúc

Cú pháp: <Biến cấu trúc>.<Tên trường>

Khi sử dụng cách truy xuất theo kiểu này, các thao tác trên <Biến cấu trúc>.<Tên trường> giống như các thao tác trên các biến của kiểu dữ liệu của

unsigned char Thang;

unsigned int Nam;

} NgayThang;

typedef struct

{ char MSSV[10];

char HoTen[40];

Trang 36

int main()

{

SinhVien SV, s;

printf("Nhap MSSV: ");gets(SV.MSSV);

printf("Nhap Ho va ten: ");gets(SV.HoTen);

printf("Sinh ngay: ");scanf("%d",&SV.NgaySinh.Ngay);

Trang 37

- Các biến cấu trúc có thể gán cho nhau Thực chất đây là thao tác trên toàn

bộ cấu trúc không phải trên một trường riêng rẽ nào Chương trình trên dòng s=SV

là một ví dụ

- Với các biến kiểu cấu trúc ta không thể thực hiện được các thao tác sau đây:

- Sử dụng các hàm xuất nhập trên biến cấu trúc

- Các phép toán quan hệ, các phép toán số học và logic

Bài tập mẫu

I Bài tập về mảng

A Mảng 1 chiều

Bài tập 1: In các phân tử của một mảng

Chương trình C này sẽ giúp bạn hiểu cách in một mảng trong C Chúng ta cần khai báo và định nghĩa một mảng và sau đó sử dụng một vòng lặp để duyệt qua tất cả các phần tử trong mảng Tại mỗi vòng lặp, chúng ta sẽ in một giá trị tại một chỉ mục trong mảng

printf("In tat ca phan tu cua mang: \n\n");

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

printf("%d ", array[loop]);

return 0;

}

Biên dịch chương trình C trên sẽ cho kết quả:

Trang 38

Bài tập 2: Cách in mảng theo chiều đảo ngược

Để in mảng theo thứ tự đảo ngược, bạn cần biết trước độ dài của mảng Sau

đó chúng ta sử dụng một vòng lặp bắt đầu từ chỉ mục cuối cùng (là độ dài của mảng) đến giá trị 0 và trong mỗi vòng lặp sẽ in giá trị tại chỉ mục đó

for(loop = 9; loop >= 0; loop )

printf("%d ", array[loop]);

return 0;

}

Biên dịch chương trình C trên sẽ cho kết quả:

Bài tập 3: Tính tổng giá trị mảng

Chương trình C này giúp bạn hiểu được cách đọc các giá trị trong một mảng

Để giải bài tập C này, chúng ta sẽ sử dụng một vòng lặp và tính tổng tất cả các giá trị của mảng

Trang 39

sum = 0 ;

printf ( "Chuong trinh tinh tong GT cac phan tu mang: \n\n" );

for ( loop = 9 ; loop >= 0 ; loop ) {

sum = sum + array [ loop ];

}

printf ( "Tong gia tri cua mang la: %d." , sum );

return 0 ;

}

Biên dịch chương trình C trên sẽ cho kết quả:

Bài tập 4: Tính giá trị trung bình của mảng

Chương trình C này giúp bạn hiểu được cách đọc các giá trị trong một mảng

Để giải bài tập C này, chúng ta sẽ sử dụng một vòng lặp và tính tổng tất cả các giá trị của mảng Sau đó chia giá trị này cho số phần tử trong mảng sẽ thu được giá trị trung bình của tất cả các giá trị của mảng đó

printf("Chuong trinh tinh GTTB cua mang: \n\n");

for(loop = 0; loop < 10; loop++) {

sum = sum + array[loop];

}

Trang 40

avg = (float)sum / loop;

printf("Gia tri trung binh cua mang la: %.2f", avg); return 0;

}

Biên dịch chương trình C trên sẽ cho kết quả:

Bài tập 5: Tìm giá trị lớn nhất của mảng

Chương trình tìm giá trị lớn nhất của mảng là một chương trình C điển hình

về mảng Chương trình này giúp bạn hiểu cách sử dụng vòng lặp, mảng, lệnh IF

và các toán tử điều kiện trong C

Để giải bài tập C này, chúng ta duyệt qua từng phần tử trong mảng và kiểm tra xem phần tử đó có phải là lớn nhất không

if( largest < array[loop] )

largest = array[loop]; }

printf("Phan tu lon nhat cua mang la: %d", largest); return 0;}

Biên dịch chương trình C trên sẽ cho kết quả:

Ngày đăng: 25/03/2022, 09:07

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

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

w