(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 1Bà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 2Trong 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 35.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 4Lệ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 5tong=tong+i; /*có thể viết là tong+=i*/
i=i+1;/*có thể viết là i++*/
Trang 6Chu 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 10Biê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 11Bà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 12Biê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 13printf("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 14Biê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 167 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 17Bà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 19n 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 21NhiPhan[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 246.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 25printf("\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 266.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 27Ví 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 286.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 29Dodai = 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 30Cú 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 33Cá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 34Ví 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 35struct 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 36int 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 38Bà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 39sum = 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 40avg = (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ả: