#include<stdlib.h>
#include<string.h>
#include<ctype.h>
int number
char key[100]
const char * ErrorInputInfo = "输入错误,请重新输入:"
int caidan(int a, int b, const char * str = ErrorInputInfo)
{
int n, m, i, len
while(1)
{
m = 1
len = strlen(key)
for(i = 0 i < len i++)
{
if(isdigit(key[i]) == 0)
{
m = 0
break
}
}
if(m == 0)
{
printf("输入错误,请输入数字,请重新输入:\n")
scanf("%s", key)
}
else
{
n = atoi(key)
if(n > b || n < a)
{
printf("%s\n", str)
scanf("%s", key)
}
else break
}
}
return n
}
struct worker /*定义员工结构体*/
{
int nub
char name[20]
char sex[8]
float gz
char beizhu[10]
} yg[100], ls
void add() // 添加员工
{
FILE *fp
printf("请输入员工信息:姓名,性别,工资,备注,工号将自动生成\n")
scanf("%s %s %f %s", yg[number].name, yg[number].sex, &yg[number].gz, yg[number].beizhu)
yg[number].nub = number + 1
fp = fopen("员工数据库.txt","a+")
if(fp)
{
fprintf(fp, "%d\t%s\t%s\t%f\t%s\n", yg[number].nub, yg[number].name, yg[number].sex, yg[number].gz, yg[number].beizhu)
fclose(fp)
++number
}
else
{
printf("打开文件错误,添加记录失败!\n")
}
}
int zairu() // 载入历史数据
{
int i
FILE *fp = fopen("员工数据库.txt", "r")
if(fp)
{
for(i = 0 !feof(fp) i++)
fscanf(fp, "%d %s %s %f %s", &yg[i].nub, yg[i].name, yg[i].sex, &yg[i].gz, yg[i].beizhu)
fclose(fp)
--i
printf("成功读取%d条记录!\n", i)
return i
}
else
{
printf("打开文件错误,读取失败!\n")
return 0
}
}
void chakan(int n = 500) //查看员工列表
{
int i
if(0 > n || n > number)
{
for(i = 0 i < number i++)
{
if(i == 0) printf("工号\t姓名\t性别\t工资\t\t备注\n")
printf("%d\t%s\t%s\t%f\t%s\n", yg[i].nub, yg[i].name, yg[i].sex, yg[i].gz, yg[i].beizhu)
}
}
else printf("%d\t%s\t%s\t%f\t%s\n", yg[n].nub, yg[n].name, yg[n].sex, yg[n].gz, yg[n].beizhu)
}
void baocun()
{
int i
FILE * fp = fopen("员工数据库.txt", "w")
if(fp)
{
for(i = 0 i < number i++)
fprintf(fp, "%d %s %s %f %s\n", yg[i].nub, yg[i].name, yg[i].sex, yg[i].gz, yg[i].beizhu)
fclose(fp)
}
else printf("打开文件错误!保存文件失败!\n")
}
void xiugai() //修改员工信息
{
int n, m
printf("请输入要修改的员工工号 : ")
scanf("%s", key)
n = caidan(1, number, "员工工号不存在,请重新输入:") - 1
chakan(n)
printf("请输入要修改的项目:1姓名 2性别 3工资 4备注 : ")
scanf("%s", key)
m = caidan(1, 4)
switch(m)
{
case 1:
printf("输入新的姓名:")
scanf("%s", yg[n].name)
break
case 2:
printf("输入新的性别:")
scanf("%s", yg[n].sex)
break
case 3:
printf("输入新的工资:")
scanf("%f", &yg[n].gz)
break
case 4:
printf("输入新的备注:")
scanf("%s", yg[n].beizhu)
break
}
baocun()
}
void chazhao() //按关键字查找员工
{
int n, m, i, t=0
float min,max
printf("请选择查找类型:1工号 2姓名 3性别 4工资 5备注\n")
scanf("%s",key)
n = caidan(1,5)
switch(n)
{
case 1:
printf("请输入要查找的工号:\n")
scanf("%s",key)
m = caidan(0, 100, "员工号应小于100,请重新输入:")
for(i = 0 i < number i++)
{
if(m == yg[i].nub)
{
chakan(i)
t++
}
}
if(t == 0) printf("该工号不存在\n")
else printf("共找到%d位符合条件的员工\n", t)
break
case 2:
printf("请输入要查找的姓名:\n")
scanf("%s", key)
for(i = 0 i < number i++)
{
if(!strcmp(key, yg[i].name))
{
chakan(i)
t++
}
}
if(t == 0) printf("该姓名不存在\n")
else printf("共找到%d位符合条件的员工\n", t)
break
case 3:
printf("请输入要查找的性别:\n")
scanf("%s", key)
for(i = 0 i < number i++)
{
if(!strcmp(key,yg[i].sex))
{
chakan(i)
t++
}
}
if(t == 0) printf("该性别不存在\n")
else printf("共找到%d位符合条件的员工\n", t)
break
case 4:
printf("请输入要查找的工资区间min~max:\n")
scanf("%f %f", &min, &max)
for(i = 0 i < number i++)
{
if(yg[i].gz >= min && yg[i].gz <= max)
{
chakan(i)
t++
}
}
if(t == 0) printf("该工资区间没有员工存在\n")
else printf("共找到%d位符合条件的员工\n", t)
break
case 5:
printf("请输入要查找的备注信息:\n")
scanf("%s", key)
for(i = 0 i < number i++)
{
if(!strcmp(key,yg[i].beizhu))
{
chakan(i)
t++
}
}
if(t == 0) printf("该备注信息不存在\n")
else printf("共找到%d位符合条件的员工\n", t)
break
}
}
#define SORT(X) do{for(i=0 i<numberi++){pos=ifor(j=i+1j<numberj++)if(##X##)pos = jif(pos!=i)ls=yg[pos],yg[pos]=yg[i],yg[i]=ls}}while(0)
void paixu()
{
int n, m, i, j, pos
printf("请选择排序字段:1工号 2姓名 3性别 4工资 5备注 : ")
scanf("%s",key)
n = caidan(1,5)
switch(n)
{
case 1:
printf("请选择:1正序 2倒序 : ")
scanf("%s", key)
m = caidan(1, 2)
if(m == 1) SORT(yg[pos].nub > yg[j].nub)
else SORT(yg[pos].nub < yg[j].nub)
break
case 2:
printf("请选择:1正序 2倒序 : ")
scanf("%s", key)
m = caidan(1, 2)
if(m == 1) SORT(strcmp(yg[pos].name, yg[j].name) == 1)
else SORT(strcmp(yg[pos].name, yg[j].name) == -1)
break
case 3:
break
case 4:
printf("请选择:1正序 2倒序 : ")
scanf("%s", key)
m = caidan(1, 2)
if(m == 1) SORT(yg[pos].gz > yg[j].gz)
else SORT(yg[pos].gz < yg[j].gz)
break
case 5:
break
}
chakan()
}
void main()
{
char key1[100]
int m = 0
number = zairu()
while(m != 6)
{
printf("主菜单:1添加员工 2查看员工列表 3修改员工信息 4查找员工 5排序 6退出程序\n")
scanf("%s",key)
m = caidan(1, 6)
switch(m)
{
case 1:
do
{
add()
printf("添加员工成功,是否继续添加(y / n)\n")
scanf("%s", key1)
while(strlen(key1) > 1 || (key1[0]!= 'y' && key1[0] != 'n'))
{
printf("输入错误,请重新输入!\n")
scanf("%s", key1)
}
}
while(key1[0] != 'n')
break
case 2:
chakan()
break
case 3:
xiugai()
break
case 4:
chazhao()
break
case 5:
paixu()
break
}
}
}
字典是按照拼音排序的,没有现成的拼音排序功能。你可以自己做键值表对应啊。就是做数据,把百家姓和其拼音组合对应的表,可以用文件存储,也 可以用数据库存储,或者干脆直接写在代码了,用结构数组或链表加载。
然后需要排序的时候,直接用结构数组或链表排序啊。
如果你除了姓,连名字都要算在排序中,那你得把整个汉字字典的文字都做成键值表,别人起名字用什么字,谁能知道。那你这就纯粹是数据问题了。
我刚才试了一下百度搜索,百度文库里有现成的汉字拼音对照表,你可以试试,全不全我就不知道了。
1、冒泡排序(最常用)冒泡排序是最简单的排序方法:原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。(注意每一轮都是从a[0]开始比较的)
以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。
2、鸡尾酒排序
鸡尾酒排序又称双向冒泡排序、鸡尾酒搅拌排序、搅拌排序、涟漪排序、来回排序或快乐小时排序, 是冒泡排序的一种变形。该算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。
原理:数组中的数字本是无规律的排放,先找到最小的数字,把他放到第一位,然后找到最大的数字放到最后一位。然后再找到第二小的数字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。
3、选择排序
思路是设有10个元素a[1]-a[10],将a[1]与a[2]-a[10]比较,若a[1]比a[2]-a[10]都小,则不进行交换。若a[2]-a[10]中有一个以上比a[1]小,则将其中最大的一个与a[1]交换,此时a[1]就存放了10个数中最小的一个。同理,第二轮拿a[2]与a[3]-a[10]比较,a[2]存放a[2]-a[10]中最小的数,以此类推。
4、插入排序
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素*
一般来说,插入排序都采用in-place在数组上实现。
具体算法描述如下:
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5