# GÓC SÁNG TẠO > Khu vực lập trình > Pascal/Delphi/Kylix >  [Help gấp] Bài toán mảng kí tự và sắp xếp

## ringhn9x

*[Help] Bài toán mảng kí tự và sắp xếp* 
*bài 1:*
Viết chương trình nhập vào một dãy số nguyên.Tính trung bình cộng của dãy và in kết quả tính được ra màn hình.

*bài 2:*
Cho một mảng a gồm n số thực.hãy sắp xếp mảng theo chiều giảm dần và in kết quả lên màn hình.

*Bài 3:*Viết chương trình nhập vào 1 mảng kí tự, đếm mỗi loại kí tự có bao nhiêu lần xuất hiện?
Vd:AnhAnHaThanh
A:2 lần xuất hiện
a:2 lần xuất hiện
n:3 ...
h:3
H:1
T:1
 


mọi người giúp mình với ngay đi! Mình sắp phải nộp rồi!

----------


## seodinhphong

b1.


```
var       a:array[1..10000] of integer;
           s,i,n:longint;
begin
           write('nhap so luong phan tu:');readln(n);
           s:=0;
           for i:=1 to n do
           begin
                    write('A[',i,']:');
                    readln(A[i]);
                    s:=s+a[i];
           end;
           write(s/n);
           readln;
end.
```

b2.


```
var       a:array[1..10000] of real;
           n,i,j:longint;
           tg:real;
begin
           write('nhap so luong phan tu:');readln(n);
           for i:=1 to n do
           begin
                    write('A[',i,']:');
                    readln(A[i]);
           end;
           for j:=n downto 2 do
           for i:=1 ti j-1 do
           if  A[i]<a[i+1] then
           begin
                    tg:=a[i];
                    a[i]:=a[i+1];
                    a[i+1]:=tg;
           end;
           for i:=1 to n do write(a[i],' ');
           readln;
end.
```

b3.


```
uses   crt;
var     b:array['a'..'z'] of integer;
         b1:array['A'..'Z'] of integer;
         a:array[1..1000] of char;
         ch:char;i,n:integer;
begin
         clrscr;
         fillchar (b,sizeof(b),0);
         fillchar (b1,sizeof(b1),0);
         n:=0;
         repeat
                    read(ch);
                    if ch <> #13 then 
                    begin
                             inc(n);
                             a[n]:=ch;
                    end;
          until ch= #13;
         for i:=1 to n do
         begin
                    if a[i] in ['a'..'z'] then inc(b[a[i]])
                    else if a[i] in ['A'..'Z'] then inc(b1[a[i]]);
         end;
         for ch:='a' to 'z' do
         if b[ch] > 0 then writeln(ch:3,' : ',b[ch]:3);
         for ch:='A' to 'Z' do
         if b1[ch] > 0 then writeln(ch:3,' : ',b1[ch]:3);
         readln;
end.
```

----------


## nhocnguyen_vip

Bài 3 đề ra có đúng không vậy? A xuất hiện 1 lần ư?
Sacklove chạy thử chương trình chưa? B1: S,n là longint thì write(s/n) ra cái gì ta?
B2: dãy số thực mà, longint là nguyên không phải thực.
Chỉ cần chỉnh sửa những chỗ đó, còn lại là ok rồi.

----------


## vivawhite

bài 1 thì khai báo một biến tổng,một biến tb.chỏ i chay từ 1 đến n 
for i:=1 to n do
begin
tong:=tong+a_;
end;
tb:=tong/n;
write(tb);
---------------------------------Bài viết đã được trộn ---------------------------------
bài 2:khai báo them một biến trung gian tg
dùng hai vòng lặp
for i:=1 to n-1 do
for j:=i+1 to n do 
if a<a[j] then
begin
tg:=a;
a:=a[j];
a[j]:=tg;
end;_

----------


## bigrat96

> Bài 3 đề ra có đúng không vậy? A xuất hiện 1 lần ư?
> Sacklove chạy thử chương trình chưa? B1: S,n là longint thì write(s/n) ra cái gì ta?
> B2: dãy số thực mà, longint là nguyên không phải thực.
> Chỉ cần chỉnh sửa những chỗ đó, còn lại là ok rồi.


đồng ý rằng b2 em có khai báo nhầm 1 chỗ.(sơ suất do chưa test thử)
Với B3 thì có thể vd của *wlforevr* hơi mâu thuẫn với đề chút . Code thì em viết theo yêu cầu của đề bài.
Còn b1 thì theo em hiểu trung bình cộng là tổng của các phần tử và chia cho số lượng phần tử( không biết có phải em hiểu sai hay không ) 


```
for i:=1 to n do
begin
     s:=s+a[i];
end;
```

và 


```
       write(s/n);
```

chẳng phải vậy sao anh ??

----------


## myphamuc93

write(s/n) sẽ ra kết quả là số lẻ nhưng nó không ảnh hưởng gì đến việc gán biến s, n là longint hết. 
Nếu kq := s/n; mà kq : longint thì mới có vấn đề. Cái là ok!

----------


## inbaongoc007

Kết quả mà lẻ thì nó sẽ in ra : vd s=13,n=2: in ra 6.50000000000E+00. Nếu chấm test thì kq này không biết có được điểm không nữa. Nhưng nếu là em thì em không cho điểm đâu vì kq như thế giống kiểu real không :x:y ý.

----------


## tungldhdonga1

> Kết quả mà lẻ thì nó sẽ in ra : vd s=13,n=2: in ra 6.50000000000E+00. Nếu chấm test thì kq này không biết có được điểm không nữa. Nhưng nếu là em thì em không cho điểm đâu vì kq như thế giống kiểu real không :x:y ý.


không biết anh có nhầm không ? chứ 6.50000000000E+00 là số thực đc in ra = dấu phẩy động( dấu phẩy động và dấu phẩy tĩnh là 2 cách để biểu diễn số thực ).
Em thấy trong hầu hết các giáo trình về pascal đều nói về phần này mà . Vậy thì sao lại không được điểm ???

----------


## huyenbeo

Mọi người ơi! mọi người có thể hoàn chỉnh mấy bài giúp mình được không?
Cô giáo mình bảo nếu mà khai báo biến chỉ cần sai là bài đó không phải chấm luôn! mình thấy mọi người tranh luận nhau phần khai báo mà lo!

Mà cái lệnh này 
*fillchar (b,sizeof(b),0);
fillchar (b1,sizeof(b1),0);*

*Inc(n)*

mình chưa được học!
Mọi người hoán chỉnh giúp mình, giúp mình hoàn chỉnh cả mấy bài tính tổng nhé! cảm ơn mọi người nhiều lắm!
Mình đã nhờ diễn đàn ddth.com và diendantinhoc.vn mình thấy diễn đàn mình sôi nổi quá!
Giúp đỡ rất nhiệt tình! mình cảm ơn nhiều lắm!

----------


## poodle

> Mọi người ơi! mọi người có thể hoàn chỉnh mấy bài giúp mình được không?
> Cô giáo mình bảo nếu mà khai báo biến chỉ cần sai là bài đó không phải chấm luôn! mình thấy mọi người tranh luận nhau phần khai báo mà lo!
> 
> Mà cái lệnh này 
> *fillchar (b,sizeof(b),0);*
> *fillchar (b1,sizeof(b1),0);*
> 
> *Inc(n)*
> 
> ...


hàm inc(n) <=> n:=n+1;
còn hàm fillchar có tác dụng gán cho tất cả phần tử trong mảng 1 giá trị nào đó ( trong trường hợp trên là =0)
còn về các biến thì bạn có thể chạy thử code nếu thấy có gì không ổn thì post lên . mọi người sẽ cùng sửa chữa lại .
chúc bạn học tốt !

----------


## fire_diamond1987

> hàm inc(n) <=> n:=n+1;
> còn hàm fillchar có tác dụng gán cho tất cả phần tử trong mảng 1 giá trị nào đó ( trong trường hợp trên là =0)
> còn về các biến thì bạn có thể chạy thử code nếu thấy có gì không ổn thì post lên . mọi người sẽ cùng sửa chữa lại .
> chúc bạn học tốt !


Fillchar không hẳn là gán tất cả các ptu trong mảng 1 giá trị nào đó đâu. Cái sizeof() thực chất là tất cả các phần tử của mảng, nhưng nếu như này: fillchar(a,10,0) thì là gán 10 ptu của A giá trị 0. Mình thấy cái fillchar này chỉ ok khi dùng với 0 thôi, nếu gán =1 số <>0 là vấn đề nảy sinh, mà còn là vấn đề lớn đấy, ko tin thử thì biết.
Còn về cái . động . tĩnh thì không quan trọng, cái quan trọng là kq in ra không đúng yêu cầu, tính trung bình cộng lại in ra 6.00000000E+00 thì đúng hơn hay là 6,5 đúng hơn? Bạn nào ra đề thì thử làm cả 2 cách nhé, cô giáo cho điểm thế nào nói mọi người biết.

----------


## anhchjnhnb

Có thể thay
*fillchar (b,sizeof(b),0);*
*fillchar (b1,sizeof(b1),0);

*bằng các kí tự khác được không bạn???

Mọi người ơi! mọi người thấy những bài ở trên bạn *sacklove* đã giải đúng hết chưa? mình sắp thi rồi! nếu sai sót chỗ nào mọi người bổ xung và chỉnh sửa giúp mình nhé, cả mấy bài tập bên này: http://diendantinhoc.vn/showthread.php?t=39182 bạn xem có sai sót chỗ nào chỉnh sửa giùm mình nhá! cảm ơn mọi người rất nhiều

----------


## npd.fpt01

> Mọi người ơi! mọi người có thể hoàn chỉnh mấy bài giúp mình được không?
> Cô giáo mình bảo nếu mà khai báo biến chỉ cần sai là bài đó không phải chấm luôn! mình thấy mọi người tranh luận nhau phần khai báo mà lo!
> 
> Mà cái lệnh này 
> *fillchar (b,sizeof(b),0);
> fillchar (b1,sizeof(b1),0);*
> 
> *Inc(n)*
> 
> ...


Lệnh fillchar bạn có thể thay bằng
For i:=1 to ( số phần tử của mảng b ) do b_:=0

Lệnh inc(n) bạn có thể thay bằng : n:=n+1_

----------


## nqtmht

> Fillchar không hẳn là gán tất cả các ptu trong mảng 1 giá trị nào đó đâu. Cái sizeof() thực chất là tất cả các phần tử của mảng, nhưng nếu như này: fillchar(a,10,0) thì là gán 10 ptu của A giá trị 0. Mình thấy cái fillchar này chỉ ok khi dùng với 0 thôi, nếu gán =1 số <>0 là vấn đề nảy sinh, mà còn là vấn đề lớn đấy, ko tin thử thì biết.
> Còn về cái . động . tĩnh thì không quan trọng, cái quan trọng là kq in ra không đúng yêu cầu, tính trung bình cộng lại in ra 6.00000000E+00 thì đúng hơn hay là 6,5 đúng hơn? Bạn nào ra đề thì thử làm cả 2 cách nhé, cô giáo cho điểm thế nào nói mọi người biết.


em thì ko nghĩ vậy . đề bài chỉ yêu cầu là tính trung bình cộng chứ đâu có nói là phải in kết quả theo dạng nào . 
@*wlforevr* : để chắn chắn thì bạn có thể thêm (s/n:5:1) .

----------


## matngocads2015

> Fillchar không hẳn là gán tất cả các ptu trong mảng 1 giá trị nào đó đâu. Cái sizeof() thực chất là tất cả các phần tử của mảng, nhưng nếu như này: fillchar(a,10,0) thì là gán 10 ptu của A giá trị 0. Mình thấy cái fillchar này chỉ ok khi dùng với 0 thôi, nếu gán =1 số <>0 là vấn đề nảy sinh, mà còn là vấn đề lớn đấy, ko tin thử thì biết.
> Còn về cái . động . tĩnh thì không quan trọng, cái quan trọng là kq in ra không đúng yêu cầu, tính trung bình cộng lại in ra 6.00000000E+00 thì đúng hơn hay là 6,5 đúng hơn? Bạn nào ra đề thì thử làm cả 2 cách nhé, cô giáo cho điểm thế nào nói mọi người biết.


- Chỉ là 1 bài bình thường , không cần làm nó phức tạp lên như thế . Chẳng ai bắt bẻ điều này cả .
- Đề cũng không yêu cầu lấy bao nhiêu số sau dấu phẩy cả . Kiểu real thì ra vậy là điều đương nhiên

Còn về cái fillchar , thì có thể gán là false , true được mà

----------


## vip-yte

> write(s/n);


Chỗ này thiếu vì nó có thể là số thập phân::angry: (s/n:5:2)

----------


## shopnmm

> Lệnh fillchar bạn có thể thay bằng
> For i:=1 to ( số phần tử của mảng b ) do b_:=0
> 
> Lệnh inc(n) bạn có thể thay bằng : n:=n+1_


_

bạn ơi! thế cụ thể mình thay chỗ(số phần tử mảng b) là bao nhiêu??? mình chưa hiểu chỗ ấy lắm..._

----------


## lrocre

Kết quả của 13/2 đâu bằng 6.0000 ... đâu mà, = 6.5 chứ. kết quả sai rõ ràng như thế mà cho qua được thì điểm thi còn lại bao nhiêu?
@wlforever: bạn muốn gán cho bao nhiêu phần tử của mảng giá trị = 0 (hoặc false, true ) thì for i:=1 to <số đó> do mang_:=0..._

----------


## tebaogoc

> Chỗ này thiếu vì nó có thể là số thập phân::angry: (s/n:5:2)


thập phân thì sao hả bạn ? Đã có phép chia thì kiểu gì chả ra kết quả thập phân . đề không yêu cầu thì có hay không đâu có quan trọng .




> Kết quả của 13/2 đâu bằng 6.0000 ... đâu mà, = 6.5 chứ. kết quả sai rõ ràng như thế mà cho qua được thì điểm thi còn lại bao nhiêu?
> @wlforever: bạn muốn gán cho bao nhiêu phần tử của mảng giá trị = 0 (hoặc false, true ) thì for i:=1 to <số đó> do mang_:=0...
> _


_

anh cho em hỏi là test sai này ở đâu ra vậy ạ ???_

----------


## petduy

Sr không phải 6.000 mà là 6.5000E+00. Nhưng có là 6.50000E+00 đi chăng nữa thì kq này vẫn không được chấp nhận đâu. Bạn thi lần nào quan trọng chưa? Bạn để kết quả như trên liệu có được điểm tối đa ko? Không thể xuề xòa những chỗ đơn giản được. Nếu không những chỗ lớn hơn sẽ bị sai xót từ chính những chỗ nhỏ đấy.

----------


## thutrang203

> Sr không phải 6.000 mà là 6.5000E+00. Nhưng có là 6.50000E+00 đi chăng nữa thì kq này vẫn không được chấp nhận đâu. Bạn thi lần nào quan trọng chưa? Bạn để kết quả như trên liệu có được điểm tối đa ko? Không thể xuề xòa những chỗ đơn giản được. Nếu không những chỗ lớn hơn sẽ bị sai xót từ chính những chỗ nhỏ đấy.


cho em 1 lí do tại sao kết quả này lại ko đc chấp nhận !

----------


## chan

Nói chung là cái đó ko đc chấp nhận [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] bởi vì nó là số thập phân, bạn coi sách thì bic [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## hoanganh2

> Nói chung là cái đó ko đc chấp nhận [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] bởi vì nó là số thập phân, bạn coi sách thì bic [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]


thập phân thì sao hả bạn ?? mình có 2 cuốn giáo trình về turbo pascal nhưng chẳng thấy nói vấn đề nếu có số thập phân thì bắt buộc phải làm tròn . Sách của bạn là cuốn nào vậy có thể chỉ cho mình để mình tìm mua có đc không ?

----------


## evashopping

Thế này nhé, bạn chưa có kinh nghiệm thi trường phải không? Giờ bạn chỉ cần nghĩ thế này: nếu 6.500000000+E00 là ok, tức là vẫn biểu diễn kiểu lẻ như thế là được, thế thì tại sao kiểu real lúc nào cũng phải :0:2 hoặc :0:15 .... khi in ra mà không in ra luôn cho tiện? Còn để tường tận hơn, hum nào tới lớp hỏi thầy giáo dạy Tin thì biết.
Đặc thù của môn Tin là yêu cầu các Test phải đúng tới mức tuyệt đối (trừ mấy bài Heuristic). Do đó, kq 6.5 sẽ được 10 điểm, còn 6.500000+E00 vì không giống test đưa ra, nên cùng lắm được 8 (mình cho thoải mái đấy).

----------


## hoanghuy87

> Thế này nhé, bạn chưa có kinh nghiệm thi trường phải không? Giờ bạn chỉ cần nghĩ thế này: nếu 6.500000000+E00 là ok, tức là vẫn biểu diễn kiểu lẻ như thế là được, thế thì tại sao kiểu real lúc nào cũng phải :0:2 hoặc :0:15 .... khi in ra mà không in ra luôn cho tiện? Còn để tường tận hơn, hum nào tới lớp hỏi thầy giáo dạy Tin thì biết.
> Đặc thù của môn Tin là yêu cầu các Test phải đúng tới mức tuyệt đối (trừ mấy bài Heuristic). Do đó, kq 6.5 sẽ được 10 điểm, còn 6.500000+E00 vì không giống test đưa ra, nên cùng lắm được 8 (mình cho thoải mái đấy).


vâng ! đúng em chưa hề có kinh nghiệm thi cử vì cũng chỉ mới đc làm quen với lập trình .
em chưa hiểu test 6.5 kia thế nào là tuyệt đối nữa . 
vậy cho em hỏi nếu 1 số thực kiểu 13/6 thì lấy chính xác tuyệt đối thế nào đây ạ ? 
lúc đó kq = 2,166..67 hay kq=2,1667[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]0:4) sẽ đúng ạ ?

----------


## ledinh121189

> vâng ! đúng em chưa hề có kinh nghiệm thi cử vì cũng chỉ mới đc làm quen với lập trình .
> em chưa hiểu test 6.5 kia thế nào là tuyệt đối nữa . 
> vậy cho em hỏi nếu 1 số thực kiểu 13/6 thì lấy chính xác tuyệt đối thế nào đây ạ ? 
> lúc đó kq = 2,166..67 hay kq=2,1667[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]0:4) sẽ đúng ạ ?


 Thông thường thì các test đề bài ra nó sẽ :0:2 hoặc :0:5 là lấy được tròn số, còn trường hợp bạn nói thì ta chỉ cần lấy :0:4 là ngon rồi, BGK sẽ không trừ điểm đâu.

----------

