语言课程设计之产品信息管理.docx
《语言课程设计之产品信息管理.docx》由会员分享,可在线阅读,更多相关《语言课程设计之产品信息管理.docx(12页珍藏版)》请在冰豆网上搜索。
语言课程设计之产品信息管理
#include"stdio.h" /*I/O函数*/
#include"stdlib.h" /*其它说明*/
#include"string.h" /*字符串函数*/
#include"conio.h" /*屏幕操作函数*/
#include"mem.h" /*内存操作函数*/
#include"ctype.h" /*字符操作函数*/
#include"alloc.h" /*动态地址分配函数*/
#define N3 /*定义常数*/
typedefstructz1 /*定义数据结构*/
{charno[5];
charname[6];
chartypeno[6];
charkind[8];
charunit[4];
charamount[6];
charprice[5];
charvalday[10];
chardata[10];
structz1*next;
}product;/*以下是函数原型*/
product *init(); /*初始化函数*/
product*create(); /*创建链表*/
product*delete(product*h); /*删除记录*/
voidprint(product*h); /*显示所有记录*/
voidsearch(product*h); /*查找*/
voidsave(product*h); /*保存*/
product*load(); /*读入记录*/
product*insert(product*h); /*插入记录*/
voidappend(); /*追加记录*/
product*sort(product*h); /*排序*/
product*index(product*h); /*索引*/
voidtotal(product*h); /*分类合计*/
intmenu_select(); /*菜单函数*/
/******主函数开始*******/
main()
{inti;
product*head; /*链表定义头指针*/
head=init(); /*初始化链表*/
clrscr(); /*清屏*/
for(;;) /*无限循环*/
{switch(menu_select()) /*调用主菜单函数,返回值整数作开关条件*/
{ /*值不同,执行的函数不同,break不能省略*/
case0:
head=init();break; /*执行初始化*/
case1:
head=create();break;/*创建链表*/
case2:
save(head);break;/*删除记录*/
case3:
head=delete(head);break; /*显示全部记录*/
case4:
search(head);break; /*查找记录*/
case5:
print(head);break; /*保存文件*/
case6:
head=index(head);break; /*读文件*/
case7:
head=sort(head); break;/*插入记录*/
case8:
head=insert(head);break; /*排序*/
case9:
append();break; /*追加记录*/
case10:
head=load();break; /*索引*/
case11:
exit(0); /*如菜单返回值为12程序结束*/
}
}
}/*菜单函数,返回值为整数*/
menu_select()
{char*menu[]={"***************MENU***************", /*定义菜单字符串数*/
"0.initlist", /*初始化*/
"1.Enterlist", /*输入记录*/
"2.Savethefile", /*从表中删除记录*/
"3.Deletearecordfromlist", /*显示单链表中所有记录*/
"4.Searchrecordonname", /*按照姓名查找记录*/
"5.printlist", /*将单链表中记录保存到文件中*/
"6.outvaldayproduct", /*从文件中读入记录*/
"7.sortonprice", /*插入记录到表中*/
"8.insertrecordtolist", /*排序*/
"9.append recordtofile", /*追加记录到文件中*/
"10.Loadthefile", /*索引*/
"11.Quit"}; /*退出*/
chars[3]; /*以字符形式保存选择号*/
intc,i; /*定义整形变量*/
gotoxy(1,25); /*移动光标*/
printf("pressanykeyentermenu......\n"); /*压任一键进入主菜单*/
getch(); /*输入任一键*/
clrscr(); /*清屏幕*/
gotoxy(1,1); /*移动光标*/
textcolor(YELLOW); /*设置文本显示颜色为黄色*/
textbackground(BLUE); /*设置背景颜色为蓝色*/
gotoxy(10,2); /*移动光标*/
putch(0xc9); /*输出左上角边框┏*/
for(i=1;i<52;i++)
putch(0xcd); /*输出上边框水平线*/
putch(0xbb); /*输出右上角边框 ┓*/
for(i=3;i<17;i++)
{gotoxy(10,i);putch(0xba); /*输出左垂直线*/
gotoxy(62,i);putch(0xba);} /*输出右垂直线*/
gotoxy(10,17);putch(0xc8); /*输出左上角边框┗*/
for(i=1;i<52;i++)
putch(0xcd); /*输出下边框水平线*/
putch(0xbc); /*输出右下角边框┛*/
window(11,3,61,16); /*制作显示菜单的窗口,大小根据菜单条数设*/clrscr(); /*清屏*/
for(i=0;i<13;i++) /*输出主菜单数组*/
{gotoxy(10,i+1);
cprintf("%s",menu[i]);}
textbackground(BLACK); /*设置背景颜色为黑色*/
window(1,1,80,25); /*恢复原窗口大小*/
gotoxy(10,21); /*移动光标*/
do{printf("\n Enteryouchoice(0~11):
"); /*在菜单窗口外显示提信息*/
scanf("%s",s); /*输入选择项*/
c=atoi(s); /*将输入的字符串转化为整形数*/
}while(c<0||c>11); /*选择项不在0~14之间重输*/
returnc; /*返回选择项,主程序根据该数调用相应的函数*/
}
product*init()
{returnNULL;}/*创建链表*/
product*create()
{inti;
product*h=NULL,*info; /*product指向结构体的指针*/
for(;;)
{info=(product*)malloc(sizeof(product)); /*申请空间*/
if(!
info) /*如果指针info为空*/
{printf("\noutofmemory"); /*输出内存溢出*/
returnNULL; /*返回空指针*/}
inputs("enterno:
",info->no,5); /*输入编号并校验*/
if(info->no[0]=='@')break; /*如果编号字符为@则结束输入*/
inputs("entername:
",info->name,6);/*输入姓名,并进行校验*/
inputs("entertypeno:
",info->typeno,6);
inputs("enterkind:
",info->kind,8);
inputs("enterunit:
",info->unit,4);
inputs("enteramount:
",info->amount,6);
inputs("enterprice:
",info->price,5);
inputs("enterdata:
",info->data,10);
inputs("entervalday:
",info->valday,10);
info->next=h; /*将头结点做为新输入结点的后继结点*/
h=info; /*新输入结点为新的头结点*/
}return(h); /*返回头指针*/}/*输入字符串,并进行长度验证*/
inputs(char*prompt,char*s,intcount)
{charp[255];
do{printf(prompt); /*显示提示信息*/
scanf("%s",p); /*输入字符串*/
if(strlen(p)>count)printf("\ntoolong!
\n");/*进行长度校验,超过count值重输入*/
}while(strlen(p)>count);
strcpy(s,p);/*将输入的字符串拷贝到字符串s中*/
}/*输出链表中结点信息*/
voidprint(product*h)
{inti=0; /*统计记录条数*/
product*p; /*移动指针*/
clrscr(); /*清屏*/
p=h; /*初值为头指针*/
printf("\n\n\n******************************product************************************\n");
printf("|rec|nO|name|typeno| kind |unit|amount|price| data | valday |\n");
printf("|---|----|------|------|--------|----|------|-----|----------|----------|\n");
while(p!
=NULL)
{i++;
printf("|%3d|%-4s|%-6s|%-6s|%-8s|%-4s|%6s|%5s|%10s|%10s|\n",i,p->no,p->name,p->typeno,p->kind,
p->unit,p->amount,p->price,p->data,p->valday);
p=p->next;}
printf("***********************************end***********************************\n");}
/*删除记录*/
product*delete(product*h)
{product*p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/
chars[11]; /*存放学号*/
clrscr(); /*清屏*/
printf("pleasedeletedno\n"); /*显示提示信息*/
scanf("%s",s); /*输入要删除记录的学号*/
q=p=h; /*给q和p赋初值头指针*/
while(strcmp(p->no,s)&&p!
=NULL) /*当记录的学号不是要找的,或指针不为空时*/
{q=p; /*将p指针值赋给q作为p的前驱指针*/
p=p->next; /*将p指针指向下一条记录*/
}if(p==NULL) /*如果p为空,说明链表中没有该结点*/
printf("\nlistno%sproduct\n",s);
else /*p不为空,显示找到的记录信息*/
{printf("******************************havefound*****************************\n");
printf("|nO|name|typeno| kind |unit|amount|price| data | valday |\n");
printf("|----|------|------|--------|----|------|-----|----------|----------|\n");
printf("|%-4s|%-6s|%-6s|%-8s|%-4s|%6s|%5s|%10s|%10s|\n",p->no,p->name,p->typeno,p->kind,
p->unit,p->amount,p->price,p->data,p->valday);
printf("*********************************end********************************\n");
getch(); /*压任一键后,开始删除*/
if(p==h) /*如果p==h,说明被删结点是头结点*/
h=p->next; /*修改头指针指向下一条记录*/
else
q->next=p->next;/*不是头指针,将p的后继结点作为q的后继结点*/
free(p); /*释放p所指结点空间*/
printf("\nhavedeletedNo%sproduct\n",s);
printf("Don'tforgetsave\n");/*提示删除后不要忘记保存文件*/
}return(h); /*返回头指针*/
}/*查找记录*/
voidsearch(product*h)
{product*p; /* 移动指针*/
chars[15]; /*存放姓名的字符数组*/
clrscr(); /*清屏幕*/
printf("pleaseenternameforsearch\n");
scanf("%s",s); /*输入姓名*/
p=h; /*将头指针赋给p*/
while(strcmp(p->name,s)&&p!
=NULL) /*当记录的姓名不是要找的,或指针不为空时*/
p=p->next; /*移动指针,指向下一结点*/
if(p==NULL) /*如果指针为空*/
printf("\nlistno%sproduct\n",s); /*显示没有该学生*/
else /*显示找到的记录信息*/
{printf("******************************havefound*****************************\n");
printf("|nO|name|typeno| kind |unit|amount|price| data | valday |\n");
printf("|----|------|------|--------|----|------|-----|----------|----------|\n");
printf("|%-4s|%-6s|%-6s|%-8s|%-4s|%6s|%5s|%10s|%10s|\n",p->no,p->name,p->typeno,p->kind,
p->unit,p->amount,p->price,p->data,p->valday);
printf("*********************************end********************************\n");
}
}/*插入记录*/
product *insert(product*h)
{product*p,*q,*info;/*p指向插入位置,q是其前驱,info指新插入记录*/
chars[11]; /*保存插入点位置的学号*/
ints1,i;
printf("pleaseenterlocation beforetheno\n");
scanf("%s",s); /*输入插入点学号*/
printf("\npleasenewrecord\n"); /*提示输入记录信息*/
info=(product*)malloc(sizeof(product)); /*申请空间*/
if(!
info)
{printf("\noutofmemory"); /*如没有申请到,内存溢出*/
returnNULL; /*返回空指针*/
}inputs("enterno:
",info->no,11);/*输入学号*/
inputs("entername:
",info->name,15);/*输入姓名*/
info->next=NULL; /*设后继指针为空*/
p=h; /*将指针赋值给p*/
q=h; /*将指针赋值给q*/
while(strcmp(p->no,s)&&p!
=NULL) /*查找插入位置*/
{q=p; /*保存指针p,作为下一个p的前驱*/
p=p->next; /*将指针p后移*/
}if(p==NULL) /*如果p指针为空,说明没有指定结点*/
if(p==h) /*同时p等于h,说明链表为空*/
h=info; /*新记录则为头结点*/
else
q->next=info; /*p为空,但p不等于h,将新结点插在表尾*/
else
if(p==h) /*p不为空,则找到了指定结点*/
{info->next=p;/*如果p等于h,则新结点插入在第一个结点之前*/
h=info; /*新结点为新的头结点*/}
else{
info->next=p; /*不是头结点,则是中间某个位置,新结点的后继为p*/
q->next=info; /*新结点作为q的后继结点*/
}printf("\n----haveinserted%sproduct----\n",info->name); printf("---Don'tforgetsave---\n"); /*提示存盘*/
return(h); /*返回头指针*/
}/*保存数据到文件*/
voidsave(product*h)
{FILE*fp; /*定义指向文件的指针*/
product*p; /*定义移动指针*/
charoutfile[10]; /*保存输出文件名*/
printf("Enteroutfilename,forexamplec:
\\f1\\te.txt:
\n");/*提示文件名格式信息*/
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL)/*为输出打开一个二进制文件,如没有则建立*/
{ printf("cannotopenfile\n");
exit
(1);}
printf("\nSavingfile......\n"); /*打开文件,提示正在保存*/
p=h; /*移动指针从头指针开始*/
while(p!
=NULL) /*如p不为空*/
{fwrite(p,sizeof(product),1,fp);/*写入一条记录*/
p=p->next; /*指针后移*/
}fclose(fp); /*关闭文件*/
printf("-----savesuccess!
!
-----\n"); /*显示保存成功*/
}
/*从文件读数据*/
product*load()
{product*p,*q,*h=NULL; /*定义记录指针变量*/
FILE*fp; /*定义指向文件的指针*/
chari