早教吧作业答案频道 -->其他-->
求助C语言问题急实践练习2:数组与结构体编程(成绩统计)学生成绩统计(一维数组)从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分
题目详情
求助C语言问题 急
实践练习2:数组与结构体编程(成绩统计)
学生成绩统计(一维数组)从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能:
(1)统计不及格人数并打印不及格学生名单;
(2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单;
(3)以直方图方式统计各分数段的学生人数及所占的百分比。形式如下:
分段 人数图形
<60 3(10%)***
60-69 8(…)********
70-79 7(…)*******
80-89 8(…)********
>=90 4(…)****
(4)将实践练习2中的第1题利用函数的思想进行修改。要求函数参数中包含数组名。
实践练习2:数组与结构体编程(成绩统计)
学生成绩统计(一维数组)从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能:
(1)统计不及格人数并打印不及格学生名单;
(2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单;
(3)以直方图方式统计各分数段的学生人数及所占的百分比。形式如下:
分段 人数图形
<60 3(10%)***
60-69 8(…)********
70-79 7(…)*******
80-89 8(…)********
>=90 4(…)****
(4)将实践练习2中的第1题利用函数的思想进行修改。要求函数参数中包含数组名。
▼优质解答
答案和解析
// 某班级学生C语言第一次正考的成绩存于数据文件score.dat中,记录了学生学号、姓名和考试成绩,bk.dat文件中记录了补考学生的学号、姓名和补考成绩,编写程序以链式存储结构实现以下要求:
// 1、对该班级按成绩降序排序并统计成绩平均分及每个分数段的人数,结果写入到result.dat中。
// 2、再根据补考成绩修改原成绩,修改成绩后仍按成绩降序写在result.dat的后面。成绩修改原则:
// 1)补考成绩大于等于60,原成绩以60分记;2)补考成绩小于60,取两次成绩中最高值记。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 50
typedef struct {
int xh; //学生学号、姓名和考试成绩
char na[MAX];
float cj;
}datatype;
typedef struct Node{
datatype data;
struct Node* next;
} Seqlist;
void print(Seqlist* l);
void initList(Seqlist *lp);/*置一个空表*/
void createList(Seqlist *lp, char strname[]);/*建立成绩顺序表 */
void save(Seqlist *lp, char strname[]);/*保存学生顺序表到指定文件*/
void sort_cj(Seqlist *lp); /*降序排序*/
void average(Seqlist *lp); /*算平均分并写入文件 */
void bandscore(Seqlist *lp);/*划分分数段及写入 */
void changescore(Seqlist *lp, Seqlist *bk); /*修改成绩*/
int main()
{
Seqlist lp, bk;
initList(&lp); initList(&bk);
createList(&lp, "score.dat");
createList(&bk, "bk.dat");
sort_cj(&lp);
save(&lp, "result.dat");
average(&lp);
bandscore(&lp);
changescore(&lp, &bk);
sort_cj(&lp);
save(&lp, "result.dat");
return 0;
}
/*置一个空表*/
void initList(Seqlist *lp)
{
lp->next = 0;
lp->data.xh =0;
lp->data.na[0]='\0';
lp->data.cj = 0;
}
void print(Seqlist*l){
Seqlist* p = l->next;
while (p)
{
printf("%d %s %f\n", p->data.xh, p->data.na,p->data.cj);
p = p->next;
}
}
/*建立成绩顺序表 */
void createList(Seqlist *lp, char strname[])
{
FILE *fp;
int xh;
float cj;
Seqlist*p,*tail=lp;
if ((fp = fopen(strname, "rb")) == NULL)
{
printf("file open error\r\n");
exit(0);
}
while (!feof(fp))
{
p = (Seqlist*)malloc(sizeof(Seqlist));
fscanf(fp, "%d%s%f", &p->data.xh, p->data.na, &p->data.cj);
tail->next = p;
tail = p;
}tail->next = NULL;
print(lp);
fclose(fp);
}
/*降序排序*/
void sort_cj(Seqlist* head)
{
Seqlist* tail = NULL;
while (tail != head->next)
{
Seqlist* pre = head;
Seqlist* cur = pre->next;
while (cur != tail && cur->next != tail)
{
if (cur->data.cj< cur->next->data.cj)
{
//交换当前节点和后一个节点
pre->next = cur->next;
cur->next = cur->next->next;
pre->next->next = cur;
}
pre = pre->next;
cur = pre->next;
}
tail = cur;
}
}
/*保存学生顺序表到文件(追加)*/
void save(Seqlist *l, char strname[])
{
FILE *fp;
Seqlist *lp= l->next;
int i;
if ((fp = fopen(strname, "ab")) == NULL)
{
printf("file open error\r\n");
exit(0);
}
while (lp){
fprintf(fp, "%d %s %.2f\r\n", lp->data.xh, lp->data.na, lp->data.cj);
lp = lp->next;
}
fprintf(fp, "\r\n");
fclose(fp);
}
/*算平均分并写入文件 */
void average(Seqlist *l)
{
FILE *fp;
int i,num=0;
Seqlist *lp = l->next;
float s = 0, a;
while (lp){
num++;
s += lp->data.cj;
lp = lp->next;
}
if (num)
a = s / num;
if ((fp = fopen("result.dat", "ab")) == NULL){
printf("file open error\r\n");
exit(0);
}
fprintf(fp, "平均分为%.2f\r\n", a);
fprintf(fp, "\r\n");
fclose(fp);
}
/*分数段及写入 */
void bandscore(Seqlist *l)
{
FILE *fp;
if ((fp = fopen("result.dat", "ab")) == NULL){
printf("file open error\r\n");
exit(0);
}
Seqlist*lp = l->next;
int i, a = 0, q = 0, w = 0, e = 0, r = 0, t = 0, y = 0;
while (lp){
a = lp->data.cj / 10;
lp = lp->next;
switch (a)
{
case 10:q++; break;
case 9:w++; break;
case 8:e++; break;
case 7:r++; break;
case 6:t++; break;
default:y++; break;
}
}
fprintf(fp, "成绩为100有%d人\r\n", q);
fprintf(fp, "成绩为90~99有%d人\r\n", w);
fprintf(fp, "成绩为80~89有%d人\r\n", e);
fprintf(fp, "成绩为70~79有%d人\r\n", r);
fprintf(fp, "成绩为60~69有%d人\r\n", t);
fprintf(fp, "不及格的有%d人\r\n", y);
fprintf(fp, "\r\n");
fclose(fp);
}
/*修改成绩*/
void changescore(Seqlist *lp, Seqlist *bk)
{
int i, j;
Seqlist*la = lp->next, *lb = bk->next;
while (lb){
while (la){
if (lb->data.xh == la->data.xh)
{
if (lb->data.cj >= 60)
la->data.cj = 60;
else if (lb->data.cj > la->data.cj)
la->data.cj = lb->data.cj;
break;
}
la = la->next;
}
lb = lb->next;
}
print(lp);
}
看了 求助C语言问题急实践练习2:...的网友还看了以下:
今年五月结束的“好运北京”田径测试赛中刘翔获得了110m栏的冠军.赛前他进行了刻苦训练,如果对他1 2020-06-18 …
在一次数学测验中,高一(1)班第2小组所有同学的成绩组成一个数列{an},且前n项的和Sn=n2+ 2020-07-08 …
甲、乙两名运动员在6次百米赛跑训练中的成绩(单位:秒)如表:甲10.710.810.910.611 2020-07-22 …
“爱运动,强身体”,在我校的运动会中,某班一名200米短跑选手赛前进行了刻苦训练,体育老师对他10 2020-07-23 …
为备战体育中考,李明同学就自己平时1分钟跳绳的训练成绩,做了认真统计,并将训练成绩绘出了如下的频数 2020-07-29 …
要从甲、乙两名同学中选出一名,代表班级参加射击比赛,如图是两人最近10次射击训练成绩的折线统计图. 2020-07-31 …
一些运动员,由于比赛时过于紧张,比赛时成绩还不如平时的训练成绩,一些平时成绩不错的同学由于考试怯场, 2020-12-01 …
在选拔2016年第十三届全国冬季运动会速滑运动员时,教练打算根据平时训练成绩,从运动员甲和乙种挑选1 2020-12-09 …
(2014•孟津县一模)下列调查适合抽样调查的是()A.审查书稿有哪些科学型错误B.了解一个打字训练 2020-12-10 …
1.已知一组数据1、2、3、5、x的平均数是3,则x=,这组数据的标准差是.2.我校一名运动员5次1 2021-01-01 …