sunnyrubik 发表于 2018-12-9 23:09:28

文件处理方面的问题

题目要求如下,但不知道为什平均分老是显示为0.00。请大家帮忙看看,谢谢了

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

struct{
        char num;
        char name;
        int score1,score2,score3;
        float average;
}ace,temp;//temp是后面排序用到的

int main(void)
{
        int i,flag,j;
        FILE *fp1;
        FILE *fp2;
        for(i=0;i<3;i++)
        {
                printf("input student %d\n",i+1);
                printf("num:");
                scanf("%s",ace.num);
                printf("name:");
                scanf("%s",ace.name);
                printf("score 1:");
                scanf("%d",&ace.score1);
                printf("score 2:");
                scanf("%d",&ace.score2);
                printf("score 3:");
                scanf("%d",&ace.score3);
                ace.average=(float)(ace.score1+ace.score2+ace.score3)/3.0;
        }
       
        if((fp1 = fopen("stu.txt","w+")) == NULL)//这里不知道为什么写成 w就要乱码
        {
                printf("文件打开失败!");
                exit(EXIT_FAILURE);
        }
        printf("File 'stu':\n");
        for(i=0;i<3;i++)
        {   
          fprintf(fp1,"%s %s %d %d %d %.2f\n",ace.num,ace.name,ace.score1,ace.score2,ace.score3,ace.score3,ace.average);
    }
    fseek(fp1,0L,SEEK_SET);//不知道为什么要写这个,但同学说好像必须加上这个?
   
        for(i=0;i<3;i++)
    {
            char nu;
            char na;
            int a,b,c;
            float d;
            fscanf(fp1,"%s%s%d%d%d%f",nu,na,&a,&b,&c,&d);//这里为什么改成.2f就会出错啊?
            printf("%8s%8s%8d%8d%8d%8.2f\n",nu,na,a,b,c,d);
        }
        fclose(fp1);
       
        for(i=0;i<3;i++)//排序
        {
                flag=0;
                for(j=0;j<3-i;++j)
                {
                        if(ace.average>ace.average)
                        {
                                temp=ace;
                                ace=ace;
                                ace=temp;
                                flag=1;
                        }
                        if(flag==0){break;}
                }
        }
       
        if((fp2 = fopen("stu_sort.txt","w+")) == NULL)//这里不知道为什么写成 w就要乱码
        {
                printf("文件打开失败!");
                exit(EXIT_FAILURE);
        }
        printf("Now:\n");
        for(i=0;i<3;i++)
        {
                fprintf(fp2,"%s %s %d %d %d %f\n",ace.num,ace.name,ace.score1,ace.score2,ace.score3,ace.score3,ace.average);
        }
        fseek(fp2,0L,SEEK_SET);
        for(i=0;i<3;i++)
        {
                char ai;
                char bi;
                int ci,di,ei;
                float fi;
                fscanf(fp2,"%s%s%d%d%d%f",ai,bi,&ci,&di,&ei,&fi);
                printf("%8s%8s%8d%8d%8d%8.2f\n",ai,bi,ci,di,ei,fi);
        }
        fclose(fp2);
        system("pause");
        return 0;
}

jackz007 发表于 2018-12-9 23:09:29

本帖最后由 jackz007 于 2018-12-10 12:21 编辑

      你程序代码的第40、79行各多出一个ace.score3,这是导致ace.average == 0 的直接原因,修正以后问题消失。

      另外,你的排序代码没有效果,我重写了这段代码。

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

struct STUDENT{
      char num               ;
      char name                ;
      int score1 , score2 , score3 ;
      float average                ;
}ace , temp                     ;

int main(void)
{
      int i , flag , j ;
      FILE * fp1       ;
      FILE * fp2       ;
      for(i = 0 ; i < 3 ; i ++) {
                printf("input student %d\n" , i + 1) ;
                printf("num:")                     ;
                scanf("%s",ace.num)               ;
                printf("name:")                      ;
                scanf("%s",ace.name)            ;
                printf("score 1:")                   ;
                scanf("%d", & ace.score1)         ;
                printf("score 2:")                   ;
                scanf("%d", & ace.score2)         ;
                printf("score 3:")                   ;
                scanf("%d", & ace.score3)         ;
                ace.average = (float)(ace.score1 + ace.score2 + ace.score3) / 3.0 ;
      }
      
      if((fp1 = fopen("stu.txt","w+")) == NULL) { // 以读写模式打开文件,若文件存在则清空其内容,若不存在则建立该文件。
                printf("文件打开失败!") ;
                exit(EXIT_FAILURE)       ;
      }
      printf("File 'stu':\n")          ;
      for(i = 0 ; i < 3 ; i ++) fprintf(fp1 ,"%s %s %d %d %d %.2f\n" , ace.num , ace.name , ace.score1 , ace.score2 , ace.score3 , ace.average) ;

      fseek(fp1 , 0L , SEEK_SET) ; //文件读写指针回到文件开头
   
      for(i = 0 ; i < 3 ; i ++) {
            char nu   ;
            char na   ;
            int a , b , c ;
            float d       ;
            fscanf(fp1 ,"%s%s%d%d%d%f" , nu , na , & a , & b , & c , & d)   ;
            printf("%8s %8s %8d %8d %8d %8.2f\n" , nu , na , a , b , c , d) ;
      }
      fclose(fp1);
      
      for(i = 1 ; i < 3 ; i ++) { // 排序
            j = i ;
            while (ace.average < ace.average && j > 0) {
                temp = ace       ;
                ace = ace ;
                ace = temp   ;
                j --                ;
            }
      }

      if((fp2 = fopen("stu_sort.txt" , "w+")) == NULL) { // 以读写模式打开文件,若文件存在则清空其内容,若不存在则建立该文件。
            printf("文件打开失败!") ;
            exit(EXIT_FAILURE)       ;
      }
      printf("Now:\n") ;
      for(i = 0 ; i < 3 ; i ++) fprintf(fp2 ,"%s %s %d %d %d %f\n" , ace.num , ace.name , ace.score1 , ace.score2 , ace.score3 , ace.average) ;
      fseek(fp2 , 0L , SEEK_SET)                                                                                                                              ; //文件读写指针回到文件开头
      for(i = 0 ; i < 3 ; i ++){
                char ai      ;
                char bi      ;
                int ci , di , ei ;
                float fi         ;
                fscanf(fp2 ,"%s%s%d%d%d%f" , ai , bi , & ci , & di , & ei , & fi)   ;
                printf("%8s %8s %8d %8d %8d %8.2f\n" , ai , bi , ci , di , ei , fi) ;
      }
      fclose(fp2)   ;
      system("pause") ;
      return 0      ;
}

ba21 发表于 2018-12-10 01:14:51

sunnyrubik 发表于 2018-12-10 12:59:49

本帖最后由 sunnyrubik 于 2018-12-10 13:04 编辑

jackz007 发表于 2018-12-10 12:08
你程序代码的第40、79行各多出一个,这是导致 的直接原因,修正以后问题消失。

      另外,你的 ...

那个排序真的好神奇,我用100,99,101三个数字就可以正常排序,1,3,2就不行试了下其他的数字好像都不行,您知道这是为什么吗?
这是一些截图


jackz007 发表于 2018-12-10 14:30:00

      你的排序代码确实有问题,为了证实这一点,写了如下代码进行验证:

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

void sort1(int iarr[] , int n)
{
    int i , j , flag , temp         ;
    for(i = 0 ; i < n ; i ++) {
      flag = 0                      ;
      for(j = 0 ; j < n - i ; j ++) {
            if (iarr > iarr) {
                temp = iarr      ;
                iarr = iarr ;
                iarr = temp    ;
                flag = 1            ;
            }
            if (flag == 1) break      ;
      }
    }
}

void sort2(int iarr[] , int n)
{
    int i , j , temp                  ;
    for(i = 1 ; i < n ; i ++) {
      j = i                         ;
      while(iarr < iarr && j > 0) {
            temp = iarr            ;
            iarr = iarr   ;
            iarr = temp      ;
            j = j - 1               ;
      }
    }
}

main()
{
    int i                                                          ;
    int a = {12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1} ;
    int b = {12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1} ;
   
    sort1(a , 12)                                     ;
    sort2(b , 12)                                     ;
    printf("%d" , a)                               ;
    for(i = 1 ; i < 12 ; i ++) printf(" , %d" , a) ;
    printf("\n")                                    ;
    printf("%d" , b)                               ;
    for(i = 1 ; i < 12 ; i ++) printf(" , %d" , b) ;
    printf("\n\n")                                    ;
}


验证结果如下:



sunnyrubik 发表于 2018-12-10 15:14:11

jackz007 发表于 2018-12-10 14:30
你的排序代码确实有问题,为了证实这一点,写了如下代码进行验证:




你好,我知道我为什么错了,我应该写成这样for(i=1;i<NUM;++i)
   {
           flag=0;
           for(j=0;j<NUM-i;j++)
           if(a>a)//这里之前写错了
          {
                  t=a;
                  a=a;
                  a=t;
                  flag=1;
          }
          if(flag==0)
          {break;}
   }
把最开始的if写在for的外面(另外您在验证的时候把那个flag误写成==1了哈,应该是==0)

sunnyrubik 发表于 2018-12-10 15:15:26

jackz007 发表于 2018-12-10 14:30
你的排序代码确实有问题,为了证实这一点,写了如下代码进行验证:




最后,真的太谢谢你的耐心指导了哈。{:5_106:}
页: [1]
查看完整版本: 文件处理方面的问题