• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте, чтобы узнать больше. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Помогите найти ошибку

virginia

Новые
Регистрация
29 Окт 2011
Сообщения
42
Реакции
0
Баллы
0
Помогите найти ошибку

i:=1;
found1:=True; //положительный элемент не найден
found2:=True; // второй положительный элемент не найден
while found1 and(i<=n) do
begin
found1:=a<=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;
Writeln (,s:2:2)
end
else writeln ('нет второго положительного')
end
else Writeln ('нет положительных');
не считает сумму.номера находит правильно,но сумма постоянно ноль
 
А вы попробуйте сделать вывод значений переменных i, j, k и вам все сразу станет ясно :)
 
Я их выводила,все правильно находит,но сумму не считает
 
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);
readln;
case m of
1: begin
max:=Abs(a[1]);
for i:=2 to n do
begin
if Max < Abs(a) then max:=a;
end;
Writeln('максимальный элемент по модулю',' ',max:2:2);
end;
2: begin
i:=1;
found1:=True; //положительный элемент не найден
found2:=True; // второй положительный элемент не найден
while found1 and(i<=n) do
begin
found1:=a<=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;
Writeln ('сумма элементов между первым и вторым положительными элементами', ' ',s:2:2)
end
else writeln ('второго положительного элемента нет')
end
else Writeln ('положительных элементов нет');
end;
3: begin
for i:=n downto 1 do
if a=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: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.
второй пункт не работает.задание найти сумму элементов ,расположенных между первым и вторым положительными элементами
 
Значит, так.
Ошибка Ваша в том, что, найдя первый положительный элемент и закрепив значение его индекса числом 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 не нужно. Не ошибка, конечно - так, ненужное загромождение.
 
Назад
Сверху