标题:作一个课程设计,但几段代码不报错,却死活运行不出预期的结果,本人也找不 ...
只看楼主
阿维
Rank: 2
来 自:china
等 级:论坛游民
帖 子:30
专家分:43
注 册:2014-11-10
结帖率:100%
已结贴  问题点数:50 回复次数:14 
作一个课程设计,但几段代码不报错,却死活运行不出预期的结果,本人也找不出错,求大神指点迷津
作一个课程设计,但几段代码不报错,却死活运行不出预期的结果,本人也找不出错,求大神指点迷津

某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入)。
1.    从文件读入每个学生个人信息和成绩信息,可以由键盘输入文件名。读入成功提示读入学生记录的个数,不成功提示相应出错信息。(程序f1当输入文件无东西时,输出为1,且每运行一次,count都会莫名其妙的加1,求解释啊0
2.    增量式手动录入每个学生的学号、姓名和各科考试成绩。不考虑中文姓名,但需要考虑重名情况下的处理,学生的学号是唯一的。(这段程序为什么写入文件后会成为乱码)
4.    计算每个学生的总分和平均分;(这段代码为什么会运行奔溃)

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define L 32
#define N 6
#define M 30
#define LEN sizeof(struct student)
struct student
{
    char name [L];
    int num;                                ///学号
    float ach[N];                             ///成绩数组
    struct student *next;
};
struct student stu[M];
int count=0,n,m,j,i,k;
char filename[L]={0};
int f1(int m,int n);
int f2(int m,int n);
int f4(int m,int n);
int main()
{
    printf("please input number of student\n");
    scanf("%d",&m);
    printf("please input number of subject\n");
    scanf("%d",&n);
    printf("|| Welcome to the student achievement management system ||\n\n");
    printf("MENU:\n1.    Read from a file\n2.    Append record manually\n4.    Calculate total and average score of every student\n0 .     Exit\n");
    for(j;;j++)
    {
        printf("\n\nplease select an item from the menu\n");
        scanf("%d",&i);
        if(i==0)
            break;
        else
            switch(i)
            {
                case 1: f1(m,n); break;
                case 2: f2(m,n); break;
                case 4: f4(m,n); break;
                default: break;
            }
    }
    printf("\n\nThank you for using the system\n\n");               ///退出界面
    return 0;
}

int f1(int m,int n)
{
    struct student card;
    FILE *inputfile;
    char filename[L]={0};                                          ///声明变量 存储文件名
    printf("Please input filename to Open:\n");                   ///提示输入文件名
    getchar();
    gets(filename);                                                 ///接收输入文件名
    if((inputfile =fopen(filename,"r"))!=NULL)                      ///打开 并判断
    {
        printf("file open OK!\n\n");                                ///成功则提示成功  并且关闭文件指针
        while(! feof(inputfile))
        {
            fread(&card,LEN,1,inputfile);
            count ++;
        }
        printf("The students totaled : %d\n",count-1);
        fclose(inputfile);
        return count;
    }
    else
    printf("file open failed!\n");                                  ///打开失败则提示打开失败
    return 0;
};


///f1函数的count计算结果与预期不符,未知原因


int     f2(int m,int n)
{
    struct student card;
    FILE *file;
    printf("请输入打开文件名:\n");                                 ///提示输入文件名
    getchar();
    gets(filename);                                                 ///接收输入文件名
    if((file =fopen(filename,"a+"))!=NULL)                          ///打开 并判断
    {
         while(! feof(file))
        {
            fread(&card,LEN,1,file);
            count ++;
        }
        for(count;count<=m;count++)
        {
           printf("请输入该学生的学号:\n");
           scanf("%d",&stu[count].num);
   r1:     for(j=0;j<count;j++)
           {
                if(stu[j].num==stu[count].num)
                {
                   printf("输入错误,请检查\n");
                   count --;
                   goto r1;
                }
                else
                {
                    printf("请输入该学生的姓名:\n");
                    getchar();
                    gets(stu[count].name);
                    for(j=1;j<=n;j++)
                    {
                        printf("请输入该学生第%d门功课的成绩:",j);
                        scanf("%d",&stu[count].ach[j-1]);
                    }
                }
            }
            fwrite(&card,LEN,1,file);
        }
        fclose (file);
    }
    else
    printf("file open failed!\n");                                  ///打开失败则提示打开失败
};
int f4(int m,int n)
{
    struct student card;
    FILE *fp1,*fp2;
    float zf[M]={0};
    char nam[M][L]={0};
    char inputfile[L]={0};
    printf("请输入输入文件的名字:\n");                                 ///提示输入文件名
    getchar();
    gets(inputfile);
    fp1=fopen(inputfile,"rb");
    fp2=fopen("xuesheng.txt","w");
    if(fp1==NULL)
    {
        printf("\n文件%s打开失败\n",filename);
        exit(1);
    }
    for(i=0;(fread(&card,LEN,1,fp1))!=(int)NULL;i++)
    {
        nam[i][L]=card.name[L];
        for(j=0;j<n;j++)
        {
            zf[i]=zf[i]+card.ach[j];
        }
    printf("%s的课程的总成绩为%.3f    平均分为%.3f\n",nam[i][L],zf[i],zf[i]/n);
    fprintf(fp2,"%s   %.3f   %.3f\n",nam[i][L],zf[i],zf[i]/n);
    }
    fclose (fp1);
    fclose (fp2);
    return 0;
}
搜索更多相关主题的帖子: 考试成绩 个人信息 count 中文 课程 
2015-03-24 22:52
子非汉
Rank: 2
等 级:论坛游民
帖 子:2
专家分:12
注 册:2015-3-25
得分:12 
代码有点长……
2015-03-25 09:56
阿维
Rank: 2
来 自:china
等 级:论坛游民
帖 子:30
专家分:43
注 册:2014-11-10
得分:0 
只是课程设计的一部分。。。
2015-03-25 14:54
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
得分:12 
现在来说下这个问题吧。
1.count自增是因为每次执行你都打开文件。然后count++。但是结束的时候你没有将count置为0.你的count-1只是个打印。不改变其值。
2.乱码是因为你的格式不匹配。scanf("%d",&stu[count].ach[j-1]);这里的%d换成%f,
    printf("%s的课程的总成绩为%.3f    平均分为%.3f\n",nam[i][L],zf[i],zf[i]/n);
   fprintf(fp2,"%s   %.3f   %.3f\n",nam[i][L],zf[i],zf[i]/n);

两个%s换成%d.

现在你试试吧。有问题提出来。继续讨论

[ 本帖最后由 执笔画江山 于 2015-3-25 20:30 编辑 ]

授人以鱼,不如授人以渔
2015-03-25 18:04
阿维
Rank: 2
来 自:china
等 级:论坛游民
帖 子:30
专家分:43
注 册:2014-11-10
得分:0 
回复 4楼 执笔画江山


根据你说的进行了修改,可还是不行
这是我的运行过程
另外,输入文件还是乱码,不过程序4不会奔溃了。。
而是乱码
我怀疑是否是打开方式的问题

2015-03-25 21:39
阿维
Rank: 2
来 自:china
等 级:论坛游民
帖 子:30
专家分:43
注 册:2014-11-10
得分:0 
论坛的大神们,看过来啊!
2015-03-25 21:39
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
得分:0 
回复 6楼 阿维
for(j;;j++)这一句的第一个j是啥玩意。去掉试试

然后将你所有的变量  进行初始化。再试试

getchar();用 c = getchar();表示

 for(i=0;(fread(&card,LEN,1,fp1))!=(int)NULL;i++)中的(int)NULL是个什么玩意

[ 本帖最后由 执笔画江山 于 2015-3-25 22:30 编辑 ]

授人以鱼,不如授人以渔
2015-03-25 22:01
阿维
Rank: 2
来 自:china
等 级:论坛游民
帖 子:30
专家分:43
注 册:2014-11-10
得分:0 
回复 7楼 执笔画江山
哥,问题肯定不是这些。。。。
麻烦你老人家指点的时候稍微负责一下
。。。。。。
调试一下下再发言。。。。。
别糊弄菜鸟。。
2015-03-26 10:00
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
得分:0 
回复 8楼 阿维
。。。。。。。。我真是醉了

[ 本帖最后由 执笔画江山 于 2015-3-26 13:43 编辑 ]

授人以鱼,不如授人以渔
2015-03-26 12:47
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
得分:12 
长到没心情看

编写的程序,不能改变世界,却可以改变自己...
2015-03-27 10:08



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-443041-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031647 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved