Bài tập Tin Học 11 - Turbo Pascal kiểu mảng - phần 1

Đề bài: Nhập vào một mảng số nguyên và xuất ra tổng lớn nhất của các phần tử liên tiếp trong mảng. Lưu ý: Một số cũng được xem như một tổng

#Yêu cầu

1. Sử dụng chương trình con và kiểu dữ liệu tệp 
2. Nhập mảng vào tệp vao.inp
Dòng đầu là một số nguyên n chỉ số phần tử của mảng
Dòng thứ hai là dãy n số nguyên, các số phân cách nhau bằng dấu cách
3. Nhập kết quả vào tệp ra.out gồm một số là tổng lớn nhất của các phần tử liên tiếp trong mảng.

#TEST

INPUT:
10
-1 2 -3 4 3 8 -6 -7 8 -9
OUTPUT:
15

INPUT:
10
-1 -2 3 -5 6 -7 -1 -3 9 -1
OUTPUT:

#Hướng dẫn

1. Viết chương trình đọc mảng
2. Viết chương trình viết kết quả
3. Viết hàm hoặc thủ tục tính tổng lớn nhất của các phần tử liên tiếp trong mảng - hai cái thủ tục 1 và hai đơn giản nên các bạn có thể tự viết. Mình sẽ nói rõ hơn về hàm thứ 3.

Để tính được tổng lớn nhất của các phần tử liên tiếp ta sẽ sử dụng hai vòng lặp. Vòng lặp thứ nhất ta sẽ dùng While Do và vòng lặp thứ hai sẽ dùng For Do.
Đối với vòng lặp While Do thì điều kiện là i<=n
Đối với vòng thứ hai ta sẽ cho vòng lặp For Do có j chạy từ i tới n. Khi duyệt qua mỗi phần tử thì ta sẽ kiểm tra xem nó có phải là số nguyên không, nếu không phải (a[j] <=0) thì ta sẽ gán vị trí của j cho i nhưng nhớ cộng thêm 1 và sau đó là thoát khỏi vòng lặp For Do bằng câu lệnh break;. Nếu nó là một số nguyên thì ta sẽ cộng thêm nó vào một biến tính tổng (sum) và vòng lặp For lại tiếp tục.
Mỗi khi vòng lặp For Do kết thúc ta lại kiểm tra xem nó có lớn hơn tổng lớn nhất (sum_max) không, nếu có thì ta gán sum cho sum_max.

#Chương trình

Mình đã viết chương trình này theo hai cách: Chương trình thứ nhất sử dụng một vòng lặp While Do và một vòng lặp For do còn chương trình thứ hai thì sử dụng hai vòng lặp While Do luôn.

  • Đây là chương trình thứ nhất
{Giai bai tap tin hoc 11 Turbo Pascal, bai tap turbo pascak kieu mang phan 1}
program tong_lon_nhat_cua_cac_phan_tu_Lien_tiep;
const fi='vao.inp';
fo='ra.out';
var a: array[1..100] of integer;
n: integer;
f: text;

procedure input;
var i: integer;
begin
   assign(f,fi);
   reset(f);
   readln(f,n);
   for i:= 1 to n do read(f,a[i]);
   close(f);
end;

function sum_max : integer;
var i,j,sum: integer;
begin
   sum_max:=0;
   i:=1;
   j:=1;
   while (i <= n) do
      begin
      sum:=0;
   for j:=i to n do
      if a[j] <= 0 then
      begin
         i:=j+1;
      break;
      end
   else
      begin
         sum:=sum+a[j];
      end;
   if sum > sum_max then sum_max:=sum;
      end;
 end;

procedure output;
begin
   assign(f,fo);
   rewrite(f);
   write(f,sum_max);
   close(f);
end;

BEGIN
input;
output;
END.

  • Đây là chương trình thứ hai

{Giai bai tap tin hoc 11 Turbo Pascal, bai tap turbo pascak kieu mang phan 1}
program tong_lon_nhat_cua_cac_phan_tu_Lien_tiep;
const fi='vao.inp';
fo='ra.out';
var a: array[1..100] of integer;
n: integer;
f: text;

procedure input;
var i: integer;
begin
   assign(f,fi);
   reset(f);
   readln(f,n);
   for i:= 1 to n do read(f,a[i]);
   close(f);
end;

function sum_max : integer;
var i,j,sum: integer;
begin
   sum_max:=0;
   i:=1;
   j:=1;
   while (i < n) do
      begin
      sum:=0;
   j:=i;
   while j<=n do
      if a[j] <= 0 then
      begin
         i:=j;
         inc(i);
      break;
      end
   else
      begin
         sum:=sum+a[j];
      inc(j);
      end;
   if sum > sum_max then sum_max:=sum;
      end;
 end;

procedure output;
begin
   assign(f,fo);
   rewrite(f);
   write(f,sum_max);
   close(f);
end;

BEGIN
input;
output;
END.
Nếu chương trình có bj lỗi hay sai sót gì thì mong các bạn thông báo cho mình nhưng mình kiểm tra thử thì thấy chạy ổn rồi. Trong bài này có phần nào chưa hiểu thì các bạn hãy bình luận ở bên dưới để mình giải thích vì mình diễn đạt dài dòng thì khó hiểu.

#Cập nhật ngày 17/3/2015

Rất xin lỗi các bạn về bài Pasal trên, khi viết bài thì mình luôn tìm cách viết để cho bài toán trở nên đơn giản nhất và tối ưu nhất. Nhưng trong bài trên thì mình hoàn toàn không làm được điều đó, mình dùng tới hai vòng lặp - điều này khiến bài toán phức tạp và khó hiểu, nó co thể làm cho bài không được tối ưu. Sau khi kiểm tra lại mình đã nhận ra là bài này chỉ cần giải với một vòng lặp For do là được:
{Giai bai tap tin hoc 11 Turbo Pascal, bai tap turbo pascak kieu mang phan 1}
program tong_lon_nhat_cua_cac_phan_tu_Lien_tiep;
const fi='vao.inp';
fo='ra.out';
var a: array[1..100] of integer;
n: integer;
f: text;

procedure input;
var i: integer;
begin
   assign(f,fi);
   reset(f);
   readln(f,n);
   for i:= 1 to n do read(f,a[i]);
   close(f);
end;

function sum_max : integer;
var i,j,sum: integer;
begin
   sum_max:=0;
   sum:=0;
   for j:=1 to n do
   begin
      if a[j] > 0 then
         begin
            sum:=sum+a[j];
         end
   else
      begin
      if sum > sum_max then sum_max:=sum;  
   sum:=0;
         end;
      if sum > sum_max then sum_max:=sum;  
   end;
 end;
 

procedure output;
begin
   assign(f,fo);
   rewrite(f);
   write(f,sum_max);
   close(f);
end;

BEGIN
input;
output;
END.
 

Comments