|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 尛善领主 于 2021-6-18 23:08 编辑
期末作业老师布置了最经典的图书馆管理问题
题目
图书目录信息包括: - 统一书号(不超过13字符)
- 书名(不超过30字符)
- 作者(不超过20字符)
- 出版社(不超过30字符)
- 出版日期(包括:年、月、日)
- 价格(精确到分)
要求功能
如果用户输入 A 或 a、F 或 f、R 或 r、M 或 m、S 或 s,则可完成相应的操作。如果用户输入其它字符,则显示错误信息。
程序将反复显示主菜单,让用户持续工作。如果用户输入 Q 或 q,则程序结束
a添加记录
f根据书名寻找图书
s对所有图书进行升序
r根据书号删除指定图书
m根据书号修改指定图书
老师分为小组来做,群里包括我一些麻瓜自己一个小组做
讨论的时候,和另外3个人讨论,我和1位同学尝试用单链表做
(其他数据结构还没学)
另外2个人用数组做
最开始是在PTA上做
___________________________________________________________
(复制过来中文注释变鸟文了)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
//瀹氫箟鏁版嵁鍩?
typedef struct Data {
char isbn[14];
char title[31];
char author[21];
char publisher[31];
struct Date{
int year;
int month;
int day;
}date;
double price;
}Element;
//瀹氫箟閾捐〃
typedef struct Node {
Element data;
struct Node *next;
}LNode,*LList;
void input(LList);
void A(LList);
void F(LList);
LList R(LList);
void S(LList);
void M(LList);
int main(){
//freopen("test.txt","r",stdin);
LList head = NULL;
head = malloc(sizeof(LNode));
head->next = NULL;
char ch;
do{
printf("Append Find Remove Modify Show Quit > ");
if(scanf(" %c",&ch) == EOF)break;
getchar();
ch = tolower(ch);
switch(ch){
case 'a':
A(head);
break;
case 'f':
F(head);
break;
case 'r':
head = R(head);
break;
case 'm':
M(head);
break;
case 's':
S(head);
break;
case 'q':
goto out;
default:
printf("Incorrect choice!\n");
}
}while(ch != 'q');
out:return 0;
}
//杈撳叆
void input(LList p){
printf(" ISBN: ");
gets(p->data.isbn);
printf(" Title: ");
gets(p->data.title);
printf(" Author: ");
gets(p->data.author);
printf("Publisher: ");
gets(p->data.publisher);
printf(" Pub date: ");
int flag;
do{
flag = 1;
scanf("%d/%d/%d",&p->data.date.year,&p->data.date.month,&p->data.date.day);
if(p->data.date.year <= 0)
flag = 0;
else {
int m2 = (p->data.date.year%4 == 0 && p->data.date.year%100 != 0) || (p->data.date.year%400 == 0);
switch(p->data.date.month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(p->data.date.day < 1 || p->data.date.day > 31)
flag = 0;
break;
case 2:
if(p->data.date.day < 1 || p->data.date.day > 28+m2)
flag = 0;
break;
case 4:
case 6:
case 9:
case 11:
if(p->data.date.day < 1 || p->data.date.day > 30)
flag = 0;
break;
default:
flag = 0;
}
}
if(!flag)printf("Incorrect date! Please reenter: ");
}while(!flag);
printf(" Price: ");
scanf("%lf",&p->data.price);
}
//娣诲姞璁板綍
void A(LList head){
LList p = head;
LNode *newnode = malloc(sizeof(LNode));
newnode->next = NULL;
while(p->next != NULL){
p = p->next;
}
p->next = newnode;
input(p);
}
//绱㈠紩涔﹀悕
void F(LList head){
LList p = head;
char t[31];
printf("Title: ");
gets(t);
int flag = 0;
do{
if(!strcmp(t,p->data.title)) {
flag = 1;
printf("ISBN--------- Title------------------------- Author-------------- Publisher--------------------- Pub-date-- Price---\n");
break;
}
p = p->next;
}while(p->next != NULL);
do{
if(!strcmp(t,p->data.title)){
printf("%-14s",p->data.isbn);
printf("%-31s",p->data.title);
printf("%-21s",p->data.author);
printf("%-31s",p->data.publisher);
printf("%04d/%02d/%02d ",p->data.date.year,p->data.date.month,p->data.date.day);
printf("%8.2lf\n",p->data.price);
}
p = p->next;
}while(p != NULL);
if(!flag)printf("Not found!\n");
}
//鎸変功鍚嶅崌搴忔帓搴?
void S(LList head) {
printf("ISBN--------- Title------------------------- Author-------------- Publisher--------------------- Pub-date-- Price---\n");
LList p,q;
int num=0,j=0;
q = head;
while(q->next != NULL){
q = q->next;
num++;
}
p = q = head;
for(int i=0;i<num-1;i++,p = p->next){
q = head;
for(j = 0;j < num-i-1;j++,q = q->next){
if(strcmp(q->data.title,q->next->data.title) > 0){
LNode t;
t.data = (*q).data;
(*q).data = (*(q->next)).data;
(*(q->next)).data = t.data;
}
}
}
for(LList p = head;p->next != NULL;p = p->next){
printf("%-14s",p->data.isbn);
printf("%-31s",p->data.title);
printf("%-21s",p->data.author);
printf("%-31s",p->data.publisher);
printf("%04d/%02d/%02d ",p->data.date.year,p->data.date.month,p->data.date.day);
printf("%8.2lf\n",p->data.price);
}
}
//淇敼鍥句功
void M(LList head){
char t[14];
printf("ISBN: ");
gets(t);
int flag = 0;
LList p = NULL;
for(p = head;p->next != NULL;p = p->next){
if(!strcmp(p->data.isbn,t)){
flag = 1;
break;
}
}
if(flag){
char select;
do{
printf("Modify(y/n)? ");
select = tolower(getchar());
getchar();
if(select != 'y' && select != 'n')printf("Incorrect answer!\n");
}while(select != 'y' && select != 'n');
if(select == 'y'){
input(p);
}else{
goto out;
}
}else{
printf("Not found!\n");
}
out:;
}
//鍒犻櫎鍥句功
LList R(LList head){
char t[14];
int flag = 0;
printf("ISBN: ");
gets(t);
for(LList p = head;p->next != NULL;p = p->next){
if(!strcmp(t,p->data.isbn)){
flag = 1;
}
}
if(!flag){
printf("Not found!\n");
return head;
}
LList fp = head;
LList lp = head->next;
flag = 0;
char select;
do{
printf("Delete(y/n)? ");
select = tolower(getchar());
getchar();
if(select == 'n')return head;
else if(select == 'y'){
flag = 1;
break;
}else{
printf("Incorrect answer!\n");
}
}while(!flag) ;
while(flag && head->next != NULL){
flag = 0;
if(!strcmp(t,head->data.isbn)){
head = head->next;
free(fp);
fp = head;
lp = head->next;
flag = 1;
}
}
while(lp != NULL){
if(!strcmp(t,lp->data.isbn)){
fp->next = lp->next;
free(lp);
lp = fp->next;
}
fp = fp->next;
lp = lp->next;
}
return head;
}
然后经过一些简单的加工,我做成另外一个版本的
除了最开始的功能,外加了一个数据保存功能,保存为csv文件,可以直接用Excel打开
思路
①分为界面和处理
界面用来展示,在gui.c文件里
核心的处理在operate.c文件里
②界面:
这里我用stdlib库里的system来调用shell的指令
比如system("cls")可以清屏
这个界面的样式我存在menu.txt里了
每次清屏后再打印一遍
思路是每次按w或s可以切换选项
按p执行选项
③当然标准库里没有输入不回显的,这里我引入了第三方库引用getch函数
来达到按键后不需要按Enter的效果
不过这个改版是基于原作业的基础上,代码有很多不必要的地方(懒得改了~)
利用字符画的方式可以不用图形库做贪吃蛇这种
但由于不是多线程,比较勉强也只能做这种操作简单的
期末作业.zip
(3.55 KB, 下载次数: 19)
|
|