-1

私はこのウェブサイトでこれらのエラーの両方を調べ、提案された変更に対応するようにコードを変更しようとしましたが、私のコードでは機能しませんでした. 課題の半分ほどしか終わっていないので完全ではありませんが、正しく構築されないため、これまでに行ったことを確認できません。ありがとうございました!

#include <stdio.h>


//int CheckMoney(double *payment, double item_cost); //compares the amount the user has deposited to the price of item selected. It returns 1 if the amount is at least enough to cover the cost, 0 if there is not enough.
//void GetMoney(double *payment, double item_cost, char selection); //calls CoinMenu function to collect money from the user and CheckMoney function to keep comparing the deposited amount to the item cost. 
//void GetChange(double *payment, double item_cost, double *change); //calculates the amount of change to be returned
void CoinMenu(double *payment);
void Quit(char *again);
void GetCost(char selection, double *item_cost);
void Menu(char *selection);

// Displays the list of snack items and prompts for the user’s choice
void Menu(char *selection)
{
printf("Welcome to the AAA vending machine, where your wishes could come true for less than $2");
printf("/nWhich one of our delicious snacks would you like to sink your teeth into?");
printf("/nP – Potato Chips      $1.25");
printf("/nS - Snickers Bar      $1.35");
printf("/nT – Pop Tart          $0.95");
printf("/nC – Cookies           $1.50");
printf("/nB – Brownie           $1.75");
printf("/nN – Nuts              $1.40");
printf("Enter your delicious selection here: ",*selection);
scanf(" %c", &*selection);

//determine cost of selection

GetCost(*selection, 0);
}

//sets the cost of the purchase based on value in selection
void GetCost(char selection, double *item_cost)
{

if(selection=='P'||'p')
{
    *item_cost=1.25;
}
else if(selection=='S'||'s')
{
    *item_cost=1.35;
}
else if(selection=='T'||'t')
{
    *item_cost=0.95;
}
else if(selection=='C'||'c')
{
    *item_cost=1.50;
}
else if(selection=='B'||'b')
{
    *item_cost=1.75;
}
else if(selection=='N'||'n')
{
    *item_cost=1.40;
}
else
{
    printf("That is not a valid selection, have a nice day!");
    return;
}
}

//displays menu of coins and gets user input of the coins deposited
void CoinMenu(double *payment)
{
printf("Please deposit your money by the following numbers:");
printf("/n1 - $5.00");
printf("/n2 - $2.00");
printf("/n3 - $1.00");
printf("/n4 - $0.25");
printf("/n5 - $0.10");
printf("/n6 - $0.05");
printf("/n7 - $0.01");
printf("/nAmount deposited: ");
scanf(" %c", &*payment);
}




void Quit(char *again)
{
printf("Would you like to buy another snack?");
printf("/nEnter Y for yes or N for no: ", *again);
if(*again=='N'||'n')
{
    return;
}
else if(*again=='Y'||'y')
{
    void Menu(char *selection);
}
}
4

1 に答える 1

0

質問に記載されているエラーについては、main()機能がなく、作成するまで完全な C プログラムはありません。リンカーはそれを探していますが、見つからない場合はエラーが発生します。

ここには、他にも次のようなエラーがたくさんあります。

  1. printf("/n1 - $5.00");- それは であり\n、 ではなく/n、改行を行末ではなく先頭に置く理由が明確ではありません:printf("/nN – Nuts $1.40"); printf("Enter your delicious selection here: ",*selection);たとえば、奇妙な見た目のテキストが表示されます。

  2. printf("Enter your delicious selection here: ",*selection);そういえば、 -charへの引数としてa を指定しprintf()ますが、フォーマット文字列によると、引数は想定されていません。改行で終了していないため、への呼び出しの前にprintf("Enter your delicious selection here: ");も追加する必要があります。fflush(stdout);scanf()

  3. scanf(" %c", &*selection);- アドレスを取得するためだけにポインターを逆参照するのはなぜですか? 違法な一時的な値のアドレスを取得することになるという事実など、そうしない正当な理由がいくつかあります。あなたはすでにポインタを持っているので、それを使ってください - あるべきですscanf(" %c", selection);

  4. if(selection=='P'||'p')- 二項論理演算子は、C ではそのようには機能しませんif ( selection == 'P' || selection == 'p' )

  5. scanf(" %c", &*payment);- 上記のポイント 3 と同じ問題に加えて、ここpaymentに a があり、aを読むようにdouble *指示しています。する必要がありますscanf()charscanf("%lf", payment);

  6. void Menu(char *selection);下部 - 主な質問へのコメントで指摘されているように、これは関数呼び出しではなく関数宣言であり、ここでは事実上何もしません。である必要がありますがMenu(again)、実際には true または false を返すだけであり、呼び出し元は再度呼び出すかどうかを決定する必要がありますMenu()

これらのエラーのいくつかは、コード全体のさまざまな場所で繰り返されます。すべての例を挙げているわけではありません。このポインターの受け渡しも、非常に奇妙な設計です。すべての関数は戻り値として宣言されてvoidいます。値を返すように変更し、いくつかのローカル変数を使用すると、代わりにポインターをまったく渡さないようにすることができます。

于 2013-10-27T03:38:31.053 に答える