Bài giảng Tin học đại cương - Phần 3: Mảng
10/14/2010
Nội dung
Mảng một chiều
Một số ví dụ
3 Mảng – array
Khởi tạo mảng
Mảng ký tự
Mảng nhiều chiều
3. Mảng – array
3. Mảng – array
Bài toán: Điểm môn THDC của các thành viên trong lớp được
nhập vào từ bàn phím. Hãy sắp xếp và đưa ra các điểm theo
thứ tự tăng dần.
Mảng : là một tập hợp hữu hạn các phần tử có cùng kiểu dữ
liệu được lưu trữ kế tiếp nhau trong bộ nhớ.
Khai báo mảng:
printf ("Nhap diem thu 1\n");
scanf ("%f", &diem1);
printf ("Nhap diem thu 2\n");
scanf ("%f", &diem2);
. . .
kiểu_dữ_liệu tên_biến_mảng[số_phần_tử];
VD.
int A[10];
float bang_diem[50];
char bang_ky_tu[26];
1
10/14/2010
3. Mảng – array
3. Mảng – array
Thao tác với các phần tử trong mảng như với số các biến thông
thường khác.
Truy cập vào một phần tử trong mảng :
bang_diem[5] : phần tử có chỉ số 5 trong mảng bang_diem
bang_diem[3]=7;
tên_biến_mảng[chỉ_số]
printf("Nhap vao diem thu 5: ");
Chú ý:
scanf("%f",&bang_diem[4]);
Phần tử đầu tiên trong mảng có chỉ số là 0.
bang_diem[5] sẽ là phần tử thứ 6 trong mảng.
bang_diem[5] = bang_diem[3] +1;
Phần tử cuối cùng trong mảng có chỉ số là
số_phần_tử‐1
printf("Diem thanh vien thu 7: %.2f",
bang_diem[6]);
3. Mảng – array
3. Mảng – array
value [0]
value [0]
value [1]
value [2]
value [3]
value [4]
value [5]
value [6]
value [7]
197
int values[10];
Các phần tử trong mảng
value [1]
được lưu trữ liên tục trong
bộ nhớ
value [2]
value [3]
value [4]
value [5]
value [6]
value [7]
‐101
values[0] = 197;
values[2] = -100;
values[5] = 350;
547
int values[10];
values[3] =
values[0] +
values[5];
350
35
values[9] =
values[5] / 10;
value [8]
value [9]
value [8]
value [9]
--values[2];
2
10/14/2010
#include <stdio.h>
3. Mảng – array
int main (void)
{
int values[10];
int index;
Sử dụng mảng như bộ đếm:
values[0] = 197;
values[2] = -100;
values[5] = 350;
values[3] = values[0] + values[5];
values[9] = values[5] / 10;
--values[2];
VD. Để khảo sát chất lượng một loại sản phẩm mới nhà sản
xuất đưa ra tiêu chí đánh giá chất lượng sản phẩm theo giá trị
từ 0 đến 5 (0 là không biết, 1 là rất tồi, 2 là tồi, 3 là trung bình,
4 là tốt và 5 là rất tốt).
Các tiêu chí này được khách hàng đánh giá thông qua một cuộc
khảo sát tại một siêu thị, khoảng 5000 người đã được phỏng
vấn.
for ( index = 0; index < 10; ++index )
printf ("values[%i] = %i\n", index,
values[index]);
Bây giờ ta muốn thống kê kết quả của cuộc khảo sát.
return 0;
}
#include <stdio.h>
int main (void)
{
3. Mảng – array
int ratingCounters[6], i, response;
Sắp xếp mảng: sắp xếp các phần tử của mảng theo thứ tự tăng
dần (hoặc giảm dần).
for ( i = 0; i <= 5; ++i ) ratingCounters[i] = 0;
printf ("Tra loi cua ban\n");
for ( i = 1; i <= 20; ++i ) {
scanf ("%i", &response);
if ( response < 0 || response > 5 )
printf ("Tra loi sai: %i\n", response);
else
3
1
5
2
2
3
7
5
8
5
5
7
1
8
Dãy ban đầu
Dãy cuối cùng
++ratingCounters[response];
}
Các thuật toán sắp xếp: sắp xếp chèn, lựa chọn, nổi bọt,
printf ("\n\nLoai
So luong\n");
shellsort, quicksort, mergesort, heapsort,….
printf ("------ -------------------\n");
for ( i = 0; i <= 5; ++i )
printf ("%4i%14i\n", i, ratingCounters[i]);
return 0;
}
3
10/14/2010
Thuật toán sắp xếp lựa chọn
Thuật toán sắp xếp lựa chọn
3
5
2
7
8
5
1
Dãy ban đầu
Thuật toán sắp xếp lựa chọn:
Nếu mảng ban đầu có từ 2 phần tử trở lên (n>=2)
. Gán giá trị k: k=n
Bước 1
3
3
5
5
2
2
7
8
5
1
3
3
5
5
2
2
7
5
1
1
5
7
8
8
. Lặp: cho đến khi k=1 thì dừng
– Tìm phần tử có giá trị lớn nhất trong k phần tử ban
đầu.
7
5
1
1
5
7
8
8
Bước 2
Bước …
– Đổi chỗ phần tử lớn nhất với phần tử thứ k
– Giảm k: k=k‐1
3
5
2
Dãy cuối cùng
1
2
3
5
5
7
8
while(k>1)
Thuật toán sắp xếp lựa chọn
{
//tim gia tri lon nhat trong k phan tu
viTriMax=0;
for(i=1;i<k;i++)
#include <stdio.h>
int main (void)
{
if(A[i]>A[viTriMax]) viTriMax=i;
//doi cho voi phan tu thu k
tmp=A[viTriMax];
A[viTriMax]=A[k‐1];
A[k‐1]=tmp;
int A[10]={1,4,2,8,12,4,28,4,23,10};
int i,k=10,tmp;
int viTriMax;
//giam
k=k‐1;
k
//in ra gia tri mang ban dau
for(i=0;i<10;i++)
printf("%d ",A[i]);
}
for(i=0;i<10;i++) printf("%d ",A[i]);
printf("\n");
return 0;
printf("\n");
}
4
10/14/2010
Tìm kiếm trên mảng
Tìm kiếm trên mảng
Bài toán: Tìm kiếm trên mảng
Thuật toán tìm kiếm tuần tự: so sánh lần lượt từng phần tử trên
mảng.
Đầu vào: Cho một mảng gồm n phần tử, và một giá trị khóa
k nào đó.
Nếu mảng có >0 phần tử
Đầu ra: Trả lời câu hỏi k có xuất hiện trong mảng
. Gán giá trị biến found = 0 (để xác định xem đã tìm thấy
hay chưa)
Có thể đầu ra sẽ là vị trí khóa k trong mảng hoặc số lần xuất hiện
của k trong mảng.
. Lặp: trong khi found =0 và chưa xét đến phần tử cuối
cùng
3
5
5
2
7
8
5
1
Mảng ban đầu
– So sánh giá trị phần tử hiện tại với k.
» Nếu đúng bằng thì gán biến found = 1.
» Ngược lại thì chuyển sang phần tử kế tiếp.
Khóa k
Câu trả lời: k có xuất hiện trong mảng
Tìm kiếm trên mảng
3. Mảng – array
VD. Sinh dãy số Fibonacci
Tìm kiếm quần tự:
int found =0;
i=0;
while(i<n && !found)
{
if(A[i]==k) found = 1;
else i++;
}
5
10/14/2010
3. Mảng – array
// chuong trinh sinh 15 so Fibonacci dau tien
#include <stdio.h>
VD. Sử dụng mảng để tạo ra các số nguyên tố.
int main (void)
{
Số nguyên tố là số chỉ chia hết cho 1 và chính
nó.
int Fibonacci[15], i;
Fibonacci[0] = 0; // theo dinh nghia
Fibonacci[1] = 1;
for ( i = 2; i < 15; ++i )
Fibonacci[i] = Fibonacci[i-2] + Fibonacci[i-1];
for ( i = 0; i < 15; ++i )
printf ("%i\n", Fibonacci[i]);
Để kiểm tra một số n là nguyên tố:
Thử chia cho các số từ 2 đến n-1: chỉ thực hiện được
với n nhỏ, nếu n cỡ 10.000.000 thì quá chậm !
Nếu n là nguyên tố thì nó cũng không chia hết cho
các số nguyên tố khác.
Hãy cài đặt để in sinh ra 100 số nguyên tố đầu
return 0;
}
tiên!
3. Mảng – array
3. Mảng – array
Khởi tạo mảng
Mảng ký tự:
int integers[5] = { 0, 1, 2, 3, 4 };
int integers[] = { 0, 1, 2, 3, 4 };
char letters[5] = { 'a', 'b', 'c', 'd', 'e' };
float sample[5] = {3*c, 3+x, 5.0, 4.6, 8.2};
#include <stdio.h>
int main (void)
{
char word[] = { 'H', 'e', 'l', 'l', 'o', '!' };
int i;
for ( i = 0; i < 6; ++i )
printf ("%c", word[i]);
float sample_data[500] = { [2] = 500.5, [1] = 300.0,
[0] = 100.0 }; (*)
int a[10] = { [9] = x + 1, [2] = 3, [1] = 2, [0] = 1 }; (*)
printf ("\n");
return 0;
}
(*) chỉ có trong C99 (devC++,…)
6
10/14/2010
// chuyen sang he co so moi
do {
3. Mảng – array
convertedNumber[index] = numberToConvert %
VD. Chương trình chuyển đồi cơ số, đổi số từ hệ cơ số 10 sang các hệ cơ số
base;
khác.
++index;
numberToConvert = numberToConvert / base;
#include <stdio.h>
int main (void)
{
}
while ( numberToConvert != 0 );
const char baseDigits[16] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
int convertedNumber[64];//so chuyen doi
long int numberToConvert;//so ban dau
int nextDigit, base, index = 0;
// Hien thi ket qua the thu tu nguoc
printf ("So da chuyen doi = ");
for (--index; index >= 0; --index ) {
nextDigit = convertedNumber[index];
printf ("%c", baseDigits[nextDigit]);
}
// doc vao so va co so chuyen doi
printf ("So can chuyen? ");
scanf ("%ld", &numberToConvert);
printf ("He co so moi? ");
scanf ("%i", &base);
printf ("\n");
return 0;
}
3. Mảng – array
3. Mảng – array
Mảng nhiều chiều: C cho phép khai báo mảng nhiều chiều.
VD. Mảng hai chiều
Khởi tạo mảng
int M[4][5] = {
{ 10, 5, -3, 17, 82 },
{ 9, 0, 0, 8, -7 },
{ 32, 20, 1, 0, 14 },
{ 0, 0, 8, 7, 6 }
};
Cột (j)
0
1
2
3
4
Hàng (i)
0
1
2
3
1
23
1
10
78
0
‐3
9
0
2
3
0
23
9
34
39
1
100
123
‐5
int M[4][5] = { 10, 5, -3, 17, 82, 9, 0, 0,
8, -7, 32, 20, 1, 0, 14, 0, 0, 8, 7, 6 };
Khai báo : kiểu_phần_tử tên_mảng[số_hàng][số_cột];
Truy cập vào phần tử: tên_mảng[i,j]
7
10/14/2010
#include <stdio.h>
int main (void)
{
3. Mảng – array
int slBan[3][7];
int i,j,tSang=0,tChieu=0,tToi=0;
printf("Nhap so luong san pham ban trong tuan\n");
for(j=0;j<7;j++)
{
VD. Thông tin về bán hàng của một của hàng tại các thời
điểm trong ngày (sáng, chiều và tối) của một tuần được
lưu vào một mảng.
printf("Ngay thu %i:",j+1);
printf("So luong(Sang,chieu va toi ):");
scanf("%i%i%i",&slBan[0][j],&slBan[1][j],
&slBan[2][j]);
Hãy in ra thông tin về số lượng sản phẩm bán ra trung
bình tại các thời điểm trong ngày của tuần đó
}
printf("\n\nThong ke trong tuan\n");
for(j=0;j<7;j++) printf("Ngay %i ",j+1);
printf("\n");
printf("------------------------------------------
-------------\n");
for(j=0;j<7;j++) printf("%5i
printf("\n");
for(j=0;j<7;j++) printf("%5i
printf("\n");
for(j=0;j<7;j++) printf("%5i
printf("\n");
", slBan[0][j]);
",slBan[1][j]);
",slBan[2][j]);
for(j=0;j<7;j++){
tSang=tSang+slBan[0][j];
tChieu=tChieu+slBan[1][j];
tToi=tToi+slBan[2][j];
}
printf("\n\nTrung binh trong tuan:\n");
printf("Sang: %.2f\n",(float)tSang/7);
printf("Chieu: %.2f\n",(float)tChieu/7);
printf("Toi: %.2f\n",(float)tToi/7);
return 0;
}
8
Bạn đang xem tài liệu "Bài giảng Tin học đại cương - Phần 3: Mảng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
- bai_giang_tin_hoc_dai_cuong_phan_3_mang.pdf