senlijiu 2017-12-07 03:41 采纳率: 100%
浏览 10846
已采纳

关于c语言从文件中读取学生信息,处理并打印

图片说明
b) 建议函数流程:
i. 打开数据文件,失败返回-1;
ii. 从头到尾扫描数据文件(即预读一遍)获得学生人数;
iii. 根据学生人数,利用malloc和sizeof等函数或运算符为struct student** pStudents分配内存;
iv. 利用rewind函数,定位到文件头;
v. 读取数据文件,并把每一条记录通过数组下标法或指针法保存到结构体数组pStudents中;
vi. 关闭文件;
vii. 返回学生人数。

c) 数据文件格式说明:
一行一条学生信息的记录,不同属性用空格隔开,输入数据中无总成绩记录,例如:
张三 通信 89 93 95
李四 网络 88 91 94
王五 物联网 71 94 88

  1. 编写统计函数:
    a) 函数定义void Count(struct student pStudents[], int num)。输入参数分别为保存学生的结构体数组和学生人数。
    b) 功能为:统计所有学生的总成绩和每个专业(假定一共三个专业:通信,网络,物联网)的平均成绩;输入参数包括学生信息结构体数组,学生人数,返回的每个学生的总成绩直接填充到对应的输入结构体数组对应字段中。统计信息包括三个专业的总人数、平均成绩数组,用全局变量来表示。访问每个学生信息的时候,用指针来指向当前正在处理的学生。
    c) 设计一个或者三个带参数的宏,判断输入的字符串是否是指定的专业名称,并在函数Count中使用。

  2. 编写main函数实现:
    a) 定义变量,其中保存学生信息的数据文件直接在源代码中初始化;
    b) 读取学生信息,如果失败,打印失败信息并退出程序;
    c) 统计学生信息;
    d) 输出统计信息。
    e) 释放内存。

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

struct student{
    char name[15];
    char major[15];
    int Eng_sco;
    int cal_sco;
    int c_sco;
    int sum;
};
int tx_per=0,tx_ave,tx_sum=0;
int wl_per=0,wl_ave,wl_sum=0;
int wlw_per=0,wlw_ave,wlw_sum=0;
int ReadStudentInfo(const char* filename, struct student** pStudents);
void Count(struct student pStudents[], int num);
int main()
{

    int count;
    int m;
    struct student *list;
    count=ReadStudentInfo("readme.txt", &list);
    printf("学生信息: \n");
    printf("----------------------------------------------------\n");
    printf("序号  姓 名  专业名称 英语成绩 线性代数成绩 c语言成绩 总成绩\n");
    for(m=1;m<=count;m++)
    {
        printf("%4d %s %s %4d %4d %4d %4d\n",m,(list+m-1)->name,(list+m-1)->major,(list+m-1)->Eng_sco,(list+m-1)->cal_sco,(list+m-1)->c_sco,(list+m-1)->sum);
    }
    Count(list, count);
    printf("\n统计信息 :\n");
    printf("----------------------------------------------------\n");
    printf("序号  专业名称 学生人数 平均成绩\n");
    printf("   1    通信      %d       %d\n",tx_per,tx_ave);
    printf("   2    网络      %d       %d\n",wl_per,wl_ave);
    printf("   3   物联网     %d       %d\n",wlw_per,wlw_ave);

    return 0;
}
int ReadStudentInfo(const char* filename, struct student** pStudents)
{
    FILE *fp;
    char ch;
    int i=1,j;
    fp=fopen(readme.txt,"r");
    if(fp==NULL)
    {
        printf("cann't open the file");
        exit(-1);
    }
    ch=fgetc(fp);
    while(ch!=EOF)
    {
        if(ch=='\n')
        {
            i++;
        }
        ch=fgetc(fp);
    }
    rewind(fp);
     *pStudents=(struct student*)malloc(sizeof(** pStudents)*i);
    for(j=0;j<i;j++)
    {
        fread(&*pStudents[j],sizeof(struct student)-sizeof(int),1,fp);
        (*pStudents+j)->sum=((*pStudents+j)->Eng_sco+(*pStudents+j)->cal_sco+(*pStudents+j)->c_sco);
    }
    fclose(fp);
    return i;
}
void Count(struct student pStudents[], int num)
{
    int n=1;
    for(n=1;n<=num;n++)
    {
        if(!strcmp((pStudents+n-1)->major,"通信"))
        {
            tx_per++;
            tx_sum=tx_sum+(pStudents+n-1)->sum;
        }
        if(!strcmp((pStudents+n-1)->major,"网络"))
        {
            wl_per++;
            wl_sum=wl_sum+(pStudents+n-1)->sum;
        }
        if(!strcmp((pStudents+n-1)->major,"物联网"))
        {
            wlw_per++;
            wlw_sum=wlw_sum+(pStudents+n-1)->sum;
        }
        tx_ave=tx_sum/tx_per;
        wl_ave=wl_sum/wl_per;
        wlw_ave=wlw_sum/wlw_per;
    }
    free(pStudents);
}

运行不起来,是哪里出问题了?

  • 写回答

13条回答 默认 最新

  • barry_di 2017-12-07 06:41
    关注
     \#include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct student{
        char name[15];
        char major[15];
        int Eng_sco;
        int cal_sco;
        int c_sco;
        int sum;
    };
    int tx_per=0,tx_ave,tx_sum=0;
    int wl_per=0,wl_ave,wl_sum=0;
    int wlw_per=0,wlw_ave,wlw_sum=0;
    int ReadStudentInfo(const char* filename, struct student** pStudents);
    void Count(struct student pStudents[], int num);
    int main()
    {
    
        int count;
        int m;
        struct student *list;
        count=ReadStudentInfo("stu.txt", &list);
        printf("学生信息: \n");
        printf("----------------------------------------------------\n");
        printf("序号  姓名  专业名称  英语成绩   线性代数成绩    c语言成绩   总成绩\n");
        for(m=1;m<=count;m++)
        {
            printf("%4d %6s %6s %4d %4d %4d %4d\n",m,(list+m-1)->name,(list+m-1)->major,(list+m-1)->Eng_sco,(list+m-1)->cal_sco,(list+m-1)->c_sco,(list+m-1)->sum);
        }
        Count(list, count);
        printf("\n统计信息 :\n");
        printf("----------------------------------------------------\n");
        printf("序号  专业名称 学生人数 平均成绩\n");
        printf("   1    通信      %d       %d\n",tx_per,tx_ave);
        printf("   2    网络      %d       %d\n",wl_per,wl_ave);
        printf("   3   物联网     %d       %d\n",wlw_per,wlw_ave);
    
        return 0;
    }
    void CutString(char* buf,char*temp,char sp);
    int ReadStudentInfo(const char* filename, struct student** pStudents)
    {
        FILE *fp;
        char ch;
        int i=1,j;
        fp=fopen(filename,"r");
        if(fp==NULL)
        {
            printf("cann't open the file");
            exit(-1);
        }
        ch=fgetc(fp);
        while(ch!=EOF)
        {
            if(ch=='\n')
            {
                i++;
            }
            ch=fgetc(fp);
        }
        rewind(fp);
        *pStudents=(struct student*)malloc(sizeof(** pStudents)*i);
    
        char buf[512]={0};
        for(j=0;j<i;j++)
        {
            memset(*pStudents+j,0,sizeof(struct student));
            fgets(buf,512,fp);
            int len = strlen(buf);
            buf[len]=' ';
    
    
            CutString(buf,(*pStudents+j)->name,' ');
            CutString(buf,(*pStudents+j)->major,' ');
            char e_Score[8],cal_Score[8],c_Score[8];
    
            memset(e_Score,0,8);
            memset(cal_Score,0,8);
            memset(c_Score,0,8);
            CutString(buf,e_Score,' ');
            (*pStudents+j)->Eng_sco = atoi(e_Score);
            CutString(buf,cal_Score,' ');
            (*pStudents+j)->cal_sco = atoi(cal_Score);
            CutString(buf,c_Score,' ');
            (*pStudents+j)->c_sco = atoi(c_Score);
            (*pStudents+j)->sum=((*pStudents+j)->Eng_sco+(*pStudents+j)->cal_sco+(*pStudents+j)->c_sco);
        }
        fclose(fp);
        return i;
    }
    
    void CutString(char* buf,char*temp,char sp)
    {
        int len = strlen(buf);
        for (int i=0;i<len;i++)
        {
            if (buf[i]==sp)
            {
                memcpy(buf,buf+i+1,strlen(buf+i+1));
                break;
            }
            temp[i] = buf[i];
        }
    }
    
    void Count(struct student pStudents[], int num)
    {
        int n=1;
        for(n=1;n<=num;n++)
        {
            if(!strcmp((pStudents+n-1)->major,"通信"))
            {
                tx_per++;
                tx_sum=tx_sum+(pStudents+n-1)->sum;
                tx_ave=tx_sum/tx_per;
            }
            if(!strcmp((pStudents+n-1)->major,"网络"))
            {
                wl_per++;
                wl_sum=wl_sum+(pStudents+n-1)->sum;
                wl_ave=wl_sum/wl_per;
            }
            if(!strcmp((pStudents+n-1)->major,"物联网"))
            {
                wlw_per++;
                wlw_sum=wlw_sum+(pStudents+n-1)->sum;
                wlw_ave=wlw_sum/wlw_per;
            }    
        }
        free(pStudents);
    }
    
    
    

    闲来无事,改了一把, 拿过去跑一把吧

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(12条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题