文件处理方面的问题
题目要求如下,但不知道为什平均分老是显示为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-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 ;
}
本帖最后由 sunnyrubik 于 2018-12-10 13:04 编辑
jackz007 发表于 2018-12-10 12:08
你程序代码的第40、79行各多出一个,这是导致 的直接原因,修正以后问题消失。
另外,你的 ...
那个排序真的好神奇,我用100,99,101三个数字就可以正常排序,1,3,2就不行试了下其他的数字好像都不行,您知道这是为什么吗?
这是一些截图
你的排序代码确实有问题,为了证实这一点,写了如下代码进行验证:
#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") ;
}
验证结果如下:
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) jackz007 发表于 2018-12-10 14:30
你的排序代码确实有问题,为了证实这一点,写了如下代码进行验证:
最后,真的太谢谢你的耐心指导了哈。{:5_106:}
页:
[1]