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

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 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)