CHƯƠNG 3 : CU TRÚC ÐIU KHIN VÀ VÒNG LP
3.1/ a/Khái nim : mi chương trình đều có th biu din qua 3 cu trúc :
- tun t : mc định ( default)
- la chn ( lnh if hoc lnh switch)
- lp ( for, while hoc do while)
b/ Khi lnh : là tp hp các câu lnh được khai báo bi 2 du { và } .
không đặt du chm phy ( ; ) sau mt khi lnh tr mt vài trường hp đặc bit.
3.2 / Các câu lnh
3.2.1 Lnh If :
- Cú pháp : If ( biu thc) < lnh> ;
- Din gii : nếu Biu thc đúng ( khác 0 ) --> thc hin <lnh>
ngược li nếu biu thc sai ( = 0 ) -ă thc hin lnh đứng sau câu lnh if.
- Hoc : If ( biu thc) <lnhA>;
else < lnh B);
+ Biu thc : # 0 ( đúng) ----> < lnh A>
=0 ( sai ) ---> < lnh B>.
* Ví d : tìm s ln nht trong 2 s a, b :
if (a<b) max = b ;
else max = a ;
( Viết li hoàn chnh chương trình trên).
* Cách 2 : max = (a>b)? a:b; ( Viết li hoàn chnh chương trình).
- Chú ý : trong trường hp có nhiu lnh If lng nhau thì else s gn lin vi if gn nht.
If(bt1) <lnh1>;
Else
If (bt2)
If(bt3) < lnh2>;
else <lnh 3>; /* bt3 = = 0 */
else <lnh 4>; /* bt2= = 0 */
*Ví d : Viết chương trình gii phương trình bc nht : Ax + B = 0 (A, B : s thc).
Gii : Xét các trường hp xy ra :
- Nếu A! =0 thì nghim x = -B/A
- Nếu A = 0 +> B=0 => Nếu B=0 : vô s nghim
B != 0 ( ngược li) : vô nghim.
/* Gii phương trình bc nht : Ax + B = 0 */
#Include <stdio.h>
#Include < conio.h>
void main ( void)
{
float a, b ;
/* nhp d liu t bàn phím */
print ( "\ nhp 2 s a,b : "); scanf(" %f %f ", &a, &b);
/* gii phương trình*/
If ( a= = 0 )
If( b= =0 )
Printf (" Phương trình có vô s nghim ! \n " );
Else
Printf (" phương trình vô nghim \n ");
Else / * a khác 0 */
Printf (" phương trình có nghim là : x= %f \n ", -b/a);
Printf( " n phím bt k tiếp tc ");
Getche();
}
Bài tp 1 : Tìm nhng li cú pháp các đon chương trìnhh sau :
A/ scanf ( "d", value);
B/ printf ("tích các %d và %d là %d " \n, x,y);
C/ printf (" phn dư ca %d chia cho %d là \n ", x , y , x%y );
D/ if(x=y);
Printf (" %d bng %d \n ", x,y);
E/ If ( age>=65);
Printf (" gia ì! ');
Else
Printf(' Tre! ');
3.2.2 Lnh switch
- Cú pháp : Switch (biu thc nguyên).
{
Case N1 : lnh 1;
Case N2 : lnh 2;
.....
[ default : lnh;]
}
- Biu thc nguyên là giá tr nguyên : Ni(i=1,2...) là các s nguyên.
- Vi biu thc khác vi mi Ni => thc hin lnh sau default.
- Chú ý : nếu nhóm câu lnh sau nhãn case Ni không có câu lnh break thì máy s chuyn sang
nhóm câu lnh sau nhãn case Ni+1
*Ví d : đổi 1 s nguyên sang chui ký t là tên các môn hc
#Include<stdio.h>
#Include<conio.h>
main( )
{
Int ma ;
Do
{
printf(" \n cho mã cn chuyn "); scanf(" %d ", &ma);
switch(ma)
{
case 0 : printf(" \n lp tin hc a ");
break;
case 1 : printf( " \n lp tin hc b");
break;
case 2 : printf(" \n lp trung cp ");
break;
case 3 : printf (" \n lóp chuyên viên ");
break;
default : printf( " \n lp thiế tin hc phí");
}
printf( " \n có tiếp tc không ?(Y/N)");
}
while( toupper ( getch () ! = 'N '); /* Chuyn san ký t hoa */
}
3.2.3 / Lnh For :
- Cú pháp : for ( bt1; bt2 ; bt3) lnh;
- Gii thích :
+ bt1 : là toán t gán để to giá tr ban đầu cho biến điu khin.
+ bt2 : biu thc điu kin để thc hin vòng lp.
+ bt3 : biu thc tăng giá tr ca biến điu khin ca vòng lp.
*Ví d : Tính Tng S=1+2+3+..+n
For ( int i=1, s=0; i<=n; s+ =i, ++i );
* Cơ chế hot động :
a/Tính giá tr ca biu thc bt1 .
b/Tính giá tr ca bt2
c/ + Nếu giá tr ca bt2(=0) là sai máy s ra khi lnh For.
+ Nếu giá tr ca bt2(!=0) là đúng thì máy s thc hin lnh.
d/ Tính giá tr ca bt3 và quay li bước kim tra 2(b)
Chú ý : + Khi bt2 vng mt thì nó được coi là luôn luôn đúng
* Ví d : for (i=0; ; i++) lnh ;
+ bt1 , bt3 có th bao gm nhiu biu thc cách nhau bi du phy.
+ bt2 có th gm nhiu biu thc, tuy nhiên tính đúng sai ca nó được xem là tính đúng sai ca
biu thc cui cùng.
* Ví d : tính tng : S=1! + (1+2)! + ....+ ( 1+2+....i )! .....( 1 + 2 + ..n)!
#include <stdio.h>
#include<conio.h>
#include<math>
/* int i, j, t, n ; double gt, s; */
main()
{
int i, j, t, n ; double gt, s;
clrscr () ;
printf ("nhp n= "); scanf(" %d ", &n);
Cách 1 :
s=0 ; t=0;
for (s= 0,t= 0,i=1; i<=n ; ++i )
{
t=t+i;
for ( gt=1,j=1; j<=t ; ++j)
gt = gt*j ; s = s+gt;
}
printf ( " tong s = %15.0f ", s);
getch();
Cách 2 :
for ( s=0, t=1, i=1; i<=1; ++i , t = t + 1)
{
for ( gt=1,j=1;j<=t; ++j)
gt*=j; s+= gt;
}
Cách 3 : thân for là câu lnh rng
For (s=0, t=1,i=1; i<=n; ++i, t=t+i,s+=gt)
For( gt=1,j=1; j<=t; gt* = j , ++j );
Cách 4 : không có bt 1 và bt3;
Int i=1, j=1, t=1, n ; double gt = 1, s= 0 ;
For ( ; i<=n ; ++i, t = t + i , s+ = gt) /* không có biếu thc 1*/
{
For ( ; j<=t ; ) /* không có bt1 , bt3*/
Gt* = j ++ /* gt = j ; ++j */
}
Cách 5 : không có bt1, bt2, bt3
For (; ;)
{
for (; ;)
{
gt* = j++ ;
if ( j < t ) goto tong ;
}
tong : s+ = gt; ++i , t = t + i ;
if( i < n ) goto KT;
KT : printf (" tong s= % 15.0 f " , s )
}
3.24/ Câu lnh while :
- Cú pháp : while ( biu thc 1) lnh 1 ;
- Nguyên tc thc hin :
+b1. Tính giá tr ca biu thc 1.
+b2. Nếu giá tr ca biu thc 1 sai ( = 0 ) thì chương trình ra khi vòng while
+b3. Nếu giá tr ca biu thc đúng thì thc hin lnh 1 và quay li bước 1(b1).
- Chú ý : Biu thc 1 có th gm nhiu biu thc nhưng tính đúng sai ph thuc vào biu thc
cui cùng.
Ví d : Nhp 1 dãy s nguyên t bàn phím
#include < stdio.h >
#include < conio.h >
main ()
{
Int dayso [ 10 ] ; int i = 0 ;
While ( i < 10)
{
printf ( "\n S thu %d : ", i ); scanf ( " %d", & dayso [i]);
i ++ ;
}
3.25/ Câu lnh Do while ( làm trước hi sau )
- Cú pháp : do lnh 1 ;
while ( biu thc 1 ) ;
- Nguyên tc thc hin :
+b1. Máy thc hin câu lnh 1 ;
+b2. Sau đó tính giá tr ca biu thc 1, nếu giá tr ca biu thc 1 sai thì chương trình thoát ra
khi vòng lp. Nếu giá tr ca biu thc 1 đúng thì quay li bước 1.
Chú ý : - while : Ðiu kin được kim tra trước, nếu đúng mi thc hin.
- do while : câu lnh đưc thc hin trước khi kim tra. Câu lnh thc hin bao gi ít nht là 1 ln.
( do while ngược vi
Repeat until ca Pascal : lnh Do while sai thì dng, còn lnh repeat until đúng thì dng ).
-Biu thc 1 có th gm nhiu biu thc, tuy nhiên tính đúng sai căn c theo biu thc cui cùng.
* Ví d : tính pi vi sai s eps = 1E - 4 , pi = 4 - 4/3 + 4/5 - 4/7 + ...eps
#include < stdio.h >
#include < conio.h>
main ()
{
float pi, dau, i , eps, saiso ;
i=1.0; dau = -1; saiso = 1e -4 ;
pi = 4.0;
printf ( "\n đang x lý vui lòng đợi !");
do
{
eps = 4.0 / ( 2.0 * i + 1.0 );
pi + = dau * eps ; dau = dau * - 1.0 ; i + = 1.0;
}
while ( eps > saiso );
printf ("\n s pi là : " % f ", pi ) ;
getch ();