0

私は初心者のCクラスで数日間プログラムに取り組んできました。私はこのコードを書き、書き直し、分解し、書き直しました。私が間違っていることは非常に単純だと思いますが、理解していないと思います。

このプログラムは、レジ係に価格、入札額を要求し、釣り銭を計算し、各紙幣/硬貨を何枚返すかをレジ係に伝えることを目的としています。void main(void) から change=round までのコードは、インストラクターから提供されました。それが double の数値を int に変換する方法だと理解しています。lf が私の scanf で機能する唯一の形式であることを理解するのに長い時間がかかり、私のインストラクターは具体的に多くの定義を使用するように求めました。

プログラムを実行すると、価格と支払額の入力を求めるプロンプトが表示されますが、変更は常に -2,147,483,648 に出力されます (int の最小値であることがわかっています)。ただし、なぜその値を選択しているのかはわかりません。change = round の計算では、支払い済み - コストが計算されますが、それは私のインストラクターによって提供されたもので、私はそれをいじりませんでした。

さらに、私のコンパイラは、//変更リストの下にリストされている「20、10、5」などに対して、「この関数には_____が初期化されていない状態で使用されています」という警告を出しています。一番上にintとしてリストしたときに、それらを初期化したと思いましたか?私のインストラクターがこれまでに説明してきた方法は、私には少し難解に思えたので、非常に単純なものが欠けているだけだと確信しています. int と int* の違いについての説明、または %lf をリストした後で %f が機能しない理由についても、以前の頭痛の種であり、ボーナス インターネット ポイントで報われたので、大歓迎です。

前もって感謝します。うまくフォーマットできたことを願っています。

#include <stdio.h>
#define TWENTY 2000
#define TEN 1000
#define FIVE 500
#define SINGLE 100
#define QUARTER 25
#define DIME 10
#define NICKEL 5
#define PENNY 1


    void main(void)
{
    int round(double num)
        {
        return (int) (num + 0.5);
        }
    int  change, // to be paid, in cents
         twenties, tens, fives, singles, quarters, dimes, nickels, pennies;    
                 //bills and coins used 
    double cost, // item cost, in dollars and cents
           paid; // amount paid, in dollars and cents

        change = round((paid - cost) * 100.0);


//Ask for cost
printf("Enter amount cost ($): ");
scanf("%lf", &cost);

//Ask for amount paid
printf("Enter amount tendered ($): ");
scanf("%lf", &paid);

//Change list
printf("Change is: %d\n", change);
printf("$20 bills: %d\n", twenties);
printf("$10 bills: %d\n", tens);
printf("$5 bills: %d\n", fives);
printf("$1 bills: %d\n", singles);
printf("Quarters: %d\n", quarters);
printf("Dimes: %d\n", dimes);
printf("Nickels: %d\n", nickels);
printf("Pennies: %d\n", pennies);

//Calculations
twenties = (change / TWENTY);
change = (change % TWENTY);
tens = (change / TEN);
change = (change % TEN);
fives = (change / FIVE);
change = (change % FIVE);
singles = (change / SINGLE);
change = (change % SINGLE);

}
4

1 に答える 1

1

主な問題は、初期化されていない変数を実際に出力することです。

// Here they are:
int  change, twenties, tens, fives, singles, quarters, dimes, nickels, pennies;

// Then you print it out, still unitialized:
printf("$20 bills: %d\n", twenties);

// Then you give it a value
twenties = (change / TWENTY);

ブロック内のステートメントは、ステートメントが発生するのと同じ順序で発生します。代入は即時計算を表します。将来(または過去)のアプリケーションの公式を設定するわけではありません。

twenties =これを修正するには、すべての割り当てステートメント (など) をステートメントの前に移動する必要がありますprintf

と同じ間違いをしchangeます。最初に次のように書きます。

// here "paid" and "cost" are uninitialized
change = round((paid - cost) * 100.0);

そして、それらに値を与えます:

// too late, horse has bolted
scanf("%lf", &cost);
scanf("%lf", &paid);

変更を計算する前に金額を入力する必要があります。これは、コインが変更から計算される前でなければなりません。

もう 1 つのことは、round関数を の開始前に移動する必要があることですmain()。標準 C では、ネストされた関数定義を持つことは違法です。

于 2015-03-08T21:01:42.057 に答える