在执行第二个功能时输出的学号是乱码是怎么回事?执行第三个功能时出现弹窗要求终止程序是什么原因?代码如下
#include "stdio.h"
#include "stdlib.h" //包含动态分配头函数
#include "string.h"
#include "time.h"
#define MAX 5
typedef int ElemType;
typedef ElemType *Triplet; //采用动态分配的顺序存储结构表示三元组
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
static int NUM=0;
//Status InitTriplet (Triplet);
//Status DestroyTriplet(Triplet);
//Status Get(Triplet,int,ElemType*);
//Status Put(Triplet,int,ElemType*);
//Status IsAscending(Triplet);
//Status IsDescending(Triplet);
//void sort_name(Triplet,ElemType);
void Print(Triplet);
Status InitTriplet (Triplet *T){ //构造三元组T
int n=1;
(*T)=(ElemType*)malloc(MAX*sizeof(ElemType));
srand((unsigned)time(NULL));
if ((*T)==NULL)
return OVERFLOW; //存储分配失败
while(n<=MAX-1){
//if(n==0) {*T=NULL;n++;continue;}
printf("\n请输入学号( 学号小于等于 0 则停止录入 ): ");
scanf("%d",&((*T)[n]));
if((*T)[n]<=0)
break;
n++;
NUM++;
}
return OK;
}
Status DestroyTriplet(Triplet T){ //销毁三元组T
free(T);
T=NULL;
return OK;
}
Status Get(Triplet T,int i,ElemType e){ //用e返回T的第i个元的值
int _num=NUM;
T[0]=i;
while(T[_num]!=i)
_num--;
if ( _num==0)
return ERROR;
e=T[i];
return OK;
}
Status Put(Triplet T,int i,ElemType *e){ //修改三元组第i个元的值为e
int _num=NUM;
T[0]=i;
while(T[_num]!=i)
_num--;
if ( _num==0)
return ERROR;
T[_num]=*e;
return OK;
}
Status IsAscending(Triplet T){ //判断学生表是否按学号递减
int f=1,_num=NUM;
for(;_num>0;_num--){
if(T[_num]>T[_num-1]){
f=0;
return f;
}
}
return f;
}
Status IsDescending(Triplet T){ //判断学生表是否按成绩递增
int f=1,_num=NUM;
for(;_num>0;_num--){
if(T[_num]<T[_num-1]){
f=0;
return f;
}
}
return f;
}
void sort_name(Triplet T,ElemType e){ //按学号递增排序
int i,j,f;
for(i=1;i<NUM+1;i++){
f=0;
for(j=NUM;j>i;j--){
if(T[j-1]>T[j]){
e=T[j];
T[j]=T[j-1];
T[j-1]=e;
f=1;
}
}
if(f==0)
break;
}
}
void Print(Triplet T){
int i;
for(i=1;i<=NUM;i++){
printf("\n学号: %d\t",T[i]);
}
printf("\n\n");
}
void Print_Elem(ElemType e){
printf("\n学号: %d\t",e);
printf("\n\n");
}
void main(){
Triplet T=NULL;
ElemType e;
int select, i;
printf("输入三个数,建立一个三元组: \n");
if(InitTriplet(&T)==OVERFLOW)
printf("分配失败,退出程序! ");
else //否则显示操作菜单,输入操作选择,直到结束
do {
printf("\n***************************************************\n");
printf("***\t1:打印输出学生信息\t\t\t***\n");
printf("***\t2:显示学号为i的学生信息\t\t\t***\n");
printf("***\t3:修改学号为i的学生的学号\t\t***\n" );
printf("***\t4:判断学生表是否按学号递减有序\t\t***\n");
printf("***\t5:判断学生表是否按学号递增排序\t\t***\n");
printf("***\t6:将学生表按学号递增排序\t\t***\n");
printf("***\t0:结束\t\t\t\t\t***\n");
printf("***************************************************\n");
scanf("%d",&select);
switch (select){
case 1:
printf("学生信息表为: \n");
Print(T);
break;
case 2:
do{
printf("i= ");
scanf("%d",&i);
if(Get(T,i,e)==ERROR)
printf("i值不合法!\n");
}while(i<=0||i>NUM);
Print_Elem(e);
break;
case 3:
printf("请输入待修改学生的学号信息和修改后学号信息( 旧学号和新学号用逗号间隔 ): ");
scanf("%d,%f",&i,&e);
if(Put(T,i,&e)==ERROR)
printf("i值不合法\n");
else{
printf("修改第%d位置后,该学生表内容为: \n",i);
Get(T,i,e);
}
break;
case 4:
if(IsAscending(T)==1)
printf("学生表按学号递减有序!\n");
else
printf("学生表不按学号递减有序!\n");
break;
case 5:
if(IsDescending(T)==1)
printf("学生表按学号递增排序!\n");
else
printf("学生表不按学号递增排序!\n");
break;
case 6:
sort_name(T,e);
printf("排序完毕,排后结果为: \n");
Print(T);
break;
case 0:
printf("操作结束!\n");
break;
default:
printf("输入选择出错!\n");
}//switch
}while(select!=0);
DestroyTriplet(T); //销毁三元组
}//main