放弃不难,但坚持一定很酷
目的:练习指针和结构体的基本使用。
题目:构建一个“图书馆”小程序(library),让用户将书籍的基本信息都录入到里面,最后一并打印出录入的所有书籍。
题解
需要创建那些量?
灵魂提问:现实中的书架是怎样的呢?(原题目就是图书馆,我觉得这里用书架来形容更合适,后面都用书架来解释了)
自问自答:书架上有好多书哇!
灵魂提问:书籍的基本信息有哪些?
自问自答:书名、作者、售价、出版日期、出版社。
自问自答:出版日期包含哪些信息?
自问自答:年、月、日
书架上放书的操作流程
把书架清空——>放入第一本书——>放入第二本书——>…——>放入最后一本书——>停止放书——>看一下总共放了多少书
程序执行流程
请问是否需要录入图书信息(YES
)——>初始化struct Book* library[]
——>用户输入…——>emsp;请问是否需要录入图书信息(NO
)——>打印图书信息——>释放内存(方便下一次存储)
程序设计
为小程序创建一个新的工程,工程文件包括library.h
functions.c
library.c
头文件 library.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h> #include <stdlib.h>
#define MAX_SIZE 100
struct Date { int year; int month; int day; };
struct Book { char title[100]; char author[100]; float price; struct Date date; char publisher[100]; };
void GetInput(struct Book* book); void PrintBook(struct Book* book); void InitLibrary(struct Book* library[]); void PrintLibrary(struct Book* library[]); void ReleaseLibrary(struct Book* library[]);
|
程序框架 library.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #define _CRT_SECURE_NO_WARNINGS 1
#include "library.h"
int main(void) { struct Book* library[MAX_SIZE]; struct Book* ptr = NULL; int ch = 0; int count = 0;
InitLibrary(library);
while (1) { printf("请问是否需要录入图书信息(Y/N):");
do { ch = getchar(); } while (ch!='Y'&&ch!='N');
if (ch == 'Y') { if (count < MAX_SIZE) { ptr = (struct Book*)malloc(sizeof(struct Book)); GetInput(ptr); count++; putchar('\n'); library[count] = ptr; } else { printf("好兄弟,该图书馆满了,放不下了。"); break; } } else { break; } }
printf("\n录入完毕,现在开始打印...\n\n"); PrintLibrary(library); ReleaseLibrary(library);
return 0; }
|
功能函数 functions.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #define _CRT_SECURE_NO_WARNINGS 1
#include "library.h"
void InitLibrary(struct Book* library[]) { int i;
for (i = 0; i < MAX_SIZE; i++) { library[i] = NULL; } }
void GetInput(struct Book* book) { printf("请输入书名:"); scanf("%s", book->title); printf("请输入作者:"); scanf("%s", book->author); printf("请输入售价:"); scanf("%f", &book->price); printf("请输入出版日期:"); scanf("%d-%d-%d",&book->date.year,&book->date.month,&book->date.day); printf("请输入出版设:"); scanf("%s", book->publisher); }
void PrintBook(struct Book* book) { printf("书名:%s\n", book->title); printf("作者:%s\n", book->author); printf("售价:%.2f\n", book->price); printf("出版日期:%d-%d-%d\n", book->date.year,book->date.month,book->date.day); printf("出版社:%s\n", book->publisher); }
void PrintLibrary(struct Book* library[]) { int i;
for (i = 0; i < MAX_SIZE; i++) { if (library[i] != NULL) { PrintBook(library[i]); putchar('\n'); } } }
void ReleaseLibrary(struct Book* library[]) { int i;
for (i = 0; i < MAX_SIZE; i++) { if (library[i]!=NULL) { free(library[i]); } } }
|
程序测试
随便找了手边的书测试了一下…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| 请问是否需要录入图书信息(Y/N):Y 请输入书名:程序员的自我修养 请输入作者:陈逸鹤 请输入售价:49.00 请输入出版日期:2017-5-25 请输入出版设:清华大学出版社
请问是否需要录入图书信息(Y/N):Y 请输入书名:零基础入门学习C语言--带你学习带你飞 请输入作者:小甲鱼 请输入售价:79.00 请输入出版日期:2019-9-01 请输入出版设:清华大学出版社
请问是否需要录入图书信息(Y/N):N
录入完毕,现在开始打印...
书名:程序员的自我修养 作者:陈逸鹤 售价:49.00 出版日期:2017-5-25 出版社:清华大学出版社
书名:零基础入门学习C语言--带你学习带你飞 作者:小甲鱼 售价:79.00 出版日期:2019-9-1 出版社:清华大学出版社
J:\code\code\code\x64\Debug\code.exe (进程 4044)已退出,代码为 0。 按任意键关闭此窗口. . .
|
写在后面
麻雀虽小五脏俱全,写写这个小程序练习了指针变量和结构体的部分使用,一步一步来,总有收获…