Fresh.587 2022-03-10 19:54 采纳率: 88%
浏览 53
已结题

c语言在运行中出现弹框提示运行错误是怎么回事?

在执行第二个功能时输出的学号是乱码是怎么回事?执行第三个功能时出现弹窗要求终止程序是什么原因?代码如下

#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
  • 写回答

1条回答 默认 最新

  • Frank_Liuxing 2022-03-11 09:32
    关注

    第一个问题:在执行第二个功能时输出的学号是乱码是怎么回事?
    原因:Get函数的e是值传递,虽然在函数里面对e进行了赋值,但是不能传输到函数外。
    修改方案:将e改成指针类型即可。

    
    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;
    }
    

    第二个问题,没有出现。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月20日
  • 已采纳回答 3月12日
  • 创建了问题 3月10日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀