Chương trình tính tổng S

uses crt;
var i,n,sum:longint;
function exp(num:longint):longint;
var ss:word;
begin
     ss:=1;
     for i:=1 to num+1 do ss:=ss*num ;
     exp:=ss;
end;
begin
     clrscr;
     readln(n);
     for i:=n-1 downto 1 do
         if i mod 2 = 1 then inc(sum,exp(i))
            else dec(sum,exp(i));
     write(sum);
     readln
end.

Bài tập tính tổng S = 1^2 - 2^3 + 3^4 - 4^5 (trừ hoặc cộng) (n-1)^n. Không biết code có vấn đề chỗ nào mà pascal không đưa output. Xin chỉ giáo.

i là biến toàn cục,

chỗ này trong hàm exp bạn đã làm tăng giá trị của i lên rồi, mỗi lần gọi hàm exp là giá trị của i lại tăng lên, nên nó không bao giờ đạt giá trị nhỏ hơn 1. Do đó làm cho vòng lặp dưới này

     for i:=n-1 downto 1 do
         if i mod 2 = 1 then inc(sum,exp(i))
            else dec(sum,exp(i));

trở thành vòng lặp vô hạn.
Để sửa thì bạn nên khai báo một biến cục bộ trong hàm exp để chạy vòng for trong đó.

4 Likes

Chạy lặp thì đừng khai báo biến i toàn cục bạn ơi.

2 Likes

Toàn cục thì cũng được, nhưng đừng dùng cùng 1 biến chạy cho 2 hàm lặp luân phiên nhau.

Tốt nhất là khai báo cục bộ trong hàm.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?