Xem mẫu

  1. Bài 5 Cấu trúc lệnh lặp Mục tiêu: - Cung cấp các kiến thức cơ bản về cách sử dụng câu lệnh lặp với số lần biết trước và chưa biết trước. Nội dung: 5.1 Cấu trúc lặp với for và while 5.1.1 Cấu trúc lặp với câu lệnh for Câu lệnh 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 ; Câu lệnh 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 ; . Thông thường biểu thức 1 là câu lệnh 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 câu lệnh gán dùng để thay đổi giá trị biến điều khiển. Hoạt động của câu lệnh for: Câu lệnh 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. 64
  2. 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 câu lệnh for khác, vì thế ta có thể xây dựng các câu lệnh for lồng nhau. Khi gặp câu lệnh break trong thân for, máy ra sẽ ra khỏi câu lệnh for sâu nhất chứa câu lệnh này. Trong thân for cũng có thể sử dụng câu lệnh goto để nhảy đến một ví trí mong muốn bất kỳ. Ví dụ 1: Nhập n số nguyên dương từ bàn phím, tính và in ra màn hình tổng n số này. #include #include main() { int i, tong=0,n,a; clrscr(); printf("Chuong trinh tinh tong n so nguyen nhap tu ban phim \nCho biet n="); scanf("%d",&n); for(i=1;i
  3. Ví dụ 2: Nhập n số nguyên dương từ bàn phím, tính và in ra màn hình trung bình cộng các số lẻ. #include #include main() { int i, tong=0,n,a,dem=0; clrscr(); printf("Chuong trinh tinh trung binh cong cac so le nhap tu ban phim \nCho biet n="); scanf("%d",&n); for(i=1;i
  4. Lệnh hoặc khối lệnh; Như vậy câu lệnh 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ú ý: 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 câu lệnh while lại có thể sử dụng các câu lệnh 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 câu lệnh while sâu nhất chứa câu lệnh này. Trong thân while có thể sử dụng câu lệnh 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 câu lệnh return trong thân while để ra khỏi một hàm nào đó. Ví dụ 1: Chương trình tính tổng 10 số nguyên dương đầu tiên: Cách 1: #include #include main() { int i=1, tong=0; while (i
  5. tong=tong+i; /*có thể viết là tong+=i*/ i=i+1;/*có thể viết là i++*/ } printf(" \n Tong 10 so nguyen duong dau tien la %d",tong); getch(); return 0; } Cách 2: #include #include main() { int i=1, tong=0; while (tong+=i,++i
  6. { printf("Nhap so thu %d ",i); scanf("\n%d",&a); tong+=a; i++; } printf("\nTong %d so vua nhap la %d",n,tong); getch(); return 0; } 5.2 Chu trình do-while Khác với các câu lệnh 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. 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 câu lệnh while. Chú ý: Những điều lưu ý với câu lệnh while ở trên hoàn toàn đúng với do while. 69
  7. Ví dụ: Viết chương trình tính tích 10 số nguyên dương đầu tiên (S=1*2*3*…*10) #include #include main() { int i=1; float tich=1; do { tich*=i; i++; } while (i
  8. { int i,nt=1; printf("\n Cho n="); scanf("%d",&n); for (i=2;i
  9. { int i, tong=0,n,a,dem=0; clrscr(); printf("Chuong trinh trung binh cong cac so le nhap tu ban phim \nCho biet n="); scanf("%d",&n); for(i=1;i
  10. Biên dịch chương trình C trên sẽ cho kết quả: Bài tập 2: In các số từ 1-10 theo thứ tự giảm dần? Yêu cầu là in các số từ 1 tới 10 theo thứ tự giảm dần. Với bài tập C này, chúng ta chỉ cần sử dụng một vòng lặp for trong C. Chương trình C Dưới đây là chương trình C để in các số 1-10 theo thứ tự giảm dần. #include int main() { int i, start, end; start = 1; end = 10; printf("In cac so theo thu tu giam dan:\n"); for(i = end; i >= start; i--) printf("%2d\n", i); return 0; } Biên dịch chương trình C trên sẽ cho kết quả: 73
  11. Bài tập 3: In bảng số In một bảng số thỏa mãn điều kiện: Bảng số gồm 10 hàng và 10 cột Các giá trị trong cột là liên tiếp nhau Các giá trị trong hàng hơn kém nhau 10 Với bài tập C này, chúng ta sử dụng lồng vòng lặp: vòng lặp bên ngoài sẽ điều khiển các hàng và vòng lặp bên trong điều khiển các cột. Chương trình C Dưới đây là chương trình C để giải bài tập C trên: #include int main() { int i, j, count; printf("In bang so: \n"); for(i = 1; i
  12. Bài tập 4: In bảng nhân In một bảng nhân của một số bất kỳ với các số từ 1 tới 10 và hiển thị kết quả. Với bài tập C này, chúng ta chỉ sử dụng một vòng lặp và tăng dần giá trị của số nhân lên. Chương trình C Dưới đây là chương trình C để giải bài tập C trên: #include int main() { int i, j, n; n = 3; j = 1; printf("In bang nhan:\n"); for(i = n; i
  13. Chương trình C Dưới đây là chương trình C để giải bài tập C trên: #include int main() { int i, j, count; int start, end; start = 2, end = 10; printf("In bang cuu chuong rut gon:\n"); for(i = start; i
  14. Chương trình C Dưới đây là chương trình C để giải bài tập C trên: #include #include int main() { int i; printf("In cac so chan:\n"); for(i = 1; i
  15. #include int main() { int i; printf("In cac so le:\n"); for(i = 1; i
  16. 7. Viết chương trình nhập vào n số nguyên dương, tính trung bình cộng các số lẻ chia hết cho 3. 8. Có hai phương thức gửi tiền tiết kiệm: gửi không kỳ hạn lãi suất 2.4%/tháng, mỗi tháng tính lãi một lần, gửi có kỳ hạn 3 tháng lãi suất 4%/tháng, 3 tháng tính lãi một lần. Viết chương trình tính tổng cộng số tiền cả vốn lẫn lời sau một thời gian gửi nhập từ bàn phím. 79
  17. Bài 6 Các kiểu dữ liệu có cấu trúc Mục tiêu: - Cung cấp khái niệm về chuỗi và các hàm xử lý chuỗi. - Cung cấp các kiến thức về tổ chức dữ liệu kiểu mảng. - Cung cấp các kiến thức về tổ chức dữ liệu kiểu cấu trúc. Nội dung: 6.1 Mảng Mảng là một tập hợp các phần tử cố định có cùng một kiểu, gọi là kiểu phần tử. Kiểu phần tử có thể là có các kiểu bất kỳ: ký tự, số, chuỗi ký tự…; cũng có khi ta sử dụng kiểu mảng để làm kiểu phần tử cho một mảng (trong trường hợp này ta gọi là mảng của mảng hay mảng nhiều chiều). Ta có thể chia mảng làm 2 loại: mảng 1 chiều và mảng nhiều chiều. Mảng là kiểu dữ liệu được sử dụng rất thường xuyên. Chẳng hạn người ta cần quản lý một danh sách họ và tên của khoảng 100 sinh viên trong một lớp. Nhận thấy rằng mỗi họ và tên để lưu trữ ta cần 1 biến kiểu chuỗi, như vậy 100 họ và tên thì cần khai báo 100 biến kiểu chuỗi. Nếu khai báo như thế này thì đoạn khai báo cũng như các thao tác trên các họ tên sẽ rất dài dòng và rắc rối. Vì thế, kiểu dữ liệu mảng giúp ích ta trong trường hợp này; chỉ cần khai báo 1 biến, biến này có thể coi như là tương đương với 100 biến chuỗi ký tự; đó là 1 mảng mà các phần tử của nó là chuỗi ký tự. Hay như để lưu trữ các từ khóa của ngôn ngữ lập trình C, ta cũng dùng đến một mảng để lưu trữ chúng. 6.1.1 Mảng 1 chiều Nếu xét dưới góc độ toán học, mảng 1 chiều giống như một vector. Mỗi phần tử của mảng một chiều có giá trị không phải là một mảng khác. 6.1.1.1 Khai báo * Khai báo mảng với số phần tử xác định (khai báo tường minh) Cú pháp: Ý nghĩa: - Tên mảng: đây là một cái tên đặt đúng theo quy tắc đặt tên của danh biểu. Tên này cũng mang ý nghĩa là tên biến mảng. - Số phần tử: là một hằng số nguyên, cho biết số lượng phần tử tối đa trong mảng là bao nhiêu (hay nói khác đi kích thước của mảng là gì). 80
  18. - Kiểu: mỗi phần tử của mảng có dữ liệu thuộc kiểu gì. - Ở đây, ta khai báo một biến mảng gồm có số phần tử phần tử, phần tử thứ nhất là tên mảng [0], phần tử cuối cùng là tên mảng[số phần tử -1] Ví dụ: int a[10]; /* Khai báo biến mảng tên a, phần tử thứ nhất là a[0], phần tử cuối cùng là a[9].*/ Ta có thể coi mảng a là một dãy liên tiếp các phần tử trong bộ nhớ như sau: Vị trí 0 1234 56 789 Tên phần tửa[0] a[1]a[2]a[3]a[4]a[5]a[6]a[7] a[8] a[9] * Khai báo mảng với số phần tử không xác định (khai báo không tường minh) Cú pháp: Khi khai báo, không cho biết rõ số phần tử của mảng, kiểu khai báo này thường được áp dụng trong các trường hợp: vừa khai báo vừa gán giá trị, khai báo mảng là tham số hình thức của hàm. a. Vừa khai báo vừa gán giá trị Cú pháp: []= {Các giá trị cách nhau bởi dấu phẩy} Nếu vừa khai báo vừa gán giá trị thì mặc nhiên C sẽ hiểu số phần tử của mảng là số giá trị mà chúng ta gán cho mảng trong cặp dấu {}. Chúng ta có thể sử dụng hàm sizeof() để lấy số phần tử của mảng như sau: Số phần tử=sizeof(tên mảng)/ sizeof(kiểu) b. Khai báo mảng là tham số hình thức của hàm, trong trường hợp này ta không cần chỉ định số phần tử của mảng là bao nhiêu. 6.1.1.2 Truy xuất từng phần tử của mảng Mỗi phần tử của mảng được truy xuất thông qua Tên biến mảng theo sau là chỉ số nằm trong cặp dấu ngoặc vuông [ ]. Chẳng hạn a[0] là phần tử đầu tiên của mảng a được khai báo ở trên. Chỉ số của phần tử mảng là một biểu thức mà giá trị là kiểu số nguyên. Với cách truy xuất theo kiểu này, Tên biến mảng[Chỉ số] có thể coi như là một biến có kiểu dữ liệu là kiểu được chỉ ra trong khai báo biến mảng. 81
  19. Ví dụ 1: int a[10]; Trong khai báo này, việc truy xuất các phần tử được chỉ ra trong hình sau. Chẳng hạn phần tử thứ 2 (có vị trí 1) là a[1]… 1 2 3 4 5 6 7 8 9 10 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] Ví dụ 2: Vừa khai báo vừa gán trị cho 1 mảng 1 chiều các số nguyên. In mảng số nguyên này lên màn hình. Giả sử ta đã biết số phần tử của mảng là n; việc hiển thị 1 giá trị số nguyên lên màn hình ta cần sử dụng hàm printf() với định dạng %d, tổng quát hóa lên nếu muốn hiển thị lên màn hình giá trị của n số nguyên, ta cần gọi hàm printf() đúng n lần. Như vậy trong trường hợp này ta sử dụng 1 vòng lặp để in ra giá trị các phần tử. Ta có đoạn chương trình sau: #include #include int main() { int n,i,j,tam; int dayso[]={66,65,69,68,67,70}; clrscr(); n=sizeof(dayso)/sizeof(int); /*Lấy số phần tử*/ printf("\n Noi dung cua mang "); for (i=0;i
  20. Ví dụ 3: #include "stdio.h" float x[5],c; main() { int i=0; printf("\n nhap gia tri cho ma tran x "); for (i=0;i=0 && i
nguon tai.lieu . vn