一、概述:

【标题】学生成绩管理的设计与实现

【开发语言】C、C++

【主要技术】结构体、STL

【基本功能】实现对学生成绩类的基本操作:增加、删除、查询、排序

【测试数据】功能测试:按提示输入5组正确的正确的数据和5组有问题的数据,查看程序能否运行正确

      性能测试:随机生成1、5、10、15万条数据,查看程序完成按总分排序所用的时间及打印完成的时间

【测试结果】功能测试:基本功能运行正确,没有进行异常处理

【C++版本性能数据】

数据量(万条) 1 5 10 15
排序所用时间(秒) 1.7 25.9 02:35.0 07:49.9
完成打印所用时间(秒) 21.2 01:59.9 05:40.7 11:43.5
排序所需内存(K) 640 3132 6264 9388

  

【C语言版本新性能数据】

数据量(万条) 1 5 10 15
排序所用时间(秒) 0.7 12.2 02:21.6 7:10.7
完成打印所用时间(秒) 8.0 48.7 03:33.5 09:10.7
排序所需内存(K) 1064 4700 9392 14050

 

【结论】使用C语言实现排序和打印所用时间少,消耗内存更多

二、C语言版本详细设计

  1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include<time.h>
5
6 /*学生结构体*/
7 struct student{
8 char name[10];
9 char no[10];
10 double couse[4];
11 double sum ;
12 };
13
14 /*链表节点*/
15 typedef struct node{
16 struct student st;
17 struct node *Next;
18 }Node;
19
20 int Add(Node *Head);/*增加学生*/
21 void Print(Node *Head);/*打印学生信息*/
22 int Find(Node *Head);/*查询学生*/
23 int Del(Node *Head);/*删除学生*/
24 void sort_sum(Node *Head);/*按总成绩排序*/
25 void sort_no(Node *Head);/*按学号排序*/
26 void main_remid();/*主要提示信息*/
27 void score_remind();/*成绩提示信息*/
28
29 int main()
30 {
31 Node* Head = (struct node *)malloc(sizeof (Node));
32 Head->Next = NULL;
33 char op = ' ';
34 main_remid();
35 while(op != 'q')
36 {
37 scanf("%c", &op);
38 switch(op)
39 {
40 case '1':
41 sort_no(Head);
42 break;
43 case '2':
44 Add(Head);
45 break;
46 case '3':
47 Find(Head);
48 break;
49 case '4':
50 Del(Head);
51 break;
52 case '5':
53 sort_sum(Head);
54 break;
55 case '6':
56 main_remid();
57 break;
58 default:
59 printf("输入指令未知,请重新输入\n");
60 break;
61 }
62 printf("请继续选择您想要的操作:\n");
63 fflush(stdin);
64 }
65 return 0;
66 }
67
68 /*增加学生*/
69 int Add(Node *Head)
70 {
71 Node* p = (struct node*)malloc(sizeof (Node));
72 p->st.sum = 0.0;
73 printf("请输入学生的学号\n");
74 scanf("%s", p->st.no);
75 printf("请输入学生的姓名\n");
76 scanf("%s", p->st.name);
77 printf("请输入学生的英语成绩\n");
78 scanf("%lf", &p->st.couse[0]);
79 p->st.sum += p->st.couse[0];
80 printf("请输入学生的数学成绩\n");
81 scanf("%lf", &p->st.couse[1]);
82 p->st.sum += p->st.couse[1];
83 printf("请输入学生的语文成绩\n");
84 scanf("%lf", &p->st.couse[2]);
85 p->st.sum += p->st.couse[2];
86 printf("请输入学生的C语言成绩\n");
87 scanf("%lf", &p->st.couse[3]);
88 fflush(stdin);
89 p->st.sum += p->st.couse[3];
90 if(Head->Next == NULL)
91 {
92 p->Next = NULL;
93 Head ->Next = p;
94 }
95 else
96 {
97 p->Next = Head ->Next;
98 Head->Next = p;
99 }
100 return 0;
101 }
102
103 /*按总成绩排序*/
104 void sort_sum(Node *Head)
105 {
106 Node *p = Head;
107 Node *temp = (struct node*)malloc(sizeof (Node));
108 Node *first = (struct node*)malloc(sizeof (Node));
109 memcpy(first, p->Next ,sizeof (Node));
110 temp->Next = first;
111 first->Next = NULL;
112 p = p->Next;
113 while(p->Next != NULL)
114 {
115 Node *t = temp;
116 while(t->Next!=NULL && p->Next->st.sum < t->Next->st.sum)
117 t = t->Next;
118 Node *q = (struct node*)malloc(sizeof (Node));
119 memcpy(q, p->Next, sizeof(Node));
120 q->Next = t->Next;
121 t->Next = q;
122 p = p->Next;
123 }
124 Print(temp);
125 p = temp;
126 Node *q = temp->Next;
127 while(q->Next != NULL)
128 {
129 free(p);
130 p = q;
131 q = q->Next;
132 }
133 free(p);
134 free(q);
135 }
136
137 /*按学号排序*/
138 void sort_no(Node *Head)
139 {
140 Node *p = Head;
141 Node *temp = (struct node*)malloc(sizeof (Node));
142 Node *first = (struct node*)malloc(sizeof (Node));
143 memcpy(first, p->Next ,sizeof (Node));
144 temp->Next = first;
145 first->Next = NULL;
146 p = p->Next;
147 while(p->Next != NULL)
148 {
149 Node *t = temp;
150 while(t->Next!=NULL && atoi(p->Next->st.no)>atoi(t->Next->st.no))
151 t = t->Next;
152 Node *q = (struct node*)malloc(sizeof (Node));
153 memcpy(q, p->Next, sizeof(Node));
154 q->Next = t->Next;
155 t->Next = q;
156
157 p = p->Next;
158 }
159 Print(temp);
160 p = temp;
161 Node *q = temp->Next;
162 while(q->Next != NULL)
163 {
164 free(p);
165 p = q;
166 q = q->Next;
167 }
168 free(p);
169 free(q);
170 }
171
172 /*void sort_sum1(Node *Head)
173 {
174 Node *temp;
175 Node *p = Head;
176 temp->Next2 = p->Next;
177
178
179 p = p->Next;
180 p->Next2 = NULL;
181 while(p->Next != NULL)
182 {
183 Node *t = temp;
184 while(t->Next2!=NULL && p->Next->st.sum<t->Next2->st.sum)
185 t = t->Next2;
186 p->Next->Next2 = t->Next2;
187 t->Next2 = p->Next;
188
189 p = p->Next;
190 }
191 Print(temp);
192
193 }*/
194
195 /*打印学生信息*/
196 void Print(Node *Head)
197 {
198 Node* p = Head;
199 score_remind();
200 while(p->Next != NULL)
201 {
202 printf("\t%s", p->Next->st.no);
203 printf("\t%s", p->Next->st.name);
204 printf("\t%.1lf", p->Next->st.couse[0]);
205 printf("\t%.1lf", p->Next->st.couse[1]);
206 printf("\t%.1lf", p->Next->st.couse[2]);
207 printf("\t%.1lf", p->Next->st.couse[3]);
208 printf("\t%.1lf\n", p->Next->st.sum);
209 p = p->Next;
210 }
211 p = NULL;
212 }
213
214 /*查询学生*/
215 int Find(Node *Head)
216 {
217 Node* p = Head;
218 printf("请输入要查找学生的学号:\n");
219 char no[10];
220 scanf("%s", no);
221 while(p->Next != NULL)
222 {
223 if(!strcmp(no, p->Next->st.no))
224 {
225 score_remind();
226 printf("\t%s", p->Next->st.no);
227 printf("\t%s", p->Next->st.name);
228 printf("\t%.1lf", p->Next->st.couse[0]);
229 printf("\t%.1lf", p->Next->st.couse[1]);
230 printf("\t%.1lf", p->Next->st.couse[2]);
231 printf("\t%.1lf", p->Next->st.couse[3]);
232 printf("\t%.1lf\n", p->Next->st.sum);
233 p = NULL;
234 return 1;
235 }
236 p = p->Next;
237 }
238 printf("查找失败,不存在次学号\n");
239 p = NULL;
240 return 0;
241 }
242
243 /*删除学生*/
244 int Del(Node *Head)
245 {
246 Node* p = Head;
247 printf("请输入要删除学生的学号:\n");
248 char no[10];
249 scanf("%s", no);
250 while(p->Next != NULL)
251 {
252 if(!strcmp(no, p->Next->st.no))
253 {
254 Node *q = p->Next;
255 p->Next = p->Next->Next;
256 printf("%s %s删除成功\n",q->st.no, q->st.name);
257 free(q);
258 q = NULL;
259 return 1;
260 }
261 p = p->Next;
262 }
263 printf("不存在此学号\n");
264 }
265
266 /*主要提示信息*/
267 void main_remid()
268 {
269 printf("\t\t\t学生成绩类\n");
270 printf("\t\t1.查询所有学生的成绩信息\n");
271 printf("\t\t2.增加学生\n");
272 printf("\t\t3.查找学生\n");
273 printf("\t\t4.删除学生\n");
274 printf("\t\t5.查看总分排名\n");
275 printf("\t\t6.查看此提示\n");
276 printf("\t\tq.退出系统\n\n");
277 }
278
279 /*成绩提示信息*/
280 void score_remind()
281 {
282 printf("\t\t\t 学生成绩信息\n");
283 printf("\t学号\t姓名\t数学\t英语\t语文\tC语言\t总成绩\n");
284 }

三、C++版本的详细设计

  1 #include<iostream>
2 #include<string>
3 #include<list>
4 #include<algorithm>
5 using namespace std;
6
7 class student{
8 private:
9 string No;
10 string Name;
11 double Math;
12 double Eng;
13 double Chn;
14 double Cpro;
15 double Sum;
16 public:
17 student(string no, string name, double math, double eng,
18 double chn, double cpro){
19 No = no;
20 Name = name;
21 Math = math;
22 Eng = eng;
23 Chn = chn;
24 Cpro = cpro;
25 Sum = math + eng + chn + cpro;
26 }
27
28 friend ostream& operator <<(ostream& out, student& S)
29 {
30 out << "\t" << S.No << "\t" << S.Name << "\t" << S.Math << "\t"
31 << S.Eng << "\t" << S.Chn << "\t" << S.Cpro << "\t" << S.Sum;
32 return out;
33 }
34 const string getno()
35 {
36 return No;
37 }
38 const string getname()
39 {
40 return Name;
41 }
42 const double getsum()
43 {
44 return Sum;
45 }
46 ~student(){
47
48 }
49 };
50
51 void main_remid(); /*输出主要提示信息 */
52 void score_remind(); /*输出成绩提示信息*/
53 int add(list<student> &lst); /*增加学生*/
54 int find(list<student> &lst); /*查询学生信息*/
55 int del(list<student> &lst); /*删除学生*/
56 void sort_sum(list<student> &lst); /*按总成绩降序打印学生成绩*/
57 void sort_no(list<student> &lst); /*按学号升序打印学生成绩*/
58 bool cmp_no(student& st1, student& st2); /*用于sort的比较函数*/
59
60 int main()
61 {
62 list<student> lst; /*使用list容器存储学生信息*/
63 char op = ' ';
64 main_remid();
65 while(op != 'q')
66 {
67 cin >> op;
68 switch(op)
69 {
70 case '1':
71 sort_no(lst);
72 break;
73 case '2':
74 add(lst);
75 break;
76 case '3':
77 find(lst);
78 break;
79 case '4':
80 del(lst);
81 break;
82 case '5':
83 sort_sum(lst);
84 break;
85 case '6':
86 main_remid();
87 break;
88 default:
89 cout << "输入指令未知,请重新输入" << endl;
90 break;
91 }
92 if(op != 'q')
93 cout << " 请继续选择您想要的操作:" << endl;
94 }
95 return 0;
96 }
97
98 /*增加学生*/
99 int add(list<student> &lst)
100 {
101 string No;
102 string Name;
103 double Math;
104 double Eng;
105 double Chn;
106 double Cpro;
107 cout << " 请输入要增加学生的学号:" << endl;
108 cin >> No;
109 for(list<student>::iterator it=lst.begin(); it!=lst.end(); it++)
110 if(No == it->getno()){
111 cout << "添加失败,此学号已存在,请重新操作" << endl;
112 return 0;
113 }
114 cout << " 请输入要增加学生的姓名" << endl;
115 cin >> Name;
116 cout << " 请输入要增加学生的数学成绩:" << endl;
117 cin >> Math;
118 cout << " 请输入要增加学生的英语成绩:" << endl;
119 cin >> Eng;
120 cout << " 请输入要增加学生的语文成绩:" << endl;
121 cin >> Chn;
122 cout << " 请输入要增加学生的C语言成绩:" << endl;
123 cin >> Cpro;
124 student *st = new student(No, Name, Math, Eng, Chn, Cpro);
125 lst.push_back(*st);
126 }
127
128 /*查询学生信息*/
129 int find(list<student> &lst)
130 {
131 cout << "请输入要查询学生的学号:" << endl;
132 string no;
133 cin >> no;
134 for(list<student>::iterator it=lst.begin(); it!=lst.end(); it++)
135 {
136 if(no == it->getno())
137 {
138 score_remind();
139 cout << *it << endl;
140 return 0;
141 }
142 }
143 cout << "不存在此学号,请重新选择操作" << endl;
144 }
145
146 /*删除学生*/
147 int del(list<student> &lst)
148 {
149 cout << " 请输入要删除学生的学号:" << endl;
150 string no;
151 string name;
152 cin >> no;
153 for(list<student>::iterator it=lst.begin(); it!=lst.end(); it++)
154 if(no == it->getno())
155 {
156 no = it->getno();
157 name = it->getname();
158 lst.erase(it);
159 cout << "学生" << no << " " << name << "删除成功" << endl;
160 return 0;
161 }
162 cout << " 删除失败,不存在此学号" << endl;
163 }
164
165 /*按学号升序打印学生成绩*/
166 void sort_no(list<student> &lst)
167 {
168 list<student> temp;
169 temp.push_front(*lst.begin());
170 for(list<student>::iterator it=++lst.begin(); it!=lst.end(); it++)
171 {
172 list<student>::iterator jt = temp.begin();
173 while(jt!=temp.end() && strcmp(it->getno().c_str(), jt->getno().c_str()))
174 jt++;
175 temp.insert(jt, *it);
176 }
177 score_remind();
178 for(list<student>::iterator it=temp.begin(); it!=temp.end(); it++)
179 {
180 cout << *it << endl;
181 }
182 }
189
190 /*按成绩升序打印学生成绩*/
191 void sort_sum(list<student> &lst)
192 {
193 list<student> temp;
194 temp.push_front(*lst.begin());
195 for(list<student>::iterator it=++lst.begin(); it!=lst.end(); it++)
196 {
197 list<student>::iterator jt = temp.begin();
198 while(jt!=temp.end() && it->getsum()<jt->getsum())
199 jt++;
200 temp.insert(jt, *it);
201 }
202 score_remind();
203 for(list<student>::iterator it=temp.begin(); it!=temp.end(); it++)
204 {
205 cout << *it << endl;
206 }
207 }
208
209 /*输出主要提示信息 */
210 void main_remid()
211 {
212 cout << "\t\t\t学生成绩类" << endl << endl;
213 cout << "\t\t1.查询所有学生的成绩信息" << endl;
214 cout << "\t\t2.增加学生" << endl;
215 cout << "\t\t3.查找学生" << endl;
216 cout << "\t\t4.删除学生" << endl;
217 cout << "\t\t5.查看总分排名" << endl;
218 cout << "\t\t6.查看提示" << endl;
219 cout << "\t\tq.退出系统" << endl << endl;
220 }
221
222 /*输出成绩提示信息*/
223 void score_remind()
224 {
225 cout << "\t\t\t 学生成绩信息" << endl << endl;
226 cout << "\t学号\t" << "姓名\t" << "数学\t" << "英语\t"
227 << "语文\t" << "C语言\t" << "总成绩" << endl;
228 }

插入排序的性能测试对比(C与C++实现)的更多相关文章

  1. PostgreSQL单机、同步复制、异步复制性能测试对比

    测试环境: •测试机:PC •内存:8GB •CPU:Intel(R) Core(TM) i5-3450 3.10GHz •硬盘:HDD •数据量:20GB •测试工具:pgbench •Postgr ...

  2. [转帖]Docker五种存储驱动原理及应用场景和性能测试对比

    Docker五种存储驱动原理及应用场景和性能测试对比 来源:http://dockone.io/article/1513 作者: 陈爱珍 布道师@七牛云   Docker最开始采用AUFS作为文件系统 ...

  3. tcmalloc jemalloc glibc内存分配管理模块性能测试对比

    tcmalloc是谷歌提供的内存分配管理模块 jemalloc是FreeBSD提供的内存分配管理模块 glibc是Linux提供的内存分配管理模块 并发16个线程,分配压测3次,每次压15分钟,可以看 ...

  4. sqlsugar freesql hisql 三个ORM框架性能测试对比

    hisql与目前比较流行的ORM框架性能测试对比 总体测试结果 插入记录数 hisql(耗时) sqlsugar(耗时) freesql(耗时) 5条 0.0107秒 0.0312秒 0.02675秒 ...

  5. c# sqlsugar,hisql,freesql orm框架全方位性能测试对比 sqlserver 性能测试

    在2022年1月份本人做过一次sqlsugar,hisql,freesql三个框架的性能测试,上次主要是测的sqlserver下的常规插入(非bulkcopy的方式数据插入),hisql与目前比较流行 ...

  6. 最详细的CentOS 6与7对比(三):性能测试对比

    本主题将从3个角度进行对比 常见设置(CentOS 6 vs CentOS 7) 服务管理(Sysvinit vs Upstart vs Systemd) 性能测试(cpu/mem/io/oltp) ...

  7. Linux下RocksDB、LevelDB、ForestDB性能测试对比

    简要说明 本次环境与http://www.cnblogs.com/oloroso/p/6306352.html中的一致. 依然是增删查改各测试10000次,每个测试重复5次取平均值. 1.不使用jem ...

  8. HttpURLConnection与 HttpClient 区别/性能测试对比

    HttpClient是个开源框架,封装了访问http的请求头,参数,内容体,响应等等, HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便 HttpClient实 ...

  9. impala presto SparkSql性能测试对比

      目标是为测试impala presto SparkSql谁的性能更佳,以下结果底层查询的都是普通textfile snappy压缩后数据,规模为15台机器,若以orcfile.parquet速度能 ...

随机推荐

  1. HTML5新结构标签和移动端页面布局

    --------------------HTML5新结构标签--------------------1.h5新增的主要语义化标签如下: 1.header 页面头部.页眉 2.nav 页面导航 3.ar ...

  2. 【小白成长撸】--链栈(C语言版)

    // 链栈.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #include <st ...

  3. 移动端适配方案以及rem和px之间的转换

    背景 开发移动端H5页面 面对不同分辨率的手机 面对不同屏幕尺寸的手机 视觉稿 在前端开发之前,视觉MM会给我们一个psd文件,称之为视觉稿. 对于移动端开发而言,为了做到页面高清的效果,视觉稿的规范 ...

  4. 小程序脚本语言WXS,你想要的都在这里了

    WXS脚本语言是 Weixin Script脚本的简称,是JS.JSON.WXML.WXSS之后又一大小程序内部文件类型.截至到目前小程序已经提供了5种文件类型. 解构小程序的几种方式,其中一种方式就 ...

  5. 教学服务系统设计之PHP后台设计

    项目简介 本项目是与@nameoverflow同学合作.该同学负责vue 前端的设计,我负责php后台的接口实现.本文将主要记录php后台. 本项目的Github地址:https://github.c ...

  6. 201521123084 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. (1)Java中把不同类型的输入.输出抽象为流(Stream),而其中输入.输出的数据则称为数据流(Data ...

  7. java四则运算生成器

    题目描述: 从<构建之法>第一章的 "程序" 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除 ...

  8. 【Alpha】阶段 第七次 Scrum Meeting

    每日任务 1.本次会议为第一次 Meeting会议: 2.本次会议在下午14:45,课间休息时间在禹州楼召开,召开本次会议为10分钟,根据大家的讨论分析得出的总结,讨论下接下来版本的改进计划: 一.今 ...

  9. 团队作业8——第二次项目冲刺(Beta阶段)--第三天

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 学号 成员 贡献比 201421123001 廖婷婷 16% 201421123002 翁珊 16% 201421123004 ...

  10. JAVA基础第四组(5道题)

    16.[程序16]                   题目:输出9*9口诀.                  1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列. package com. ...