Kiểu mảng một chiều

Một phần của tài liệu giáo án môn tin học 11 full một số khái niệm về lập trình và ngôn ngữ lập trình (Trang 47 - 54)

Mảng một chiều là dãy hữu hạn các phần tử cùng kiểu. Mảng được đặt tên và mỗi phần tử của nó có một chỉ số. Để mơ tả mảng một chiều cần xác định kiểu của các phần tử và cách đánh số các phần tử của nó.

Để người lập trình có thể xây dựng và sử dụng kiểu mảng một chiều, các ngơn ngữ lập trình có quy tắc cách thức cho phép xác định:

 Tên kiểu mảng một chiều;  Số lượng phần tử;

 Kiểu dữ liệu của phần tử;  Cách khai báo biến;

 Cách tham chiếu đến phần tử.

Ví dụ, xét bài tốn nhập vào nhiệt độ (trung bình) của mỗi ngày trong tuần. Tính và đưa ra màn hình nhiệt độ trung bình của tuần và số lượng ngày trong tuần có nhiệt độ cao hơn nhiệt độ trung bình của tuần.

Ta có thể dùng bảy biến thực để lưu trữ nhiệt độ của các ngày trong tuần. Chương trình giải bài tốn có thể được viết như sau:

#include <iostream> using namespace std; int main() { float t1,t2,t3,t4,t5,t6,t7; int dem;

cout<<"nhap nhiet do cua 7 ngay: "; cin>>t1>>t2>>t3>>t4>>t5>>t6>>t7; float tb=(t1+t2+t3+t4+t5+t6+t7)/7; dem=0; if (t1>tb) dem++; if (t2>tb) dem++; if (t3>tb) dem++; if (t4>tb) dem++; if (t5>tb) dem++; if (t6>tb) dem++;

if (t7>tb) dem++;

cout<<"\nNhiet do trung binh tuan "<<tb;

cout<<"\nSo ngay nhiet do cao hon trung binh: "<<dem; return 0;

}

Khi cần giải bài tốn trên với N ngày (N khá lớn) thì cách làm tương tự khơng những địi hỏi một khối lượng khai báo khá lớn, mà đoạn chương trình tính tốn cũng khá dài.

Để giải quyết vấn đề đó, ta sử dụng kiểu dữ liệu mảng một chiều để mô tả dữ liệu. Chương trình giải bài tốn tổng qt với N ngày như sau:

#include <iostream> using namespace std; int main() { float nhietdo[365]; int dem,i,n; float tong,tb; cout<<"nhap so ngay: "; cin>>n; for(i=1;i<=n;i++) {

cout<<"nhap nhiet do ngay thu "<<i<<'\t'; cin>>nhietdo[i]; tong+=nhietdo[i]; } dem=0; tb=tong/n; for(i=1;i<=n;i++) { if(nhietdo[i]>tb) dem++; }

cout<<"\nNhiet do trung binh "<<n<<"ngay"<<tb; cout<<"\nSo ngay nhiet do cao hon trung binh: "<<dem; return 0;

}

Trong chương trình này đã khai báo biến mảng một chiều như sau:

<kiểu dữ liệu> <tên biến mảng>[kích thước tối đa];

Ví dụ . Các khai báo kiểu mảng một chiều sau đây là hợp lệ:

float nhietdo[365]; int a[100];

Tham chiếu tới phần tử của mảng một chiều được xác định bởi tên mảng cùng với chỉ số, được viết trong cặp ngoặc [ và ].

Ví dụ, tham chiếu tới nhiệt độ của ngày thứ 20, trong chương trình trên, được viết là

Nhietdo[20].

Hình 10. Minh hoạ mảng một chiều

b) Một số ví dụ

Ta xét chương trình có sử dụng mảng một chiều cài đặt một số thuật tốn giải những bài tốn tìm kiếm và sắp xếp.

Ví dụ 1. Tìm phần tử lớn nhất của dãy số nguyên

Input: Số nguyên dương N (N  250) và dãy N số nguyên dương a1, a2 ,..., aN, mỗi số đều không

vượt quá 500.

Output: Chỉ số và giá trị của phần tử lớn nhất trong dãy số đã cho (nếu có nhiều phần tử lớn

nhất chỉ cần đưa ra một trong số chúng).

Hình 11. Thuật tốn tìm phần tử lớn nhất của dãy số

Chương trình dưới đây thực hiện việc duyệt tuần tự các phần tử để tìm ra số lớn nhất của dãy số nguyên.

#include <iostream> #define max 100 using namespace std; int main()

Bước 1. Nhập N và dãy a1,..., aN; Bước 2. Max ơ a1, i ơ 2;

Bước 3. Nếu i > N thì đưa ra giá trị Max rồi

kết thúc;

Bước 4.

Bước 4.1. Nếu ai > Max thì Max  ai;

Bước 4.2. i  i + 1 rồi quay lại bước 3;

{

int a[max];

int ptln,n,i,csmax;

cout<<"nhap so phan tu: "; cin>>n;

for(i=1;i<=n;i++) {

cout<<"nhap gia tri phan tu thu "<<i<<": "; cin>>a[i]; } ptln=a[1]; csmax=1; for(i=2;i<=n;i++) if(a[i]>ptln) { ptln=a[i]; csmax=i; }

cout<<"\nPhan tu lon nhat la "<<ptln;

cout<<"\nChi so cua phan tu lon nhat la "<<csmax; return 0;

}

Ví dụ 2. Sắp xếp dãy số nguyên bằng thuật toán tráo đổi

Input: Số nguyên dương N (N  250) và dãy A gồm N số nguyên dương a1, a2,..., aN, mỗi số đều

không vượt quá 500.

Output: Dãy số A đã được sắp xếp thành dãy khơng giảm.

Để giải bài tốn này, ta sẽ sử dụng thuật toán tráo đổi như mô tả trong sách giáo khoa Tin học 10.

(* Chuong trinh giai bai toan sap xep day so *) #include <iostream> #define max 250 using namespace std; int main() { int a[max]; int n,i,temp;

cout<<"nhap so phan tu: "; cin>>n;

for(i=1;i<=n;i++) {

cout<<"\nnhap gia tri phan tu thu "<<i<<": "; cin>>a[i];

}

cout<<"\n Mang vua nhap la: \n"; for(i=1;i<=n;i++) cout<<a[i]<<'\t'; for(int j=n;j>=2;j--) for (i=1;i<=j-1;i++) if(a[i]>a[i+1]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; }

cout<<"\n Mang sau khi sap xep la: \n";

for(i=1;i<=n;i++) cout<<a[i]<<'\t';

return 0;

}

Ví dụ 3. Tìm kiếm nhị phân

Input: Dãy A là dãy tăng gồm N (N  250) số nguyên dương a1, a2,..., aN và số nguyên k.

Output: Chỉ số i mà ai = k hoặc thông báo "Khong tim thay" nếu khơng có số hạng nào của dãy A có giá trị bằng k.

Để giải bài tốn này, chúng ta sẽ sử dụng thuật tốn tìm kiếm nhị phân được trình bày trong sách giáo khoa Tin học 10.

Hình 12. Thuật tốn tìm kiếm nhị phân

#include <iostream> #define max 250 using namespace std; int main() { int a[max]; int n,i,dau,cuoi,giua; bool timthay;

cout<<"nhap so phan tu: "; cin>>n;

for(i=1;i<=n;i++) {

cout<<"\nnhap gia tri phan tu thu "<<i<<": "; cin>>a[i];

}

cout<<"\n Mang vua nhap la: \n"; for(i=1;i<=n;i++) cout<<a[i]<<'\t';

int k;

cout<<"\nNhap gia tri k: "; cin>>k;

dau = 1; cuoi = n; timthay=false; do

{

giua=(dau+cuoi)/2;

if (a[giua]==k) timthay=true; else if (a[giua]>k) cuoi=giua-1; else dau=giua+1;

} while ((dau<=cuoi)&& (timthay==false)); if (timthay==true)

cout<<"chi so tim duoc la: "<<giua; else cout<<"Khong tim thay";

return 0; }

Một phần của tài liệu giáo án môn tin học 11 full một số khái niệm về lập trình và ngôn ngữ lập trình (Trang 47 - 54)

Tải bản đầy đủ (DOCX)

(87 trang)
w