15.12.2011, 16:50 | #1 (permalink) |
Member
Регистрация: 29.10.2011
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: -42
|
Помогите найти ошибку
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 ('нет положительных'); не считает сумму.номера находит правильно,но сумма постоянно ноль |
15.12.2011, 16:50 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Данные топики могут вам очень хорошо помочь Помогите найти ошибку в решении задачи с массивом Помогите, пожалуйста, найти ошибку в программе Помогите найти ошибку в программе Помогите найти ошибку, Pascal abc |
15.12.2011, 17:29 | #5 (permalink) |
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. второй пункт не работает.задание найти сумму элементов ,расположенных между первым и вторым положительными элементами |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
15.12.2011, 20:50 | #6 (permalink) |
Специалист
Регистрация: 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. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|