Fresh.587 2022-03-13 00:00 采纳率: 88%
浏览 228
已结题

c语言中调用一个函数之后为什么直接导致了程序结束?

在执行case 6和case 8时调用SelectFavorite函数和Insert时直接结束了运行是怎么回事🤔

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define MAX 6
typedef struct node
{
    char num[15];
    char name[10];
    float price;
}ElemType;
typedef ElemType *Triplet;
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
static int NUM=0;
void Print(Triplet);
Status InitTriplet(Triplet *T)

{
    int n=1;
    char str1[15]="0";
    char str2[15]="0";
    (*T)=(ElemType*)malloc(MAX*sizeof(ElemType));
    srand ((unsigned)time(NULL));
    if((*T)==NULL)
        return OVERFLOW;
        printf("请输入图书的书号,书名和价格(数据之间用空格分隔)");
        scanf("%s%s%f",&(*T)[n].num[0],&(*T)[n].name[0],&(*T)[n].price);
    while(strcmp((*T)[n].num,str1)!=0||strcmp((*T)[n].name,str2)!=0||(*T)[n].price!=0){

            n++;
            NUM++;
            printf("请输入图书的书号,书名和价格(数据之间用空格分隔)");
        scanf("%s%s%f",&(*T)[n].num[0],&(*T)[n].name[0],&(*T)[n].price);
        }
    return NUM;
}
Status CreatTriplet(Triplet *T,int n)

{
    int i;    
    (*T)=(ElemType*)malloc(n*sizeof(ElemType));
        srand ((unsigned)time(NULL));
        if((*T)==NULL)
            return OVERFLOW;
        for(i=1;i<=n;i++)
        {
            printf("请输入图书的书号,书名和价格(数据之间用空格分隔)");
            scanf("%s%s%f",&(*T)[i].num[0],&(*T)[i].name[0],&(*T)[i].price);
        }
        return OK;
}
Status DestroyTriplet(Triplet T)
{
    free(T);
    T=NULL;
    return OK;
}
void Descending(Triplet T)
{
    float jiage;
    int i,j;
    for(i=1;i<=NUM-1;i++)
        for(j=1;j<=NUM-i;j++)
            if(T[j+1].price>T[j].price)
            {
                jiage=T[j].price;
                T[j].price=T[j+1].price;
                T[j+1].price=jiage;
            }

}
void Pricemodify(Triplet T)

{
    int i;
    float sum,average;
    sum=0;
    average=0;
    for(i=1;i<=NUM;i++)
    {
        sum+=T[i].price;
    }
    average=sum/(NUM*1.00);
    printf("%.2f",average);
    for(i=1;i<=NUM;i++)
    {
        if(T[i].price<average)
            T[i].price+=T[i].price*0.2;
        else T[i].price+=T[i].price*0.1;
    }

}
void Inversion(Triplet T,int n)

{
    int i; 
    char str1[15];
    char str2[10];
    float temp;
    for(i=1;i<=(n/2);i++)
    {
        strcpy(str1,T[i].num);
        strcpy(T[i].num,T[n-i].num);
        strcpy(T[n-i].num,str1);
        strcpy(str2,T[i].name);
        strcpy(T[i].name,T[n-i].name);
        strcpy(T[n-i].name,str2);
        temp=T[i].price;
        T[i].price=T[n-i].price;
        T[n-i].price=temp;
    }
}
void SelectExpensive(Triplet T,int n)

{
    int i;
    int count;
    float max;
    count=0;
    max=T[1].price;
    for(i=1;i<=n;i++)
    {
        if(max<T[n].price)
            max=T[n].price;
    }
    for(i=1;i<=n;i++)
    {
        if(T[i].price==max)
            count++;
    }
    printf("%d\n",count);

    for(i=1;i<=n;i++)
    {
        if(T[i].price==max)
            printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
            printf("\n");
    
    }
}
//void Input(int n)

//{
//    int i;
//    char str[10][15];
//    printf("请输入%d个最爱图书的名称:\n",n);
//    for(i=1;i<=n;i++)
 //  scanf("%14s",str[i][15]);
//}
void SelectFavorite(Triplet T,int num,int m)

{
    int count;
    int i,j;
    char str[MAX][15];
    count=0;
    printf("请输入最爱图书的名称:\n");
    for(i=1;i<=m;i++)
        scanf("%s",&str[i][15]);
    
       for(i=1;i<=m;i++)
    {
        for(j=1;j<=num;j++)
        {
        if(strcmp(str[i][15],T[j].name)==0)
        {
            printf("%14s %9s %.2f",T[j].num,T[j].name,T[j].price);
            count++;
            printf("\n");
        }
        }
    }
    printf("%d\n",count);

        if(count==0)
        printf("抱歉,没有你的最爱\n");
}
void SelectPoint(Triplet T,int n)

{
    int i;
    int point[MAX];
    printf("请输入想要查找的图书的位置:\n");
    for(i=1;i<=n;i++)
        scanf("%d",&point[i]);
    for(i=1;i<=n;i++)
    {
        if(point[i]==0)
            printf("抱歉,最佳位置上的图书不存在!\n");
        else 
        {
            printf("%14s%9s%.2f",T[point[i]].num,T[point[i]].name,T[point[i]].price);
            printf("\n");
        }
    }
    
}
void Insert(Triplet T,ElemType e,int num,int n)

{
    int i; 
//    for(i=1;i<n;i++)
//    {
//    printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
//    printf("\n");
//    }
//    printf("%14s %9s %.2f",T[n].num,T[n].name,T[n].price);
//    printf("\n");
    for(i=num+1;i>n;i--)
    {
        T[i]=T[i-1];

       // printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
        //printf("\n");
    }
    T[n]=e;
}
void Delete(Triplet T,int n,int num)

{
    int i;
    for(i=num;i<n;i++)
        T[num]=T[num+1];
}
int DeleteRepeat(Triplet T,int n)
{
    int i,j,k;
    for(i=1;i<=n;i++)
    {
        for(j=i+1;j<=n;j++)
        {
            if(strcmp(T[j].num,T[i].num)==0)
            {
                for(k=j+1;k<=n;k++)
                    T[k-1]=T[k];
                n--;
            }
        }
    }
      return n;
}
void Print_dx(Triplet T,int n)

{
    int i;
    for(i=n;i>=1;i--)
    {
        printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
        printf("\n");
    }
}
void Print_shu(Triplet T,int n)
{
    int i;
    for(i=1;i<=n;i++)
    {
        printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
        printf("\n");
    }
}
void Print(Triplet T)

{
    int i;
    for(i=1;i<=NUM;i++)
    {
        printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
        printf("\n");
    }
}
void main()

{
    Triplet T=NULL;
    ElemType e;
    int select;
    int n;
    int num;
    int m;
    int x;
    int y;
    int a;
    do{

            printf("\n****************************\n");
            printf("****\t1:打印图书信息\t\t\t****\n");
            printf("****\t2:打印按价格降序后的图书信息\t\t\t****\n");
            printf("****\t3:打印价格按平均价格修改后的图书信息\t\t\t****\n");
            printf("****\t4:图书信息表的逆序存储\t\t\t****\n");
            printf("****\t5:查找最贵图书的信息\t\t\t****\n");
            printf("****\t6:图书信息表最爱图书的查找\t\t\t****\n");
            printf("****\t7:图书信息表按位置查找\t\t\t****\n");
            printf("****\t8:图书信息表的新图书入库\t\t\t****\n");

            printf("****\t9:图书信息表的旧图书出库\t\t\t****\n");
            printf("****\t10:图书信息表的图书去重\t\t\t****\n");
            printf("****\t0:结束\t\t\t****\n");
            printf("\n****************************\n");
            scanf("%d",&select);
            switch (select)

            {
            case 1:
                    printf("输入三个数,建立一个三元组:\n");
                    if(InitTriplet(&T)==OVERFLOW)
                    printf("分配失败,退出程序!");
                    printf("图书信息表为:\n");
                    printf("%d",NUM);
                    printf("\n");
                    Print(T);
                    break;
            case 2:
                printf("输入三个数,建立一个三元组:\n");
                if(InitTriplet(&T)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("按价格降序排列后的图书信息表为:\n");
                Descending(T);
                Print(T);
                break;
            case 3:

                printf("输入三个数,建立一个三元组:\n");
                if(InitTriplet(&T)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("价格按平均价格修改后的图书信息为:\n");
                Pricemodify(T);
                Print(T);
                break;
            case 4:
                printf("请输入图书信息的个数:\n");
                scanf("%d",&n);
                if(CreatTriplet(&T,n)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("倒序后的图书信息表为:\n");
                Inversion(T,n);
                Print_dx(T,n);
                break;
            case 5:

                printf("请输入图书信息的个数:\n");
                scanf("%d",&n);
                if(CreatTriplet(&T,n)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("最贵图书的数目和信息为:\n");
                SelectExpensive(T,n);
                break;
            case 6:

                printf("请输入图书信息的个数:\n");
                scanf("%d",&n);
                if(CreatTriplet(&T,n)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("请输入想要查找最喜爱图书的次数:\n");
                scanf("%d",&num);
                SelectFavorite(T,n,num);
                break;
            case 7:

                printf("请输入图书信息的个数:\n");
                scanf("%d",&n);
                if(CreatTriplet(&T,n)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("请输入想要查找几次:\n");
                scanf("%d",&m);
                SelectPoint(T,m);
                break;
            case 8:

                printf("请输入图书信息的个数:\n");
                scanf("%d",&n);
                if(CreatTriplet(&T,n)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("请输入新信息插入的位置:\n");
                scanf("%d",&x);
                if(x>n||x<1)
                    printf("抱歉,入库位置非法!\n");
                else
                printf("请输入新的图书信息:\n");
                scanf("%s%s%f",e.num[0],e.name[0],e.price);
                Insert(T,e,n,x);
                Print_shu(T,(n+1));
                break;
            case 9:

                printf("请输入图书信息的个数:\n");
                scanf("%d",&n);
                if(CreatTriplet(&T,n)==OVERFLOW)
                printf("分配失败,退出程序!");
                printf("请输入想要删除的图书的位置:\n");
                scanf("%d",&y);
                Delete(T,n,y);
                Print_shu(T,(n-1));
                break;
            case 10:

                printf("请输入图书信息的个数:\n");
                scanf("%d",&n);
                if(CreatTriplet(&T,n)==OVERFLOW)
                printf("分配失败,退出程序!");
                a=DeleteRepeat(T,n);
                printf("去重之后的图书信息表为:\n");
                Print_shu(T,a);
                break;
            case 0:
                printf("操作结束!\n");
                break;
            default:
                printf("输入选择错误!\n");
            }

        }while(select!=0);
        DestroyTriplet(T);
}
  • 写回答

1条回答 默认 最新

  • [PE]经典八炮 2022-03-13 09:06
    关注
    #include<stdio.h>
    
    #include<stdlib.h>
    
    #include<string.h>
    #include<time.h>
    #define MAX 6
    typedef struct node
    {
        char num[15];
        char name[10];
        float price;
    }ElemType;
    typedef ElemType* Triplet;
    typedef int Status;
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    static int NUM = 0;
    void Print(Triplet);
    Status InitTriplet(Triplet* T)
    
    {
        int n = 1;
        char str1[15] = "0";
        char str2[15] = "0";
        (*T) = (ElemType*)malloc(MAX * sizeof(ElemType));
        srand((unsigned)time(NULL));
        if ((*T) == NULL)
            return OVERFLOW;
        printf("请输入图书的书号,书名和价格(数据之间用空格分隔)");
        scanf("%s%s%f", &(*T)[n].num[0], &(*T)[n].name[0], &(*T)[n].price);
        while (strcmp((*T)[n].num, str1) != 0 || strcmp((*T)[n].name, str2) != 0 || (*T)[n].price != 0) {
    
            n++;
            NUM++;
            printf("请输入图书的书号,书名和价格(数据之间用空格分隔)");
            scanf("%s%s%f", &(*T)[n].num[0], &(*T)[n].name[0], &(*T)[n].price);
        }
        return NUM;
    }
    Status CreatTriplet(Triplet* T, int n)
    
    {
        int i;
        (*T) = (ElemType*)malloc(n * sizeof(ElemType));
        srand((unsigned)time(NULL));
        if ((*T) == NULL)
            return OVERFLOW;
        for (i = 1; i <= n; i++)
        {
            printf("请输入图书的书号,书名和价格(数据之间用空格分隔)");
            scanf("%s%s%f", &(*T)[i].num[0], &(*T)[i].name[0], &(*T)[i].price);
        }
        return OK;
    }
    Status DestroyTriplet(Triplet T)
    {
        free(T);
        T = NULL;
        return OK;
    }
    void Descending(Triplet T)
    {
        float jiage;
        int i, j;
        for (i = 1; i <= NUM - 1; i++)
            for (j = 1; j <= NUM - i; j++)
                if (T[j + 1].price > T[j].price)
                {
                    jiage = T[j].price;
                    T[j].price = T[j + 1].price;
                    T[j + 1].price = jiage;
                }
    
    }
    void Pricemodify(Triplet T)
    
    {
        int i;
        float sum, average;
        sum = 0;
        average = 0;
        for (i = 1; i <= NUM; i++)
        {
            sum += T[i].price;
        }
        average = sum / (NUM * 1.00);
        printf("%.2f", average);
        for (i = 1; i <= NUM; i++)
        {
            if (T[i].price < average)
                T[i].price += T[i].price * 0.2;
            else T[i].price += T[i].price * 0.1;
        }
    
    }
    void Inversion(Triplet T, int n)
    
    {
        int i;
        char str1[15];
        char str2[10];
        float temp;
        for (i = 1; i <= (n / 2); i++)
        {
            strcpy(str1, T[i].num);
            strcpy(T[i].num, T[n - i].num);
            strcpy(T[n - i].num, str1);
            strcpy(str2, T[i].name);
            strcpy(T[i].name, T[n - i].name);
            strcpy(T[n - i].name, str2);
            temp = T[i].price;
            T[i].price = T[n - i].price;
            T[n - i].price = temp;
        }
    }
    void SelectExpensive(Triplet T, int n)
    
    {
        int i;
        int count;
        float max;
        count = 0;
        max = T[1].price;
        for (i = 1; i <= n; i++)
        {
            if (max < T[n].price)
                max = T[n].price;
        }
        for (i = 1; i <= n; i++)
        {
            if (T[i].price == max)
                count++;
        }
        printf("%d\n", count);
    
        for (i = 1; i <= n; i++)
        {
            if (T[i].price == max)
                printf("%14s %9s %.2f", T[i].num, T[i].name, T[i].price);
            printf("\n");
    
        }
    }
    //void Input(int n)
    
    //{
    //    int i;
    //    char str[10][15];
    //    printf("请输入%d个最爱图书的名称:\n",n);
    //    for(i=1;i<=n;i++)
     //  scanf("%14s",str[i][15]);
    //}
    void SelectFavorite(Triplet T, int num, int m)
    
    {
        int count;
        int i, j;
        char str[MAX][15];
        count = 0;
        printf("请输入最爱图书的名称:\n");
        for (i = 1; i <= m; i++)
            scanf("%s", str[i]);
    
        for (i = 1; i <= m; i++)
        {
            for (j = 1; j <= num; j++)
            {
                if (strcmp(str[i], T[j].name) == 0)
                {
                    printf("%14s %9s %.2f", T[j].num, T[j].name, T[j].price);
                    count++;
                    printf("\n");
                }
            }
        }
        printf("%d\n", count);
    
        if (count == 0)
            printf("抱歉,没有你的最爱\n");
    }
    void SelectPoint(Triplet T, int n)
    
    {
        int i;
        int point[MAX];
        printf("请输入想要查找的图书的位置:\n");
        for (i = 1; i <= n; i++)
            scanf("%d", &point[i]);
        for (i = 1; i <= n; i++)
        {
            if (point[i] == 0)
                printf("抱歉,最佳位置上的图书不存在!\n");
            else
            {
                printf("%14s%9s%.2f", T[point[i]].num, T[point[i]].name, T[point[i]].price);
                printf("\n");
            }
        }
    
    }
    void Insert(Triplet T, ElemType e, int num, int n)
    
    {
        int i;
        //    for(i=1;i<n;i++)
        //    {
        //    printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
        //    printf("\n");
        //    }
        //    printf("%14s %9s %.2f",T[n].num,T[n].name,T[n].price);
        //    printf("\n");
        for (i = num + 1; i > n; i--)
        {
            T[i] = T[i - 1];
    
            // printf("%14s %9s %.2f",T[i].num,T[i].name,T[i].price);
             //printf("\n");
        }
        T[n] = e;
    }
    void Delete(Triplet T, int n, int num)
    
    {
        int i;
        for (i = num; i < n; i++)
            T[num] = T[num + 1];
    }
    int DeleteRepeat(Triplet T, int n)
    {
        int i, j, k;
        for (i = 1; i <= n; i++)
        {
            for (j = i + 1; j <= n; j++)
            {
                if (strcmp(T[j].num, T[i].num) == 0)
                {
                    for (k = j + 1; k <= n; k++)
                        T[k - 1] = T[k];
                    n--;
                }
            }
        }
        return n;
    }
    void Print_dx(Triplet T, int n)
    
    {
        int i;
        for (i = n; i >= 1; i--)
        {
            printf("%14s %9s %.2f", T[i].num, T[i].name, T[i].price);
            printf("\n");
        }
    }
    void Print_shu(Triplet T, int n)
    {
        int i;
        for (i = 1; i <= n; i++)
        {
            printf("%14s %9s %.2f", T[i].num, T[i].name, T[i].price);
            printf("\n");
        }
    }
    void Print(Triplet T)
    
    {
        int i;
        for (i = 1; i <= NUM; i++)
        {
            printf("%14s %9s %.2f", T[i].num, T[i].name, T[i].price);
            printf("\n");
        }
    }
    void main()
    
    {
        Triplet T = NULL;
        ElemType e;
        int select;
        int n;
        int num;
        int m;
        int x;
        int y;
        int a;
        do {
    
            printf("\n****************************\n");
            printf("****\t1:打印图书信息\t\t\t****\n");
            printf("****\t2:打印按价格降序后的图书信息\t\t\t****\n");
            printf("****\t3:打印价格按平均价格修改后的图书信息\t\t\t****\n");
            printf("****\t4:图书信息表的逆序存储\t\t\t****\n");
            printf("****\t5:查找最贵图书的信息\t\t\t****\n");
            printf("****\t6:图书信息表最爱图书的查找\t\t\t****\n");
            printf("****\t7:图书信息表按位置查找\t\t\t****\n");
            printf("****\t8:图书信息表的新图书入库\t\t\t****\n");
    
            printf("****\t9:图书信息表的旧图书出库\t\t\t****\n");
            printf("****\t10:图书信息表的图书去重\t\t\t****\n");
            printf("****\t0:结束\t\t\t****\n");
            printf("\n****************************\n");
            scanf("%d", &select);
            switch (select)
    
            {
            case 1:
                printf("输入三个数,建立一个三元组:\n");
                if (InitTriplet(&T) == OVERFLOW)
                    printf("分配失败,退出程序!");
                printf("图书信息表为:\n");
                printf("%d", NUM);
                printf("\n");
                Print(T);
                break;
            case 2:
                printf("输入三个数,建立一个三元组:\n");
                if (InitTriplet(&T) == OVERFLOW)
                    printf("分配失败,退出程序!");
                printf("按价格降序排列后的图书信息表为:\n");
                Descending(T);
                Print(T);
                break;
            case 3:
    
                printf("输入三个数,建立一个三元组:\n");
                if (InitTriplet(&T) == OVERFLOW)
                    printf("分配失败,退出程序!");
                printf("价格按平均价格修改后的图书信息为:\n");
                Pricemodify(T);
                Print(T);
                break;
            case 4:
                printf("请输入图书信息的个数:\n");
                scanf("%d", &n);
                if (CreatTriplet(&T, n) == OVERFLOW)
                    printf("分配失败,退出程序!");
                printf("倒序后的图书信息表为:\n");
                Inversion(T, n);
                Print_dx(T, n);
                break;
            case 5:
    
                printf("请输入图书信息的个数:\n");
                scanf("%d", &n);
                if (CreatTriplet(&T, n) == OVERFLOW)
                    printf("分配失败,退出程序!");
                printf("最贵图书的数目和信息为:\n");
                SelectExpensive(T, n);
                break;
            case 6:
    
                printf("请输入图书信息的个数:\n");
                scanf("%d", &n);
                if (CreatTriplet(&T, n) == OVERFLOW)
                    printf("分配失败,退出程序!");
                printf("请输入想要查找最喜爱图书的次数:\n");
                scanf("%d", &num);
                SelectFavorite(T, n, num);
                break;
            case 7:
    
                printf("请输入图书信息的个数:\n");
                scanf("%d", &n);
                if (CreatTriplet(&T, n) == OVERFLOW)
                    printf("分配失败,退出程序!");
                printf("请输入想要查找几次:\n");
                scanf("%d", &m);
                SelectPoint(T, m);
                break;
            case 8:
    
                printf("请输入图书信息的个数:\n");
                scanf("%d", &n);
                if (CreatTriplet(&T, n) == OVERFLOW)
                    printf("分配失败,退出程序!");
                printf("请输入新信息插入的位置:\n");
                scanf("%d", &x);
                if (x > n || x < 1)
                    printf("抱歉,入库位置非法!\n");
                else
                    printf("请输入新的图书信息:\n");
                scanf("%s%s%f", e.num, e.name, &e.price);
                Insert(T, e, n, x);
                Print_shu(T, (n + 1));
                break;
            case 9:
    
                printf("请输入图书信息的个数:\n");
                scanf("%d", &n);
                if (CreatTriplet(&T, n) == OVERFLOW)
                    printf("分配失败,退出程序!");
                printf("请输入想要删除的图书的位置:\n");
                scanf("%d", &y);
                Delete(T, n, y);
                Print_shu(T, (n - 1));
                break;
            case 10:
    
                printf("请输入图书信息的个数:\n");
                scanf("%d", &n);
                if (CreatTriplet(&T, n) == OVERFLOW)
                    printf("分配失败,退出程序!");
                a = DeleteRepeat(T, n);
                printf("去重之后的图书信息表为:\n");
                Print_shu(T, a);
                break;
            case 0:
                printf("操作结束!\n");
                break;
            default:
                printf("输入选择错误!\n");
            }
    
        } while (select != 0);
        DestroyTriplet(T);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 已采纳回答 3月13日
  • 创建了问题 3月13日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog