程序设计训练
姓 名
学 号
专 业 通信工程
班 级 164
指导教师
编写日期 2018.6.28
程序设计训练任务书
一、实习的任务、性质与目的
程序设计训练是集中实践性环节之一,是学习完程序设计基础(C)、数据结构、面向对象(C++)、数据库等程序类课程后进行的一次综合训练。主要训练基本数据结构和算法的程序实现,学习编写中、大型程序(500行以上)的过程和步骤,学习程序的调试技巧和方法,从而能用C/C++语言程序来解决一般实际问题,如各种简单的信息管理系统和趣味小游戏等。
通过该实习,使学生理解和掌握程序设计的过程和步骤,学会基本程序调试技巧和方法,加强学生自主学习、收集资料和动手编程 的能力。
二、实习时间
第四学期的第16周和第17周
三、实习地点
计算中心210室
一.基础部分
总结1数字的交换三种方式:数值传递,地址传递,引用传递,三者做了一个比较,数值传递本身没有对原交换数字进交换,2.线段问题对于我而言是一个比较费时的,上网百度了一下,因为它包含的头文件也比较多,要熟悉这些头文件的作用,然后调用其头文件里的函数,主要用到了cmp比较函数和排序函数,算法的核心是利用排序函数先将每行的所有数进行排序,然后用比较函数,和for与if进行组合给个计数器作为输出值。3.猴子称大王,这个数组比较简单难点也就是这个
while(remain>=num)
{
for(i=0; i<num; i++)
{
k = j;
j=(j+1)%amo;
while( per[j]>0 )j=(j+1)%amo;
}
链表中用到了链表的基本操作,建立个循环链表
4.冒泡排序:就是用到了两层for循环,像个泡泡一样的去遍历
5字符串问题:定义2个变量p,tmp,tmp一个放目前正在统计次数的字符,p放刚刚读入的字符,还要定义一个count统计当前字符出现的次数,如果tmp == p, 那么说明又读进来一个同样的字符,那么这个字符出现的次数count++,如果tmp!=p, 那么说明读进来一个新的字符,需要把原来tmp和count输出,然后把tmp置为p,count=1,开始统计p里面的字符出现的次数
6.哈希表是一个比较难的;
哈希表是根据关键码而直接进行访问的数据结构,也就是说,通过关键码值映射到表中一个位置来访问记录,以加快查找的速度,本实验哈希函数用除留余数法构造,用伪随机探测散列处理冲突数据结构设计
7.继承就是简单的几个继承的区分,本实验注意的是构造函数的继承
如何区分构造函数,最主要的区别看看函数构造名是否与类的名称是否一致,一致的话就是构造函数
总结一下个人基础部分的整体思路:模块化。分三块,输入。输出及算法部分,算法部分灵活的运用几大结构,最后做完整个基础部分,我感觉到了面向对象的重要性,框架的搭建还是横重要的
(每道题的解决思路,程序实现代码,并说明遇到的问题及解决方法、过程。)
1、a、b交换与比较
如何将a、b的值进行交换,使用中间变量?基本要求如下:(1)编写一个交换函数,在主函数中调用。(2)分别使用三种函数参数传递:指针传递(地址传递)、引用传递。
源代码
#include<iostream>
using namespace std;
void Exchg1(int x, int y)// 值传递
{
int tmp;
tmp=x;
x=y;
y=tmp;
cout<<"x="<<x<<"y ="<<y<<endl;
}
void Exchg2(int *px, int *py)//地址传递
{
int tmp=*px;
*px=*py;
*py=tmp;
cout<<"*px="<<*px<<"*py="<<*py<<endl;
}
void Exchg3(int &x, int &y)//引用传递
{
int tmp=x;
x=y;
y=tmp;
cout<<"&x="<<x<<"&y="<<y<<endl;
}
main()
{
int a=4;int b=6;
Exchg1(a,b);//传递的a,b的内容
cout<<"a="<<a<<"b="<<b<<endl;
a=4;b=6;
Exchg2(&a,&b);//a,b的地址值传递给了px,py
cout<<"a="<<a<<"b="<<b<<endl;
a=4; b=6;
Exchg3(a,b);//函数里是用a,b分别代替了x,y。函数里操作的是a,b
cout<<"a="<<a<<"b="<<b<<endl;
}
2、线段问题
问题描述:
现在有n个围棋比赛,每个比赛的开始、结束的时间点是知道的。小明认为,参加越多的比赛,水平就能提高的越快。所以,他想知道他最多能参加几个比赛。 如果要参加一个比赛必须善始善终,而且不能同时参加2个及以上的比赛。
输入输出格式
输入格式:
第一行是一个整数n ,接下来n行每行是2个正整数ai,bi(ai<bi),表示比赛开始、结束的时间。
输出格式:
一个整数最多参加的比赛数目。
样例:输入样例:
3
0 2
2 4
1 3
源代码:
#include <cstring>
#include <iostream>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iomanip>
#include <vector>
#include <algorithm>//sort 排序函数头文件
typedef struct {//结构体定义
int start;
int end;
} Match;
const int maxn = 1000010;//常数指针类型
Match matches[maxn];
int cmp(Match m1, Match m2) {
return m1.end < m2.end;
}//cmp是一个函数,可以向其传入两个任意类型变量的地址或指针,但不管传入什么类型,函数内部将该指针转换为int类型
//,也就是说将s所指向的地址上4个字节的数据转换为int型数,t同理,然后将这两个数相减,作为结果返回。
using namespace std;
int main() {
int n;int i;
scanf("%d", &n);//输入n行
for( i = 0; i < n; i++) {
scanf("%d%d", &matches[i].start, &matches[i].end);
//mp是你自己定义的 sort是按从小到大的顺序排序的,如果你要从大到小,就要重载 int cmp(int x,int y){ return x>y; }
}
sort(matches, matches + n, cmp);
int end = -1;
int cnt = 0;
for( i = 0; i < n; i++) {
if(matches[i].start >= end) {
end = matches[i].end;
cnt++;
}
}
printf("%d", cnt);//cnt相当于计数器
return 0;
}
2、猴子选大王问题(约瑟夫问题)
问题描述:
一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
基本要求:
(1) 输入数据:输入m,n m,n 为整数,n<m
(2)中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号 ,建立一个函数来实现此功能
(3)分别用数组和链表来实现
源代码
数组:
#include<stdio.h>
int main()
{
int per[100]= {0};
int num=0,amo=0;
int i=0,remain=0,j=0;
printf("输入猴子数:");
scanf("%d",&amo);
printf("输入每次数几个猴子:");
scanf("%d",&num);
remain=amo;
j=0;
int k=0;
while(remain>=num)//循环条件猴子数不小于每次数几个猴子
{
for(i=0; i<num; i++)//小于每次数的猴子数
{
k = j;
j=(j+1)%amo;
while( per[j]>0 )j=(j+1)%amo;
}
printf("%d was leaveed.\n",k+1);
per[k] = 1;//重新开始数数
remain--;
}
for (i=0; i<amo; i++)
{
if (0 == per[i])
{
printf("最后的猴子大王%d\n", i+1);
}
}
return 0;
}
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define maxsize 10
typedef int status;
typedef int elemtype;
typedef struct node{
elemtype num;
struct node * next;
}node;
typedef struct node* linklist;
int main(void){
linklist p,q,head;
int m,n,king,i,j;
scanf("%d %d",&m,&n);
if(m==1)//只有一只猴子时猴王为1
king=1;
p=q=(linklist)malloc(sizeof(node));//给新节点分配空间
head=p;//head指向首元素节点
head->num=1;//给第一只猴子编号
for(i=1;i<m;i++){//建立m只猴子围成的圆圈
p=(linklist)malloc(sizeof(node));//p为等待插入的节点
p->num=i+1;//p的编号为i+1
q->next=p;//q始终记录尾节点(实质是链表的尾插法)
q=p;
}
q->next=head;//链表尾指向链表头
p=head;//开始计数
for(i=1;i<m;i++){//循环m-1轮,淘汰m-1只猴子
for(j=1;j<n-1;j++){//让p指向要淘汰的元素的前驱元素
p=p->next;
}
q=p->next;//q指向要淘汰的猴子
printf("第%d轮淘汰第%d只猴子\n",i,q->num);
p->next=q->next;//删除q
p=q->next;//一定要让下一次计数起点为被删除元素的后继
free(q);//释放q
}
king=p->num;
free(p);
printf("猴王是第%d\n",king);
}
3、排序问题
请用C或C++写出一个冒泡排序程序,要求输入10个整数,输出排序结果。
源代码:
(1)、比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。
(2)、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大(小)的数。
(3)、针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序)。
(4)、持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序
#include<stdio.h>
void bubblesort(int *list)
{
int i,j,temp;
for(i=0;i<9;i++) //外层循环控制趟数,总趟数为9
{
for(j=0;j<9-i;j++) //内层循环为当前j趟数 所需要比较的次数
{
if(list[j]>list[j+1])
{
temp=list[j];
list[j]=list[j+1];
list[j+1]=temp;
}
}
}
for(i=0;i<10;i++)
{
printf("%5d",list[i]);
}
printf("\n");
}
int main()
{
int list[10];
int i;
printf("请输入数列:");
for(i=0;i<10;i++)
scanf("%d",&list[i]);
printf("冒泡排序后的数列:\n");
bubblesort(list);
return 0;
}
4、字符串问题
转换字符串格式为原来字符串里的字符+该字符连续出现的个数,例如字符串1233422222,转化为1121324125(1出现1次,2出现1次,3出现2次……)。
#include<iostream>
using namespace std;
int main()
{
char str[50];
char tmp;
int count = 0;
cin>>str;
char *p = str;
tmp = *p;
count++;
while(*(++p)!='\0')
{
if(*p == tmp)//如果当前读入的字符和正在统计的一样,那么出现次数要++
{
count++;
continue;
}
cout<<tmp<<count;//如果读入一个新的字符,就要把正在统计的字符频率输出,接下来开始统计新读入的字符的出现次数
tmp = *p;
count = 1;
}
cout<<tmp<<count;//因为读到'\0'循环退出,最后一个连续的字符序列没有输出,所以在这里追加输出
getchar();
getchar();
return 0;
}
5、hash表
问题描述:
针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。
基本要求:
假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用伪随机探测再散列发处理冲突。
源代码
#include<iostream>
#include<string>
using namespace std;
#define HASH_LENGTH 50 //哈希表的长度
#define M 47 //随机数
#define NAME_NO 30 //人名的个数
typedef struct
{ char *py; //名字的拼音
int k; //拼音所对应的整数
}NAME;
NAME NameList[HASH_LENGTH]; //全局变量NAME
typedef struct //哈希表
{ char *py; //名字的拼音
int k; //拼音所对应的整数
int si; //查找长度
}HASH;
HASH HashList[HASH_LENGTH]; //全局变量HASH
void InitNameList() //姓名(结构体数组)初始化
{ char *f;
int r,s0,i;
for (i=0; i<HASH_LENGTH; i++)
{
NameList[i].py = new char[64];
NameList[i].py[0] = 0;
}
strcpy(NameList[0].py, "zhangwenwu");
strcpy(NameList[1].py, "daining");
strcpy(NameList[2].py, "tanyuxuan");
strcpy(NameList[3].py, "ciyingjuan");
strcpy(NameList[4].py, "xuxin");
strcpy(NameList[5].py, "fuyuzhang");
strcpy(NameList[6].py, "lvjingfan");
strcpy(NameList[7].py, "yaojianxin");
strcpy(NameList[8].py, "hukeke");
strcpy(NameList[9].py, "wangjianxin");
strcpy(NameList[10].py, "zhaoleyi");
strcpy(NameList[11].py, "wenqing");
strcpy(NameList[12].py, "chenghuiming");
strcpy(NameList[13].py, "xujing");
strcpy(NameList[14].py, "zhuyilin");
strcpy(NameList[15].py, "liuxin");
strcpy(NameList[16].py, "chenhe");
strcpy(NameList[17].py, "zhaomaojun");
strcpy(NameList[18].py, "weiyingjian");
strcpy(NameList[19].py, "wangmin");
strcpy(NameList[20].py, "zhangkai");
strcpy(NameList[21].py, "liujingrui");
strcpy(NameList[22].py, "wangjimei");
strcpy(NameList[23].py, "mafenjie");
strcpy(NameList[24].py, "mayuxue");
strcpy(NameList[25].py, "dinghanxue");
strcpy(NameList[26].py, "wangqichang");
strcpy(NameList[27].py, "wangwentao");
strcpy(NameList[28].py, "liulijun");
strcpy(NameList[29].py, "lixiaoxia");
for(i=0;i<NAME_NO;i++)
{
s0=0;
f=NameList[i].py;
for(r=0;*(f+r)!='\0';r++)
/* 方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字*/
s0=*(f+r)+s0;
NameList[i].k=s0;
}
}
void CreateHashList() //建立哈希表
{
int i;
for(i=0; i<HASH_LENGTH;i++)
{
HashList[i].py=new char[64];
HashList[i].py[0] = 0;
HashList[i].k=0;
HashList[i].si=0;
}
for(i=0;i<HASH_LENGTH;i++)
{
int sum=0;
int adr=(NameList[i].k)%M;
//哈希函数
int d=adr;
if(HashList[adr].si==0) //如果不冲突
{
HashList[adr].k=NameList[i].k;
HashList[adr].py=NameList[i].py;
HashList[adr].si=1;
}
else //冲突
{
while (HashList[d].k!=0)
{
d=(d+NameList[i].k%10+1)%M; //伪随机探测再散列法处理冲突
sum=sum+1; //查找次数加1
};
HashList[d].k=NameList[i].k;
HashList[d].py=NameList[i].py;
HashList[d].si=sum+1;
}
}
}
void FindList() //查找
{
string name;
int s0=0,r,sum=1,adr,d;
cout<<"请输入姓名的拼音:"<<endl;
cin>>name;;
for(r=0;r<20;r++) //求出姓名的拼音所对应的整数(关键字)
s0+=name[r];
adr=s0%M; //使用哈希函数
d=adr;
if(HashList[adr].k==s0) //分3种情况进行判断
cout<<"姓名:"<<HashList[d].py<<" "<<"关键字:"<<s0<<" "<<"查找长度为: 1"<<endl;
else if (HashList[adr].k==0)
cout<<"无此记录!"<<endl;
else
{
int g=0;
while(g==0)
{
d=(d+s0%10+1)%M; //伪随机探测再散列法处理冲突
sum=sum+1;
if(HashList[d].k==0)
{
cout<<"无此记录!"<<endl;
g=1;
}
if(HashList[d].k==s0)
{
cout<<"姓名:"<<HashList[d].py<<" "<<"关键字:"<<s0<<" "<<"查找长度为:"<<sum<<endl;
g=1;
}
};
}
}
void Display() // 显示哈希表
{
int i;
float average=0;
cout<<"\n地址\t关键字\t\t搜索长度\tH(key)\t 姓名\n"; //显示的格式
for(i=0; i<50; i++)
{
cout<<i<<" ";
cout<<"\t"<<HashList[i].k<<" ";
cout<<"\t\t"<<HashList[i].si<<" ";
cout<<"\t\t"<<(HashList[i].k%M)<<" ";
cout<<"\t "<<HashList[i].py<<" ";
cout<<"\n";
}
for(i=0;i<HASH_LENGTH;i++)
average+=HashList[i].si;
average/=NAME_NO;
cout<<"平均查找长度:ASL("<<NAME_NO<<")="<<average<<endl;
}
int main()
{
char x;
InitNameList();
CreateHashList ();
cout<<"d. 显示哈希表 f. 查找 任意键退出 请选择:"<<endl;
while(cin>>x)
{
if(x=='d')
{
Display();
cout<<endl;
}
else if(x=='f')
{
FindList();
cout<<endl;
}
else break;
}
for (int i=0; i<HASH_LENGTH; i++)
{
free(NameList[i].py);
free(HashList[i].py);
}
return 0;
}
6、面向对象问题
编写一个程序,有一个汽车类vehicle,它具有一个需传递参数的构造函数,类中的数据成员:车轮个数wheels和车重weight放在保护段中;小车类car是它的私有派生类,其中包含载人数passenger_load;卡车类truck是vehicle的私有派生类,其中包含载人类passenger_load和载重量payload。每个类都有相关数据的输出方法。
源代码:
#include<iostream>
#include <math.h>
using namespace std;
class vehicle
{
protected:
int wheels;
int weight;
public:
vehicle(int wh, int we)//构造函数
{
wheels = wh;
weight = we;
}
void disp()//显示函数
{
cout << "wheels=" << wheels << ",weight=" << weight << endl;
}
};
class car:private vehicle//私有继承
{
int passenger_load;
public:
car(int wh, int we, int pa) :vehicle(wh,we)
{
passenger_load = pa;
}
void disp()//显示函数
{
vehicle::disp();//::重载运算符
cout << "passenger_load=" << passenger_load << endl;
}
};
class truck :private vehicle//私有继承
{
int passenger_load;
int payload;
public:
truck(int wh, int we, int pa,int pay) :vehicle(wh, we)
{
passenger_load = pa;
payload = pay;
}
void disp()//显示函数
{
vehicle::disp();
cout << "passenger_load=" << passenger_load << "payload=" << payload << endl;
}
};
void main()
{
vehicle v(100, 99);
v.disp();
car c(50, 40, 30);
c.disp();
truck t(20, 15, 10, 5);
t.disp();
system("pause");
}
二、综合题目
学生综合测评系统
1、需求分析
每个学生的信息为:学号、姓名、性别、家庭住址、联系电话、语文、数学、外语三门单科成绩、考试平均成绩、考试名次、同学互评分、品德成绩、任课教师评分、综合测评总分、综合测评名次。考试平均成绩、同学互评分、品德成绩、任课教师评分分别占综合测评总分的60%,10%,10%,20%。
A、学生信息处理
(1) 输入学生信息、学号、姓名、性别、家庭住址、联系电话,按学号以小到大的顺序存入文件中。
(2) 插入(修改)同学信息:
(3) 删除同学信息:
(4) 浏览学生信息:
B、学生数据处理:
(1) 按考试科目录入学生成绩并且按公式:考试成绩=(语文+数学+外语)/3 计算考试成绩,并计算考试名次。
(2) 学生测评数据输入并计算综合测评总分及名次。
提示:综合测评总分=(考试成绩)*0.6+(同学互评分)*0.1+品德成绩*0.1+任课老师评分*0.2。
(3) 学生数据管理
提示:输入学号,读出并显示该同学信息,输入新数据,将改后信息写入数据库
(4) 学生数据查询:
提示:输入学号或其他信息,即读出所有数据信息,并显示出来。
C、学生综合信息输出提示:输出学生信息到屏幕
2、总体设计
(对设计目标进行总体分析,说明要采用的基本思路,说明遇到的问题和解决方法。说明完成本次课程设计的完整过程。要描述程序的设计思想,画出本次课程设计完整的程序框图或流程图。没有图不给分)
设计采用模块化结构设计,主要包括:主菜单(menu)下的学生信息处理系统(info_menu)、学生数据处理系统(data_menu)、学生综合信息输出(shuchu)、帮助信息(help)、退出系统;学生信息处理系统(info_menu)下的输入学生信息(info_input)、修改学生信息(xiugai)、删除学生信息(info_del)、浏览学生信息(info_output)、返回主菜单;学生数据处理系统下的(data_menu)录入成绩数据(data_input)、修改学生数据(data_xiugai)、学生数据查询(data_chaxun)、返回主菜单。
3、详细设计
(要求列出所有编写的函数清单,说明每个函数的功能,各形式参数的意义,画出各函数的调用关系图。即模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等。还包括数据库需求分析;数据库概念结构设计(E-R图);数据库逻辑结构设计;类层次图;界面设计与各功能模块实现。)
void info_daoru();//学生信息导出文件函数
void info_xieru();//学生信息写入文件函数
void info_del();//学生信息删除文件函数
void info_xiugai();//学生信息修改文件函数
void data_xieru();//导入数据
void data_daoru();//写入数据
void data_xiugai();//删除数据
void data_chaxun();//查询数据
void data_input();//输入数据
void shuchu();//学生综合信息输出
学号 | 姓名 | 性别 | 家庭住址 | 联系电话 | 语文 | ... | 总成绩 |
201627255 |
| 男 | 四川 | 1111111 | 96 | ... | 86 |
201627256 |
| 男 | 青岛 | 2222222 | 78 | ... | 32 |
... | ... | ... | .. | ... | ... | ... | ... |
201627258 |
|
|
|
|
|
|
|
窗口背景与字体颜色:system("color 0A");0代表背景黑 A代表字体颜色为绿色
4、程序运行结果测试与分析
(调试出现的主要问题,编译语法错误及修改,重点是运行逻辑问题修改和调整。要针对程序处理的不同情况列出有代表性的输入和输出,用足够多的实例说明程序完成了设计任务和目标。)
调试出现的主要问题:在用win10系统进行调试的时候,容易出现兼容性的问题,这个问题不好解决,试了试在虚拟机上搭建win7环境,也算解决了这个问题
5、使用说明书
说明如何使用你编写的程序,详细列出每一步的操作步骤。
1.首先任意键进入主菜单
2.接下来就很容易操作了
程序中有个帮助信息如下:
void help() //帮助信息
{
system("cls"); //清屏
printf(" * 欢迎使用青理学生综合管理系统! *\n\n");
printf(" 本系统可以存储学生的基本信息和各科成绩,并能计算考试平均成绩,综合测评成绩和排名。\n");
printf(" 基本信息包括:学号、姓名、性别、家庭住址、联系电话;\n 各科成绩包括:语文、数学、外语成绩;\n");
printf(" 其它包括:考试名次、同学互评分、品德成绩、任课教师评分等。\n");
printf(" 说明:考试成绩排名是按照考试成绩计算的(考试成绩=(语+数+外)/3);\n");
printf(" 综合测评总分=((考试成绩)*0.6+(同学互评分)*0.1+(品德成绩)*0.1+(任课教师评分)*0.2)\n");
printf(" 其它请按照提示操作即可。\n\n");
printf("\n\n\t\t");
system("pause");
}
6、关键源程序(带注释)。
int main() //主函数
{
system("color 0A");//窗口设置
void data_menu();
void info_menu();
void help();
void menu();
printf("\n\n\n\t\t............欢迎使用青理学生综合管理系统............\n\n");
printf("\t\t \t\t本程序由通信164吴勃程序编写\n\n");
printf("\n\n\t\t");
system("pause");
menu();
return 0;
}
void info_menu() //学生信息菜单
{
int choice;
while(1){
system("cls"); //清屏
printf("\n\n\n\n\t\t☆☆☆☆青理学生信息处理系统☆☆☆☆\n\n");
printf("\t\t\t1.输入学生信息\n");
printf("\t\t\t2.修改学生信息\n");
printf("\t\t\t3.删除学生信息\n");
printf("\t\t\t4.浏览学生信息\n");
printf("\t\t\t0.返回主菜单\n\n");
printf("\t\t请输入序号选择操作:");
scanf("%d",&choice);
if(choice==0) break;
switch(choice){
case 1: info_input(); info_xieru(); break;
case 2: info_xiugai(); break;
case 3: info_del(); break;
case 4: info_output(); break;
default: printf("\n\t输入有误!请重新输入!\n\n"); break;
}
}
}
void data_menu() //数据处理菜单
{
int choice;
printf("\n\t在进入学生数据管理前,请确认学生信息已全部完成!\n");
printf("\n\t是否继续?输入数字选择(0:返回;其它数字继续。)\n");
scanf("%d",&choice);
if(choice==0) return;
while(1){
system("cls"); //清屏
printf("\n\n\n\n\t\t☆☆☆☆☆学生数据处理系统☆☆☆☆☆\n\n");
printf("\t\t\t● 1.录入成绩数据\n");
printf("\t\t\t● 2.修改学生数据\n");
printf("\t\t\t● 3.学生数据查询\n");
printf("\t\t\t● 0.返回主菜单\n\n");
printf("\t\t请输入序号选择操作:");
scanf("%d",&choice);
if(choice==0) break;
switch(choice){
case 1: data_input(); break;
case 2: data_xiugai(); break;
case 3: data_chaxun(); break;
default: printf("\n\t输入有误!请重新输入!\n\n"); break;
}
}
}
void menu() //主菜单函数
{
int choice;
while(1){
system("cls");
printf("\n\n\n\n\t\t-------- ※主 - - - -菜- - - - 单※ --------\n\n");
printf("\t\t\t● 1.学生信息处理系统\n");
printf("\t\t\t● 2.学生数据处理系统\n");
printf("\t\t\t● 3.学生综合信息输出\n");
printf("\t\t\t● 4.帮助信息\n");
printf("\t\t\t● 0.退出系统\n\n");
printf("\t\t请输入序号选择操作:");
scanf("%d",&choice);
printf("\n");
if(choice==0){
printf("\t\t☆☆☆☆你已经退出,谢谢使用青理学生综合管理系统!☆☆☆☆\n\n\t\t");
break;
}
switch(choice){
case 1 : info_menu(); break;
case 2 : data_menu(); break;
case 4 : help(); break;
case 3 : shuchu(); break;
default: printf("\n\t输入有误!请重新输入!\n\n"); break;
}
}
}
三、结论与心得
本小组是共同完成的题目本人主要完成C++部分的非数据库连接,总结一下个人基础部分的整体思路:模块化。分三块,输入。输出及算法部分,算法部分灵活的运用几大结构,最后做完整个基础部分,我感觉到了面向对象的重要性,框架的搭建还是很重要的
综合部分:在调试部分还是比较费事的,首先的问题就是软件的兼容性,在个人win10笔记本中安装vc++6.0,发现无法运行,上网找到各种解决办法,发现都无济于事,最后只能在虚拟机中运行win7环境,去运行代码,在个人基础做完的时候,做一个学生管理评测主要采取的是模块化方法,在机房里尝试着连接mysql数据库,按照老师发的文档里的步骤去进行操作,但是卡在了如何在vc里面用函数实现对数据库的操作,上午百度了几天,发现他还需要学习一下语句,还有需要包含mysql的头文件,添加的时候在网上没找到,加上自己也不知道如何去写,由于时间不够,还有自己的学习能力不是那么快所以这部分没有完成,今后在学习Java的时候要加强自己在连接数据库这部分的知识,小组成员用php+HTML做了一个简易的学生成绩系统,他用的是phpstudy和甲骨文公司的集成软件NetBeans(NetBeans项目由一个活跃的开发社区提供支持, NetBean开发环境提供了丰富的产品文档和培训资源以及大量的第三方插件。NetBeans是开源软件开发集成环境,是一个开放框架,可扩展的开发平台,可以用于Java、C/C++,PHP等语言的开发,本身是一个开发平台,可以通过扩展插件来扩展功能。 在 NetBeans Platform 平台中,应用软体是用一系列的软体模组(Modular Software Components)建构出来。而这些模组是一个jar档(Java Archive File)它包含了一组Java程式的类别而它们实作全依据依 NetBeans 定义了的公开介面以及一系列用来区分不同模组的定义描述档(Manifest File)。有赖于模组化带来的好处,用模组来建构的应用程式可只要加上新的模组就能进一步扩充)在和小组成员讨论,发现这两款集成的软件确实带来很多的方便,PHPstudy中的mysql图形化操作提高了效率,
今后要继续尝试用java语言实行数据库的连接。
附:在环境的搭建中有两条建议:1.安装尽量别汉化,路径尽量是英文别包含汉字
2.了解到了各个版本windows操作系统与MacBook环境对软件的优缺点, windows系列中win7还是更适合编程
3.综合题借鉴CSDN博客