Если я могу предложить несколько иной подход: выход
#include <stdio.h>
int main(void)
{
int num;
int divisors[] = {2, 3, 4, 5};
size_t numDivisors = sizeof divisors/sizeof divisors[0];
int isDivisible = 0;
printf("Gimme a number: ");
fflush(stdout);
if (scanf("%d", &num) == 1)
{
size_t i;
for (i = 0; i < numDivisors; i++)
{
if (!(num % divisors[i]))
{
printf("%d is divisible by %d\n", num, divisors[i]);
isDivisible = 1;
}
}
}
else
{
fprintf(stderr, "Bad input, exiting\n");
exit(0);
}
if (!isDivisible)
{
char *sep = "";
size_t i;
printf("%d is not divisible by any of ", num);
for (i = 0; i < numDivisors; i++)
{
printf("%s%d", sep, divisors[i]);
if (i == numDivisors - 2)
sep = ", or ";
else
sep = ", ";
}
putchar('\n');
}
return 0;
}
Пример:
[[email protected]]~/prototypes/div: ./div
Gimme a number: 19
19 is not divisible by any of 2, 3, 4, or 5
[[email protected]]~/prototypes/div: ./div
Gimme a number: 18
18 is divisible by 2
18 is divisible by 3
Вместо того чтобы создавать отдельные переменные для результата каждого теста, мы просто запустить через список делителей в цикле, распечатывая результат по мере продвижения. Мы отслеживаем, работает ли какой-либо из делителей, используя флаг isDivisible
.
Существует два преимущества такого подхода. Во-первых, это немного компактнее и проще в обслуживании. Во-вторых, вы можете изменить количество делителей и их значения, просто добавив больше элементов в инициализатор divisors
без необходимости изменять какую-либо логику программы (вплоть до точки, во всяком случае). Например, если вы хотите добавить проверку на 7, вы бы просто изменить
int divisors[] = {2, 3, 4, 5};
в
int divisors[] = {2, 3, 4, 5, 7};
и перекомпилировать.
Учитывая, что вы используете conio.h
, вы, очевидно, находитесь на платформе DOS/Windows с использованием MSVC или Turbo C или что-то в этом роде. Этот код должен скомпилировать под этими компиляторами, хотя вам может понадобиться включить stdlib.h
или что-то получить, чтобы получить определение size_t
.
Для целей этого упражнения вам не нужно ничего от conio
. Если вы запустите программу в окне командной строки (вместо ее запуска из IDE), вам не понадобится инструкция getch
, чтобы открыть окно.
EDIT
Эта версия немного чище - я отделенный ввод и обработку от выхода. Это потребовало поворота isDivisible
в массив и добавление счетчика, но я думаю, что это лучше со стилистической точки зрения. Выход
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int num;
int divisors[] = {2, 3, 4, 5};
size_t numDivisors = sizeof divisors/sizeof divisors[0];
int isDivisible[sizeof divisors/sizeof divisors[0]] = {0};
size_t divCount = 0;
size_t i;
/**
* INPUT
*/
printf("Gimme a number: ");
fflush(stdout);
if (scanf("%d", &num) != 1)
{
fprintf(stderr, "Bad input\n");
exit(0);
}
/**
* PROCESSING
*/
for (i = 0; i < numDivisors; i++)
{
divCount += (isDivisible[i] = !(num % divisors[i]));
}
/**
* OUTPUT
*/
printf("%d is ", num);
if (!divCount)
{
char *sep = "";
printf("not divisible by any of ");
for (i = 0; i < numDivisors; i++)
{
printf("%s%d", sep, divisors[i]);
if (i == numDivisors - 2)
sep = ", or ";
else
sep = ", ";
}
}
else
{
printf("divisible by ");
char *sep = "";
for (i = 0; i < numDivisors; i++)
{
if (isDivisible[i])
{
printf("%s%d", sep, divisors[i]);
if (--divCount > 1)
sep = ", ";
else
sep = " and ";
}
}
}
putchar('\n');
return 0;
}
Пример:
[[email protected]]~/prototypes/div: ./div
Gimme a number: 20
20 is divisible by 2, 4 and 5
[[email protected]]~/prototypes/div: ./div
Gimme a number: 19
19 is not divisible by any of 2, 3, 4, or 5
Вы должны собрать все предупреждения и отладочной информации ('НКУ -Wall -Wextra -g'), и вы должны научиться ** использовать отладчик ** ('gdb'). BTW '' является нестандартным заголовком, а 'getch' является нестандартной функцией. Поэтому вы, возможно, отметили свой вопрос с помощью дополнительного тега. –