PDA

View Full Version : Bài tập mảng 1 chiều



lehang_gb1
10-11-2009, 20:23
Nhập vào mảng 1 chiều gồm n số nguyên (N<=100).Đưa ra số lần xuất hiện của mỗi phần tử trong mảng.
VD N=6 Dãy A: 3 3 4 0 4 3
So lan xuat hien so 3 la: 3
So lan xuat hien so 4 la: 2
So lan xuat hien so 0 la: 1

tuancoltech
11-11-2009, 00:45
Duyệt từng phần tử mảng rồi đếm số lần xuất hiện của các phần tử cần tìm.

dancuipascal
11-11-2009, 20:32
program mang;
var b,a:array[1..100]of integer;
i,j,n,tg,k:integer;
begin
write('nhap n:');readln(n);
for i:=1 to n do begin
write('nhap phan tu thu ',i,':');readln(a[i]);
end;
for i:=1 to n do
for j:=i+1 to n do
if a[i]>a[j] then begin
tg:=a[i];a[i]:=a[j];a[j]:=tg; end;
k:=1;b[k]:=1;
while n>0 do begin if a[n]=a[n-1] then begin n:=n-1;b[k]:=b[k]+1
end else begin writeln(a[n],' ',b[k]);k:=k+1;b[k]:=1;n:=n-1;end;end;
readln;
end.


bài này tuy không tối ưu nhưng đúng đó bạn thử chạy nhak nếu sai thỳ góp ý

alviss1011
23-01-2010, 15:51
[/color]
thu vs test nhu pan kia bao thi` no' ra caj' j` i'
4 23 30 1
de1 nghi xem laj viet hoan chinh giup em

nhokdragon94
24-01-2010, 09:24
CÁi này chơi úp cờ, dựng cờ cũng đc há

cristianly
25-01-2010, 13:31
Bài này tui có cách giải như sao:
-kiểm tra từng phần tử và đếm số lần xuất hiện của nó.
-Kiểm tra xem phần tử đó được xuất rồi chưa, nếu chưa thì thưcj hiện công việc đếm và xuất.

Code:

Var a:array[1..100] of integer;
n,i,j,k,dem:integer;
kt:boolean;
begin
clrscr;
write('n=');readln(n);
for i:=1 to n do
begin
write('a[',i,']=');readln(a[i]);
end;
for i:=1 to n do
begin
kt:=true;
for j:=1 to i-1 do if a[i]=a[j] then kt:=false;
if kt then
begin
dem:=0;
for k:=1 to n do
if a[i]=a[k] then inc(dem);
writeln(a[i],' xuat hien ',dem,' lan');
end;
end;
readln;
end.

alviss1011
30-01-2010, 14:57
tai sao lai dung if kt then??????????/

BMIT0211
06-02-2010, 02:47
Hình như chưa ổn lắm! Alviss1011 ? hay lắm.

phanh_xich_lo
06-02-2010, 08:22
Ý tưởng của mình như sau :
- Dùng 2 mảng int. 1 mảng chứa các số nhập vào (A), 1 mảng chứa số lượng các số (B).
- Hàm countArray() để đếm số lượng các số ở mảng A đưa vào mảng B. Cần lưu ý cách đưa vào mảng B như sau :
B[0] chứa số lượng số của số thứ nhất mảng A
B[1] chứa số lượng số của số thứ hai mảng A
..........
Tuy nhiên cách này khiến việc hiển thị gặp khó khăn. Nên trong hàm cần kiểm tra để nếu số trong mảng A xuất hiện lại thì coi như số lượng số ở vị trí đó bằng 0.
- Cách hiển thị : Nếu B[i]>0 -> số lần xuất hiện của A[i] là B[i]. Mấy phần râu ria như tạo mảng.. các bạn tự làm nhé.

Mảng B[100] khởi tạo giá trị ban đầu bằng 0.
public void countArray()
{
int count =0;
for(int i=0;i<A.length;i++)
{
for(int j=0;j<A.length;j++)
{
if(A[i]==A[j])
{
if(j<i) // kiem tra so nay da xuat //hien la lan so sanh truoc
{
count=0;
break;
}
else{
count++;
}
}
}
B[i]=count;
count = 0;
}
}
- Hien thi :
public static void main(String[] arg) throws IOException
{
hehe C = new hehe();// hehe la class chính
C.countArray();
for(int i=0; i<C.B.length;i++)
{
if(C.B[i]>0)
{
System.out.println("So lan xuat hien cua "+C.B[i]);
System.out.println(C.B[i]);
}
}

}

QuyNam
07-02-2010, 07:47
ý tưởng của mình :
- không cần dùng mảng để lưu dãy, trong quá trình nhập xét luôn
- dùng 1 mảng để lưu kq, kq[i] là số lần xuất hiện của số có giá trị i



uses crt;
var i,n,a,max:integer;
kq:array[1..255] of byte;
yet:set of byte;

begin
clrscr;
write('Nhap n : ');readln(n);
for i:=1 to n do
begin
write('Nhap a[',i,'] : ');
readln(a);
if a>max then max:=a;
if not (a in yet) then yet:=yet+[a];
inc(kq[a]);
end;
for i:=1 to max do if i in yet then writeln(i,' : ',kq[i]);
readln;
end.

cristianly
10-02-2010, 21:19
tai sao lai dung if kt then??????????/
Hey! Bác có học Pascal ko vậy?
câu hỏi vớ vẩn thế mà cũng hỏi, ko kiểm tra nó xuất rồi hay chưa mà đã thống kê thì xuất ra cả đống trùng nhau!

vd:
3 3 4 0 4 3

kq:
số lần xuất hiện của 3 là : 3
số lần xuất hiện của 3 là : 3
số lần xuất hiện của 4 là : 2
số lần xuất hiện của 0 là : 1
số lần xuất hiện của 4 là : 2
số lần xuất hiện của 5 là : 3


@QuyNam: ý tưởng của bạn khá hay nhưng phần code sẽ bị lỗi test đấy bạn:D

nguyenthong1593
11-02-2010, 20:25
tại sao bạn hok dùn kiểu xâu nhỉ!!!!!! đâu nhất thiết phải dùng kiểu mảng 1 chiều nhỉ!mình xin trình bày cach của minh nha!!!!!!
program aaaa;
uses crt;
var a:string;
c:char;
x,i,j:byte;
begin
clrscr;
writeln('nhap vao cac chu~ so ') readln(a);
x:length(a);j:=0;
for c:='1' to '9' do
begin
for i:=1 to x do
if a[i]:= c then inc(j);
writeln(' so lan xuat hien ',c,' la ',j);
end;
realdn
end.
mình hok bit co dúng hay sai mong cac bạn có thể chỉ giáo thêm cho mình nha!!!!!!! thanks các bạn nhìu lắm!!!!!!! DongHwa

nhokdragon94
14-02-2010, 17:51
Có 1 vài chỉnh sửa lại của nguyenthong1593:
code:{mình có bỏ cái clscr}
program aaaa;
var a:string;
c:char;
x,i,j:byte;
begin
writeln('nhap vao cac chu~ so '); readln(a);
x:=length(a);j:=0;
for c:='1' to '9' do
begin
for i:=1 to x do
if a[i]=c then inc(j);
writeln(' so lan xuat hien ',c,' la ',j);
end;
readln;
end.

Ko biết có sửa lại đúng ý bạn ko nhung sao chạy ko ra kết quả:
1/hạn chế ko thể nhập dấu cách " "
2/ Chạy ko ra ^^
nhập 12345
kq:
so lan xuat hien cua 1 la 1
so lan xuat hien cua 2 la 2
so lan xuat hien cua 3 la 3
so lan xuat hien cua 4 la 4
so lan xuat hien cua 5 la 5
so lan xuat hien cua 6 la 5
so lan xuat hien cua 7 la 5
so lan xuat hien cua 8 la 5
so lan xuat hien cua 9 la 5
(^^)

[=========> Bổ sung bài viết <=========]

Năm mới happy khai bút :)
Mình có cách làm như thế này:
Không biết có trùng với ý tưởng của bạn cris ko
code:
program aaaa;
var A:array[1..100] of integer;
B:array[1..100] of boolean;
i,j,n,dem:integer;

procedure test;
begin
B[i]:=true;
for j:=i+1 to n do
If (A[i]=A[j]) and (B[j]=false) then
begin
dem:=dem+1;
B[j]:=true;
end;
end;

begin
write('nhap so luong : '); readln(n);
for i:=1 to n do
begin
write('nhap so thu: ',i,' ');
readln(A[i]);
end;
fillchar(B,sizeof(b),false);
dem:=1;
for i:=1 to n do
begin
If B[i]=false then
begin
test;
writeln('so lan xuat hien cua ',A[i],' la: ',dem);
end
else
test;
dem:=1;
end;
readln;
end.
(Đã test 1 vài trường hợp và thấy đúng ^^ )
Tuy nhiên hơi dài, vì để loại khỏi trường hợp lặp lại như cris nói mình đã làm thêm 1 procedure nữa. Bạn nào có cách tối ưu hơn thì post lên nhé keke

huyhoang_1226
15-05-2011, 21:16
Var a:array[1..100] of integer;
n,i,j,k,dem:integer;
kt:boolean;
begin
clrscr;
write('n=');readln(n);
for i:=1 to n do
begin
write('a[',i,']=');readln(a[i]);
end;
for i:=1 to n do
begin
kt:=true;
for j:=1 to i-1 do if a[i]=a[j] then kt:=false;
if kt=true then
begin
dem:=0;
for k:=1 to n do
if a[i]=a[k] then inc(dem);
writeln(a[i],' xuat hien ',dem,' lan');
end;
end;
readln;
end.

hiennguyen043112
18-04-2017, 21:30
ban dancuipascal oi!
minh chay thu code nay nhung chi dem duoc gan het thoi con so cuoi cung nho nhat khong dem duoc
ban xem lai di minh tim cach mai ma khong duoc! cam on nhe