C语言课程设计报告模版

西安郵電學院

C语言课程设计报告

  目:  《职工信息管理系统》

院系名称:    通信与信息工程学院

    专业名称:    信息工程

    级:    **

    学生姓名:    **

学号(8位): **

指导教师:    **

设计起止时间:20##年06月13日~20##年06月22日


一.  设计目的

    加深对《程序设计》课程所学的理解,进一步巩固c语言知识,学会独立完成一定规模的系统编写,深化知识,学以致用

. 设计内容

在熟练掌握C语言的基本知识,例如:数据类型(包括整形、实型、字符型、指针、数组、结构等);运算类型(包括算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(包括顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用)等的同时。进一步掌握各种函数的应用,包括时间函数、绘图函数,以及文件的读写操作等。

三.概要设计

1.              功能模块图;

 (1)主函数main                  (8)查询信息模块

(2)密码模块                    (9)按姓名查询模块

 (3)进入菜单函数                (10)按职称查询模块

(4)录入信息模块                (11)排序模块

(5)删除信息模块                (12)按姓氏首字母排序

(6)修改信息模块                (13)按基本工资排序

(7)退出系统模块                (14)添加信息模块

 (15)保存文件模块

2.各个模块详细的功能描述。

A.录入职工信息,首先确定录入人数,按步骤输入职工信息(工号、姓名、职称、基本工资、奖金、实际工资、生日、学历、电话、地址)

B.浏览职工信息,按照录入信息依次显示

C.修改职工信息,输入要修改职工姓名,选择要修改的信息

D.删除职工信息,输入要修改职工姓名,确认后生效

E.查询职工信息,选择输入姓名或职称,显示职工信息

F.职工信息排序,选择排序方式,一种按照姓氏首字母,另一种按基本工资

G.添加职工信息,首先确定添加人数,按步骤输入职工信息

H.退出系统

  组织结构图          

四.详细设计

1.功能函数的调用关系图;

2.各功能函数的数据流程图;

3.重点设计及编码。

头文件#include <stdio.h>

#include <windows.h>

#include <string.h>

数据类型

struct worker

{

int num;

char name[100];

char zhicheng[50]; 

int wages;

int reward;

long birth;

int salary;

char xueli[50];

char tele[50];

char address[50];

}work[500],work1;                /*定义结构体*/

函数说明

void main();                     //主函数

void menu();                   //声明菜单函数

void type_in();                  //声明录入函数

void baocun(int);                //声明保存函数

void scan();                    //声明浏览函数

void del();                     //声明删除函数

void search();                  //声明查询函数

void search_zhicheng();          //声明按职称查询函数

void search_name();             //声明按姓名查找函数

void change();                  //声明修改函数

void order();                   //声明排序函数

void order_wages();             //声明按工资排序

void order_name();              //声明按姓名(首字母顺序)排序

void add();                     //声明添加函数

五.测试数据及运行结果

1.正常测试数据(3组)及运行结果;

2.非正常测试数据(2组)及运行结果。

六.调试情况,设计技巧及体会

1.对自己的设计进行评价,指出合理和不足之处,提出改进方案.

基本完成课程设计要求,设计简炼,可读性强,但是职工信息不够全面,要达到用户满意还有许多需要完善之处,同时如果采用链表的方法,增加密码难度,层次会高些

2.对设计及调试过程的心得体会。

在本程序的设计过程中深刻体会到了程序是建立在数据结构之上的。程序中的所有算法都要围绕着自己所定义的抽象数据类型来设计。由此可见在设计程序时,定义一个好的数据结构尤为重要。在此程序设计过程中也增强了对一些算法的了解以及运用。但是也发现了自己还有很多不足的地方,要求自己在以后的学习中加以改正和提高。

七.参考文献
《c语言程序设计》(王曙燕,科学出版社 )

八.附录:源代码(电子版)

#include <stdio.h>

#include <windows.h>

#include <string.h>

struct worker

{

int num;

char name[100];

char zhicheng[50]; 

int wages;

int reward;

long birth;

int salary;

char xueli[50];

char tele[50];

char address[50];

}work[500],work1;                /*定义结构体*/

void menu();                     //声明菜单函数

void type_in();                  //声明录入函数

void baocun(int);                //声明保存函数

void scan();                     //声明浏览函数

void del();                      //声明删除函数

void search();                   //声明查询函数

void search_zhicheng();          //声明按职称查询函数

void search_name();              //声明按姓名查找函数

void change();                   //声明修改函数

void order();                    //声明排序函数

void add();                      //声明添加函数

void order_wages();

void order_name();

void menu()                      /*菜单函数*/

{

    printf("\n");

    printf("                        欢迎进入                              \n");

 printf("                       职工信息管理系统                           ");

 printf("******************************************************************************\n");

    printf("           1.录入职工信息\n");

    printf("           2.浏览职工信息\n");

    printf("           3.查询职工信息\n");

    printf("           4.删除职工信息\n");

    printf("           5.修改职工信息\n");

 printf("              6.职工信息排序\n");

    printf("           7.添加职工信息\n");

    printf("           8.退出\n");

 printf("*******************************************************************************\n");

    printf("\n");

   

}

/********************************************************************************************/

void main()

{  

 

   int n,f,count=0;

   int  key=1234;

   for(count=0;count<3;count++)

   {

       printf("为了验证合法身份,请输入通行密码(4位):"); 

       scanf("%d",&key);

    if(key==1234)break;

       else             

       continue;  

   }

 if(count==3)

 {printf("错误数达到最大,按任意按键退出\n");

       system("pause");

        exit(-1);

 }

while(1)

{

    do

       {  

             

               

       

         menu(); /*调用菜单函数*/

    printf("请输入你需要操作的序号(1-8):\n");

         scanf("%d",&n);

         if(n>=1&&n<=8)

         {

         f=1;

         break;

         }

           else

         {

        f=0;

   

     printf("您输入有误,请重新选择!");

    }

}while(f==0);

  

      switch(n)

          {

       case 1:printf("               录入职工信息\n");printf("\n");type_in();break;

       case 2:printf("               浏览职工信息\n");printf("\n");system("cls");scan();break;

       case 3:printf("               查询职工信息\n");printf("\n");system("cls");search();break;

       case 4:printf("               删除职工信息\n");printf("\n");system("cls");del();break;

       case 5:printf("               修改职工信息\n");printf("\n");system("cls");change();break;

    case 6:printf("               职工信息排序\n");printf("\n");system("cls");order();break;

    case 7:printf("               添加职工信息\n");printf("\n");system("sls");add();break;

    case 8:goto loop ;/*用goto语句跳至跳至指定的行*/

       default :break                                                                                     ;

          }

 

}

loop://行标

   system("cls");  

   printf("\n\n\n\n\n\n --------------------------谢谢使用!祝您工作顺利--------------------------\n\n\n\n\n\n");

}

/***********************************************************************************/

void type_in()   /*录入函数*/

{

   int i,m,t1,t2;

   printf("请输入需要创建信息的职工人数(1--500):\n");

   scanf("%d",&m);

   for (i=0;i<m;i++)

   {

  printf("请输入职工号: ");

  scanf("%d",&work[i].num); 

     printf("\n");

     printf("请输入姓名:  ");

  scanf("%s",work[i].name);

  getchar();

  printf("请输入职称:0.职员1.主任 2.经理3.总监 4.董事长 ");

  printf("请输入序号(0-4):");

  scanf("%d",&t1);

  if(t1==0)strcpy(work[i].zhicheng,"职员");

  if(t1==1)strcpy(work[i].zhicheng,"主任");

  if(t1==2)strcpy(work[i].zhicheng,"经理");  

  if(t1==3) strcpy(work[i].zhicheng,"总监");

  if(t1==4) strcpy(work[i].zhicheng,"董事长");

  printf("请输入基本工资:  ");

  scanf("%d",&work[i].wages);

  printf("请输入奖金:  ");

  scanf("%d",&work[i].reward);

  printf("请输入生日(格式如19900101):  ");

  scanf("%d",&work[i].birth);

  printf("请输入学历:1.高中2.大学 3.硕士 4.博士 ");

  printf("请输入序号(1-4):");

  scanf("%d",&t2);

  if(t2==1)strcpy(work[i].xueli,"高中");

  if(t2==2)strcpy(work[i].xueli,"大学");  

  if(t2==3) strcpy(work[i].xueli,"硕士");

  if(t2==4) strcpy(work[i].xueli,"博士");     

  printf("请输入电话:");

  scanf("%s",work[i].tele );

  printf("请输入地址:");

  scanf("%s",work[i].address);

  getchar();system("cls");

   printf("\n一个职工的信息档案创建完毕!请输入下一个职工的信息\n");    

  work[i].salary=work[i].wages + work[i].reward;

  printf("\n");

   

   }

      baocun(m);

}

/***************************************************************************/

void baocun(int m)  /*保存文件函数*/

{

   int i;

   FILE *fp;

   if ((fp=fopen("E:\\worker_list.txt","wb"))==NULL)  /*创建文件并判断是否能打开*/

   {

     printf ("此文件不能打开\n");

     exit(0);

   }

   for (i=0;i<m;i++) /*将内存中职工的信息输出到磁盘文件中去*/

   if (fwrite(&work[i],sizeof(struct worker),1,fp)!=1)

   printf("file write error\n");

   fclose(fp);

}

/***************************************************************************/

int load()  /*导入函数*/

{

     FILE*fp;

     int i=0;

     if((fp=fopen("E:\\worker_list.txt","rb"))==NULL)

         {

     printf ("cannot open file\n");

     exit(0);

         }

else

{

  do

  {

        fread(&work[i],sizeof(struct worker),1,fp);

        i++;

  }

  while(feof(fp)==0);

}

fclose(fp);

return(i-1);

}

  

/*******************************************************************************/

void scan()  /*浏览函数*/

{

int i;

int m=load();

printf("\n职工号\t姓名\t职称\t基本工资\t奖金\t实际工资\t生日\t学历\t电话\t地址             \n");

for(i=0;i<m;i++)

     printf("\n %d\t%s\t%s\t%d\t %d\t%d\t%ld\t%s\t%s\t%s\n",work[i].num,work[i].name,

  work[i].zhicheng,work[i].wages,work[i].reward,work[i].salary,work[i].birth,work[i].xueli,work[i].tele,work[i].address );

printf("按任意键继续\n");

getchar();

getchar();system("cls");

}

/********************************************************************************/

void del()   /*删除函数*/

{

 

    int m=load();

int i,j,n,t,f;

char name1[10];

printf("\n 原来的职工信息:\n");

    scan();   /* 调用浏览函数*/

    printf("\n");

printf("请输入要删除的职工的姓名:\n");

scanf("%s",name1);

for(f=1,i=0;f&&i<m;i++)

{

  if(strcmp(work[i].name,name1)==0)

  {

   printf("\n已找到此人,原始记录为:\n");

            printf("\n职工号\t姓名\t职称\t基本工资\t奖金\t实际工资\t生日\t学历\t电话\t地址             \n");

     printf("\n %d\t%s\t%s\t%d\t %d\t%d\t%ld\t%s\t%s\t%s \n",work[i].num,work[i].name,

  work[i].zhicheng,work[i].wages,work[i].reward,work[i].salary,work[i].birth,work[i].xueli,work[i].tele,work[i].address  );                                                                                                           

            printf("\n确实要删除此人信息请按1,不删除请按0\n");

   scanf("%d",&n);

            if(n==1)   /*如果删除,则其他的信息都向前移一行*/

   {

     for(j=i;j<m-1;j++)

     {

       work[j]=work[j+1];

            

     }

    f=0;

   }

  }

}

if(!f)

    m=m-1;

else

    printf("\n对不起,查无此人!\n");

    printf("\n 浏览删除后的所有职工信息:\n");

    baocun(m);     /*调用保存函数*/

    scan();  /*调用浏览函数*/

printf("\n继续删除请按1,不再删除请按0\n");

scanf("%d",&t);

switch(t)

{

    case 1:del();break;

    case 0:break;

    default :break;

}system("cls");

}

/**********************************************************************************/

void search()/*查询函数*/

{

    int t,f;

do

{

    printf("\n按姓名查询请按1 ; 按职称查询请按2 ; 进入主函数按3\n");

    scanf("%d",&t);

    if(t>=1&&t<=3)

    {

    f=1;

    break;

    }

    else

    {

   f=0;

   printf("您输入有误,请重新选择!");

    }

}while(f==0);system("cls");

    while(f==1)

{

    switch(t)

    {

     case 1:printf("按姓名查询\n");search_name();break;

     case 2:printf("按职称查询\n");search_zhicheng();break;

  case 3:main();break;

     default:break;

    }

    system("cls");   

}

}

/***********************************************************************************/

void search_name()/*按姓名查找函数*/

{

  char name1[10];

  int i,t;

  int m=load();

  printf("请输入要查找的姓名:\n");

  scanf("%s",name1);

  for(i=0;i<m;i++)

    if(strcmp(name1,work[i].name)==0)

    printf("\n已找到此人,其记录为:\n");

       printf("\n职工号\t姓名\t职称\t基本工资\t奖金\t实际工资\t生日\t学历\t电话\t 地址            \n");

     printf("\n %d\t%s\t%s\t%d\t %d\t %d\t%ld\t%s\t%s\t%s\n",work[i].num,work[i].name,

  work[i].zhicheng,work[i].wages,work[i].reward,work[i].salary,work[i].birth,work[i].xueli,work[i].tele,work[i].address);

    break;

}

   if(i==m) 

    printf("\n对不起,查无此人\n");

   printf("\n");

   printf("返回查询函数请按1,继续查询职工号请按2\n");

   scanf("%d",&t);

   switch(t)

   {

   case 1:search();break;

      case 2: break;

   default:break;

   }

}

 

 

/*************************************************************************************/

void search_zhicheng()/*按职称查找函数*/

{

  char zhicheng1[10];

  int i,t;

  int m=load();

  printf("请输入要查找的职称:\n");

  scanf("%s",zhicheng1);

  for(i=0;i<m;i++)

    if(strcmp(zhicheng1,work[i].zhicheng)==0)

    printf("\n已找到此人,其记录为:\n");

       printf("\n职工号\t姓名\t职称\t基本工资\t奖金\t实际工资\t生日 \t学历\t电话\t 地址            \n");

     printf("\n %d\t%s\t%s\t%d\t%d\t%d\t%ld\t%s\t%s\t%s\n",work[i].num,work[i].name,

  work[i].zhicheng,work[i].wages,work[i].reward,work[i].salary,work[i].birth,work[i].xueli,work[i].tele,work[i].address);

    break;

}

   if(i==m) 

    printf("\n对不起,查无此人\n");

   printf("\n");

   printf("返回查询函数请按1,继续查询职工号请按2\n");

   scanf("%d",&t);

   switch(t)

   {

   case 1:search();break;

      case 2: break;

   default:break;

   }

}

/***************************************************************************************/

void change()  /*修改函数*/

{

int num;

char name[20];

char zhicheng[50]; 

int wages;

int reward;

int birth;

int salary;

char xueli[50];

char tele[50];

char address[50];

int b,c,i,n,t1,t2,f,T;

int m=load();                                      /*导入文件内的信息*/

    printf("\n 原来的职工信息:\n");

    scan();                                      /* 调用浏览函数*/

    printf("\n");

    printf("请输入要修改的职工的姓名:\n");

scanf("%s",name);

for(f=1,i=0;f&&i<m;i++)

{

  if(strcmp(work[i].name,name)==0)

  {

   printf("\n已找到此人,原始记录为:\n");

            printf("\n职工号\t姓名\t职称\t基本工资\t奖金\t实际工资\t生日 \t学历\t电话 \t 地址            \n");

     printf("\n %d\t%s\t%s\t%d\t %d\t%d\t%ld\t%s\t%s\t%s\n",work[i].num,work[i].name,

  work[i].zhicheng,work[i].wages,work[i].reward,work[i].salary,work[i].birth,work[i].xueli,work[i].tele,work[i].address);

            printf("\n确实要修改此人信息请按1 ; 不修改请按0\n");

   scanf("%d",&n);

            if(n==1)

                        {

               printf("\n需要进行修改的选项\n 1.职工号 2.姓名 3.职称 4.基本工资 5.奖金  6.生日 7.实际工资 8.学历9.电话 10.地址\n"); 

               printf("请输入你想修改的那一项序号:\n"); 

               scanf("%d",&c); 

               if(c>7||c<1) 

               printf("\n选择错误,请重新选择!\n");                                                                 

                        }

         f=0;

  }

       

}

    if(f==1)

    printf("\n对不起,查无此人!\n"); 

    do 

        {

       switch(c)      /*因为当找到第i个职工时,for语句后i自加了1,所以下面的应该把改后的

信息赋值给第i-1个人*/

           { 

           case 1:printf("职工号改为: ");

                  scanf("%d",&num);

                  work[i-1].num=num;

                break; 

              case 2:printf("姓名改为: ");

         scanf("%s",name);

        strcpy(work[i-1].name,name);

         break;

     case 3:

    printf("职称改为:0.职员1.主任 2.经理3.总监 4.董事长 ");

      printf("请输入序号(0-4):");

        scanf("%d",&t1);

       if(t1==0)strcpy(work[i-1].zhicheng,"职员");

       if(t1==1)strcpy(work[i-1].zhicheng,"主任");

       if(t1==2)strcpy(work[i-1].zhicheng,"经理");  

       if(t1==3) strcpy(work[i-1].zhicheng,"总监");

       if(t1==4) strcpy(work[i-1].zhicheng,"董事长");

          

         break;

           case 4:printf("基本工资改为: ");

         scanf("%d",&wages);

                  work[i-1].wages=wages;

      break; 

           case 5:printf("奖金改为: ");

         scanf("%d",&reward);

                  work[i-1].reward=reward;

      break;  

           case 6:printf("生日改为: ");            

         scanf("%ld",&birth);

                  work[i-1].birth=birth;

      break; 

           case 7:printf("实际工资改为: ");

         scanf("%d",&salary);

                  work[i-1].salary=salary;

      break; 

                 case 8:

           printf("学历改为:1.高中2.大学 3.硕士 4.博士 ");

           printf("请输入序号(1-4):");

           scanf("%d",&t2);

           if(t2==1)strcpy(work[i-1].xueli,"高中");

           if(t2==2)strcpy(work[i-1].xueli,"大学");  

           if(t2==3) strcpy(work[i-1].xueli,"硕士");

           if(t2==4) strcpy(work[i-1].xueli,"博士"); 

                

         break;

                 case 9:printf("电话改为:");

              scanf("%s",tele);

                        strcpy(work[i-1].tele,tele);

      break;

                 case 10:printf("地址改为:");

         scanf("%s",address);

                        strcpy(work[i-1].address,address);

  }

        printf("\n");

  printf("\n是否确定所修改的信息?\n 是 请按1 ; \n不,重新修改 请按2:  \n");

        scanf("%d",&b);

  

   while(b==2);

   printf("\n浏览修改后的所有职工信息:\n");

   printf("\n");

   baocun(m);

   scan();

   printf("\n继续修改请按1,不再修改请按0\n");

   scanf("%d",&T);

   switch(T)

{

    case 1:change();break;

    case 0:break;

    default :break;

}system("cls");

}

/*************************************************************************************/

   void order()/*排序函数*/

   {

 

  int k,f;

do

{

    printf("\n按姓名排序请按1 ; 按基本工资排序请按2 ; 进入主函数按3\n");

    scanf("%d",&k);

    if(k>=1&&k<=3)

    {

    f=1;

    break;

    }

    else

    {

   f=0;

   printf("您输入有误,请重新选择!");

    }

}while(f==0);system("cls");

  

    while(f==1)

{

    switch(k)

    {

     case 1:printf("\n按姓名排序为(字母由小到大排列):\n");order_name();break;

     case 2:printf("\n按基本工资排序为(由高到低排列):\n");order_wages();break;

     case 3:system("cls");main();break;

     default:break;

    }

    system("cls");   

}

   }

/*************************************************************************************/

void order_name()/*按姓名排序函数*/

{

int i,j,k;

  int m=load();

  for(i=0;i<m-1;i++)

   for(j=0;j<m-1-i;j++)/*起泡法排序*/

   if(strcmp(work[j].name,work[j+1].name)>0)

   {  work1=work[j];work[j]=work[j+1];work[j+1]=work1;}

   baocun(m);

printf("\n职工号\t姓名\t职称\t基本工资\t奖金\t实际工资\t生日 \t学历\t电话\t 地址             \n");

for(j=0;j<m;j++)

     printf("\n %d\t%s\t%s\t%d\t %d\t%d\t%ld\t%s\t%s\t%s\n",work[j].num,work[j].name,

  work[j].zhicheng,work[j].wages,work[j].reward,work[j].salary,work[j].birth,work[j].xueli,work[j].tele,work[j].address  );

printf("返回排序函数请按1,返回主菜单请按2\n");

   scanf("%d",&k);

   switch(k)

   {

   case 1:order();break;

      case 2:system("cls"); main();break;

   default:break;

   }system("cls");

}

/************************************************************************************/

void order_wages()/*按基本工资排序函数*/

{

int i,k,j;

  int m=load();

  for(i=0;i<m-1;i++)

   for(j=0;j<m-1-i;j++)

   if(work[j].wages<work[j+1].wages)/*用冒泡法排序*/

   {  work1=work[j];work[j]=work[j+1];work[j+1]=work1;}

   baocun(m);

printf("\n职工号\t姓名\t职称\t基本工资\t奖金\t实际工资\t生日\t学历\t电话\t地址             \n");

for(j=0;j<m;j++)

     printf("\n %d\t%s\t%s\t%d\t %d\t%d\t      %ld\t%s\t%s\t%s\n",work[j].num,work[j].name,

  work[j].zhicheng,work[j].wages,work[j].reward,work[j].salary,work[j].birth,work[j].xueli,work[j].tele,work[j].address   );

printf("返回排序函数请按1,返回主菜单请按2\n");

   scanf("%d",&k);

   switch(k)

   {

   case 1:order();break;

      case 2:system("cls"); main();break;

   default:break;

   }system("cls");

}

/***********************************************************************************/

void add()   /*添加函数*/

{  int n=load();

 int i,m,t1,t2;

   printf("请输入需要添加信息的职工人数\n");

   scanf("%d",&m);

   for (i=n;i<m+n;i++)

   {

  printf("请输入职工号: ");

  scanf("%d",&work[i].num); 

     printf("\n");

     printf("请输入姓名:  ");

  scanf("%s",work[i].name);

 

  printf("请输入职称:0.职员1.主任 2.经理3.总监 4.董事长 ");

  printf("请输入序号(0-4):");

  scanf("%d",&t1);

  if(t1==0)strcpy(work[i].zhicheng,"职员");

  if(t1==1)strcpy(work[i].zhicheng,"主任");

  if(t1==2)strcpy(work[i].zhicheng,"经理");  

  if(t1==3) strcpy(work[i].zhicheng,"总监");

  if(t1==4) strcpy(work[i].zhicheng,"董事长");  

 

  printf("请输入基本工资:  ");

  scanf("%d",&work[i].wages);

  printf("请输入奖金:  ");

  scanf("%d",&work[i].reward);

  printf("请输入生日(格式如19900101):  ");

  scanf("%d",&work[i].birth);

  printf("请输入学历:1.高中2.大学 3.硕士 4.博士 ");

  printf("请输入序号(1-4):");

           scanf("%d",&t2);

           if(t2==1)strcpy(work[i].xueli,"高中");

           if(t2==2)strcpy(work[i].xueli,"大学");  

           if(t2==3) strcpy(work[i].xueli,"硕士");

           if(t2==4) strcpy(work[i].xueli,"博士"); 

 

  printf("请输入电话:");

  scanf("%s",work[i].tele);

  printf("请输入地址:");

  scanf("%s",work[i].address);

  getchar();system("cls");

   printf("\n一个职工的信息档案添加完毕!请输入下一个职工的信息\n");    

  work[i].salary=work[i].wages + work[i].reward;

  printf("\n");

}

      baocun(m+n);system("cls");

   printf("添加职工档案完成。\n这时库存信息为:\n");

  

   scan();

}

相关推荐