課題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Alto9821

課題

#1

投稿記事 by Alto9821 » 9年前

提出期限が来週までなので大変恐縮ですが迅速にお願いいたします。

蔵書リストを(1)ISBN-10順にソートした結果を出力した上で、(2)ページ数順にソートした結果を出力するプログラムを作成せよ。尚、蔵書リストは構造体配列を使用し処理すること。
という課題が出たのですが、(1)のISBN-10順のソートがうまくできません。
蔵書のリストはzousyo_t dataにある通りです。
また、ISBN-10のXは数字の10に相当するとのことなので、if文でXを10に変換したつもりですが、これでは駄目なのでしょうか。
あと、ページ数順にソートする方は大体できているのですが、最初の,,0,が余計に入ってしまいます。

以下、現時点でのソースコードです。

コード:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define rist 20 

struct zousyo_t /*  */
{   
    char syoseki[91]; /* 書籍名 */
	char syuppansya[40]; /* 出版社名 */
	int page; /* ページ数 */
	char isbn[11]; /* ISBN-10 */
};

int main(void)
{
	struct zousyo_t data[rist + 1] = {{"プログラミング言語C", "共立出版", 360, "4320026926"},
									  {"プログラミング作法", "アスキー", 355, "4756136494"},
									  {"リーダブルコード", "オライリージャパン", 260, "4873115655"},
									  {"プログラマの考え方がおもしろいほど身につく本", "アスキー・メディアワークス", 256, "4048869558"},
									  {"プログラマが知るべき97のこと", "オライリージャパン", 276, "4873114799"},
									  {"Effective C++", "丸善出版", 336,"4621066099"},
									  {"GitHub実践入門", "技術評論社", 304, "477416366X"},
									  {"コンピュータの構成と設計 第5版 上", "日経BP社", 404, "4822298426"},
									  {"コンピュータの構成と設計 第5版 下", "日経BP社", 400, "4822298434"},
									  {"レガシーコード改善ガイド", "翔泳社", 472, "4798116831"},
									  {"新装版 リファクタリング―既存のコードを安全に改善する", "オーム社", 480, "427405019X"},
									  {"プログラマの数学", "ソフトバンククリエイティブ", 248, "4797329734"},
									  {"新版暗号技術入門 秘密の国のアリス", "ソフトバンククリエイティブ", 432, "4797350997"},
									  {"暗号解読 上巻", "新潮社", 340, "410215972X"},
									  {"暗号解読 下巻", "新潮社", 382, "4102159738"},
									  {"フェルマーの最終定理", "新潮社", 495, "4102159711"},
									  {"「白い光」のイノベーション", "朝日新聞社", 279, "4022598905"},
									  {"スティーブ・ジョブズ I", "講談社", 448, "4062171260"},
									  {"アップルを創った怪物―もうひとりの創業者、ウォズニアック自伝", "ダイヤモンド社", 453, "447800479X"},
									  {"Google誕生―ガレージで生まれたサーチ・モンスター", "イースト・プレス", 472, "4872576446"}}; /*  */
	struct zousyo_t sort;

	struct zousyo_t data2[rist + 1] = {{"プログラミング言語C", "共立出版", 360, "4320026926"},
									   {"プログラミング作法", "アスキー", 355, "4756136494"},
									   {"リーダブルコード", "オライリージャパン", 260, "4873115655"},
									   {"プログラマの考え方がおもしろいほど身につく本", "アスキー・メディアワークス", 256, "4048869558"},
									   {"プログラマが知るべき97のこと", "オライリージャパン", 276, "4873114799"},
									   {"Effective C++", "丸善出版", 336,"4621066099"},
									   {"GitHub実践入門", "技術評論社", 304, "477416366X"},
									   {"コンピュータの構成と設計 第5版 上", "日経BP社", 404, "4822298426"},
									   {"コンピュータの構成と設計 第5版 下", "日経BP社", 400, "4822298434"},
									   {"レガシーコード改善ガイド", "翔泳社", 472, "4798116831"},
									   {"新装版 リファクタリング―既存のコードを安全に改善する", "オーム社", 480, "427405019X"},
									   {"プログラマの数学", "ソフトバンククリエイティブ", 248, "4797329734"},
									   {"新版暗号技術入門 秘密の国のアリス", "ソフトバンククリエイティブ", 432, "4797350997"},
									   {"暗号解読 上巻", "新潮社", 340, "410215972X"},
									   {"暗号解読 下巻", "新潮社", 382, "4102159738"},
									   {"フェルマーの最終定理", "新潮社", 495, "4102159711"},
									   {"「白い光」のイノベーション", "朝日新聞社", 279, "4022598905"},
									   {"スティーブ・ジョブズ I", "講談社", 448, "4062171260"},
									   {"アップルを創った怪物―もうひとりの創業者、ウォズニアック自伝", "ダイヤモンド社", 453, "447800479X"},
									   {"Google誕生―ガレージで生まれたサーチ・モンスター", "イースト・プレス", 472, "4872576446"}}; /*  */

	struct zousyo_t sort2;

    int i, j, k, l;

	for(i = 0; i < rist; i++)
	{
		if(data[i].isbn[9] == 'X')
		{
			data[i].isbn[9] = 10;
		}

		for(j = rist; j > i; j--)
		{
			if(data[j].isbn < data[j - 1].isbn)
			{
				sort = data[j]; 
				data[j] = data[j - 1];
				data[j - 1] = sort; /*ここまでの3行でバブルソートを使ってISBN-10の小さい順に並べ替える */
			}
		}
	}

	for(k = 0; k < rist; k++)
	{
		for(l = rist; l > k; l--)
		{
			if(data2[l].page < data2[l - 1].page)
			{
				sort2 = data2[l]; 
				data2[l] = data2[l - 1];
				data2[l - 1] = sort2; /*ここまでの3行でバブルソートを使ってページ数の少ない順に並べ替える */
			}
		}
		
	}

	printf("---ISBN10---\n");

	for(i = 0; i < rist; i++) 
	{
		printf("%s,%s,%d,%s\n", data[i].syoseki, data[i].syuppansya, data[i].page, data[i].isbn); /* 並び替えた状態で蔵書のリストを表示 */
	}

	printf("\n---PAGES---\n");

	for(k = 0; k < rist; k++)
	{
		printf("%s,%s,%d,%s\n", data2[k].syoseki, data2[k].syuppansya, data2[k].page, data2[k].isbn); /* 並び替えた状態で蔵書のリストを表示 */
	}

    return 0;
}
以下、実行結果です。
---ISBN10---
プログラミング言語C,共立出版,360,4320026926
プログラミング作法,アスキー,355,4756136494
リーダブルコード,オライリージャパン,260,4873115655
プログラマの考え方がおもしろいほど身につく本,アスキー・メディアワークス,256,4048869558
プログラマが知るべき97のこと,オライリージャパン,276,4873114799
Effective C++,丸善出版,336,4621066099
GitHub実践入門,技術評論社,304,477416366
コンピュータの構成と設計 第5版 上,日経BP社,404,4822298426
コンピュータの構成と設計 第5版 下,日経BP社,400,4822298434
レガシーコード改善ガイド,翔泳社,472,4798116831
新装版 リファクタリング―既存のコードを安全に改善する,オーム社,480,427405019
プログラマの数学,ソフトバンククリエイティブ,248,4797329734
新版暗号技術入門 秘密の国のアリス,ソフトバンククリエイティブ,432,4797350997
暗号解読 上巻,新潮社,340,410215972
暗号解読 下巻,新潮社,382,4102159738
フェルマーの最終定理,新潮社,495,4102159711
「白い光」のイノベーション,朝日新聞社,279,4022598905
スティーブ・ジョブズ I,講談社,448,4062171260
アップルを創った怪物―もうひとりの創業者、ウォズニアック自伝,ダイヤモンド社,453,447800479
Google誕生―ガレージで生まれたサーチ・モンスター,イースト・プレス,472,4872576446

---PAGES---
,,0,
プログラマの数学,ソフトバンククリエイティブ,248,4797329734
プログラマの考え方がおもしろいほど身につく本,アスキー・メディアワークス,256,4048869558
リーダブルコード,オライリージャパン,260,4873115655
プログラマが知るべき97のこと,オライリージャパン,276,4873114799
「白い光」のイノベーション,朝日新聞社,279,4022598905
GitHub実践入門,技術評論社,304,477416366X
Effective C++,丸善出版,336,4621066099
暗号解読 上巻,新潮社,340,410215972X
プログラミング作法,アスキー,355,4756136494
プログラミング言語C,共立出版,360,4320026926
暗号解読 下巻,新潮社,382,4102159738
コンピュータの構成と設計 第5版 下,日経BP社,400,4822298434
コンピュータの構成と設計 第5版 上,日経BP社,404,4822298426
新版暗号技術入門 秘密の国のアリス,ソフトバンククリエイティブ,432,4797350997
スティーブ・ジョブズ I,講談社,448,4062171260
アップルを創った怪物―もうひとりの創業者、ウォズニアック自伝,ダイヤモンド社,453,447800479X
レガシーコード改善ガイド,翔泳社,472,4798116831
Google誕生―ガレージで生まれたサーチ・モンスター,イースト・プレス,472,4872576446
新装版 リファクタリング―既存のコードを安全に改善する,オーム社,480,427405019X
続行するには何かキーを押してください . . .

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 課題

#2

投稿記事 by みけCAT » 9年前

Alto9821 さんが書きました:(1)のISBN-10順のソートがうまくできません。
C言語では、文字列を演算子で比較することはできません。strcmp関数を使うのが簡単でしょう。
Alto9821 さんが書きました:また、ISBN-10のXは数字の10に相当するとのことなので、if文でXを10に変換したつもりですが、これでは駄目なのでしょうか。
変換するのであれば、数値の10ではなく、「数字の10」すなわち数値'0' + 10に変換しないといけません。
また、出力する前に戻したほうがいいでしょう。
Alto9821 さんが書きました:あと、ページ数順にソートする方は大体できているのですが、最初の,,0,が余計に入ってしまいます。
空のdata[rist]やdata2[rist]をソートの対象に含めるべきではありません。
ソートで使用しているjおよびlの初期値をrist-1にするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 課題

#3

投稿記事 by みけCAT » 9年前

オフトピック
'X'を'0' + 10に変換するのは、万が一char型の最大値が'9'である環境で実行するとうまく動作しなくなって、よくないかも…?
そもそも、有効なISBN-10しか入力されないのであれば、最後の桁、すなわちチェックディジットはそれまでの桁によって決まるので、
それまでの桁が同じなら最後の桁も同じはすだし、最後の桁が違えばそれまでの桁も違うはずなので、変換の必要は無いでしょう。
また、ASCIIコードを用いる場合も、9の文字コードよりXの文字コードの方が大きいので、変換の必要はないでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: 課題

#4

投稿記事 by box » 9年前

まず、同一の蔵書リストを複数持つ必要はないと思います。
次に、ISBNの最も右の桁はチェックデジットであり、1桁目~9桁目の数字によって自動的に求まるものです。
そのため、1桁目~9桁目が同一でかついちばん右の桁が異なる、ということはありません。
つまり、ISBNでソートする際にいちばん右の桁は意識しなくてもよく、'X'だからといって何か細工をする必要はありません。

コード:

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

typedef struct {
    char syoseki[91]; /* 書籍名 */
    char syuppansya[40]; /* 出版社名 */
    int page; /* ページ数 */
    char isbn[11]; /* ISBN-10 */
} Book;

void sortByIsbn(Book *data, int n)
{
    int i, j;

    for (i = 0; i < n - 1; i++) {
        for (j = i + 1; j < n; j++) {
            if (strcmp(data[i].isbn, data[j].isbn) > 0) {
                Book t = data[i];
                data[i] = data[j];
                data[j] = t;
            }
        }
    }
}

void sortByPages(Book *data, int n)
{
    int i, j;

    for (i = 0; i < n - 1; i++) {
        for (j = i + 1; j < n; j++) {
            if (data[i].page > data[j].page) {
                Book t = data[i];
                data[i] = data[j];
                data[j] = t;
            }
        }
    }
}

void printData(Book *data, int n)
{
    int i;

    for (i = 0; i < n; i++) {
        printf("%s,%s,%d,%s\n", data[i].syoseki, data[i].syuppansya, data[i].page, data[i].isbn);
    }
}

int main(void)
{
    Book data[] = {
        { "プログラミング言語C", "共立出版", 360, "4320026926" },
        { "プログラミング作法", "アスキー", 355, "4756136494" },
        { "リーダブルコード", "オライリージャパン", 260, "4873115655" },
        { "プログラマの考え方がおもしろいほど身につく本", "アスキー・メディアワークス", 256, "4048869558" },
        { "プログラマが知るべき97のこと", "オライリージャパン", 276, "4873114799" },
        { "Effective C++", "丸善出版", 336,"4621066099" },
        { "GitHub実践入門", "技術評論社", 304, "477416366X" },
        { "コンピュータの構成と設計 第5版 上", "日経BP社", 404, "4822298426" },
        { "コンピュータの構成と設計 第5版 下", "日経BP社", 400, "4822298434" },
        { "レガシーコード改善ガイド", "翔泳社", 472, "4798116831" },
        { "新装版 リファクタリング―既存のコードを安全に改善する", "オーム社", 480, "427405019X" },
        { "プログラマの数学", "ソフトバンククリエイティブ", 248, "4797329734" },
        { "新版暗号技術入門 秘密の国のアリス", "ソフトバンククリエイティブ", 432, "4797350997" },
        { "暗号解読 上巻", "新潮社", 340, "410215972X" },
        { "暗号解読 下巻", "新潮社", 382, "4102159738" },
        { "フェルマーの最終定理", "新潮社", 495, "4102159711" },
        { "「白い光」のイノベーション", "朝日新聞社", 279, "4022598905" },
        { "スティーブ・ジョブズ I", "講談社", 448, "4062171260" },
        { "アップルを創った怪物―もうひとりの創業者、ウォズニアック自伝", "ダイヤモンド社", 453, "447800479X" },
        { "Google誕生―ガレージで生まれたサーチ・モンスター", "イースト・プレス", 472, "4872576446" }
    };
    int n = sizeof(data) / sizeof(data[0]);

    sortByIsbn(data, n);
    printf("---ISBN10---\n");
    printData(data, n);

    sortByPages(data, n);
    printf("\n---PAGES---\n");
    printData(data, n);
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

Re: 課題

#5

投稿記事 by かずま » 9年前

メモリ効率、実行効率を考えたらこうなりました。

コード:

#include <stdio.h>
#include <stdlilb.h>
#include <string.h>
 
typedef struct {
    char *syoseki;    /* 書籍名 */
    char *syuppansya; /* 出版社名 */
    int page;         /* ページ数 */
    char *isbn;       /* ISBN-10 */
} Book;
 
int comp_isbn(const void *a, const void *b)
{
    Book *x = *(Book **)a, *y = *(Book **)b;
    return strcmp(x->isbn, y->isbn);
}

int comp_page(const void *a, const void *b)
{
    Book *x = *(Book **)a, *y = *(Book **)b;
    return x->page < y->page ? -1 : x->page > y->page;
}
 
void print_data(Book **data, int n)
{
    int i;
    for (i = 0; i < n; i++) {
        Book *p = data[i];
        printf("%s,%s,%d,%s\n", p->syoseki, p->syuppansya, p->page, p->isbn);
    }
}
 
int main(void)
{
    static Book data[] = {
        { "プログラミング言語C", "共立出版", 360, "4320026926" },
        { "プログラミング作法", "アスキー", 355, "4756136494" },
        { "リーダブルコード", "オライリージャパン", 260, "4873115655" },
        { "プログラマの考え方がおもしろいほど身につく本", "アスキー・メディアワークス", 256, "4048869558" },
        { "プログラマが知るべき97のこと", "オライリージャパン", 276, "4873114799" },
        { "Effective C++", "丸善出版", 336,"4621066099" },
        { "GitHub実践入門", "技術評論社", 304, "477416366X" },
        { "コンピュータの構成と設計 第5版 上", "日経BP社", 404, "4822298426" },
        { "コンピュータの構成と設計 第5版 下", "日経BP社", 400, "4822298434" },
        { "レガシーコード改善ガイド", "翔泳社", 472, "4798116831" },
        { "新装版 リファクタリング―既存のコードを安全に改善する", "オーム社", 480, "427405019X" },
        { "プログラマの数学", "ソフトバンククリエイティブ", 248, "4797329734" },
        { "新版暗号技術入門 秘密の国のアリス", "ソフトバンククリエイティブ", 432, "4797350997" },
        { "暗号解読 上巻", "新潮社", 340, "410215972X" },
        { "暗号解読 下巻", "新潮社", 382, "4102159738" },
        { "フェルマーの最終定理", "新潮社", 495, "4102159711" },
        { "「白い光」のイノベーション", "朝日新聞社", 279, "4022598905" },
        { "スティーブ・ジョブズ I", "講談社", 448, "4062171260" },
        { "アップルを創った怪物―もうひとりの創業者、ウォズニアック自伝", "ダイヤモンド社", 453, "447800479X" },
        { "Google誕生―ガレージで生まれたサーチ・モンスター", "イースト・プレス", 472, "4872576446" }
    };
    #define N (sizeof(data) / sizeof(data[0]))
    Book *data1[N], *data2[N];
    int i;
    for (i = 0; i < N; i++) data1[i] = data2[i] = data + i;
 
    qsort(data1, N, sizeof *data1, comp_isbn);
    printf("---ISBN10---\n");
    print_data(data1, N);
 
    qsort(data2, N, sizeof *data2, comp_page);
    printf("\n---PAGES---\n");
    print_data(data2, N);
    return 0;
}

Alto9821

Re: 課題

#6

投稿記事 by Alto9821 » 9年前

遅れて申し訳ありません。

みけCATさん、boxさん、かずまさん、御回答ありがとうございました。
strcmpなどを使う事で無事解決しました。

本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る