m0_63838329 2021-12-28 18:50 采纳率: 100%
浏览 39
已结题

请问以下这个系统程序如何将其数据结构结构改写成顺序表或者顺序表类?



```c

#include <string.h>
#include <conio.h> 
#include <stdlib.h>

struct Data
{
    char num[20];//编号
    char name[20];//姓名
    float playerScore[10];//十个评委的成绩 
    float sumScore;//总成绩
    float aveScore;//平均成绩 
}data;

void getContext()// 输入选手数据
{
    printf("请输入选手数据:(编号 姓名 )\n");
    printf("按999结束\n");
    getchar();
    while(1)
    {
        gets(data.num);
        if(strcmp(data.num,"999") == 0)//相等返回0 
        {
            break;
        }
        gets(data.name);
            
        FILE *p = fopen("xinxi.txt", "a+");    
        if(p == NULL)
        {
            printf("open error!\n");
        }   
        fputs(data.num,p);
        fputs("\t",p);
        fputs(data.name,p);
        fputs("\n",p);
                
        fclose(p);        
    }
}

void teachScore()//评委打分
{
    FILE *p1 = fopen("xinxi.txt","r");
    FILE *p2 = fopen("tmp.txt","w");
    if(p1 == NULL)    
    {
        printf("read error!\n");
    }
    if(p2 == NULL)    
    {
        printf("open error!\n");
    }
    char buf[999]; //定义缓冲区,用于暂时存储数据 
    while(fgets(buf, 100, p1) != NULL)
    {
        sscanf(buf,"%s%s", &data.num,&data.name);
        printf("请十位老师输入编号为%s的同学的成绩:\n",data.num);
        float sum = 0; 
        float min = 999, max = 0;
        
        for(int k = 0; k < 10; k++)
        {
            scanf("%f",&data.playerScore[k]);
            if(min > data.playerScore[k])
            {
                min = data.playerScore[k];
            }
            if(max < data.playerScore[k])
            {
                max = data.playerScore[k];
            }
            sum += data.playerScore[k];
        }
        data.sumScore = sum;
        int sum1 = 0;
        for(int t = 0; t < 10; t++)
        {
            if(data.playerScore[t] != max && data.playerScore[t] != min)
            {
                sum1 += data.playerScore[t];
            }
        }
        data.aveScore = sum1/8;
        fputs(data.num,p2);
        fputs("\t",p2); 
        fputs(data.name,p2);
        fputs("\t",p2); 
        for(int k = 0; k < 10; k++)
        {
            fprintf(p2, "%.2f", data.playerScore[k]);
            fputs("\t",p2);     
        }
        fprintf(p2, "%.2f", data.sumScore);
        fputs("\t",p2); 
        fprintf(p2, "%.2f", data.aveScore);
        fputs("\n",p2);
    }
    fclose(p1);
    fclose(p2);
    remove("xinxi.txt");
    rename("tmp.txt","xinxi.txt");
}

void scoreSeque()//成绩排序(按平均分)
{
    printf("编号\t姓名\t\t\t\t\t十位评委的成绩\t\t\t\t\t总成绩\t平均成绩\n") ;
    Data data2[999];
    FILE *p1 = fopen("xinxi.txt","r");
    if(p1 == NULL)    
    {
        printf("read error!\n");
    }
    int i = 0;
    while(!feof(p1))
    {
        fscanf(p1,"%s%s%f%f%f%f%f%f%f%f%f%f%f%f", &data2[i].num, &data2[i].name, &data2[i].playerScore[0], &data2[i].playerScore[1], &data2[i].playerScore[2], &data2[i].playerScore[3], &data2[i].playerScore[4], &data2[i].playerScore[5], &data2[i].playerScore[6], &data2[i].playerScore[7], &data2[i].playerScore[8], &data2[i].playerScore[9], &data2[i].sumScore, &data2[i].aveScore);
        i++;
    }
    i--;
    for(int n = 0; n < i-1; n++)
    {
        for(int m = 0; m < i-n-1; m++)
        {
            if(data2[m].aveScore > data2[m+1].aveScore)
            {
                float tmp = data2[m].aveScore;
                data2[m].aveScore = data2[m+1].aveScore;
                data2[m+1].aveScore = tmp;
            }
        }
    }

    FILE *p2 = fopen("tmp.txt","w");
    if(p2 == NULL)    
    {
        printf("open error!\n");
    }
    for(int n = 0; n < i; n++)
    {
        fputs(data2[n].num,p2);
        fputs("\t",p2); 
        fputs(data2[n].name,p2);  
        fputs("\t",p2); 
        printf("%s\t%s\t",data2[n].num,data2[n].name);
        for(int k = 0; k < 10; k++)
        {
            fprintf(p2, "%.2f", data2[n].playerScore[k]); 
            printf("%.2f\t", data2[n].playerScore[k]);
            fputs("\t",p2); 
        }      
        fprintf(p2, "%.2f", data2[n].sumScore);
        fputs("\t",p2); 
        fprintf(p2, "%.2f", data2[n].aveScore);
        fputs("\n",p2);
        printf("%.2f\t%.2f\n",data2[n].sumScore,data2[n].aveScore);
    }
    fclose(p1);
    fclose(p2);
    remove("xinxi.txt");
    rename("tmp.txt","xinxi.txt");
}

void findData()//数据查询
{
    printf("请输入要查询的学生的编号:\n");
    char my_num[20];
    getchar();
    gets(my_num);
     
    FILE *p1 = fopen("xinxi.txt","r");
    if(p1 == NULL)    
    {
        printf("read error!\n");
    }
    while(!feof(p1))
    {
        fscanf(p1,"%s%s%f%f%f%f%f%f%f%f%f%f%f%f", &data.num, &data.name, &data.playerScore[0], &data.playerScore[1], &data.playerScore[2], &data.playerScore[3], &data.playerScore[4], &data.playerScore[5], &data.playerScore[6], &data.playerScore[7], &data.playerScore[8], &data.playerScore[9], &data.sumScore, &data.aveScore);

        if(strcmp(data.num, my_num) == 0)//找到了 
        {
            printf("%s\t%s\t",data.num,data.name);    
            for(int j = 0; j < 10; j++)
            {
                printf("%.2f\t", data.playerScore[j]);
            }
            printf("%.2f\t%.2f", data.sumScore, data.aveScore);
            break;
        }
    }
    fclose(p1);
}

void addData()//追加选手数据
{
    printf("请输入要追加的选手数据:(编号 姓名 )\n");

    printf("按888结束\n");
    getchar();
    while(1)
    {
        gets(data.num);
        if(strcmp(data.num,"888") == 0)//相等返回0 
        {
            break;
        }
        gets(data.name);
            
        FILE *p = fopen("xinxi.txt", "a+");    
        if(p == NULL)
        {
            printf("open error!\n");
        }   
        fputs(data.num,p);
        fputs("\t",p);
        fputs(data.name,p);
        fputs("\n",p);
                
        fclose(p);        
    }
}

void fileSever()//写入数据文件
{
    printf("已存档\n"); 
}
    
void exitSys()//退出系统
{
    exit(0);
}
 
void Display()//菜单界面
{
    int choice = 0; 
    printf("\t\t========歌手比赛系统=======\t\t\n\n");
    printf("\t\t1、输入选手数据\t\t\n\n");
    printf("\t\t2、评委打分\t\t\n\n");
    printf("\t\t3、成绩排序(按平均分)\t\t\n\n");
    printf("\t\t4、数据查询\t\t\n\n");
    printf("\t\t5、追加选手数据\t\t\n\n");
    printf("\t\t6、写入数据文件\t\t\n\n");
    printf("\t\t7、退出系统\t\t\n\n");
    scanf("%d", &choice);
    switch(choice)
    {
        case 1:
            {
                getContext();// 输入选手数据
                break; 
            }
        case 2:
            {
                teachScore();//评委打分
                break;
            }
        case 3:
            {
                scoreSeque();//成绩排序(按平均分)
                break;
            }
        case 4:
            {
                findData();//数据查询
                break;
            }
        case 5:
            {
                addData();//追加选手数据
                break;
            }
        case 6:
            {
                fileSever();//写入数据文件
                break;
            }
        case 7:
            {
                exitSys();//退出系统
                break;
            }
    }
} 

int main()
{
    Display(); 
    return 0;
}


```

  • 写回答

1条回答 默认 最新

  • 关注

    定义一个新结构体,把原来的结构体数组放在新结构体中就是了

    struct stNode
    {
    struct Data dt[999]; //原来的结构体数组放在这里
    int len; //记录dt数组中实际元素个数
    };
    

    然后把原来代码中的struct Data data[999]数组,用一个struct stNode listnode;变量代替就可以了

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

报告相同问题?

问题事件

  • 系统已结题 1月9日
  • 已采纳回答 1月1日
  • 创建了问题 12月28日

悬赏问题

  • ¥15 chaquopy python 安卓
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题