C语言杂志订阅管理系统

经过一个多月和组员的努力,终于写出了我们人生中第一个系统,现将它分享在这里。希望给大家提供一些帮助。
因为自己的指针没怎么学好,所以整个编程我使用的是结构体。

头文件

自己使用的头文件较少,但都是必要的哦

#include<stdio.h>
#include<Windows.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>

结构体

结构体的元素是按照老师要求来的。

struct magazine
{
 char name[40];          //姓名
 char sex[10];           //性别
 char addr[100];          //地址
 char tel[12];           //电话号码
 float price;            //杂志单价
 int num;                //订阅数
 float total;            //总费用
 char date[30];          //截止订阅的期限
}student[20]//容纳的最大数为20

一开始定义了一个全局变量当做已经输入的人数。有一些在程序中运行不出来的,我也放到了这里。

int a,d,s;                      //定义全局变量a,表示已经输入的人数

主菜单界面

为了界面的好看,自己设计了一些东西。

int menu()                 //主菜单界面
{
 char b[80];
 int c;                 //定义整型变量
 system("cls");
 printf("\t\t\t\t\t***********************************\n");
 printf("\t\t\t\t\t       欢迎来到XX杂志订阅管理中心  \n");
 printf("\t\t\t\t\t           0.添加新的订户信息      \n");
 printf("\t\t\t\t\t           1.查找订户的信息        \n");
 printf("\t\t\t\t\t          2.删除过期的订户信息     \n");
 printf("\t\t\t\t\t       3.统计所有订户的账单信息    \n");
 printf("\t\t\t\t\t               4.退出界面          \n");
 printf("\t\t\t\t\t***********************************\n");
 do
 {
  printf("\t\t\t\t\t          请从0--4中选择您的操作: \n");
  scanf("%s",b);
  c=atoi(b);         //将字符串转换成长整型数
 }
 while(c<0||c>4);
 return c;
}

添加函数

因为是使用的结构体,所以添加部分写的很简单。每个部分我都加上了清屏函数,下面的部分我就不提了。添加完之后会返回到菜单界面。

int add()              //添加订户信息
{
 system("cls");
 for(a=0;a<20;a++)
 {
 printf("\t\t\t**************** 请输入用户信息 ****************\n");
 printf("\t\t\t请输入订户的姓名:\n");
 scanf("%s",&student[a].name);
 printf("\t\t\t请输入订户的性别:\n");
 scanf("%s",&student[a].sex);
 printf("\t\t\t请输入订户的地址:\n");
 scanf("%s",&student[a].addr);
 printf("\t\t\t请输入订户的电话号码:\n");
 scanf("%s",&student[a].tel);
 printf("\t\t\t请输入杂志单价:\n");
 scanf("%f",&student[a].price);
 printf("\t\t\t请输入订阅数:\n");
 scanf("%d",&student[a].num);
 printf("\t\t\t请输入截止订阅的期限(月):\n");
 scanf("%s",&student[a].date);
 printf("\t\t\t输入1继续添加输入0结束:\n");
 scanf("%d",&s);
 if(s==0)
 break;
 }
 menu();
 return(0);
}

查找函数

查找部分为了简便易观,写的稍微长点。这个稍微有点问题,第一遍输入它会显示没有相同姓名的用户记录。推荐先打开统计函数,再打开这个查找函数。或者你进入两边查找函数,也可以解决问题。

int find()       //查找函数
{
 int mark=0;
 int e;
 printf("\t\t\t************** 按姓名查找 **************\n");
 char name[20];
 printf("\t\t\t 请输入需要查找的姓名:\n");
 scanf("%s",&name);
 for(e=0;e<a;e++)
 {
  if(strcmp(student[e].name,name)==0)
  {
   printf("\t\t\t********** 以下是您查找的用户信息 ********\n");
   printf("\t\t\t姓名    性别 地址          电话号码       杂志单价  订阅数  订阅期限\n");
   printf("\t\t\t%s  %s   %s  %s    %f        %d       %s\n",student[e].name,student[e].sex,student[e].addr,student[e].tel,student[e].price,student[e].num,student[e].date);
   mark++;
   if((e+1)<a)
   {
    printf("\t\t\t是否继续查找相同名字的用户信息:(y/n)\n");
    if(getch()=='y' || getch()=='Y')
    {
     continue;
    }
    else
    return(0);
   }
   else
   {
    printf("\t\t\t按任意键返回主菜单");
    getch();
    return(0);
   }
  }
 }
 if(mark == 0)
 {
  printf("\t\t\t没有相同姓名的用户纪录\n");
  printf("\t\t\t按任意键返回主菜单\n");
  getch();
  return(0);
 }
 return 0;
}

删除函数

删除函数稍微麻烦一点,这个折腾了我们很久,后来参照别人的有了灵感写出来了。

void dele()    //删除函数
{
 int i,j;
 int deletemark=0;
 char phone[20];
 printf("\t\t\t请输入要删除用户电话号码:\n");
 scanf("%s",phone);
 if(a==0)
 {
  printf("\t\t\t对不起,文件中无任何纪录\n");
  printf("\t\t\t按任意键返回主菜单\n");
  getch();
  return;
 }
 for (i=0;i<a;i++)
 {
  if (strcmp(student[i].tel,phone)==0)
  {
   printf("\t\t\t以下是您要删除的用户纪录:\n");
   printf("\t\t\t姓名    性别 地址          电话号码       杂志单价  订阅数  订阅期限\n");
   printf("\t\t\t%s  %s   %s  %s    %f        %d       %s\n",student[i].name,student[i].sex,student[i].addr,student[i].tel,student[i].price,student[i].num,student[i].date);
   printf("\t\t\t是否删除?(y/n)");
   if (getch()=='y' || getch()=='Y')
   {
    for (j=i;j<a-1;j++)
     student[j]=student[j+1];
    a--;
    deletemark++;
    printf("\t\t\t删除成功\n");
    printf("\t\t\t是否继续删除?(y/n)\n");
    if (getch()=='y' || getch()=='Y')
     dele();
    return;
   }
   else
   return;
  }
  continue;
 }
 if (deletemark==0)
 {
  printf("\t\t\t没有该用户的纪录\n");
  printf("\t\t\t是否继续删除?(y/n)\n");
  if(getch()=='y' || getch()=='Y')
   dele();
  return;
 }
 return;
}

统计函数

这个很简单,利用循环把所有记录的东西显示出来即可。

void statistics()      //统计函数
{
 for(a=0;a<20;a++)
 {
  student[a].total=student[a].price*student[a].num;
 } 
 system("cls");
 printf("\t\t\t************************* 以下为通讯录所有信息**********************\n");
 printf("\t\t\t姓名    性别 地址          电话号码       杂志单价    订阅数   总费用     订阅期限\n");
 for(a=0;a<20;a++)
  printf("\t\t\t%s  %s   %s  %s    %f     %d       %f   %s\n",student[a].name,student[a].sex,student[a].addr,student[a].tel,student[a].price,student[a].num,student[a].total,student[a].date);
 printf("\t\t\t********************************************************************\n");
 getch();                        //无回显的输入字符,输入的字符不会显示
 return;
}

主函数

主函数主要就是调用以上的函数,我利用switch将它们连接起来,虽然大部分写程序都是这样,哈哈。

int main()
{
 int selectnum;
 while(1)
 {
  selectnum=menu();   //将menu函数赋给变量selectnum
  switch(selectnum)   //将selectnum变量作为switch的运行条件
  {
  case 0:
   add();
   break;
  case 1:
   find();
   break;
  case 2:
   dele();
   break;
  case 3:
   statistics();
   break;
  case 4:
   printf("\t\t\t\t\t退出成功,下次再见!\n");
   system("pause");
   getchar();
   exit(0);
  }
 }
 system("cls");
 getchar();
 return 0;
}

就是如此,这个程序是在VC++2010版本上写的,应该在其他的版本上面也能运行。
下面就是完整的源代码:

#include<stdio.h>
#include<Windows.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
struct magazine
{
 char name[40];          //姓名
 char sex[10];           //性别
 char addr[100];          //地址
 char tel[12];           //电话号码
 float price;            //杂志单价
 int num;                //订阅数
 float total;            //总费用
 char date[30];          //截止订阅的期限
}student[20];        //容纳的最大数为20
int a,d,s;                      //定义全局变量a,表示已经输入的人数
int menu()                 //主菜单界面
{
 char b[80];
 int c;                 //定义整型变量
 system("cls");
 printf("\t\t\t\t\t***********************************\n");
 printf("\t\t\t\t\t       欢迎来到XX杂志订阅管理中心  \n");
 printf("\t\t\t\t\t           0.添加新的订户信息      \n");
 printf("\t\t\t\t\t           1.查找订户的信息        \n");
 printf("\t\t\t\t\t          2.删除过期的订户信息     \n");
 printf("\t\t\t\t\t       3.统计所有订户的账单信息    \n");
 printf("\t\t\t\t\t               4.退出界面          \n");
 printf("\t\t\t\t\t***********************************\n");
 do
 {
  printf("\t\t\t\t\t          请从0--4中选择您的操作: \n");
  scanf("%s",b);
  c=atoi(b);         //将字符串转换成长整型数
 }
 while(c<0||c>4);
 return c;
}
int add()              //添加订户信息
{
 system("cls");
 for(a=0;a<20;a++)
 {
 printf("\t\t\t**************** 请输入用户信息 ****************\n");
 printf("\t\t\t请输入订户的姓名:\n");
 scanf("%s",&student[a].name);
 printf("\t\t\t请输入订户的性别:\n");
 scanf("%s",&student[a].sex);
 printf("\t\t\t请输入订户的地址:\n");
 scanf("%s",&student[a].addr);
 printf("\t\t\t请输入订户的电话号码:\n");
 scanf("%s",&student[a].tel);
 printf("\t\t\t请输入杂志单价:\n");
 scanf("%f",&student[a].price);
 printf("\t\t\t请输入订阅数:\n");
 scanf("%d",&student[a].num);
 printf("\t\t\t请输入截止订阅的期限(月):\n");
 scanf("%s",&student[a].date);
 printf("\t\t\t输入1继续添加输入0结束:\n");
 scanf("%d",&s);
 if(s==0)
 break;
 }
 menu();
 return(0);
}
int find()       //查找函数
{
 int mark=0;
 int e;
 printf("\t\t\t************** 按姓名查找 **************\n");
 char name[20];
 printf("\t\t\t 请输入需要查找的姓名:\n");
 scanf("%s",&name);
 for(e=0;e<a;e++)
 {
  if(strcmp(student[e].name,name)==0)
  {
   printf("\t\t\t********** 以下是您查找的用户信息 ********\n");
   printf("\t\t\t姓名    性别 地址          电话号码       杂志单价  订阅数  订阅期限\n");
   printf("\t\t\t%s  %s   %s  %s    %f        %d       %s\n",student[e].name,student[e].sex,student[e].addr,student[e].tel,student[e].price,student[e].num,student[e].date);
   mark++;
   if((e+1)<a)
   {
    printf("\t\t\t是否继续查找相同名字的用户信息:(y/n)\n");
    if(getch()=='y' || getch()=='Y')
    {
     continue;
    }
    else
    return(0);
   }
   else
   {
    printf("\t\t\t按任意键返回主菜单");
    getch();
    return(0);
   }
  }
 }
 if(mark == 0)
 {
  printf("\t\t\t没有相同姓名的用户纪录\n");
  printf("\t\t\t按任意键返回主菜单\n");
  getch();
  return(0);
 }
 return 0;
}
void dele()    //删除函数
{
 int i,j;
 int deletemark=0;
 char phone[20];
 printf("\t\t\t请输入要删除用户电话号码:\n");
 scanf("%s",phone);
 if(a==0)
 {
  printf("\t\t\t对不起,文件中无任何纪录\n");
  printf("\t\t\t按任意键返回主菜单\n");
  getch();
  return;
 }
 for (i=0;i<a;i++)
 {
  if (strcmp(student[i].tel,phone)==0)
  {
   printf("\t\t\t以下是您要删除的用户纪录:\n");
   printf("\t\t\t姓名    性别 地址          电话号码       杂志单价  订阅数  订阅期限\n");
   printf("\t\t\t%s  %s   %s  %s    %f        %d       %s\n",student[i].name,student[i].sex,student[i].addr,student[i].tel,student[i].price,student[i].num,student[i].date);
   printf("\t\t\t是否删除?(y/n)");
   if (getch()=='y' || getch()=='Y')
   {
    for (j=i;j<a-1;j++)
     student[j]=student[j+1];
    a--;
    deletemark++;
    printf("\t\t\t删除成功\n");
    printf("\t\t\t是否继续删除?(y/n)\n");
    if (getch()=='y' || getch()=='Y')
     dele();
    return;
   }
   else
   return;
  }
  continue;
 }
 if (deletemark==0)
 {
  printf("\t\t\t没有该用户的纪录\n");
  printf("\t\t\t是否继续删除?(y/n)\n");
  if(getch()=='y' || getch()=='Y')
   dele();
  return;
 }
 return;
}
void statistics()      //统计函数
{
 for(a=0;a<20;a++)
 {
  student[a].total=student[a].price*student[a].num;
 } 
 system("cls");
 printf("\t\t\t************************* 以下为通讯录所有信息**********************\n");
 printf("\t\t\t姓名    性别 地址          电话号码       杂志单价    订阅数   总费用     订阅期限\n");
 for(a=0;a<20;a++)
  printf("\t\t\t%s  %s   %s  %s    %f     %d       %f   %s\n",student[a].name,student[a].sex,student[a].addr,student[a].tel,student[a].price,student[a].num,student[a].total,student[a].date);
 printf("\t\t\t********************************************************************\n");
 getch();                        //无回显的输入字符,输入的字符不会显示
 return;
}
int main()
{
 int selectnum;
 while(1)
 {
  selectnum=menu();   //将menu函数赋给变量selectnum
  switch(selectnum)   //将selectnum变量作为switch的运行条件
  {
  case 0:
   add();
   break;
  case 1:
   find();
   break;
  case 2:
   dele();
   break;
  case 3:
   statistics();
   break;
  case 4:
   printf("\t\t\t\t\t退出成功,下次再见!\n");
   system("pause");
   getchar();
   exit(0);
  }
 }
 system("cls");
 getchar();
 return 0;
}

没有思路的学弟学妹们,可以来看看哦,嘿嘿。

  • 35
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值