Skip to content

Instantly share code, notes, and snippets.

@solismb
Last active August 29, 2015 14:22
Show Gist options
  • Save solismb/8ac34a50aa086f108881 to your computer and use it in GitHub Desktop.
Save solismb/8ac34a50aa086f108881 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 30
#define M 500
typedef struct book {
int id;
char title[N];
char author[N];
int isLend;
} Book;
/* データファイルからデータ読み込み */
void readData(FILE *fp, Book book[], int *n)
{
int i;
if ((fp = fopen("data.txt", "r")) == NULL) {
printf("File can not open.\n");
exit(EXIT_FAILURE);
}
fscanf(fp, "%d\n", n);
for (i = 0; i < M && i < *n; i++) {
fscanf(fp, "%d\n", &book[i].id);
fgets(book[i].title, N, fp);
book[i].title[strlen(book[i].title) - 1] = '\0'; // 闇の処理
fgets(book[i].author, N, fp);
book[i].author[strlen(book[i].author) - 1] = '\0'; // 闇の処理
fscanf(fp, "%d\n", &book[i].isLend);
}
fclose(fp);
return;
}
/* データファイルを配列bookの内容に書き込み */
void writeData(FILE *fp, Book book[], int *n)
{
int i;
if ((fp = fopen("data.txt", "w")) == NULL) {
printf("File can not open.\n");
exit(EXIT_FAILURE);
}
fprintf(fp, "%d\n", *n);
for (i = 0; i < M && i < *n; i++) {
fprintf(fp, "%d\n", book[i].id);
fprintf(fp, "%s\n", book[i].title);
fprintf(fp, "%s\n", book[i].author);
fprintf(fp, "%d\n", book[i].isLend);
}
fclose(fp);
return;
}
/* 在庫検索 */
void bookSearch(Book book[], int *n)
{
int i = 0;
char str[N], lend[N];
//getchar();
printf("\n検索したいタイトルを入力してください.\n"
"タイトル : ");
while ((str[i] = getchar()) != '\n') i++;
str[i] = '\0';
//fgets(str, N, stdin);
for (i = 0; i < M && i < *n; i++) {
if (strcmp(str, book[i].title) == 0) {
if (book[i].isLend == 0)
strcpy(lend, "在庫あり");
else
strcpy(lend, "貸出中");
printf("\nID : %d\n"
"タイトル : %s\n"
"著者 : %s\n"
"状態 : %s\n"
, book[i].id, book[i].title, book[i].author, lend);
return;
}
}
printf("\"%s\"に該当するタイトルは見つかりません.\n", str);
return;
}
6
1
Harry Potter
J.K.Rowling
0
2
The Load of the Rings
Reuel Tolkien
1
3
ALDNOAH.ZERO
Olympus Knights
0
4
Back to the Future
Robert Zemeckis
1
5
hogehoge fugafuga
piyo piyo
1
6
History of KNCT
Hasegawa principal
0
#include "common.c"
void login(char []); // パスワード認証
void bookLend(FILE *, Book [], int *); // 貸出処理
void bookReturn(FILE *, Book [], int *); // 返却処理
void bookRegistration(FILE *, Book [], int *); // 追加登録
int menu();
int main()
{
FILE *fp;
Book book[M];
char pass[] = "login";
int m, n = 0;
login(pass);
readData(fp, book, &n);
printf("\n### Welcome to Library System ###\n");
do {
m = menu();
switch (m) {
case 1:
getchar(); // 改行読み飛ばし
bookSearch(book, &n);
break;
case 2:
bookLend(fp, book, &n);
break;
case 3:
bookReturn(fp, book, &n);
break;
case 4:
bookRegistration(fp, book, &n);
break;
case 5:
// 終了
break;
default:
printf("Error.\n");
break;
}
} while (m >= 1 && m <= 4);
return 0;
}
void login(char pass[])
{
char str[N];
int miss = 0;
printf("Login Menu\n");
do {
printf("password : ");
scanf("%s", str);
if (strcmp(pass, str) == 0) {
break;
} else {
printf("パスワードが違います.\n");
miss++;
if (miss == 3) {
printf("エラーが起きました. プログラムを終了します.\n");
exit(EXIT_FAILURE);
}
}
} while (miss < 3);
return;
}
int menu(void)
{
int m;
printf("\n----------------------------------------------\n");
printf("数字を入力してメニューを選んでください.\n"
"1 : 在庫検索\n"
"2 : 本の貸し出し\n"
"3 : 本の返却\n"
"4 : 追加登録\n"
"5 : 終了\n"
);
do {
printf("\nMenu number : ");
scanf("%d", &m);
if (m >= 1 && m <= 5)
break;
printf("メニューに対応した数字を入力してください.\n");
} while (m < 1 || m > 5);
printf("----------------------------------------------\n");
return m;
}
void bookLend(FILE *fp, Book book[], int *n)
{
int id, i;
readData(fp, book, n);
printf("\n貸し出す本の管理番号を入力してください.\n"
"ID : ");
scanf("%d", &id);
for (i = 0; i < M && i < *n; i++) {
if (id == book[i].id) {
if (book[i].isLend == 1) {
// 現在貸出中
printf("タイトル : %s\nは現在貸出中です.\n", book[i].title);
return;
} else {
// 在庫有り(0) -> 貸出中(1)に変更
printf("タイトル : %s\nを貸出しました.\n", book[i].title);
book[i].isLend = 1;
writeData(fp, book, n);
return;
}
}
}
printf("該当するデータは見つかりません.\n");
return;
}
void bookReturn(FILE *fp, Book book[], int *n)
{
int id, i;
readData(fp, book, n);
printf("\n返却する本の管理番号を入力してください.\n"
"ID : ");
scanf("%d", &id);
for (i = 0; i < M && i < *n; i++) {
if (id == book[i].id) {
if (book[i].isLend == 1) {
// 貸出中(1) -> 在庫有り(0)に変更
printf("タイトル : %s\nは返却されました.\n", book[i].title);
book[i].isLend = 0;
writeData(fp, book, n);
return;
} else {
// 現在在庫有り
printf("タイトル : %s\nは既に返却されています.\n", book[i].title);
return;
}
}
}
printf("該当するデータは見つかりません.\n");
return;
}
void bookRegistration(FILE *fp, Book book[], int *n)
{
int i = 0;
getchar(); // 改行読み飛ばし
printf("\n追加したいデータのタイトルを入力してください :\n");
while ((book[*n].title[i] = getchar()) != '\n') i++;
book[*n].title[i] = '\0';
i = 0;
printf("著者名を入力してください :\n");
while ((book[*n].author[i] = getchar()) != '\n') i++;
book[*n].author[i] = '\0';
book[*n].id = (*n) + 1;
book[*n].isLend = 0;
// 登録データ数の更新
(*n)++;
writeData(fp, book, n);
printf("\nデータを追加しました.\n");
printf("登録したデータの管理番号は\nID : %d\nとなります.\n", *n);
return;
}

##図書館システム 前にがっこうのやつでC言語でちょろっと書いたやつです。
動的確保じゃないから500冊までしか登録出来ません:;(∩´﹏`∩);:

  • librarian.c
    司書が使う端末をイメージしたもの。在庫検索、貸し出し、返却、本の追加登録、終了がメニューとしてあります。

  • user.c
    お客さん(?)が蔵書検索する端末をイメージしたもの。開館したらずっと起動させとく前提なので実行したら常に入力待ち状態です。

  • common.c
    librarianとuserに共通する機能をまとめてます。

  • data.txt
    本のデータをテキストファイルとして保存してます。

#include "common.c"
int main()
{
FILE *fp;
Book book[M];
int n = 0;
printf("### Inventory Search System ###\n");
for (;;) {
printf("\n----------------------------------------------\n");
readData(fp, book, &n);
bookSearch(book, &n);
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment