C语言课程设计报告
题 目: 汽车销售管理系统
院系名称: 计算机学院
专业名称: 计算机科学与技术
班 级:
学生姓名
学号(8位
指导教师:
设计起止时间:20##年06月17日~20##年06月26日
一. 设计目的
1. 强化上机动手能力,在理论和实践的基础上进一步巩固《C语言程序设计》课程学习的内容,掌握工程化软件设计的基本方法
2. 学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力
3. 为后续各门计算机课程的学习打下坚实基础
二. 设计内容
设计一个汽车销售管理系统,对于系统基要求本应该有:
1. 录入系统所需的数据,用链表组织数据;
2. 数据存储:将录入的数据存储,用文件的形式将录入的数据存储;
3. 数据读写:对数据进行读写操作;
4. 数据修改:对数据进行更新操作,可以进行新数据的插入,旧数据的修改操作
5. 数据删除:对数据进行删除操作,根据具体题目将对应记录删除;
6. 数据查询:按要求对数据进行查询,根据选项进行汽车信息查询;
7. 数据统计:对汽车总数进行统计;
8. 数据排序:按要求对数据进行排序,升序排序;
9. 界面:设计总体菜单界面;
对于不同的要求,调用不同的函数来完成。
三.概要设计
1.功能模块图;
2.各个模块详细的功能描述。
(1).录入信息模块,从键盘输入汽车的基本信息保存在文件中。
(2).汽车信息的增加,由键盘输入添加保存到原文件中
(3).信息查询模块,通过三种方式从文件中调取内容进行查询。
(4).信息删除模块,也可以通过三种方式进行选择文件进行删除。
(5).汽车信息的排序,通过字符串的比较可以用类型,编号,时间,地址,四种方式进行排序
(6).信息修改模块,也可以通过三种方式进行选择文件进行修改。
(7).汽车信息的统计,将录入的车辆数进行统计。
(8).将汽车信息输出
四.详细设计
1.功能函数的调用关系图
2.各功能函数的数据流程图;
1.信息输入
2.信息插入
4. 信息查找
5. 信息删除
6. 信息排序
6.信息修改
7.信息统计
3.重点设计及编码。
排序函数
void sort(struct cars *h)
{
struct cars *p, *q, *r, t;
int choice;
system("cls");
printf(" ************ 请选择方式 ************:\n");
printf(" \n");
printf(" 【1】. 品牌 \n");
printf(" \n");
printf(" 【2】. 型号 \n");
printf(" \n");
printf(" 【3】. 生产商地址 \n");
printf(" \n");
printf(" 【4】. 价格 \n");
printf(" \n");
printf(" 请选择(1--4) \n");
scanf("%d", &choice);
switch(choice)
{
case 1:
for(p = h->next ; p; p = p->next)
for(q = p->next; q; q = q->next)
if(strcmp(p->name, q->name)>0)
{
t = *p;
*p = *q;
*q = t;
r = p->next;
p->next = q->next;
q->next =r;
}
break;
case 2:
for(p = h->next ; p; p = p->next)
for(q = p->next; q; q = q->next)
if(strcmp(p->number, q->number)>0)
{
t = *p;
*p = *q;
*q = t;
r= p->next;
p->next = q->next;
q->next = r;
}
break;
case 3:
for(p = h->next; p; p = p->next)
for(q = p->next; q; q = q->next)
if(strcmp(p->address , q->address)>0)
{
t = *p;
*p = *q;
*q = t;
r = p->next;
p->next = q->next;
q->next = r;
}
break;
case 4:
for(p = h->next; p; p = p->next)
for(q = p->next; q; q = q->next)
if(p->price > q->price)
{
t = *p;
*p = *q;
*q = t;
r = p->next;
p->next = q->next;
q->next = r;
}
break;
default:
{
printf("错误!");
break;
}
}
output(h);
}
五.测试数据及运行结果
1. 正常测试数据(3组)及运行结果;
信息的输出:
信息的查找:
信息的排序:
2. 非正常测试数据(2组)及运行结果。
信息的修改:
六.调试情况,设计技巧及体会:
1. 对自己的设计进行评价,指出合理和不足之处,提出改进方案;
格式不美观,删除时遇到相同项会同时删除,应在分类删除,排序模块不够简便,统计模块较为简单
修改的函数中问题比较多,而且不是非常的完善。
2. 对设计及调试过程的心得体会。
各功能模块应有一定的顺序,不可颠倒,这次课程设计是大学来第一次动手来做,做起来比实际想的要难于多。调试时会出现许多你想也想不道的错误,在编写源代码时错误也是百出。今后应锻炼自己的动手能力,对今后自己的毕业设计和工作打好基础
七.参考文献
《C语言程序设计》
《C库函数》
《C语言设计技巧》
八.附录:
源代码(电子版)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<io.h> //系统输入输出函数 filelength()
/*汽车结构体*/
struct cars
{
char name[30]; //品牌
char colour[30]; //颜色
char number[30]; //型号
char address[80]; //生产商地址
int price; //价格
struct cars *next;
};
//用文件来存储信息
void save_file (struct cars *h)
{
struct cars *q;
FILE *fp;
if((fp=fopen("abc.txt","wt"))==NULL)
{
printf("Error!\n");
getch();
exit (1);
}
for(q=h->next;q!=NULL;q=q->next)
fprintf(fp,"%s %s %s %s %d \n",q->name,q->number,q->colour,q->address,q->price );
printf("操作成功!\n");
getch();
fclose(fp);
}
//录入基本信息
struct cars *input()
{
struct cars *head, *s, *r;
char choice;
s=head=(struct cars*)malloc(sizeof(struct cars)); //head 和 s 指向头结点
head->next=NULL;
system("cls"); //清屏
printf("**********请输入汽车信息:***********\n");
do
{
r=(struct cars *)malloc(sizeof(struct cars));
printf(" \n name:");
scanf("%s",r->name);
printf("\n number:");
scanf("%s",r->number);
printf("\n colour:");
scanf("%s",r->colour);
printf("\n address:");
scanf("%s",r->address);
printf("\n price:");
scanf("%d",&r->price);
s->next=r;
s=r;
printf("是否继续输入信息?(Y/N) \n");
choice=getch();
}
while(choice=='Y' || choice=='y');
s->next=NULL;
save_file(head);
return(head);
}
struct cars *fileopen() //创建链表,从文件读信息到链表,并返回头节点head
{
struct cars *head,*s,*r;
FILE *fp;
long fsize,fno;
s=head=(struct cars *)malloc(sizeof(struct cars));
head->next =NULL;
printf("请确认汽车信息:\n");
fp=fopen("abc.txt","rt");
if(fp==NULL)
{
printf("\n 抱歉!\n 文件不能打开!\n");
getch();
return (head);
}
fno=fileno(fp);
fsize=filelength(fno); //filelength() 文件大小
printf("文件大小:%ld bytes\n",fsize);
while(!feof(fp))
//feof() 判断文件指针是否处于文件结束位置,如文件结束,则返回值为1,否则为0
{
r=(struct cars*)malloc(sizeof(struct cars));
fscanf(fp,"%s\t%s\t%s\t%s\t%d\n\n",r->name,r->number,r->colour,r->address,&r->price);
s->next=r;
s=r;
}
s->next=NULL;
fclose(fp);
return head;
}
struct cars *filewrite(struct cars *head) //将链表写入到文件中
{
FILE *fp;
struct cars *q;
fp=fopen("abc.txt","wt");
if(fp==NULL)
{
printf("抱歉\n");
exit(1);
}
q=(struct cars*)malloc(sizeof(struct cars));
q=head->next;
while(q!=NULL)
{
fprintf(fp,"%s\t%s\t%s\t%s\t%d\n\n",q->name,q->number,q->colour,q->address,q->price);
q=q->next;
}
fclose(fp);
return head;
}
insert() //插入
{
FILE *fp;
struct cars *head,*p1,*p2;
head=fileopen();
if((fp=fopen("abc.txt","at+"))==NULL)
{
printf("error!\n");
getch();
return 0;
}
else
{
p1 = head;
p2=(struct cars *)malloc(sizeof(struct cars));
printf("\t\t 开始插入: \n");
printf("请输入车辆信息:\n\n");
printf("name\tnumber\tcolour\taddress \tprice");
scanf("%s%s%s%s%d",p2->name,p2->number,p2->colour,p2->address,&p2->price);
p2->next = p1->next;
p1->next = p2;
filewrite(head);
return 1;
}
}
//查找
void serch()
{
int choice;
int flag=0;
struct cars *head,*p;
char name[30];
char number[30];
int price;
int k=1;
head=fileopen();
while(flag==0)
{
system("cls");
printf("********************** 请选择查找方式 ******************\n");
printf(" \n");
printf(" 【1】按照品牌 \n");
printf(" \n");
printf(" 【2】按照型号 \n");
printf(" \n");
printf(" 【3】按照价格 \n");
printf(" \n");
printf(" 【0】退出 \n");
printf("\n");
printf(" 请输入您的选择(0__3) \n");
scanf("%d",&choice);
p=head->next;
switch(choice)
{
case 1:
{
printf("请输入车的品牌:");
scanf("%s",name);
while(p!=NULL)
{
if(strcmp(p->name,name)==0)
{
printf("_________________________________________________________\n");
printf(" name colour number address price\n");
printf("%s\t%s\t%s\t%s\t%d\n\n",p->name,p->colour,p->number,p->address,p->price);
flag=1;
getch();
break;
}
p=p->next;
}
if(flag==0)
printf("抱歉,没有找到!\n");
}
break;
case 2: printf("请输入车辆型号:");
scanf("%s",number);
while(p!=NULL)
{
if(strcmp(number,p->number)==0)
{
printf("_____________________________________________________\n");
printf(" name colour number address price\n");
printf("%s\t%s\t%s\t%s\t%d\n\n",p->name,p->colour,p->number,p->address,p->price);
flag=1;
getch();
break;
}
p=p->next;
}
if(flag==0)
printf(" 抱歉,没有找到!\n");
break;
case 3: printf("请输入价格:");
scanf("%d",&price);
while(p!=NULL)
{
if(price==p->price)
{
printf("_____________________________________________________\n");
printf(" name colour number address price\n");
printf("%s\t%s\t%s\t%s\t%d\n\n",p->name,p->colour,p->number,p->address,p->price);
flag=1;
getch();
break;
}
p=p->next;
}
if(flag==0)
printf("抱歉,没有找到!\n");
break;
case 0:exit(1);break;
}
}
}
//修改信息
void modify()
{
int choice;
struct cars *head,*p;
char name[30];
char number[30];
int flag=0;
head=fileopen(); //读文件到head
p=head->next;
printf("\t\t\t 请选择您将修改的选项:\n\n");
printf("\t\t\t【1】.修改型号\n ");
printf("\t\t\t【2】.修改品牌\n ");
printf("\t\t\t【3】.修改价格\n ");
printf("\t\t\t【0】.退出!\n ");
printf("\t请选择: (0---3)");
scanf("%d",&choice);
switch(choice) //查找要修改的节点,并修改保存
{
case 1:
printf("请输入您想修改的汽车型号:\n");
scanf("%s",number);
while(p!=NULL)
{
if(strcmp(name,p->number)==0)
{
printf("请输入修改后的新型号:\n");
scanf("%s",p->number);
flag=1;
break;
}
p=p->next;
}
if(flag==0)
printf("Sorry!\n");
printf("下面是修改后的信息: _______________________________________________________\n");
printf("number name colour adress price \n");
if(flag==1)
printf("%s\t%s\t%s\t%s\t%d\n\n",p->number,p->name,p->colour,p->address,p->price);
break;
case 2:
printf(" 请输入您想修改的汽车品牌:\n");
scanf("%s",name);
while(p!=NULL)
{
if(strcmp(name,p->name)==0)
{
printf("请输入修改后的新品牌:\n");
scanf("%s",p->name);
flag=1;
break;
}
p=p->next;
}
if(flag==0)
printf("Sorry!\n");
printf("下面是修改后的信息: _______________________________________________________\n");
printf("number name colour adress price \n");
if(flag==1)
printf("%s\t%s\t%s\t%s\t%d\n\n",p->number,p->name,p->colour,p->address,p->price);
break;
case 3:
printf("请输入您想修改的汽车价格:\n");
scanf("%s",name);
while(p!=NULL)
{
if(strcmp(name,p->name)==0)
{
flushall();
printf("请输入修改后的价格:");
scanf("%d",&p->price);
flag=1;
break;
}
p=p->next;
}
if(flag==0)
printf("Sorry!\n");
printf("下面是修改后的信息: _______________________________________________________\n");
printf("number name colour adress price \n");
if(flag==1)
printf("%s\t%s\t%s\t%s\t%d\n\n",p->number,p->name,p->colour,p->address,p->price);
break;
case 0:break;
}
save_file(head);
}
//输出函数
void output(struct cars *h)
{
struct cars *s;
s= h->next; //将链表的内容全部输出
printf(" 汽车信息:\n");
while(s!=NULL)
{
printf("_________________________________________________________\n");
printf(" name\tcolour\tnumber\tadress\tprice \n");
printf("%s\t%s\t%s\t%s\t%d\n\n",s->name,s->colour,s->number,s->address,s->price);
s = s->next;
}
}
// 删除指定汽车信息
delet(struct cars *p0)
{
struct cars *p, *p1;
struct cars cars;
int choice,flag=0;
p1 = p0;
p=p0->next;
if(p==NULL)
return 0;
system("cls");
printf("\t************请输入您想删除的信息************\n");
printf(" \n");
printf(" 【1】.品牌 \n");
printf(" \n");
printf(" 【2】.生产商地址 \n");
printf(" \n");
printf(" 【3】.型号 \n");
printf(" \n");
printf(" 请选择(1--3) \n");
scanf("%d",&choice);
switch(choice)
{
case 1:
{
printf("请输入车辆品牌:\n");
scanf("%s",cars.name);
while(p!=NULL)
{
if(strcmp(p->name,cars.name)==0)
{
p0->next=p->next;
free(p);
flag=1;
break;
}
p0=p;
p=p->next;
}
break;
}
case 2:
{
printf("请输入生产商地址:\n");
scanf("%s",cars.address);
while(p!=NULL)
{
if(strcmp(p->address,cars.address)==0)
{
p0->next=p->next;
free(p);
flag=1;
break;
}
p0=p;
p=p->next;
}
break;
}
case 3:
{
printf("请输入车辆型号: \n");
scanf("%s",cars.number);
while(p!=NULL)
{
if(strcmp(p->number,cars.number)==0)
{
p0->next=p->next;
free(p);
flag=1;
break;
}
p0=p;
p=p->next;
}
break;
}
}
save_file(p1);
}
void sort(struct cars *h)
{
struct cars *p, *q, *r, t;
int choice;
system("cls");
printf(" ************ 请选择方式 ************:\n");
printf(" \n");
printf(" 【1】. 品牌 \n");
printf(" \n");
printf(" 【2】. 型号 \n");
printf(" \n");
printf(" 【3】. 生产商地址 \n");
printf(" \n");
printf(" 【4】. 价格 \n");
printf(" \n");
printf(" 请选择(1--4) \n");
scanf("%d", &choice);
switch(choice)
{
case 1:
for(p = h->next ; p; p = p->next)
for(q = p->next; q; q = q->next)
if(strcmp(p->name, q->name)>0)
{
t = *p;
*p = *q;
*q = t;
r = p->next;
p->next = q->next;
q->next =r;
}
break;
case 2:
for(p = h->next ; p; p = p->next)
for(q = p->next; q; q = q->next)
if(strcmp(p->number, q->number)>0)
{
t = *p;
*p = *q;
*q = t;
r= p->next;
p->next = q->next;
q->next = r;
}
break;
case 3:
for(p = h->next; p; p = p->next)
for(q = p->next; q; q = q->next)
if(strcmp(p->address , q->address)>0)
{
t = *p;
*p = *q;
*q = t;
r = p->next;
p->next = q->next;
q->next = r;
}
break;
case 4:
for(p = h->next; p; p = p->next)
for(q = p->next; q; q = q->next)
if(p->price > q->price)
{
t = *p;
*p = *q;
*q = t;
r = p->next;
p->next = q->next;
q->next = r;
}
break;
default:
{
printf("错误!");
break;
}
}
output(h);
}
//车辆品牌的总量
void total(struct cars *h)
{
struct cars *p;
int count=0;
p=h->next;
for(;p;p=p->next,count++);
printf("\t\t\t 车辆总量=%d\n",count);
getch();
}
void menu()
{
system("cls");
printf("\t************************************************************\n\n");
printf(" WELCOME \n\n");
printf("\t************************************************************\n");
printf("\t\t\t 【1】输入\n");
printf("\t\t\t 【2】插入 \n");
printf("\t\t\t 【3】查询 \n");
printf("\t\t\t 【4】删除 \n");
printf("\t\t\t 【5】排序 \n");
printf("\t\t\t 【6】修改 \n");
printf("\t\t\t 【7】总量 \n");
printf("\t\t\t 【8】输出 \n");
printf("\t\t\t 【9】返回 \n");
printf("\t\t\t 【0】退出 \n");
}
void jiemian()
{
int i;
char n[11];
char mima1[6];
char mima2[6];
{
system("cls");
printf("\t\t************************************************\n\n\n");
printf("\t\t 欢迎进入汽车销售管理系统 \n\n\n");
printf("\t\t************************************************\n\n\n");
printf("\t 请输入您的用户名(管理员):\n\n");
printf("\t\t________________________________________\n\n");
scanf("%s",n);
printf("\t 请输入您的密码:\n\n");
printf("\t\t________________________________________\n\n");
for(i=0;i<6;i++)
{
mima1[i]=getch();
if (mima1[i]==6)
{
mima1[i]='\0';
break;
}
printf("*");
}
printf("\t 请确认您的密码:\n\n");
printf("\t________________________________________\n\n");
for(i=0;i<6;i++)
{
mima2[i]=getch();
if(mima2[i]==6)
{
mima2[i]='\0';
break;
}
printf("*");
}
printf("\n");
}
}
void denglu()
{
jiemian();
char mima1[6];
char mima2[6];
if(strcmp(mima1,mima2)!=0)
{
system("cls");
printf("\t\t________________________________________________\n\n\n\n");
printf("\t\t 登陆成功!\n");
system("cls");
menu();
}
else
{
system("cls");
printf("\t\t 错误!请重新登陆!\n\n");
jiemian();
}
}
void main()
{
jiemian();
int c;
struct cars *head;
head = fileopen();
menu();
while(1)
{
scanf("%d",&c);
switch(c)
{
case 1:head=input();
printf("按9返回主菜单!\n");
break;
case 2:insert();
printf("按9返回主菜单! \n");
break;
case 3:serch();
printf("按9返回主菜单!\n");
break;
case 4:delet(head);
printf("按9返回主菜单!\n");
break;
case 5:sort(head);
printf("按9返回主菜单!\n");
break;
case 6:modify();
printf("按9返回主菜单!\n");
break;
case 7:total(head);
printf("按9返回主菜单!\n");
break;
case 8:head=fileopen();
output(head);
printf("按9返回主菜单!\n");
break;
case 9:
menu();
break;
case 0:
exit(1);
break;
}
}
}