Tải bản đầy đủ (.doc) (5 trang)

Thực hành tin học đại cương tuần 4

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 (147.53 KB, 5 trang )

ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
Đại học Công nghệ Thông tin
  
THỰC HÀNH MÔN TIN HỌC ĐẠI CƯƠNG
Bài số 4 : KIỂU DỮ LIỆU MẢNG
1. MỤC TIÊU
1.1. Nắm được các cách khai báo kiểu dữ liệu mảng.
1.2. Sử dụng vòng lặp để duyệt trên mảng.
1.3. Thao tác các phần tử trong mảng thông qua giá trị và chỉ số tương
ứng trong mảng.
2. BÀI TẬP THỰC HÀNH
2.1. Dãy số thực : Phần tử lớn nhất, bé nhất; số phần tử dương, âm
và bằng 0.
2.2. Tìm dãy số chẵn, lẻ từ một dãy số nguyên.
2.3. So sánh hai dãy số nguyên.
2.4. Dãy số nguyên : Đảo ngược dãy; tìm, xoá, sắp xếp, và chèn phần
tử trong dãy.
2.1. Dãy số thực : Phần tử lớn nhất, bé nhất; số phần tử dương, âm và
bằng 0.
• Đề bài :
Nhập số tự nhiên N và một dãy số thực x
1
, x
2
, , xn.
- Tìm số lớn nhất và số nhỏ nhất của dãy.
- Đếm trong dãy có bao nhiêu số dương, bao nhiêu số âm, bao nhiêu số 0 ?
Loại nào nhiều nhất ?
• Phân tích bài toán :
- Dãy số thực x
1


, x
2
… xn được nhập và lưu trong mảng một chiều X.
- Dùng vòng lặp duyệt từ đầu đến cuối mảng, đếm số phần tử dương, âm và 0,
sau đó so sánh chúng để tìm ra loại nào nhiều nhất.
Lưu ý : Để đếm chính xác số phần tử từng loại trong mảng, trước khi đếm
cần phải khởi gán biến đếm bằng 0.
• Chương trình minh họa :
#include <stdio.h>
#include <conio.h>
#define MAX 100;
void main()
{
int n; // N là số phần tử trong dãy
float X[MAX];
int nPos, nNeg, nZero ;
float fMax, fMin;
do
printf(‘ Nhập số phần tử của dãy :’);
scanf(“%d”, &n);
while ((N>0) && (n<=MAX));
for (int i=0 ; i<n;i++)
{
printf(‘Nhập phần tử thứ %d :’, i);
scanf(“%f”, &X[i]);
}
fMax = X[0];
fMin = X[0];
for (int i=0 ; i<n;i++)
{

if (fMax<X[i])
fMax = X[i];
if (fMin>X[i])
fMin = X[i];
}
printf(‘Phần tử lớn nhất bằng : %f’, fMax);
printf(‘Phần tử bé nhất bằng : %f’, fMin);
nPos = 0;
nNeg = 0;
nZero = 0;
for (int i=0 ; i<n;i++)
{
if (X[i]>0)
nPos++;
else
if (X[i]<0)
nNeg++;
else
nZero++;
}
if ((nPos>nNeg) && (nPos>nZero))
printf(‘Số phần tử dương nhiều nhất.’);
else
if ((nNeg>nPos) && (nNeg>nZero))
printf(‘Số phần tử âm nhiều nhất.’);
else
printf(‘Số phần tử 0 nhiều nhất.’);
getch();
}
2.2. Tìm dãy số chẵn, lẻ từ một dãy số nguyên

• Đề bài :
Nhập một dãy số nguyên x
1
, x
2
, , xn. In riêng các số chẵn và các số lẻ, mỗi
loại trên một dòng.
• Phân tích bài toán :
Duyệt dãy số nguyên x
1
, x
2
, , xn. Chuyển các phần tử chẵn, lẻ vào hai mảng
khác nhau. Sau đó, in mỗi dãy trên một dòng.
• Chương trình minh họa :
#include <stdio.h>
#include <conio.h>
#define MAX 100;
void main()
{
int x[MAX][MAX], c[MAX][MAX], l[MAX][MAX];
int i, n, cPos, lPos;
do
printf(‘ Nhập số phần tử của dãy :’);
scanf(“%d”, &n);
while ((N>0) && (n<=MAX));
for (i=0 ; i<n;i++)
}
printf(‘Nhập phần tử thứ %d :’, i);
scanf(“%f”, &x[i]);

}
cPos = 0;
lPos = 0;
for (i=0 ; i<n;i++)
{
if (x[i] % 2 == 1)
{
lPos++;
l[lPos] = x[i];
}
else
{
cPos++;
c[cPos] = x[i];
}
}
printf(‘Các số lẻ trong dãy :’);
for (i=0 ; i<lPos;i++)
printf(“%d “,l[i]);
printf(‘\n’);
printf(‘Các số chẵn trong dãy :’);
for (i=0 ; i<cPos;i++)
printf(“%d “,l[i]);
getch();
}
• Bài tập mở rộng :
Nhập một dãy số nguyên dương x
1
, x
2

, , xn .
- Tách dãy x thành hai dãy: dãy A gồm các số chẵn, dãy B gồm các số lẻ,
sắp xếp dãy A tăng dần, dãy B giảm dần, in hai dãy A và B trên hai dòng
khác nhau.
- Nối hai dãy A và B theo thứ tự đó thành một dãy duy nhất và gán trở lại
vào dãy x, in dãy x.
Ví dụ nhập dãy x={ 5, 7, 0, 2, 1, 6, 4, 9 } thì dãy A={ 0, 2, 4, 6}, dãy
B={ 9, 7, 5, 1}, và x={ 0, 2, 4, 6, 9, 7, 5, 1}.
2.3. So sánh hai dãy số nguyên.
• Đề bài :
Nhập vào hai dãy số nguyên A
1
, A
2
, …, An, và B
1
, B
2
, …, Bm.
Xuất ra tập các số là hội của hai dãy A và B.
Xuất ra tập các số là hiệu của hai dãy A và B.
• Phân tích bài toán :
Hội của hai dãy A và B là tập các số vừa tồn tại trong dãy A, vừa tồn tại
trong dãy B. Bằng cách duyệt từng phần tử Ai của A so sánh với tất cả các
phần tử trong B. Nếu Ai = Bj, ta được một phần tử thuộc tập hội.
Tương tự, hiệu của A và B là tập các phần tử thuộc A nhưng không thuộc
B. Chương trình VD3_2_3 minh họa phép hiệu (Đối với phép hội, đề nghị các
bạn tự cài đặt).
2.4. Dãy số nguyên : Đảo ngược dãy; tìm, xoá, sắp xếp, và chèn
phần tử trong dãy.

• Đề bài :
Nhập một dãy số nguyên bất kỳ x1, x2, , xn.
1. In đảo ngược dãy đó, ví dụ cho dãy 1 5 3 8, in ra: 8 3 5 1.
2. Tìm một phần tử có tồn tại trong dãy.
3. Xoá một phần tử trong dãy.
4. Sắp xếp dãy tăng (giảm) dần, in dãy.
5. Chèn một phần tử vào dãy đã sắp xếp.
• Phân tích bài toán :
1. Với dãy được nhập, giả sử từ 1 đến N (như ví dụ 2.2), ta có thể giải quyết
câu 1 theo một số cách sau :
Cách 1 : Dùng vòng lặp chạy từ phần tử thứ N đến 1, sau đó xuất tuần
tự ra màn hình. Cách này không làm thay đổi vị trí các phần tử
trong dãy ban đầu. Các anh chị tự cài đặt chương trình này.
Cách 2 : Đảo vị trí các phần tử trong chuỗi, bằng cách hoán vị từng
cặp phần tử đầu với phần tử cuối.
2. Bằng cách dùng vòng lặp duyệt từ đầu đến cuối mảng, so sánh phần tử
đang duyệt với phần tử cần tìm : nếu có trong dãy thì thông báo và thoát
khỏi vòng lặp; nếu duyệt hết dãy mà không có thì thông báo phần tử
không tồn tại trong dãy. Đề nghị các anh chị tự cài đặt chương trình này.
3. Để xoá một phần tử trong dãy, trước hết duyệt tìm phần tử trong dãy (như
ở câu 2). Sau đó, loại phần tử ra khỏi dãy bằng cách gán tuần tự các phần
tử sau phần tử vừa xác định trên về trước một vị trí Ở đây, chúng ta giả
định chỉ xoá phần tử đầu tiên trong dãy có giá trị cần tìm.
4. Có nhiều cách sắp xếp một dãy tăng, giảm. Ở đây chúng tôi minh họa cách
sắp xếp tăng đơn giản như sau :
Tìm phần tử nhỏ nhất đưa về đầu dãy kết quả.
Dãy còn lại cần sắp xếp được thực hiện từ phần tử thứ 2. Ta tiếp tục
thực hiện thao tác tương tự như trên.
Lặp đến phần tử cuối cùng, ta được dãy sắp xếp tăng dần.
5. Với một dãy đã sắp xếp – giả sử tăng, để chèn một phần tử X vào dãy, ta

có thể duyệt tuần tự, tìm vị trí phần tử lớn nhất trong các phần tử trên dãy
mà bé hơn phần tử X; sau đó, chèn X vào sau phần tử này. Lưu ý rằng, để
chèn X, ta cần phải dời các phần tử sau X về sau một vị trí (bắt đầu từ vị
trí cuối cùng trong dãy), nhằm tránh trường hợp xoá mất giá trị của các
phần tử này. Cách thực hiện tương tự ở câu 3, nhưng ngược lại. Các anh
chị tự cài đặt chương trình này.

×