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

#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文件的样子

 

代码修改如下,估计读出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++;
	}
}