鱼C论坛

 找回密码
 立即注册
查看: 1983|回复: 6

[已解决]文件处理方面的问题

[复制链接]
发表于 2018-12-9 23:09:28 | 显示全部楼层 |阅读模式
10鱼币
题目要求如下,但不知道为什平均分老是显示为0.00。请大家帮忙看看,谢谢了
屏幕截图(79).png
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. struct{
  4.         char num[10];
  5.         char name[10];
  6.         int score1,score2,score3;
  7.         float average;
  8. }ace[3],temp;//temp是后面排序用到的

  9. int main(void)
  10. {
  11.         int i,flag,j;
  12.         FILE *fp1;
  13.         FILE *fp2;
  14.         for(i=0;i<3;i++)
  15.         {
  16.                 printf("input student %d\n",i+1);
  17.                 printf("num:");
  18.                 scanf("%s",ace[i].num);
  19.                 printf("name:");
  20.                 scanf("%s",ace[i].name);
  21.                 printf("score 1:");
  22.                 scanf("%d",&ace[i].score1);
  23.                 printf("score 2:");
  24.                 scanf("%d",&ace[i].score2);
  25.                 printf("score 3:");
  26.                 scanf("%d",&ace[i].score3);
  27.                 ace[i].average=(float)(ace[i].score1+ace[i].score2+ace[i].score3)/3.0;
  28.         }
  29.        
  30.         if((fp1 = fopen("stu.txt","w+")) == NULL)//这里不知道为什么写成 w就要乱码
  31.         {
  32.                 printf("文件打开失败!");
  33.                 exit(EXIT_FAILURE);
  34.         }
  35.         printf("File 'stu':\n");
  36.         for(i=0;i<3;i++)
  37.         {   
  38.             fprintf(fp1,"%s %s %d %d %d %.2f\n",ace[i].num,ace[i].name,ace[i].score1,ace[i].score2,ace[i].score3,ace[i].score3,ace[i].average);
  39.     }
  40.     fseek(fp1,0L,SEEK_SET);//不知道为什么要写这个,但同学说好像必须加上这个?
  41.    
  42.         for(i=0;i<3;i++)
  43.     {
  44.             char nu[10];
  45.             char na[10];
  46.             int a,b,c;
  47.             float d;
  48.             fscanf(fp1,"%s%s%d%d%d%f",nu,na,&a,&b,&c,&d);//这里为什么改成.2f就会出错啊?
  49.             printf("%8s%8s%8d%8d%8d%8.2f\n",nu,na,a,b,c,d);
  50.         }
  51.         fclose(fp1);
  52.        
  53.         for(i=0;i<3;i++)//排序
  54.         {
  55.                 flag=0;
  56.                 for(j=0;j<3-i;++j)
  57.                 {
  58.                         if(ace[j].average>ace[j+1].average)
  59.                         {
  60.                                 temp=ace[j];
  61.                                 ace[j]=ace[j+1];
  62.                                 ace[j+1]=temp;
  63.                                 flag=1;
  64.                         }
  65.                         if(flag==0){break;}
  66.                 }
  67.         }
  68.        
  69.         if((fp2 = fopen("stu_sort.txt","w+")) == NULL)//这里不知道为什么写成 w就要乱码
  70.         {
  71.                 printf("文件打开失败!");
  72.                 exit(EXIT_FAILURE);
  73.         }
  74.         printf("Now:\n");
  75.         for(i=0;i<3;i++)
  76.         {
  77.                 fprintf(fp2,"%s %s %d %d %d %f\n",ace[i].num,ace[i].name,ace[i].score1,ace[i].score2,ace[i].score3,ace[i].score3,ace[i].average);
  78.         }
  79.         fseek(fp2,0L,SEEK_SET);
  80.         for(i=0;i<3;i++)
  81.         {
  82.                 char ai[10];
  83.                 char bi[10];
  84.                 int ci,di,ei;
  85.                 float fi;
  86.                 fscanf(fp2,"%s%s%d%d%d%f",ai,bi,&ci,&di,&ei,&fi);
  87.                 printf("%8s%8s%8d%8d%8d%8.2f\n",ai,bi,ci,di,ei,fi);
  88.         }
  89.         fclose(fp2);
  90.         system("pause");
  91.         return 0;
  92. }
复制代码

屏幕截图(78).png
最佳答案
2018-12-9 23:09:29
本帖最后由 jackz007 于 2018-12-10 12:21 编辑

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

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

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

  3. struct STUDENT{
  4.         char num[10]                 ;
  5.         char name[10]                ;
  6.         int score1 , score2 , score3 ;
  7.         float average                ;
  8. }ace[3] , temp                       ;

  9. int main(void)
  10. {
  11.         int i , flag , j ;
  12.         FILE * fp1       ;
  13.         FILE * fp2       ;
  14.         for(i = 0 ; i < 3 ; i ++) {
  15.                 printf("input student %d\n" , i + 1) ;
  16.                 printf("num:")                       ;
  17.                 scanf("%s",ace[i].num)               ;
  18.                 printf("name:")                      ;
  19.                 scanf("%s",ace[i].name)              ;
  20.                 printf("score 1:")                   ;
  21.                 scanf("%d", & ace[i].score1)         ;
  22.                 printf("score 2:")                   ;
  23.                 scanf("%d", & ace[i].score2)         ;
  24.                 printf("score 3:")                   ;
  25.                 scanf("%d", & ace[i].score3)         ;
  26.                 ace[i].average = (float)(ace[i].score1 + ace[i].score2 + ace[i].score3) / 3.0 ;
  27.         }
  28.         
  29.         if((fp1 = fopen("stu.txt","w+")) == NULL) { // 以读写模式打开文件,若文件存在则清空其内容,若不存在则建立该文件。
  30.                 printf("文件打开失败!") ;
  31.                 exit(EXIT_FAILURE)       ;
  32.         }
  33.         printf("File 'stu':\n")          ;
  34.         for(i = 0 ; i < 3 ; i ++) fprintf(fp1 ,"%s %s %d %d %d %.2f\n" , ace[i].num , ace[i].name , ace[i].score1 , ace[i].score2 , ace[i].score3 , ace[i].average) ;

  35.         fseek(fp1 , 0L , SEEK_SET) ; //文件读写指针回到文件开头
  36.    
  37.         for(i = 0 ; i < 3 ; i ++) {
  38.             char nu[10]   ;
  39.             char na[10]   ;
  40.             int a , b , c ;
  41.             float d       ;
  42.             fscanf(fp1 ,"%s%s%d%d%d%f" , nu , na , & a , & b , & c , & d)   ;
  43.             printf("%8s %8s %8d %8d %8d %8.2f\n" , nu , na , a , b , c , d) ;
  44.         }
  45.         fclose(fp1);
  46.         
  47.         for(i = 1 ; i < 3 ; i ++) { // 排序
  48.             j = i ;
  49.             while (ace[j].average < ace[j - 1].average && j > 0) {
  50.                 temp = ace[j]       ;
  51.                 ace[j] = ace[j - 1] ;
  52.                 ace[j - 1] = temp   ;
  53.                 j --                ;
  54.             }
  55.         }

  56.         if((fp2 = fopen("stu_sort.txt" , "w+")) == NULL) { // 以读写模式打开文件,若文件存在则清空其内容,若不存在则建立该文件。
  57.             printf("文件打开失败!") ;
  58.             exit(EXIT_FAILURE)       ;
  59.         }
  60.         printf("Now:\n") ;
  61.         for(i = 0 ; i < 3 ; i ++) fprintf(fp2 ,"%s %s %d %d %d %f\n" , ace[i].num , ace[i].name , ace[i].score1 , ace[i].score2 , ace[i].score3 , ace[i].average) ;
  62.         fseek(fp2 , 0L , SEEK_SET)                                                                                                                                ; //文件读写指针回到文件开头
  63.         for(i = 0 ; i < 3 ; i ++){
  64.                 char ai[10]      ;
  65.                 char bi[10]      ;
  66.                 int ci , di , ei ;
  67.                 float fi         ;
  68.                 fscanf(fp2 ,"%s%s%d%d%d%f" , ai , bi , & ci , & di , & ei , & fi)   ;
  69.                 printf("%8s %8s %8d %8d %8d %8.2f\n" , ai , bi , ci , di , ei , fi) ;
  70.         }
  71.         fclose(fp2)     ;
  72.         system("pause") ;
  73.         return 0        ;
  74. }
复制代码

最佳答案

查看完整内容

你程序代码的第40、79行各多出一个,这是导致 的直接原因,修正以后问题消失。 另外,你的排序代码没有效果,我重写了这段代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-9 23:09:29 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2018-12-10 12:21 编辑

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

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

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

  3. struct STUDENT{
  4.         char num[10]                 ;
  5.         char name[10]                ;
  6.         int score1 , score2 , score3 ;
  7.         float average                ;
  8. }ace[3] , temp                       ;

  9. int main(void)
  10. {
  11.         int i , flag , j ;
  12.         FILE * fp1       ;
  13.         FILE * fp2       ;
  14.         for(i = 0 ; i < 3 ; i ++) {
  15.                 printf("input student %d\n" , i + 1) ;
  16.                 printf("num:")                       ;
  17.                 scanf("%s",ace[i].num)               ;
  18.                 printf("name:")                      ;
  19.                 scanf("%s",ace[i].name)              ;
  20.                 printf("score 1:")                   ;
  21.                 scanf("%d", & ace[i].score1)         ;
  22.                 printf("score 2:")                   ;
  23.                 scanf("%d", & ace[i].score2)         ;
  24.                 printf("score 3:")                   ;
  25.                 scanf("%d", & ace[i].score3)         ;
  26.                 ace[i].average = (float)(ace[i].score1 + ace[i].score2 + ace[i].score3) / 3.0 ;
  27.         }
  28.         
  29.         if((fp1 = fopen("stu.txt","w+")) == NULL) { // 以读写模式打开文件,若文件存在则清空其内容,若不存在则建立该文件。
  30.                 printf("文件打开失败!") ;
  31.                 exit(EXIT_FAILURE)       ;
  32.         }
  33.         printf("File 'stu':\n")          ;
  34.         for(i = 0 ; i < 3 ; i ++) fprintf(fp1 ,"%s %s %d %d %d %.2f\n" , ace[i].num , ace[i].name , ace[i].score1 , ace[i].score2 , ace[i].score3 , ace[i].average) ;

  35.         fseek(fp1 , 0L , SEEK_SET) ; //文件读写指针回到文件开头
  36.    
  37.         for(i = 0 ; i < 3 ; i ++) {
  38.             char nu[10]   ;
  39.             char na[10]   ;
  40.             int a , b , c ;
  41.             float d       ;
  42.             fscanf(fp1 ,"%s%s%d%d%d%f" , nu , na , & a , & b , & c , & d)   ;
  43.             printf("%8s %8s %8d %8d %8d %8.2f\n" , nu , na , a , b , c , d) ;
  44.         }
  45.         fclose(fp1);
  46.         
  47.         for(i = 1 ; i < 3 ; i ++) { // 排序
  48.             j = i ;
  49.             while (ace[j].average < ace[j - 1].average && j > 0) {
  50.                 temp = ace[j]       ;
  51.                 ace[j] = ace[j - 1] ;
  52.                 ace[j - 1] = temp   ;
  53.                 j --                ;
  54.             }
  55.         }

  56.         if((fp2 = fopen("stu_sort.txt" , "w+")) == NULL) { // 以读写模式打开文件,若文件存在则清空其内容,若不存在则建立该文件。
  57.             printf("文件打开失败!") ;
  58.             exit(EXIT_FAILURE)       ;
  59.         }
  60.         printf("Now:\n") ;
  61.         for(i = 0 ; i < 3 ; i ++) fprintf(fp2 ,"%s %s %d %d %d %f\n" , ace[i].num , ace[i].name , ace[i].score1 , ace[i].score2 , ace[i].score3 , ace[i].average) ;
  62.         fseek(fp2 , 0L , SEEK_SET)                                                                                                                                ; //文件读写指针回到文件开头
  63.         for(i = 0 ; i < 3 ; i ++){
  64.                 char ai[10]      ;
  65.                 char bi[10]      ;
  66.                 int ci , di , ei ;
  67.                 float fi         ;
  68.                 fscanf(fp2 ,"%s%s%d%d%d%f" , ai , bi , & ci , & di , & ei , & fi)   ;
  69.                 printf("%8s %8s %8d %8d %8d %8.2f\n" , ai , bi , ci , di , ei , fi) ;
  70.         }
  71.         fclose(fp2)     ;
  72.         system("pause") ;
  73.         return 0        ;
  74. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
sunnyrubik + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-10 01:14:51 | 显示全部楼层
20181210_11432.png

评分

参与人数 1荣誉 +5 鱼币 +3 贡献 +3 收起 理由
sunnyrubik + 5 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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就不行试了下其他的数字好像都不行,您知道这是为什么吗?
这是一些截图
屏幕截图(81).png 屏幕截图(80).png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-10 14:30:00 | 显示全部楼层
      你的排序代码确实有问题,为了证实这一点,写了如下代码进行验证:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void sort1(int iarr[] , int n)
  5. {
  6.     int i , j , flag , temp           ;
  7.     for(i = 0 ; i < n ; i ++) {
  8.         flag = 0                      ;
  9.         for(j = 0 ; j < n - i ; j ++) {
  10.             if (iarr[j] > iarr[j + 1]) {
  11.                 temp = iarr[j]        ;
  12.                 iarr[j] = iarr[j + 1] ;
  13.                 iarr[j + 1] = temp    ;
  14.                 flag = 1              ;
  15.             }
  16.             if (flag == 1) break      ;
  17.         }
  18.     }
  19. }

  20. void sort2(int iarr[] , int n)
  21. {
  22.     int i , j , temp                  ;
  23.     for(i = 1 ; i < n ; i ++) {
  24.         j = i                         ;
  25.         while(iarr[j] < iarr[j - 1] && j > 0) {
  26.             temp = iarr[j]            ;
  27.             iarr[j] = iarr[j - 1]     ;
  28.             iarr[j - 1] = temp        ;
  29.             j = j - 1                 ;
  30.         }
  31.     }
  32. }

  33. main()
  34. {
  35.     int i                                                          ;
  36.     int a[12] = {12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1} ;
  37.     int b[12] = {12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1} ;
  38.    
  39.     sort1(a , 12)                                     ;
  40.     sort2(b , 12)                                     ;
  41.     printf("%d" , a[0])                               ;
  42.     for(i = 1 ; i < 12 ; i ++) printf(" , %d" , a[i]) ;
  43.     printf("\n")                                      ;
  44.     printf("%d" , b[0])                               ;
  45.     for(i = 1 ; i < 12 ; i ++) printf(" , %d" , b[i]) ;
  46.     printf("\n\n")                                    ;
  47. }
复制代码


  验证结果如下: isort.png



评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
sunnyrubik + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-12-10 15:14:11 | 显示全部楼层
jackz007 发表于 2018-12-10 14:30
你的排序代码确实有问题,为了证实这一点,写了如下代码进行验证:

你好,我知道我为什么错了,我应该写成这样
  1. for(i=1;i<NUM;++i)
  2.    {
  3.            flag=0;
  4.            for(j=0;j<NUM-i;j++)
  5.            if(a[j]>a[j+1])//这里之前写错了
  6.             {
  7.                     t=a[j];
  8.                     a[j]=a[j+1];
  9.                     a[j+1]=t;
  10.                     flag=1;
  11.             }
  12.             if(flag==0)
  13.             {break;}
  14.    }
复制代码

把最开始的if写在for的外面(另外您在验证的时候把那个flag误写成==1了哈,应该是==0)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-12-10 15:15:26 | 显示全部楼层
jackz007 发表于 2018-12-10 14:30
你的排序代码确实有问题,为了证实这一点,写了如下代码进行验证:

最后,真的太谢谢你的耐心指导了哈。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-5 17:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表