2016-08-09 14 views
0

Bookという名前の構造体を定義します。各書籍には、正確に3文字(略称)の名前が必要です。各書籍にはページ数(整数)と価格(整数)も必要です。構造体をC言語の関数に渡す

最初に整数nを読み込んだ後、n本の名前、ページ数、価格を読み取るプログラムを作成します。

書籍の配列を取り、その価格に従って並べ替える関数を書く。

この機能を使用すると、プログラムは各書籍の名前とページ数を価格の順番で印刷する必要があります。

*構造体を関数に渡してこのコードを動作させる方法を教えてもらえますか?それとも彼らがこの質問にどのように取り組むか。

struct Book{ 
char name[3]; 
int pagec; 
int price; 
}; 


void price(int size, struct Book books[size]){ 
int i,j, tmp; 
for(i=0; i<size; i++){ 
    for(j=0; j<size-1; j++){ 
     if(books[j].price < books[j+1].price){ 
      books[j].price = tmp; 
      books[j].price = books.price[j+1]; 
      books.price[j+1] = tmp; 
     } 
     } 
    } 
} 

int main(void) { 
int n; 
scanf("%d", &n); 
struct Book books[n]; 
int i,j; 
for(i=0; i<n; i++){ 
    for(j=0; i<1; j++){ 
    scanf("%c", &books[i].name); 
    scanf("%d", &books[i].pagec); 
    scanf("%d", &books[i].price); 
    } 
    } 

price(n, books[n]); 
for(i=0; i<n; i++){ 
    printf("%c: %d - %d",books[i].name, books[i].pagec, books[i].price); 
} 
+1

まず、「厳密に3文字の名前」と「char name [10];」は一致しません。 – molbdnilo

+0

(a) '%c'は1文字('%3c'は3を読みます)を読み込みます、(b) 'printf()'に '%c 'を持つ型不一致があり、' char'と ' books [i] .name'は 'char *'を渡します。注意深く印刷する必要があります。ヌル終了文字列はありません。私は '%3c'も出力に関して仕事をしなければならないと思いますが、マニュアル(例えば[printf()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html)を確認してください。注意深く私は二重チェックしなければならないだろう。私はこの千年紀記法を使っていません。スキャンするとき、 '%3c'はスキップしないので、おそらく'%3c 'の前にスペースが必要です。 –

+0

あなたのスワップアルゴリズム 'books [j] .price = tmp; 本[j] .price = books.price [j + 1]; books.price [j + 1] = tmp; '最初に' tmp'に割り当てる必要があります: 'tmp = books [j] .price;' –

答えて

2

structを渡す方法についてのあなたの質問の一部は十分に答えられているようですが、聞かせて私は2番目の部分に着きます:どのように私はその質問に取り組むでしょう。構造体が十分に説明されるべきであるので、我々はあまり考えず書き込むことができますどのような

/* 
    Define a struct named: Book. 
    Each book should have a name with exactly 3 letters (abbreviation). 
    Each book should also have a page count (integer), 
    and a price (integer). 
*/ 
typedef struct book { 
    // three characters plus '\0' 
    char name[4]; 
    int pagec; 
    int price; 
} book_t; 

typedefの必要はありますが、その部分を残さないとstruct booksと直接構造体を使用することができます)

彼らは3つの機能を望んで、1つはmain()の3つのうちの1つとして使用できます。私は情報を得ること、メモリを割り当てることなどはここではmain()関数の良い使用だと思います。

/* 
    Write a program which 

     reads an integer n first, 
     then reads the names, 
     page counts 
     and prices of n books. 
*/ 
int main() 
{ 
    int n, i; 
    book_t **books; 

    puts("How many books?"); 
    scanf("%d", &n); 

    // we need enough memory to safe "n" structs 
    // at first allocate memory for n pointers 
    books = malloc(n * sizeof(book_t *)); 
    // at each pointer allocate enough memory for one struct books 
    for (i = 0; i < n; i++) { 
    books[i] = malloc(sizeof(book_t)); 
    } 
    // red the info from stdin 
    for (i = 0; i < n; i++) { 
    printf("Name of book (3 letter abbrev.):"); 
    scanf("%3s", books[i]->name); 
    printf("Number of pages:"); 
    scanf("%d", &books[i]->pagec); 
    printf("Price of book (incl. taxes):"); 
    scanf("%d", &books[i]->price); 
    } 
    // call function to sort them 
    sort_books(books, n); 
    // call a function to print the sorted list 
    print_books(books, n); 
    // we don't need the memory anymore, so free it 
    // at first free the individual structs 
    for (i = 0; i < n; i++) { 
    free(books[i]); 
    } 
    // then free the memory holding all of the pointers 
    free(books); 

    exit(EXIT_SUCCESS); 
} 

印刷用の2つの機能とソートは、すべてが非常に簡単

/* 
    Using that function, your program should 
     print the names and page counts of each book with the order of their prices. 
*/ 
void print_books(book_t ** books, int length) 
{ 
    int i; 
    for (i = 0; i < length; i++) { 
    printf("Name %s, pages %d, price %d\n", 
     books[i]->name, books[i]->pagec, books[i]->price); 
    } 
} 

であることが正確な順序については何も言いません、それらを印刷

/* 
    Write a function which takes an array of books, 
    and sorts them according to their prices. 

    Doesn't say something about output, so sort in situ 
*/ 
void sort_books(book_t ** books, int length) 
{ 
    // OP had bubble sort, so lets do a bubble sort. Why not? 
    int i, j; 
    book_t *tmp; 
    for (i = 0; i < length - 1; i++) { 
    for (j = 0; j < length -i - 1; j++) { 
     if (books[j]->price < books[j + 1]->price) { 
     tmp = books[j]; 
     books[j] = books[j + 1]; 
     books[j + 1] = tmp; 
     } 
    } 
    } 
} 

を扱う引数に似ています私は降順(最高から最低)を使うために自由を取った。あなたは昇順をしたい場合(最低から最高へ)ソートアルゴリズムで比較を変更:

void sort_books(book_t ** books, int length) 
{ 
    // OP had bubble sort, so lets do a bubble sort 
    int i, j; 
    book_t *tmp; 
    for (i = 0; i < length - 1; i++) { 
    for (j = 0; j < length - i - 1; j++) { 
     // if (books[j]->price < books[j + 1]->price) { 
     if (books[j]->price > books[j + 1]->price) { 
     tmp = books[j]; 
     books[j] = books[j + 1]; 
     books[j + 1] = tmp; 
     } 
    } 
    } 
} 

私はすべてチェックを省略していることに注意してください! malloc()scanf()の戻り値を確認する必要があります。nが整数の場合、他のすべての数字が数字などである場合はチェックしてください。

+0

これは単なるc&p(およびスワップの間違った最初の行の修正)だったのです。そして私はわずか3冊の本でテストしました。 Oopsie!ありがとう!私はいつバブルソートをしたのですか?私はこれが十年以上も前のことだと思っています;-) – deamentiaemundi

+0

私はこの回答に一般に同意しますが、OPはCの新機能なので、mallocと多くのポインタを使って回避しようとしました私のために。 – Cody

+0

割り当ては固定数の本については何も言いません。 'malloc'を使わなくても可能ですが、' struct books_t = books [n]; 'はすべてのコンパイラ、特にすべてのオンラインコンパイラでは機能しません。それはデニスのためにCです!あなたはポインタの使い方に精通しているはずです!そして私はそれがポインタでより簡単だと思います。 – deamentiaemundi

2

だから、あなたは、構造体

struct Book{ 
    char name[10]; 
    int pagec; 
    int price; 
}; 

を持っているあなたは、あなたがしていることをオペレータ

void receivingFunction(Book* myBook) 
{ 
    printf("%s", myBook->name); 
} 

void sendingFunction() 
{ 
    Book myBook; 
    //set values in myBook 
    receivingFunction(&myBook); 
} 

お知らせ「のアドレスを」使用して、それへのポインタを渡すことによってそれを渡すことができますブックへのポインタを使用すると、.演算子ではなく、->演算子を使用してメンバーにアクセスします。

上記の例は、単一のインスタンスを渡すためのものです。配列を渡す場合はどうすればよいですか?それはこのようなものに見えます。ここから

#include <stdio.h> 
#include <string.h> 

struct Book{ 
    char name[4]; //other answers explain well why I changed this to 4 
    int pagec; 
    int price; 
}; 

void BookSorter(struct Book books[10], int booksLength) 
{ 
    int i; 
    for(i = 0; i < booksLength; i++) 
    { 
     printf("%s %d %d\n", books[i].name, books[i].pagec, books[i].price); 
    } 
} 

int main(void) 
{ 
    Book books[10]; 
    //define your values for books here 
    //mine are junk values since this is just an example 
    for(int i = 0; i < 10; i++) 
    { 
     strncpy(books[i].name, "aaa", 4); 
     books[i].pagec = 4; 
     books[i].price = 10; 
    } 
    // 
    BookSorter(books, 10); 
} 

あなたは、配列のインスタンスを反復処理し、それらを交換するためにあなたのバブルソートを変更することができます。私はその部分を含めるつもりはない。なぜなら、1)それは構造体を渡すことに関するあなたの元の質問の範囲を超えており、2)あなたが宿題をしているように見えるので、あなたにすべてを与えたくないからです。あなたの質問の下のコメントは、私がまだ見たことのないバブルソートを修正する方法を扱っています。ただ、書籍自体ではなく、書籍の価格を交換しているだけです。一時変数はではなく、struct Bookにする必要があります。あなたのスワッピングは書籍の価格を交換するだけです。返信の最終印刷のために間違った本に割り当てられ、本とページ数は読み込まれた順序と同じになります。あなたはこのサンプルコードを使用しましたが、それはあなたがreference for implementing bubble sortを必要とする場合です。

+0

私は本当に理解していません。バブルソートで関数を記述できますか? –

+0

あなたが宿題をしているように見えましたので、私はあなたにすべてを与えたくありませんでした。この答えを展開して、配列を渡す方法を示します。 – Cody

2

books[n]struct Book(またはアレイがn+1要素を有する場合であろう)。

は、配列の名前がちょうどbooksあり、これはあなたが関数に渡すべきものである。

price(n, books); 
関連する問題