В следующих задачах некоторый программист написал код
и, возможно, допустил в нем ошибки. Вы должны проверить,
делает ли код то, что описано. Если код
работает некорректно, вы должны исправить ошибки.
Код должен вывести последний элемент массива:
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 Метки нет (Все метки)
Кмпилятор пишет
0 |
5 / 3 / 2 Регистрация: 25.11.2011 Сообщений: 78 |
|
13.12.2011, 19:48 |
2 |
#include <iostream> Сперва убери те библиотеки, которые не используешь
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 |
если найдешь ошибку напиши сюда У тебя code blocks? на коде блоксе ошибки нет
0 |
ilyashis 2 / 0 / 0 Регистрация: 08.12.2011 Сообщений: 137 |
||||
13.12.2011, 20:01 [ТС] |
7 |
|||
всёёёёёёёё решил
0 |
romster 5 / 3 / 2 Регистрация: 25.11.2011 Сообщений: 78 |
||||
13.12.2011, 20:02 |
8 |
|||
cin.get(); Тоже можешь убрать, ни к чему они тут
0 |
ilyashis 2 / 0 / 0 Регистрация: 08.12.2011 Сообщений: 137 |
||||
13.12.2011, 20:09 [ТС] |
9 |
|||
нее они нужны смотри я написал его на паскале но он выдает ошибку
Добавлено через 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
находится на стадии предложения, но, на мой взгляд, этот способ понятнее и проще в использовании, чем тернарные условия, особенно когда есть несколько вложенных условий.
Спасибо за внимание!
Найдите ошибку: Функциональное Карри
Источник