Có ai giỏi lập trình pascal không giúp mình với

chưa. đành chịu mất điểm bài đó vậy. hĩ. cũng không ai làm được ma. biet thế này mình không học tin học rồi
 
Bt tin đó hả?
hả??

----------

Bt tin đó hả?
hả??????

----------

Bt tin đó hả?
uhm.nhìn là biết ngay mà

----------

Bài giải luôn câu 1 luôn nè: https://www.mediafire.com/?sw1nkhlw69hajph
Tại vì là file văn bản nên file "sn.dat" mình lưu thế này: 2 2 1 3 3 (có khoảng trắng).
Mình ghi ra file cũng có khoảng trắng mỗi số.

Câu 2: https://www.mediafire.com/?3mecbm0hswb0ijb
P/s: mò lại cấu trúc Pascal đúng mệt thiệt.
cảm ơn bạn nhiều nhé.hihi
 
Hiệu chỉnh bởi quản lý:
giúp mình với mình chẳng hiểu j về mấy bài này hết.huhu
bt: lập trình đọc từ 2 tệp 2 dãy số nguyên đã sắp xếp không giảm a và b. hòa 2 dãy trên thành dãy không giảm c và lưu vào tệp 'snc.dat'

----------

help me
 
Bạn lưu 2 dãy trong file vào 2 mảng, ví dụ mảng A và mảng B.
Giờ giả sử có 2 con trỏ (giống con trỏ trong file í) lần lượt chỉ vào phần tử đầu tiên của mảng A và B, tức là chỉ vào phần tử A[1] và B[1].
Thêm một mảng C, có kích thước bằng kích thước của mảng A và mảng B cộng lại + một con trỏ cho mảng C, ban đầu cũng chỉ vào phần tử đầu tiên mảng C (C[1]).
Ý tưởng: duyệt cùng lúc 2 mảng A và B, giá trị phần tử ở mảng nào nhỏ hơn sẽ được thêm vào trong mảng C, nếu mảng A chưa hết thì copy các giá trị còn lại vào mảng C, nếu mảng B chưa hết thì copy các giá trị còn lại vào mảng C.
Lưu mảng C vào tệp.

Thuật toán như sau:
Mã:
program merge_algorithm;
uses crt;
var a: array[1..100] of integer;
 b: array[1..100] of integer;
 na,nb: integer; {na: length of array A, nb: length of array B}

 c: array[1..200] of integer;
 nc: integer; {nc: length of array C}

 input_file: text;
 output_file: text;

 i, j, k: integer;

begin
 {Initialization}
 assign(input_file, 'sn.dat');
 reset(input_file);

 assign(output_file, 'snc.dat');
 rewrite(output_file);

 {copy data into array A}
 na := 0;
 while not eoln(input_file) do
 begin
 na := na + 1;
 read(input_file, a[na]);
 end;

 {copy data into array B}
 nb := 0;
 readln(input_file);
 while not eoln(input_file) do
 begin
 nb := nb + 1;
 read(input_file, b[nb]);
 end;

 close(input_file);

 {merge algorithm}
 i := 1; {Index of array A}
 j := 1; {Index of array B}
 k := 1; {Index of array C}
 nc := na + nb; {length of array C is sum of length of array A and array B}
 while (i <= na) and (j <= nb) do
 begin
 if a[i] <= b[j] then
 begin
 c[k] := a[i];
 i := i + 1;
 end
 else
 begin
 c[k] := b[j];
 j := j + 1;
 end;

 k := k + 1;
 end;

 if i <= na then
 for i := i to na do
 begin
 c[k] := a[i];
 k := k + 1;
 end;

 if j <= nb then
 for j := j to nb do
 begin
 c[k] := b[j];
 k := k + 1;
 end;
 {copy array C into file "snc.dat"}
 for i := 1 to nc do
 write(output_file, c[i], ' ');

 close(output_file);
end.

File "sn.dat":
Mã:
-2 -1 0 1 3 5 7 9
2 4 6 8 10
File "snc.dat":
Mã:
-2 -1 0 1 2 3 4 5 6 7 8 9 10
 
đề bài:
1,cho dãy số nguyên lấy từ tệp 'sn.dat' gồm các số 1,2,3. hãy sắp xếp dãy đó thành dãy sao cho phần đầu là các chữ số 1, tiêp theo là các chữ số 3 cuối cung là số 2 với số lần trao đổi ít nhất và lưu vào têp 'snsx.dat'.
2, cho dãy số nguyên lấy ra từ tệp 'songuyen.dat'. hãy sắp xếp dãy đó thành dãy không tăng và lưu vào tệp 'snsapxep.dat'
Chào bạn sauthienthu. Mình dọc bài của bạn hơi trễ nên không biết có kịp giúp bạn không, mặc dù vậy mình vẫn trả lời thắc mắc của bạn. Trước khi trả lời mình có 2 điều cần nói :
1. Thứ nhất là, mình không hiểu câu 2 lắm. Dãy không tăng có phải là dãy giảm không, hay là dãy sắp xếp lộn xộn, sao cho các phần tử có giá trị lớn và phần tử có giá trị nhỏ nằm xen kẻ nhau.
2. Mình không còn nhớ cú pháp của Pascal, nên mình sẽ trình bày theo dạng pseudo-code. Bạn hoàn toàn có thể cài đặt sang Pascal dễ dàng.

Đối với câu 1, có nhiều cách để thực hiện, nhưng tôi sẽ dùng cách sử dụng mảng tạm. Có 2 cách để sử dụng mảng tạm.
Cách 1: duyệt mảng số nguyên, tìm các số yêu cầu rồi lưu vào bảng tạm. Cách này đòi hỏi dãy số nguyên phải được quét 3 lần (cho mỗi số 1, 3 và 2)
Cách 2 : dùng 3 mảng tạm (cho mỗi số 1, 2 và 3). Với cách này dãy số nguyên chỉ được quét 1 lần duy nhất.

aInteger : dãy các số nguyên được lấy từ file sn.dat
nInt : số phần tử có trong dãy trên.
aTemp : mảng tạm (kích thước mảng tạm = kích thước dãy số nguyên aInteger)
index : index của mảng tạm

index = 0; // khởi tạo index của mảng tạm là 0

// quét dãy số nguyên lần đầu, tìm các số 1
for i = 0, i < nInt, i = i + 1
BEGIN
if aInteger = 1
BEGIN
aTemp[index] = aInteger
index = index + 1;
END
END

// quét dãy lần hai, tìm các số 3
for i = 0, i < nInt, i = i + 1
BEGIN
if aInteger = 3
BEGIN
aTemp[index] = aInteger
index = index + 1;
END
END

// quét dãy lần cuối, tìm các số 2
for i = 0, i < nInt, i = i + 1
BEGIN
if aInteger = 2
BEGIN
aTemp[index] = aInteger
index = index + 1;
END
END

//hàm giả, copy từ dãy tạm tới dãy số nguyên chính
CopyArray(aTemp,aInteger);

// hàm giả, ghi dãy tới file
WriteToFile(aInteger);

Có nhiều cách để thực hiện, nhưng mình nghĩ cách này đơn giản. Mình cũng gợi ý là bạn nên save lại với định dạng txt để dễ dàng kiểm tra kết quả.
Thật ra mình nghĩ cách tốt nhất bạn nên gởi mã lên. Mình có thể biết được bạn vướng mắc chổ nào để hướng dẫn, như vậy sẽ tốt hơn và thậm chí nhanh hơn nhiều.
 
mình cảm ơn bạn nha dù mình đã nạp bài rồi nhưng ít ra mình biết mình sai chỗ nào
 
×
Quay lại
Top