关于#C语言#的问题,如何解决?


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning(suppress : 4996) 

const int N = 10010;//结构体数组最大容量
const int LEN = 50;//名字最大长度 

typedef struct
{
    char name[LEN];//名字 
    int snumber;//编号 
    double avecore;//平均分 
}singerinf;

singerinf singers[N];//结构体数组,每一个元素都是一个singerinf类型 
int cnt = 0;//记录数组用到哪个位置


void menu()
{
    printf("====================================\n");
    printf("1.歌手信息录入\n");
    printf("2.排序并查看所有歌手信息\n");
    printf("3.歌手查询\n");
    printf("4.读取数据\n");
    printf("5.保存数据\n");
    printf("6.退出\n");
    printf("====================================\n");
}

void insingerinf()
{
    singerinf singer;
    printf("请输入名字\n");
    scanf_s("%s", singer.name);
    printf("请输入歌手编号\n");
    scanf_s("%d", &singer.snumber);
    printf("请输入十个评委的分数\n");
    double core = 0, sum = 0, k;
    for (k = 1; k <= 10; k++)
    {
        printf("第%.0lf位评委的评分为:\n", k);
        scanf_s("%lf", &core);
        sum += core;
    }
    singer.avecore = sum / 10.00;

    singers[cnt++] = singer;
    int idx1 = cnt - 1;
    printf("-------------------录入成功!-------------------\n");
    printf("歌手姓名:%s\n", singers[idx1].name);
    printf("歌手编号:%d\n", singers[idx1].snumber);
    printf("歌手均分:%.2lf\n", singers[idx1].avecore);
    //printf("cnt = %d\n",cnt);
    printf("------------------------------------------------\n");
}
void sortcheck(singerinf q[], int l, int r)//按平均分快速排序 
{
    if (l >= r) return;
    int i = l - 1, j = r + 1, x = q[(l + r) / 2].avecore;
    while (i < j)
    {
        do i++; while (q[i].avecore < x);
        do j--; while (q[j].avecore > x);
        if (i < j)
        {
            singerinf t = q[i];
            q[i] = q[j];
            q[j] = t;
        }
    }
    sortcheck(q, l, j);
    sortcheck(q, j + 1, r);
}

void check()
{
    for (int i = 0; i < cnt; i++)
    {
        printf("-------------------------------\n");
        printf("歌手姓名:%s\n", singers[i].name);
        printf("歌手编号:%d\n", singers[i].snumber);
        printf("歌手均分:%.2lf\n", singers[i].avecore);
        printf("-------------------------------\n");
    }
    printf("排序已完成!\n");
}

void inffind()
{
    printf("---------------------------------\n");
    printf("请输入查询姓名:");
    char fname[LEN];
    scanf_s("%s", fname);
    for (int i = 0; i < cnt; i++)
    {
        if (!strcmp(fname, singers[i].name))
        {
            printf("歌手姓名%s\n", singers[i].name);
            printf("歌手编号%d\n", singers[i].snumber);
            printf("歌手均分%.2lf\n", singers[i].avecore);
            break;
        }
    }
    printf("---------------------------------\n");
}

void savedata()
{
    FILE* fp = NULL;
    fp = fopen("data.txt", "wb");
    //写入
    for (int i = 0; i < cnt; i++)
    {
        fwrite(&singers[i], sizeof(singerinf), 1, fp);
    }

    fclose(fp);
}

void readdata()
{
    FILE* fp = NULL;
    fp = fopen("data.txt", "rb");

    //读出 
    int i = 0;
    while (!feof(fp))
    {
        fread(&singers[i], sizeof(singerinf), 1, fp);
        //printf("name = %s\n",singers[i].name);
        //printf(" i = %d\n",i);
        i++;
    }
    i--;

    cnt = i;

    fclose(fp);
    printf("读取成功!\n");
}

int main()
{
    menu();
    int op;
    while (1)
    {
        scanf_s("%d", &op);
        if (op == 1)
        {
            system("cls");
            insingerinf();
            menu();
        }
        else if (op == 2)
        {
            system("cls");
            sortcheck(singers, 0, cnt - 1);
            check();
            menu();
        }
        else if (op == 3)
        {
            system("cls");
            inffind();
            menu();
        }
        else if (op == 4)
        {
            system("cls");
            readdata();
            menu();
        }
        else if (op == 5)
        {
            system("cls");
            savedata();
            menu();
        }
        else if (op == 6)
        {
            break;
        }
        else printf("intput errpr!!\n");
    }

    return 0;
}

注意scanf_s输出字符串时的格式

我只是在vs上运行调试了一下代码问题,细节请自己关注



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning(suppress : 4996) 

const int N = 10010;//结构体数组最大容量
const int LEN = 50;//名字最大长度 

typedef struct
{
    char name[LEN];//名字 
    int snumber;//编号 
    double avecore;//平均分 
}singerinf;

singerinf singers[N];//结构体数组,每一个元素都是一个singerinf类型 
int cnt = 0;//记录数组用到哪个位置


void menu()
{
    printf("====================================\n");
    printf("1.歌手信息录入\n");
    printf("2.排序并查看所有歌手信息\n");
    printf("3.歌手查询\n");
    printf("4.读取数据\n");
    printf("5.保存数据\n");
    printf("6.退出\n");
    printf("====================================\n");
}

void insingerinf()
{
    singerinf singer;
    printf("请输入名字\n");
    scanf_s("%s", singer.name, LEN);
    printf("请输入歌手编号\n");
    scanf_s("%d", &singer.snumber);
    printf("请输入十个评委的分数\n");
    double core = 0, sum = 0, k;
    for (k = 1; k <= 10; k++)
    {
        printf("第%.0lf位评委的评分为:\n", k);
        scanf_s("%lf", &core);
        sum += core;
    }
    singer.avecore = sum / 10.00;

    singers[cnt++] = singer;
    int idx1 = cnt - 1;
    printf("-------------------录入成功!-------------------\n");
    printf("歌手姓名:%s\n", singers[idx1].name);
    printf("歌手编号:%d\n", singers[idx1].snumber);
    printf("歌手均分:%.2lf\n", singers[idx1].avecore);
    //printf("cnt = %d\n",cnt);
    printf("------------------------------------------------\n");
}
void sortcheck(singerinf q[], int l, int r)//按平均分快速排序 
{
    if (l >= r) return;
    int i = l - 1, j = r + 1;
    double x = q[(l + r) / 2].avecore;
    while (i < j)
    {
        do i++; while (q[i].avecore < x);
        do j--; while (q[j].avecore > x);
        if (i < j)
        {
            singerinf t = q[i];
            q[i] = q[j];
            q[j] = t;
        }
    }
    sortcheck(q, l, j);
    sortcheck(q, j + 1, r);
}

void check()
{
    for (int i = 0; i < cnt; i++)
    {
        printf("-------------------------------\n");
        printf("歌手姓名:%s\n", singers[i].name);
        printf("歌手编号:%d\n", singers[i].snumber);
        printf("歌手均分:%.2lf\n", singers[i].avecore);
        printf("-------------------------------\n");
    }
    printf("排序已完成!\n");
}

void inffind()
{
    printf("---------------------------------\n");
    printf("请输入查询姓名:");
    char fname[LEN] = {0};
    scanf_s("%s", fname, LEN);
    for (int i = 0; i < cnt; i++)
    {
        if (!strcmp(fname, singers[i].name))
        {
            printf("歌手姓名%s\n", singers[i].name);
            printf("歌手编号%d\n", singers[i].snumber);
            printf("歌手均分%.2lf\n", singers[i].avecore);
            break;
        }
    }
    printf("---------------------------------\n");
}

void savedata()
{
    FILE* fp = NULL;
   // fp = fopen("data.txt", "wb");
    if (fopen_s(&fp, "data.txt", "wb") != 0)
    {
        return;
    }
    //写入
    for (int i = 0; i < cnt; i++)
    {
        fwrite(&singers[i], sizeof(singerinf), 1, fp);
    }

    fclose(fp);
}

void readdata()
{
    FILE* fp = NULL;
    
    if (fopen_s(&fp, "data.txt", "rb") != 0)
    {
        return;
    }
    //读出 
    int i = 0;
    while (!feof(fp))
    {
        fread(&singers[i], sizeof(singerinf), 1, fp);
        //printf("name = %s\n",singers[i].name);
        //printf(" i = %d\n",i);
        i++;
    }
    i--;

    cnt = i;

    fclose(fp);
    printf("读取成功!\n");
}

int main()
{
    menu();
    int op;
    while (1)
    {
        scanf_s("%d", &op);
        if (op == 1)
        {
            system("cls");
            insingerinf();
            menu();
        }
        else if (op == 2)
        {
            system("cls");
            sortcheck(singers, 0, cnt - 1);
            check();
            menu();
        }
        else if (op == 3)
        {
            system("cls");
            inffind();
            menu();
        }
        else if (op == 4)
        {
            system("cls");
            readdata();
            menu();
        }
        else if (op == 5)
        {
            system("cls");
            savedata();
            menu();
        }
        else if (op == 6)
        {
            break;
        }
        else printf("intput errpr!!\n");
    }

    return 0;
}