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

Bài giảng lý thuyết ngôn ngữ lập trình chương 7 cđ CNTT hữu nghị việt hàn

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 (269.9 KB, 42 trang )

Lý thuyết ngôn ngữ lập trình

Chương 7
CÁC LỆNH CÓ CẤU TRÚC


Nội dung
Cấu trúc tuần tự
Cấu trúc lựa chọn
Cấu trúc lặp
Giới thiệu thuật toán đệ quy
Ngoại lệ và xử lý ngoại lệ


Cấu trúc tuần tự
Các công việc (các thao tác) được thực hiện
một cách tuần tự, công việc này nối tiếp công
việc kia
Lưu đồ thuật toán
tổng quát của

Lệnh 1

Lệnh 2

cấu trúc tuần tự :


Lệnh n



Cấu trúc tuần tự (tt)
Một chương trình C sử dụng cấu trúc tuần tự.
int main()
{ int a=5, b=6,c;
float x=3.5, y=4.5,z;
printf(“Day la chuong trinh chinh”);
c= a + b;
printf(“\n Tong cua %d va %d la %d”,a,b,c);
z= x + y;
printf(“\n Tong cua %f và %f là %f”, x,y,z);
getch();
return 0;
}


Cấu trúc lựa chọn
Lựa chọn một công việc để thực hiện căn cứ vào
một điều kiện cho trước nào đó. Có một số dạng
cấu trúc lựa chọn thông dụng như sau:
Cấu trúc 1: Nếu <điều kiện> (đúng) thì thực hiện
<công việc>. Trong ngôn ngữ lập trình C, cấu trúc
này được thể hiện bằng lệnh if có cú pháp như
sau :
if (<biểu thức điều kiện>)
<các lệnh>


Cấu trúc lựa chọn (tt)
Ví dụ :
#include <stdio.h>

#include <conio.h>
void main()
{ int a,b,c;
print ( "\ nhập 2 số a,b : ");
scanf(" %f %f ", &a, &b);
if (a>b)
c =a-b;
printf (“c = %f \n”,c)
}


Cấu trúc lựa chọn (tt)
Cấu trúc 2: Nếu <điều kiện> (đúng) thì thực hiện 1>, ngược lại (điều kiện sai) thực hiện <công việc 2>.
Trong ngôn ngữ lập trình C, cấu trúc này được thể hiện
bằng lệnh if ..else có cú pháp như sau :
if (<biểu thức điều kiện>)
<các lệnh>
else
<các lệnh>


Cấu trúc lựa chọn (tt)
Ví dụ :
#include <stdio.h>
#include <conio.h>
void main()
{ int a,b,c;
print ( "\ nhập 2 số a,b : "); scanf(" %f %f ", &a, &b);
if (a>b)

c =a-b;
else
c = b-a;
printf (“c = %f \n”,c)
}


Cấu trúc lựa chọn (tt)
chúng ta có thể sử dụng nhiều lệnh if .. else lồng nhau.
Ví dụ : Chương trình C giải phương trình bậc nhất.
#Include <stdio.h>
#Include < conio.h>
void main ( void)
{float a, b ;
print ( "\ nhập 2 số a,b : "); scanf(" %f %f ", &a, &b);
if ( a= = 0 )
if( b= =0 )
Printf (" Phương trình có vô số nghiệm ! \n " );
else
Printf (" phương trình vô nghiệm \n ");
else / * a khác 0 */
Printf (" phương trình có nghiệm là : x= %f \n ", -b/a);
Printf( " ấn phím bất kỳ tiếp tục ");
getch();
}


Cấu trúc lựa chọn (tt)
Cấu trúc 3: Trường hợp <i> thực hiện <công việc i>.
Trong ngôn ngữ lập trình C, cấu trúc này được thể hiện bằng lệnh

switch có cú pháp như sau:
switch (<biểu thức>)
{ case <biểu thức so sánh 1>: // nếu <biểu thức> = 1>
< các lệnh 1>; break;
case <biểu thức so sánh 2>: // nếu <biểu thức> = 2>
< các lệnh 2>; break;

case <biểu thức so sánh n>: // nếu <biểu thức> = n>
< các lệnh n>; break;
default : // nếu không xảy ra tất cả các trường hợp trên
<các lệnh>
}


Cấu trúc lựa chọn (tt)
Ví dụ :
#Include<stdio.h>
#Include<conio.h>
main( )
{
Int so ;
printf(" \n Nhập vào một số "); scanf(" %d ", &so);
switch(so)
{
case 0 : printf(" \n Đây là số KHÔNG "); break;
case 1 : printf( " \n Đây là số MỘT"); break;
case 2 : printf(" \n Đây là số HAI");break;

case 3 : printf (" \n Đây là số BA ");break;
default : printf( " \n Đây là số từ BỐN trở lên hoặc là ký tự");
}
}


Cấu trúc lặp
Thực hiện lặp đi lặp lại một công việc nhiều lần căn cứ
vào một điều kiện nào đó. Cấu trúc này có hai dạng thông
dụng như sau:
Lặp xác định: Người lập trình đã xác định trước được sẽ
lặp đi lặp lại công việc bao nhiêu lần khi viết chương trình.


Cấu trúc lặp (tt)
Trong ngôn ngữ lập trình C, cấu trúc này được thể hiện
bằng vòng lặp for có cú pháp như sau:
for (biểu thức 1; biểu thức 2;biểu thức 3)
<các lệnh>
Trong đó:
biểu thức1 thông thường là một phép gán để khởi tạo giá trị
ban đầu cho biến điều khiển.
biểu thức2 là một biểu thức kiểm tra điều kiện đúng sai để
thoát khỏi vòng lặp.
biểu thức3 thông thường là một phép gán để thay đổi biến
điều khiển
<các lệnh> có thể là lệnh rỗng, một câu lệnh hoặc một khối
lệnh.



Cấu trúc lặp (tt)
Ví dụ: Chương trình tìm phương án đổi tiền.
#include <stdio.h>
#define TONGSOTIEN 300000
void main()
{
long i, j, k, l, m, count=0, soluong = 0;
for (i=0; i<=TONGSOTIEN/1000; i++)
for (j=0; j<=TONGSOTIEN/2000; j++)
for (k=0; k<=TONGSOTIEN/5000; k++)
for (l=0; l<=TONGSOTIEN/10000; l++)
for (m=0; m<=TONGSOTIEN/20000; m++)


Cấu trúc lặp (tt)

{if ((i*1000 + j*2000 + k*5000 + l*10000 + m*20000) ==
TONGSOTIEN)
printf("\n%5ld - %5ld%5ld%5ld%5ld%5ld", ++count, i,
j, k, l, m);
soluong++;
}
printf("so luong = %ld", soluong);
getch();
}


Cấu trúc lặp (tt)
Lặp không xác định: Người lập trình
không xác định được sẽ lặp đi lặp lại công

việc bao nhiêu lần, mà số lần lặp đó chỉ
xác định được khi thực thi chương trình.


Cấu trúc lặp (tt)
Trong ngôn ngữ lập trình C, cấu trúc này
được thể hiện bằng vòng lặp while và
vòng lặp do .. while có cú pháp như sau:
+ Vòng lặp while
while (<biểu thức>)
<các lệnh>
Trong đó biểu thức là một biểu thức kiểm
tra điều kiện đúng sai để thoát khỏi vòng
lặp và các lệnh có thể là lệnh rỗng, một
câu lệnh hay khối lệnh


Cấu trúc lặp (tt)
Ví dụ : Chương trình in dãy số Fibonaci
#include <stdio.h>
void main()
{ int n, i, fib1 = 1, fib2 = 1, fib = 2;
printf("\nNhap gia tri N : "); scanf("%d", &n);
printf("%d %d ", fib1, fib2);
while (fib1+fib2 < n)
{ fib = fib1 + fib2; printf("%d ", fib);
fib2 = fib1; fib1 = fib;
}
getch();
}



Cấu trúc lặp (tt)

+ Vòng lặp do .. while:
do <các lệnh>
while <biểu thức>
Tương tự như vòng lặp while, nhưng có
điểm khác là các lệnh được thực hiện ít
nhất một lần vì việc kiểm tra biểu thức điều
kiện được thực hiện sau.


Cấu trúc lặp (tt)

Ví dụ : Chương trình cho biết mã ASCII của phím bất kỳ
#include <stdio.h>
void main()
{ char c;
printf("\nNhap vao mot phim muon biet ma cua no. ESC de
thoat\n");


Cấu trúc lặp (tt)
do
{ c = getch();
if (c == 0)
{ c = getch();
printf("\nMa mo rong : %d", c);
}

else
printf("\nMa thuong : %d", c);
}
while (c != 27);
}


Giới thiệu thuật toán đệ quy
Như đã biết, một thuật toán cần phải thỏa mãn ít nhất 3
tính chất :
- Tính hữu hạn.
- Tính xác định
- Tính đúng đắn
Tuy nhiên, có những bài toán mà việc xây dựng một thuật
toán với đầy đủ ba tính chất trên rất khó khăn. Trong khi
đó, nếu ta xây dựng một thuật toán vi phạm một vài tính
chất trên thì cách giải lại trở nên đơn giản hơn nhiều và có
thể chấp nhận được. Một trong những trường hợp đó là
thuật toán đệ quy.


Giới thiệu thuật toán đệ quy (tt)
Tư tưởng giải bài toán bằng thuật toán đệ quy là đưa bài
toán hiện tại về một bài toán cùng loại, cùng tính chất
(đồng dạng) nhưng ở cấp độ thấp hơn (chẳng hạn : độ
lớn dữ liệu nhập nhỏ hơn, giá trị cần tính toán nhỏ hơn,
....), và quá trình này tiếp tục cho đến lúc bài toán được
đưa về một cấp độ mà tại đó có thể giải được. Từ kết
quả ở cấp độ này, ta sẽ lần ngược để giải được bài toán
ở cấp độ cao hơn cho đến lúc giải được bài toán ở cấp

độ ban đầu.
Trong toán học ta cũng thường gặp những định nghĩa về
những đối tượng, những khái niệm dựa trên chính những
đối tượng, khái niệm đó.


Giới thiệu thuật toán đệ quy (tt)
- Ðịnh nghĩa giai thừa
Giai thừa của một số tự nhiên n, ký hiệu n! được định nghĩa
là :
0! = 1
n! = (n-1)!n với mọi n>0
- Ðịnh nghĩa dãy số Fibonacci
f0 = 1
f1 = 1
fn = fn-1 + fn-2 với mọi n>1
Theo toán học, những khái niệm được định nghĩa như vậy
gọi là định nghĩa theo kiểu quy nạp. Chính vì vậy, đệ quy
có sự liên hệ rất chặt chẽ với quy nạp toán học.


Giới thiệu thuật toán đệ quy (tt)
Ðệ quy mạnh ở điểm nó có thể định nghĩa
một tập vô hạn các đối tượng chỉ bằng một
số hữu hạn các mệnh đề. Tuy nhiên, đặc
tính này của đệ quy lại vi phạm tính xác
định của thuật toán. Về nguyên tắc, một
bước trong thuật toán phải được xác định
ngay tại thời điểm bước đó được thi hành,
nhưng với thuật toán đệ quy, bước thứ n

không được xác định ngay trong ngữ cảnh
của nó mà phải xác định thông qua một
bước thấp hơn.


×