Tải bản đầy đủ (.pdf) (116 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.16 MB, 116 trang )

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ó ln đượ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.


64


Trong dấu ngoặc trịn sau từ khố 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ỳ.
Ví dụ 1:
Nhập n số nguyên dương từ bàn phím, tính và in ra màn hình tổng n số này.
#include <stdio.h>
#include <conio.h>
main()
{
int i, tong=0,n,a;
clrscr();
printf("Chuong trinh tinh tong n so nguyen nhap tu ban phim \nCho biet
n=");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("Nhap so thu %d ",i);
scanf("\n%d",&a);
tong+=a;
}

printf("\nTong %d so vua nhap la %d",n,tong);
getch();
return 0;
}
65


Ví dụ 2:
Nhập n số nguyên dương từ bàn phím, tính và in ra màn hình trung bình
cộng các số lẻ.
#include <stdio.h>
#include <conio.h>
main()
{
int i, tong=0,n,a,dem=0;
clrscr();
printf("Chuong trinh tinh trung binh cong cac so le nhap tu ban phim \nCho
biet n=");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("Nhap so thu %d ",i);
scanf("\n%d",&a);
if (a%2 !=0)
{
tong+=a;
dem++;
}
}
printf("\nTung binh cong %d so le vua nhap la %8.2f",dem,

((float)tong)/dem);
getch();
return 0;
}
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)
66


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 đó.
Ví dụ 1:
Chương trình tính tổng 10 số nguyên dương đầu tiên:
Cách 1:
#include <stdio.h>
#include <conio.h>
main()
{
int i=1, tong=0;
while (i<=10)
{
67


tong=tong+i; /*có thể viết là tong+=i*/
i=i+1;/*có thể viết là i++*/
}
printf(" \n Tong 10 so nguyen duong dau tien la %d",tong);
getch();
return 0;
}
Cách 2:
#include <stdio.h>
#include <conio.h>
main()
{
int i=1, tong=0;
while (tong+=i,++i<=10);
printf(" \n Tong 10 so nguyen duong dau tien la %d",tong);

getch();
return 0;
}
Ví dụ 2:
Nhập n số nguyên dương từ bàn phím, tính và in ra màn hình tổng n số này.
#include <stdio.h>
#include <conio.h>
main()
{
int i=1, tong=0,n,a;
clrscr();
printf("Chuong trinh tinh tong n so nguyen nhap tu ban phim \nCho biet
n=");
scanf("%d",&n);
while (i<=n)
68


{
printf("Nhap so thu %d ",i);
scanf("\n%d",&a);
tong+=a;
i++;
}
printf("\nTong %d so vua nhap la %d",n,tong);
getch();
return 0;
}
5.2 Chu trình do-while
Khác với các câu lệnh while và for, việc kiểm tra điều kiện kết thúc đặt ở đầu chu

trình, trong chu trình do while việc kiểm tra điều kiện kết thúc đặt cuối chu trình. Như
vậy thân của chu trình bao giờ cũng được thực hiện ít nhất một lần.
Chu trình do while có dạng sau:
do
Lệnh hoặc khối lệnh;
while (biểu thức);
Lệnh hoặc khối lệnh là thân của chu trình có thể là một lệnh riêng lẻ hoặc là
một khối lệnh.
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.
69


Ví dụ:
Viết chương trình tính tích 10 số ngun dương đầu tiên (S=1*2*3*…*10)
#include <stdio.h>
#include <conio.h>
main()
{
int i=1;
float tich=1;
do

{
tich*=i;
i++;
} while (i<=10);
printf(" \n Tich 10 so nguyen duong dau tien la %10.0f",tich);
getch();
return 0;
}
5.3 Câu lệnh break
Câu lệnh break cho phép ra khỏi các chu trình với các câu lệnh for, while và
switch. Khi có nhiều chu trình lồng nhau, câu lệnh break sẽ đưa máy ra khỏi chu
trình bên trong nhất chứa nó khơng cần điều kiện gì. Mọi câu lệnh break có thể
thay bằng câu lệnh goto với nhãn thích hợp.
Ví dụ:
Biết số nguyên dương n sẽ là số nguyên tố nếu nó khơng chia hết cho các số
ngun trong khoảng từ 2 đến căn bậc hai của n. Viết đoạn chương trình đọc vào
số ngun dương n, xem n có là số nguyên tố.
# include "stdio.h"
#include <conio.h>
# include "math.h"
unsigned int n;
main()
70


{
int i,nt=1;
printf("\n Cho n=");
scanf("%d",&n);
for (i=2;i<=sqrt(n);++i)

if ((n % i)==0)
{
nt=0;
break;
}
if (nt)
printf("\n %d la so nguyen to",n);
else
printf("\n %d khong la so nguyen to",n);
getch();
return 0;
}
5.4 Câu lệnh continue
Trái với câu lệnh break, lệnh continue dùng để bắt đầu một vịng mới của
chu trình chứa nó. Trong while và do while, lệnh continue chuyển điều khiển về
thực hiện ngay phần kiểm tra, còn trong for điều khiển được chuyển về bước khởi
đầu lại (tức là bước: 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ú ý:
Lệnh continue chỉ áp dụng cho chu trình chứ khơng áp dụng cho switch.
Ví dụ:
Viết chương trình tính trung bình cộng các số lẻ trong n số nguyên dương
nhập từ bàn phím.
#include <stdio.h>
#include <conio.h>
main()
71


{ int i, tong=0,n,a,dem=0;

clrscr();
printf("Chuong trinh trung binh cong cac so le nhap tu ban phim \nCho biet
n=");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("Nhap so thu %d ",i);
scanf("\n%d",&a);
if (a%2 ==0) continue;
tong+=a;
dem++;}
printf("\nTung binh cong %d so le vua nhap la %8.2f",dem,
((float)tong)/dem);
getch();
return 0;}
Bài tập mẫu
Bài tập 1: In các số từ 1-10 theo thứ tự tăng dần?
Đâ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.
Chương trình C:
Dưới đây là chương trình C để in các số 1-10 theo thứ tự tăng dần.
#include <stdio.h>
int main() {
int i, start, end;
start = 1;
end = 10;
printf("In cac so theo thu tu tang dan:\n");
for(i = start; i <= end; i++)
printf("%2d\n", i);
return 0;}

72


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.
Chương trình C
Dưới đây là chương trình C để in các số 1-10 theo thứ tự giảm dần.
#include <stdio.h>
int main() {
int i, start, end;
start = 1;
end = 10;
printf("In cac so theo thu tu giam dan:\n");
for(i = end; i >= start; i--)
printf("%2d\n", i);
return 0;
}
Biên dịch chương trình C trên sẽ cho kết quả:

73


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 ngồ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.
Chương trình C
Dưới đây là chương trình C để giải bài tập C trên:
#include <stdio.h>
int main() {
int i, j, count;
printf("In bang so: \n");
for(i = 1; i <= 10; i++) {
for(j = i; j <=100; j += 10 )
printf(" %3d", j);
printf("\n");
}
return 0;
}
Biên dịch chương trình C trên sẽ cho kết quả:

74


Bài tập 4: In bảng nhân
In một bảng nhân của một số bất kỳ với các số từ 1 tới 10 và hiển thị kết quả.
Với bài tập C này, chúng ta chỉ sử dụng một vòng lặp và tăng dần giá trị của
số nhân lên.
Chương trình C
Dưới đây là chương trình C để giải bài tập C trên:
#include <stdio.h>
int main() {
int i, j, n;
n = 3;

j = 1;
printf("In bang nhan:\n");
for(i = n; i <= (n*10); i+=n) {
printf("%3d

x %2d

=

%3d\n", n, j, i);

j++;
}
return 0;
}
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 ngồ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.
75


Chương trình C
Dưới đây là chương trình C để giải bài tập C trên:
#include <stdio.h>
int main() {
int i, j, count;

int start, end;
start = 2, end = 10;
printf("In bang cuu chuong rut gon:\n");
for(i = start; i <= end; i++) {
count = i;
for(j = 1; j <= 10; j++) {
printf(" %3d", count*j);
}
printf("\n");
}
return 0;
}
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, ngồ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à tốn tử % (để lấy phần dư)
trong C.
76


Chương trình C
Dưới đây là chương trình C để giải bài tập C trên:
#include <stdio.h>

#include <stdio.h>


int main() {
int i;

printf("In cac so chan:\n");
for(i = 1; i <= 10; i++) {
if(i%2 == 0)
printf(" %2d\n", i);
}
return 0;
}

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, ngồ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:
77


#include <stdio.h>

int main() {
int i;


printf("In cac so le:\n");
for(i = 1; i <= 10; i++) {
if(i%2 != 0)
printf("%d\n", i);
}
return 0;
}

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

Bài tập luyện tập
1. Kiểm tra tìm lỗi:
while ( x<.= 10)
Total t=x;
++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ố ngun 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.
78


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
số lẻ chia hết cho 3.
8. Có hai phương thức gửi tiền tiết kiệm: gửi khơng kỳ hạn lãi suất
2.4%/tháng, mỗi tháng tính lãi một lần, gửi có kỳ hạn 3 tháng lãi suất 4%/tháng,

3 tháng tính lãi một lần.
Viết chương trình tính tổng cộng số tiền cả vốn lẫn lời sau một thời gian gửi
nhập từ bàn phím.

79


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.
6.1.1 Mảng 1 chiều

Nếu xét dưới góc độ tốn học, mảng 1 chiều giống như một vector. Mỗi
phần tử của mảng một chiều có giá trị không phải là một mảng khác.
6.1.1.1 Khai báo
* Khai báo mảng với số phần tử xác định (khai báo tường minh)
Cú pháp: <Kiểu> <Tên mảng ><[số phần tử]>
Ý nghĩa:
- Tên mảng: đây là một cái tên đặt đúng theo quy tắc đặt tên của danh biểu.
Tên này cũng mang ý nghĩa là tên biến mảng.
- Số phần tử: là một hằng số nguyên, cho biết số lượng phần tử tối đa trong
mảng là bao nhiêu (hay nói khác đi kích thước của mảng là gì).
80


- 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]
Ví dụ:
int a[10]; /* Khai báo biến mảng tên a, phần tử thứ nhất là a[0], phần tử cuối
cùng là a[9].*/
Ta có thể coi mảng a là một dãy liên tiếp các phần tử trong bộ nhớ như sau:
Vị trí 0 1234 56 789
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.
81


Ví dụ 1:
int a[10];
Trong khai báo này, việc truy xuất các phần tử được chỉ ra trong hình sau.
Chẳng hạn phần tử thứ 2 (có vị trí 1) là a[1]…
1

2

3

4

5


6

7

8

9

10

a[0]

a[1]

a[2]

a[3]

a[4]

a[5]

a[6]

a[7]

a[8]

a[9]


Ví dụ 2:
Vừa khai báo vừa gán trị cho 1 mảng 1 chiều các số nguyên. In mảng số
nguyên này lên màn hình.
Giả sử ta đã biết số phần tử của mảng là n; việc hiển thị 1 giá trị số nguyên
lên màn hình ta cần sử dụng hàm printf() với định dạng %d, tổng quát hóa lên nếu
muốn hiển thị lên màn hình giá trị của n số nguyên, ta cần gọi hàm printf() đúng
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:
#include <stdio.h>
#include <conio.h>
int main()
{
int n,i,j,tam;
int dayso[]={66,65,69,68,67,70};
clrscr();
n=sizeof(dayso)/sizeof(int); /*Lấy số phần tử*/
printf("\n Noi dung cua mang ");
for (i=0;iprintf("%d ",dayso[i]);
getch();
return 0;
}
82


Ví dụ 3:
#include "stdio.h"
float x[5],c;
main()

{
int i=0;
printf("\n nhap gia tri cho ma tran x ");
for (i=0;i<=4;++i)
{
printf("\n x[%d]=",i);
scanf("%f",&c);
y[i]=c;
}
do
++i;
while (x[i]>=0 && i<=4);
if (i<=4)
printf("\n Phan tu am dau tien = x[%d]=%8.2f",i,x[i]);
else
printf("\n Mang khong có phan tu am ");
}
Ví dụ 4:
Đổi một số nguyên dương thập phân thành số nhị phân. Việc chuyển đổi này
được thực hiện bằng cách lấy số đó chia liên tiếp cho 2 cho tới khi bằng 0 và lấy
các số dư theo chiều ngược lại để tạo thành số nhị phân. Ta sẽ dùng mảng một
chiều để lưu lại các số dư đó. Chương trình cụ thể như sau:
#include<conio.h>
#include<stdio.h>
int main()
{
83


int N;

int Du;
int NhiPhan[20],K=0,i;
printf("Nhap vao so nguyen N= ");scanf("%d",&N);
do
{
Du=N % 2;
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ế*/
N = N/2;
} while(N>0);
printf("Dang nhi phan la: ");
for(i=K-1;i>=0;i--)
printf("%d",NhiPhan[i]);
getch();
return 0;
}
Ví dụ 5:
Nhập vào một dãy n số và sắp xếp các số theo thứ tự tăng. Đây là một bài
tốn có ứng dụng rộng rãi trong nhiều lĩnh vực. Có rất nhiều giải thuật sắp xếp.
Một trong số đó được mô tả như sau:
Đầ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>

84


main()
{
int i,j,n,tg;
int a[10];
clrscr();
/*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: ");
for(i=0;i/*Sap xep tang*/
for(i=0;ifor(j=i+1;jif (a[i]>a[j])
{
tg=a[i];
a[i]=a[j];
a[j]=tg;
}
/*In mang sau khi sap xep*/
printf("\n Day da sap xep: ");
for(i=0;i

getch();
return 0;
}
85


6.1.2. Mảng nhiều chiều
Mảng nhiều chiều là mảng có từ 2 chiều trở lên. Điều đó có nghĩa là mỗi
phần tử của mảng là một mảng khác.
Người ta thường sử dụng mảng nhiều chiều để lưu các ma trận, các tọa độ 2
chiều, 3 chiều…
Phần dưới đây là các vấn đề liên quan đến mảng 2 chiều; các mảng 3, 4,…
chiều thì tương tự (chỉ cần tổng qt hóa lên).
6.1.2.1 Khai báo
* Khai báo mảng 2 chiều tường minh
Cú pháp:
<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:
Dịng\ Cột0

1 2 3 4 56 7 8

0m[0][0] m[0][1] m[0][2] m[0][3] m[0][4] m[0][5] m[0][6] m[0][7] m[0][8]
1 m[1][0] m[1][1] m[1][2] m[1][3] m[1][4] m[1][5] m[1][6] m[1][7] m[1][8]
2 m[2][0] m[2][1] m[2][2] m[2][3] m[2][4] m[2][5] m[2][6] m[2][7] m[2][8]
3 m[3][0] m[3][1] m[3][2] m[3][3] m[3][4] m[3][5] m[3][6] m[3][7] m[3][8]

4 m[4][0] m[4][1] m[4][2] m[4][3] m[4][4] m[4][5] m[4][6] m[4][7] m[4][8]
5 m[5][0] m[5][1] m[5][2] m[5][3] m[5][4] m[5][5] m[5][6] m[5][7] m[5][8]
6 m[6][0] m[6][1] m[6][2] m[6][3] m[6][4] m[6][5] m[6][6] m[6][7] m[6][8]
7 m[7][0] m[7][1] m[7][2] m[7][3] m[7][4] m[7][5] m[7][6] m[7][7] m[7][8]

* 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.
86


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.
#include<conio.h>
#include<stdio.h>
void Nhap(int a[][10],int M,int N)
{
int i,j;

for(i=0;ifor(j=0; j{
printf("Phan tu o dong %d cot %d: ",i,j);
scanf("%d",&a[i][j]);
}
}
void InMaTran(int a[][10], int M, int N)
{
int i,j;
for(i=0;i{
for(j=0; j< N; j++)
printf("%d ",a[i][j]);
87


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;
for(i=0;ifor(j=0; jc[i][j]=a[i][j]+b[i][j];
}
int main()
{
int a[10][10], b[10][10], M, N;

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");
Nhap(a,M,N);
printf("Nhap ma tran B\n");
Nhap(b,M,N);
printf("Ma tran A: \n");
InMaTran(a,M,N);
printf("Ma tran B: \n");
InMaTran(b,M,N);
CongMaTran(a,b,M,N,c);
printf("Ma tran tong C:\n");
InMaTran(c,M,N);
getch();
return 0;}
88


×