基于CSDN项目二次开发

本篇博客基于CSDN项目,C++学生成绩管理系统,所做的项目展示及二次开发以及过程感悟

CSDN原文链接:https://blog.csdn.net/sdliujiangbo/article/details/7693269

一、源码运行展示与解读

项目采用C++与文件方式储存管理学生信息,原博主用心设计了欢迎与管理两个界面,在程序运行时调用文件信息(图为系统第一次运行无文件信息)

 从主页面中,我们很容易的知道,该程序的主要功能有:1)增加学生成绩 2)显示学生成绩 3)排序统计成绩 4)查找学生成绩 5)删除学生成绩 6)修改学生成绩 0)安全退出系统

 在进入各个功能中进行实际使用体验:

1)增加学生成绩 

 从上图,我们可以看出程序主要对学生的学号、姓名和各科成绩进行录入

2)显示学生成绩

 该功能主要将储存的学生信息全部显示,但采用了逐一列举的方法,信息多时显示十分不方便

3)排序统计成绩

 该功能将三门课程成绩进行累加后以从小到大的顺序重新排序

4)查找学生成绩

 该功能可从学生姓名、学号两个方式查找文件中已有的学生信息

5)删除学生成绩 

 该功能可删除文件中已有的学生信息

6)修改学生成绩

该功能用于修改已有学生信息(就是找到已有的删掉用新的替换)

0)安全退出系统

 该功能可直接退出系统并保存文件信息

 二、项目不足与二次开发

对于C++项目来说该程序在功能与完成度上十分出彩,并且在基础的增删改查添加了排序功能,为了使该项目更加可观,借此机会提出建议并进行二次开发

1)学生信息显示逐一列举,可观性较低,可改成横向输出

1
2
3
4
void Show()
{
   cout<<"     |姓名:"<<setw(5)<<name<<"     |学号:"<<setw(5)<<Id<<"     |C++:"<<setw(8)<<Cnum<<"  |汇编:"<<setw(6)<<Mnum<<"    |嵌入式操作系统:"<<setw(8)<<Enum<<"      |总成绩:"<<setw(6)<<sum<<"    |"<<endl ;
}

 前后对比效果,可观性提高,总成绩排序更明显

2)出现学号姓名相同的情况时查找只能输出第一个,二次开发后相同情况可全部输出

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Student *FindItem(char * name)
    {
         for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
          if(!strcmp(p->Next->name,name))
          p->Next->Show();
          return NULL;
    }
Student *FindID(char * Id)
{
     for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
      if(!strcmp(p->Next->Id,Id))
      p->Next->Show();
      return NULL;
}

 

3)成绩范围无限制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
x:
cout<<"\t\t请输入C++课程的成绩:"
cin>>Cnum;
if(Cnum>100||Cnum<0){
  cout<<"\t\t输入格式有误!!请重新输入:\n";
  goto x;
}
y:
cout<<"\t\t请输入汇编课程的成绩:"
cin>>Mnum;
if(Mnum>100||Mnum<0){
  cout<<"\t\t输入格式有误!!请重新输入:\n";
  goto y;
}
z:
cout<<"\t\t请输入嵌入式操作系统课程的成绩:"
cin>>Enum;
if(Enum>100||Enum<0){
  cout<<"\t\t输入格式有误!!请重新输入:\n";
  goto z;
}

 将成绩输入范围控制到0~100,避免无效输出

 三、二次开发感悟(附源码)

通过此次二次开发的体验,发现了开发项目时几点问题:

1.代码规范和注释要写好,不然自己回头看或者别人看的时候十分困难

2.运用文件读写时文件名尽量简洁通俗,否则一个程序拿到手要花费不少时间在改文件路径上

3.目前很多项目都有其完整的架构和功能,二次开发更多的是测试和增加功能,使原项目更完整

二次开发源码:

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
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
# include <iostream>
# include <fstream>
# include <string.h>
# include <iomanip>
# include<stdlib.h>
# include<Windows.h>
# include <conio.h>//用getch();
using namespace std;
 
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌Student类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
 
class Student
{
public:
     char name[20];
     char Id[20];
     int Cnum;       //C++课程得分
     int Mnum;       //汇编课程得分
     int Enum;       //嵌入式操作系统课程得分
     int sum;        //总分    
     Student * Next;
void Input()
{
  cout<<"\t\t请输入学生的姓名:"
  cin>>name;
  cout<<"\t\t请输入学生的学号:"
  cin>>Id;
  x:
  cout<<"\t\t请输入C++课程的成绩:"
  cin>>Cnum;
  if(Cnum>100||Cnum<0){
    cout<<"\t\t输入格式有误!!请重新输入:\n";
    goto x;
  }
  y:
  cout<<"\t\t请输入汇编课程的成绩:"
  cin>>Mnum;
  if(Mnum>100||Mnum<0){
    cout<<"\t\t输入格式有误!!请重新输入:\n";
    goto y;
  }
  z:
  cout<<"\t\t请输入嵌入式操作系统课程的成绩:"
  cin>>Enum;
  if(Enum>100||Enum<0){
    cout<<"\t\t输入格式有误!!请重新输入:\n";
    goto z;
  }
  sum=Cnum+Mnum+Enum;
}
void ReadFile(istream & in)
 {
    in>>name>>Id>>Cnum>>Mnum>>Enum>>sum;
 }
 void Show()
 {
    cout<<"     |姓名:"<<setw(5)<<name<<"     |学号:"<<setw(5)<<Id<<"     |C++:"<<setw(8)<<Cnum<<"  |汇编:"<<setw(6)<<Mnum<<"    |嵌入式操作系统:"<<setw(8)<<Enum<<"      |总成绩:"<<setw(6)<<sum<<"    |"<<endl ;
 }
};
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌Studentmassage类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
 
class Studentmassage
{
public:
     Studentmassage();
     ~Studentmassage();
     void ShowMenu();
     void Find();
     void Save();
     void ModifyItem();
     void RemoveItem();
     void Swap(Student *,Student *);
     void Sort();
     //void Unpass();
     int ListCount();
     //void Average();
     void Display()
         {
              for(Student * p=Head->Next;p!=End;p=p->Next)
               p->Show();
              cout<<"输入任意字符!继续……";
              getch();
         }
 
 void AddItem()
 {
      End->Input();
      End->Next=new Student;
      End=End->Next;
      cout<<"添加成功!"<<endl;
      cout<<"输入任意字符!继续……";
      getch();
 }
private:
     Student * Head,* End;
     ifstream in;
     ofstream out;
     Student *FindItem(char * name)
         {
              for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
               if(!strcmp(p->Next->name,name))
               p->Next->Show();
               return NULL;
         }
     Student *FindID(char * Id)
     {
          for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
           if(!strcmp(p->Next->Id,Id))
           p->Next->Show();
           return NULL;
     }
};
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌构造函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
 
Studentmassage::Studentmassage()
{
     Head=new Student;
     Head->Next=new Student;
     End=Head->Next;
     in.open("sort.txt");
     if(!in)
        cout<<"这是一个新系统,无学生信息。请先输入。"<<endl;
     else
     {
          while(!in.eof())
              {
                   End->ReadFile(in);
                   if(End->name[0]=='\0')break;
                   End->Next=new Student;
                   End=End->Next;
              }
          in.close();
          cout<<"\t\t读取学生信息成功!"<<endl;
         }
}
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌析构函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Studentmassage::~Studentmassage()
{
     Save();
     for(Student * temp;Head->Next!=End;)
         {
              temp=Head->Next;
              Head->Next=Head->Next->Next;
              delete temp;
         }
     delete Head,End;
}
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌菜单﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
 
void Studentmassage::ShowMenu()                 
{
      cout<<"********************************************************************************"<<endl;
      cout<<"〓〓〓〓〓〓〓〓〓〓  ☆   学 生 成 绩 管 理 系  统     ☆  〓〓〓〓〓〓〓〓〓〓"<<endl;
      cout<<"〓〓〓〓〓〓〓★★★★★         ★★★★★★★         ★★★★★〓〓〓〓〓〓〓"<<endl;
      cout<<"〓〓〓〓〓〓〓〓〓★  ☆          1.增加学生成绩        ☆  ★〓〓〓〓〓〓〓〓〓"<<endl;
      cout<<"〓〓〓〓〓〓〓〓〓★  ☆          2.显示学生成绩        ☆  ★〓〓〓〓〓〓〓〓〓"<<endl;
      cout<<"〓〓〓〓〓〓〓〓〓★  ☆          3.排序统计成绩        ☆  ★〓〓〓〓〓〓〓〓〓"<<endl;
      cout<<"〓〓〓〓〓〓〓〓〓★  ☆          4.查找学生成绩        ☆  ★〓〓〓〓〓〓〓〓〓"<<endl;
      cout<<"〓〓〓〓〓〓〓〓〓★  ☆          5.删除学生成绩        ☆  ★〓〓〓〓〓〓〓〓〓"<<endl;
      cout<<"〓〓〓〓〓〓〓〓〓★  ☆          6.修改学生信息        ☆  ★〓〓〓〓〓〓〓〓〓"<<endl;
      cout<<"〓〓〓〓〓〓〓〓〓★  ☆          0.安全退出系统        ☆  ★〓〓〓〓〓〓〓〓〓"<<endl;
      
     cout<<"\n\t\t\n\t\t请选择:";
}
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌查找函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
 
void Studentmassage::Find()
{
     char name[20] ,Id[10];
     int x;
     Student * p=NULL;
     cout<<"\n\t\t*********************************\n";
     cout<<"\t\t※ 1.按学生的姓名查找\n\t\t※ 2.按学生学号查找";
     cout<<"\n\t\t*********************************\n请选择:";
     cin>>x;
     switch(x)
         {
             case 1:{cout<<"\t\t请输入要查找的学生的姓名:";cin>>name;
              if(p=FindItem(name))
                      {
                           p->Next->Show();
                           cout<<"输入任意字符!继续……";
                           getch();
                      }
              else
                  {
                       cout<<"\t\t没有找到该姓名的学生!"<<'\n'<<endl;
                       cout<<"输入任意字符!继续……";
                       getch();
                  }
                 }break;
             case 2:
                  {
                       cout<<"\t\t请输入要查找的学生的学号:";cin>>Id;
                       if(p=FindID(Id))
                           {
                                p->Next->Show();
                                cout<<"输入任意字符!继续……";
                                getch();
                           }
                       else
                       {
                            cout<<"\t\t没有找到该学号的学生!"<<'\n'<<endl;
                            cout<<"输入任意字符!继续……";
                            getch();
                       }
                  }break;
         }
  
}
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌修改信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
 
void Studentmassage::ModifyItem()     //修改信息
{
     char name[20];
     Student * p=NULL;
     cout<<"\t\t请输入要修改的人的姓名:";cin>>name;
     if(p=FindItem(name))
         {
              cout<<"\t\t已找到学生的信息,请输入新的信息!"<<endl;
              p->Next->Input();
              cout<<"修改成功!"<<endl;
              cout<<"输入任意字符!继续……";
              getch();
         }
     else
         {
              cout<<"\t\t没有找到!"<<endl;
              cout<<"输入任意字符!继续……";
              getch();
         }
}
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌删除信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
 
void Studentmassage::RemoveItem()         // 删除信息
{
     char name[20];
     Student * p=NULL,*temp=NULL;
     cout<<"\t\t请输入要删除的学生的姓名:"<<endl;cin>>name;
     if(p=FindItem(name))
         {
              temp=p->Next;
              p->Next=p->Next->Next;
              delete temp;
              cout<<"\t\t删除成功!"<<endl;
              cout<<"输入任意字符!继续……";
              getch();
         }
     else
         {
              cout<<"\t\t没有找到!"<<endl;
                 cout<<"输入任意字符!继续……";
              getch();
         }
}
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
 
void Studentmassage::Swap(Student *p1, Student *p2)//交换两个combox变量的数据域
{
     Student *temp=new Student;
     strcpy(temp->name,p1->name);
     strcpy(temp->Id,p1->Id);
     temp->Cnum=p1->Cnum;
     temp->Mnum=p1->Mnum;
     temp->Enum=p1->Enum;
     temp->sum=p1->sum;
      
     strcpy(p1->name,p2->name);
     strcpy(p1->Id,p2->Id);
     p1->Cnum=p2->Cnum;
     p1->Mnum=p2->Mnum;
     p1->Enum=p2->Enum;
     p1->sum=p2->sum;
      
     strcpy(p2->name,temp->name);
     strcpy(p2->Id,temp->Id);
     p2->Cnum=temp->Cnum;
     p2->Mnum=temp->Mnum;
     p2->Enum=temp->Enum;
     p2->sum=temp->sum;
}
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
 
int Studentmassage::ListCount()//统计当前链表的记录总数,返回一个整数
{
     if(! Head)
      return 0;
     int n=0;
     for(Student * p=Head->Next;p!=End;p=p->Next)
         {
          n++;
         }
     return n;
}
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
 
void Studentmassage::Sort()//对当前链表进行排序
{
     cout <<"Sorting..."<<endl;
     Student *p=NULL,*p1=NULL,*k=NULL;
     int n=Studentmassage::ListCount();
     if(n<2)
        return;
     for(p=Head->Next;p!=End;p=p->Next)
      for(k=p->Next;k!=End;k=k->Next)
          {
           if(p->sum>k->sum)
               {
                    Studentmassage::Swap(p,k);
               }
          }
     cout <<"排序完成!"<<endl;
     getch();
     return;
}
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌保存函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
 
void Studentmassage::Save()
{
     out.open("sort.txt");
     for(Student *p=Head->Next;p!=End;p=p->Next)
      out<<p->name<<"\t"<<p->Id<<"\t"<<p->Cnum<<"\t"
      <<p->Mnum<<"\t"<<p->Enum<<"\t"<<p->sum<<'\n';
     out.close();
}
  
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌主函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
 
int main()
{
     int x,i=0;
     bool quit=false;
     cout<<"\t\t§§§§§§§§§§§§§§§§§§§§§§§§§§"<<endl;
     for(i=0;i<3;i++)
      cout<<"\t\t◎\t\t\t\t\t\t  ◎"<<endl;
     cout<<"\t\t◎★★★★【  欢迎进入学生成绩管理系统  】★★★★◎"<<endl;
     for(i=0;i<3;i++)
      cout<<"\t\t◎\t\t\t\t\t\t  ◎"<<endl;
     cout<<"\t\t§§§§§§§§§§§§§§§§§§§§§§§§§§\n"<<endl;;
     Studentmassage Grade;
     cout<<"按任意键开始……";
      getch();
     while(!quit)
         {
              system("cls");
              Grade.ShowMenu();
              cin>>x;
              switch(x)
                  {
                      case 0:quit=true;break;
                      case 1:Grade.AddItem();break;
                      case 2:Grade.Display();break;
                      case 3:Grade.Sort();break;
                      case 4:Grade.Find();break;
                      case 5:Grade.RemoveItem();break;
                      case 6:Grade.ModifyItem();break;
                  }
         }
     return 0;

感谢观看!!

posted @   小王不会敲代码  阅读(156)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示