📄 通讯录.c
字号:
system("pause");
exit (0);
}
}
/*
*Function: GiveInstruction
*Usage: GiveInstruction(db->matesnum, string);
*--------------------------------------
*这个函数给出关于本程序和记录文件的一些信息
*/
void GiveInstruction(int num, char *filename)
{
printf("**********************************************\n");
printf(" 欢迎使用通讯录记录程序!\n\n\n");
printf("本通讯录目前可存储记录总数为%d条。\n", MaxElement);
printf("目前%s中已有%d条记录。通讯录修改之后请注意随时保存。\n", filename, num);
printf("本通讯录的记录从0开始编码,即第一条记录的编号为0,请注意。\n\n");
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("9.退出程序.\n");
printf("**********************************************\n");
}
/*
*Function: DeleteRecord
*Usage: DeleteRecord(db);
*-----------------------------------
*这个函数提供了删除某条记录、删除部分记录和删除所有记录
*三项功能。当用户选择某项功能时,对应的记录指针会从数组
*中被删除,并相应地修改剩余记录的指针及编号。当删除完成
*后,用户使用保存记录功能时,删除后的记录数组的信息会写
*入新文件中,从而达到删除的目的。
*/
void DeleteRecord(records db)
{
int n, i, answer, start, end;
if(!db->matesnum){ //如果文件中尚无记录
printf("当前文件中没有记录,无法使用删除功能。\n");
return;
}
printf("目前菜单:删除记录。确定删除请输入1,返回上一级菜单请输入0:");
while(true){
scanf("%d", &answer);
getchar();
if(answer == 0 || answer == 1) break;
printf("输入错误!请重新输入:");
}
if(!answer) return;
printf("删除某条记录请输入0,删除部分记录请输入1,删除所有记录请输入2:");
while(true){
scanf("%d", &answer);
getchar();
if(answer == 0 || answer == 1 || answer == 2) break;
printf("输入错误!请重新输入:");
}
if(!answer){
printf("要删除哪条记录(如须查找记录请输入-1)?");
while(true){
scanf("%d", &n);
getchar();
if((n < db->matesnum && n >= 0) || n == -1) break;
printf("输入错误或没有此条记录!请重新输入:");
}
if(n == -1){
SearchRecord(db);
DeleteRecord(db);
}else{
printf("该条记录的内容如下:\n");
printf("%-4d.%-6s %-7s %-8s %-11s %-11s %-20s\n", db->classmates[n]->n,db->classmates[n]->name,db->classmates[n]->number,db->classmates[n]->flatnum, db->classmates[n]->cellphone, db->classmates[n]->qqnum,db->classmates[n]->address);
printf("确定删除该记录?(是 1/否 0)");
while(true){
scanf("%d", &answer);
getchar();
if(answer == 0 || answer == 1) break;
printf("输入错误!请重新输入:");
}
if(answer){
for(i = n; i < db->matesnum - 1; i++){ //将记录顺序前移
db->classmates[i + 1]->n--;
db->classmates[i] = db->classmates[i + 1];
}
db->matesnum--;
printf("删除记录成功。\n");
}
}
}else if(answer == 1){
printf("请输入删除范围:\n");
while(true){
printf("请输入起始标号:");
scanf("%d", &start);
getchar();
printf("请输入终止标号:");
scanf("%d", &end);
getchar();
if(start <= end && end < db->matesnum) break;
printf("指令错误!请重新输入\n");
}
printf("将要删除从%d到%d共%d条记录,确定删除?(是 1/否 0)", start, end, end - start + 1);
while(true){
scanf("%d", &answer);
getchar();
if(answer == 0 || answer == 1) break;
printf("输入错误!请重新输入:");
}
if(answer){
for(i = end + 1; i < db->matesnum; i++){
db->classmates[i]->n -= end - start + 1;
db->classmates[i - end + start -1] = db->classmates[i]; //指针前移,跳过中间要删除的部分记录
}
db->matesnum -= end - start + 1;
}
printf("删除记录成功。\n");
}else{
db->matesnum = 0; //删除所有记录,故令记录的数目为0
}
if(db->matesnum){ //当文件中还有记录时
printf("继续删除(是 1/否 0)?");
while(1){
scanf("%d", &answer);
getchar();
if(answer == 0 || answer == 1) break;
printf("输入错误!请重新输入:");
}
if(answer) DeleteRecord(db);
}
}
/*
*Function: ChangeRecord
*Usage: ChangeRecord(db);
*-----------------------------
*这个函数用于修改记录的内容
*/
void ChangeRecord(records db)
{
int n, answer;
if(!db->matesnum){ //如果文件中尚无记录
printf("当前文件中没有记录,无法使用修改功能。\n");
return;
}
printf("目前菜单: 修改记录。确定修改请输入1,返回上一级菜单请输入0:");
while(true){
scanf("%d", &answer);
getchar();
if(answer == 0 || answer == 1) break;
printf("输入错误!请重新输入:");
}
if(!answer) return;
printf("要修改哪一条记录?(如须查找记录请输入-1)");
while(true){
scanf("%d", &n);
getchar();
if((n <= db->matesnum && n >= 0) || n == -1) break;
printf("输入错误或没有此条记录!请重新输入:");
}
if(n == -1){
SearchRecord(db);
ChangeRecord(db);
}else{
printf("原记录的内容为:\n");
printf("%-4d.%-6s %-7s %-8s %-11s %-11s %-20s\n", db->classmates[n]->n,db->classmates[n]->name,db->classmates[n]->number,db->classmates[n]->flatnum, db->classmates[n]->cellphone, db->classmates[n]->qqnum,db->classmates[n]->address);
printf("确定修改该记录?(是 1/否 0)");
while(true){
scanf("%d", &answer);
getchar();
if(answer == 0 || answer == 1) break;
printf("输入错误!请重新输入:");
}
if(answer){
printf("请选择修改项目:\n");
printf("1.姓名 2.学号 3.宿舍 4.手机 5.QQ 6.地址 7.全部:");
while(true){
scanf("%d", &answer);
getchar();
if(answer == 1 || answer == 2 || answer == 3 || answer == 4 || answer == 5 || answer == 6 || answer == 7) break;
printf("输入错误!请重新输入:");
}
switch(answer){
case 1:
printf("请输入姓名:");
scanf("%6s", db->classmates[n]->name);
getchar();
break;
case 2:
printf("请输入学号:");
scanf("%7s", db->classmates[n]->number);
getchar();
break;
case 3:
printf("请输入宿舍:");
scanf("%8s", db->classmates[n]->flatnum);
getchar();
break;
case 4:
printf("请输入手机:");
scanf("%11s", db->classmates[n]->cellphone);
getchar();
break;
case 5:
printf("请输入QQ号:");
scanf("%11s", db->classmates[n]->qqnum);
getchar();
break;
case 6:
printf("请输入地址:");
scanf("%20s", db->classmates[n]->address);
default:
db->classmates[n] = AddToRecord(db->classmates[n]->n);
break;
}
}
printf("是否继续修改下一条(是 1/否 0)?");
while(true){
scanf("%d", &answer);
getchar();
if(answer == 0 || answer == 1) break;
printf("输入错误!请重新输入:");
}
if(answer) ChangeRecord(db);
}
}
/*
*Function: SearchRecord
*Usage: SearchRecord(db);
*---------------------------
*这个函数用于在文件中查找记录
*如果查找到符合条件的记录,函数会将其全部显示在屏幕上
*否则给出查找不得的信息。
*/
void SearchRecord(records db)
{
int answer, i, j = 0, nscan = 0;
char *search;
if(!db->matesnum){ //如果文件中尚无记录
printf("当前文件中没有记录,无法使用查找功能。\n");
return;
}
printf("目前菜单:查找记录。请输入要查找内容的代号。\n");
printf("1.姓名 2.学号 3.宿舍 4.手机 5.QQ 6.地址 0.返回上一级菜单:");
while(true){
scanf("%d", &answer);
getchar();
if(answer == 1 || answer == 2 || answer == 3 || answer == 4 || answer == 5 || answer == 6|| answer == 0) break;
printf("输入错误!请重新输入:");
}
if(!answer) return;
search = (char *)GetBlock(Namelength * sizeof(char));
printf("请输入查找内容:");
scanf("%s", search);
getchar();
switch(answer){
case 1:
for(i = 0; i < db->matesnum; i++){
if(!strcmp(search, db->classmates[i]->name)){ //如果内容匹配,strcmp函数返回0,此时if语句执行
nscan += printf("%-4d.%-6s %-7s %-8s %-11s %-11s %-20s\n", db->classmates[i]->n,db->classmates[i]->name,db->classmates[i]->number,db->classmates[i]->flatnum, db->classmates[i]->cellphone, db->classmates[i]->qqnum,db->classmates[i]->address);
j++;
}
}
if(nscan == 0){
printf("没有找到记录,可能是您的输入有误,请重新尝试。\n");
}else{
printf("共有%d条记录符合条件。\n", j);
}
break;
case 2:
for(i = 0; i < db->matesnum; i++){
if(!strcmp(search, db->classmates[i]->number)){
nscan += printf("%-4d.%-6s %-7s %-8s %-11s %-11s %-20s\n", db->classmates[i]->n,db->classmates[i]->name,db->classmates[i]->number,db->classmates[i]->flatnum, db->classmates[i]->cellphone, db->classmates[i]->qqnum,db->classmates[i]->address);
j++;
}
}
if(nscan == 0){
printf("没有找到记录,可能是您的输入有误,请重新尝试。\n");
}else{
printf("共有%d条记录符合条件。\n", j);
}
break;
case 3:
for(i = 0; i < db->matesnum; i++){
if(!strcmp(search, db->classmates[i]->flatnum)){
nscan += printf("%-4d.%-6s %-7s %-8s %-11s %-11s %-20s\n", db->classmates[i]->n,db->classmates[i]->name,db->classmates[i]->number,db->classmates[i]->flatnum, db->classmates[i]->cellphone, db->classmates[i]->qqnum,db->classmates[i]->address);
j++;
}
}
if(nscan == 0){
printf("没有找到记录,可能是您的输入有误,请重新尝试。\n");
}else{
printf("共有%d条记录符合条件。\n", j);
}
break;
case 4:
for(i = 0; i < db->matesnum; i++){
if(!strcmp(search, db->classmates[i]->cellphone)){
nscan += printf("%-4d.%-6s %-7s %-8s %-11s %-11s %-20s\n", db->classmates[i]->n,db->classmates[i]->name,db->classmates[i]->number,db->classmates[i]->flatnum, db->classmates[i]->cellphone, db->classmates[i]->qqnum,db->classmates[i]->address);
j++;
}
}
if(nscan == 0){
printf("没有找到记录,可能是您的输入有误,请重新尝试。\n");
}else{
printf("共有%d条记录符合条件。\n", j);
}
break;
case 5:
for(i = 0; i < db->matesnum; i++){
if(!strcmp(search, db->classmates[i]->qqnum)){
nscan += printf("%-4d.%-6s %-7s %-8s %-11s %-11s %-20s\n", db->classmates[i]->n,db->classmates[i]->name,db->classmates[i]->number,db->classmates[i]->flatnum, db->classmates[i]->cellphone, db->classmates[i]->qqnum,db->classmates[i]->address);
j++;
}
}
if(nscan == 0){
printf("没有找到记录,可能是您的输入有误,请重新尝试。\n");
}else{
printf("共有%d条记录符合条件。\n", j);
}
break;
case 6:
for(i = 0; i < db->matesnum; i++){
if(!strcmp(search, db->classmates[i]->address)){
nscan += printf("%-4d.%-6s %-7s %-8s %-11s %-11s %-20s\n", db->classmates[i]->n,db->classmates[i]->name,db->classmates[i]->number,db->classmates[i]->flatnum, db->classmates[i]->cellphone, db->classmates[i]->qqnum,db->classmates[i]->address);
j++;
}
}
if(nscan == 0){
printf("没有找到记录,可能是您的输入有误,请重新尝试。\n");
}else{
printf("共有%d条记录符合条件。\n", j);
}
break;
default :
printf("运行时错误!");
system ("pause");
exit(1);
}
}
/*
*Function: RangeRecord
*Usage: RangeRecord(db);
*-----------------------------
*该函数用于将记录按某个标准重新排序
*排序过程使用的是冒泡排序法,将记录
*的指针和编号一起交换,从而排序。
*/
void RangeRecord(records db)
{
int answer, i, j, n1;
oneRecord temp;
if(!db->matesnum){ //如果文件中尚无记录
printf("当前文件中没有记录,无法使用排序功能。\n");
return;
}
printf("目前菜单: 记录重新排序。确定排序请输入1, 返回上一级菜单请输入0:");
while(true){
scanf("%d", &answer);
getchar();
if(answer == 0 || answer == 1) break;
printf("输入错误!请重新输入:");
}
printf("请选择排序依据。0.姓名 1.学号 2.返回上一级菜单:");
while(true){
scanf("%d", &answer);
getchar();
if(answer == 0 || answer == 1 || answer == 2) break;
printf("输入错误!请重新输入:");
}
if(answer == 2) return;
if(!answer){
for(i = 0; i < db->matesnum - 1; i++){
for(j = i + 1; j < db->matesnum; j++){
if(strcmp(db->classmates[i]->name, db->classmates[j]->name) > 0){
n1 = db->classmates[i]->n;
db->classmates[i]->n = db->classmates[j]->n;
db->classmates[j]->n = n1;
temp = db->classmates[i];
db->classmates[i] = db->classmates[j];
db->classmates[j] = temp;
}
}
}
}else{
for(i = 0; i < db->matesnum - 1; i++){
for(j = i + 1; j < db->matesnum; j++){
if(strcmp(db->classmates[i]->number, db->classmates[j]->number) > 0){
n1 = db->classmates[i]->n;
db->classmates[i]->n = db->classmates[j]->n;
db->classmates[j]->n = n1;
temp = db->classmates[i];
db->classmates[i] = db->classmates[j];
db->classmates[j] = temp;
}
}
}
}
printf("排序完成。\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -