2016-11-09 3 views
0

Мне просто интересно, что я сделал не так здесь, потому что, когда программа выполняется, она работает просто отлично. Я новичок в программировании и очень потерян. Любой совет будет замечательным!CS50: «ожидаемое приглашение для ввода, а не код выхода из 0», не слишком уверен в том, что я делаю неправильно здесь

#include <stdio.h> 
#include <cs50.h> 
#include <math.h> 
int main(void) 
{ 
    printf("Days in Month:\n"); 
    int days = GetInt(); 
    for (; days < 28 || days > 31; days = GetInt()) 
    { 
     printf("No month has that amount of days! Please try again.\n"); 
    } 
    printf("Pennies on first day:\n"); 
    int pennies = GetInt(); 
    for (; pennies < 0; pennies = GetInt()) 
    { 
     printf("You can't have negative pennies! Please try again.\n"); 
    } 
    if (pennies == 1) 
     printf("$%.2f",pow ((pennies + 1), (days - 1))); 
    else 
     printf("$%.2f",pow (pennies, days)); 
} 

Check50 выходы:

~/workspace/chapter1/ $ check50 1617.chapter1.pennies pennies.c 
:) pennies.c exists 
:) pennies.c compiles 
:(28 days, 1 penny on first day 
    \ expected output, but not "$134217728.00" 
:(31 days, 1 penny on first day 
    \ expected output, but not "$1073741824.00" 
:(29 days, 2 pennies on first day 
    \ expected output, but not "$536870912.00" 
:(30 days, 30 pennies on first day 
    \ expected output, but not "$20589113209464899002378237447530552256..." 
:) rejects days not 28, 29, 30, or 31 
:(rejects non-positive pennies 
    \ expected prompt for input, not exit code of 0 
:) rejects a non-numeric days input of "foo" 
:) rejects a non-numeric penny input of "foo" 
:) rejects a non-numeric days input of "" 
:) rejects a non-numeric penny input of "" 

Как вы можете видеть, что это говорит, что он принимает на себя отрицательные входы и не приносит правильное количество денег. Это ошибка в check50, или я сделал что-то неправильно?

+1

Не могли бы вы сообщить, в чем проблема? Я думаю, вы просто делаете математику неправильно. – Schwern

+0

@ Шварн: Да, ты прав. Я неправильно читаю его с лишними лишними парами круглых скобок. –

ответ

1

Предполагая, что это this assignment, ваша математика ошибочна.

Назначение - это то, что произойдет, если ваше начальное количество пенни удваивается каждый день в течение месяца. Если вы начинаете с 5 пенни, это означает 5, затем 10, затем 20, затем 40 ... 5 * 2 * 2 * 2 ... или 5 * 2 N, где N - это количество дней.

Но у вас есть pow(pennies, days). Если pennies = 5 и days = 30 это 5 что-то совсем другое и очень большое.

Что вам нужно, это pennies * pow(2, days). И это число пенни, поэтому разделите на 100, чтобы получить сумму в долларах.

Это не на 100% верно, но поскольку это упражнение, я оставляю остальную информацию до вас.


Что касается проблемы "выхода 0", то это:

for (; pennies < 0; pennies = GetInt()) 
{ 
    printf("You can't have negative pennies! Please try again.\n"); 
} 

Вы позволяете 0 пенсов. Вы должны отказаться от этого.

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

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

+0

Большое вам спасибо за помощь! Я закончил реализацию стандартной формулы геометрического ряда, которую я не использовал с алгебры 2: 'printf (« $%. 2f \ n », (((пенни * (1 - pow (2, дни)))/(1 - 2))/100)); ' –

+0

@MatteoRehm Добро пожаловать. Вы можете это упростить. (1 - 2) равен -1. Деление чего-то на -1 такое же, как умножение на -1. И внешние параны не нужны. '((пенни * (1 - pow (2, дни))) * -1)/100'. Вы должны сделать это в два этапа для ясности (компилятор, вероятно, сделает его одним), и привыкнуть хранить целые числа как можно дольше, чтобы избежать неточностей с плавающей запятой. 'long long accumulated_pennies = (пенни * (1 - pow (2, дни))) * -1', затем' printf ("$%. 2f \ n", accumulated_pennies/100) '. – Schwern