Задача найти ошибку в коде

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

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

12 255

17 ноября 2016 в 16:45

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

Вот сам код:

unsigned int i;
for (i = 100; i >= 0; --i)
	printf("%dn", i);

В этом коде есть две небольшие ошибки, которые вам стоит найти.

Ошибки

Первым делом, стоит обратить внимания на неправильное определения переменной i. Дело в том, что в данном случае оно является неверным. Тип unsigned int говорит о том, что значения этой переменной могут быть только цифры, при чем только положительные цифры без знака минус. Данная запись приводит к тому, что цикл будет выполняться вечно, так как условие всегда будет истинным (true). 

Корректный код состоял бы из такого условия i > 0. Он мог бы вывести все значения, кроме нуля. Цикл завершился бы и тогда мы могли бы после самого цикла прописать еще и вывод 0. К примеру, у нас бы получилось нечто вроде этого:

unsigned int i;
for (i = 100; i > 0; --i)
	printf("%dn", i);
printf("%dn", i);

Вторая ошибка намного проще и заключается в том, что мы используем %d вместо того чтобы использовать %u. Поскольку мы выводим числа без минуса, то именно так должно все быть. В итоге у нас получился вот такой код, который верно выводит значения от 100 до 1:

unsigned int i;
for (i = 100; i > 0; --i)
	printf("%un", i);

Больше интересных новостей

В этой части «Найди ошибку» компонент 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 находится на стадии предложения, но, на мой взгляд, этот способ понятнее и проще в использовании, чем тернарные условия, особенно когда есть несколько вложенных условий.

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

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

Источник

Время на прочтение
2 мин

Количество просмотров 8.6K

Игра PVS-Studio: найди ошибку в C++ коде
Авторы анализатора PVS-Studio предлагают вам проверить свою внимательность и развлечься. Попробуйте быстро отыскать баг в фрагменте исходного кода и ткнуть в него мышкой.

Анализаторы кода работают без устали и умеют находить множество ошибок, которые сложно заметить. Мы отобрали несколько фрагментов кода, в которых выявили ошибки с помощью PVS-Studio. Все фрагменты взяты из известных Open Source проектов.

Предлагаем вам посоревноваться с анализатором в прозорливости и попробовать самостоятельно найти ошибки. Вам будет предложено 10 случайно выбранных заданий. За верный ответ начисляется одно очко, если баг найден в течение 1 минуты.

Ограничение в 1 минуту сделано для интереса. Иначе вы, скорее всего, верно найдёте и укажете каждую ошибку, так как фрагменты кода короткие. В любом случае относитесь к этому просто как к игре, а не как к настоящему тестированию программистских навыков у вас или ваших коллег :)

Когда нашли ошибку, выделите её кликом мышки и нажмите кнопку «Ответ». Бывает, что в коде есть сразу несколько мест, куда вы можете «ткнуть» — и ответ зачтётся как правильный. Поясним это на примере.

case FuriHalSubGhzPreset2FSKDev476Async:
  preset_name = "FuriHalSubGhzPreset2FSKDev476Async";
  break;
  FURI_LOG_E(SUBGHZ_PARSER_TAG, "Unknown preset");
default:

Этот код взят из проекта FlipperZero. Анализатор PVS-Studio сообщает, что часть кода никогда не выполняется: V779 [CWE-561, CERT-MSC12-C] Unreachable code detected. It is possible that an error is present. subghz_i.c 44

Кто-то поспешил и использовал макрос логирования после оператора break. Или это следствие неудачного рефакторинга. В любом случае ошибка очевидна, но вот куда именно ткнуть мышкой – вопрос сложнее.

С одной стороны, в качестве ответа можно выбрать оператор break. Он расположен до макроса FURI_LOG_E и прерывает выполнение оператора switch. Значит, проблема здесь.

С другой стороны, можно выбрать макрос логирования. Ведь это недостижимый код.

Так как же быть? Очень просто. В данном случае правильным ответом будет считаться как выделенный оператор break, так и макрос FURI_LOG_E.

Думаем, правила понятны. Желаем вам удачи: начать игру.

Не забудьте, показать этот Quiz вашим коллегам! Развлекайтесь, и безбажного вам кода!

Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Andrey Karpov. PVS-Studio’s challenge: can you spot an error?.

2atlantis

0 / 0 / 0

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

Сообщений: 67

1

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

20.01.2020, 04:28. Показов 2124. Ответов 10

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


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

Бьюсь над задачей
1. А—начальная стоимость оборудования. В первый год эксплуатации стоимость оборудования снижается на В руб., а в каждый следующий год снижение стоимости уменьшается на р % (относительно предыдущего года). Определить, через сколько лет стоимость оборудования станет меньше А/2. Рассматривать срок не более N лет

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
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <locale>
using namespace std;
 
void main()
{
    setlocale(LC_ALL, "ru");
 
    int N, i;   
    float A, B, p, AB, pA, procent;
    i = 1;
    cout << "Введите начальную стоимость оборудования" << endl;
    cin >> A;
    cout << "Введите максимальный срок лет " << endl;
    cin >> N;
    cout << "Введите на сколько снижется стоимость в первый год " << endl;
        cin >> B;
        cout << "Введите на сколько будет уменьшаться снижение стоимости в последующие года в % " << endl;
        cin >> procent;
        p = B * procent / 100;
        AB = A - B;
        pA = AB - (B - p);
        cout << "Cтоимость оборудования " << A << endl 
            << "Максимальный срок лет " << N << endl
            << "Снижение стоимости в первый год " << B << endl 
            << "Уменьшение снижения стомости " <<p << "%" << endl 
            << "Стоимость оборудования после снижения в первый год " << AB << endl 
            << "Стоимость оборудования после первого года с учетом снижения уменьшения стоимости "<< pA << endl;
 
        while (i <= N && pA < (A / 2));
        {
            cout << " через " << i << "лет" << endl;
 
            if (i <= N && pA > (A / 2))
            {
                AB = A - B;
                pA = AB - (B - p);
                i++;
            }
            else
            {
                cout << "Превышен срок" << endl;
            }
        }
    system("pause");
 
}

Вот намудрил такой код к ней,но цикл почему то не работает,не считает как надо,пишет что нужное кол-во лет 1, либо превышен срок.Где ошибка,как исправить???



0



Programming

Эксперт

94731 / 64177 / 26122

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

Сообщений: 116,782

20.01.2020, 04:28

Ответы с готовыми решениями:

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

Найдите ошибку в коде
#include &lt;bits/stdc++.h&gt;
using namespace std;
int n,m,c=0;
bool pos ={false};
vector &lt;vector…

Найдите ошибку в коде с++
Есть задача: Найти наиболее близкий к среднему арифметическому элемент среди всех элементов матрицы…

Найдите ошибку в коде
#include &lt;iostream&gt;
#include &lt;math.h&gt;

using namespace std;

void main()
{
int M,i;…

10

Holiday13

Заблокирован

20.01.2020, 04:45

2

Лучший ответ Сообщение было отмечено 2atlantis как решение

Решение

C++
1
2
3
4
5
6
7
for(pA=A,i=1; i<=N && pA>=A/2; i++)
{
 cout << " через " << i << "летn";
 if(i==1) pA-=B;
 else pA*=(100.0-p)/100;
}
if(i>N) cout << "Превышен срокn";



0



2atlantis

0 / 0 / 0

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

Сообщений: 67

20.01.2020, 04:52

 [ТС]

3

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

C++
1
2
3
4
5
6
7
for(pA=A,i=1; i<=N && pA>=A/2; i++)
{
 cout << " через " << i << "летn";
 if(i==1) pA-=B;
 else pA*=(100.0-p)/100;
}
if(i>N) cout << "Превышен срокn";

Вроде что-то поменялось но он теперь пишет все года по порядку
Типа
Через 1 лет
Через 2 лет
Через 3 лет
Через 4 лет
Через 5 лет



0



Holiday13

Заблокирован

20.01.2020, 04:55

4

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

while (i <= N && pA < (A / 2));

и раньше так было-бы



0



2atlantis

0 / 0 / 0

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

Сообщений: 67

20.01.2020, 04:58

 [ТС]

5

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

и раньше так было-бы

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
38
39
40
#include <iostream>
#include <locale>
using namespace std;
 
void main()
{
    setlocale(LC_ALL, "ru");
 
    int N, i, j;
    float A, B, p, AB, pA, procent;
    i = 1;
    j = 1;
    cout << "Введите начальную стоимость оборудования" << endl;
    cin >> A;
    cout << "Введите максимальный срок лет " << endl;
    cin >> N;
    cout << "Введите на сколько снижется стоимость в первый год " << endl;
        cin >> B;
        cout << "Введите на сколько будет уменьшаться снижение стоимости в последующие года в % " << endl;
        cin >> procent;
        p = B * procent / 100;
        AB = A - B;
        pA = AB - (B - p);
        cout << "Cтоимость оборудования " << A << endl 
            << "Максимальный срок лет " << N << endl
            << "Снижение стоимости в первый год " << B << endl 
            << "Уменьшение снижения стомости " <<p << "%" << endl 
            << "Стоимость оборудования после снижения в первый год " << AB << endl 
            << "Стоимость оборудования после первого года с учетом снижения уменьшения стоимости "<< pA << endl;
 
        for (pA = AB-(B-p), i = 1; i <= N && pA >= A / 2; i++)
        {
            if (i == 1) pA -= B;
            else pA *= (100.0 - p) / 100;
        }
        cout << " через " << i << "летn";
        if (i>N) cout << "Превышен срокn";
        system("pause");
 
}

Вроде исправил) Большое спасибо



0



Holiday13

Заблокирован

20.01.2020, 05:10

6

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

for (pA = AB-(B-p)

а по буквам рассказать?



0



0 / 0 / 0

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

Сообщений: 67

20.01.2020, 05:56

 [ТС]

7

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

а по буквам рассказать?

Не понимаю
Просто рА это снижение суммы А через 2 месяца в зависимости от того как уменьшилась снижение суммы
и получается рА !=А
То бишь в первый месяц эта сумма фиксированная допустим
А=1000
B=100
AB=900
а после 1 месяца каждый месяц число B уменьшается на p%
AB это A-B
И каждый раз эта сумма должна становится меньше так как переменная B уменьшается в зависимости от p
Вот и получается что pA(текущая стоимость)это AB-(B-p) в каждый раз цикла



0



Holiday13

Заблокирован

20.01.2020, 06:16

8

C++
1
2
3
4
for(pA=A, i=1; //начальная сумма
{
  if (i == 1) pA -= B;  //первый месяц учтен
  else pA *= (100.0 - p) / 100;//остальные месяцы



0



Holiday13

Заблокирован

21.01.2020, 13:39

9

OFF:дожили до компов где можно посчитать 264 зерен, осталось найти такую страну



0



Yetty

7427 / 5021 / 2891

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

Сообщений: 15,694

21.01.2020, 16:04

10

Лучший ответ Сообщение было отмечено 2atlantis как решение

Решение

Holiday13, если количество циклов заранее не известно, советовать менять цикл while на for не логично

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

цикл почему то не работает

уберите точку с запятой
while (i <= N && pA < (A / 2));

подправил:

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
#include <iostream>
using namespace std;
 
int main()
{ 
    int i=1, N;   
    double A, A1, B, p, k, eps=1e-9;    
    
    cout << "A="; cin >> A;
    cout << "B="; cin >> B;
    cout << "p="; cin >> p;
    cout << "N="; cin >> N;
    
    A1=A/2.-eps;
    k=1.-p/100.;
    
    while (i<=N && A>=A1)
    {           
        A+=-B;
        B*=k;
        // cout << i << " year: " << A << "n"; 
        i++;         
    }
    
    if (A<A1) cout << i-1 << " yearn";
    else cout << "will notn";    
        
system("pause");
return 0;
}



1



Holiday13

Заблокирован

21.01.2020, 22:27

11

Yetty, я использовал for



0



Что делает цикл for?

Он итерируется по объекту и присваивает значения элементов в переменную:

for i in 1, 2, 3, 4, 5:
    print(i)
print(i)

Выведет:

1
2
3
4
5
5

Вы, видимо, подумали, что значение i = 0, которые вы присвоили до цикла, останется и после него, но в вашем первом цикле вы изменяете значение i на индексы строки, потому после цикла значение i == len(a) - 1

Ок, исправляем, переносим i после цикла:

a = input()
col = 2
my_dict = {}

for i in range(len(a)):
    my_dict[a[i]] = 1

i = 0
while i < len(a):
    if a[i] * col in a:
        my_dict[a[i]] += 1
        col += 1
    elif col > 2:
        i += col
    else:
        col = 2
        i += 1

for i in sorted(my_dict.items()):
    print(i[0], i[1])

Проверяем приведённых значениях, вроде работает, а что если сделать не два, а три или более повторяющихся элементов .. не работает

Проверка того, что впереди есть такая последовательность

В строке a[i] * col in a вы пытаетесь понять, существует ли последовательность символов такой длинны впереди, а проверяете, существует ли такая последовательность во всей строке:
Есил ввести "ataaa", то вот, что произойдёт:
(мы уже инициализиировали dict и в нём уже лежит {"a": 1, "t": 1})

if a[i] * col in a:, проверяем

i == 0
a[i] == "a"
col == 2
a[i] * col == "aa"

следовательно "aa" in a == True, потому, что в a есть "aa", хоть не в начале.

Ок, давайте исправим, используем срезы:

if a[i: i+col] == a[i] * col:

a[i: i+col] — это срез с индекса i до i+col, не включая, пример:

если a == "abcdef", i == 3, col == 2, то с той нашей строкой у нас будет a[i: i+col] == "de"

Ок, заменяем: if a[i] * col in a: на if a[i: i+col] == a[i] * col:
(Проверяем, что все буквы в срезе — те, что нам нужны)

Смотрим, что если ввести "ataaapppp", опять не то считает …

Несколько длинных последовательностей

Логика таква, если есть последоательность такой длины, то мы задаём её, когда ма нашли конец последоательности, мы перезапускаем процесс, прасваивая col = 2, и перескакиваем к концу последовательности, , если же мы не находили последовательности, то просто идём дальше, и вот проблема, вы перескакиваете не к концу, а на один символ дальше, а также перепутали места, где мы перезапусчкаем процесс, исправляем:

elif col > 2:
    i += col - 1
    col = 2
elif col == 2:
    i += 1

Такс, проверяем, вроде работает, а есди использовать "ataaappppaaaaaaa", опять проблема, теперь с "a"

Несколько одинаковых последовательностей

Каждый раз, когды вы находите более длинную последовательность, вы добавляете к максимуму, и если длинных последовательностей несколько, то вы будете добавлять и добавлять, исправляем:

my_dict[a[i]] += 1

на

if my_dict[a[i]] < col:
    my_dict[a[i]] = col

Результат

В итоге у нас получается что-то такое:

a = input()
col = 2
my_dict = {}

for i in range(len(a)):
    my_dict[a[i]] = 1

i = 0
while i < len(a):
    if a[i: i+col] == a[i] * col:
        if my_dict[a[i]] < col:
            my_dict[a[i]] = col
        col += 1
    elif col > 2:
        i += col - 1
        col = 2
    elif col == 2:
        i += 1

for i in sorted(my_dict.items()):
    print(i[0], i[1])

Альтернативы

Это далеко не лучший или не самый просто способ рещить эту задачу, вот идейка, как бы реализовать это лучше:

Идти по строке, и запоминать, какой был последний символ, и как долго он повторяется:

string = input()
max_lengths = {}
sequence_length = 1
latest_symbol = None

for char in string:
    if latest_symbol != char:
        sequence_length = 1

    if max_lengths.get(char, 0) < sequence_length:
        max_lengths[char] = sequence_length

    sequence_length += 1
    latest_symbol = char

for i in sorted(max_lengths.items()):
    print(*i)

Понравилась статья? Поделить с друзьями:
  • Задания с грамматическими ошибками с ответами
  • Задача завершена с ошибкой 113 kaspersky endpoint agent
  • Зайдя в машинное отделение меня обдало жаром исправить ошибки
  • Задания с грамматическими ошибками для 11 класса
  • Задача в результате ошибки при комплектовании составов