首页 新闻 会员 周边

C语言结构体指针问题求指导

0
悬赏园豆:100 [已解决问题] 解决于 2013-01-02 15:32

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
 long num;
 char name[10];
 int eng;
 int math;
 int comp;
 char addr[20];
};
int main()
{
 FILE*fp;
 fp=fopen("D:\\CCC\\file.txt","a+");
  if((fp=fopen("file.txt","a+"))==NULL)
  {
   printf("cannot open this file\n");
   exit(0);
  }
  struct student jf(struct student stu[10]);
  struct student studentaver(struct student stu[10]);
  struct student courseaver_max(struct student stu[10]);
  struct student stu[10],*p=stu;
  jf(p);
        stuaver(p);
        courseaver_max(p);
        fclose(fp);
  return 0;
}

struct student jf(struct student stu[10])
{
 int s[10],i;
 printf("家访同学信息如下:\n");
 for(i=0;i<10;i++)
 {
  fscanf(fp,"%ld%s%d%d%d%s",&stu[i].num,stu[i].name,&stu[i].eng,&stu[i].math,&stu[i].comp,stu[i].addr);
        s[i]=stu[i].eng+stu[i].math+stu[i].comp;
  if(s[i]<180)
  {
   printf("学号 姓名 英语 数学 计算机 住址\n");
   printf("%ld%s%d%d%d%s\n",stu[i].num,stu[i].name,stu[i].eng,stu[i].math,stu[i].comp,stu[i].addr);
 }
}
struct student studentaver(struct student stu[10])
{
 float stuaver[10];
 int i;
 printf("学号  姓名  平均分\n");
    for(i=0;i<10;i++)
 {
  stuaver[i]=(stu[i].eng+stu[i].math+stu[i].comp)/3.0;
  fprintf(fp,"%d%s%f\n",stu[i].num,stu[i].name,stuaver[i]);
 }
}
struct student courseaver_max(struct student stu[10])
{
 int max[3]={0},i;
 float courseaver[3]={0.0};
 printf("课程  平均分  最高分\n");
 for(i=0;i<10;i++)
 {
  fscanf(fp,"%d%d%d%f",&stu[i].eng,&stu[i].math,&stu[i].comp,&stuaver[i]);
 }
    for(i=0;i<10;i++)
 {
  max[1]=max[1]>stu[i].eng?max[1]:stu[i].eng;
  max[2]=max[2]>stu[i].math?max[2]:stu[i].math;
  max[3]=max[3]>stu[i].comp?max[3]:stu[i].comp;
 }
 for(i=0;i<10;i++)
 {
  courseaver[1]+=stu[i].eng;
  courseaver[2]+=stu[i].math;
  courseaver[3]+=stu[i].comp;
 }
 fprinf(fp,"英语\t%f\t%d\n",courseaver[1],max[1]);
 fprinf(fp,"数学\t%f\t%d\n",courseaver[2],max[2]);
 fprinf(fp,"计算机\t%f\t%d\n",courseaver[3],max[3]);
}

 

程序设计语言C综合练习:

某班有10名学生,每个学生信息包括学号、姓名、三门课(英语、高数、计算机)的成绩、住址,该班级同学的信息已通过记事本存入file1.txt文件中,该文件存于D:\CCC文件夹下。

请编程实现:

(1)       把总成绩低于180分的同学姓名、总成绩、地址,每个同学占一行显示在屏幕上,以便于家访;

(2)       计算每个同学的平均分,每个同学占一行,按下述形式把结果存入file2.txt中;

学号    姓名    平均分

95001   zhaos    87

….

(3)       计算每门课程的平均分和最高分,每门课程占一行,按下述形式把结果存入file2.txt中,注意:(2)产生的结果要保留,即该内容接续(2)的结果继续存入文件file2.txt中;

课程名    平均分   最高分

英语        87      92

高数        66      88

计算机      90      98

要求及建议:

(1)       要用多个函数实现,合理划分函数功能,不要只写一个main函数;

(2)       建立如下菜单,按菜单执行相应功能;

              *************************************************

1             显示总成绩低于180分的同学信息

2             计算每个同学的平均分---存入文件

3             计算每门课程的平均分和最高分---存入文件

4             退出系统

                     ************************************************* 

(3)  学生信息采用结构体数组形式,可参考:

Struct student

{ long num;

  char name[10];

 int eng;

int math;

int comp;

char addr[20];

} stu[10];

 

Struct student

{ long num;

 char name[10];

struct

{ int eng;

int math;

int comp;

  } score;

char addr[20];

} stu[10];

 

 

 

 

 

 

 

 

 

 

 

 

(4)注意file1.txt为文本文件,且第一行是标题行不是数据。

 

 

 

 

 

 

 

 

 

mum     name       eng   math   comp     addr
95001   奥巴马     88    97     98      room201
95002   卡扎菲     67    55     62      room201
95003   sunh       87    87     86      room203
95004   zhaoht     55    66     45      room203
95005   zhangy     91    78     98      room203
95006   凤姐       77    90     91      room212
95007   芙蓉姐姐   94    92     90      room212
95008   liuq       89    92     93      room316
95009   songh      35    66     57      room317
95010   李刚       88    99     92      room319

zhengzhiqiang的主页 zhengzhiqiang | 初学一级 | 园豆:12
提问于:2012-12-29 11:21
< >
分享
最佳答案
0

第一个错

 fp=fopen("D:\\CCC\\file.txt","a+");
  if((fp=fopen("file.txt","a+"))==NULL)

为什么要fopen()两次

收获园豆:100
garbageMan | 菜鸟二级 |园豆:313 | 2012-12-30 21:56

 struct student jf(struct student stu[10]);

把函数类型声明写在main()里面很傻

那个10更傻

此外缺一个参数

应该

struct student jf(struct student [], int);

int main(void)

{

}

garbageMan | 园豆:313 (菜鸟二级) | 2012-12-30 21:59

@garbageMan: 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
 long num;
 char name[10];
 int eng;
 int math;
 int comp;
 char addr[20];
};
struct student stu[10],*p=stu;
int main()
{
 FILE*fp;
 fp=fopen("D:\\CCC\\file.txt","a+");
  if((fp=fopen("file.txt","a+"))==NULL)
  {
   printf("cannot open this file\n");
   exit(0);
  }
  struct student jf(struct student [],int);
  struct student studentaver(struct student stu[],int);
  struct student courseaver_max(struct student stu[],int);
 
  jf(p,10);
        studentaver(p,10);
        courseaver_max(p,10);
        fclose(fp);
  return 0;
}

struct student jf(struct student [],int);
int main(void)
{
 int s[10],i;
 printf("家访同学信息如下:\n");
 for(i=0;i<10;i++)
 {
  fscanf(fp,"%ld%s%d%d%d%s",&stu[i].num,stu[i].name,&stu[i].eng,&stu[i].math,&stu[i].comp,stu[i].addr);
        s[i]=stu[i].eng+stu[i].math+stu[i].comp;
  if(s[i]<180)
  {
   printf("学号 姓名 英语 数学 计算机 住址\n");
   printf("%ld%s%d%d%d%s\n",stu[i].num,stu[i].name,stu[i].eng,stu[i].math,stu[i].comp,stu[i].addr);
 }
}}
struct student studentaver(struct student stu[],int);
int main(void)
{
 int stuaver[10];
 int i;
 printf("学号  姓名  平均分\n");
    for(i=0;i<10;i++)
 {
  stuaver[i]=int((stu[i].eng+stu[i].math+stu[i].comp)/3+0.5);
  fprintf(fp,"%d%s%f\n",stu[i].num,stu[i].name,stuaver[i]);
 }
}
struct student courseaver_max(struct student stu[],int);
int main(void)
{
 int max[3]={0},i;
 float courseaver[3]={0.0};
 printf("课程  平均分  最高分\n");
 for(i=0;i<10;i++)
 {
  fscanf(fp,"%d%d%d%f",&stu[i].eng,&stu[i].math,&stu[i].comp,&stuaver[i]);
 }
    for(i=0;i<10;i++)
 {
  max[1]=max[1]>stu[i].eng?max[1]:stu[i].eng;
  max[2]=max[2]>stu[i].math?max[2]:stu[i].math;
  max[3]=max[3]>stu[i].comp?max[3]:stu[i].comp;
 }
 for(i=0;i<10;i++)
 {
  courseaver[1]+=stu[i].eng;
  courseaver[2]+=stu[i].math;
  courseaver[3]+=stu[i].comp;
 }
 fprintf(fp,"英语\t%f\t%d\n",courseaver[1],max[1]);
 fprintf(fp,"数学\t%f\t%d\n",courseaver[2],max[2]);
 fprintf(fp,"计算机\t%f\t%d\n",courseaver[3],max[3]);
}

 

谢了,改后还有几个错误,求指导!!!

C:\Documents and Settings\dmt\2131.cpp(36) : error C2084: function 'int __cdecl main(void)' already has a body
C:\Documents and Settings\dmt\2131.cpp(41) : error C2065: 'fp' : undeclared identifier
C:\Documents and Settings\dmt\2131.cpp(69) : error C2065: 'stuaver' : undeclared identifier
C:\Documents and Settings\dmt\2131.cpp(69) : error C2109: subscript requires array or pointer type
C:\Documents and Settings\dmt\2131.cpp(69) : error C2102: '&' requires l-value
执行 cl.exe 时出错.

zhengzhiqiang | 园豆:12 (初学一级) | 2012-12-31 18:32

@zhengzhiqiang: 

怎么有两个main()?

garbageMan | 园豆:313 (菜鸟二级) | 2012-12-31 19:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册