Giáo trình ngôn ngữ C



tải về 2.34 Mb.
Chế độ xem pdf
trang37/62
Chuyển đổi dữ liệu16.03.2023
Kích2.34 Mb.
#54376
1   ...   33   34   35   36   37   38   39   40   ...   62
C ĐHQGHN

IV.4.
Cấu trúc while
 
while là cấu trúc điều khiển lặp thực hiện một lệnh hay khối lệnh nào đó với số lần 
lặp được xác định tuỳ theo một điều kiện (gọi là điều kiện lặp). 
Cấu trúc của while như sau: 
 while (
S; 
Trong đó bt là một biểu thức nào đó là biểu thức điều kiện lặp, S là thân của while và chỉ 
là một câu lệnh. 
Sự hoạt động của while như sau:
bước 1: tính giá trị của  
bước 2: nếu giá trị tính được của là ‘sai’ (==0) thì kết thúc while 
bước 3: nếu giá trị của là ‘đúng’ (!=0) thì thực hiện S 
bước 4: quay lại bước 1 
ta có sơ đồ điều khiển của while như sau 
 
 
Ví dụ 4.1: Tìm ước số chung lớn nhất của 2 số nguyên x, y theo thuật toán sau: 
a = x; b = y; 
b1: nếu (a = b) thì ước số chung lớn nhất là a, kết thúc 


Gi¸o tr×nh tin häc c¬ së II - N
gôn ngữ
 C
49
ngược lại (a !=b) thì tới bước 2 
b2:

nếu a > b thì ta tính a = a- b

ngược lại ta tính b =b – a

quay lại bước 1
Như vậy chúng ta có thể phát biểu như sau 
Chừng nào (a !=b) thì lặp lại 
nếu a >b thì a = a-b 
ngược lại b = b -a 
kết thúc vòng lặp này thì a=b và là ước chung lớn nhất của x và y.
Đó chỉ xét trường hợp x, y là số nguyên >0. Trong trường hợp nếu một trong hai số bằng 
0 thì ước số chung lớn nhất là trị tuyệt đối của số còn lại, nếu cả 2 số bằng 0 thì không 
xác định được ước số chung lớn nhất. 
chúng ta có chương trình sau 
#include  
#include  
#include  
void main() { 
int a,b,x,y; 
printf("nhap 2 so x, y : "); 
scanf("%d%d", &x,&y); 
a = abs(x); // a bằng trị tuyệt đối của x 
b = abs(y); // b bằng trị tuyệt đối của y 
if(a+b==0) 
printf("ca hai so bang 0"); 
else 
if(a*b==0) 
printf("uoc so chung lon nhat la %d ", a+b); 
else 

while(a!=b) 
if(a>b) a-=b; 
else b-=a; 
printf("uoc so chung lon nhat la %d", a); 

getch(); 

 


Gi¸o tr×nh tin häc c¬ së II - N
gôn ngữ
 C
50
Ví dụ 4.2: Viết chương trình cho phép người sử dụng nhập một ký tự trên bàn phím, in kí 
tự và mã của nó ra màn hình, kết thúc chương trình khi người dùng bấm phím ESC (mã 
27) 
Giải: chúng ta có thể mô tả các bước của chương trình như sau 
1: nhận 1 ký tự từ bàn phím, mã lưu trong biến ch 
ch= getch(); 
2 : nếu ch ==ESC thì kết thúc, ngược lại chuyến sang bước 3 
3 : in ký tự và mã của nó 
printf(“\nKy tu %c co ma %d”, ch,ch) 
4: quay lại 1 
Vậy có chương trình
// In ki tu 
#include  
#include  
#include  
const int ESC =27; // ma phim ESC 
void main(){ 
int ch; 
while((ch=getch())!=ESC) 
printf("\nKi tu %c co ma %d",ch,ch); 

Nhận xét: 
while là cấu trúc điều khiển lặp với điều kiện trước, tức là điều kiện lặp được 
kiểm tra trước khi vào thân của vòng lặp, do vậy nếu biểu thức điều kiện có giá 
trị ‘sai’ ngay từ đầu thì thân của while có thể không được thực hiện lần nào. 
trong thân của while phải có lệnh để làm thay đổi giá trị của biểu thức điều kiện. 
Hoặc nếu biểu thức điều kiện luôn có giá trị ‘đúng’ - chúng ta gọi vòng lặp không 
kết thúc, thì trong thân của while phải có lệnh để chấm dứt vòng lặp (xem lệnh 
break). 
ví dụ
while (1) // biểu thức điều kiện luôn đúng 
{ printf(“\n Hay bam mot phim: “); 
ch = getch(); 


Gi¸o tr×nh tin häc c¬ së II - N
gôn ngữ
 C
51
if(ch==27) 
break; 
printf(“ky tu %c co ma la %d”,ch,ch); 

Ví dụ 4.3: Viết chương trình nhập số nguyên n từ bàn phím, n <=10 và n >0, tính và in giá 
trị n! (giai thừa của n), với n! = 1*2*,..,*(n-1)*n 
Giải: 
Theo yêu cầu n nhập từ bàn phím phải thoả mãn n > 0 và n <=10, vì vậy nếu n người 
dùng nhập n không hợp lệ thì chương trình sẽ yêu cầu nhập lại, và sẽ lặp lại việc nhập cho 
tới khi thoả mãn. 
Việc tính gt = n! theo các bước sau: 
gt = 1 ; i = 1;
while ( i <=n)

gt 

gt 
*i; 
i++; 

// giai thua 
#include  
#include  
const int Max =10; // 
giới hạn giá trị cần tính
void main(){
int n, i; 
long gt; 
printf("\nNhap n = "); 
scanf("%d",&n); 
while((n<=0)||(n>Max)) 

printf("\nNhap lai n (0scanf("%d",&n); 

gt=i=1; 
while(i<=n) 
{
gt*=i; 
i++; 

printf("\nGia tri %d! = %ld",n,gt); 
getch(); 
}
 

Ví dụ 4.4: Viết chương trình tính và in S = 1 +1/(2!)
+1/(3!)+..+1/(n!) với n nhập từ bàn 
phím, 0


Gi¸o tr×nh tin häc c¬ së II - N
gôn ngữ
 C
52
Giải: Bạn thấy là để tính S thì phải tính được các số hạng là 1/(k!) với k 1,2,..,n sau đó 
cộng vào tổng. Như vậy chúng ta có thể thực hiện như sau: 
1: S=1; k=2; 
2: nếu k > n thì thực hiện 4: 
ngược lại thì thực hiện 3: 
3: thực hiện các thao tác 
3.1: tính d = k! 
3.2: tính pt = 1/d 
3.3: S = S + pt 
3.4: k = k+1 
3.5: lặp lại 2: 
4: in kết quả là S và kết thúc 
Nhưng như vậy với mỗi số hạng (pt) của tổng chúng ta phải tính giai thừa một lần, 
trong khi đó chúng ta thấy rằng số hạng (pt) thứ k là 1/(k1!) = 1/(((k-1)!)*k) tức là bằng 
giá trị của pt thứ k-1 nhân với 1/k. Vì vậy ta có thể sửa đổi lại cách tính như sau: 
1: S=1; pt=1; k = 2 
2: nếu k > n thì thực hiện 4: 
ngược lại thì thực hiện 3: 
3: thực hiện các thao tác 
3.1: tính pt = pt * 1/k 
3.2: S = S + pt 
3.3: k = k+1 
3.4: lặp lại 2: 
4: in kết quả là S và kết thúc

tải về 2.34 Mb.

Chia sẻ với bạn bè của bạn:
1   ...   33   34   35   36   37   38   39   40   ...   62




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương