时间:2023-08-29 09:20:00
引言:寻求写作上的突破?我们特意为您精选了4篇信息工程管理专业范文,希望这些范文能够成为您写作时的参考,帮助您的文章更加丰富和深入。
课程名称: C 程 序 设 计 课题名称: 职工信息管理 班 级: 计算机学院1507班 完 成 人: 姓名(学号) 指导教师: 李珊
湖南理工学院计算机学院
2016年6月27日
一、 设计要求与功能分析
定义菜单函数,主要源代码 void menu() /*菜单函数*/ {
printf(" \n"); printf("\n"); printf("\n");
printf(" ******************职工信息管理****************\n"); printf(" 1. 录入职工信息"); printf(" 2. 浏览职工信息\n"); printf(" 3. 查询职工信息"); printf(" 4. 删除职工信息\n"); printf(" 5. 添加职工信息"); printf(" 6. 修改职工信息\n"); printf(" 7. 查询排序\n"); printf(" 8. 退出\n");
printf(" ********************谢谢使用******************\n"); printf("\n"); printf("\n"); }
二、 总体设计
输出1到7数字可进入执行不同的功能的函数,并在执行结束后返回主页面
流程图
三、 详细设计与程序实现
职工输入功能:主要功能完成职工信息的输入,主要程序
void input() /*录入函数*/ {
int i,m;
printf("请输入需要创建信息的职工人数(1--100):\n"); scanf("%d",&m); for (i=0;i
printf("职工号: "); srand((int)time(0));
em[i].num=rand()%10000+20000000; if(em[i].num!=em[i-1].num) printf("%8d ",em[i].num); printf("\n");
printf("请输入姓名: "); scanf("%s",em[i].name); getchar();
printf("请输入性别(f--女 m--男): "); scanf("%c",&em[i].sex); printf("请输入年龄: "); scanf("%d",&em[i].age); printf("请输入学历: "); scanf("%s",em[i].xueli); printf("请输入工资: "); scanf("%d",&em[i].wage); printf("请输入住址: "); scanf("%s",em[i].addr);
printf("请输入电话: "); scanf("%d",&em[i].tel); printf("\n"); }
printf("\n创建完毕!\n"); save(m); }
void save(int m) /*保存文件函数*/ { int i; FILE*fp;
if ((fp=fopen("employee_list","wb"))==NULL) {
/*创建文件并判断是否能打开*/
printf ("cannot open file\n"); exit(0); }
for (i=0;i
int load() /*导入函数*/ {
FILE*fp; int i=0;
if((fp=fopen("employee_list","rb"))==NULL) {
printf ("cannot open file\n"); exit(0); } else { do {
fread(&em[i],sizeof(struct employee),1,fp); i++; }
while(feof(fp)==0); }
fclose(fp); return(i-1); }
截图如下
浏览职工信息:主要功能读取职工信息,主要代码 void display() /*浏览函数*/ { int i;
int m=load();
printf("\n 职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话 \n"); for(i=0;i
printf("\n %d\t%s\t%c\t%d\t%s\t%d\t%s\t%ld\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].addr,em[i].tel); } 截图
查询职工信息:主要代码
void search()/*查询函数*/ {
int t,flag; do {
printf("\n按职工号查询请按1 ; 按学历查询请按2 ; 按电话号码查询请按3, 进入主函数按4\n"); scanf("%d",&t); if(t>=1&&t
flag=1; peak; } else { flag=0;
printf("您输入有误,请重新选择!"); } }
while(flag==0); while(flag==1) {
switch(t) {
case 1:printf("按职工号查询\n");search_num();peak; case 2:printf("按学历查询\n");search_xueli();peak; case 3:printf("按电话号码查询\n");search_tel();peak; case 4:main();peak; default:peak; } } }
void search_num() {
int num; int i,t;
int m=load();
printf("请输入要查找的职工号(20001111---20009999):\n"); scanf("%d",&num); for(i=0;i
if(num==em[i].num) {
printf("\n已找到此人,其记录为:\n");
printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话 \n");
printf("\n%d\t%s\t%c\t%d\t%s\t%d\t%s\t%ld\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].addr,em[i].tel); peak; }
if(i==m)
printf("\n对不起,查无此人\n"); printf("\n");
printf("返回查询函数请按1, 继续查询职工号请按2\n"); scanf("%d",&t); switch(t) {
case 1:search();peak; case 2: peak; default:peak; } }
void search_xueli()
{
char xueli[30]; int i,t;
int m=load();
printf("请输入要查找的学历:\n"); scanf("%s",xueli); for(i=0;i
if(strcmp(em[i].xueli,xueli)==0) {
printf("\n已找到,其记录为:\n");
printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话 \n");
printf("\n%d\t%s\t%c\t%d\t%s\t%d\t%s\t%ld\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].addr,em[i].tel); }
if(i==m)
printf("\n对不起,查无此人\n"); printf("\n");
printf("返回查询函数请按1, 继续查询学历请按2\n"); scanf("%d",&t); switch(t) {
case 1:search();peak; case 2:peak; default :peak; } }
void search_tel() {
long int tel; int i, t;
int m=load();
printf("请输入要查找的电话号码:\n"); scanf("%ld",&tel); for(i=0;i
printf("\n已找到此人,其记录为:\n");
printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话 \n");
printf("\n%d\t%s\t%c\t%d\t%s\t%d\t%s\t%ld\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wag
e,em[i].addr,em[i].tel);
peak;
}
if(i==m)
printf("\n对不起,查无此人\n");
printf("\n");
printf("返回查询函数请按1, 继续查询电话号码请按2\n");
scanf("%d",&t);
switch(t)
{
case 1:search();peak;
case 2:peak;
default :peak;
}
}
截
图
删除职工信息,主要函数
void del() /*删除函数*/
{
int i,j,n,t,flag;
char name[20];
printf("\n 原来的职工信息:\n");
display(); /* 调用浏览函数*/
printf("\n");
printf("请输入要删除的职工的姓名:\n");
scanf("%s",name);
for(flag=1,i=0;flag&&i
{
if(strcmp(em[i].name,name)==0)
{
printf("\n已找到此人,原始记录为:\n");
printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话 \n");
printf("\n%d\t%s\t%c\t%d\t%s\t%d\t%s\t%ld\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].addr,em[i].tel);
printf("\n确实要删除此人信息请按1, 不删除请按0\n");
scanf("%d",&n);
if(n==1) /*如果删除,则其他的信息都往上移一行*/
{
for(j=i;j
{
strcpy(em[j].name,em[j+1].name);
em[j].num=em[j+1].num;
em[j].sex=em[j+1].sex;
em[j].age=em[j+1].age;
strcpy(em[j].xueli,em[j+1].xueli);
em[j].wage=em[j+1].wage;
strcpy(em[j].addr,em[j+1].addr);
em[j].tel=em[j+1].tel;
}
flag=0;
}
}
}
if(!flag)
m=m-1;
else
printf("\n对不起,查无此人!\n");
printf("\n 浏览删除后的所有职工信息:\n");
save(m); /*调用保存函数*/
display(); /*调用浏览函数*/
printf("\n继续删除请按1,不再删除请按0\n");
switch(t)
{
case 1:del();peak;
case 0:peak;
default :peak;
}
}
截图
添加职工信息,主要代码
void add()/*添加函数*/
{
FILE*fp;
int n;
int count=0;
int i;
int m=load();
printf("\n 原来的职工信息:\n");
display(); /* 调用浏览函数*/
printf("\n");
fp=fopen("emploee_list","a");
printf("请输入想增加的职工数:\n");
for (i=m;i
{
printf("\n 请输入新增加职工的信息:\n");
printf("请输入职工号: ");
srand((int)time(0));
em[i].num=rand()%10000+20000000;
if(em[i].num!=em[i-1].num)
printf("%8d ",em[i].num);
printf("\n");
printf("请输入姓名: ");
scanf("%s",em[i].name);
getchar();
printf("请输入性别(f--女 m--男): ");
scanf("%c",&em[i].sex);
printf("请输入年龄: ");
scanf("%d",&em[i].age);
printf("请输入学历: ");
scanf("%s",em[i].xueli);
printf("请输入工资: ");
scanf("%d",&em[i].wage);
printf("请输入住址: ");
scanf("%s",em[i].addr);
printf("请输入电话: ");
scanf("%d",&em[i].tel);
printf("\n");
count=count+1;
printf("已增加的人数:\n");
printf("%d\n",count);
}
printf("\n添加完毕!\n");
m=m+count;
printf("\n浏览增加后的所有职工信息:\n");
printf("\n");
save(m);
display();
fclose(fp);
}
截图
修改职工信息:主要源代码
void modify() /*修改函数*/
{
int num;
char name[10];
char sex;
int age;
char xueli[30];
int wage;
char addr[30];
long int tel;
int b,c,i,n,t,flag;
int m=load(); /*导入文件内的信息*/
printf("\n 原来的职工信息:\n");
display(); /* 调用浏览函数*/
printf("\n");
printf("请输入要修改的职工的姓名:\n");
scanf("%s",name);
for(flag=1,i=0;flag&&i
{
if(strcmp(em[i].name,name)==0)
{
printf("\n已找到此人,原始记录为:\n");
printf("\n%d\t%s\t%c\t%d\t%s\t%d\t%s\t%ld\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].addr,em[i].tel);
printf("\n确实要修改此人信息请按1 ; 不修改请按0\n");
scanf("%d",&n);
if(n==1)
{
printf("\n需要进行修改的选项\n 1.职工号 2. 姓名 3. 性别 4. 年龄 5. 学历 6. 工资 7. 住址 8. 电话\n");
printf("请输入你想修改的那一项序号:\n");
scanf("%d",&c);
if(c>8||c
printf("\n选择错误,请重新选择!\n");
}
flag=0;
}
}
if(flag==1)
printf("\n对不起,查无此人!\n");
do
{
switch(c) /*因为当找到第i 个职工时,for 语句后i 自加了1, 所以下面的应该把改后的信息赋值给第i-1个人*/
{
case 1:printf("职工号改为: ");
scanf("%d",&num);
em[i-1].num=num;
peak;
case 2:printf("姓名改为: ");
scanf("%s",name);
strcpy(em[i-1].name,name);
peak;
case 3:printf("性别改为: ");
getchar();
scanf("%c",&sex);
em[i-1].sex=sex;
peak;
case 4:printf("年龄改为: ");
scanf("%d",&age);
em[i-1].age=age;
peak;
case 5:printf("学历改为: ");
strcpy(em[i-1].xueli,xueli);
peak;
case 6:printf("工资改为: ");
scanf("%d",wage);
peak;
case 7:printf("住址改为: ");
scanf("%s",addr);
strcpy(em[i-1].addr,addr);
peak;
case 8:printf("电话改为: ");
scanf("%ld",&tel);
em[i-1].tel=tel;
peak;
}
printf("\n");
printf("\n是否确定所修改的信息?\n 是 请按1 ; 不, 重新修改 请按2:
scanf("%d",&b);
}
while(b==2);
printf("\n浏览修改后的所有职工信息:\n");
printf("\n");
save(m);
display();
printf("\n继续修改请按1,不再修改请按0\n");
scanf("%d",&t);
switch(t)
{
case 1:modify();peak;
case 0:peak;
default :peak;
}
}
截\n"); 图
查询排序:主要源代码
void sort(){/*排序*/
int i;
printf("请选择关键字排列:1.工号 2. 年龄 3. 工资 ");
scanf("%d",&i);
while(i3){
printf("输入有误,请重新输入:");
scanf("%d",&i);
}
switch(i)
{
case 1:
sort_num();peak;
case 2:
sort_age();peak;
case 3:
sort_wage();peak;
default:
peak;
}
}
void sort_num()
{
int len,i,j,t,m=load();
for(i=0;i
for(j=1;j
if(em[i].num>em[j].num)
{
t=em[i].num;
em[i].num=em[j].num;
em[j].num=t;
}
display();
getchar();
}
void sort_age()
{
int i,j,t,m=load();
for(i=0;i
for(j=1;j
if(em[i].age>em[j].age)
{
t=em[i].num;
em[i].num=em[j].num;
em[j].num=t;
}
display();
getchar();
}
void sort_wage()
{
int i,j,t,m=load();
for(i=0;i
for(j=1;j
if(em[i].wage>em[j].wage)
{
t=em[i].num;
em[i].num=em[j].num;
em[j].num=t;
}
display();
getchar();
}
截图
退出系统。
四、 收获、体会及意见
心得体会:回顾此次程序设计,感慨良多,虽然对着电脑做程序,有点累也有点热,可是看到劳动成果时,真是别有一翻滋味在心头,世上无难事只怕有心人,的确如此。做完这个课程设计,我们的自信一下子提高了,我们也会写程序了;尽管对于有些人这种程序会很简单,可对我们C 语言初学者来说,已经很不容易了。这次体验为以后的学习计算机的我们增强了信心。享受劳动成果的滋味实在很美妙啊
五、 参考资料索引
【1】谭浩强. C语言程序设计教程[M]. 北京:清华大学出版社,2009年
【2】网上查资料
六、 程序清单
完整程序
#include
#include
#include
#define N 100
struct employee
{
int num;
char name[10];
char sex;
int age;
char xueli[30];
int wage;
char addr[30];
long int tel;
}em[100]; /*定义一个结构体*/
void menu();
void input();
void save(int);
void display();
void del();
void add();
void search();
void search_num();
void search_xueli();
void search_tel();
void sort();
void sort_num();
void sort_wage();
void sort_age();
void modify(); /*定义各函数*/
void menu() /*菜单函数*/
{
printf(" \n");
printf("\n");
printf("\n");
printf(" ******************职工信息管理****************\n");
printf(" 1. 录入职工信息");
printf(" 2. 浏览职工信息\n");
printf(" 3. 查询职工信息");
printf(" 4. 删除职工信息\n");
printf(" 5. 添加职工信息");
printf(" 6. 修改职工信息\n");
printf(" 7. 查询排序\n");
printf(" 8. 退出\n");
printf(" ********************谢谢使用******************\n");
printf("\n");
printf("\n");
}
void main()
{
menu(); /*调用菜单函数*/
int n,flag;
char a;
do
{
printf("请选择你需要操作的步骤(1--8):\n");
scanf("%d",&n);
if(n>=1&&n
{
flag=1;
peak;
}
else
{
flag=0;
printf("您输入有误,请重新选择!");
}
}
while(flag==0);
while(flag==1)
{
switch(n)
{
case 1:printf(" 输入职工信息\n");printf("\n");input();peak; case 2:printf(" 浏览职工信息\n");printf("\n");display();peak;
case 3:printf(" 按职工号查询职工信息\n");printf("\n");search();peak; case 4:printf(" 删除职工信息\n");printf("\n");del();peak;
case 5:printf(" 添加职工信息\n");printf("\n");add();peak;
case 6:printf(" 修改职工信息\n");printf("\n");modify();peak; case 7:
printf(" 查询排序\n");
printf("\n");
sort();
getchar();peak;
case 8:exit(0);peak;
default :peak;
}
getchar();
printf("\n");
printf("是否继续进行(y or n):\n");
scanf("%c",&a);
if(a=="y")
{
flag=1;
system("cls"); /*清屏*/
menu(); /*调用菜单函数*/
printf("请再次选择你需要操作的步骤(1--7):\n");
scanf("%d",&n);
printf("\n");
}
else
exit(0);
}
}
void input() /*录入函数*/
{
int i,m;
printf("请输入需要创建信息的职工人数(1--100):\n");
scanf("%d",&m);
for (i=0;i
{
printf("职工号: ");
srand((int)time(0));
em[i].num=rand()%10000+20000000;
if(em[i].num!=em[i-1].num)
printf("%8d ",em[i].num);
printf("\n");
printf("请输入姓名: ");
scanf("%s",em[i].name);
getchar();
printf("请输入性别(f--女 m--男): ");
scanf("%c",&em[i].sex);
printf("请输入年龄: ");
scanf("%d",&em[i].age);
printf("请输入学历: ");
scanf("%s",em[i].xueli);
printf("请输入工资: ");
scanf("%d",&em[i].wage);
printf("请输入住址: ");
scanf("%s",em[i].addr);
printf("请输入电话: ");
scanf("%d",&em[i].tel);
printf("\n");
}
printf("\n创建完毕!\n");
save(m);
}
void save(int m) /*保存文件函数*/
{
int i;
FILE*fp;
if ((fp=fopen("employee_list","wb"))==NULL) /*创建文件并判断是否能打开*/
{
printf ("cannot open file\n");
exit(0);
}
for (i=0;i
if (fwrite(&em[i],sizeof(struct employee),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
int load() /*导入函数*/
{
FILE*fp;
int i=0;
if((fp=fopen("employee_list","rb"))==NULL)
{
printf ("cannot open file\n");
exit(0);
}
else
{
do
{
fread(&em[i],sizeof(struct employee),1,fp);
i++;
}
while(feof(fp)==0);
}
fclose(fp);
return(i-1);
}
void display() /*浏览函数*/
{
int i;
int m=load();
printf("\n 职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话 \n");
for(i=0;i
printf("\n %d\t%s\t%c\t%d\t%s\t%d\t%s\t%ld\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].addr,em[i].tel);
}
void del() /*删除函数*/
{
int m=load();
int i,j,n,t,flag;
char name[20];
printf("\n 原来的职工信息:\n");
display(); /* 调用浏览函数*/
printf("\n");
printf("请输入要删除的职工的姓名:\n");
scanf("%s",name);
for(flag=1,i=0;flag&&i
{
if(strcmp(em[i].name,name)==0)
{
printf("\n已找到此人,原始记录为:\n");
printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话 \n");
printf("\n%d\t%s\t%c\t%d\t%s\t%d\t%s\t%ld\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].addr,em[i].tel);
printf("\n确实要删除此人信息请按1, 不删除请按0\n");
scanf("%d",&n);
if(n==1) /*如果删除,则其他的信息都往上移一行*/
{
for(j=i;j
{
strcpy(em[j].name,em[j+1].name);
em[j].num=em[j+1].num;
em[j].sex=em[j+1].sex;
em[j].age=em[j+1].age;
strcpy(em[j].xueli,em[j+1].xueli);
em[j].wage=em[j+1].wage;
strcpy(em[j].addr,em[j+1].addr);
em[j].tel=em[j+1].tel;
}
flag=0;
}
}
}
if(!flag)
m=m-1;
else
printf("\n对不起,查无此人!\n");
printf("\n 浏览删除后的所有职工信息:\n");
save(m); /*调用保存函数*/
display(); /*调用浏览函数*/
printf("\n继续删除请按1,不再删除请按0\n");
scanf("%d",&t);
switch(t)
{
case 1:del();peak;
case 0:peak;
default :peak;
}
}
void add()/*添加函数*/
{
FILE*fp;
int n;
int count=0;
int i;
int m=load();
printf("\n 原来的职工信息:\n");
display(); /* 调用浏览函数*/
printf("\n");
fp=fopen("emploee_list","a");
printf("请输入想增加的职工数:\n");
scanf("%d",&n);
for (i=m;i
{
printf("\n 请输入新增加职工的信息:\n");
printf("请输入职工号: ");
srand((int)time(0));
em[i].num=rand()%10000+20000000;
if(em[i].num!=em[i-1].num)
printf("%8d ",em[i].num);
printf("\n");
printf("请输入姓名: ");
scanf("%s",em[i].name);
getchar();
printf("请输入性别(f--女 m--男): ");
scanf("%c",&em[i].sex);
printf("请输入年龄: ");
scanf("%d",&em[i].age);
printf("请输入学历: ");
scanf("%s",em[i].xueli);
printf("请输入工资: ");
scanf("%d",&em[i].wage);
printf("请输入住址: ");
scanf("%s",em[i].addr);
printf("请输入电话: ");
scanf("%d",&em[i].tel);
printf("\n");
count=count+1;
printf("已增加的人数:\n");
printf("%d\n",count);
}
printf("\n添加完毕!\n");
m=m+count;
printf("\n浏览增加后的所有职工信息:\n");
printf("\n");
save(m);
display();
fclose(fp);
}
void search()/*查询函数*/
{
int t,flag;
do
{
printf("\n按职工号查询请按1 ; 按学历查询请按2 ; 按电话号码查询请按3, 进入主函数按4\n");
scanf("%d",&t);
if(t>=1&&t
{
flag=1;
peak;
}
else
{
flag=0;
printf("您输入有误,请重新选择!");
}
}
while(flag==0);
while(flag==1)
{
switch(t)
{
case 1:printf("按职工号查询\n");search_num();peak;
case 2:printf("按学历查询\n");search_xueli();peak;
case 3:printf("按电话号码查询\n");search_tel();peak;
case 4:main();peak;
default:peak;
}
}
}
void search_num()
{
int num;
int i,t;
int m=load();
printf("请输入要查找的职工号(20001111---20009999):\n");
scanf("%d",&num);
for(i=0;i
if(num==em[i].num)
{
printf("\n已找到此人,其记录为:\n");
printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话 \n");
printf("\n%d\t%s\t%c\t%d\t%s\t%d\t%s\t%ld\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].addr,em[i].tel);
peak;
}
if(i==m)
printf("\n对不起,查无此人\n");
printf("\n");
printf("返回查询函数请按1, 继续查询职工号请按2\n");
scanf("%d",&t);
switch(t)
{
case 1:search();peak;
case 2: peak;
default:peak;
}
}
void search_xueli()
{
char xueli[30];
int i,t;
int m=load();
printf("请输入要查找的学历:\n");
scanf("%s",xueli);
for(i=0;i
if(strcmp(em[i].xueli,xueli)==0)
{
printf("\n已找到,其记录为:\n");
printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话 \n");
printf("\n%d\t%s\t%c\t%d\t%s\t%d\t%s\t%ld\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].addr,em[i].tel);
}
if(i==m)
printf("\n对不起,查无此人\n");
printf("\n");
printf("返回查询函数请按1, 继续查询学历请按2\n");
scanf("%d",&t);
switch(t)
{
case 1:search();peak;
case 2:peak;
default :peak;
}
}
void search_tel()
{
long int tel;
int i, t;
int m=load();
printf("请输入要查找的电话号码:\n");
scanf("%ld",&tel);
for(i=0;i
if(tel==em[i].tel)
{
printf("\n已找到此人,其记录为:\n");
printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话 \n");
printf("\n%d\t%s\t%c\t%d\t%s\t%d\t%s\t%ld\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].addr,em[i].tel);
peak;
}
if(i==m)
printf("\n对不起,查无此人\n");
printf("\n");
printf("返回查询函数请按1, 继续查询电话号码请按2\n");
scanf("%d",&t);
switch(t)
{
case 1:search();peak;
case 2:peak;
default :peak;
}
}
void sort(){/*排序*/
int i;
printf("请选择关键字排列:1.工号 2. 年龄 3. 工资 ");
scanf("%d",&i);
while(i3){
printf("输入有误,请重新输入:");
scanf("%d",&i);
}
switch(i)
{
case 1:
sort_num();peak;
case 2:
sort_age();peak;
case 3:
sort_wage();peak;
default:
peak;
}
}
void sort_num()
{
int len,i,j,t,m=load();
// memset((char *)&temp,0,sizeof(em));
for(i=0;i
for(j=1;j
if(em[i].num>em[j].num)
{
t=em[i].num;
em[i].num=em[j].num;
em[j].num=t;
}
display();
getchar();
}
void sort_age()
{
int i,j,t,m=load();
for(i=0;i
for(j=1;j
if(em[i].age>em[j].age)
{
t=em[i].num;
em[i].num=em[j].num;
em[j].num=t;
}
display();
getchar();
}
void sort_wage()
{
int i,j,t,m=load();
for(i=0;i
for(j=1;j
if(em[i].wage>em[j].wage)
{
t=em[i].num;
em[i].num=em[j].num;
em[j].num=t;
}
display();
getchar();
}
void modify() /*修改函数*/
{
int num;
char name[10];
char sex;
int age;
char xueli[30];
int wage;
char addr[30];
long int tel;
int b,c,i,n,t,flag;
int m=load(); /*导入文件内的信息*/
printf("\n 原来的职工信息:\n");
display(); /* 调用浏览函数*/
printf("\n");
printf("请输入要修改的职工的姓名:\n");
scanf("%s",name);
for(flag=1,i=0;flag&&i
{
if(strcmp(em[i].name,name)==0)
{
printf("\n已找到此人,原始记录为:\n");
printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话 \n");
printf("\n%d\t%s\t%c\t%d\t%s\t%d\t%s\t%ld\n",em[i].num,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].addr,em[i].tel);
printf("\n确实要修改此人信息请按1 ; 不修改请按0\n");
scanf("%d",&n);
if(n==1)
{
printf("\n需要进行修改的选项\n 1.职工号 2. 姓名 3. 性别 4. 年龄 5. 学历 6. 工资 7. 住址 8. 电话\n");
printf("请输入你想修改的那一项序号:\n");
scanf("%d",&c);
if(c>8||c
printf("\n选择错误,请重新选择!\n");
}
flag=0;
}
}
if(flag==1)
printf("\n对不起,查无此人!\n");
do
{
switch(c) /*因为当找到第i 个职工时,for 语句后i 自加了1, 所以下面的应该把改后的信息赋值给第i-1个人*/
{
case 1:printf("职工号改为: ");
scanf("%d",&num);
em[i-1].num=num;
peak;
case 2:printf("姓名改为: ");
scanf("%s",name);
strcpy(em[i-1].name,name);
peak;
case 3:printf("性别改为: ");
getchar();
scanf("%c",&sex);
em[i-1].sex=sex;
peak;
case 4:printf("年龄改为: ");
scanf("%d",&age);
em[i-1].age=age;
peak;
case 5:printf("学历改为: ");
scanf("%s",xueli);
strcpy(em[i-1].xueli,xueli);
peak;
case 6:printf("工资改为: ");
scanf("%d",wage);
peak;
case 7:printf("住址改为: ");
scanf("%s",addr);
strcpy(em[i-1].addr,addr);
peak;
case 8:printf("电话改为: ");
scanf("%ld",&tel);
em[i-1].tel=tel;
peak;
}
printf("\n");
printf("\n是否确定所修改的信息?\n 是 请按1 ; 不, 重新修改 请按2: \n");
scanf("%d",&b);
}
while(b==2);
printf("\n浏览修改后的所有职工信息:\n");
printf("\n");
save(m);
display();
printf("\n继续修改请按1,不再修改请按0\n");
scanf("%d",&t);
switch(t)
{
case 1:modify();peak;
case 0:peak;
从系统的角度,管理科学为基础,信息技术及计算机技术优化管理工作。遵从软件工程的原则,开发运行稳定、质量可靠、互动性好的MIS软件系统,配置合适的硬件环境,构建新的管理信息系统,涉及硬件技术、软件技术、网络技术、数据库技术和管理开发过程的项目管理、质量管理和网络技术。
项目管理包括配置管理、质量管理和人力资源管理等。规划阶段进行可行性研究,涉及技术经济学方面的指示,如投资分析。分析阶段,涉及管理信息系统、系统论、管理学、组织行为学等方面的知识;设计阶段涉及管理信息系统、系统论、管理学和通信网络技术;实施阶段涉及软件技术、数据库技术、网络技术和配置管理、测试管理。管理信息系统与其他学科之间的关系如下图所示。
■
二、工商管理类专业管理信息系统课程教学体系
结合管理信息系统课程的理论基础和体系结构,结合现有文献提出的管理信息系统改革方法,提出以下改革建议。根据工商管理类专业的特点,减少MIS开发方法和开发过程所占的比例,添加MIS与企业竞争优势、MIS管理、经管领域MIS应用等知识模块。工商管理类专业MIS理论教学内容主要包括以下四部分:
(一)管理信息系统基础理论篇
1.管理信息系统基本概念:信息、系统、信息系统以及管理信息系统的概念,管理信息系统的发展历程。
2.管理信息系统理论基础:管理理论、信息论、系统论、控制论、行为科学、数学以及运筹学等基础理论学科的把握。
3.管理信息系统的分类:基于管理层次的分类、基于管理职能结构的分类、信息资源的空间分类以及技术架构分类。
4.管理信息系统的系统结构:概念结构、层次结构、功能结构、软件结构和硬件结构。
(二)管理信息系统的开发基础篇
1.管理信息系统的技术基础:计算机硬件系统、计算机软件系统。
2.管理信息系统的开发条件:企业业务流程分析与企业业务改革,领导的支持与参与。
3.系统的开发方法:结构化开发方法、原型法、面向对象的开发方法和计算机辅助工程。
4.数据库技术基础:概念模型、关系模型、概念模型和关系模型的转换、关系模型的规范化。
5.通信与网络:数据通信与计算机网络。
(三)系统开发与管理篇
1.管理信息系统规划:管理信息系统规划的必要性、目标、内容与组织管理,管理信息系统规划模型,系统规划的主要方法。
2.管理信息系统的分析:系统分析的目标、任务及步骤,系统详细调查与分析,新系统逻辑方案的建立。
3.管理信息系统的设计:系统设计的任务与原则,系统功能结构设计、系统配置方案设计、系统流程设计、代码设计、数据库设计。
(四)典型应用篇
1.生产管理信息系统:生产管理系统的发展、物料需求计划、制造资源计划、企业资源计划。
2.决策支持系统:决策支持系统的概述,决策支持系统的发展历程,决策支持系统功能与支持,智能决策支持系统,群体决策支持系统。
3.电子商务:电子商务的概念、分类,电子商务的应用框架,电子商务中的支付,电子商务的安全问题。
三、工商管理类专业管理信息系统课程教学改革建议
课程教学改革尤其是教学内容改革具有必要性和迫切性。一些文献分析了管理信息系统教学中存在的问题,并从不同角度提出了教学改革的措施和方法,如梁妍和王知强针对信息管理系统学科的特点,对管理信息系统的教材、实践教学、教学方法、教师素质等方面进行了改革研究。
关于教学方法已有较多研究,如讨论法、案例法、项目驱动法、自主实验法等。管理信息系统是管理科学、系统科学、应用数学、计算机科学和通讯技术等多学科综合发展起来的边缘学科,它既具有较深和较宽的理论基础,又是一门实践性很强的学科。在教学过程中,应结合学生的特点,在教学内容上避免以纯理论和纯技术的观点描述信息系统,而应将信息技术、管理方法和组织行为有机地结合起来,从管理和应用的角度介绍信息系统。在教学手段上应多采用课堂讨论、案例分析、实际系统调查等加强对信息系统的整体认识,结合上述教学内容提出一种专题讨论和案例启发相结合的教学法。
(一)并非课程全部内容均适合采用这种教学方法,可根据教学实际从上述四部分内容中选取一些作为案例讨论的专题。如管理信息系统对管理的影响,管理信息系统与企业竞争优势、企业信息安全、管理信息系统成败的因果等。
(二)建议对学生分组,如每组4-5人,小组式任务安排可使任务量合理化,学生间团结协作。
(三)针对专题内容,选择有针对性。本土化的新颖案例可由教师指定或由学生小组自行确定。
(四)为保障教学效果,要求学生课前认真准备。
如,讲解管理信息系统成败原因分析这一专题时,安排学生准备企业管理信息系统建设成功或失败的案例。学生分小组准备资料和课后在课堂讨论互动,教师引导和启发学生思考:通过成功案例总结管理信息系统成功的经验有哪些?通过失败案例分析失败的教训是什么?如何准确把握企业信息系统的需求?如何确定信息系统的开发策略?如何分析和选择软件供应商等,最终由教师总结归纳管理信息系统成功的关键因素。这种教学方法注重营造开放、互动的课堂气氛,引导和鼓励学生主动思考,激发学生学习的积极性和能动性,培养信息化环境下自主学习的能力,有助于提高学生的综合素质,培养团结协作精神。
四、结论
如果对于案例教学的方法没有深入的了解和研究,很多人会将案例教学当做是教师讲述理论概念后的故事举例,进而总结结论,再要求学生提交阅读案例的心得,而实际上,案例教学是以具体问题为学习和讨论的焦点,选择贴近现实的问题要求学生分析并提出解决方案的学习过程。在案例教学中,学了什么并不重要,重要的是学生在寻求解决方案的过程中认知能力和解决问题能力得到提升,学生挖掘隐含在案例之内的知识点的过程更是一个深化知识理解和掌握的过程,希望以上的探讨能起到抛砖引玉的作用。
参考文献:
[1]邓三鸿,许鑫,王昊,等.案例教学在管理信息系统课程中的实践探讨[J].现代教育技术,2012(22):120-125.
【中图分类号】G64 【文献标识码】A 【文章编号】2095-3089(2014)04-0131-02
一、引言
信息管理与信息系统专业(下文简称信管专业)起源于20世纪60年代,伴随着管理科学和信息技术的发展逐步兴起。我国信管专业成立于1998年,是一门以现代管理理论为基础,借助先进的计算机和通信技术,对信息进行管理和处理的学科,包含计算机、网络、管理、自动化,经济和财务会计等多种专业知识,具有管理与信息技术相互渗透,知识面广,学科背景复杂等特点。[1]
软件工程通常是计算机科学与技术相关专业的必修课之一,涉及软件开发和维护的基本原理、概念与技术方法,用于培养学生正确的研发理念和良好的研发习惯,提高软件开发效率和产品质量。[2]为了培养信管专业学生的信息系统开发能力,信管专业开设了软件工程课程。
由于信管专业学科跨度大,师资背景和生源结构复杂,教学思想差异较大的影响,软件工程在信管课程体系中的地位存在异议,其教学方法和教学模式亦有诸多不足。文章结合信管专业和软件工程的特点,本着“理性用户培养”[3]的目标,从课程定位、教学方式和方法、教学内容和考核形式等方面分析软件工程的教学现状,提出相应对策。
二、信管专业《软件工程》课程存在的问题
1.课程定位不明确
在信管专业中,软件工程主要指导学生进行管理信息系统的分析、设计、实施及维护,侧重系统的研发和维护的原理和方法。管理信息系统课程则是让学生全面认识管理信息系统,涉及的知识面广,但内容浅显。两者在系统开发和维护部分的内容上存在交集,部分院校因此未将软件工程加入专业培养计划。另外一些院校为强化学生的系统开发能力,将“软件工程”与“信息系统分析与设计”课程同时开设,出现课程重复的现象。这些都是软件工程定位不清晰的结果。
2.课程时间安排不合理
信管专业中的软件工程与诸多信管专业基础课程联系密切,需要较强的专业基础知识,但目前部分院校的课程体系将软件工程与管理学、程序设计等专业基础课程安排在同一学期显然不合适,教学安排缺乏层次性。
3.师资力量存短板
信管专业教授软件工程的教师几乎都毕业于计算机专业,不仅缺乏管理学相关知识且在教学思想上沿袭了理工科的风格,偏重程序研发流程,忽略管理信息系统开发过程的多学科交叉特点,导致学生把管理信息系统等同于一般的计算机软件,使得学生对管理信息系统的内涵认识不足,甚至产生误解。此外,大多数教师并没有实际参与大型管理信息系统项目的开发,缺乏实际的研发经验,故难以全面、深入地介绍管理信息系统研发过程和特点。
4.适用教材缺乏
一方面现有信管专业软件工程的教材大都沿用自计算机专业,着重从理论方面介绍各种经典分析和设计方法,所选案例也缺乏与管理学等其他相关学科结合,且很少结合最新的设计方法和工具进行介绍。这种教材选择方式难以和信管专业内的其他课程有机结合,自身形成知识孤岛,无法体现信管专业管理为主、计算机为辅,多学科交叉的特点,同时也不能反映信管专业与计算机专业的本质区别。
5.教学方法古板,实践不足
软件工程的教学内容多为以往研发经验的概括和总结,知识点多以各种概念、原则、规则和要点等形式出现,缺乏完整案例,内容抽象晦涩,教师多采用单向注入和强行灌输的教学方式,不利学生的理解和应用。此外,信管专业课程体系庞杂,无法为软件工程分配足够的实践课时。其他系统开发相关课程,或因项目过小而无需使用软件工程思想,或因课时限制而侧重系统的实现和测试方面。这些问题导致软件工程思想难以完全付诸实践,使学生缺乏系统性和全面性的训练。
6.学生评价机制不合理
成绩评定是评估学生学习效果的重要依据,也是反映教师教学能力的参考指标。本校统一采用“平时表现+期末笔试”的考核机制,比例为3:7。其中,平时表现包含期中考试成绩、日常考勤、课后作业和实验成绩等。这种成绩评定机制存在诸多问题:(1)期末考试比例过大,不能全面客观反映学生的表现。(2)闭卷理论笔试不利于扩展学生的知识面,难以考查知识的实际综合运用能力。(3)笔试为主的考核机制容易诱使学生产生应试教育的倾向。
三、《软件工程》课程教学的若干对策
针对信管专业软件工程课程的问题,结合本校教师的教学经验提出相关的应对措施。
1.明晰教学定位
“信息管理与信息系统专业”(以下简称为“信管专业”)是“管理科学与工程”的下属二级学科,其核心课程体系无论在教学内容还是在教学方法上,都带有非常明显的工程性特点,但在目前的教学实践中存在着学生积极性不高、教师教学能动性不足、教学水平不尽如人意、教学效果和教学质量不高等问题。
CDIO工程教育模式是近年来国际工程教育改革的最新成果,是由麻省理工学院等4所国际一流工科大学发起并创立的、我国教育部大力倡导的先进工程教育模式。目前,汕头大学走在工程教育改革的最前沿,提出了EIP-CDIO工程教育理念。文献[4]针对中国学生的特点,提出了基于兴趣和自主的CDIO教学模型IACDIO。文献[5]把CDIO人才培养理念引入到课程建设中,提出了基于CDIO的“软件工程”课程建设方案。
CDIO代表构思(coneeive)、设计(Design)、实现(Implement)、运作(Operate)。CDIO工程教育模式倡导工程教育应该以项目的CDIO全过程为载体,将实践与课程有机地联系在一起。通过项目的研发过程,使学生掌握工程基础知识,提高个人能力、人际团队能力和工程系统的适应与调控能力。在“如何培养人”方面,CDIO采用了建构主义教育理论,并通过CDIO的12条标准指引工程教育的实施方法,这12条标准从基本理念(标准1:背景环境)、培养目标(标准2:学习效果)、课程体系(标准3:一体化课程体系;标准4:工程导论;标准5:设计实现经验;标准7:一体化学习经验)、自主学习模式构建(标准8:主动学习)、师资与环境保障(标准9:教师工程能力;标准10:教师教学能力;标准6:工程实践场所)和考核与评估(标准11:学生考核;标准12:专业评估)等各个方面指导工程教育的实践,围绕培养目标一体化而实现工程教育的培养目标。
针对信管专业工程类课程群教学中存在的问题,我们分析了信管专业的工程性特点,并基于CDIO的12条标准,从培养目标、课程群组织架构、自主学习培养模式和学习考核体系等4个方面提出信管专业工程类课程群建设方案。
1.信管专业的工程性特点
信息系统是实施信息管理的基石,信息系统的开发与设计是信管专业知识架构的核心,而信息系统的开发与设计所采用的方法学和过程都借鉴了工程化思想,即要以工程理论、原理、方法和技术来指导信息系统的分析与设计过程,因而使得信管专业的人才培养体系带有一定的工程性特点。
在培养目标上,信管专业所培养的人才应该具有工程人才的知识和能力。实际上,信管专业毕业生就业后所从事的也多是信息管理工程师、软件开发工程师、软件实施工程师、软件测试工程师等工程类职业。
在教学内容上,信息系统的分析与设计是信管专业知识架构的核心,其相关课程与实验、相关课程设计构成了信管专业工程类课程群。如表1所示是信管专业工程类课程群主干课程,显示了各课程及其在信管专业人才培养中的作用和定位。其中,“软件工程”是整个课程群的核心,它提供信息系统的分析与设计的方法论,也就是说要以工程理论、原理、方法和技术来指导信息系统的分析与设计过程。
2.工程类课程群培养目标
不同的地区性产业,不同的学生生源,决定着教学手段的差异性。经统计,我们发现中南民族大学有三成左右的生源来自少数民族地区,基础相对薄弱,导致学生在文化背景、基础知识、创新意识、各种能力素养等诸多方面存在很大差异。因此,中南民族大学信管专业的定位应当与生源状况相适应,在教学方法与手段等方面增加更多的基础训练环节。
根据CDIO大纲以及CDIO标准2,同时考虑工程师应具备的各种能力和职业素养,信管专业工程类课程群的培养目标是讲授信管专业工程类课程群的相关知识,以工程实践为教育的内容和背景环境,使学生熟练掌握现代信息技术手段和信息管理与信息系统的理论、方法;培养学生的工程价值观,使其具备工程技术能力、基本的工程创新能力、工程师职业道德、团队工作和人际交往能力;培养达到CDIO大纲要求,能够从事信息管理以及信息系统规划、分析、设计、实施与管理工作的高级工程人才。
3.工程类课程群组织架构
依据CDIO标准3、4、5和7,以工程实践作为工程教育的内容和背景环境,增加实践、实习和操作训练,以指定项目或自选项目组织教学,让学生在“做中学”,将信管专业工程类课程群构建成一个图1所示的鱼骨型的阶梯递进式组织架构。
阶梯递进式组织架构分为结构化信息系统分析与设计、面向对象信息系统分析与设计以及毕业设计3个阶段。其中,第一阶段采用结构化系统分析与设计方法,把算法(“C语言”与“数据结构”)和数据(“软件工程”与“数据库原理与应用”)组织起来,进行课程传授和实训;第二阶段,按照面向对象方法,使用JAVA、JSP语言和UML,传授面向对象的信息系统分析与设计方法,并进行相关实训;第三阶段是在前两个阶段的基础上,引入“IT项目管理”知识,提供实训平台,让学生自主创新完成毕业设计。
在实验、实习与操作训练的组织形式上,按照“课程内实验课程设计综合设计”的阶梯递进方式,从左至右按时间顺序组织相关教学内容(标准3),使学生通过图1的阶梯递进式组织架构中的3个递进阶段的学习任务,完成3个级别的设计实现训练(标准5),使其获得一体化学习经验(标准7)。其中,“课程内实验”提供基础级实现验证训练;其后进阶为“课程设计”,综合基本方法和工具,提供进阶级课程设计训练;最后,进一步上升为“综合设计”,分阶段递进式提供3个阶梯的系统分析与设计训练。另外,“计算机组成原理”等专业基础课程主要为信息系统的分析与设计训练提供计算机基础知识支撑,但不提供设计实现训练,在图1中用虚线框标注。
3.1基础级实现验证训练
3.1.1教学方法
课程教学以课堂形式展开。课内实验以指定的典型案例为依托,让学生以个人为单位,指定技术手段,完成指定内容的验证与实现。实现验证训练成绩由任课老师根据学生的完成情况进行审定,并计人课程最终考核成绩,一般所占比例为20%-30%。
3.1.2内容组织
为进一步夯实基础,在表1中除专业基础类课程外,其他课程均需组织课内实验,以保障充分的实现验证训练。特别值得一提的是,为更好地培养学生的工程能力和工程师职业道德,在“软件工程”课程教学中,按照CDIO标准4,特别引入了“工程概论”的知识内容。
3.2进阶级课程设计训练
3.2.1教学方法
1)教学组织。
以二级团队为单位,2-3人一组,按照二级团队自主学习培养模式(见4.1节),在指导老师的指导下,利用2-3周左右的集中时间,完成课程设计。
2)指导团队。
由一名指导老师和2-3名助教构成指导团队,指导所有的二级团队。
3)设计选题。
课程设计选题应该是操作性很强、复杂程度不高的设计类题目,大多数是由指导老师指定,亦可由学生团队自选,但自选题的可操作性和复杂程度需由指导老师论证。
4)所用技术。
课程设计的技术手段由指导老师根据课程指定。
5)成绩评定。
按照二级团队成绩评定方法(见4.1节),由指导老师和学生共同评定成绩。
3.2.2内容组织
进阶级课程设计主要包括“数据结构课程设计”、“数据库课程设计”和“JSP课程设计”,即图1中的中心水平线上方的课程设计。其中,“数据结构课程设计”要求使用“c语言”组织相关的数据结构,进行诸如DES加密算法、大数四则运算等中等难度算法的实现训练,以帮助学生熟悉C语言,完成算法的实现与优化。“数据库课程设计”要求按照软件生命周期的流程,完成指定的诸如校园图书馆、超市等环境相对熟悉的案例的数据库设计与实现。“JSP课程设计”则要求使用JAVA和JSP语言,采用面向对象方法学,完成与“数据库课程设计”相同案例的设计与实现工作,以帮助学生熟悉JAVA和JSP语言,掌握面向对象方法学。通常,同一个二级团队的“数据库课程设计”的选题要与“JSP课程设计”的选题相同,这样,两个课程设计完成之后,所得的数据库和JSP程序就可以集成为一个相对完善的信息系统。
3.3综合级系统分析与设计训练
3.3.1教学方法
1)教学组织。
以一级团队为单位,4~6人一组,按照一级团队自主学习培养模式(见4.2节),在指导老师的指导下,完成项目开发任务。
2)指导团队。
1-2个一级团队配备一位指导老师。
3)设计选题。
课程设计选题应该是操作性较强、中等复杂程度的分析与设计类题目,大多由学生团队自选,但自选题的可操作性和复杂程度需由指导老师论证。
4)所用技术。
课程设计所用的技术由指导老师根据课程指定,或由学生自选。
5)成绩评定。
成绩按照一级团队成绩评定方法(见4.2节)由指导老师组共同评定。
3.3.2内容组织
综合级系统分析与设计训练主要包括“结构化信息系统分析与设计”、“面向对象信息系统分析与设计”和“毕业设计”3个阶段,均串联在图1的中心水平线中。其中,“结构化信息系统分析与设计”要求学生自选题目,按照结构化信息系统分析与设计的流程,让学生在6-10周左右的时间内,完成中等复杂度的信息系统的分析与设计。如果条件允许,学生(优秀学生)可自选语言实现该系统。“面向对象信息系统分析与设计”要求学生自选题目(自选题可与“结构化信息系统分析与设计”的选题相同),依托面向对象方法,按照面向对象分析与设计的流程,使用JSP语言,或自选语言形式,让学生在6-10周左右的时间内,完成中等复杂度的信息系统的分析、设计、实现与测试任务。而“毕业设计”则要求在指导老师的指导下,学生自选题(需经过老师论证,也可由老师指定选题),自选信息系统分析与设计的方法和技术手段,在15周左右的时间内,完成复杂度较高的信息系统的分析、设计、实现与测试任务。通常,在“毕业设计”环节,每一个选题可考虑组内配备1-2名学生负责完成所选题的项目管理工作。
4.自主学习培养与考核
针对图l所示的课程群组织架构,我们按照CDIO教学大纲和CDIO标准8与标准11,构建阶梯式自主学习培养与考核模式。考核小组由指导教师团队与学生评审团组成。该培养与考核模式也相应分为3个级别:基础级、二级团队级、一级团队级培养与考核模式。其中,基础级培养与考核模式依托课程群,主要在课程讲授和基础级实现验证训练中体现。学生以个体为单位,接受老师的课堂传授,配以课堂作业、实现验证训练以及学生课堂汇报环节,辅以多种形式的答疑,培养学生解决问题的能力。基础级培养与考核模式基本基于日常教学,操作形式相对简单,在此不予赘述。
4.1二级团队级培养与考核模式
4.1.1自主学习培养模式
二级团队面对的是操作性强且复杂程度不高的训练任务,因此在进阶级课程设计训练的实际流程中,引入敏捷开发、极限编程以及测试驱动开发等概念,相对精简地组织二级团队的自主学习培养模式。
二级团队的任务不进行分工,所有工作任务均由小组成员共同完成。团队成员在任务期内共同作息、共同讨论、共同接受老师的指导、共同解决问题,以培养学生的工程协作能力、团队工作能力和人际交往能力。
为帮助二级团队按时完成工作任务,指导老师在任务期内,每天均需与所指导的团队碰面,以帮助成员解决实际工作中出现的问题。所谓“授之以鱼不如授之以渔”,在答疑过程中,指导教师不要求直接回答二级团队的疑问,但要求指导解决问题的方法和途径,让学生自己掌握“渔”的方法。针对典型问题,在问题解决后,我们组织相关二级团队进行现场展示,并由他们回答其他二级团队的问题。通常,二级团队的现场展示每两天进行一次。
4.1.2学习考核模式
由学生自行推选优秀学生组成学生评审团,学生评审团人数通常占学生总人数的10%。二级团队完成工作任务后,组织答辩会,由团队成员介绍项目完成情况,由指导老师和学生评审团共同进行评审。最终评审成绩由指导老师评定成绩(60%)和学生评审团的平均成绩(40%)加权平均获得。
二级团队的考核主要从知识掌握程度(涵盖原理与方法掌握程度、语言熟悉程度和工具熟悉程度等)、课程设计成果(包括实现的程序以及分析、设计、实现和测试过程中的相关文档)、个人贡献与能力(涵盖工程技术能力、工程师职业道德团队、团队工作和人际交往能力)等多个方位全面考核学生的学习成果。
4.2一级团队级自主学习培养与学习考核
4.2.1自主学习培养模式
一级团队面对复杂程度较高的实际项目任务。在项目的实施过程中,应用整合与划分,即“分为治之,合而击之”的团队协作思想,由学生在团队内分化项目任务,由学生自主控制项目过程,完成团队任务及答辩。
一级团队项目开发与过程控制的主体均是学生团队,教师只负责监督、指导与答疑。在项目开发过程中,主要由学生团队自行分解项目任务、组织项目开发过程、进行项目进度控制与管理、完成项目任务。
为了保证项目任务的有效完成,在项目开发过程中,我们借鉴《高效能人士的七个习惯》中的思想,以周为时间管理的基本单元,要求一级团队每一位成员每周周末向指导老师提交周报和下周计划,并在本周周末或下周周一由指导老师主持召开周例会,实时监督项目的完成情况。其中,周报是项目成员完成本周工作任务后的总结性文档,要求与上周计划对应,主要包括每个工作日的工作进展、学习情况以及有待解决的关键问题。周计划是项目成员展开下周工作的纲领性文档,周计划的制订要兼顾本周项目任务的完成情况和项目的总体计划,以便于解决本周存在的问题,推进项目进度。周例会是每周指导老师与学生的碰头讨论会。在会上,项目组成员介绍本周的工作任务完成情况和下周计划,并在指导老师的主持下,针对项目成员所遇到的问题及下周计划展开讨论,以给出解决方案或合理化建议。
此外,为进一步帮助学生及时完成项目任务,指导团队建立“一周一讲”机制,通常在周中进行。在项目初期,“一周一讲”主要由指导老师主讲,介绍项目开发的相关方法、语言、工具以及典型问题的解决方法;项目中后期,则主要由一级团队的项目成员主讲,介绍其近期所学到的新知识、所遇到的问题及解决方案。这样,既可以帮助项目组成员互通有无,拓展知识面,使其学得更多,学得更快,也可以提高项目组成员的团队工作和人际交往能力。
4.2.2学习考核模式
由全体指导老师一起组成评审团。一级团队完成工作任务后,组织个人答辩会,每个成员在会上独自介绍项目完成情况,由指导教师评审团进行评审。最终评审成绩由该一级团队指导老师和其他指导老师的成绩加权平均获得,其权重分别为70%和30%。