1

次のように定義された構造ブックと、構造ブックの配列libがあるとします。

struct Book{
    char title[100];
    char author[100];
    int price;
    struct Book *nextedition;
};


struct Book lib[1000];

将来の版の著者が指定された著者でなくても、その本の将来の版であるすべての本を含む、特定の著者による本の合計価格を計算する関数を作成します。

   title    author  price   nextedition
----------------------------------
0  Book1    Author1 25      &lib[2]
1  Book2    Author2 20      NULL
2  Book3    Author3 30      &lib[3]
3  Book4    Author1 35      NULL

上記の例では、lib[2] の本は lib[0] の次の版であり、lib[4] の本は lib[2] の次の版です。したがって、作成者が "Author1" の場合、関数は 90 (=25+30+35) を返し、作成者が "Author 3" の場合、関数は 65 (=30+35) を返す必要があります。

これは私のコードです:

int firstEdition(char author[100]){
    int i, pos=-1;
    for(i=0;i<numbooks;i++)
    if(strcmp(lib[i].author,author)==0){
        pos=i;
        if(pos>=0) return pos;
    }
    return -1;
}

int totalPrice(char author[100]){
    int price=0;
    int i=firstEdition(author);
    if (i<0)
        return 0;
    else {      
        while (lib[i].nextedition != NULL){
            price+=lib[i].price;
            lib[i]=*(lib[i].nextedition);
        }
    return price;}
}

上記の例と author="Author1" を使用してコードを実行しようとしましたが、間違った出力が得られ続けました。関数は常に の55代わりに戻りますが、その90理由がわかりません。どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

1

の実装は、リスト内の最後の本の価格を考慮する前にループをtotalPrice終了します。whileまた、lib明らかに望ましくない一部のメンバーを変更します。

price次の(テストされていない)コードは、状態を変更せずに正しいものを提供するはずですlib

int totalPrice(char author[100]){
    int price=0;
    int i=firstEdition(author);
    struct Book *book;
    if (i<0)
        return 0;
    book = &lib[i];
    while (book != NULL) {
        price+=book->price;
        book = book->nextedition;
    }
    return price;
}
于 2013-05-07T16:38:52.060 に答える