Во надо писать так
Код:
var
i, j, Buf: Integer;
begin
{ прогоняешь всю таблицу и ищешь пустые ячейки }
for i := 1 to 25 do
for j := 0 to 3 do
if SG2.Cells[j,i] = '' then
begin
ShowMessage(Format('Ошибка в таблице! Ячейка [%d, %d]', [j+1, i]));
Exit;
end;
{ таблица заполнена выполянем код }
for i := 1 to 25 do
begin
//количество оценок в SG3
SG3.Cells[0,i]:=IntToStr(StrToInt(SG2.Cells[0,i])+
StrToInt(SG2.Cells[1,i])+
StrToInt(SG2.Cells[2,i])+
StrToInt(SG2.Cells[3,i]));
//средний бал в SG3
SG3.Cells[1,i]:=
FloatToStrF(2*StrToInt(SG2.Cells[0,i])/StrToInt(SG3.Cells[0,i])+
3*StrToInt(SG2.Cells[1,i])/StrToInt(SG3.Cells[0,i])+
4*StrToInt(SG2.Cells[2,i])/StrToInt(SG3.Cells[0,i])+
5*StrToInt(SG2.Cells[3,i])/StrToInt(SG3.Cells[0,i]), ffFixed, 1, 1);
//Качество успеваемости в SG3
SG3.Cells[2,i]:=
FloatToStrF(Trunc((StrToInt(SG2.Cells[2,i])+StrToInt(SG2.Cells[3,i]))*100)
/StrToInt(SG3.Cells[0,i]), ffFixed, 0, 0);
//Успеваемость в SG3
SG3.Cells[3,i]:=
FloatToStrF(100-Trunc(StrToInt(SG2.Cells[0,i])*100)/
StrToInt(SG3.Cells[0,i]), ffFixed, 0, 0);
//Обученность в SG3
SG3.Cells[4,i]:=
FloatToStrF(Trunc((2*StrToInt(SG2.Cells[0,i])+
3*StrToInt(SG2.Cells[1,i])+
4*StrToInt(SG2.Cells[2,i])+
5*StrToInt(SG2.Cells[3,i]))*20)
/StrToInt(SG3.Cells[0,i]), ffFixed, 0, 0);
//Четвертная оценка в SG3
SG3.Cells[5,i]:=
FloatToStrF(Trunc(2*StrToInt(SG2.Cells[0,i])+
3*StrToInt(SG2.Cells[1,i])+
4*StrToInt(SG2.Cells[2,i])+
5*StrToInt(SG2.Cells[3,i]))
/StrToInt(SG3.Cells[0,i]), ffFixed, 0, 0);
end;
{а вот таким образом заменяется второй участок}
for i := 0 to 3 do
begin
Buf := 0;
for j := 1 to 25 do
Buf := Buf + StrToInt(SG2.Cells[i, j]);
SG2.Cells[i, 26] := IntToStr(Buf);
end;
А теперь по самой программе вопрос возник. Мне кажется ты делаешь ее неправильно, а точнее саму реализацию  ...
Сматри ты пишешь количество оценок в SG3, а насамом неле считаешь их сумму О_о
Дальше я не стал вникать, НО то что если у тебя оценки 1, 1, 5, 2 и ты в четверти получаешь 4, ну это уже никак (((
|