Ошибка в том, что вы начинаете обход массива для вычисления ямы, после каждого ввода нового элемента. В том числе после ввода первого, когда a[i — 1]) или a[i + 1] просто не могут существовать. Если уберете внешний цикл ввода данных и подставите в код тестовый массив a = [4, 9, 2, 17, 3, 8] и N = 6, ваш код отработает верно.
А вообще, это не питоник-стиль. Если например так:
min([mid for left, mid, right in zip(a, a[1:], a[2:]) if left > mid < right])
Это архив, который содержит саму практическую работу, дополнительное задание № 4 (для сильных классов) и верное решение всех программ.
Просмотр содержимого документа
«ПР ОШИБКИ»
Практическая работа:
«Поиск и исправление ошибок в программах. Одномерные массивы»
|
№ 1 Дан линейный массив размерности п действительных чисел. Подсчитать сколько в нём отрицательных, положительных и нулевых элементов. |
program line 1; useс crt; const n1=100; var a:array[1..n] of real; i, n,kpol, kotr, kzero: integer; begin writeln (‘введите размерность вашего массива’); readln(n); randoize; textColor(4); for i:= to n do begin a[i]:=randon(100)-50; if (a[i]or (a[i]30) a[i]:=0; write(a[i],’ ‘); end; writeln; textColor(2); kpol:=0; kotr:=0; kzero:=0; for i:=1 to n do if a[i]000 then kpol:=kpol+1 else if a[i]then kotr:=kotr+1 else kzero:=kzero+1; writeln textColor(3); writeln(‘количество положительных элементов =’, kol); textColor(4); writeln(‘количество отрицательных элементов =’, kotr); textColor(5); writeln(‘количество нулевых элементов =’, kzero); end |
|
№ 2 Дан линейный массив размерности 20 действительных чисел. Выдать на экране новый массив, сформированный из положительных элементов первоначального массива. |
program masiv1; uses crt; var i;integer; m:array [0..100] of real; begin randomize; textColor(4); writeln (‘ваш массив)‘; textColor(3); for i:=1 to 20 begin; m[i]:=random(20)-10; write([i],’ )‘; end; writelne; textColor(5); writeln (‘ваш новый массив‘); textColor(10); for i:=1 to do begin if m[i]0 write (m[i],’ ‘); end. |
|
№ 3 Дана последовательность п чисел. Указать наименьшую длину числовой оси, содержащую все эти числа. |
program masiv_dlina; uses crt; var i,n:real; m:array [0..100] of real; dlina, min, max:real; begin writeln (‘введите размерность вашего массива’) readln(n); randomize; textColor(1); writeln(‘ваш массив‘); for i:=1 n do m[i]:=random(100)-50; write(m[i]:6:1,’ ‘); end; writeln; min:=m[1]; max:=m[1]; for i:=1 to n do; if m[i]max then max:=m[i] else if m[i]then min:=m[i]; dlina:=abs(min-max) writeln; textColor(5); writeln(‘наименьший элемент =’,min); writeln(‘наибольший элемент =’,max); writeln; textColor(3); writeln(‘длина отрезка =’,dlina); |
Просмотр содержимого документа
«ПР Поиск ошибок ОДНОМЕРНЫЕ массивы»
Практическая работа:
«Поиск и исправление ошибок в программах. Одномерные массивы»
|
№ 1 Дан линейный массив размерности п действительных чисел. Подсчитать сколько в нём отрицательных, положительных и нулевых элементов. |
program line1; uses crt; const n1=100; var a:array[1..n1] of real; i, n,kpol, kotr, kzero: integer; begin writeln (‘введите размерность вашего массива’); readln(n); randomize; textColor(4); for i:=1 to n do begin a[i]:=random(100)-50; if (a[i]or (a[i]30) then a[i]:=0; write(a[i],’ ‘); end; writeln; textColor(2); kpol:=0; kotr:=0; kzero:=0; for i:=1 to n do if a[i]0 then kpol:=kpol+1 else if a[i]then kotr:=kotr+1 else kzero:=kzero+1; writeln; textColor(3); writeln(‘количество положительных элементов =’, kpol); textColor(4); writeln(‘количество отрицательных элементов =’, kotr); textColor(5); writeln(‘количество нулевых элементов =’, kzero); end. |
|
№ 2 Дан линейный массив размерности 20 действительных чисел. Выдать на экране новый массив, сформированный из положительных элементов первоначального массива. |
program masiv1; uses crt; var i:integer; m:array [0..100] of real; begin randomize; textColor(4); writeln (‘ваш массив‘); textColor(3); for i:=1 to 20 do begin m[i]:=random(20)-10; write(m[i],’ ‘); end; writeln; textColor(5); writeln (‘ваш новый массив‘); textColor(10); for i:=1 to 20 do begin if m[i]0 then write (m[i],’ ‘); end; end. |
|
№ 3 Дана последовательность п чисел. Указать наименьшую длину числовой оси, содержащую все эти числа. |
program masiv_dlina; uses crt; var i,n:integer; m:array [0..100] of real; dlina, min, max:real; begin writeln (‘введите размерность вашего массива‘); readln(n); randomize; textColor(1); writeln(‘ваш массив‘); for i:=1 to n do begin m[i]:=random(100)-50; write(m[i]:6:1,’ ‘); end; writeln; min:=m[1]; max:=m[1]; for i:=1 to n do if m[i]max then max:=m[i] else if m[i]then min:=m[i]; dlina:=abs(min-max); writeln; textColor(5); writeln(‘наименьший элемент =’,min); writeln(‘наибольший элемент =’,max); writeln; textColor(3); writeln(‘длина отрезка =’,dlina); end. |
№ 4 (записать на доске) Замена всех элементов массива, больших заданного числа к.
program masiv_dlina;
uses crt;
var i,k:integer;
m:array [0..100] of integer;
begin
writeln(‘введите число для необходимой замены’);
readln(k);
randomize;
textColor(1);
writeln(‘ваш массив‘);
for i:=1 to 6 do
begin
m[i]:=random(100)-50;
write(m[i],’ ‘);
end;
writeln;
textColor(5);
writeln(‘все элементы большие ‘,k,’ будут заменены на ‘,k);
writeln;
textColor(2);
writeln(‘ваш новый массив‘);
for i:=1 to 6 do
begin
if m[i]k then m[i]:=k;
write(m[i],’ ‘);
end;
end.
Просмотр содержимого документа
«задание 4 НА ЭКРАНЕ»
№ 4 (записать на доске) Замена всех элементов массива, больших заданного числа к.
program masiv dlina;
uses crt
vare i, k integer:
m: array [0..100] of integer;
begin;
writein(‘введите число для необходимой замены’)
readln(k);
randovize;
textColor (1);
writeln (‘ваш массив‘);
for i:=1 6 do
begin
m[i]=random(100)-50;
write (m[i] ‘ ‘);
end
writeln;
textColor(5);
writeln(‘все элементы большие ‘,k,’ будут заменены на ‘, k);
writeln;
textColor(2);
writel (‘ваш новый массив‘);
for i:=1 to 6
begin
if m[i]k then m[i]:=k
write(m[i],’ ‘);
end.
indahazzard, Ваши ошибки:
— Код трудночитаем, поскольку неформатирован. Один чёрт мне сказал, что он в нём ногу сломил. Примерно так надо было писать:
Отформатированный код
| Delphi | ||
|
— Вы не написали, что должна делать Ваша программа.
— Ну и, ещё есть ошибка в Вашей программе: Вы в процедуру массив «a» передаёте по значению, а не по ссылке. Естественно, в вызывающей программе значения элементов массива «a» никак не изменяются. Исправьте:
| Delphi | ||
|
Добавлено через 35 минут
Да, и ещё.
Ввод матрицы вслепую — сиё индусство есть.
Печать сообщения «Matrica A» из процедуры нелогично как-то у Вас сделано.
И лишние переменные кое-где…
Да, а ещё Вы неверно используете low и high. Была бы матрица 5х3, был бы вылет за границы индексов. А если бы 3х5, например, два столбца бы во внимание не принимались.
Вот, привёл в божеский вид и подрихтовал кувалдой. В логику работы программы вникать лень, посмотрите, правильно ли:
| Delphi | ||
|
0
В массивах х[10] и y[13] перемножить положительные элементы, а отрицательные увеличить на 2. После преобразований вычислить число элементов, идущих после второго отрицательного элемента массива.
Вывести на экран для каждого массива: элементы массива в строку(кол-во элементов в строке на экране выбрать самостоятельно) до и после преобразований, найденное число элементов.
Формулы представлены в коде, так что смысла их переписывать не вижу, помогите пожалуйста найти ошибку
#include <stdio.h>
#include <math.h>
#include <malloc.h>
int main(){
int *x; //указатель на массив
int *y;
x=(int*)malloc(10*sizeof(int));// рассчитываем размер массива и выделяем память
y=(int*)malloc(13*sizeof(int));
float umX=0.0;
float umY=0.0;
int NegNumXCounter = 0;
int NegNumYCounter = 0;
int j,i,sumX,sumY,NegNumLimit=2;
for (j=0;j<10;j++){
x[j]=cos(tan(j)*(j))+(1.0/4);
printf("n Massiv X do preobrazovaniya %d ",x[j]); // выводим массив до преобразования
if(x[j>=0]){
umX *= x[j]; // перемножаем положительные элементы
}
else
x[j]=x[j]+2; // увеличиваем отрицательные элементы на 2
if(NegNumXCounter>=NegNumLimit){
sumX+=x[j];
}
if(x[j]<0.0){
NegNumXCounter++;
}
printf("n Massiv X posle preobrazovaniya %d ",x[j]);
free(x);
}
for (i=0; i<13; i++){
y[i]=(i % 2 ? -1 : 1)* sin(fabs(j-(sqrt(fabs(j)))))(j-j/(j*j+3.6)); //формула выч-ия y
printf("n Massiv Y do preobrazovaniya %d ",x[i]);
if(y[i>=0]){
umY *= y[i];
}
else
y[i]=y[i]+2;
if (NegNumYCounter>=NegNumLimit){
sumY+=y[i];
}
if(y[i]<0.0){
NegNumYCounter++;
printf("n Massiv Y posle preobrazovaniya %d ",y[i]); //выводим массив после преобразования
free(y);
}
printf("kol-vo otr elementov posle 2 otrn", sumY, sumX); //выводим кол-во элементов
}
getchar(); getchar();
return 0;
}

Ошибки при работе с массивами
При работе с массивами наиболее распространенной ошибкой является обращение к несуществующему элементу. Причиной этой ошибки является выход значения индексного выражения за допустимые границы.
В качестве примера рассмотрим программу, приведенную в листинге 6.11. Синтаксических ошибок в ней нет. Однако программа работает неправильно (рис. 6.14). Причина этого в том, что в качестве границы цикла For по j указана константа 5. Поэтому, когда значение переменной j становится равным 5, в условии инструкции If сравнивается пятый и несуществующий шестой элементы массива. Чтобы устранить эту ошибку, в качестве верхней границы изменения индекса надо указать 4.
Рис. 6.14. Сортировка массива (программа работает неправильно)

Листинг 6.11. Сортировка массива методом «пузырька» (программа с ошибкой)
‘Сортировка массива методом «пузырька».
‘В программе есть ошибка!!!
‘Программа работает неправильно!!!
TextWindow.WriteLine(«Сортировка массива методом Пузырька»)
TextWindow.WriteLine(«Введите элементы массива»)
‘ Ввод массива
For i = 1 To 5 TextWindow.Write(«a[» + i +»]->») a[i] = TextWindow.ReadNumber()
EndFor
‘ Исходный массив
TextWindow.Write(«Исходный массив: «)
For i=1 To 4
TextWindow.Write(a[i] +», «)
EndFor
TextWindow.WriteLine(a[5])
TextWindow.WriteLine(«Сортировка…»)
‘ Количество циклов обмена на 1 меньше размера массива
For i = 1 To 5
For j = 1 To 5 ‘ ЗДЕСЬ ОШИБКА! Должно быть 4
If a[j] > a[j + 1] Then
‘ Обменять местами a[j] и a[j+1] buf = a[j]
a[j] = a[j + 1] a[j + 1] = buf
EndIf
EndFor
‘Здесь цикл обменов завершен
‘Отладочная «печать» — массив после цикла сортировки
For k=1 To 4 TextWindow.Write(a[k] +», «)
EndFor
TextWindow.WriteLine(a[5])
EndFor
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #

