思路:
使用结构体保存职工信息,设计单独的函数,实现录入,按职工工资排序,分解单双数职工,读取和写入文件,显示数据等功能。
1 - 从键盘录入信息到数组结构并保存至文件,录入+写入文件。
2 - 从磁盘文件中读出这些数据,依次打印出来, 读取文件+显示数据。
3 - 对职工数据按工资高低排序,将排好序的各记录存放在文件worker2.dat中, 排序+写入文件。
4 - 将职工号为单数和偶数的职工信息分别存放另两个磁盘文件worker3.dat和worker4.dat中, 分解单双数职工+写入文件。
5 - 并从这两个文件中读出职工信息在显示器上显示出来, 读取文件+显示数据。
代码片段如下:
int main(int argc, char* argv[]){
worker arr[WORKER_NUMBER]
int cnt = WORKER_NUMBER
worker odd[WORKER_NUMBER]
int oddnum = 0
worker even[WORKER_NUMBER]
int evennum = 0
clear_worker_array(arr, cnt)
clear_worker_array(odd, cnt)
clear_worker_array(even, cnt)
//1.录入并保存至worker1.dat
entering_data(arr, cnt)
if( save_file(arr, cnt, filename[0]) == 0 )
{
printf("原始记录已成功保存至文件 - %s\n", filename[0])
}
//2.读取worker1.dat并显示
clear_worker_array(arr, cnt)
if( load_file(arr, &cnt, filename[0]) == 0 )
{
printf("载入文件 - %s\n", filename[0])
}
show_data(arr, cnt)
//3.排序并保存至worker2.dat
sort_by_salary(arr, cnt)
if( save_file(arr, cnt, filename[1]) ==0 )
{
printf("按工资排序后的记录已成功保存至文件 - %s\n", filename[1])
}
//4.保存单数和双数职工号信息至worker3.dat和worker4.dat
filter_workers(arr, cnt, odd, &oddnum, even, &evennum)
if( save_file(odd, oddnum, filename[2]) == 0 )
{
printf("职工号为单数的记录已成功保存至文件 - %s\n", filename[2])
}
if( save_file(even, evennum, filename[3]) == 0 )
{
printf("职工号为双数的记录已成功保存至文件 - %s\n", filename[3])
}
//5.读取worker3.dat和worker4.dat并显示
clear_worker_array(odd, oddnum)
oddnum = 0
if( load_file(odd, &oddnum, filename[2]) == 0 )
{
printf("载入文件 - %s\n", filename[2])
}
show_data(odd, oddnum)
clear_worker_array(even, oddnum)
evennum = 0
if( load_file(even, &evennum, filename[3]) == 0 )
{
printf("载入文件 - %s\n", filename[3])
}
show_data(even, evennum)
return 0
}
为了测试方便,此处的宏只指定了5个职工的信息,若要达到你要求的,直接改成10即可。运行结果如下:
完整代码请参考附件 - worker_manager.c
:by never715
是否需要数据库?这是没有数据库的
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define FILENAME "staff.txt" //数据文件
/////////////////////////////////////////////
struct Staff //职工机构体
{
char CarNumber[10]//卡号
char Name[10]//姓名
int Month//月份
float SPWages//应发工资
float APWages//实发工资
float Water//水费
float Electrical//电费
float Tax//税金
}
////////////////////////////////////////////// 文件 *** 作模块
FILE *FP//全局文件指针
FILE * FileOpen(char FileName[]) //文件打开函数
{
FILE *fp
if((fp=fopen(FileName,"r"))==NULL)
{
fp=fopen(FileName,"w")
cout<<"文件打开失败重新创建记录文件"
return fp
}
fp=fopen(FileName,"r+")
return fp
}
void FileClose(FILE *fp)
{
if(fclose(fp)==0)
cout<<"安全关闭"<<endl
else
cout<<"文件关闭失败"<<endl
}
////////////////////////////////////////////////
void Increase() //添加职工信息
{
FP=FileOpen(FILENAME)
Staff temp
cout<<endl
cout<<"请输入姓名:"
cin>>temp.Name
cout<<"请输入卡号:"
cin>>temp.CarNumber
cout<<"请输入月份:"
cin>>temp.Month
cout<<"请输入应发工资:"
cin>>temp.SPWages
cout<<"请输入水费:"
cin>>temp.Water
cout<<"请输入电费:"
cin>>temp.Electrical
if(temp.SPWages<=800) temp.Tax=0
if((temp.SPWages>800.0)&&(temp.SPWages<1400.0)) temp.Tax=(temp.SPWages-800)*0.05
if(temp.SPWages>1400){temp.Tax=(temp.SPWages-1400)*0.1}
temp.APWages=temp.SPWages-temp.Water-temp.Electrical-temp.Tax
fwrite(&temp,sizeof(temp),1,FP)
cout<<"信息添加成功,请选择浏览工资信息选项进行查看"<<endl
FileClose(FP)
}
//////////////////////////////////////////////
void PrintInformation() //浏览工资信息
{
FP=FileOpen(FILENAME)
rewind(FP)
Staff temp
while(fread(&temp,sizeof(Staff),1,FP)==1)
{
cout<<"姓名:"<<temp.Name<<endl
cout<<"卡号:"<<temp.CarNumber<<endl
cout<<"月份:"<<temp.Month<<endl
cout<<"应发工资:"<<temp.SPWages<<endl
cout<<"水费:"<<temp.Water<<endl
cout<<"电费:"<<temp.Electrical<<endl
cout<<"税金:"<<temp.Tax<<endl
cout<<"实发工资:"<<temp.APWages<<endl
cout<<endl
}
FileClose(FP)
}
//////////////////////////////////////////////////
void Statistics() //统计工资信息
{
Staff temp
char nametemp[10]
float sum=0
int monthstart=0,monthover=0
cout<<"请输入统计的人员姓名:"<<endl
cin>>nametemp
cout<<"请输入统计时间段的起始月份(如:3)"
cin>>monthstart
cout<<"请输入统计时间段的终止月份(如:3)"
cin>>monthover
FP=FileOpen(FILENAME)
while(fread(&temp,sizeof(Staff),1,FP)==1)
{
if(strcmp(temp.Name,nametemp)==0)
{
if(temp.Month>=monthstart&&temp.Month<=monthover)
{
sum=sum+temp.APWages
}
}
}
cout<<"职工"<<nametemp<<"从"<<monthstart<<"月至"<<monthover<<"月合计"<<sum<<"元。"<<endl
}
////////////////////////////////////////////////
void NameSearch()
{
char tempname[10]
Staff temp
cout<<endl
cout<<"请输入要查询的职工的名称:"
cin>>tempname
FP=FileOpen(FILENAME)
while(fread(&temp,sizeof(Staff),1,FP)==1)
{
if(strcmp(temp.Name,tempname))
{
cout<<"姓名:"<<temp.Name<<endl
cout<<"卡号:"<<temp.CarNumber<<endl
cout<<"月份:"<<temp.Month<<endl
cout<<"应发工资:"<<temp.SPWages<<endl
cout<<"水费:"<<temp.Water<<endl
cout<<"电费:"<<temp.Electrical<<endl
cout<<"税金:"<<temp.Tax<<endl
cout<<"实发工资:"<<temp.APWages<<endl
cout<<endl
}
}
FileClose(FP)
}
int Search()
{
int Choose=0
while(1)
{
cout<<endl
cout<<"请选择查询方式"<<endl
cout<<"1、按照卡号查询"<<endl
cout<<"2、按照姓名查询"<<endl
cout<<"0、返回上级目录"<<endl
cout<<"请输入查询方式:"<<endl
cin>>Choose
switch(Choose)
{
case 1:break
case 2:NameSearch()break
case 0:return 0break
}
}
}
//////////////////////////////////////////////
void ShowMenu() //目录显示函数
{
int Choose=0
while(1)
{
cout<<endl
cout<<"工资信息管理系统"<<endl
cout<<"1、添加工资信息。"<<endl
cout<<"2、浏览工资信息。"<<endl
cout<<"3、统计工资信息。"<<endl
cout<<"4、查询工资信息。"<<endl
cout<<"0、退出系统。"<<endl
cout<<"请输入服务类型:"
cin>>Choose
switch(Choose)
{
case 1:Increase()break
case 2:PrintInformation()break
case 3:Statistics()break
case 4:Search()break
case 0:exit(0)break
}
}
}
void main()
{
ShowMenu()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)