科学论文的查重
const int MaxLen = 200//最多可存储200条联系信息。
char fName[20]= " tel . dat ";//磁盘文件:通讯簿文件名
int Len//全局变量,通讯簿中当前联系人的总数
//1.通讯录数据结构的设计
typedef结构电话
{
char name[20];//名称
int组;//组:1。老友记2。同事3。家庭4。其他人
char之家[15];//家庭电话
char手机[15];//手机
char email[20];//电子邮件
char add[20];//地址
char memo[20];//备注
}电话;
//指针数组结构,用于排序。
typedef结构索引
{
int len//数组长度
tel * tel[MaxLen];//指针数组,
}指数;
//显示模块xuanshi.cpp
作废清单(电话tel[],索引lianx ren);//根据lianxren中指针数组的排序显示所有联系人。
void大营标投(void);//打印标题
void大赢标威(void);//打印页脚
void PrintOne(Tel r,int I);//只打印一个序号为I的联系人R的信息。
作废打印(电话号码);//打印页眉和联系人信息。
void阴环();//欢迎界面
int菜单(void);//主菜单,显示一级菜单:查看通讯录(1)、更新通讯录(2)、备份通讯录(3)、退出(0)。
int menu 2(void);//更新通讯录子菜单,显示:添加联系人(21),编辑联系人(22),删除联系人(23),返回主菜单(20)。
//文件处理模块wenjiancl.cpp
void New(电话电话[],索引* lianx ren);//添加联系人。添加到数组中的第一个空位置。之后,你需要重新排序
void Edit(Tel tel[],Index * lianx ren);//编辑联系人。需要重新订购
void Delete(Tel tel[],Index * lianx ren);//删除联系人。逻辑删除,只把名字赋给空字符串。删除后需要重新排序。
void输入(Tel *r,Tel tel[],int menu);//输入联系人的信息,通过菜单识别:添加(11)或修改(13)。
int chongcha(char *name,Tel tel[],char * original);//检查重量。在添加或编辑员工之前,请检查是否有重复的姓名。
int Select();//选择触点序列号,以免出错。
int Load(Tel tel[],Index * lianx ren);//读取。将地址簿文件fName读入内存。分类
int Save(Tel Tel[]);//保存。以fName(全局变量)的名称将地址簿保存到磁盘。此时执行物理删除:带有空字符串的联系人表示该联系人已被删除,不会存储在地址簿文件中。
int Copy(void);//备份通讯录。复制地址簿文件。
void pingypaix(电话[],索引* lianx ren);//按声音顺序排序。
void Xuan paixi(Index * p);//选择指针数组的排序
//主文件模块zhuwenjian.cpp
# include & ltstdio.h & gt
# include & ltstdlib.h & gt
# include & ltconio.h & gt
# include & ltstring.h & gt
#包含“创勇. h”
#包含“xuanshi.cpp”
#包含“wenjiancl.cpp”
int main()
{
阴环();
int select = 0;
tel tel[MaxLen];//最多存储200个联系人。
索引lianxren//按声音顺序排序的指针数组
负载(电话& amplianx ren);//从通讯簿文件中读取信息
//循环显示菜单供用户选择。
做{
如果(选择& lt10 || select==20)//主菜单项< 10,或者从子菜单返回20。然后显示主菜单。
select = Menu();
else if(选择& gt20 & amp& amp选择& lt30)//选择子菜单2的项目,继续显示子菜单2。
select = menu 2();
开关(选择)
{
案例1://按字母顺序查看通讯录。
名单(电话,lianx ren);
printf(" \ n \ n \ t按任意键继续...");
getch();//等待用户看清楚屏幕,conio.h
打破;
案例21: //添加联系人。
新(电话& amplianx ren);
打破;
案例22: //编辑联系人
编辑(电话& amplianx ren);
打破;
案例23: //删除联系人
删除(电话& amplianx ren);
打破;
案例20: //返回主菜单
打破;
案例3: //备份通讯录
系统(“cls”);//如果没有子菜单,先清除上一级菜单stdlib.h
保存(电话);//用户可能已经更新了。请先将当前电话号码保存到通讯录文件中。
copy();
打破;
情况0: //退出程序
打破;
}
}而(选择!=0);
保存(电话);//退出系统前,将内存数据存储在通讯录文件中。
返回0;
}
//xuanshi.cpp菜单模块。独立于程序的其他模块。由返回的菜单代码对应于操作。
//欢迎部分
无效阴环()
{
Char A[100]={ "欢迎使用本通讯簿。这个程序是费瑶写的,o(∩_∩)o...!进车!”};
int i,j,k;
for(I = 0;我& lt6;i++)
{
printf(" \ n ");
}
puts(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
printf(" \ t \ t ");
for(I = 0;一个[我]!='\0';i++)
{
if(I = = 49)printf(" \ n \ n \ t \ t ");
printf("%c ",A[I]);
for(j = 0;j & lt10000;j++)
for(k = 0;k & lt2000;k++)
;
}
Puts ("\ n \ n \ n \ t \ t 07王,计算机系C班");
puts(" \ n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ a ");
getch();
}
//主菜单,显示一级菜单:查看通讯录(1)、更新通讯录(2)、备份通讯录(3)、退出(0)。
int菜单(无效)
{
int I;
char菜单;
做{
系统(“cls”);//清除屏幕,stdlib.h
for(I = 0;我& lt6;i++)
{
printf(" \ n ");
}
Puts ("\ n * * * * * * *主菜单* * * * * * * * ");
puts(" * * ");
Puts(" * 1。查看通讯簿* ";
Puts(" * 2。更新通讯簿* ";
Puts(" * 3。备份通讯簿* ";
Puts(" * 0。退出程序* ";
puts(" * * ");
puts(" * * * * * * * * * * * * * * * * * * * * * * * \ n ");
printf(" \ t请选择:");
menu = getche();
开关(菜单)
{
案例“0”:
puts(" \ n \ n \ t退出程序!");
menu =菜单-' 0 ';
打破;//跳出循环
案例“1”:
案例“3”:
menu =菜单-' 0 ';
打破;
案例“2”:
menu = menu 2();
打破;
默认值:
puts(" \ n \ n \ t错误的选择!");
menu = ' 9
}
} while(menu = = ' 9 ');//返回菜单代码,' 0 ',' 1 ',20,21,22,23和' 3 '都是有效值。
返回菜单;
}
//更新通讯录子菜单,显示:添加联系人(21),编辑联系人(22),删除联系人(23),返回(20)。
int Menu2()
{
char菜单;
int I;
做{
系统(“cls”);//清除屏幕,stdlib.h
for(I = 0;我& lt6;i++)
{
printf(" \ n ");
}
Puts ("\ n * * * * * *更新通讯簿* * * * * * ");
puts(" * * ");
Puts(" * 1。添加联系人* ";
Puts(" * 2。编辑联系人* ";
Puts(" * 3。删除联系人* ";
Puts(" * 0。返回主菜单* ";
puts(" * * ");
puts(" * * * * * * * * * * * * * * * * * * * * * * * \ n ");
printf(" \ t请选择:");
menu = getche();//输入一个没有回音的字符,不需要按回车键,conio.h
开关(菜单)
{
案例“0”:
将(" \ n \ n \返回主菜单!");
打破;//跳出循环
案例“1”:
案例“2”:
案例“3”:
打破;
默认值:
puts(" \ n \ n \ t错误的选择!");
menu = ' 9
}
} while(menu = = ' 9 ');//若要返回菜单代码,“0”、“1”、“2”和“3”是有效值。
返回20+菜单-' 0 ';
}
//浏览部分
Voidlist (tel tel [],index lianxren)//根据lianx ren的排序方式显示所有节点。
{
int I;//i:数组下标
if(Len==0)
{
printf(" \ n \ t无联系人");
返回;
}
大营标投();
for(I = 0;我& ltLenI++) //按字母顺序遍历所有联系人,序号i+1。
PrintOne( *(lianxren.tel[i]),I+1);
dayingbiaowei();
}
Void dayingbiaotou(void) //打印表头
{
printf(" \ n \ n \ t通讯簿*联系人");
printf(" \ n \ t-");
printf(" \ n \ t %-10s %-6s %-10s %-10s "、"姓名"、"组"、"家庭电话"、"手机");
printf(" %-10s %-10s %-10s "、"电子邮件"、"地址"、"备注");
printf(" \ n \ t-");
}
Void dayingbiaowei(void)//打印页脚
{
printf(" \ n \ t-\ n ");
}
Void PrintOne(Tel r,int i) //只打印一个序列号为I的联系人r的信息。
{
如果(我!=0) //联系人前面是序列号。
printf("\n%6d\t%-10s ",I,r . name);
否则//联系人前不添加序列号。
printf("\n\t%-10s ",r . name);
//组:1。老友记2。同事3。家庭4。其他人
开关(右组)
{
案例1:
Printf("%-6s ","朋友");
打破;
案例二:
Printf("%-6s ","同事");
打破;
案例三:
Printf("%-6s ","家族");
打破;
默认值:
Printf("%-6s ","其他");
}
printf(" %-10s %-10s %-10s ",r.home,r.mobile,r . email);
printf("%-10s%-10s ",r.add,r . memo);
}
Void Print(Tel r) //打印表头和联系人信息。
{
大营标投();
PrintOne(r,0);//只打印一个人,不输出序号(第二个参数为0)。
dayingbiaowei();
}
//文件处理模块wenjiancl.cpp
//文件处理部分
Intload (teltel [],index * lianxren)//read。将地址簿文件fName读入内存。分类
{
FILE * fin
int I = 0;
fin=fopen(fName," Rb ");
如果(!鳍)
{
printf(" \ n \ t通讯簿不存在,请先添加联系人!\ n \ n \按任意键继续... ");
getch();
返回0;
}
while(1)
{
弗雷德(& amptel[i],sizeof(Tel),1,fin);
if(feof(fin))
打破;
i++;
}
fclose(fin);
len = I;//更新通讯簿中的总人数
pingypaix(电话,lianx ren);//按声音顺序排序
返回I;
}
Int Save(Tel tel[]) // save。以fName(全局变量)的名称将地址簿保存到磁盘。此时执行物理删除:带有空字符串的联系人表示该联系人已被删除,不会存储在地址簿文件中。
{
FILE * fout
int i,j;//I:tel数组下标,j:通讯录实际人数(不包括TEL中名字为空的元素)。
fout=fopen(fName,“WB”);
如果(!fout)
{
printf(" \ n \ t通讯簿无法正确保存!按任意键继续... ");
getch();
返回0;
}
//i是tel数组的下标,j是实际人数(tel数组中有逻辑删除的联系人,名字为空)。
for(i=0,j = 0;j & ltLen)
{
//找到有效的联系人,驱逐逻辑删除(名称为空字符串)。
while( strcmp(tel[i].名称," " " == 0)
i++;
fwrite(& amp;tel[i],sizeof(Tel),1,fout);
i++;
j++;
}
fclose(fout);
返回j;
}
Int Copy(void) //备份通讯录。复制地址簿文件。
{
FILE *fout,* fin
Tel * p =(Tel *)malloc(sizeof(Tel));//存储从通讯簿中读取的临时数据。
char name[20];
fin=fopen(fName," Rb ");
如果(!鳍)
{
printf(" \ n \ t没有联系!");
返回0;
}
做{
printf(" \ n \ t请输入备份文件名:");
scanf("%s ",名称);
strcat(名称。bak”);
fout=fopen(名字,“WB”);
如果(!fout)
printf(" \ t文件名或路径无效!\ n ");
}while(!fout);
while(1)
{
fread(p,sizeof(Tel),1,fin);
if(feof(fin))
打破;
fwrite(p,sizeof(Tel),1,fout);
}
printf(" \ n \ t备份成功!");
免费(p);
返回1;
}
//基本操作部分
Voidnew (tel tel [],index * lianxren)//添加联系人。添加到数组中的第一个空位置。之后,你需要重新排序
{
int t = 0;//在tel中找到第一个空的位置来存储新输入的联系人。
if(Len & gt;=MaxLen)
{
printf(" \ n \ n \ t通讯簿已满!");
返回;
}
//找到tel中的第一个空位置t。
while( strcmp(tel[t])。名字,“”!=0 )
t++;
输入(& amp电话[t],电话,21);//添加联系人(21),输入联系方式。
len++;//联系人增加了1
pingypaix(电话,lianx ren);//重新排序
}
Voidededit (tel tel [],index * lianx ren)//编辑联系人。需要重新订购
{
int I;
列表(电话,* lianx ren);//按音标排序顺序修改。
if(Len==0)返回;
I = Select();
print(*(lianx ren-& gt;tel[I]));//显示用户选择的联系人I。
输入(lianxren-& gt;电话[i],电话,23);//编辑时输入联系信息(23)
pingypaix(电话,lianx ren);//重新排序
}
Void delete (tel tel [],index * lianx ren)//删除联系人。逻辑删除,只把名字赋给空字符串。删除后需要重新排序。
{
int I;
字符选择;//用户选择:是否继续输入姓名以外的信息。
列表(电话,* lianx ren);//按字母顺序删除
if(Len==0)返回;
I = Select();
print(*(lianx ren-& gt;tel[I]));//显示用户选择的联系人I。
printf(" \ n \ t您确定要删除此人吗?(y/n)");
select = getche();
if(select=='Y' || select=='y ')
{
strcpy(lianx ren-& gt;电话号码[I]-& gt;姓名,“”;//删除联系人信息(逻辑删除):将姓名赋为空字符串,表示没有。
len-;//联系人减1
pingypaix(电话,lianx ren);//重新排序
}
}
Void input (tel * r,tel tel [],int menu)//输入一个联系人的信息,菜单会识别:添加(11)或修改(13)。
{
int select
char name[20],original[20];
If(menu==21)//添加,原本没有名字。
strcpy(original," ");
Else //编辑器,它曾经有个名字
strcpy(original,r-& gt;姓名);
printf(" \ n \ n \ t请输入联系人姓名:");
做{
scanf("%s ",名称);
}while(chongcha(name,tel,orignal));//重复名称检查。修改时,它可以与原始名称相同。
strcpy(r-& gt;姓名、名称);
printf(" \ t是否要继续键入(y/n)?");
select = getche();
if(select=='y' || select=='Y ')
{
//组
Printf("\n\t Group (1。老友记2。同事3。家庭4。其他),请输入序号:“);
scanf("%d ",& amp(r-& gt;群));
while(r->;组& lt1 | | r->;group & gt4)
{
printf(" \ n \ t输入错误!请重新输入组序列号(1。老友记2。同事3。家庭4。其他):)”;
scanf("%d ",& amp(r-& gt;群));
}
printf(" \ t电话:");
scanf("%s ",r-& gt;家);
printf(" \ t手机:");
scanf("%s ",r-& gt;移动);
printf(" \ tEmail:");
scanf("%s ",r-& gt;邮箱);
Printf("\t地址:");
scanf("%s ",r-& gt;添加);
printf(" \ t标记:");
scanf("%s ",r-& gt;备忘录);
}
Else if(menu==21) //添加联系人时(menu=21),用户不输入,设置默认值。
{
r-& gt;组= 4;//默认组:其他
strcpy(r-& gt;家,“”;
strcpy(r-& gt;移动,“”;
strcpy(r-& gt;邮箱,“”;
strcpy(r-& gt;加,“”;
strcpy(r-& gt;备忘录,“”;
}
}
Intchongcha (char * name,tel tel [],char * original)//检查重复。在添加或编辑联系人之前,请检查是否有重复的姓名。
{
int i,j;//i:数组下标j:除名字外的实际人数为空字符串。
int dup = 0;//重名标志:1重名,0不重名。
if(strcmp(name,original)!=0)//name不是原来的名字。
for(i=0,j = 0;j & ltLen)//遍历所有联系人
{
//找到有效的联系人,驱逐逻辑删除(名称为空字符串)。
while( strcmp(tel[i].名称," " " == 0)
i++;
If (strcmp (name,tel [I].name) = = 0)//name不是原姓名,但在通讯录中是重名。
{
dup = 1;
printf(" \ n \ t name!请重新输入:“);
打破;
}
i++;
j++;
}
返回dup
}
Int Select() //选择联系人序列号以避免出错。
{
int I = 0;
int c;//c:scanf()输入的返回值。如果输入成功,返回1;否则,返回0。
printf(" \ n \ t请按序列号选择联系人:");
c=scanf("%d ",& ampI);
while(我& lt1 | | I & gt;Len)
{
printf(" \ n \ t输入错误!请按序列号选择一个联系人:");
if(c = = 0)fflush(stdin);//输入失败,清空与输入流stdin,stdio.h相关的输入缓冲区内容
c=scanf("%d ",& ampI);
}
返回I-1;
}
//排序部分
Void pingy paix (tel tel [],index * lianx ren)//按声音顺序排序。
{
int i,j;//i:数组下标j:除名字外的实际人数为空字符串。
if( Len==0)
返回;
//初始化排序指针数组
lianx ren-& gt;len = 0;
for(i=0,j = 0;j & ltLen)
{
//找到有效的联系人,驱逐逻辑删除(名称为空字符串)。
while( strcmp(tel[i].名称," " " == 0)
i++;
lianx ren-& gt;电话[j]= & amp;电话[I];
j++;
i++;
lianx ren-& gt;len++;
}
//选择排序
玄派西(lianx ren);
}
void Xuan paixi(Index * p)//选择并排序指针数组。
{
int i,j,n = p-& gt;len
int min
电话*温度;
if( n==0)返回;//没有联系人,所以不需要排序。
//选择排序
for(I = 0;我& ltn-1;i++)
{
//找到最小的元素
min = I;
for(j = I+1;j & ltn;j++)
{
if(strcmp(p-& gt;电话号码[j]-& gt;姓名,p-& gt;电话[分钟]-& gt;姓名)& lt0)
min = j;
}
//交换最小元素min,当前无序序列的第一个元素I。
如果(min!=i)
{
temp = p-& gt;电话[I];
p->;tel[I]= p-& gt;电话[分钟];
p->;tel[min]= temp;
}
}//I的结尾
}