求助C语言问题 急

实践练习2:数组与结构体编程(成绩统计)学生成绩统计(一维数组)从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能:... 实践练习2:数组与结构体编程(成绩统计)
学生成绩统计(一维数组)从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能:
(1)统计不及格人数并打印不及格学生名单;
(2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单;
(3)以直方图方式统计各分数段的学生人数及所占的百分比。形式如下:
分段 人数图形
<60 3(10%)***
60-69 8(…)********
70-79 7(…)*******
80-89 8(…)********
>=90 4(…)****
(4)将实践练习2中的第1题利用函数的思想进行修改。要求函数参数中包含数组名。
展开
 我来答 举报
匿名用户
推荐于2016-03-31
展开全部
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
// 某班级学生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);
}
White_MouseYBZ
2015-01-07 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6599万
展开全部
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//#include "stdafx.h"//vc++6.0加上这一行.
#include "stdio.h"
struct stu{
    char name[20];
    int score;
};
void myfun(struct stu *p,int n){
    int i,nopass,x[30];
    for(nopass=i=0;i<n;i++)
        if(p[i].score<60)
            x[nopass++]=i;
    printf("\nThere were %d didn't pass the exam, As follows:\n",nopass);
    for(i=0;i<nopass;printf("%s ",p[x[i++]].name));
}
int main(void){
    struct stu array[30];
    int i,j,sum,a[5]={0};
    float average;
    char f[][6]={"  <60","60-69","70-79","80-89"," >=90"};
    char *s="******************************";
    printf("Please input data...\n");
    for(sum=i=0;i<30;i++){
        scanf("%s%d",array[i].name,&array[i].score);
        if(array[i].score<0) break;
        sum+=array[i].score;
    }
    myfun(array,i);
    printf("\n\nAbove average(containing) is as follows:\n");
    average=(float)sum/i;
    for(j=0;j<i;j++){
        if(average<=array[j].score)
            printf("%s ",array[j].name);
        if(array[j].score<60) a[0]++;
        else if(60<=array[j].score && array[j].score<70) a[1]++;
        else if(70<=array[j].score && array[j].score<80) a[2]++;
        else if(80<=array[j].score && array[j].score<90) a[3]++;
        else a[4]++;
    }
    printf("\n\n");
    for(j=0;j<5;j++)
        printf("%s %d(%.1f%%)%*.*s\n",f[j],a[j],(a[j]*100.0)/i,1,a[j],s);
    printf("\n");
    return 0;
}
抢首赞 已赞过 已踩过<
你对这个回答的评价是?
评论 举报 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式