-1

私は、収入に基づいて、世帯で誰が何を支払うべきかを判断するプログラムを書いています。望ましい動作は次のとおりです。

  • ウェルカム メッセージを印刷し、世帯の人数を尋ねます。
  • 入力した数が 10 以下の場合は、名前を尋ねます。
  • 一人一人の収入を聞いてください。<-ここが問題です
  • 総収入を表示します。
  • 結果を計算して表示します。

明らかに、このプログラムは完全ではなく、ユーザーが負の値を入力するのを止める必要がありますが、最大の問題は、ユーザーが各個人の収入を入力するときにリターン キーを押すと、それ以上ユーザー入力を求められず、totalEarnings が出てくることです。 0 として。

私は C++ でのプログラミングに慣れているので、C の癖を見逃していることを願っています。

main.c

#include <stdio.h>

int main(void){

    short numberOfPeople = 0;
    char* names[10] = {0,0,0,0,0,0,0,0,0,0};
    float earnings[10] = {0,0,0,0,0,0,0,0,0,0};
    float totalEarnings = 0;
    float bills = 0;

    printf("Welcome!\nThis program calculates who should pay what for the bills in a proportional manner, based upon each persons income.\nHow many people are in your household?\n\n");

    do {
        printf("You can enter up to 10: ");
        scanf("%d", &numberOfPeople);
    } while(numberOfPeople > 10);

    puts("");

    for(short j = 0; j < numberOfPeople; ++j){
        printf("What is person %d's name? ", j+1 );
        scanf(" %s", &names[j]);
    }

    puts("");   

    for(short i = 0; i < numberOfPeople; ++i){
        printf("How much did %s earn this month? ", &names[i]);
        scanf(" %.2f", &earnings[i]);       
        totalEarnings += earnings[i];
    }

    printf("\nTotal earnings are %.2f.\n\n", &totalEarnings);

    printf("How much are the shared bills in total? ");
    scanf(" %.2f", &bills);

    puts("");

    for(short k = 0; k < numberOfPeople; ++k){
        printf("%s should pay %.2f", &names[k], &bills); 
    }

    puts("");   

    return 0;
}
4

3 に答える 3

3

名前を保持するためのメモリを割り当てていないため、名前をスキャンしてnullにします。

この時点以降、すべての賭けは無効になります。

于 2013-10-18T22:48:49.943 に答える
1

&他の人が指摘した、printf呼び出しの余分な文字に問題があります。

あなたが報告している問題は、次の行が原因である可能性があります。

scanf(" %.2f", &earnings[i]);

問題は.、scanf 形式では意味が定義されていないことです (無視されているか、scanf 呼び出しが失敗する原因になっている可能性があります) 2。数字。したがって、それらを取り除く必要があり、実際に必要なのは scanf の戻り値をチェックして、失敗しているかどうかを確認し、失敗している場合は適切なことを行うことです。何かのようなもの:

while (scanf("%f", &earnings[i]) != 1) {
    scanf("%*[^\n]"); /* throw away the rest of the line */
    printf("That doesn't look like a number, what did they earn this month? ");
}

scanf他のすべての呼び出しでも同様のことを行う必要があります。

于 2013-10-18T23:01:54.073 に答える