C语言通讯录,能运行,就最后排序的,运行的时候出现乱码,该怎么改?可能是逻辑上有问题。会的帮忙 改下, 谢谢
#include<stdio.h>#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define N 10
struct student
{
char num[10];char name[10];char tel[10];
};
void myprint();
void mycreat(struct student *p,int n);
void mydisplay(struct student *p,int n);
void mysearch(struct student *p,int n);
void mymodify(struct student *p,int n);
void myadd(struct student *p,int n);
void mydelete(struct student *p,int n);
void mysort(struct student *p,int n);
main()
{
char choose='\0',yes_no='\0';
struct student record[N]={0}; //结构体对象, 用来存放N个学生的记录
do
{
myprint(); //显示菜单
choose=getche();
getch();
switch(choose)
{
case '1':mycreat(record,N); break; //创建
case '2':mydisplay(record,N); break; //显示
case '3':mysearch(record,N); break; //查询
case '4':mymodify(record,N); break; //修改
case '5':myadd(record,N); break; //添加
case '6':mydelete(record,N); break; //删除
case '7':mysort(record,N); break; //排序
case '0': break;
default:printf("\n %c为非法选项!\n",choose);
}
if(choose=='0') break;
printf("\n 要返回菜单吗(Y/N)?\n");
do
{
yes_no=getch();
}while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
}while(yes_no=='Y'||yes_no=='y');
}
void myprint() //显示菜单
{
system("cls"); //清空屏幕
printf("\n*****************通讯录系统*****************\n");
printf("\t请输入选项编号(0-7):");
printf("\t1.创建通讯录\n");
printf("\t2.显示通讯录\n");
printf("\t3.查询通讯录\n");
printf("\t4.修改通讯录\n");
printf("\t5.添加通讯录\n");
printf("\t6.删除通讯录\n");
printf("\t7.排序通讯录\n");
printf("\t0.保存并退出!\n");
printf("*************************************************\n");
printf("\t请选择:\n");
}
void mycreat(struct student *p,int n) //创建
{
int i=1;
char yes_no='\0';
system("cls");
while(i<=n)
{
do
{
printf("\n");
printf("请输入第%d个学生的记录:\n",i);
printf("请输入学号:\n");
do
{
gets(p->num);
}while(strcmp(p->num,"")==0);
printf("姓名:\n");
gets(p->name);
printf("电话号码:\n");
gets(p->tel);
i++;
p++;
printf("还要继续输入么(Y/N?)\n");
do
{
yes_no=getch();
}while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
}while(yes_no=='y'||yes_no=='y');
if(yes_no!='y'||yes_no!='Y') break;
}
}
void mydisplay(struct student *p,int n) //显示
{
system("cls");
int i=0;
printf(" 学号 姓名 电话号码\n");
for(i=0;i<n;i++)
{
printf("%20s%17s%17s\n",p->num,p->name,p->tel);
p++;
}
}
void mysearch(struct student *p,int n) //查询
{
int i=0,m=0,flag=0;
struct student *q=NULL; //定义一个指针变量
char c='\0',nam[10]="",nm[10]="";
system("cls");
q=p; //使其初始指向位置相同
printf("请选择想要查询人的方式:1.通过学号查询; 2.通过姓名查询; 3.结束查询:");
c=getch();
printf("%c\n",c);
switch(c)
{
case '1':
printf("\n请输入要查询的学号:");
do
{
gets(nm);
}while(strcmp(nm,"")==0);
for(i=0;i<n;i++,p++)
{
if(strcmp(nm,p->num)==0)
{
printf(" 学号 姓名 电话号码\n");
printf("%20s%17s%17s\n",p->num,p->name,p->tel);
flag=1;
break;
}
}
if(flag==0) printf("输入有误或者查无此人!\n");
break;
case '2':
printf("\n请输入要查询的姓名:\n");
gets(nam);
for(i=0;i<n;i++,p++)
{
if(strcmp(nam,p->name)==0)
{
printf(" 学号 姓名 电话号码\n");
printf("%20s%17s%17s\n",p->num,p->name,p->tel);
break;
}
}
if(i==n) printf("输入有误或者查无此人!\n");
break;
case '3':break;
default :
printf("\n %d为非法选项\n",m);
}
}
void mymodify(struct student *p,int n) //修改
{
int i=0; char nam[10]="";
struct student *q=p;
mydisplay(p,n);
printf("\n请输入要修改记录的姓名:");
gets(nam);
for(i=0;i<n;i++,p++)
if(strcmp(nam,p->name)==0) break; //找到记录结束循环
if(i==n) printf("无此人!\n");
else
{
printf("\n请输入正确的学号:");
do
{
gets(p->num);
}while(strcmp(p->num,"")==0);
printf("\n请输入正确的姓名:"); gets(p->name);
printf("\n请输入正确的电话号码:"); gets(p->tel);
}
printf("\n\n");
printf(" 学号 姓名 电话号码\n");
for(p=q;p-q<n;p++)
{
printf("%20s%17s%17s\n",p->num,p->name,p->tel);
}
}
void myadd(struct student *p,int n) //添加
{
int i=0,sum=0;
char yes_no='\0';
struct student *q=p;
char addnum[10]="",addname[10]="",addtel[10]="";
system("cls");
mydisplay(p,n);
printf("\n请输入总人数:");
scanf("%d",&sum);
printf("\n创建的总人数有:%d人\n",sum);
do
{
printf("\n请输入新纪录的学号:");
do
{
gets(addnum);
}while(strcmp(addnum,"")==0);
printf("\n请输入姓名:"); gets(addname);
printf("\n请输入电话号码:"); gets(addtel);
for(i=0;i<sum;i++) p=p+1; //使指针指向已添加的最后
if(p-q<=n)
{
strcpy(p->num,addnum);
strcpy(p->name,addname);
strcpy(p->tel,addtel);
}
printf("还要继续输入么(Y/N?)\n");
do
{
yes_no=getch();
}while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
}while(yes_no=='Y'||yes_no=='y');
printf(" 学号 姓名 电话号码\n");
for(p=q;p-q<n;p++)
{
printf("%20s%17s%17s\n",p->num,p->name,p->tel);
}
}
void mydelete(struct student *p,int n) //删除
{
int i=0,j=0;
struct student *q=NULL;
char yes_no='\0';
char detnm[10]="";
q=p;
mydisplay(p,n);
do
{
printf("\n请输入要删除记录的学号:");
do
{
gets(detnm);
}while(strcmp(detnm,"")==0);
p=q;
for(i=0;i<n;i++,p++)
{
if(strcmp(detnm,p->num)==0) break;
}
if(p-q<n)
{
for(;p-q<n-1;p++)
{
strcpy(p->num,(p+1)->num);
strcpy(p->name,(p+1)->name);
strcpy(p->tel,(p+1)->tel);
}
printf("删除后的记录:\n");
printf(" 学号 姓名 电话号码\n");
p=q;
n=n-1;
for(i=0;i<n;i++)
{
printf("%20s%17s%17s\n",p->num,p->name,p->tel);
p++;
}
}
else
printf("\n查无此人\n");
printf("还要继续输入么(Y/N?)\n");
do
{
yes_no=getch();
}while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
}while(yes_no=='Y'||yes_no=='y');
}
void mysort(struct student *p,int n) //排序
{
int i=0;
struct student *q=NULL;
char temp[10]={0};
char c='\0';
system("cls");
q=p;
mydisplay(p,n);
printf("请选择排序的方式:1.按学号排序 2.按姓名排序: ");
c=getch();
printf("%c",c);
switch(c)
{
case '1':
for(i=0;i<n;i++,p++)
{
for(q=p+1;q-p<n-i;q++)
{
if(strcmp(p->num,q->num)>0)
{
strcpy(temp,p->num);
strcpy(p->num,q->num);
strcpy(q->num,temp);
strcpy(temp,p->name);
strcpy(p->name,q->name);
strcpy(q->name,temp);
strcpy(temp,p->tel);
strcpy(p->tel,q->tel);
strcpy(q->tel,temp);
}
}
}
printf("\n\n 学号 姓名 电话号码\n");
for(i=0;i<n;i++)
{
printf("%20s%17s%17s\n",p->num,p->name,p->tel);
p++;
}
break;
case '2':
for(i=0;i<n;i++,p++)
{
for(q=p+1;q-p<n-i;q++)
{
if(strcmp(p->name,q->name)>0)
{
strcpy(temp,p->num);
strcpy(p->num,q->num);
strcpy(q->num,temp);
strcpy(temp,p->name);
strcpy(p->name,q->name);
strcpy(q->name,temp);
strcpy(temp,p->tel);
strcpy(p->tel,q->tel);
strcpy(q->tel,temp);
}
}
}
printf("\n\n 学号 姓名 电话号码\n");
for(i=0;i<n;i++)
{
printf("%20s%17s%17s\n",p->num,p->name,p->tel);
p++;
}
break;
default: printf("\n\n %c为非法输入!\n",c);break;
}
}