0%

一个简易的C语言成绩记录簿

编制一个C语言成绩记录簿,每个学生信息包括:学号、姓名、C语言成绩。具体功能:

  1. 创建信息,并以磁盘文件保存(可选);
  2. 读取磁盘文件(可选)并显示输出所有学生的成绩;
  3. 按学号或姓名查询成绩;
  4. 添加成绩记录;
  5. 修改指定姓名或学号的学生的成绩;
  6. 显示输出60分以下、6079、8089、90分以上各分数段的学生信息。

源代码:

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
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define LEN sizeof(struct Node)
struct Node
{
int num;
int score;
struct Node *next;
};

struct Node *creat() //创建
{
int n;
struct Node *head;
struct Node *p1, *p2;
n=0;
p1=p2=(struct Node *)malloc(LEN);
printf("输入第1位同学的学号和分数并以空格或回车隔开(若想结束 输入 “0”“空格或回车”“0”)\n");
scanf("%d%*c%d",&(p1->num),&(p1->score));
while(p1->num!=0)
{
n=n+1;
printf("输入第%d位同学的学号和分数并以空格或回车隔开\n",n+1);
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct Node *)malloc(LEN);
scanf("%d%*c%d",&(p1->num),&(p1->score));
}
p2->next=NULL;
return(head);
}

void print(struct Node *head) //输出
{
struct Node *p;
p=head;
if(p!=NULL)
{
for(;p!=NULL;)
{
printf("第%d同学%d分\n",p->num,p->score);
p=p->next;
}
}
}

struct Node *del(struct Node *head) //删除
{
struct Node *q, *w, *e;
q=w=head;
int a;
printf("请输入您想删除的学生的学号\n");
scanf("%d",&a);
if(a!=q->num)//删除中途节点
{
while(a!=q->num)
{
w=q;//前一个节点
q=q->next;//要删除的一个节点
if(q==NULL)
{
printf("没有这个学生\n");
exit(1);
}
};
e=w->next;
w->next=q->next;
free(e);
}
else//删除头节点
{
e=head;
head=head->next;
free(e);
}
return(head);
}

struct Node *insert(struct Node *head) //插入
{
struct Node *q, *w, *e, *r;
q=w=head;
int a;
printf("请输入您想插入在哪个学生的前面\n");
scanf("%d",&a);
if(a!=q->num)//插入中途节点
{
do
{
w=q;//要插入的前一个节点
q=q->next;//要插入的一个节点
if(q==NULL)
{
printf("没有这个学生\n");
exit(1);
}
}while(a!=q->num);
e=(struct Node *)malloc(LEN);
printf("输入同学的学号和分数并以空格或回车隔开\n");
scanf("%d%*c%d",&(e->num),&(e->score));
w->next=e;
e->next=q;
}
else//插入头节点
{
e=(struct Node *)malloc(LEN);
printf("输入同学的学号和分数并以空格或回车隔开\n");
scanf("%d%*c%d",&(e->num),&(e->score));
r=head;
head=e;
e->next=r;
}
return(head);
}

void main()
{
int select;
struct Node *head;
head=creat();
while(1)
{
printf("请选择要执行的操作:\n1.插入 2.删除 3.输出链表元素 4.退出\n");
scanf("%d",&select);
switch(select)
{
case 1 : head=insert(head);break;
case 2 : head=del(head);break;
case 3 : print(head);break;
case 4 : exit(1);break;
default : printf("输入有误!");break;
}
}
}

运行结果部分截图

1

对于本次实验的体会

​ 自己打的函数没有遇到什么大问题,调试一下就知道是顺序问题,赋值问题,循环判断问题的小问题,得到的最大的收获就是,对于一个实现多功能的函数,一定要有switch去控制每一个函数,并且通过分函数去实现,这样发现问题可以更好地去调试,因为只需要调试错误的那一个分函数就可以判断出是什么错误去解决,而不是一个主函数一大串代码。更加的理解了链表的组成结构,怎么样去改动动态链表,将链表进行修改,删除,查询,添加。在编写链表函数时一定要画图保证思路清晰,可以减少很多很多的思维错误。