C语言程序设计报告?
前言
我们学习C语言课程设计的主要目的是为了了解和熟悉C语言的编程。学习C语言要经过一个“理论→实践→在理论→在实践”的过程。而学习C语言课程设计就是要我们进行实践,从中发现问题,解决问题,提高我们运用C语言的能力。是我们能够运用C语言解决一些问题。通过不断的编程,熟能生巧,是我们的理论学习也有了实践基础,学习理论知识就较为容易一些,然后再通过实践不断的提高,如此良性循环就能是我们的C语言编程能力更上一成楼。
正文
一.题目原文
杂志订阅管理软件
[要求]
使用计算机对一种杂志的订阅进行管理,该杂志拥有的最多用户不超过10人,每个订户信息包括:姓名,性别,地址,电话号码,杂志单价,订阅数,订阅期限(××年××月)。
现要求用菜单选择并完成下述功能。
(1)增加新订户,即将订户的全部信息输进到文件中。
(2)根据当天的日期对订户文件进行查询,删除以到期的订户记录。
(3)统计本期杂志订户数并打印运算结果。
二.题目的分析
本题主要是要求我编一个程序来管理订阅,包括增加和删除用户记录,统计运算结果。增加用户就是在原有的文件中写入一个新的用户信息,但有一个前提就是用户数不能超过10人。删除以到期的用户,就是从原有的文件中去掉一个用户信息,这里需要把日期与当天的日期进行比较,而统计结果就是把文件中的用户进行统计,并输出。
三.整体设计和板块划分
本程序总思路
本程序有一个主函数和三个被调函数,三个被调函数分别解决增加新订户,删除订户记录,统计订户信息打印运算结果三个问题。
板块划分:
1. 主要的结构体为magzine,他包括用户的基本信息:姓名,性别,地址,电话号码,单价,订阅数和期限。全局变量为结构体变量mag。主函数用的是switch语句,3个结果分别对应3个函数,便于操作。
2. 被调函数1,解决增加新用户的问题。先打开文件,要判断用户数是否超过10,然后将新的用户信息写入文件中,这里用的是do……while语句对文价进行读和写,读文件需要计算出订户数,并判断。写即是写入新订户。
3. 被调函数2,解决删除订户记录的问题。进行文件的读出操作,并输入当天的日期,用strcmp语句与定户信息中的期限进行比较,如果订户信息中的期限与当日的期限相同,那么在写文件时,该订户的记录就不用写入了,反之,就应当写入。这样变完成了删除操作了。
4. 被调函数3,统计用户信息并打印运算结果。这里主要是进行文件的读和写,运用if语句完成,统计结果即是根据单价和数量算出总价格并把所有的价格求和即可。然后只需输出用户的姓名,订阅数,单价和金额
流程图
1.增订新用户模块
struct magazine mag;
int n=0;
void insert(struct magazine mag)
{
FILE *fp;
char ch;
if((fp=fopen("E:\\magazine","w"))==NULL)
{
printf("此文件不存在");
exit(0);
}
do
{
if(n<10)
{
printf("请输入姓名:");gets(mag.name);
printf("请输入性别:");gets(mag.sex);
printf("请输入地址:");gets(mag.address);
printf("请输入电话号码:");gets(mag.tel);
printf("请输入订阅期限:");gets(mag.dataline);
printf("请输入杂志单价:");scanf("%f",&mag.price);
printf("请输入订阅数:");scanf("%d",&mag.mount);
fwrite(&mag,sizeof(struct magazine),1,fp);
n++;
}
else printf("用户已满");
printf("是否还有新订户?");
scanf("%c",&ch);
system("cls");
}while(ch=='y'||ch=='Y');
fclose(fp);
}
2. 删除过期用户模块
void del()
{
struct magazine mag;
FILE *fp,*fp1;
char datatime[8];
int m;
if((fp=fopen("E:\\magazine","r"))==NULL)
{
printf("此文件不存在");
exit(0);
}
printf("请输入当天日期:");
gets(datatime);
while(fread(&mag,sizeof(struct magazine),1,fp)==1)
{
m=strcmp(datatime,mag.dataline);
if(m<1)
{
if((fp1=fopen("E:\\magazine1","a"))==NULL)/*将没有过期的用户写入新的文件中*/
{
printf("此文件不存在");
exit(0);
}
fwrite(&mag,sizeof(struct magazine),1,fp1);
fclose(fp1);
}
else n--;
}
fclose(fp);
}
3. 统计本期杂志订户信息模块
void total()
{
struct magazine mag;
FILE *fp;
float totalprice;
int totalmount=0;
float price1;
float sum=0.0;
if((fp=fopen("E:\\magazine1","r"))==NULL)
{
printf("此文件不存在");
exit(0);
}
printf("订户名\t订阅数\t单价\t金额\n");
while(fread(&mag,sizeof(struct magazine),1,fp)==1)
{
totalmount+=mag.mount;
price1=mag.price;
totalprice=mag.mount*mag.price;
sum+=totalprice;
printf("%s\t%d\t%3.2f\t%3.2f\n",mag.name,mag.mount,mag.price,totalprice);
}
printf("合计\t%d\t%3.2f\t%3.2f\n",totalmount,price1,sum);
fclose(fp);
}
运行结果:
1. 增加新订户
2. 擅长到期用户
3. 统计订户数
用户姓名 订阅数 单价 金额
华进 3 5.03 15.09
宋选 2 5.03 10.06
李成龙 5 5.03 25.15
合计 10 5.03 50.30
运行与测试报告
下面是个模块的的界面
(一)主菜单
(二)增加新订户模块
(三)删除到期用户信息
(三)删除到期用户
(四)统计订户信息
后记
课程设计过程中遇到的问题以及解决方法
刚开始那到这个题目的时候,感到一片茫然,不知道如何下手。前面的C语言实习似乎还没让我找到感觉。结果就产生了一些错误的念头,便从网上搜索出来一些相关的程序,结果运行时出现了很多错误,漏洞百出。后来认识到这样做不对,不仅投机取巧,还对我的程序设计能力没有一点提高。但是还给了我许多提示。让我有了一定的思路了。在设计程序的过程中,用到被调函数,我经常将整体变量和局部变量混淆,以致在运行时无法满足要求。于是看前面的温故知新逐渐分清了一些概念才将这个问题解决。还有在写完程序后,出现了100多个错误,当时我看着就不想改了,后来才发现数字只是表面,通过不断的修改,错误变少的很快。
课程设计的体会
学习和练习C程序的设计是一个漫长的过程,这几天的学习只是让我们接触到了C语言程序设计,只是肤浅的了解了它的一些基本操作,我们学习C语言需要不断的练习积累才能使我们的水平提高,虽然学习C语言有时很枯燥,我们需要认真的对待它,虽然编写一个程序需要很长的时间,因此我们需要耐心,最重要的是,我们需要独立的思考和编写程序。这样才能提高我们的C语言设计的能力,更好的运用它解决一些问题。
附录
源程序:
#include
#include
#include
#include
struct magazine{
char name[20];
char sex[4];
char address[30];
char tel[11];
float price;
int mount;
char dataline[8];
};
struct magazine mag;
int n=0;/*用户计数器*/
void insert(struct magazine mag)/*增订新用户*/
{
FILE *fp;
char ch;
if((fp=fopen("E:\\magazine","w"))==NULL)
{
printf("此文件不存在");
exit(0);
}
do
{
if(n<10)
{
printf("请输入姓名:");gets(mag.name);
printf("请输入性别:");gets(mag.sex);
printf("请输入地址:");gets(mag.address);
printf("请输入电话号码:");gets(mag.tel);
printf("请输入订阅期限:");gets(mag.dataline);
printf("请输入杂志单价:");scanf("%f",&mag.price);
printf("请输入订阅数:");scanf("%d",&mag.mount);
fwrite(&mag,sizeof(struct magazine),1,fp);
n++;
}
else printf("用户已满");
printf("是否还有新订户?");
scanf("%c",&ch);
system("cls");
}while(ch=='y'||ch=='Y');
fclose(fp);
}
void del()/*删除过期用户*/
{
struct magazine mag;
FILE *fp,*fp1;
char datatime[8];
int m;
if((fp=fopen("E:\\magazine","r"))==NULL)
{
printf("此文件不存在");
exit(0);
}
printf("请输入当天日期:");
gets(datatime);
while(fread(&mag,sizeof(struct magazine),1,fp)==1)
{
m=strcmp(datatime,mag.dataline);
if(m<1)
{
if((fp1=fopen("E:\\magazine1","a"))==NULL)/*将没有过期的用户写入新的文件中*/
{
printf("此文件不存在");
exit(0);
}
fwrite(&mag,sizeof(struct magazine),1,fp1);
fclose(fp1);
}
else n--;
}
fclose(fp);
}
void total()/*统计本期杂志订户数*/
{
struct magazine mag;
FILE *fp;
float totalprice;
int totalmount=0;
float price1;
float sum=0.0;
if((fp=fopen("E:\\magazine1","r"))==NULL)
{
printf("此文件不存在");
exit(0);
}
printf("订户名\t订阅数\t单价\t金额\n");
while(fread(&mag,sizeof(struct magazine),1,fp)==1)
{
totalmount+=mag.mount;
price1=mag.price;
totalprice=mag.mount*mag.price;
sum+=totalprice;
printf("%s\t%d\t%3.2f\t%3.2f\n",mag.name,mag.mount,mag.price,totalprice);
}
printf("合计\t%d\t%3.2f\t%3.2f\n",totalmount,price1,sum);
fclose(fp);
}
void main()
{
int ch;
char ch1;
do
{
printf("1.增加新订户\n");
printf("2.删除到期用户\n");
printf("3.统计订户数\n");
scanf("%d",&ch);getchar();
switch(ch)
{
case 1:insert(mag);break;
case 2:del();break;
case 3:total();break;
default:printf("输入有误!");break;
}
printf("是否继续其他操作?");
scanf("%c",&ch1);
system("cls");
}while(ch1=='y'||ch1=='Y');
}