Массивы найти ошибку в программе

Ошибка в том, что вы начинаете обход массива для вычисления ямы, после каждого ввода нового элемента. В том числе после ввода первого, когда 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
uses SysUtils;
 
const N=3 ;
 
type mas=array [1..3,1..3] of Integer;
 
procedure zapol(var a:mas);
var i,j,N: Integer;
begin
  writeln('Vvedite elementy matricy A');
  for i:= Low(a)to High(a) do
    for j:= Low(a) to High(a) do
      Readln(a[i,j]);
  writeln('Matrica A');
end;
 
var a,b: mas;
i,j,p,q: Integer;
begin
  zapol(a);
  for i:=1 to n do
    begin
      for j:=1 to n do write(a[i,j]:4);
      writeln
    end;
  for i:=1 to n do
    for j:=1 to n do
      begin
        b[i,j]:=0;
        for p:=1 to i do
          for q:=j to n do
            b[i,j]:=b[i,j]+a[p,q];
      end;
  writeln('Matrica B');
  for i:=1 to n do
    begin
      for j:=1 to n do write(b[i,j]:4);
      writeln
    end;
  readln
end.

— Вы не написали, что должна делать Ваша программа.

— Ну и, ещё есть ошибка в Вашей программе: Вы в процедуру массив «a» передаёте по значению, а не по ссылке. Естественно, в вызывающей программе значения элементов массива «a» никак не изменяются. Исправьте:

Delphi
4
procedure zapol(var a:mas);

Добавлено через 35 минут
Да, и ещё.

Ввод матрицы вслепую — сиё индусство есть.

Печать сообщения «Matrica A» из процедуры нелогично как-то у Вас сделано.

И лишние переменные кое-где…

Да, а ещё Вы неверно используете low и high. Была бы матрица 5х3, был бы вылет за границы индексов. А если бы 3х5, например, два столбца бы во внимание не принимались.

Вот, привёл в божеский вид и подрихтовал кувалдой. В логику работы программы вникать лень, посмотрите, правильно ли:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
uses SysUtils;
 
const n = 3;
 
type mas = array [1..n, 1..n] of Integer;
 
procedure zapol(var x: mas; s: string);
var i, j: Integer;
begin
  writeln('Vvedite elementy matricy ', s);
  for i := low(x) to high(x) do
    for j := low(x[i]) to high(x[i]) do
      begin
        write(s, '[', i, ', ', j, '] = ');
        readln(x[i, j])
      end
end;
 
procedure pechat(var x: mas; s: string);
var i, j: Integer;
begin
  writeln('Matrica ', s);
  for i := low(x) to high(x) do
    begin
      for j := low(x[i]) to high(x[i]) do write(x[i, j]:4);
      writeln
    end
end;
 
var a, b: mas;
    i, j, p, q: Integer;
begin
  zapol(a, 'A');
  pechat(a, 'A');
  for i := 1 to n do
    for j := 1 to n do
      begin
        b[i, j] := 0;
        for p := 1 to i do
          for q := j to n do
            b[i, j] := b[i, j] + a[p, q]
      end;
  pechat(b, 'B');
  readln
end.



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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Возможно, вам также будет интересно:

  • Массажная кровать нуга бест коды ошибок
  • Массажная кровать migun hy 7000e ошибка е1
  • Марки с ошибками в цвете
  • Маркетинговое исследование как не допустить ошибок
  • Маркет ошибка 920 в плей маркете

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии