源码(含数据),实习论文,实习计划书,实习汇报PPT:下载链接
https://download.csdn.net/download/weixin_43042683/21354783
任务内容
题目内容:作业完成情况管理程序
具体要求:假设某门课程一学期要留10次作业,每次老师要进行批改,给出分数后还要进行登记。学期期末要根据每次作业的成绩计算出最终的平时成绩(满分100)。
该程序应该具有下列功能:
(1) 通过键盘输入某位学生某次作业的分数;
(2) 给定学号,显示某位学生作业完成情况;
(3) 给定某个班级的班号,显示该班所有学生的作业完成情况;
(4) 给定某位学生的学号,修改该学生的作业完成信息;
(5) 给定某位学生的学号,删除该学生的信息;
(6) 提供一些统计各类信息的功能。
程序设计框图
程序设计流程图
?进入系统可进行的操作,可以在系统中输入学生的各项信息和成绩,也可以从文件中直接导入(文件中保存的信息应该依次是姓名、学号、班级号、连续十次的成绩,各个信息用空格隔开)。
详细设计说明
Mian()主函数包括:(实习论文更详细)
Printf_help();//显示主菜单
input(st,qt);//?通过键盘输入某位学生某次作业的分数
readfile(st,fp);//?从文件导入学生信息
sno_search(st);//?给定学号,显示某位学生作业完成情况
cno_search(st);//?给定某个班级的班号,显示该班所有学生的作业完成情况
sno_change(st);//?给定某位学生的学号,修改该学生的作业完成信息
sno_delete(st);//?给定某位学生的学号,删除该学生的信息
statistics_result(st);//?显示各类统计信息
system("CLS");//清屏
creat_files(st,fp);//?导出文件
程序使用说明
步骤一:首次运行之后会出现一个主菜单:
?步骤二:然后可以根据不同的数字字符的输入,进行不同的操作。每一步操作也有下一步相应的文字提示。
在主菜单中选择‘1’后,就是进行键盘输入某位学生某次作业的分数的操作:
?
?在主菜单中选择‘2’后,进行文件导入学生信息操作:
?在主菜单中选择‘3’,就是对给定学生学号进行该学生作业完成情况的一个查询工作:
在主菜单中选择‘4’,可通过班级号,对该班学生的作业完成情况进行查询:
在主菜单中选择‘5’,可修改给定学号的学生作业完成信息:?
?
?在主菜单中选择‘6’,可删除给定学号的学生作业完成信息:
?
?在主菜单中选择‘7’,可显示各类统计信息:
?在副菜单下选择‘1’,可以按学号查看学生平时成绩:
?在副菜单下选择‘2’,可以按班级查看学生平时成绩:
?
?在副菜单下选择‘3’,输出降序的平时成绩的排列:
?在主菜单中选择‘8’,执行清屏功能;
步骤三:
在主菜单中选择‘9’,导出文件:
?在主菜单中选择‘0’,退出系统:
?参考代码
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
#include <sys/stat.h>
#include <iostream>
using namespace std;
typedef struct student
{
char name[10];
int sno;
int cno;
float score[10];
struct student *next;
} stu,*stupt;
stupt st=NULL;//学生信息的头指针
stupt qt=NULL;//学生信息的尾指针
FILE* fp;//文件指针
//清空缓冲区函数
void clear(void)
{
char ch;
do
{
ch=getchar();
}
while(ch!='\n');
}
//主菜单
void Printf_help()
{
cout<<" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "<<endl;
cout<<" |*尊敬的用户请您选择操作: *|"<<endl;
cout<<" |* 1.通过键盘输入某位学生某次作业的分数 *|"<<endl;
cout<<" |* 2.从文件导入学生信息 *|"<<endl;
cout<<" |* 3.给定学号,显示某位学生作业完成情况 *|"<<endl;
cout<<" |* 4.给定某个班级的班号,显示该班所有学生的作业完成情况 *|"<<endl;
cout<<" |* 5.给定学生的学号,修改该学生的作业完成信息 *|"<<endl;
cout<<" |* 6.给定学生的学号,删除该学生的信息 *|"<<endl;
cout<<" |* 7.显示各类统计信息 *|"<<endl;
cout<<" |* 8.清屏 *|"<<endl;
cout<<" |* 9.导出至文件 *|"<<endl;
cout<<" |* 0.退出系统 *|"<<endl;
cout<<" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "<<endl;
cout<<" 请选择:";
}
//输入成绩
stupt inpu(stupt p)
{
int n;
int m=0;
int flag;
while(m<10)//成绩初始化为0
{
p->score[m]=0;
m++;
}
cout<<"请您输入姓名:";
cin>>p->name;
clear();
cout<<"请您输入学号(如:2017013030):";
cin>>p->sno;
clear();
cout<<"请您输入班级号(如:1701):";
cin>>p->cno;
clear();
do
{
cout<<"请您输入第几次作业(1~10):";
cin>>n;
clear();
cout<<"请您输入该次作业成绩(0~100):";
cin>>p->score[n-1];
clear();//清空缓冲区
cout<<"您是否继续输入该生成绩,退出请按q,其他键继续:";
flag=getchar();
clear();//清空缓冲区堆积
}
while(flag!='q');
return p;
}
void input(stupt &st,stupt &qt)
{
stupt p,q;
p=q=NULL;
p=(stupt)malloc(sizeof(stu));
if(p==NULL) exit(1);
p=inpu(p);
if(st==NULL)
st=qt=p;
else if(qt!=NULL)
{
qt->next=p; //尾指针非空(及链表已存在)接着尾指针建立链表
qt=p;
}
if(p!=NULL&&qt!=NULL)
{
qt->next=NULL;
}
Printf_help();
}
//导入成绩
void reads(stupt p,FILE* fp)
{
fscanf(fp,"%s",p->name);
fscanf(fp,"%d",&p->sno);
fscanf(fp,"%d",&p->cno);
fscanf(fp,"%f",&p->score[0]);
fscanf(fp,"%f",&p->score[1]);
fscanf(fp,"%f",&p->score[2]);
fscanf(fp,"%f",&p->score[3]);
fscanf(fp,"%f",&p->score[4]);
fscanf(fp,"%f",&p->score[5]);
fscanf(fp,"%f",&p->score[6]);
fscanf(fp,"%f",&p->score[7]);
fscanf(fp,"%f",&p->score[8]);
fscanf(fp,"%f",&p->score[9]);
}
void filep_read_to_st(stupt &st,FILE* fp)
{
stupt p;
while(1)
{
p=(stupt)malloc(sizeof(stu));
reads(p,fp);
if(feof(fp)) break;
if(st==NULL) st=qt=p;
else if(qt!=NULL)
{
qt->next=p; //尾指针非空(即链表已存在)接着尾指针建立链表
qt=p;
}
}
if(feof(fp))
{
qt->next=NULL; //如果文件结束,尾指针next指空
}
if(st!=NULL&&feof(fp))
cout<<"友情提示:您的文件导入成功!"<<endl;
else
cout<<"友情提示:您的文件导入失败,请重新导入!"<<endl;
}
void readfile(stupt &st,FILE* fp)
{
char flag_1;
char filename[90];
cout<<"按任意键继续,退出请按q:";
flag_1=getchar();
if(flag_1=='q')
{
return;
}
lab_2:
cout<<"请您输入导入路径(请确保导入路径合法)(如c:.\\student.txt):";
cin>>filename;
clear();
if(access(filename,0)==1)
{
cout<<"友情提示:您的文件路径不合法或文件不存在,请重新选择!"<<endl;
goto lab_2;
}
fp=fopen(filename,"rb");
if(fp==NULL)
{
cout<<"友情提示:打开"<<filename<<"文件失败,请返回主菜单重试!"<<endl;
return;
}
else
filep_read_to_st(st,fp);
fclose(fp);
}
//按学号查询
void printf_score(stupt p)
{
int n=0;
cout<<"前十次成绩如下:"<<endl;
cout<<"成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 成绩8 成绩9 成绩10"<<endl;
cout<<"-------------------------------------------------------------"<<endl;
while(n<10)
{
printf("%-6.1f",p->score[n]);
n++;
}
cout<<endl;
cout<<"-------------------------------------------------------------"<<endl;
}
void search(stupt &st,int snum)
{
stupt p,q;
if(st==NULL)
{
cout<<"未建立学生信息表,请返回主菜单输入或导入所有学生的信息"<<endl;
return;
}
else
{
p=st;
q=p->next;
}
if(p->sno==snum)
{
printf_score(p); //查找成功输出并返回上级函数
return;
}
while(q!=NULL)
{
if(q->sno==snum)
{
printf_score(q); //查找成功输出并返回上级函数
return;
}
q=q->next;//下一个
}
cout<<"查询失败,该学号学生信息不存在"<<endl;
}
void sno_search(stupt &st)
{
int snum;
char flag;
do
{
cout<<"请输入要查找的学生学号(如:2017013031):";
cin>>snum;
clear();//清空scanf结束时进入缓冲的enter符
search(st,snum);
cout<<"退出请按q,其它任意键继续查找:";
flag=getchar();
clear();//清空回车符
}
while(flag!='q');
if(flag=='q')
{
Printf_help();
}
}
//给定班级查询
void printf_infor(stupt p)
{
printf("%-5d%-8s%-12d%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f\n",
p->cno,p->name,p->sno,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],
p->score[5],p->score[5],p->score[7],p->score[8],p->score[9]);
cout<<"──────────────────────────────────────—————"<<endl;
}
void search_2(stupt st,int clnum)
{
stupt p,q;
int f=0;
if(st==NULL)
{
cout<<"未建立学生信息表,请返回主菜单输入所有学生的信息"<<endl;
return;
}
else
{
p=st;
q=p->next;
}
cout<<"班级 姓名 学号 成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 成绩8 成绩9 成绩10"<<endl;
cout<<"──────────────────────────────────────—————"<<endl;
if(p->cno==clnum)
{
printf_infor(p);
f++;
}//查找成功输出
while(q!=NULL)
{
if(q->cno==clnum)
{
printf_infor(q);
f++;
}//查找成功输出
q=q->next;//下一个
}
if(f==0)
{
cout<<"没有该班级学生信息"<<endl;
}
}
void cno_search(stupt st)
{
int clnum;
char flag;
do
{
cout<<"请输入班级(如:1701):";
cin>>clnum;
clear();//清空scanf结束时进入缓冲的enter符
search_2(st,clnum);
cout<<"退出请按q,其它任意键继续查找:";
flag=getchar();
clear();//清空回车符
}
while(flag!='q');
if(flag=='q')
{
Printf_help();
}
}
//修改成绩
void change_score(stupt &p)
{
int n;
char flag;
do
{
cout<<"请输入:要修改的作业的次数(1~10):";
cin>>n;
clear();
printf("原成绩为:%.1f\n",p->score[n-1]);
cout<<"请输入:该次作业新成绩(0~100):";
cin>>p->score[n-1];
clear();//清空缓冲区
cout<<"是否继续修改该生成绩,退出请按q,其他键继续:";
flag=getchar();
clear();
}
while(flag!='q');
}
void change(stupt &p)
{
clear();
cout<<"班级 姓名 学号 成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 成绩8 成绩9 成绩10"<<endl;
cout<<"──────────────────────────────────────—————"<<endl;
printf_infor(p);
change_score(p);
}
void search_3(stupt &st,int snum)
{
stupt p,q;
int f=0;
if(st==NULL)
{
cout<<"未建立学生信息表,请返回主菜单输入或导入所有学生的信息"<<endl;
return;
}
else
{
p=st;
q=p->next;
}
if(p->sno==snum)
{
change(p); //查找成功并修改
f++;
return;
}
while(q!=NULL)
{
if(q->sno==snum)
{
change(q); //查找成功并修改
return;
}
q=q->next;//下一个
}
if(f==0)
{
cout<<"没有该学生信息"<<endl;
}
}
void sno_change(stupt &st)
{
int snum;
char flag;
do
{
cout<<"请输入要修改学生学号(如2017013031):";
cin>>snum;
clear();//清空scanf结束时进入缓冲的enter符
search_3(st,snum);
cout<<"退出请按q,其它任意键继续按学号查找修改信息:";
flag=getchar();
clear();//清空回车符
}
while(flag!='q');
if(flag=='q')
{
Printf_help();
}
}
//删除学生信息
void delete_pt(stupt &st,int snum)
{
stupt p,q;
if(st==NULL)
{
cout<<"未建立学生信息表,请返回主菜单输入或导入所有学生的信息"<<endl;
return;
}
else
{
p=st;
q=p->next;
}
if(p->sno==snum)
{
st=q; //查找成功删除并返回上级函数
cout<<"班级 姓名 学号 成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 成绩8 成绩9 成绩10"<<endl;
cout<<"──────────────────────────────────────—————"<<endl;
printf_infor(p);
free(p);
cout<<"上面信息删除成功!"<<endl;
return;
}
while(q!=NULL)
{
if(q->sno==snum)
{
p->next=q->next; //查找成功删除并返回上级函数
cout<<"班级 姓名 学号 成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 成绩8 成绩9 成绩10"<<endl;
cout<<"──────────────────────────────────────—————"<<endl;
printf_infor(q);
free(q);
cout<<"上面信息删除成功!"<<endl;
return;
}
else//下一个
{
p=q;
q=p->next;
}
}
cout<<"删除失败,该学号学生信息不存在"<<endl;
}
void sno_delete(stupt &st)
{
int snum;
char flag;
do
{
cout<<"请输入要删除的学生学号(如:2017013031):";
cin>>snum;
clear();//清空scanf结束时进入缓冲的enter符
delete_pt(st,snum);
cout<<"返回请按q,其它任意键继续删除:";
flag=getchar();
clear();//清空回车符
}
while(flag!='q');
if(flag=='q')
{
Printf_help();
}
}
//查询成绩,,按学号班级,降序
void printf_help_3()
{
cout<<" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "<<endl;
cout<<" |*请选择操作: *|"<<endl;
cout<<" |* 1.按学号查看学生平时成绩 *|"<<endl;
cout<<" |* 2.按班级查看学生平时成绩 *|"<<endl;
cout<<" |* 3.按平时成绩降序排序(操作执行后将会对学生信息排序 )*|"<<endl;
cout<<" |* 0.返回主菜单 *|"<<endl;
cout<<" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "<<endl;
cout<<"请选择:";
}
float aver(stupt p)
{
int n=0;
float sum=0;//和初始化为0
while(n<10)
{
sum+=p->score[n];
n++;
}
return sum;
}
void search_4(stupt st,int snum)
{
stupt p,q;
int f=0;
float sum;
cout<<"-----------------------------------------------------------------------------"<<endl;//分行符
if(st==NULL)
{
cout<<"未建立学生信息表,请返回主菜单输入或导入所有学生的信息"<<endl;
return;
}
else
{
p=st;
q=p->next;
}
if(p->sno==snum)
{
sum=aver(p);
printf("姓名:%-10s学号:%-12d班级:%-10d作业完成平时成绩:%.1f\n",p->name,p->sno,p->cno,sum/10);
f++;
cout<<"-----------------------------------------------------------------------------"<<endl;//分行符
return;
}//查找成功并输出平均值
while(q!=NULL)
{
if(q->sno==snum)
{
sum=aver(q);
printf("姓名:%-10s学号:%-12d班级:%-10d作业完成平时成绩:%.1f\n",q->name,q->sno,q->cno,sum/10);
f++;
cout<<"-----------------------------------------------------------------------------"<<endl;//分行符
return;
}//查找成功并输出平均值
q=q->next;//下一个
}
if(f==0)
{
cout<<"没有该学生信息"<<endl;
}
}
void snum_check_aver(stupt st)
{
int snum;
cout<<"请输入学号(如:2017013032):";
cin>>snum;
clear();//清空scanf结束时进入缓冲的enter符
search_4(st,snum);
}
void search_5(stupt st,int cnum)
{
stupt p,q;
int f=0;
float sum;
cout<<"-----------------------------------------------------------------------------"<<endl;//分行符
if(st==NULL)
{
cout<<"未建立学生信息表,请返回主菜单输入或导入所有学生的信息"<<endl;
return;
}
else
{
p=st;
q=p->next;
}
if(p->cno==cnum)
{
sum=aver(p);
printf("姓名:%-10s学号:%-12d班级:%-10d作业完成平时成绩:%.1f\n",p->name,p->sno,p->cno,sum/10);
cout<<"-----------------------------------------------------------------------------"<<endl;//分行符
f++;
}//查找成功并输出平均值
while(q!=NULL)
{
if(q->cno==cnum)
{
sum=aver(q);
printf("姓名:%-10s学号:%-12d班级:%-10d作业完成平时成绩:%.1f\n",q->name,q->sno,q->cno,sum/10);
cout<<"-----------------------------------------------------------------------------"<<endl;//分行符
f++;
}//查找成功并输出平均值
q=q->next;//下一个
}
if(f==0)
{
cout<<"没有该班级的信息"<<endl;
}
}
void cnum_check_aver(stupt st)
{
int cnum;
cout<<"请输入班级(如:1701):";
cin>>cnum;
clear();//清空scanf结束时进入缓冲的enter符
search_5(st,cnum);
}
void insert_emp1(stupt &emp1,stupt q)
{
stupt pt1,pt2;
pt1=emp1;
pt2=pt1->next;
while(pt2!=NULL)
{
if(aver(q)>aver(pt2))//插到pt2之前
{
pt1->next=q;
q->next=pt2;
return;
}
else//指针后移
{
pt1=pt2;
pt2=pt1->next;
}
}
pt1->next=q;//比所有的都不大,插到末尾
q->next=NULL;
}
void descending_order_check(stupt &st)
{
stupt emp1,head1,head2,pt;
float sum;
cout<<"-----------------------------------------------------------------------------"<<endl;//分行符
if(st==NULL)
{
cout<<"未建立学生信息表,请返回主菜单输入或导入所有学生的信息"<<endl;
return;
}
head1=(stupt)malloc(sizeof(stu));
head2=(stupt)malloc(sizeof(stu));//另一个空链表头指针,将st有序插入到head2
head1->next=st->next;
st->next=NULL;
head2->next=st;
pt=head1->next;
while(pt!=NULL)
{
head1->next=pt->next;
insert_emp1(head2,pt);
pt=head1->next;
}
emp1=head2->next;
st=emp1;
while(emp1!=NULL)
{
sum=aver(emp1);
printf("姓名:%-10s学号:%-12d班级:%-10d作业完成平时成绩:%-10.3f\n",emp1->name,emp1->sno,emp1->cno,sum/10);
cout<<"-----------------------------------------------------------------------------"<<endl;//分行符
emp1=emp1->next;
}
}
void statistics_result(stupt &st)
{
char flag;
printf_help_3();
while((flag=getchar())!='0')
{
clear();
switch(flag)
{
case '1':
{
cout<<"您选择了:1.按学号查看学生平时成绩"<<endl;
snum_check_aver(st);
break;
}
case '2':
{
cout<<"您选择了:2.按班级查看学生平时成绩"<<endl;
cnum_check_aver(st);
break;
}
case '3':
{
cout<<"您选择了:3.查看学生平时成绩降序序列"<<endl;
descending_order_check(st);
break;
}
default:
{
cout<<"非法输入,请重新选择!"<<endl;
clear();
break;
}
}
printf_help_3();
}
if(flag=='0')
{
cout<<"您选择了:0.返回主菜单"<<endl;
clear();
Printf_help();
}
}
//导出文件
void fileprintf(stupt st,FILE* fp)
{
float sum;
stupt pt;
pt=st;
while(pt!=NULL)
{
sum=aver(pt);
fprintf(fp,"%-10s%-12d%-10d%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-8.1f%-6.1f\r\n",pt->name,pt->sno,pt->cno,pt->score[0],pt->score[1],pt->score[2],pt->score[3],pt->score[4],pt->score[5],pt->score[6],pt->score[7],
pt->score[8],pt->score[9],sum/10.0);
pt=pt->next;
}
cout<<"文件导出成功 !"<<endl;
}
void creat_files(stupt st,FILE* fp)
{
char filename[90];
lab_1:
cout<<"请输入文件名及保存路径:";
cin>>filename;
clear();
if(access(filename,0)==1)
{
cout<<"路径不合法,请重新输入!"<<endl;
goto lab_1;
}
fp=fopen(filename,"ab+");
if(fp==NULL)
{
cout<<"创建文件至"<<filename<<"失败,请返回主菜单重试!"<<endl;
return;
}
else
fprintf(fp,"姓名 学号 班级 成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 成绩8 成绩9 成绩10 平时成绩\r\n");
fileprintf(st,fp);
fclose(fp);
}
//-main-
int main()
{
// system("color 3f");
char a,ch;
cout<<" ┄欢迎您使用学生作业完成情况管理程序┄ "<<endl;
Printf_help();
while((a=getchar())!='0')
{
clear();
switch(a)
{
case '1':
{
cout<<"您选择了:1.通过键盘输入某位学生某次作业的分数"<<endl;
input(st,qt);
break;
}
case '2':
{
cout<<"您选择了:2.从文件导入学生信息"<<endl;
readfile(st,fp);
Printf_help();
break;
}
case '3':
{
cout<<"您选择了:3.给定学号,显示某位学生作业完成情况"<<endl;
sno_search(st);
break;
}
case '4':
{
cout<<"您选择了:4.给定某个班级的班号,显示该班所有学生的作业完成情况"<<endl;
cno_search(st);
break;
}
case '5':
{
cout<<"您选择了:5.给定某位学生的学号,修改该学生的作业完成信息"<<endl;
sno_change(st);
break;
}
case '6':
{
cout<<"您选择了:6.给定某位学生的学号,删除该学生的信息"<<endl;
sno_delete(st);
break;
}
case '7':
{
cout<<"您选择了:7.显示各类统计信息"<<endl;
statistics_result(st);
break;
}
case '8':
{
cout<<"您选择了:8.清屏"<<endl;
system("CLS");
Printf_help();
break;
}
case '9':
{
cout<<"您选择了:9.导出文件"<<endl;
creat_files(st,fp);
Printf_help();
break;
}
default:
{
cout<<"非法输入,请重新选择!"<<endl;
Printf_help();
break;
}
}
}
if(a=='0')
{
cout<<"您选择了:0.退出系统"<<endl;
cout<<"退出系统时需要导出文件,否则之前操作无效!"<<endl;
cout<<"按q返回,其它任意键继续"<<endl;
clear();
if((ch=getchar())=='q')
{
clear();
}
cout<<" ┄谢谢使用┄ "<<endl;
}
return 0;
}
|