土间圆 2021-06-12 22:03 采纳率: 72.7%
浏览 67
已结题

做了一个求学生中不及格人数的程序

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

char *iin="%d%s%s%d%d%d%d%d";
char *oout="%-12d%-8s%-10s%-4d%-4d%-4d%-4d%-4d";

struct STU 
{
	int id;
	char name[10];
	char zy[20];
	int sc1,sc2,sc3,sc4,sc5;
};

int input(char *in,struct STU *ps);
void p_int(struct STU *ps,int n);
void yx(struct STU *p,int n);
void bjg(struct STU *p,int n);

void main()
{
	struct STU stu[200];
	int NUM;
	NUM=input("13.txt",stu);
	p_int(stu,NUM);
	yx(stu,NUM);
	bjg(stu,NUM);
}
//***************
//***************
int input(char *in,struct STU *p)
{
	FILE *fp;
	int i;
	if((fp=fopen(in,"r"))==NULL)
	{
		puts("未找到文件!\n");
		exit(1);
	}
	i=6;
	while(1)
	{
		if(fscanf(fp,"%d%s%s%d%d%d%d%d\n",&p->id ,p->name ,p->zy ,&p->sc1 ,&p->sc2 ,&p->sc3 ,&p->sc4,&p->sc5)!=8)break;
		i++;
		p++;
	}
	fclose(fp);
	return i;
}
//**************
//**************
void p_int(struct STU *p,int n)
{
	int i;
	for(i=6;i<n;i++)
	{
		printf(oout,&p->id ,p->name ,p->zy ,&p->sc1 ,&p->sc2 ,&p->sc3 ,&p->sc4,&p->sc5);
		if((i+1)%4==0)
		printf("\n");
		p++;		
	}
}
//**************
//**************
void yx(struct STU *p,int n)
{
	double count=0;
	int i;
	for(i=0;i<n;i++)
	{
		if(p->sc1 >=90)
			count++;
		printf("C语言优秀率为%.1f\n",count/n);
		p++;
	}
}
//*************
//*************
void bjg(struct STU *p,int n)
{
	int num=0;
	double total=0;
	for(i=0;i<n;i++)
	{
		if(p->sc1 <60)
		count++;
		if(p->sc2 <60)
			count++;
		if(p->sc3 <60)
			count++;
		if(p->sc4 <60)
			count++;
		printf("%s学生不及格科目为%d\n学号为%d\n\n\n",p->name ,count,&p->id );
		p++;
	}
		break;
}

bjg就是不及格,yx函数是算yx率的。

又输出了好多烫烫烫

下面这部分是13.txt文件的样子

 

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2021-06-13 11:13
    关注

    代码修改如下,估计读出13.txt文件时,大概率的会在汉字部分出现乱码,代码里注释说明,可以运行下手工输入记录重新写入文件,然后就可以正确显示,供参考:

    //一般来说,不可以自己手动打开文件进行写操作,要使用文件写的函数如(fputs();fscanf();fwrite();)
    //等函数将信息写入文件,再用相对的文件读取出数据如(fgetc();fprintf();fread();)等。
    //数据读出写入都使用一定的格式处理就不容易出问题,随便使用,可能会导致某个数据块多一个空格等多余数据,
    //那么使用函数读出的时候,就会出现把这个数据块后面一个数据块取出的时候空格就会占一个位置就会导致后面
    //数据都对不上号的问题。由此就出问题了,我们可以把文件重新严格写入新数据,再读出看看。
    
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    char *iin="%d%s%s%d%d%d%d%d\n";
    char *oout="%-12d%-10s%-20s%-4d%-4d%-4d%-4d%-4d\n\n";
    struct STU
    {
    	int  id;
    	char name[10];
    	char zy[20];
    	int  sc1,sc2,sc3,sc4,sc5;
    };
    
    int  input(char *in,struct STU *ps);
    void p_int(struct STU *ps,int n);
    void yx(struct STU *p,int n);
    void bjg(struct STU *p,int n);
    
    void save_f(char *in,struct STU *p);
    
    int  main()
    {
    	struct STU stu[200]={0};
    	int NUM;
            //save_f("123456.txt",stu);//这里增加一个写文件的操作,主要是原文件的写入格式不一定和代码里
                                       //相同,读出时汉字部分就会出现乱码。
    	NUM=input("123456.txt",stu);
    	p_int(stu,NUM);
    	yx(stu,NUM);
    	bjg(stu,NUM);
       
        return 0;
    }
    //***************
    //***************
    void save_f(char *in,struct STU *p)
    {
           int i=0;
           FILE *fp;
           if((fp=fopen(in,"w+"))==NULL)
           {
               puts("未找到文件!\n");
    	   exit(1);
           }
           for(i=0;i<5;p++,i++){   //这里模拟输入5条记录 ,然后写入文件
               scanf("%d",&p->id);
               scanf("%s",p->name);
               scanf("%s",p->zy);
               scanf("%d%d%d%d%d",&p->sc1,&p->sc2,&p->sc3,&p->sc4,&p->sc5);
               fprintf(fp,"%d %s %s %d %d %d %d %d\n",p->id ,p->name ,
                            p->zy ,p->sc1 ,p->sc2 ,p->sc3 ,p->sc4,p->sc5);
           }
           fclose(fp);
    }
    
    int input(char *in,struct STU *p)
    {
    	FILE *fp;
    	int i;
    	if((fp=fopen(in,"r+"))==NULL)
    	{
    		puts("未找到文件!\n");
    		exit(1);
    	}
    	i=0;
    	while(1)
    	{
    	    if(fscanf(fp,iin,&p->id ,p->name ,p->zy ,
                   &p->sc1 ,&p->sc2 ,&p->sc3 ,&p->sc4,&p->sc5)!=8)break;
                   i++;
                   p++;
    	}
    	fclose(fp);
    	return i;
    }
    //**************
    //**************
    void p_int(struct STU *p,int n)
    {
    	int i;
    	for(i=0;i<n;i++)
    	{
                printf(oout,p->id ,p->name ,p->zy ,
                            p->sc1 ,p->sc2 ,p->sc3 ,p->sc4,p->sc5);
                p++;
    	}
    }
    //**************
    //**************
    void yx(struct STU *p,int n)
    {
    	float cnt1=0,cnt2=0,cnt3=0,cnt4=0,cnt5=0;
    	int i;
    	for(i=0;i<n;i++)
    	{
                if(p->sc1 >=90) cnt1++;
                if(p->sc2 >=90) cnt2++;
                if(p->sc3 >=90) cnt3++;
                if(p->sc4 >=90) cnt4++;
                if(p->sc5 >=90) cnt5++;
                p++;
    	}
            printf("第一门课优秀率为%.2f\n第二门课优秀率为%.2f\n"
            "第三门课优秀率为%.2f\n第四门课优秀率为%.2f\n第五门课优秀率为%.2f\n\n",
            cnt1/n,cnt2/n,cnt3/n,cnt4/n,cnt5/n);
    }
    //*************
    //*************
    void bjg(struct STU *p,int n)
    {
    	int i;
    	for(i=0;i<n;i++)
    	{
                if(p->sc1 <60)
                   printf("%s学生不及格科目为%d,学号为%d\n\n",p->name,1,p->id);
    	    if(p->sc2 <60)
                   printf("%s学生不及格科目为%d,学号为%d\n\n",p->name,2,p->id);
    	    if(p->sc3 <60)
                   printf("%s学生不及格科目为%d,学号为%d\n\n",p->name,3,p->id);
    	    if(p->sc4 <60)
                   printf("%s学生不及格科目为%d,学号为%d\n\n",p->name,4,p->id);
                if(p->sc5 <60)
    	       printf("%s学生不及格科目为%d,学号为%d\n\n",p->name,5,p->id );
                p++;
    	}
    }

     

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

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月16日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效