鱼C论坛

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

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

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

struct{
        char num[10];
        char name[10];
        int score1,score2,score3;
        float average;
}ace[3],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[i].num);
                printf("name:");
                scanf("%s",ace[i].name);
                printf("score 1:");
                scanf("%d",&ace[i].score1);
                printf("score 2:");
                scanf("%d",&ace[i].score2);
                printf("score 3:");
                scanf("%d",&ace[i].score3);
                ace[i].average=(float)(ace[i].score1+ace[i].score2+ace[i].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[i].num,ace[i].name,ace[i].score1,ace[i].score2,ace[i].score3,ace[i].score3,ace[i].average);
    }
    fseek(fp1,0L,SEEK_SET);//不知道为什么要写这个,但同学说好像必须加上这个? 
    
        for(i=0;i<3;i++)
    {
            char nu[10];
            char na[10];
            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[j].average>ace[j+1].average)
                        {
                                temp=ace[j];
                                ace[j]=ace[j+1];
                                ace[j+1]=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[i].num,ace[i].name,ace[i].score1,ace[i].score2,ace[i].score3,ace[i].score3,ace[i].average);
        }
        fseek(fp2,0L,SEEK_SET);
        for(i=0;i<3;i++)
        {
                char ai[10];
                char bi[10];
                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;
}
屏幕截图(78).png
最佳答案
2018-12-9 23:09:29
本帖最后由 jackz007 于 2018-12-10 12:21 编辑

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

      另外,你的排序代码没有效果,我重写了这段代码。
#include<stdio.h>
#include<stdlib.h>

struct STUDENT{
        char num[10]                 ;
        char name[10]                ;
        int score1 , score2 , score3 ;
        float average                ;
}ace[3] , 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[i].num)               ;
                printf("name:")                      ;
                scanf("%s",ace[i].name)              ;
                printf("score 1:")                   ;
                scanf("%d", & ace[i].score1)         ;
                printf("score 2:")                   ;
                scanf("%d", & ace[i].score2)         ;
                printf("score 3:")                   ;
                scanf("%d", & ace[i].score3)         ;
                ace[i].average = (float)(ace[i].score1 + ace[i].score2 + ace[i].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[i].num , ace[i].name , ace[i].score1 , ace[i].score2 , ace[i].score3 , ace[i].average) ;

        fseek(fp1 , 0L , SEEK_SET) ; //文件读写指针回到文件开头 
    
        for(i = 0 ; i < 3 ; i ++) {
            char nu[10]   ;
            char na[10]   ;
            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[j].average < ace[j - 1].average && j > 0) {
                temp = ace[j]       ;
                ace[j] = ace[j - 1] ;
                ace[j - 1] = 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[i].num , ace[i].name , ace[i].score1 , ace[i].score2 , ace[i].score3 , ace[i].average) ;
        fseek(fp2 , 0L , SEEK_SET)                                                                                                                                ; //文件读写指针回到文件开头
        for(i = 0 ; i < 3 ; i ++){
                char ai[10]      ;
                char bi[10]      ;
                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        ;
}

最佳答案

查看完整内容

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

使用道具 举报

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

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

      另外,你的排序代码没有效果,我重写了这段代码。
#include<stdio.h>
#include<stdlib.h>

struct STUDENT{
        char num[10]                 ;
        char name[10]                ;
        int score1 , score2 , score3 ;
        float average                ;
}ace[3] , 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[i].num)               ;
                printf("name:")                      ;
                scanf("%s",ace[i].name)              ;
                printf("score 1:")                   ;
                scanf("%d", & ace[i].score1)         ;
                printf("score 2:")                   ;
                scanf("%d", & ace[i].score2)         ;
                printf("score 3:")                   ;
                scanf("%d", & ace[i].score3)         ;
                ace[i].average = (float)(ace[i].score1 + ace[i].score2 + ace[i].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[i].num , ace[i].name , ace[i].score1 , ace[i].score2 , ace[i].score3 , ace[i].average) ;

        fseek(fp1 , 0L , SEEK_SET) ; //文件读写指针回到文件开头 
    
        for(i = 0 ; i < 3 ; i ++) {
            char nu[10]   ;
            char na[10]   ;
            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[j].average < ace[j - 1].average && j > 0) {
                temp = ace[j]       ;
                ace[j] = ace[j - 1] ;
                ace[j - 1] = 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[i].num , ace[i].name , ace[i].score1 , ace[i].score2 , ace[i].score3 , ace[i].average) ;
        fseek(fp2 , 0L , SEEK_SET)                                                                                                                                ; //文件读写指针回到文件开头
        for(i = 0 ; i < 3 ; i ++){
                char ai[10]      ;
                char bi[10]      ;
                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        ;
}

评分

参与人数 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 | 显示全部楼层
      你的排序代码确实有问题,为了证实这一点,写了如下代码进行验证:
#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[j] > iarr[j + 1]) {
                temp = iarr[j]        ;
                iarr[j] = iarr[j + 1] ;
                iarr[j + 1] = 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[j] < iarr[j - 1] && j > 0) {
            temp = iarr[j]            ;
            iarr[j] = iarr[j - 1]     ;
            iarr[j - 1] = temp        ;
            j = j - 1                 ;
        }
    }
}

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

  验证结果如下: isort.png



评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 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[j]>a[j+1])//这里之前写错了
            {
                    t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                    flag=1;
            }
            if(flag==0)
            {break;}
   }
把最开始的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-11-24 08:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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