题目: 建一个data.in的问件,在里面输入N个同学的信息:学号、姓名、数学成绩、英语成绩、C语言成绩,格式是一个同学的信息占一排,每项之间空一格(例如:22

逗逗喵吧 2012-04-26 02:50:19
题目: 建一个data.in的问件,在里面输入N个同学的信息:学号、姓名、数学成绩、英语成绩、C语言成绩,格式是一个同学的信息占一排,每项之间空一格(例如:22201 mike 80 36 64)。要求我用结构体,然后要达到统计不及格门数超过两门的通同学信息(学号、姓名),并按学号升序排列。

各位帮帮忙吧!
...全文
782 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
DataChat.Club 2012-04-26
  • 打赏
  • 举报
回复
亲,结贴吧,你老不结贴的话,就没人甩你啦。。。。





[Quote=引用 6 楼 的回复:]

引用 2 楼 的回复:
lz结帖率已经0.
而且是c,看着怕.
不趟浑水

什么是结帖率,有时我没有资格在技术区域发帖,怎么回事,怎么获得资格,我知道这个问题很菜,但请你指点指点吧!
[/Quote]
DataChat.Club 2012-04-26
  • 打赏
  • 举报
回复
我菜鸟,试着写了下,你看行不。。

data.in中的内容是:


0005 stuA 80 20 10
0008 stuB 10 9 90.5
0003 stuC 50.5 48 56
0009 stuD 12 4 8
0001 stuE 4 8 59


程序:


#define NUMMAX 10 //最多有NUMMAX个学生
#include <stdio.h>
#include <stdlib.h>

struct stuStruct {
int stuNumber; //学号
char stuName[20]; //名字
float math; //数学成绩
float english; //英语成绩
float c; //c语言成绩
}student[NUMMAX];

int loser[NUMMAX]; //超过两门不及格的学生在"data.in"中的学号
int row[NUMMAX][1]; //记录学号在"data.in"中对应的行号

//查找超过两门不及格学生的学号,返回超过两门不及格的人数
int findLosers(struct stuStruct student[NUMMAX])
{
int number; //第number个学生
int num_failed; //不及格科目的数量
int i = 0;

for (number = 0; student[number].stuNumber != 0; number++)//"data.in"中的学生学号都不为0,为0说明无数据
{
if (number == NUMMAX)
break;
num_failed = 0;//初始化 不及格科目的数量
if (student[number].math < 60)
num_failed++;
if (student[number].english < 60)
num_failed++;
if (student[number].c < 60)
num_failed++;

if (num_failed >2) //如果不及格的科目数量大于2,就把这个学生的学号记录到Loser[]中
{
loser[i++] = student[number].stuNumber;
}
}

printf("\n共有%d名学生超过两门不及格\n", i);
return i; //返回超过两门课不及格的学生数量
}

//用快速排序,将超过两门不及格的学生的学号进行排序
int partition(int loser[], int p, int r)
{
int x = loser[r];
int i = p - 1;
int j, temp;
for (j = p; j < r; j++)
{
if(loser[j] <= x)
{
i++;
temp = loser[i];
loser[i] = loser[j];
loser[j] = temp;
}
}
temp = loser[i + 1];
loser[i + 1] = loser[r];
loser[r] = temp;
return i + 1;
}

void quicksort(int loser[], int p, int r)
{
int q;
if (p < r)
{
q = partition(loser, p, r );
quicksort(loser, p, q-1);
quicksort(loser, q+1, r);
}
}




int main()
{
int i;
int number = 0; //第number行的学生
int total; //超过两门不及格的学生的总数
//读取文件
FILE *fp;
if ((fp = fopen("data.in", "r")) == NULL)
{
printf("cannot open this file\n");
exit(0);
}

printf("\"data.in\"中的学生信息是:\n\n");
printf("学号\t姓名\t数学\t英语\tC语言\t\n");
while(!feof(fp))
{
fscanf(fp, "%d %s %f %f %f\n", &student[number].stuNumber, &student[number].stuName, &student[number].math,
&student[number].english, &student[number].c);
row[student[number].stuNumber][0] = number; //row[学号][0] = 行号

printf("%d\t%s\t%3.1f\t%3.1f\t%3.1f\n",
student[number].stuNumber, student[number].stuName, student[number].math,
student[number].english, student[number].c);

number++;
}

//先查找出超过两门不及格的学生的学号, 并将返回值赋给total
total = findLosers(student);

//再对这些学号进行排序
quicksort(loser, 0, total - 1);

//将这些学生的信息打印出来
printf("\n他们是:\n\n");
printf("学号\t姓名\t数学\t英语\tC语言\t\n");
for (i = 0; i < total; i++)
{
printf("%d\t%s\t%3.1f\t%3.1f\t%3.1f\n",
student[row[loser[i]][0]].stuNumber, student[row[loser[i]][0]].stuName, student[row[loser[i]][0]].math,
student[row[loser[i]][0]].english, student[row[loser[i]][0]].c);
}
fclose(fp);
return 0;
}





输出是:


"data.in"中的学生信息是:

学号 姓名 数学 英语 C语言
5 stuA 80.0 20.0 10.0
8 stuB 10.0 9.0 90.5
3 stuC 50.5 48.0 56.0
9 stuD 12.0 4.0 8.0
1 stuE 4.0 8.0 59.0

共有3名学生超过两门不及格

他们是:

学号 姓名 数学 英语 C语言
1 stuE 4.0 8.0 59.0
3 stuC 50.5 48.0 56.0
9 stuD 12.0 4.0 8.0
请按任意键继续. . .
haloujj 2012-04-26
  • 打赏
  • 举报
回复
我有个类似的,你看看,改改就应该可以了!(排序还有点问题)#include <stdio.h>
#define M 5
#define N 3
int i,j,m,cj[M][N];
float pj[M],Pj[N];
void main()
{
float sum(int i);
float mpj(int i);
void sort();
void bjg();
printf(" 学号 k1 k2 k3\n");
for(i=0;i<M;i++)
{
printf(" input number %d cj:",i+1);
for(j=0;j<N;j++)
scanf("%d",&cj[i][j]);
}
printf("\n");
c: printf("\t\t\t1--每个学生的平均成绩\n\t\t\t2--每门课的平均分\n\t\t\t3--按平均分降序排列\n\t\t\t4--不及格学生及其科目\n\t\t\t0--退出\n\n");
printf("\t\t请选择<0--4>:");
scanf("%d",&m);
if(m==1)
{
for(i=1;i<=M;i++)
{
pj[i-1]=sum(i-1)/N;
printf("\t\t学号%d,平均成绩%.2f\n",i,pj[i-1]);
} goto c;
}
if(m==2)
{
for(i=0;i<N;i++)
{
Pj[i]=mpj(i);
printf("\t\t科目%d的平均分%.2f\n",i+1,Pj[i]);
} goto c;
}
if(m==3)
{ sort();goto c;}
if(m==4)
{ bjg();goto c;}
if(m==0);
}
float sum(int i)
{
float s=0.0;
for(j=0;j<N;j++)
s+=cj[i][j];
return(s);
}
float mpj(int i)
{ float s=0.0;
for(j=0;j<M;j++)
s+=cj[j][i];
return(s/M);
}
void sort()
{ int k=0,l;
float t;
for(j=0;j<M; k=j,j++)
{
for(i=j+1;i<M;i++)
if(pj[j]<pj[i])
t=pj[j],pj[j]=pj[i],pj[i]=t,k=i;
printf("\t\t学号%d,平均分%.2f,成绩",k+1,pj[j]);
for(l=0;l<N;l++)
printf("%-3d",cj[k][l]);
printf("\n");
}
}
void bjg()
{
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
if(cj[i][j]<60)
printf("\t\t不及格学号%d,科目%d得分%d\n",i+1,j+1,cj[i][j]);
}
}
逗逗喵吧 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
lz结帖率已经0.
而且是c,看着怕.
不趟浑水
[/Quote]
什么是结帖率,有时我没有资格在技术区域发帖,怎么回事,怎么获得资格,我知道这个问题很菜,但请你指点指点吧!
逗逗喵吧 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 3 楼 的回复:
什么是问件?空一格和空格有什么不同?什么是通同学?


"通”是多余的,不小心打上去了
[/Quote]

“文”,而不是“问”,打错了
逗逗喵吧 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
什么是问件?空一格和空格有什么不同?什么是通同学?
[/Quote]

"通”是多余的,不小心打上去了
sundayX 2012-04-26
  • 打赏
  • 举报
回复
什么是问件?空一格和空格有什么不同?什么是通同学?
evencoming 2012-04-26
  • 打赏
  • 举报
回复
lz结帖率已经0.
而且是c,看着怕.
不趟浑水
muyi66 2012-04-26
  • 打赏
  • 举报
回复
不懂!从没听说过问件。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧