Ngôn ngữ lập trình C - Chương 5: Cấu trúc điều khiển

Một chương trình bao gồm nhiều câu lệnh. Thông thường các câu lệnh được

thực hiện một cách lần lượt theo thứ tự mà chúng được viết ra. Các cấu trúc điều

khiển cho phép thay đổi trật tự nói trên, do đó máy có thể nhảy thực hiện một câu

lệnh khác ở một ví trí trước hoặc sau câu lệnh hiện thời.

Xét về mặt công dụng, có thể chia các cấu trúc điều khiển thành các nhóm

chính :

Nhảy không có điều kiện.

Rẽ nhánh.

Tổ chức chu trình.

Ngoài ra còn một số toán tử khác có chức năng bổ trợ như break, continue.

pdf20 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 1830 | Lượt tải: 1download
Tóm tắt nội dung Ngôn ngữ lập trình C - Chương 5: Cấu trúc điều khiển, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
printf("Gioi\n");break; 
 default:printf(Vao sai\n); 
 } 
 printf("Tiep tuc 1, dung 0 :") 
 scanf("%d",&diem); 
 if (diem==1) goto tt; 
 getch(); 
 return; 
 } 
5.4. Cấu trúc lặp : 
5.4.1. Cấu trúc lặp với toán tử while và for : 
5.4.1.1. Cấu trúc lặp với toán tử while : 
 Toán tử while dùng để xây dựng chu trình lặp dạng : 
 while ( biểu thức ) 
 Lệnh hoặc khối lệnh; 
 Như vậy toán tử 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ú ý : 
Chương 5: Cấu trúc điều khiển 
51 
 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 toán tử while lại có thể sử dụng các toán tử 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 toán tử while sâu nhất 
chứa câu lệnh này. 
 Trong thân while có thể sử dụng toán tử 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 toán tử return trong thân while 
để ra khỏi một hàm nào đó. 
Ví dụ : 
 Chương trình tính tích vô hướng của hai véc tơ x và y : 
Cách 1 : 
#include "stdio.h" 
float x[]={2,3.4,4.6,21}, y[]={24,12.3,56.8,32.9}; 
main() 
 { 
 float s=0; 
 int i=-1; 
 while (++i<4) 
 s+=x[i]*y[i]; 
 printf("\n Tich vo huong hai vec to x va y la :%8.2f",s); 
 } 
Cách 2 : 
#include "stdio.h" 
float x[]={2,3.4,4.6,21}, y[]={24,12.3,56.8,32.9}; 
main() 
 { 
Chương 5: Cấu trúc điều khiển 
52 
 float s=0; 
 int i=0; 
 while (1) 
 { 
 s+=x[i]*y[i]; 
 if (++i>=4) goto kt; 
 } 
 kt:printf("\n Tich vo huong hai vec to x va y la :%8.2f",s); 
 } 
Cách 3 : 
#include "stdio.h" 
float x[]={2,3.4,4.6,21}, y[]={24,12.3,56.8,32.9}; 
main() 
 { 
 float s=0; 
 int i=0; 
 while ( s+=x[i]*y[i], ++i<=3 ); 
 printf("\n Tich vo huong hai vec to x va y la :%8.2f",s); 
 } 
5.4.1.2. Cấu trúc lặp với toán tử for : 
 Toán tử 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 ; 
 Toán tử 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 ; . 
Chương 5: Cấu trúc điều khiển 
53 
 Thông thường biểu thức 1 là toán tử 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 toán tử gán dùng để thay đổi giá trị biến điều khiển. 
Hoạt động của toán tử for : 
Toán tử 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. 
 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 toán tử for khác, vì thế ta có thể 
xây dựng các toán tử for lồng nhau. 
 Khi gặp câu lệnh break trong thân for, máy ra sẽ ra khỏi toán tử for sâu nhất 
chứa câu lệnh này. Trong thân for cũng có thể sử dụng toán tử goto để nhảy đến một 
ví trí mong muốn bất kỳ. 
Ví dụ 1: 
Chương 5: Cấu trúc điều khiển 
54 
 Nhập một dãy số rồi đảo ngược thứ tự của nó. 
Cách 1: 
 #include “stdio.h” 
 float x[]={1.3,2.5,7.98,56.9,7.23}; 
 int n=sizeof(x)/sizeof(float); 
 main() 
 { 
 int i,j; 
 float c; 
 for (i=0,j=n-1;i<j;++i,--j) 
 { 
 c=x[i];x[i]=x[j];x[j]=c; 
 } 
 fprintf(stdprn,“\n Day so dao la \n\n”); 
 for (i=0;i<n;++i) 
 fprintf(stdprn,“%8.2f”,x[i]); 
 } 
Cách 2 : 
 #include “stdio.h” 
 float x[]={1.3,2.5,7.98,56.9,7.23}; 
 int n=sizeof(x)/sizeof(float); 
 main() 
 { 
 int i,j; 
 float c; 
 for (i=0,j=n-1;i<j;c=x[i],x[i]=x[j],x[j]=c,++i,--j) 
 fprintf(stdprn,“\n Day so dao la \n\n”); 
Chương 5: Cấu trúc điều khiển 
55 
 for (i=0;++i<n;) 
 fprintf(stdprn,“%8.2f”,x[i]); 
 } 
Cách 3 : 
 #include “stdio.h” 
 float x[]={1.3,2.5,7.98,56.9,7.23}; 
 int n=sizeof(x)/sizeof(float); 
 main() 
 { 
 int i=0,j=n-1; 
 float c; 
 for ( ; ; ) 
 { 
 c=x[i];x[i]=x[j];x[j]=c; 
 if (++i>--j) break; 
 } 
 fprintf(stdprn,“\n Day so dao la \n\n”); 
 for (i=-1;i++<n-1; fprintf(stdprn,“%8.2f”,x[i])); 
 } 
Ví dụ 2: 
 Tính tích hai ma trận mxn và nxp. 
 #include "stdio.h" 
 float x[3][2],y[2][4],z[3][4],c; 
 main() 
 { 
 int i,j; 
 printf("\n nhap gia tri cho ma tran X "); 
Chương 5: Cấu trúc điều khiển 
56 
 for (i=0;i<=2;++i) 
 for (j=0;j<=1;++j) 
 { 
 printf("\n x[%d][%d]=",i,j); 
 scanf("%f",&c); 
 x[i][j]=c; 
 } 
 printf("\n nhap gia tri cho ma tran Y "); 
 for (i=0;i<=1;++i) 
 for (j=0;j<=3;++j) 
 { 
 printf("\n y[%d][%d]=",i,j); 
 scanf("%f",&c); 
 y[i][j]=c; 
 } 
 for (i=0;i<=3;++i) 
 for (j=0;j<=4;++j) 
 z[i][j] 
 } 
5.4.2. Chu trình do-while 
 Khác với các toán tử 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. 
Chương 5: Cấu trúc điều khiển 
57 
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 toán tử while. 
Chú ý : 
 Những điều lưu ý với toán tử while ở trên hoàn toàn đúng với do while. 
Ví dụ : 
 Đoạn chương trình xác định phần tử âm đầu tiên trong các phần tử của mảng 
x. 
#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); 
Chương 5: Cấu trúc điều khiển 
58 
 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 "); 
 } 
5.5. 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 toán tử 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ố 
nguyên 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ố 
nguyên dương n, xem n có là số nguyên tố. 
# include "stdio.h" 
# include "math.h" 
unsigned int n; 
main() 
 { 
 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; 
 } 
Chương 5: Cấu trúc điều khiển 
59 
 if (nt) 
 printf("\n %d la so nguyen to",n); 
 else 
 printf("\n %d khong la so nguyen to",n); 
 } 
5.6. 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ừ một nhập một ma trận a sau đó : 
 Tính tổng các phần tử dương của a. 
 Xác định số phần tử dương của a. 
 Tìm cực đại trong các phần tử dương của a. 
#include "stdio.h" 
float a[3[4]; 
main() 
 { 
 int i,j,soptd=0; 
 float tongduong=0,cucdai=0,phu; 
 for (i=0;i<3;++i) 
 for (j=0;i<4;++j) 
 { 
Chương 5: Cấu trúc điều khiển 
60 
 printf("\n a[%d][%d]=",i,j ); 
 scanf("%f",&phu); 
 a[i][j]=phu; 
 if (a[i][j]<=0) continue; 
 tongduong+=a[i][j]; 
 if (cucdai<a[i][j]) cucdai=a[i][j]; 
 ++soptd; 
 } 
 printf("\n So phan tu duong la : %d",soptd); 
 printf("\n Tong cac phan tu duong la : %8.2f",tongduong); 
 printf("\n Cuc dai phan tu duong la : %8.2f",cucdai); 
 } 
Chương 5: Cấu trúc điều khiển 
61 

File đính kèm:

  • pdfCHUONG_5.pdf
Tài liệu liên quan