2015-04-01 2 views
0

Итак, я пытаюсь создать базовую программу для расчета цены заказа на пиццу. Я хочу, чтобы он спросил, завершен ли заказчик. Если они вводят y, я хочу, чтобы цикл продолжался, если какой-либо другой символ введен, я хочу, чтобы он остановился. Когда я ввожу какого-либо символа, программа просто распечатывает все мои заявления printf. Я использую кодовые блоки. Вот мой код. Я получаю 2 предупреждения. Проблема с программированием на программирование

warning: initialization makes integer from pointer without a cast [enabled by default] at line 17 where i declare the keepgoing variable. 

warning: comparison between pointer and integer [enabled by default]| 

по линии 19, где начинается цикл в то время.

#include <stdio.h> 
#include <stdlib.h> 

main() 
{ 
#define LARGEPIZZAPRICE 
#define SMALLPIZZAPRICE 
#define LARGEPIZZATOPPING 
#define SMALLPIZZATOPPING 
#define DRINK 

int numberOfLargePizzas; 
int numberOfSmallPizzas; 
int numberOfLargeToppings; 
int numberOfSmallToppings; 
int numberOfDrinks; 
int keepGoing = "y"; 

while (keepGoing == "y") 
{ 
    printf("How many large pizza's do you want\n"); 
    scanf(" %d", &numberOfLargePizzas); 

    printf("How many large toppings do you want\n"); 
    scanf(" %d", &numberOfLargeToppings); 

    printf("How many small pizza's do you want\n"); 
    scanf(" %d", &numberOfSmallPizzas); 

    printf("How many small toppings do you want\n"); 
    scanf(" %d", &numberOfSmallToppings); 

    printf("Would you like to order more. Enter a y or n\n"); 
    scanf(" %i", &keepGoing); 
} 



}` 

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

#include <stdio.h> 
#include <stdlib.h> 

main() 
{ 
#define LARGEPIZZAPRICE 12 
#define SMALLPIZZAPRICE 10 
#define LARGEPIZZATOPPING 2 
#define SMALLPIZZATOPPING 1.50 
#define DRINK 1.50 
#define TAXRATE .05 
int numberOfLargePizzas; 
int numberOfSmallPizzas; 
int numberOfLargeToppings; 
int numberOfSmallToppings; 
int numberOfDrinks; 
char keepGoing ='y'; 
float largePizzaTotal; 
float smallPizzaTotal; 
float drinkTotal; 

while (keepGoing == 'y') 
{ 
     printf("How many large pizza's do you want\n"); 
     scanf(" %d", &numberOfLargePizzas); 

    if(numberOfLargePizzas != 0){ 
     printf("How many large toppings do you want\n"); 
     scanf(" %d", &numberOfLargeToppings); 
     } 

     printf("How many small pizza's do you want\n"); 
     scanf(" %d", &numberOfSmallPizzas); 
    if(numberOfSmallPizzas !=0){ 
     printf("How many small toppings do you want\n"); 
     scanf(" %d", &numberOfSmallToppings); 
     } 

     printf("How many drinks would you like\n"); 
     scanf(" %int", &numberOfDrinks); 
     printf("Would you like to order more. Enter a y or n\n"); 
     scanf(" %c", &keepGoing); 

} 
largePizzaTotal = (LARGEPIZZAPRICE*numberOfLargePizzas)+(LARGEPIZZATOPPING*numberOfLargeToppings); 
smallPizzaTotal=(SMALLPIZZAPRICE*numberOfSmallPizzas)+(SMALLPIZZATOPPING*numberOfSmallToppings); 
drinkTotal = DRINK*numberOfDrinks; 

    printf("Subtotal: %2f", largePizzaTotal + smallPizzaTotal + drinkTotal); 

}

+0

попытка упомянуть в названии, что проблема сделать вы хотите решить –

+0

вы знаете, вы не можете вычислить 'subTotal' * до * вы получаете значения. –

+0

так сделайте это, как этот printf («Промежуточный итог:% d», большойPizzaTotal + smallPizzaTotal + drinkTotal); –

ответ

2

Вы не можете сравнивать строки, способ с, вероятно, вы имели в виду

char keepGoing = 'y'; 
if (keepGoing == 'y') 

, но тогда вы должны исправить scanf() слишком

scanf(" %c", &keepGoing); 

int keepGoing = "y"; 

хорошо компилируется, если у вас есть предупреждения об отключении компилятора, но это неправильно.

Ваш компилятор действительно говорит вам, что это неправильно, потому что int и указатель несовместимы.

+0

Спасибо за помощь, это сработало. –

0

Вы сравниваете переменную integer с данными character.

Заменить int keepGoing = "y";

с

char keepGoing = 'y';

и заменить

while (keepGoing == "y")

с while (keepGoing == 'y')

или если вы хотят, чтобы заботиться о случаях заменить его

while (keepGoing == 'y' || keepGoing == 'Y')

0

Вы просили советов, чтобы подтянуть то, что вы делаете. Я потратил немного времени и наметил подход к вашему магазину пиццы, который окружает Pizza Shop Menu. Вместо того, чтобы подсказать, сколько из них - во время каждого цикла, это просто представляет небольшое меню, где вы выбираете L для больших, S для маленьких и D для напитка, а затем заполните количество.(пункты меню могут быть либо верхний или нижний регистр) Недействительные пункты меню не допускается (не показаны ошибки, меню просто перерисовывает)

Вместо того, чтобы ждать, чтобы подвести и общее в конце концов, я считаю, что легче просто сохраняйте текущую сумму каждого проданного типа, промежуточного итога, налога и т. д. Вы можете сравнить оба метода и посмотреть, что вы предпочитаете.

Кроме того, после каждого scanf ввода (где строка формата не потребляет newline), входной буфер очищается, чтобы предотвратить появление scanf пропустить записи. Взгляните и дайте мне знать, если у вас есть вопросы. Есть много способов сделать это, не более, чем в следующем (до тех пор, пока они верны). Все это сводится к форматированию вкуса и эффективности в этот момент. (Примечание: никаких дополнительных файлов заголовки не были включены в случае, это ограничение, так что есть более простые способы, чтобы проверить на правильность запись с strchr и т.п. .. используя string.h и т.д.)

#include <stdio.h> 
#include <stdlib.h> 

/* defines are preprocessor commands that simply cause the 
* preprocessor to do a global search-and-replace of the 
* labels with values. They traditionally go at the top. 
* You can add storage type suffixes to the numbers to 
* prevent ambiguity. (e.g. F float, U unsigned, ...) 
*/ 
#define LARGEPIZZAPRICE 12.0F 
#define SMALLPIZZAPRICE 10.0F 
#define LARGEPIZZATOPPING 2.0F 
#define SMALLPIZZATOPPING 1.50F 
#define DRINK 1.50F 
#define TAXRATE .05F 

/* empty input buffer after reading from stdin */ 
void flush_stdin() 
{ 
    int c = 0; 
    while ((c = getchar()) != '\n' && c != EOF); 
} 

int show_menu() 
{ 
    int c = 0; 

    /* quick & dirty menu */ 
    printf ("\n Pizza Shop Menu\n\n"); 
    printf ("   L) Large Pizza\n"); 
    printf ("   S) Small Pizza\n"); 
    printf ("   D) Drink\n"); 
    printf ("   --------------------\n"); 
    printf ("   C) Checkout\n\n"); 
    printf (" Choice: "); 

    c = getchar(); 
    flush_stdin(); 

    /* return only upper case letters */ 
    return c > 'Z' ? c - 'a' + 'A' : c; 
} 

int main (void) 
{ 
    /* ALWAYS INITIALIZE ALL VARIABLES 
    * accidentally reading from an uninitialized variable 
    * is Undefined Behavior. 
    */ 
    int numberOfLargePizzas = 0; 
    int numberOfSmallPizzas = 0; 
    int numberOfLargeToppings = 0; 
    int numberOfSmallToppings = 0; 
    int numberOfDrinks = 0; 
    float price = 0.0; 
    float subtotal = 0.0; 
    float tax = 0.0; 

    while (1) 
    { 
     int n = 0; 

     switch (show_menu()) 
     { 
      case 'L' : 
       printf ("\n How many large pizza's do you want : "); 
       scanf ("%d", &n); 
       flush_stdin(); 
       if (n) 
       { 
        numberOfLargePizzas += n; 
        price = n * LARGEPIZZAPRICE; 
        tax += price * TAXRATE; 
        subtotal += price; 
        n = 0; 
        printf (" How many large toppings do you want: "); 
        scanf ("%d", &n); 
        flush_stdin(); 
        if (n) 
        { 
         numberOfLargeToppings += n; 
         price = n * LARGEPIZZATOPPING; 
         tax += price * TAXRATE; 
         subtotal += price; 
        } 
       } 
       printf ("\n Subtotal : %.2f\n  Tax : %.2f\n  Total : %.2f\n", 
         subtotal, tax, subtotal + tax); 
       break; 

      case 'S' : 
       printf ("\n How many small pizza's do you want : "); 
       scanf ("%d", &n); 
       flush_stdin(); 
       if (n) 
       { 
        numberOfSmallPizzas += n; 
        price = n * SMALLPIZZAPRICE; 
        tax += price * TAXRATE; 
        subtotal += price; 
        n = 0; 
        printf (" How many small toppings do you want: "); 
        scanf ("%d", &n); 
        flush_stdin(); 
        if (n) 
        { 
         numberOfSmallToppings += n; 
         price = n * SMALLPIZZATOPPING; 
         tax += price * TAXRATE; 
         subtotal += price; 
        } 
       } 
       printf ("\n Subtotal : %.2f\n  Tax : %.2f\n  Total : %.2f\n", 
         subtotal, tax, subtotal + tax); 
       break; 

      case 'D' : 
       printf ("\n How many drinks would you like: "); 
       scanf ("%d", &n); 
       flush_stdin(); 
       if (n) 
       { 
        numberOfDrinks += n; 
        price = n * DRINK; 
        tax += price * TAXRATE; 
        subtotal += price; 
       } 
       printf ("\n Subtotal : %.2f\n  Tax : %.2f\n  Total : %.2f\n", 
         subtotal, tax, subtotal + tax); 
       break; 

      case 'C' : 
       printf ("\nOrder:\n"); 
       printf (" ------------------------\n"); 
       printf (" Large Pizzas : %2d\n Large Toppings : %2d\n", numberOfLargePizzas, numberOfLargeToppings); 
       printf (" Small Pizzas : %2d\n Small Toppings : %2d\n", numberOfSmallPizzas, numberOfSmallToppings); 
       printf ("   Drinks : %2d\n", numberOfDrinks); 
       printf (" ------------------------\n"); 
       printf ("  Subtotal : %6.2f\n   Tax : %6.2f\n   Total : %6.2f\n", 
         subtotal, tax, subtotal + tax); 
       printf (" ------------------------\n\n"); 
       return 0; 

      default: 
       /* uncomment to show bad menu entry */ 
       // printf (" <--invalid entry-->\n"); 
       break; 
     } 
    } 

    return 0; 
} 

Примера :

$ ./bin/pizzas 

Pizza Shop Menu 

      L) Large Pizza 
      S) Small Pizza 
      D) Drink 
      -------------------- 
      C) Checkout 

Choice: l 

    How many large pizza's do you want : 2 
    How many large toppings do you want: 2 

    Subtotal : 28.00 
     Tax : 1.40 
    Total : 29.40 

Pizza Shop Menu 

      L) Large Pizza 
      S) Small Pizza 
      D) Drink 
      -------------------- 
      C) Checkout 

Choice: d 

    How many drinks would you like: 4 

    Subtotal : 34.00 
     Tax : 1.70 
    Total : 35.70 

Pizza Shop Menu 

      L) Large Pizza 
      S) Small Pizza 
      D) Drink 
      -------------------- 
      C) Checkout 

Choice: c 

Order: 
------------------------ 
    Large Pizzas : 2 
Large Toppings : 2 
    Small Pizzas : 0 
Small Toppings : 0 
     Drinks : 4 
------------------------ 
     Subtotal : 34.00 
      Tax : 1.70 
      Total : 35.70 
------------------------ 
+0

Спасибо, хорошо выглядит. Мне нравится ваш подход лучше, никогда не думал об этом так. Если вы могли бы объяснить буферный флеш немного больше или отправить мне хорошую ссылку, где я могу узнать больше об этом. –

+0

Когда вы используете 'scanf' для целых чисел или поплавков или' getchar() ', оба выбирают желаемый номер или символ из' stdin', но ** оставляем ** 'newline' (сгенерированный нажатием' [Enter] ') в входной буфер ('stdin'). Если вы снова вызовете 'scanf', не опуская' stdin', 'scanf' примет значение' newline' (десятичное '10', hex' 0xa') в качестве следующего значения, которое нужно прочитать, и появится ** пропустить ** следующий 'scanf'. Вы приняли некоторые меры предосторожности в своем заявлении формата ''% s ''(пробел, пропущенный пробел, включая' newline'), но это просто пропускает «новую строку» в буфере, но не удаляет оставшуюся. –

Смежные вопросы