Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 15.12.2011, 16:50   #1 (permalink)
virginia
Member
 
Регистрация: 29.10.2011
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: -42
Unhappy Помогите найти ошибку

i:=1;
found1:=True; //положительный элемент не найден
found2:=True; // второй положительный элемент не найден
while found1 and(i<=n) do
begin
found1:=a[i]<=0;
j:=i;
inc (i)
end;
if not found1 then
begin
while found2 and(j<=n) do
begin
found2:=a[j+1]<=0;
k:=j+1;
inc(j)
end;
if not found2 then
begin
S:=0;
for i:=j+1 to k-1 do
s:=s+a[i];
Writeln (,s:2:2)
end
else writeln ('нет второго положительного')
end
else Writeln ('нет положительных');
не считает сумму.номера находит правильно,но сумма постоянно ноль
virginia вне форума   Ответить с цитированием

Старый 15.12.2011, 16:50
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Данные топики могут вам очень хорошо помочь

Помогите найти ошибку в решении задачи с массивом
Помогите, пожалуйста, найти ошибку в программе
Помогите найти ошибку в программе
Помогите найти ошибку, Pascal abc

Старый 15.12.2011, 17:02   #2 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

А вы попробуйте сделать вывод значений переменных i, j, k и вам все сразу станет ясно
AlexZir вне форума   Ответить с цитированием
Старый 15.12.2011, 17:15   #3 (permalink)
virginia
Member
 
Регистрация: 29.10.2011
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: -42
По умолчанию

Я их выводила,все правильно находит,но сумму не считает
virginia вне форума   Ответить с цитированием
Старый 15.12.2011, 17:19   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от virginia Посмотреть сообщение
Writeln (,s:2:2)
А зачем тут запятая?
И вообще - Вы не могли бы выложить текст задания и ПОЛНЫЙ листинг?
Vladimir_S вне форума   Ответить с цитированием
Старый 15.12.2011, 17:29   #5 (permalink)
virginia
Member
 
Регистрация: 29.10.2011
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: -42
По умолчанию

program zadacha3;

{$APPTYPE CONSOLE}

uses
SysUtils,
windows;

const
n_max=30;
var
a,b:array[1..n_max] of Real;
m,n,k,i,j,y:Integer;
max,s,tmp:Real;
vubor:Char;
found1,found2,found3:boolean;
begin
setconsoleoutputcp(1251);
repeat
begin
Writeln('1.Максимальный по модулю элемент массива',#10,
'2.Сумма элементов массива, расположенных между первым и вторым положительным элементом',
#10,'3.элементы равные 0 после всех остальных',
#10,'4.Выход');
write('Ваш выбор: ');readln(m);
case m of
1..3: begin
repeat
begin
write('введите количество элементов (<=30): ');
readln(n);
end;
until (n>=1) and (n<=n_max);
Writeln('введите массив');
for i:=1 to n do
read(a[i]);
readln;
case m of
1: begin
max:=Abs(a[1]);
for i:=2 to n do
begin
if Max < Abs(a[i]) then max:=a[i];
end;
Writeln('максимальный элемент по модулю',' ',max:2:2);
end;
2: begin
i:=1;
found1:=True; //положительный элемент не найден
found2:=True; // второй положительный элемент не найден
while found1 and(i<=n) do
begin
found1:=a[i]<=0;
j:=i;
inc (i)
end;
if not found1 then
begin
while found2 and(j<=n) do
begin
found2:=a[j+1]<=0;
k:=j+1;
inc(j)
end;
if not found2 then
begin
S:=0;
for i:=j+1 to k-1 do
s:=s+a[i];
Writeln ('сумма элементов между первым и вторым положительными элементами', ' ',s:2:2)
end
else writeln ('второго положительного элемента нет')
end
else Writeln ('положительных элементов нет');
end;
3: begin
for i:=n downto 1 do
if a[i]=0 then
begin
for j:=i to n-1 do
a[j]:=a[j+1];
a[n]:=0;
end;
write('Преобразованный массив',' ') ;
Write;
for i:=1 to n do
write(a[i]:4:2,' ');
end;
end;
Write(#10,'Завершить работу?(Y/N): ');
Readln(vubor);
end;
4: vubor:='y'
else
Writeln(#10,'ОШИБКА ВВОДА!',#10);
end;
end;
until (vubor='y') or (vubor='Y');
end.
второй пункт не работает.задание найти сумму элементов ,расположенных между первым и вторым положительными элементами
virginia вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 15.12.2011, 20:50   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Значит, так.
Ошибка Ваша в том, что, найдя первый положительный элемент и закрепив значение его индекса числом j, Вы, приступая к поиску второго положительного элемента, начинаете увеличивать... то же самое j и, тем самым, значение индекса первого положительного числа напрочь теряете! Я тут малость поработал над Вашей программой, исправил ошибку, "причесал", ну и т.д., в общем - вот (оставлена только чисто "паскалевская" часть, остальное - добавите):
Код:
const
 n_max=30;
var
 a,b:array[1..n_max] of Real;
 m,n,k,i,j,y:Integer;
 max,s,tmp:Real;
 vubor:Char;
 found1,found2,found3:boolean;
begin
 Repeat
  Writeln('1. Максимальный по модулю элемент массива');
  Writeln('2. Сумма элементов массива, расположенных между первым и вторым положительным элементом');
  Writeln('3. Элементы, равные 0 после всех остальных');
  Writeln('4. Выход');
  write('Ваш выбор: ');
  readln(m);
  case m of
   1..3: begin
          repeat
           write('введите количество элементов (<=30): ');
           readln(n);
          until (n>=1) and (n<=n_max);
          Writeln('введите массив');
          for i:=1 to n do read(a[i]);
          readln;
          case m of
           1: begin
               max:=Abs(a[1]);
               for i:=2 to n do
                 if Max<Abs(a[i]) then max:=a[i];
               Writeln('максимальный элемент по модулю',' ',max:2:2);
              end;
           2: begin
               i:=1;
               found1:=True; //положительный элемент не найден
               found2:=True; // второй положительный элемент не найден
               while found1 and (i<=n) do
                begin
                 found1:=a[i]<=0;
                 j:=i;
                 inc(i)
                end;
               if not found1 then
                begin
                 while found2 and(i<=n) do
                  begin
                   found2:=a[i]<=0;
                   k:=i;
                   inc(i)
                  end;
                 if not found2 then
                  begin
                   S:=0;
                   for i:=j+1 to k-1 do
                    s:=s+a[i];
                   Writeln ('сумма элементов между первым и вторым положительными элементами', ' ',s:2:2)
                  end
                else writeln ('второго положительного элемента нет');
               end
               else Writeln ('положительных элементов нет');
              end;
           3: begin
               for i:=n downto 1 do
                if a[i]=0 then
                 begin
                  for j:=i to n-1 do
                   a[j]:=a[j+1];
                  a[n]:=0;
                 end;
               writeln('Преобразованный массив:');
               for i:=1 to n do write(a[i]:4:2,' ');
               writeln;
              end;
          end;
          Write(#10,'Завершить работу?(Y/N): ');
          Readln(vubor);
         end;
      4: vubor:='y'
    else
      Writeln(#10,'ОШИБКА ВВОДА!',#10);
  end;
 Until (vubor='y') or (vubor='Y');
end.
Между прочим - на будущее: всё, что находится между Repeat и Until, есть тело оператора цикла, и окружать его дополнительными операторными скобками begin..end не нужно. Не ошибка, конечно - так, ненужное загромождение.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 13:00.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.