北 京 林 业 大 学
2020学年—2021学年第1学期 程序设计基础课程设计 实习报告书
实习内容: 高校教师工资管理系统
实习环境: Sublime Text 3
目录
3.2.1 checkten()--对输入的数字范围进行检测
3.2.3 checkid()--检测用户输入id是否合法且合规
3.2.5 checkmon()--用以检测所要查询的月份是否存在salary信息中
3.3.1 inpter() inpsal()--ter输入函数 与 sal输入函数
3.3.2 delter() delsal()--删除教师信息及薪资信息
3.4.1 showter()--可选mode的教师信息列表打印函数
3.4.2 searchterid() searchsalid()--寻找所传id对应的实际索引以便后续操作
3.4.3 swapter()swapsal()swapcol()swapjob()--交换函数
3.4.4 sortter_id() sortsal_id()--排序函数
3.4.5 calcolavg_sort() caljobavg_sort()--实现统计分析排序功能的函数
3.4.6 FreshSalName()--同步sal与ter之间的信息
4.4.1根据月份,统计不同学院教师的平均应发工资和平均实发工资
4.4.2根据月份,统计不同职称教师的平均应发工资和平均实发工资
一、实习步骤:
我于第一天进行该项目的整体分析及技术方案的选择,第二天进行该程序的编码工作,第三天进行程序的测试工作和报告的书写工作。
二、实现方法概述:
根据要求,该程序完全基于C语言实现,未使用任何外部库文件。代码全部手敲完成,无任何借鉴复制行为。且编写代码的全过程已录制视频,并将快放版上传至B站:其地址为:https://www.bilibili.com/video/BV1Af4y1e7Tc/
该程序按照实验要求分为五大模块,完全实现实验要求的所有功能。存储在程序内采用结构体的方式,由于禁止使用SQL库函数,所以我自己手写了一套简化版的SQL生成与解析函数,用于程序在本地的存储结构(可实现对之前数据,或样例数据的导入)。
设计采用自顶向下的方式,将每个大问题细化为各个小问题。将需要重复用到的解决方案算法生成为可选择模式的函数(如4.0.1 showter()),以达到简化代码量且提高可移植性的目标。每完成一个小模块便进行测试,以确保程序的正确性。
本系统系统功能结构
三、技术方案实现:
该程序的函数功能分为四大模块,接下来将一一介绍。
3.0 数据存储结构
3.0.0本地存储结构(**创新点**)
由于该项目禁止使用SQL数据库的相关库文件,我自己写了一套类似于SQL存储结构的生成函数及解释函数。其于本地存储的样式类似于SQL中的insert values()语句。
- (0000000001,wu zheng,3,2)
- (0000000003,qian,3,2)
- (0000000001,wu zheng,3,2,2,200.00,100.00,56.00,300.00,244.00)
- (0000000001,wu zheng,3,2,3,45.00,6.00,6.00,51.00,45.00)
接下来将首先介绍该简化SQL的生成方法
- void savetolocter()
- {
- // (id,name,colid,jobid)
- FILE * f1;
- f1=fopen("terdata.dat","w+");
- if(f1==NULL){printf("save to local unaviliable\n");return;}
- int i;
- for(i=0;i<tercnt;i++)
- {
- char tline[101]="(", tnum[5];
- strcat(tline,ter[i].id);
- strcat(tline,",");
- strcat(tline,ter[i].name);
- strcat(tline,",");
- strcat(tline,itoa(ter[i].collegeid,tnum,10));
- strcat(tline,",");
- strcat(tline,itoa(ter[i].jobid,tnum,10));
- strcat(tline,")");
- fprintf(f1, "%s\n", tline);
- }
- fclose(f1);
- }
- void savetolocsal()
- {
- FILE * f1;
- f1=fopen("saldata.dat","w+");
- if(f1==NULL){printf("save to local unaviliable\n");return;}
- int i;
- for(i=0;i<salcnt;i++)
- {
- char tline[201]="(", tnum[12];
- strcat(tline,sal[i].id);
- strcat(tline,",");
- strcat(tline,sal[i].name);
- strcat(tline,",");
- strcat(tline,itoa(sal[i].collegeid,tnum,10));
- strcat(tline,",");
- strcat(tline,itoa(sal[i].jobid,tnum,10));
- strcat(tline,",");
- strcat(tline,itoa(sal[i].month,tnum,10));
- strcat(tline,",");
- strcat(tline,d2s(sal[i].basicsal,tnum));
- strcat(tline,",");
- strcat(tline,d2s(sal[i].addsal,tnum));
- strcat(tline,",");
- strcat(tline,d2s(sal[i].subsal,tnum));
- strcat(tline,",");
- strcat(tline,d2s(sal[i].theosal,tnum));
- strcat(tline,",");
- strcat(tline,d2s(sal[i].truesal,tnum));
- strcat(tline,")");
- fprintf(f1, "%s\n", tline);
- }
- fclose(f1);
- }
其核心思想为模拟SQL的数据以逗号为分割的方式,将数据行通过fprintf结构化的存入到文件中,以便后续的读取。
接下来将介绍该SQL语句的解析函数
- void loadlocter(char * loc)
- {
- FILE * f1;
- f1=fopen(loc,"r");
- if(f1==NULL){printf("load to here unaviliable\n");return;}
- tercnt=0;
- char tinp[100];
- while(fgets(tinp,300,f1)!=NULL && tinp[0]!=10)
- {
- char tid[11],tna[31];
- int tcd,tjd;
- int i;
- for(i=1;i<=10;i++) tid[i-1]=tinp[i];
- int tcnt=0;
- for(i=12;tinp[i]!=',';i++) tna[tcnt++]=tinp[i];
- tna[tcnt]='\0';
- tcd=atoi(&tinp[i+1]);
- tjd=atoi(&tinp[i+3]);
- strcpy(ter[tercnt].id,tid);
- strcpy(ter[tercnt].name,tna);
- ter[tercnt].collegeid=tcd;
- ter[tercnt].jobid=tjd;
- tercnt++;
- //(1234567890,de d,1,1)
- }
- fclose(f1);
- sortter_id();
- }
- void loadlocsal(char * loc)
- {
- FILE * f1;
- f1=fopen(loc,&#