补交作业

题目要求
写一个能自动生成小学四则运算题目的程序,然后在此基础上扩展:

1)除了整数以外,还要支持真分数的四则运算,例如:1/6+1/8=7/24

2)程序要求能处理用户的输入,判断对错,累积分数

3)程序支持可以由用户自行选择加、减、乘、除运算

4)使用-n参数控制生成题目的个数,例如Myapp.exe -n 10,将生成10个题目

代码
递归求最大公约数
int Gcd(int m,int n){
if(n0) return m;
return Gcd(n,m%n);
}//递归求最大公约数
四舍五入
float Handling(float &t){
t*=100;
t+=0.5;
t=(int)t;
t/=100;
return t;
}//对计算机算出的数进行位数的确定,并使用四舍五入算法
交换
int swap(int &a,int &b){
int t;
if(a>b){
t=a;
a=b;
b=t;
}
}//交换
整数加法
int intAddition(int &score){
int a,b,c;
srand((unsigned int)time(NULL));
a=rand()%100;
b=rand()%100;
printf("\n\t\t\t\t请计算:%d+%d=",a,b);
scanf("%d",&c);
if(a+bc){
score++;
printf("\t\t\t\t回答正确!\n");
}
else
printf("\t\t\t\t回答错误!正确答案为:%d\n",a+b);
}
真分数加法
int trueAddition(int &score){

int a,b,c,d,x,y;
float e,f,g;
int tru1,tru2,tru3,tru4;
int re1,re2;
srand((unsigned int)time(NULL));
do{
	a=rand()%10;
	b=rand()%10+1;
	x=rand()%10;
	y=rand()%10+1;	
}while(a==b||x==y);
swap(a,b);
swap(x,y);

tru1=(a/Gcd(a,b))*(y/Gcd(x,y));
tru2=(x/Gcd(x,y))*(b/Gcd(a,b));
tru3=(b/Gcd(a,b))*(y/Gcd(x,y));
tru4=tru1+tru2;
re1=tru4/Gcd(tru4,tru3);
re2=tru3/Gcd(tru4,tru3);
printf("\n\t\t\t\t请计算:%d/%d+%d/%d=",a/Gcd(a,b),b/Gcd(a,b),x/Gcd(x,y),y/Gcd(x,y));
scanf("%d/%d",&c,&d);
if(re1==c&&re2==d){
score++;
printf("\t\t\t\t回答正确!\n"); 

}
else{
if(re2==1){
printf("\t\t\t\t回答错误!正确答案为:%d\n",re1);
}else
printf("\t\t\t\t回答错误!正确答案为:%d/%d\n",re1,re2);
}
}

整数减法
int intSubtraction(int &score){
int a,b,c,t;
srand((unsigned int)time(NULL));
a=rand()%100;
b=rand()%100;
if(a<b){
t=a;
a=b;
b=t;
}
printf("\n\t\t\t\t请计算:%d-%d=",a,b);
scanf("%d",&c);
if(a-b==c){
score++;
printf("\t\t\t\t回答正确!\n");
}
else
printf("\t\t\t\t回答错误!正确答案为:%d\n",a-b);
}
真分数减法
int trueSubtraction(int &score){

int a,b,c,d,x,y;
float e,f,g;
int tru1,tru2,tru3,tru4;
int re1,re2;
srand((unsigned int)time(NULL));
do{
	a=rand()%10;
	b=rand()%10+1;
	x=rand()%10;
	y=rand()%10+1;	
}while(a==b||x==y);
swap(a,b);
swap(x,y);

tru1=(a/Gcd(a,b))*(y/Gcd(x,y));//通分后的第一个分子 
tru2=(x/Gcd(x,y))*(b/Gcd(a,b));//通分后的第二个分子 
tru3=(b/Gcd(a,b))*(y/Gcd(x,y));//通分后的分母 
if(tru1<tru2){
	int t;
	t=a;
	a=x;
	x=t;//交换分子 
	t=b;
	b=y;
	y=t;//交换分母 
} 
tru1=(a/Gcd(a,b))*(y/Gcd(x,y));
tru2=(x/Gcd(x,y))*(b/Gcd(a,b));
tru4=tru1-tru2;
re1=tru4/Gcd(tru4,tru3);
re2=tru3/Gcd(tru4,tru3);
printf("\n\t\t\t\t请计算:%d/%d-%d/%d=",a/Gcd(a,b),b/Gcd(a,b),x/Gcd(x,y),y/Gcd(x,y));
scanf("%d/%d",&c,&d);
if(re1==c&&re2==d){
score++;
printf("\t\t\t\t回答正确!\n"); 

}
else{
printf("\t\t\t\t回答错误!正确答案为:%d/%d\n",re1,re2);
}
}

整数乘法
int intMultiplication(int &score){
int a,b,c;
srand((unsigned int)time(NULL));
a=rand()%100;
b=rand()%100;
printf("\n\t\t\t\t请计算:%d%d=",a,b);
scanf("%d",&c);
if(abc){
score++;
printf("\t\t\t\t回答正确!\n");
}
else
printf("\t\t\t\t回答错误!正确答案为:%d\n",a*b);
}
真分数乘法
int trueMultiplication(int &score){
int a,b,c,d,x,y;
float e,f,g;
int tru1,tru2,tru3,tru4;
int re1,re2;
srand((unsigned int)time(NULL));
do{
a=rand()%10;
b=rand()%10+1;
x=rand()%10;
y=rand()%10+1;
}while(ab||x==y);
swap(a,b);
swap(x,y);

tru1=(a/Gcd(a,b))*(x/Gcd(x,y));//相乘后的分子 
tru2=(y/Gcd(x,y))*(b/Gcd(a,b));//相乘后的分母 

re1=tru1/Gcd(tru1,tru2);
re2=tru2/Gcd(tru1,tru2);
printf("\n\t\t\t\t请计算:%d/%d*%d/%d=",a/Gcd(a,b),b/Gcd(a,b),x/Gcd(x,y),y/Gcd(x,y));
scanf("%d/%d",&c,&d);
if(re1==c&&re2==d){
score++;
printf("\t\t\t\t回答正确!\n"); 

}
else{
printf("\t\t\t\t回答错误!正确答案为:%d/%d\n",re1,re2);
}
}
整数除法
int intDivision(int &score){
int a,b;
float c,t;
srand((unsigned int)time(NULL));
a=rand()%100;
b=rand()%100+1;
printf("\n\t\t\t\t请计算:%d/%d=",a,b);
scanf("%f",&c);
t=(float)a/b;
t=Handling(t);
c=Handling(c);
if(tc){
score++;
printf("\t\t\t\t回答正确!\n");
}
else
printf("\t\t\t\t回答错误!正确答案为:%.2f\n",t);
}
真分数除法
int trueDivision(int &score){
int a,b,c,d,x,y;
float e,f,g;
int tru1,tru2,tru3,tru4;
int re1,re2;
srand((unsigned int)time(NULL));
do{
a=rand()%10;
b=rand()%10+1;
x=rand()%10+1;
y=rand()%10+1;
}while(ab||x==y);
swap(a,b);
swap(x,y);

tru1=(a/Gcd(a,b))*(y/Gcd(x,y));//相除后的分子 
tru2=(x/Gcd(x,y))*(b/Gcd(a,b));//相除后的分母 

re1=tru1/Gcd(tru1,tru2);
re2=tru2/Gcd(tru1,tru2);
printf("\n\t\t\t\t请计算:%d/%d/%d/%d=",a/Gcd(a,b),b/Gcd(a,b),x/Gcd(x,y),y/Gcd(x,y));
scanf("%d/%d",&c,&d);
if(re1==c&&re2==d){
score++;
printf("\t\t\t\t回答正确!\n"); 

}
else{
if(re2==1){
printf("\t\t\t\t回答错误!正确答案为:%d\n",re1);
}else
printf("\t\t\t\t回答错误!正确答案为:%d/%d\n",re1,re2);
}
}
主函数
int main(){
int n,m,t,x,score=0;//m表示选择的四则运算类型,score表示总分累计
system("color f2");
start:
printf("\n\n\t\t\t\t\t\t欢迎进入四则运算练习\n\n\n");
printf("\t\t\t设置生成的练习题目个数:");
scanf("%d",&n);
t=n;
printf("\n\t\t\t\t\t1.加法运算\n");
printf("\t\t\t\t\t2.减法运算\n");
printf("\t\t\t\t\t3.乘法运算\n");
printf("\t\t\t\t\t4.除法运算\n");
printf("\t\t\t\t\t0.結束答題\n");
restart:
printf("\n\n\t\t\t请选择算法类型:");
scanf("%d",&m);

while(t>0){
	switch(m){
		case 0:
			exit(0); 
		case 1:
			srand((unsigned int)time(NULL));
			x=rand()%2;
			if(x==0){
				intAddition(score);
			}
			else{
				trueAddition(score); 
			}
			break;
		case 2:
			srand((unsigned int)time(NULL));
			x=rand()%2;
			if(x==0){
				intSubtraction(score);
			}
			else{
				trueSubtraction(score); 
			}
			break;
		case 3:
			srand((unsigned int)time(NULL));
			x=rand()%2;
			if(x==0){
				intMultiplication(score);
			}
			else{
				trueMultiplication(score); 
			}
			break;
		case 4:
			srand((unsigned int)time(NULL));
			x=rand()%2;
			if(x==0){
				intDivision(score);
			}
			else{
				trueDivision(score); 
			}
			break;
		default:
			printf("\n\t\t\t\t输入不正确,请重新输入!");
			
			goto restart;
	}
	t--;
}

printf("\n\n\t\t\t\t\t\t\t此次练习共%d题,共答对%d题\n",n,score);
printf("\n\n\t\t\t\t\t\t\t\t\t\t\t总得分:%d分\n",score);
printf("\n\n\t\t\t\t\t...............返回主界面.............\n\n");
system("pause");
system("cls");
goto start;

return OK;
}
心得和经验
通过本次作业,我练习了编程能力,深刻掌握了如何将计算机计算出的浮点数精确转变为任意位数的浮点数的方法,同时也学会了Makdown编辑规范,也学会了写博客的整体流程,对博客使用更加熟练。

(1)流程图的定义:流经一个系统的信息流、观点流或部件流的图形代表,是揭示和掌握封闭系统运动状况的有效方式。作为诊断工具,它能够辅助决策制定,让管理者清楚地知道,问题可能出在什么地方,从而确定出可供选择的行动方案;有时也称作输入-输出图。该图直观地描述一个工作过程的具体步骤。流程图对准确了解事情是如何进行的,以及决定应如何改进过程极有帮助。
(2)活动图的定义:是uml中对系统动态方面建模的主要形式,强调从活动到活动的控制流,是一种表述过程基理、业务过程以及工作流的技术。
(3)流程图与活动图的区别:流程图更注重描述处理的过程,主体结构由三个基本结构构成,各个环节之间都有着严格的逻辑顺序,一点小错误就很容易导致逻辑问题。它适合面向过程的需求;而活动图更注重表现系统的行为,强调的是活动与活动、对象与对象之间的逻辑关系,不太在意内部具体功能究竟是如何实现的,所以相比于流程图,它所包含的逻辑会更为抽象,因此他它适合于面向对象的需求。
(4)流程图与活动图的联系:活动图在本质上是一种流程图。只不过活动图着重表现从一个活动到另一个活动的控制流,是内部处理驱动的流程。一个活动到另一个活动的控制流,是内部处理驱动的流程。

https://img2020.cnblogs.com/blog/2205226/202011/2205226-20201112233914311-435041497.png

一、作业信息

这个作业属于哪个课程 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18
这个作业要求在哪里 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11478
这个作业的目标 编写一个ATM管理系统,语言不限,
学号 3180701135

一.题目要求

编写一个ATM管理系统,语言不限,要求应包括以下主要功能:

(1)开户,销户

(2)查询账户余额

(3)存款

(4)取款

(5)转账(一个账户转到另一个账户)等...

二.代码提交
开户

void zhuce()
{
int baiwei, shiwei, gewei, len;/定义账号的后三位/
char password2[7];/注册时第二次输入的密码/
int j = 0;
strcpy(C[Cnum].account, "123456543210");/复制账号的前12位/
baiwei = Cnum / 100;
shiwei = Cnum / 10 % 10;
gewei = Cnum % 10;
C[Cnum].account[12] = baiwei + '0';
C[Cnum].account[13] = shiwei + '0';
C[Cnum].account[14] = gewei + '0';
C[Cnum].account[15] = '\0';
system("cls");/运行前清屏/
printf("\n\n\n\t\t注册————ZHUCE\n\n\n");
printf("\t\t请输入姓名:");
scanf("%s", C[Cnum].name);
do
{
printf("\t\t请输入6位数密码:");
scanf("%s", C[Cnum].password);
len = strlen(C[Cnum].password);
if (len != 6)/判断密码是否为6位/
{
printf("\t\t您的密码不是6位数!\n");
system("pause");
return;
}
//此处用字符串长度函数来判断密码的位数
printf("\t\t请再次输入密码:");
scanf("%s", password2);
if (strcmp(C[Cnum].password, password2) != 0)/判断两次密码输入是否相同/
{
j++;
printf("\n\t\t您的密码输入错误!您还有%d次机会输入密码!\n", 3 - j);
}
if (j == 3)/密码输入错误不得超过三次/
{
system("pause");
return;
}
} while (strcmp(C[Cnum].password, password2) != 0);
do
{
printf("\t\t请输入身份证号:");
scanf("%s", C[Cnum].IDnumber);
len = strlen(C[Cnum].IDnumber);
if (len != 18 && len != 15)/判断身份证号位数是否为15位或18 位/
printf("\t\t身份证号错误!请输入15位或18位身份证号!\n");
} while (len != 18 && len != 15);
printf("\n\t\t请输入存入金额:");
scanf("%f", &C[Cnum].yue);
if ((int)C[Cnum].yue % 50 != 0)/存款金额必须为50的整数倍/
{
printf("\t\t本机只接受50元或100元面值的存款!\n");
system("pause");
return;
}
strcpy(T[Tnum].account, C[Cnum].account);/**/
strcpy(T[Tnum].type, "存储");/复制交易类型/
T[Tnum].Tmoney = C[Cnum].yue;/第一次交易的账户余额值赋给交易经额的值/
T[Tnum].Tyue = C[Dxiabiao].yue;/第一次交易的账户余额值赋给交易余额的值/
printf("\n\t\t开户成功!\n");
system("pause");/暂停功能/
printf("\n\n账号 \t\t交易类型\t交易金额\t余额\n");/输出账户第一次交易的数据清单/
printf("%s", C[Cnum].account);
printf(" %s", T[Tnum].type);
printf("\t\t%.2f", C[Cnum].yue);
printf(" \t%.2f", C[Cnum].yue);
printf("\n");
Cnum++;/账户序号加一/
Tnum++;/交易序号加一/
Dxiabiao++;
system("pause");/暂停/
}

查询账户余额

void quary()
{
for (;/空循环语句/
{
switch (quary_menu()) /查询界面选择判断/
{
case 1:quary_yue();break;/调用查询余额函数/
case 2:quary_mingxi();break; /调用查询明细函数/
case 3:quary_credit();break; /调用查询存款函数/
case 4:quary_debit();break;/调用查询取款函数/
case 0:return;
}
}
}
取款

void debit()
{
float money;/定义取款金额/
system("cls");/清屏/
printf("\n\n\n\t\t取款————debit \n\n\n");/进入取款功能界面/
printf("\t\t本机只可取50或100元币值人民币!\n");
printf("\n\n\t\t请输入取款金额:");
scanf("%f", &money); /输入取款金额/
if (money> C[Dxiabiao].yue)/账户余额是否足够取款/
{
printf("\n\t\t您的余额不足!\n");
system("pause");
return;
}
if ((int)money % 50 != 0 || money <= 0)/取款金额必须为50的整数倍且为正数/
{
printf("\n\t\t请输入面值为50或100的存款金额!请勿输入负数或0!\n");
system("pause");
return;
}
strcpy(T[Tnum].account, C[Dxiabiao].account);/把当前登录账号复制给交易记录里的账号/
strcpy(T[Tnum].type, "取款");/复制交易类型/
T[Tnum].Tmoney = money;/取款金额值赋给交易金额/
C[Dxiabiao].yue -= T[Tnum].Tmoney;/计算取款后的账户余额/
T[Tnum].Tyue = C[Dxiabiao].yue;/取款后余额等于账户余额/
printf("\n\t\t取款成功!\n");
system("pause");
printf("\n账号 \t\t交易类型\t交易金额\t交易余额\n");//输出账户和交易的数据清单
printf("%s", T[Tnum].account);
printf(" %s", T[Tnum].type);
printf("\t\t%.2f", T[Tnum].Tmoney);
printf("\t\t%.2f", T[Tnum].Tyue);
printf("\n");
Tnum++;/交易序号加一/
system("pause");
}
存款

void credit()
{
float money;/输入的存款金额/
system("cls");/清屏/
printf("\n\n\n\t\t存款————credit \n\n\n");/进入存款功能界面/
printf("\t\t本机只接收50元或100元币值人民币!\n");/提示信息/
printf("\n\t\t请输入存款金额:");
scanf("%f", &money);/输入存款金额/
if ((int)money % 50 != 0 || money <= 0)/存款金额必须为50的整数倍且为正数/
{
printf("\n\t\t请输入面值为50或100的存款金额!请勿输入负数或0!\n");
system("pause");
return;
}
strcpy(T[Tnum].account, C[Dxiabiao].account);/把当前登录账号复制给交易记录里的账号/
strcpy(T[Tnum].type, "存款");/复制交易类型/
T[Tnum].Tmoney = money;/把存款金额赋给交易金额/
C[Dxiabiao].yue += T[Tnum].Tmoney;/计算存款后的账户余额/
T[Tnum].Tyue = C[Dxiabiao].yue;/交易后的余额等于账户余额/
printf("\n\t\t存款成功!");
system("pause");
printf("\n账号 \t\t交易类型\t交易金额\t交易余额\n");//输出账户存款交易的数据清单
printf("%s", T[Tnum].account);
printf(" %s", T[Tnum].type);
printf("\t\t%.2f", T[Tnum].Tmoney);
printf("\t\t%.2f", T[Tnum].Tyue);
printf("\n");
Tnum++;/交易序号加一/
system("pause");
}

修改密码

void updatepassword()
{
char password[7], newpassword1[7], newpassword2[7];
int j = 0;
printf("\n\n\t\t请输入原来的密码:");
scanf("%s", password);/输入旧密码/
if (strcmp(password, C[Dxiabiao].password) != 0)/判断旧密码正确与否/
{
printf("\n\t\t您的密码输入错误!\n");
system("pause");
return;
}
do
{
printf("\n\t\t请输入新密码:");
scanf("%s", newpassword1);
printf("\n\t\t请再一次输入新密码:");/输入两次新密码/
scanf("%s", newpassword2);
if (strcmp(newpassword1, newpassword2) != 0)/判断输入的两次新密码是否相等/
{
j++;
printf("\n\t\t您的密码输入错误!您还有%d次机会输入密码!\n", 3 - j);
}
if (j == 3)/新密码输入错误不得超过三次/
{
printf("密码修改未成功!\n");
system("pause");
return;
}
} while (strcmp(newpassword1, newpassword2) != 0);
strcpy(C[Dxiabiao].password, newpassword1);/拷贝新密码到账户信息里/
printf("\n\t\t您的密码修改成功!\n");
system("pause");
return;
}

主菜单

int menu()
{
char c;
do
{
system("cls"); /每次选择运行前清屏/
printf("\n\n\n\t\t\n");
printf("\t\t 主菜单 \n"); /主菜单选择/
printf("\t\t\n");
printf("\t\t--------------------------\n");
printf("\t\t** 1. 注册 \n");
printf("\t\t 2. 登录 \n");
printf("\t\t 3. 加载数据 \n");
printf("\t\t 4. 保存数据 \n");
printf("\t\t 5. 系统帮助 \n");
printf("\t\t 0. 退出 \n");
printf("\t\t--------------------------\n");
printf("\t\t************************\n");
printf("\t\t请作出选择(0-5);
c = getchar(); /读入选择/
} while (c<'0' || c>'5');
return(c - '0'); /c变为空后返回重新选择/
}
运行截图

代码

include<stdio.h>
include<stdlib.h>
include<string.h>
pragma warning(disable:4996)/将4966警报置为失效/
define CNUM 100
struct Customer/账户的结构体/
{
char account[16];/用户账号/
char name[9];/用户姓名/
char password[7];/账户密码/
char IDnumber[19];/用户身份证号/
float yue;/账户余额/
};
typedef struct
{
char account[16];/交易的账号/
char Ttime[50];/交易时间/
char type[5];/交易类型/
float Tmoney;/交易金额/
float Tyue;/交易后的余额/
} Transaction;/交易记录的结构体/
Transaction T[1000];/定义交易记录的结构体数组,可以保存1000条交易记录/
struct Customer C[100];/定义账户的结构体数组,可以注册100个账户/
int Cnum = 0;/账户序号/
int Tnum = 0; /交易序号/
int Dxiabiao = 0;/当前登录的账户下标/

int menu(); /声明主菜单函数/
void help(); /声明帮助函数/
void zhuce(); /声明注册函数/
void denglu(); /声明登录函数/
void load(); /声明装载数据函数/
void save(); /声明保存数据函数/
int denglu_menu(); /声明登录菜单函数/
void credit(); /声明存款函数/
void debit(); /声明取款函数/
void quary(); /声明查询函数/
void print(); /声明打印函数/
void updatepassword(); /声明修改密码函数/
int quary_menu(); /声明查询菜单函数/
void quary_yue(); /声明查询余额函数/
void quary_mingxi(); /声明查询明细函数/
void quary_credit(); /声明查询存款函数/
void quary_debit(); /声明查询取款函数/

/主函数/
void main()
{
system("color 3F");/设置背景颜色为蓝色/
printf("\n\t
************************************************\n");
printf("\n\t 欢迎使用ATM终端机! \n");
printf("\n\t
***************************\n");
system("pause");/暂停功能/
system("cls");/清屏/
for (;/空循环语句/
{
switch (menu()) /主菜单选择判断/
{
case 1:zhuce(); break;/调用注册函数/
case 2:denglu(); break;/调用登录函数/
case 3:load(); break;/调用加载数据的函数/
case 4:save(); break;/调用保存数据的函数/
case 5:help(); break;/调用帮助函数/
case 0:printf("\t\t欢迎使用ATM终端机管理系统。谢谢!\n");
system("pause");
exit(0);/结束程序/
}
}
}

/定义主菜单函数/
int menu()
{
char c;
do
{
system("cls"); /每次选择运行前清屏/
printf("\n\n\n\t\t
**********************\n");
printf("\t\t 主菜单 **\n"); /主菜单选择/
printf("\t\t\n");
printf("\t\t--------------------------\n");
printf("\t\t 1. 注册 \n");
printf("\t\t 2. 登录 \n");
printf("\t\t 3. 加载数据 \n");
printf("\t\t 4. 保存数据 \n");
printf("\t\t 5. 系统帮助 \n");
printf("\t\t 0. 退出 \n");
printf("\t\t--------------------------\n");
printf("\t\t\n");
printf("\t\t请作出选择(0-5);
c = getchar(); /读入选择/
} while (c<'0' || c>'5');
return(c - '0'); /c变为空后返回重新选择/
}

/定义帮助函数/
void help()
{
system("cls");
printf("\n\t\t\n");
printf("\n\t\t 欢迎使用ATM机帮助功能 \n");
printf("\n\t\t 1.如有记录,先用加载功能 \n");
printf("\n\t\t 2.注册记得要保存数据 \n");
printf("\n\t\t 3.登录后可选择功能存款、取 \n");
printf("\n\t\t 款打印票据或查询 \n");
printf("\n\t\t 4.登录后可查询账户余额 \n");
printf("\n\t\t 注:一切操作切勿忘记保存 \n");
printf("\n\t\t******\n");
system("pause");
}

/定义注册函数*/
void zhuce()
{
int baiwei, shiwei, gewei, len;/定义账号的后三位/
char password2[7];/注册时第二次输入的密码/
int j = 0;
strcpy(C[Cnum].account, "123456543210");/复制账号的前12位/
baiwei = Cnum / 100;
shiwei = Cnum / 10 % 10;
gewei = Cnum % 10;
C[Cnum].account[12] = baiwei + '0';
C[Cnum].account[13] = shiwei + '0';
C[Cnum].account[14] = gewei + '0';
C[Cnum].account[15] = '\0';
system("cls");/运行前清屏/
printf("\n\n\n\t\t注册————ZHUCE\n\n\n");
printf("\t\t请输入姓名:");
scanf("%s", C[Cnum].name);
do
{
printf("\t\t请输入6位数密码:");
scanf("%s", C[Cnum].password);
len = strlen(C[Cnum].password);
if (len != 6)/判断密码是否为6位/
{
printf("\t\t您的密码不是6位数!\n");
system("pause");
return;
}
//此处用字符串长度函数来判断密码的位数
printf("\t\t请再次输入密码:");
scanf("%s", password2);
if (strcmp(C[Cnum].password, password2) != 0)/判断两次密码输入是否相同/
{
j++;
printf("\n\t\t您的密码输入错误!您还有%d次机会输入密码!\n", 3 - j);
}
if (j == 3)/密码输入错误不得超过三次/
{
system("pause");
return;
}
} while (strcmp(C[Cnum].password, password2) != 0);
do
{
printf("\t\t请输入身份证号:");
scanf("%s", C[Cnum].IDnumber);
len = strlen(C[Cnum].IDnumber);
if (len != 18 && len != 15)/判断身份证号位数是否为15位或18 位/
printf("\t\t身份证号错误!请输入15位或18位身份证号!\n");
} while (len != 18 && len != 15);
printf("\n\t\t请输入存入金额:");
scanf("%f", &C[Cnum].yue);
if ((int)C[Cnum].yue % 50 != 0)/存款金额必须为50的整数倍/
{
printf("\t\t本机只接受50元或100元面值的存款!\n");
system("pause");
return;
}
strcpy(T[Tnum].account, C[Cnum].account);//
strcpy(T[Tnum].type, "存储");/复制交易类型/
T[Tnum].Tmoney = C[Cnum].yue;/第一次交易的账户余额值赋给交易经额的值/
T[Tnum].Tyue = C[Dxiabiao].yue;/第一次交易的账户余额值赋给交易余额的值/
printf("\n\t\t开户成功!\n");
system("pause");/暂停功能/
printf("\n\n账号 \t\t交易类型\t交易金额\t余额\n");/输出账户第一次交易的数据清单/
printf("%s", C[Cnum].account);
printf(" %s", T[Tnum].type);
printf("\t\t%.2f", C[Cnum].yue);
printf(" \t%.2f", C[Cnum].yue);
printf("\n");
Cnum++;/账户序号加一/
Tnum++;/交易序号加一/
Dxiabiao++;
system("pause");/暂停/
}

/定义登录函数/
void denglu()
{
char account[16], password[7];/登录时输入的账号和密码/
int i = 0, j = 0;
system("cls");/清屏/
printf("\n\n\n\t\t登录————DENGLU\n\n\n");/进入登录得功能界面/
printf("\t\t输入账号:");
scanf("%s", account);/输入账号/
for (i = 0; i<Cnum; i++)/在已注册的账号中依次寻找该账号/
if (strcmp(account, C[i].account) == 0)
{
Dxiabiao = i;/若找到,则跳出循环/
break;
}
if (i == Cnum)/注册的账号中没输入的账号/
{
printf("\n\t\t当前账号不存在!\n");
system("pause");
return;
}
do
{
printf("\n\t\t输入密码:");
scanf("%s", password);
if (strcmp(password, C[i].password) != 0)
{
j++;
printf("\t\t您的密码输入错误!您还有%d次机会输入密码!\n\n", 3 - j);
}
if (j == 3)/密码输入错误不得超过三次/
{
printf("\n\t\t此卡已被锁定,请到工作人员处解锁。\n");
system("pause");
return;
}
} while (strcmp(password, C[i].password) != 0);
for (;/空循环语句/
{
switch (denglu_menu()) /登陆界面选择判断/
{
case 1:credit();break;/调用存款函数/
case 2:debit();break;/调用取款函数/
case 3:quary();break;/调用查询函数/
case 4:updatepassword();break;/调用修改密码函数/
case 5:print(); break; /调用打印函数/
case 0:return;/返回上一级菜单界面/
}
}
}

/定义加载数据函数**/
void load()
{
FILE fp;/定义文件指针/
int i;
char Fname[20];/定义输入的文件名/
printf("\t\t请输入打开的文件名(文件名.txt):");
scanf("%s", Fname);/输入要读入数据的文件名/
if ((fp = fopen(Fname, "r")) == NULL)/找不到输入的文件名/
{
printf("\t\t无法打开该文件!");
system("pause");
return;
}
fscanf(fp, "%d\n", &Cnum);
fscanf(fp, "账号 \t\t姓名\t密码\t身份证号 \t\t余额\n");
for (i = 0; i<Cnum; i++)/依次从文件读入注册账户的信息/
{
fscanf(fp, "%16s %9s %7s %19s %12f",
C[i].account, C[i].name, C[i].password,C[i].IDnumber, &C[i].yue);
fscanf(fp, "\n");
}
fscanf(fp, "%d\n", &Tnum);
fscanf(fp, "账号 \t\t交易类型\t交易金额\t交易余额\n");
for (i = 0; i<Tnum; i++)/依次从文件读入交易记录的信息/
{
fscanf(fp, "%16s ", T[i].account);
fscanf(fp, "%5s\t%12f\t%12f",
T[i].type,&T[i].Tmoney, &T[i].Tyue);
fgets(T[i].account, 16, fp);
fscanf(fp, "\n");
}
fclose(fp);/关闭文件
/
printf("\t\t读入成功!\n\n");
system("pause");
}

/定义保存数据函数**/
void save()
{
FILE fp;/文件指针/
int i;
char Fname[13];
printf("\t\t请输入文件名(输入格式为:文件名.txt);
scanf("%s", Fname);/输入要保存的文件名/
if ((fp = fopen(Fname, "w")) == NULL)
{
printf("\n\t\t无法打开文件!\n");
system("pause");
return;
}
fprintf(fp, "%d\n", Cnum);
fprintf(fp, "账号 \t\t姓名\t密码 \t身份证号 \t\t余额\n");
for (i = 0; i<Cnum; i++)/把账户信息依次输出到指定文件/
fprintf(fp, "%-16s%-9s%-7s%-19s%-12.2f\n",
C[i].account,C[i].name, C[i].password,C[i].IDnumber, C[i].yue);
fprintf(fp, "%d\n", Tnum);
fprintf(fp, "账号 \t\t交易类型\t交易金额 \t\t交易余额 \n");
for (i = 0; i<Tnum; i++)/把交易记录的信息依次输出到指定文件/
fprintf(fp, "%-16s %-5s \t%-12.2f \t%-12.2f \n",
T[i].account, T[i].type, T[i].Tmoney, T[i].Tyue);
fclose(fp);/关闭文件
/
printf("\n\t\t保存成功!\n");
system("pause");
}

/定义登录菜单函数/
int denglu_menu()
{
char c;
do
{
system("cls"); /每次选择运行前清屏/
printf("\n\n\n\t\t欢迎进入 登录界面!\n\n"); /登录界面菜单选择/
printf("\t\t * 1. 存款 \n");
printf("\t\t * 2. 取款 \n");
printf("\t\t * 3. 查询 \n");
printf("\t\t * 4. 修改密码 \n");
printf("\t\t * 5. 打印票据 \n");
printf("\t\t * 0. 返回 \n");
printf("\t\t
***************\n");
printf("\t\t请作出选择(0-5)😊;
c = getchar(); /读入选择/
} while (c<'0' || c>'5');
return(c - '0'); /c变为空后返回重新选择/
}

/定义打印函数/
void print()
{
FILE file;
int i;
if ((file = fopen("票据.txt", "w")) == NULL)
{
printf("\t\t无法打开该文件!");
system("pause");
return;
}
fprintf(file, "\n");
for (i = 0; i < Tnum; i++)
if (strcmp(T[i].account, C[Dxiabiao].account) == 0)
{
fprintf(file, "** 交易类型:");
fprintf(file, " %s \n", T[i].type);
fprintf(file, "** 交易金额:");
fprintf(file, " %.2f \n", T[i].Tmoney);
fprintf(file, "** 交易余额:");
fprintf(file, " %.2f \n", T[i].Tyue);
fprintf(file, "** 您的账号:");
fprintf(file, " %s \n", T[i].account);
}
fprintf(file, "*******\n");
fclose(file);/关闭文件/
printf("\t\t打印成功!\n");
system("pause");
}

/*定义存款函数***********************/
void credit()
{
float money;/输入的存款金额/
system("cls");/清屏/
printf("\n\n\n\t\t存款————credit \n\n\n");/进入存款功能界面/
printf("\t\t本机只接收50元或100元币值人民币!\n");/提示信息/
printf("\n\t\t请输入存款金额:");
scanf("%f", &money);/输入存款金额/
if ((int)money % 50 != 0 || money <= 0)/存款金额必须为50的整数倍且为正数/
{
printf("\n\t\t请输入面值为50或100的存款金额!请勿输入负数或0!\n");
system("pause");
return;
}
strcpy(T[Tnum].account, C[Dxiabiao].account);/把当前登录账号复制给交易记录里的账号/
strcpy(T[Tnum].type, "存款");/复制交易类型/
T[Tnum].Tmoney = money;/把存款金额赋给交易金额/
C[Dxiabiao].yue += T[Tnum].Tmoney;/计算存款后的账户余额/
T[Tnum].Tyue = C[Dxiabiao].yue;/交易后的余额等于账户余额/
printf("\n\t\t存款成功!");
system("pause");
printf("\n账号 \t\t交易类型\t交易金额\t交易余额\n");//输出账户存款交易的数据清单
printf("%s", T[Tnum].account);
printf(" %s", T[Tnum].type);
printf("\t\t%.2f", T[Tnum].Tmoney);
printf("\t\t%.2f", T[Tnum].Tyue);
printf("\n");
Tnum++;/交易序号加一/
system("pause");
}

/定义取款函数***/
void debit()
{
float money;/定义取款金额/
system("cls");/清屏/
printf("\n\n\n\t\t取款————debit \n\n\n");/进入取款功能界面/
printf("\t\t本机只可取50或100元币值人民币!\n");
printf("\n\n\t\t请输入取款金额:");
scanf("%f", &money); /输入取款金额/
if (money> C[Dxiabiao].yue)/账户余额是否足够取款/
{
printf("\n\t\t您的余额不足!\n");
system("pause");
return;
}
if ((int)money % 50 != 0 || money <= 0)/取款金额必须为50的整数倍且为正数/
{
printf("\n\t\t请输入面值为50或100的存款金额!请勿输入负数或0!\n");
system("pause");
return;
}
strcpy(T[Tnum].account, C[Dxiabiao].account);/把当前登录账号复制给交易记录里的账号/
strcpy(T[Tnum].type, "取款");/复制交易类型/
T[Tnum].Tmoney = money;/取款金额值赋给交易金额/
C[Dxiabiao].yue -= T[Tnum].Tmoney;/计算取款后的账户余额/
T[Tnum].Tyue = C[Dxiabiao].yue;/取款后余额等于账户余额/
printf("\n\t\t取款成功!\n");
system("pause");
printf("\n账号 \t\t交易类型\t交易金额\t交易余额\n");//输出账户和交易的数据清单
printf("%s", T[Tnum].account);
printf(" %s", T[Tnum].type);
printf("\t\t%.2f", T[Tnum].Tmoney);
printf("\t\t%.2f", T[Tnum].Tyue);
printf("\n");
Tnum++;/交易序号加一/
system("pause");
}

/定义修改密码函数/
void updatepassword()
{
char password[7], newpassword1[7], newpassword2[7];
int j = 0;
printf("\n\n\t\t请输入原来的密码:");
scanf("%s", password);/输入旧密码/
if (strcmp(password, C[Dxiabiao].password) != 0)/判断旧密码正确与否/
{
printf("\n\t\t您的密码输入错误!\n");
system("pause");
return;
}
do
{
printf("\n\t\t请输入新密码:");
scanf("%s", newpassword1);
printf("\n\t\t请再一次输入新密码:");/输入两次新密码/
scanf("%s", newpassword2);
if (strcmp(newpassword1, newpassword2) != 0)/判断输入的两次新密码是否相等/
{
j++;
printf("\n\t\t您的密码输入错误!您还有%d次机会输入密码!\n", 3 - j);
}
if (j == 3)/新密码输入错误不得超过三次/
{
printf("密码修改未成功!\n");
system("pause");
return;
}
} while (strcmp(newpassword1, newpassword2) != 0);
strcpy(C[Dxiabiao].password, newpassword1);/拷贝新密码到账户信息里/
printf("\n\t\t您的密码修改成功!\n");
system("pause");
return;
}

/定义查询函数/
void quary()
{
for (;😉/空循环语句/
{
switch (quary_menu()) /查询界面选择判断/
{
case 1:quary_yue();break;/调用查询余额函数/
case 2:quary_mingxi();break; /调用查询明细函数/
case 3:quary_credit();break; /调用查询存款函数/
case 4:quary_debit();break;/调用查询取款函数/
case 0:return;
}
}
}
/定义查询菜单函数/
int quary_menu()
{
char c;
do
{
system("cls"); /每次选择运行前清屏/
printf("\n\n\n\t\t 欢迎进入 查询界面!\n\n"); /查询界面菜单选择/
printf("\t\t *| 1. 查询余额 |\n");
printf("\t\t | 2. 查询明细 |\n");
printf("\t\t | 3. 查询存款 |\n");
printf("\t\t | 4. 查询取款 |\n");
printf("\t\t | 0. 返回 |\n");
printf("\t\t
******************************\n");
printf("\t\t请作出选择(0-4)😊;
c = getchar(); /读入选择/
} while (c<'0' || c>'4');
return(c - '0'); /c变为空后返回重新选择/
}

/**************************定义查询余额函数**********************************/

void quary_yue()
{
printf("\n\n\t\t这是查询余额功能\n\n");
printf("\t\t您的账户余额为:%.2f\n\n", C[Dxiabiao].yue);/输出账户余额/
system("pause");
}

/定义查询明细函数**************/
void quary_mingxi()
{
int i;
system("cls");/清屏/
printf("\n\n\n\t\t查询明细————quary MINGXI\n\n");/进入查询明细界面/
printf("\n\t\t您的账号:%s", C[Dxiabiao].account);
printf("\n\n交易类型\t交易金额\t交易余额\n");//输出账户和交易的数据清单
for (i = 0; i<Tnum; i++)
if (strcmp(T[i].account, C[Dxiabiao].account) == 0)
{
printf(" %s", T[i].type);
printf("\t\t%.2f", T[i].Tmoney);
printf("\t\t%.2f", T[i].Tyue);
printf("\n");
}
system("pause");
}

/定义查询存款函数*********/
void quary_credit()
{
int i;
system("cls");
printf("\n\n\t\t查询存款————quary credit\n\n");
printf("\n\t\t您的账号:%s", C[Dxiabiao].account);
printf("\n\n交易类型\t交易金额\t交易余额\n");//输出账户和交易的数据清单
for (i = 0; i<Tnum; i++)
if (strcmp(T[i].account, C[Dxiabiao].account) == 0 && strcmp(T[i].type, "存款") == 0)
{
printf(" %s", T[i].type);
printf("\t\t%.2f", T[i].Tmoney);
printf("\t\t%.2f", T[i].Tyue);
printf("\n");
}
system("pause");
}

/定义查询取款函数*********/
https://img2020.cnblogs.com/blog/2205226/202011/2205226-20201119085307690-375977055.jpg
void quary_debit()
{
int i;
system("cls");
printf("\n\n\n\t\t查询取款————quary debit\n\n");
printf("\n\t\t您的账号:%s", C[Dxiabiao].account);
printf("\n\n交易类型\t交易金额\t交易余额\n");//输出账户和交易的数据清单
for (i = 0; i<Tnum; i++)/输出存款记录/
if (strcmp(T[i].account, C[Dxiabiao].account) == 0 && strcmp(T[i].type, "取款") == 0)
{
printf("%s", T[i].type);
printf("\t\t%.2f", T[i].Tmoney);
printf("\t\t%.2f", T[i].Tyue);
}
printf("\n");
system("pause");
}

https://img2020.cnblogs.com/blog/2205226/202011/2205226-20201119085246222-478441875.jpg
https://img2020.cnblogs.com/blog/2205226/202011/2205226-20201119085255442-1014780284.jpg
三.个人小结

小结
在这次的上机实验中,我找到了许多知识漏洞,学到了很多以前不懂的知识,以前认为自己已经懂了的知识点也理解更加深刻了,多样化的处理问题,才是成功之道。尤其是遇到自己当时不知道如何题目如何编写,通过自己的学习和同学的交流后,试编和改错,最后能够顺利的编写出来,带来了成就感。

(psp表格)

psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 45 60
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 30 15
Develpment 开发 150 178
Analyosis 需求分析(包括学习新技术) 40 30
Design Spec 生成设计文档 34 34
Design Review 设计复审 30 20
Coding Standard 代码规范 30 30
Design 具体设计 45 45

实验一
一、作业信息

这个作业属于哪个课程 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18
这个作业要求在哪里 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11516
这个作业的目标 能对需求进行分析并实现;编码格式规范;学习博客撰写
学号 3180701135
一.实验目的
1.了解软件开发文档的组织、标准及编写

2.了解常用工具的用途及掌握各种工具的安装

二.实验内容
1.了解GB8567-88,GB8567-2006的内容,掌握需求说明书、概要设计、详细说明书的主要内容

2.了解Visio的作用,安装Visio,按照实验指导使用Visio完成系统流程图、DFD图、业务流程图的绘制,掌握Visio的使用方法

3.了解Rational Rose,完成Rose(或starUML)的安装,了解Rose的主要界面及功能

三.实验步骤
1.了解GB8567-88,GB8567-2006的内容,重点阅读需求说明书、概要设计、详细说明书的主要内容,比较GB8567-88与

GB8567-2006在内容上有何不同

2.安装好Visio2003、rose2003(或者starUML)

3.利用Visio2003完成以下作业

【例一】

某装配厂有一个存放零件的仓库,仓库中现有的各种零件的数量及每种零件的库存量临界值等数据记录在库存清单主文件中。当仓
库中零件数量有变化时,应该及时修改库存清单主文件;如果哪种零件的库存量少于它的库存量临界值,则应该报告给采购部门以便

订货,规定每天向采购部门送一次订货报告。

该装配厂使用一台小型计算机处理更新库存清单主文件和产生订货报告的任务。零件库存量的每一次变化称为一个事务,由放在仓
库中的CRT终端输入到计算机中;系统中的库存清单程序对事务进行处理,更新存储在磁盘上的库存清单主文件,并且把必要的订货

信息写在磁带上。最后,每天由报告生成程序读一次磁带,并且打印出订货报告。

请用Visio绘制出系统流程图;

https://img2020.cnblogs.com/blog/2205226/202011/2205226-20201125144216864-1915507710.png
https://img2020.cnblogs.com/blog/2205226/202011/2205226-20201125144228647-1653906316.png
【例二】订货处理系统

利用Visio绘制如下图所示的数据流图
https://img2020.cnblogs.com/blog/2205226/202011/2205226-20201125144240925-999488501.png
【例三】车辆购置业务流程

利用Visio绘制如下图所示的业务流程图
https://img2020.cnblogs.com/blog/2205226/202011/2205226-20201125144251076-522456933.png
四、绘制机票预定系统的业务流程图
系统描述如下:

为了方便旅客,某航空公司拟开发一个机票预定系统。旅行社把预定机票的旅客信息(姓名、性别、工作单位、身份证号码、旅行

时间、旅行目的地等)输入该系统,系统为旅客安排航班,旅客在飞机起飞前一天凭取票通知和账单交款取票,系统核对无误即印出

机票给顾客。 请用分层数据流图描绘本系统的功能。

https://img2020.cnblogs.com/blog/2205226/202011/2205226-20201125144301818-1452809630.png
五、实验思考题
(1)使用Visio可以完成哪些类型图形的绘制?

我们可以使用VISIO绘制技术路线图、组织结构图、跨职能流程图、业务流程图、网络计划图、用例图、时序图等

(2)比较GB8567-88与GB8567-2006有哪些内容不同?

GB8567目前最新的版本是2006年发布的,88年的版本是已经作废的标准,GB8567-88是一份指导性文件,在一项计算机软件的开发过程中,一般地说,可产生十四种文件.
GB/T8567-2006原则上适用于各种类型的开发方法,GB/T8567-2006描述了文档编制过程,GB/T8567-2006给出25种文档的编制格式,GB8567-2006对软件的开发过程和管理过程应编制的主要文档及其编制的内容、格式规定了基本要求,原则上适用于所有类型的软件产品的开发过程和管理过程。

六、实验总结
大致了解Visio的使用,能熟练使用该软件完成系统流程图、DFD图、业务流程图的绘制,需要注意的是图形的方向,如果图形方向不正确会导致文字方向不正确从而无法达到美观的效果。

实验3
所在班级 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/
实验要求 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11621
实验目标 了解基于UML的面向对象分析与设计方法掌握类图、活动图、状态图、时序图的绘制方法。
学号 3180701135
一.实验目的

1、了解基于UML的面向对象分析与设计方法

2、掌握用例图的绘制、用例规约(文档)的编制

3、掌握类图、活动图、状态图、时序图的绘制方法

二、实验内容

1、参照实验指导书完成在线选课系统、或试卷自动生成系统,或人事信息管理系统的用例图、类图、活动图、状态图、时序图等的

绘制

【实例1】在线选课系统

大学教师选择本学期要教授的课程,每位教师最多只能上报 4 门课程。

教师选课结束后,教务管理人员进行协调和确认教师的课程,并创建本学期的课程目录表,向学生公布。

学生填写课程选修表,每个学生最多选修 4 门课程;每门选修课程的学生数最多为 10 人,最少为 3 人。人数达到 10 人时,停

止学生登记注册此门课程;

学生选课结束后,系统自动取消人数少于三人的课程。

学生按最终的课程表到财务处办理收费手续(billing system)。

教师可查询所教课程的学生花名册(roster)。

教务管理人员维护学生、教师和课程的信息。

【实例2】试卷自动生成系统

教师根据教学资料录入试题,并对其进行分类。待需要考试时,设置好一定的条件,系统就从题库中选中试题自动生成考试试卷

考试试卷生成系统的成卷模式应用智能出卷(由系统随机选题)和手工出卷(教师自己选择题目)两种组卷方式

【实例3】人事信息管理系统

参考:阿里巴巴钉钉智能人事系统

2、完成对教材订购系统,或飞机订票系统(根据自己的选题)面向对象的建模

三、实验步骤

1、熟悉Rational rose的绘图方法,阅读实验指导《使用 Rational Rose 进行 UML 可视化建模》,以及实验指导书实验十一与实

验十二

2、使用 Rational rose 完成在线选课系统、或试卷自动生成系统,或人事信息管理系统等的用例图、类图的绘制

3、使用 Rational rose 完成在线选课系统、或试卷自动生成系统,或人事信息管理系统等的活动图、状态图、时序图等的绘制

4、使用教材中用例描述模版描述在线选课系统的 Register for course 用例或试卷自动生成系统的自动组卷用例,或人事信息管理

系统等中的某个用例

5、为教材订购系统,或飞机订票系统等(根据自己的选题)绘制用例图,并分析某个用例为其绘制类图、时序图、活动图等

四 实验内容
使用 Rational Rose 创建执行者(Actors)
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095201741-1652551788.png
使用 Rational Rose 创建用例(Use Case)
使用 Rational Rose 创建主用例图(Main Use Case Diagram)
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095211988-284284855.png

使用 Rational Rose 创建活动(Activity)
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095226717-111073265.png
使用 Rational Rose 创建决策点(Decision Points)
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095232922-1913769581.png

相关的包和类以及简单类图
1.在 Rational Rose 的 Browser 框中创建类(Class)和包(Packages)
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095247142-1010939137.png
2.Rational Rose 中的主类图(Main Class Diagram)
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095254169-1135826852.png
3.在 Rational Rose 中创建包中的主类图(Package Main Class Diagram)
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095300146-1449918679.png
用例实现图(Use Case Realization Diagram)

https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095314333-1390765514.png
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095320934-1415324472.png
顺序图(Sequence Diagram)与合作图(Collaboration Diagram)
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095326689-1974641711.png

调整类之间的关系
1.使用 Rational Rose 创建关系(Relationship):
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095336216-1762472862.png
2.使用 Rational Rose 创建角色(Role)
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095347719-1490181360.png
3.增加多重度

4.创建包之间的关系
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095352652-260192224.png
5.在类中增加了属性和操作后对类图的影响
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095357658-457538573.png
6.使用 Rational Rose 创建一个有泛化关系的类图
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095402399-752569400.png
7.将有泛化关系的类图进行扩展
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095408597-1555423574.png
状态图(Statechart Diagram)
https://img2020.cnblogs.com/blog/2176029/202012/2176029-20201224095413775-2102186549.png

五 实验小结
通过本次实验,我了解并掌握了基于UML的面向对象分析与设计方法,用例图的绘制、用例规约(文档)的编制以及类图、活动图、状态图、时序图的绘制方法。

posted @ 2020-12-27 18:50  计算机181陶一源  阅读(179)  评论(0编辑  收藏  举报