2015-07-12 2 views
0

Ok, так что я пытаюсь написать программу, которая может проверить, чтобы увидеть, является ли число делится на 2, 3, 4 или 5.Basic программирования C Вопрос

Например, если пользователь вводит 8, выход будет:

«8 делится на 2» «8 делится на 4»

Моя программа:

#include<stdio.h> 
#include<conio.h> 


main(){ 

    int num, even, oddThree, evenFour, oddFive; 



    printf("Please Enter A number: "); 
    scanf("%d",&num); 

    even = (num % 2 == 0); 

    oddThree = (num % 3 == 0); 

    evenFour = (num % 4 == 0); 

    oddFive = (num % 5 == 0); 


    if (even){ 

    printf("%d is divisible by 2\n",num); 

    } 

    if(oddThree) { 

    printf("%d is divisible by 3\n",num); 

    } 


    if (evenFour){ 

    printf("%d is divisible by 4\n", num); 

    } 

    if (oddFive){ 

    printf("%d is divisible by 5\n", num); 

    } 

    else { 

    printf("%d is not divisible by 2,3,4 or 5\n", num); 

    } 

getch(); 

} 

по какой-то причине, когда я вхожу на определенные номера, для г nstance, 12. Мой вывод:

"12 делится на 2" "12 делится на 4" "12 не делится на 2,3,4 или 5"

Первые два оператора являются истинными, но третий является ложным.

Что я делаю неправильно?

+1

Вы должны собрать все предупреждения и отладочной информации ('НКУ -Wall -Wextra -g'), и вы должны научиться ** использовать отладчик ** ('gdb'). BTW '' является нестандартным заголовком, а 'getch' является нестандартной функцией. Поэтому вы, возможно, отметили свой вопрос с помощью дополнительного тега. –

ответ

5
printf("%d is not divisible by 2,3,4 or 5\n", num); 

будет работать все время

(oddFive) 

ложна. возможно

if (!(even || oddThree || evenFour || oddFive)) { 
    printf("%d is not divisible by 2,3,4 or 5\n", num); 
} 
1

Если я могу предложить несколько иной подход: выход

#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