Member 14774267 Ответов: 4

Моя программа ошибочна, почему?


Задача такова:

Входные данные состоят из целого числа N. 1 ≤ N ≤ 10^18.
Если N это одновременно и квадратная, количество и треугольный количество, мощность и другое.
Если n является квадратом числа, выход площади.
Если N-только треугольное число, выведите треугольник.
Если N не является ни квадратным, ни треугольным числом, выведите ни то, ни другое.


Однако мой учитель говорит что я ошибаюсь

Что я уже пробовал:

long long int a, c, i, f, y, z;

scanf("%lld", &a);

if ((a >= 1) && (a <= pow(10,18))){

long long int e = 0;

for (f=1; e<a; f++){

    e = f * f;

    if (e == a){
        y = 1;
    }
}

long long int d = 0;

for (i=1; d<a; i++){
    d = d + i;

    if (d == a){
        z = 1;
    }
}

if (y == 1 && z == 1){
    printf("Both");
}else if (y == 1){
    printf("Square");
   }else if (z == 1){
        printf("Triangular");
        }else {
            printf("Neither");
        }
}

return 0;

Patrice T

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

4 Ответов

Рейтинг:
2

Maximilien

Убедитесь, что вы инициализируете свои переменные.

Это было бы очевидно при использовании отладчика.

long long int a = 0;
long long int i = 0;
long long int f = 0;
long long int y = 0;
long long int z = 0;


я попробовал с 49 (в квадрате)
Я попробовал с 378 (треугольное число), и это работает


Maciej Los

Кажется, это должно быть очевидно, но иногда это не так. Даже если есть много статей о Неинициализированная переменная (в Википедии)[^]

Рейтинг:
1

KarstenK

Вам нужно отладить свой код.

Обычный способ состоит в том, чтобы разделить ваш код на небольшие и чистые функции с параметрами и вернуть результаты. Это называется тестированием.

Например:

const char *shape(int y, int z) {
 if (y == 1 && z == 1){
    return("Both");
}else if (y == 1){
    return("Square");
   }else if (z == 1){
        return("Triangular");
        }else {
            return("Neither");
        }
}

return NULL;
}
Вы можете проверить это так:
char *s = shape( 1,1);
if( strcmp(s, "Both") {
 //log error
  printf("Both test unsucesful");
}
Это помогает выявить ошибки и таким образом показывает вам, что работает, а что нет.


Рейтинг:
0

OriginalGriff

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

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

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


Рейтинг:
0

Patrice T

Цитата:
Моя программа ошибочна, почему?

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

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
-----
Основное отличие от отладчика заключается в том, что он инициализирует все переменные с 0, даже если они не инициализированы в коде, в отличие от не отлаженных программ с не имеющими значения по умолчанию.
Часто можно иметь переменную, объявленную в 1 месте и используемую в другом месте.
long long int a, c, i, f, y, z;

Во время отладки вы можете инициализировать переменные с необычным значением, чтобы, когда вы видите, что это значение используется во время отладчика, вы знали, что что-то пропустили.
long long int a=-12345, c=-12345, i=-12345, f=-12345, y=-12345, z=-12345;