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
pdf 8 trang Thùy Anh 22880 Free
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:

  • pdfbai_giang_tin_hoc_dai_cuong_phan_3_mang.pdf