Найти ошибку в коде массива

В следующих задачах некоторый программист написал код
и, возможно, допустил в нем ошибки. Вы должны проверить,
делает ли код то, что описано. Если код
работает некорректно, вы должны исправить ошибки.

Код должен вывести последний элемент массива:

let arr = [1, 2, 3, 4, 5];
console.log(arr[arr.length]);

Код должен найти сумму элементов массива:

let arr = [1, 2, 3, 4, 5];
console.log(arr[1] + arr[2] + arr[3] + arr[4] + arr[5]);

Код должен вывести длину массива:

let arr = {1, 2, 3, 4, 5};
console.log(arr.length]);

Код должен вывести длину массива:

let arr = [1, 2, 3, 4, 5];
console.log(arr.lenght);

Доброй ночи, господа. Суть такова, программа должна отсортировать массив М[50] и каждую строку матрицы А[6][7] в порядке убывания, причем и массив и матрица должны быть с динамическим выделением памяти. По итогу в функциях сортировки change1 и change2 у меня получилось все очень печально и ничего не работает, и до меня не может дойти в чем дело.

Пример того, как программа должна работать:
К примеру, массив M[5] — 2 8 3 7 1 должен отсортироваться так, чтобы получился такой результат — M[5] — 8 7 3 2 1
, а матрица A[2][4] —

5 5 7 7
1 10 8 3

должна стать такой A[2][4] —

7 7 5 5
10 8 3 1

Суть ошибки заключается в том, что вместо измененных массивов программа просто напросто ничего не выводит.

Update: Вообщем, все настолько плохо, что оказывается я забыл вызвать функцию вывода после изменения массива, но получаемый результат все равно неверный

Прикладываю полный код программы:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 50
#define M 6
#define Q 7

int input(int* a, int n)
{
  int i;
  for (i = 0; i < n; ++i)
  {
    *(a + i) = rand() % 30 - 15;
  }
}


int change1(int* a, int n, int b)
{
  int i, j, t;
  for(i = 0; i < n - 1; i++)
  {
    for(j = 0; j < n - 1; j++)
    {
      if(*(a + i*b + j) < *(a++))
      {
        t = *(a++);
        *(a++) = *(a + i*b + j);
        *(a + i*b + j) = t;
      }
    }
  }
}

int change2(int* a, int n, int b)
{
  int i, j, t;
  for(i = 0; i < n; i++)
  {
    for(j = 0; j < b; j++)
    {
      if(*(a + i*b + j) < *(a++))
      {
        t = *(a++);
        *(a++) = *(a + i*b + j);
        *(a + i*b + j) = t;
      }
    }
  }
}


int output(int* a, int n, int m)
{
  int i, j;
  for (i = 0; i < n; i++)
  {
    for (j = 0; j < m; j++)
    {
      printf("%5d", *(a + i*m + j));
    }
    printf("n");
  }
}

int main()
{
  srand(time(NULL));
  int *m, *a, g;
  m = malloc(4*N);
  a = malloc(4*M*Q);
  input(a,M*Q);
  input(m,N);
  printf("Massiv A: n");
  output(a,M,Q);
  printf("Massiv M: n");
  output(m,1,N);
  printf("Izmenenniy massiv M: n");
  change1(m,1,N);
  printf("Izmeneniy massiv A: n");
  change2(a,M,Q);
  free(a);
  free(m);
}

Помогите, пожалуйста, разобраться где я и что не так накодил.

To find an error in the code you just need…

$$$text{ }$$$

Firsly, you can check overflow of integer types, mistakes like = instead ==, writing a long long value in int and something else. It can be done in compile time with enabling of all available warnings. You can check your code fast there. Link have examples and you can read them. Warnings is not an errors, but sometimes can be.

Description of warnings can be found there.

Secondly, you can test your solution in custom invocation. You should go to Custom invocation, place your code and test on samples and custom testswith compiler Clang++17 Diagnostics. It is a magic, just try a few examples:

Integer overflow in multiplication

Integer overflow in left shift

Out of bounds vector or array

Next steps: with GNU G++ compiler use a debug version of stardard library with next macroses:

#define _GLIBCXX_DEBUG 1
#define _GLIBCXX_DEBUG_PEDANTIC 1
#define _FORTIFY_SOURCE 2

You should to run a few tests for your code to catch mistakes in runtime. Examples:

Attempt to dereference a singular iterator

Merge two partially sorted arrays

Unexpected reallocation of memory in vector

If you are solving a problem, try to test it by yourself on your small testcases, or brute all testcases and compare results of fast algorithm with results of naive but correct algorithm.

Also, you can use assert(condition); for check invariants or conditions. Even if you think that it will be always correct, because in practice small mistake in logic will leads to assertion failures. If the condition is false, you will see verdict «Runtime error» for you submission.

First example of using assert

Second example of using assert

Next, you can use a method called Method of intent look: when you try to detect what is wrong by reading you code. You should write a easy readable code for it.

Also, you can try to output some variables that u use in program. These macroses will help efficiently output a debug information in console, for example, variables with their names, containers like std::vector<X> and std::set<X>, pairs like std::pair<X,Y>. You can extend their functionality, or now you know that it is possible and can search for a better macroses or creater it by yourself.

I recommend to read this blog about catching silly mistakes in GCC C++.

ilyashis

2 / 0 / 0

Регистрация: 08.12.2011

Сообщений: 137

1

Найти ошибку в кода. Задача на массив.

13.12.2011, 19:44. Показов 1576. Ответов 8

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

C++
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
#include <iostream>
#include <conio.h>
#include <fstream>
#include <string.h>
#include <iomanip>
#include <stdlib.h>
 
#include <stdio.h>
#include <math.h>
using namespace std;
 
int main()
{
   int a[100][100],n,x;
        cout<<"N=";
        cin>>n;
        x=n;
                for (int i=0;i<n;i++)
                {
                     for (int j=0;j<n;j++)
                          if (x>n)
                                a[i][j]=0;
                          else
                          {
                                a[i][j]=x;
                                x++;
                          }
                x=n-i-1;
                }
        for (int i=0;i<n;i++)
        {
                for (int j=0;j<n;j++)
                        cout<<a[i][j]<<" ";
            cout<<"n";
        };
        cin.get();
}

Кмпилятор пишет

C++
1
2
3
4
1>------ Построение начато: проект: zachet_6, Конфигурация: Debug Win32 ------
1>MSVCRTD.lib(crtexew.obj) : error LNK2019: ссылка на неразрешенный внешний символ _WinMain@16 в функции ___tmainCRTStartup
1>D:с++zachetzachet_6Debugzachet_6.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========



0



5 / 3 / 2

Регистрация: 25.11.2011

Сообщений: 78

13.12.2011, 19:48

2

Цитата
Сообщение от ilyashis
Посмотреть сообщение

#include <iostream>
#include <conio.h>
#include <fstream>
#include <string.h>
#include <iomanip>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

Сперва убери те библиотеки, которые не используешь



0



2 / 0 / 0

Регистрация: 08.12.2011

Сообщений: 137

13.12.2011, 19:50

 [ТС]

3

roomster
у нас одинаковые задачи



0



5 / 3 / 2

Регистрация: 25.11.2011

Сообщений: 78

13.12.2011, 19:53

4

Я понял



0



2 / 0 / 0

Регистрация: 08.12.2011

Сообщений: 137

13.12.2011, 19:53

 [ТС]

5

если найдешь ошибку напиши сюда



0



5 / 3 / 2

Регистрация: 25.11.2011

Сообщений: 78

13.12.2011, 19:56

6

Цитата
Сообщение от ilyashis
Посмотреть сообщение

если найдешь ошибку напиши сюда

У тебя code blocks? на коде блоксе ошибки нет
#include <iomanip>
#include <fstream>
#include <math.h>
Убрать попробуй

#include <string.h> тоже убери



0



ilyashis

2 / 0 / 0

Регистрация: 08.12.2011

Сообщений: 137

13.12.2011, 20:01

 [ТС]

7

всёёёёёёёё решил
вот

C++
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
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
 
int main()
{
   int a[100][100],n,x;
        cout<<"N=";
        cin>>n;
        x=n;
                for (int i=0;i<n;i++)
                {
                     for (int j=0;j<n;j++)
                          if (x>n)
                                a[i][j]=0;
                          else
                          {
                                a[i][j]=x;
                                x++;
                          }
                x=n-i-1;
                }
        for (int i=0;i<n;i++)
        {
                for (int j=0;j<n;j++)
                        cout<<a[i][j]<<" ";
            cout<<"n";
        };
        cin.get();
        cin.get();
}



0



romster

5 / 3 / 2

Регистрация: 25.11.2011

Сообщений: 78

13.12.2011, 20:02

8

Цитата
Сообщение от ilyashis
Посмотреть сообщение

cin.get();
cin.get();

Тоже можешь убрать, ни к чему они тут

C++
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
#include <iostream>
 #include <conio.h>
 using namespace std;
 
 int main()
 {
 int a[100][100],n,x;
 cout<<"N=";
 cin>>n;
 x=n;
 for (int i=0;i<n;i++)
 {
 for (int j=0;j<n;j++)
 if (x>n)
 a[i][j]=0;
 else
 {
 a[i][j]=x;
 x++;
 }
 x=n-i-1;
 }
 for (int i=0;i<n;i++)
 {
 for (int j=0;j<n;j++)
 cout<<a[i][j]<<" ";
 cout<<"n";
 }
 }



0



ilyashis

2 / 0 / 0

Регистрация: 08.12.2011

Сообщений: 137

13.12.2011, 20:09

 [ТС]

9

нее они нужны
если их не писать прога зразу закрывается

смотри я написал его на паскале но он выдает ошибку

Pascal
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
var
  a:array of array of Integer;
  n,x,i,j:integer;
begin
   Write('N='); Readln(n);
   SetLength(a,n,n);
   x:=n;
 
   for i:=0 to n-1 do
    begin
      for j:=0 to n do
        begin
          if (x>n) then a[i,j]:=0
          else
           begin
            a[i,j]:=x;
            x:=x+1;
           end;
        end;
      x:=n-i-1;
    end;
   for i:=0 to n-1 do
   begin
     for j:=0 to n-1 do
     begin
       write(a[i,j],' ');
     end;
   Writeln;
   end;
Readln;
end.

Добавлено через 39 секунд
говорит ожидался идентификатор [



0



В этой части «Найди ошибку» компонент ToDoList, принимает массив элементов и отображает их в виде списка. Однако в коде есть небольшая ошибка:

import React from "react";

const ToDoList = ({ items }) => {
  return (
    <div>
      <ul>
        {items.length && items.map(item => <li key={item.id}>{item.text}</li>)}
      </ul>
    </div>
  );
};

const App = () => {
  return (
    <div>
      <h2>Сегодня:</h2>
      <ToDoList
        items={[
          { id: 1, text: "Полить цветы" },
          { id: 2, text: "Помыть машину" },
          { id: 3, text: "Выкинуть мусор" },
        ]}
      />
      <h2>Завтра:</h2>
      <ToDoList items={[]} />
    </div>
  );
};

export default App;

Решение

Если вы запустите код, вы заметите, что список дел на завтра отображает 0.

Это связано с тем, как JavaScript обрабатывает оператор &&. В React && обычно используется для условного рендеринга, если левая часть оператора && является ложной, тогда оператор && останавливает дальнейшее вычисление выражения.

true && "hello world" // "hello world" will be rendered
false && "hello world" // nothing will be rendered

Это работает, потому что React ничего не отобразит для логического значения false. Однако проблема с компонентом ToDoList заключается в том, что мы проверяем items.length, который возвращает 0, если элементов нет, что React отобразит как допустимый фрагмент JSX.

Как это исправить?

Самое простое решение — всегда использовать тернарный оператор при условном рендеринге в React:

import React from "react";

const ToDoList = ({ items }) => {
  return (
    <div>
      <ul>
        {items.length
          ? items.map((item) => <li key={item.id}>{item.text}</li>)
          : null}
      </ul>
    </div>
  );
};

const Apps = () => {
  return (
    <div>
      <h2>Today:</h2>
      <ToDoList
        items={[
          { id: 1, text: "Полить цветы" },
          { id: 2, text: "Помыть машину" },
          { id: 3, text: "Вынести мусор" }
        ]}
      />
      <h2>Tomorrow:</h2>
      <ToDoList items={[]} />
    </div>
  );
};

export default App;

Таким образом, вы явно указываете React, что отображать, если левая часть тернарной операции ложна — в этом случае, если элементов нет, мы хотим отобразить null. Как и ожидалось, для завтрашнего списка дел ничего не отображается.

Это хороший шаблон, поскольку он заставляет вас более думать о ложных случаях в вашем коде. Например, в этом случае было бы неплохо отобразить некоторый текст, сообщающий пользователю, что список дел пуст.

***

В будущем следует обратить внимание на то, что может помочь с условным рендерингом, это выражение do, которое позволят нам делать что-то вроде этого:

return (
  <nav>
    <Home />
    {
      do {
        if (loggedIn) {
          <LogoutButton />
        } else {
          <LoginButton />
        }
      }
    }
  </nav>
)

В настоящее время do находится на стадии предложения, но, на мой взгляд, этот способ понятнее и проще в использовании, чем тернарные условия, особенно когда есть несколько вложенных условий.

Спасибо за внимание!

Найдите ошибку: Функциональное Карри

Источник

Понравилась статья? Поделить с друзьями:
  • Найти ошибку в образовании формы слова с шестьюстами страницами
  • Найти ошибку в коде джава онлайн
  • Найти ошибку в образовании формы слова с тремястами новобранцами
  • Найти ошибку в коде python онлайн
  • Найти ошибку в образовании формы слова пятисот квартир