IV Cỏc cấu trỳc điều khiển chương trỡnh
IV.5 Cấu trỳc do while
Cấu trỳc while mà chỳng ta khảo sỏt ở trờn luụn while kiểm tra điều kiện lặp trước khi thực hiện thõn của nú. Tức là đũi hỏi trước khi vào cấu trỳc while chỳng ta phải xỏc lập
được điều kiện lặp cho nú.
Cú lẽ bạn cũng đồng ý rằng cú những cấu trỳc lặp mà thõn của nú phải thực hiện ớt nhất một lần, tức bước lặp đầu tiờn được thực hiện mà khụng cần điều kiện gỡ, sau đú cỏc bước lặp tiếp theo sẽ được xem xột tuỳ vào trạng thỏi của bước lặp trước đú. Với tỡnh huống như thế thỡ while khụng thuận lợi bằng một cấu trỳc điều khiển khỏc mà C cung cấp, đú là cấu trỳc do while. Cấu trỳc của do while: do S; while (<bt>); Trong cỳ phỏp trờn S là 1 cõu lệnh là thõn của vũng lặp, <bt> là biểu thức điều kiện cú vai trũ kiểm soỏt vũng lặp. Sự hoạt động của cấu trỳc do while bước 1: thực hiện cõu lệnh S
bước 2: kiểm tra giỏ trị biểu thức <bt>, nếu cú giỏ trị ‘đỳng’ ( khỏc 0) thỡ lặp lại bước 1, nếu ‘sai’ (=0) thỡ kết thỳc vũng lặp.
IV.5. Cấu trỳc do .. while
Cấu trỳc while mà chỳng ta khảo sỏt ở trờn luụn while kiểm tra điều kiện lặp trước khi thực hiện thõn của nú. Tức là đũi hỏi trước khi vào cấu trỳc while chỳng ta phải xỏc lập
được điều kiện lặp cho nú.
Cú lẽ bạn cũng đồng ý rằng cú những cấu trỳc lặp mà thõn của nú phải thực hiện ớt nhất một lần, tức bước lặp đầu tiờn được thực hiện mà khụng cần điều kiện gỡ, sau đú cỏc bước lặp tiếp theo sẽ được xem xột tuỳ vào trạng thỏi của bước lặp trước đú. Với tỡnh huống như thế thỡ while khụng thuận lợi bằng một cấu trỳc điều khiển khỏc mà C cung cấp, đú là cấu trỳc do while. Cấu trỳc của do while: do S; while (<bt>); Trong cỳ phỏp trờn S là 1 cõu lệnh là thõn của vũng lặp, <bt> là biểu thức điều kiện cú vai trũ kiểm soỏt vũng lặp. Sự hoạt động của cấu trỳc do while bước 1: thực hiện cõu lệnh S
bước 2: kiểm tra giỏ trị biểu thức <bt>, nếu cú giỏ trị ‘đỳng’ ( khỏc 0) thỡ lặp lại bước 1, nếu ‘sai’ (=0) thỡ kết thỳc vũng lặp.
Vớ dụ 5.1: 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: tương tự như vớ dụ 4.2 nhưng ở đõy chỳng ta sử dụng cấu trỳc do, vậy cú chương trỡnh
// In ki tu
#include <stdio.h> #include <conio.h> #include <math.h>
const int ESC =27; // ma phim ESC void main(){
int ch; do{
printf(“\n Hay nhap mot ki tu : “) ch = getch()
printf("\nKi tu %c co ma %d",ch,ch); }while(ch!=ESC)
}
Vớ dụ 5.2: Chương trỡnh tớnh tổng sin(x ) theo cụng thức khai triển Taylor: Cỏc bạn biết rằng sin(x) được tớnh theo tổng chuỗi vụ hạn đan dấu như sau:
S = x - x3/3! + x5/5! - x7/7! +...
Nhưng rừ ràng chương trỡnh khụng thể tớnh vụ hạn được, chỳng ta chỉ cú thể tớnh với một giới hạn nào đú. Cú hai cỏch để giới hạn một là theo số cỏc số hạng trong tổng tức là chỉ tớnh tổng với n số hạng đầu tiờn của chuỗi, cỏch này cú ưu điểm là số bước lặp xỏc
định, nhưng khụng ước lượng được sai số. Cỏch thứ hai chỳng ta hạn chế số bước theo độ
chớnh xỏc của kết quả. Chỳng ta cú thể phỏt biểu lại bài toỏn là: Tớnh sin(x) theo cụng thức khai triển trờn với độ chớnh xỏc ε (epsilon) cho trước. Cú nghĩa là kết quả tớnh được (S) cú sai số so với giỏ trị thực của nú khụng quỏ ε, hay fabs(S-sin(x)) <= ε. Yờu cầu này cú thể thoả món khi chỳng ta tớnh tổng đến số hạng thức k nào đú mà giỏ trị tuyệt đối của phần tử này <= ε.
Cỏcbạn thấy rằng cỏc phần tử trong chuỗi cú tớnh chất đan dấu và giả sử ta ký hiệu phần tử thứ k trong chuỗi là pk thỡ
pk = (-1)2kx 2k +1 /(2k+1)! và pk+1 = (-1)2k+1x 2(k+1) +1 /(2(k+1)+1)! và pk+1 = (-1)2k+1x 2(k+1) +1 /(2(k+1)+1)! = -pk * x2 /(2k*(2k+1)) Chỳng ta cú sơđồ khối thuật giải như sau: sơđồ khối tớnh S sin(x)
cỏc bạn cú chương trỡnh tớnh sin( x) #include <math.h> #include <stdio.h> void main(){ float x, eps; float s, sh; int k;
printf("\nNhap gia tri (radian) x = "); scanf("%f",&x);
printf("\nNhap sai so duoc phep eps = "); scanf("%f",&eps); s=x;sh=x; k=1; do { sh =-sh*x*x/(2*k*(2*k+1)); s+=sh; k++; } while(fabs(sh)>eps); printf("s= %f ",s); }
Vớ dụ 5.3: Viết chương trỡnh nhập một số nguyờn dương n từ bàn phớm, kiểm tra và thụng bỏo số đú cú là số nguyờn tố hay khụng.
Yờu cầu
- Chương trỡnh chỉ kiểm tra số n >2
- Sau khi kiểm tra xong một số, chương trỡnh hỏi người dựng cú muốn kiểm tra tiếp hay khụng, nếu trả lời c(C) thỡ chương trỡnh vẫn tiếp tục cho nhập và kiểm tra số tiếp, ngược lại sẽ kết thỳc chương trỡnh.
Giải :Để kiểm tra số n cú là số nguyờn tố hay khụng chỳng ta cần kiểm tra cỏc số từ 2 tới xem cú số nào là ước của n hay khụng, nếu khụng thỡ thụng bỏo n là số nguyờn tố, ngược lại thụng bỏo n là hợp số.
#include <math.h> #include <stdio.h> #include <conio.h> #include <ctype.h> void main(){ int k, n, tl; do{
printf("\nNhap gia tri can kiem tra = "); scanf("%d",&n);
if(n<2) printf("Khong kiem tra so <2"); else { k=2;
while((k<=sqrt(n))&&(n%k)) k++; if(k>sqrt(n))
printf("\n%d La so nguyen to",n); else
printf("\n%d Khong la so nguyen to",n); }
printf("\nban co kiem tra so khac khong :"); tl = getch();
} while(toupper(tl)=='C'); }