几次实验报告补交

一、四则运算

include
include <string.h>
define size 10
using namespace std;

//含有一个二元算数式的三个值
typedef struct{
float x = 0,y = 0; //x,y为给定的随机数
float r = 0; //r为算数式结果
}Arithmetic;

Arithmetic choose(Arithmetic n);//选择函数,根据用户选择 识别将要进行的四则运算类型
float conversion(string input);//用户输入转换
bool judge(Arithmetic n);//结果判断
Arithmetic Addition();//加法运算
Arithmetic Subtraction();//减法运算
Arithmetic Multiplication();//乘法运算
Arithmetic Division();//除法运算

int main(int argc, const char * argv[]) {
int score = 0, cnt = 0;

// printf("请设置题目数量\n");
// scanf("%d",&cnt);

if (string(argv[1])=="-n") { //在terminals或者command中运行的时候,参数顺序存放在argv数组中
string c = argv[2];
cnt = stoi(c);
}

for (int i = 0; i<cnt; i++) {
Arithmetic t;
t = choose(t);
if (judge(t) == true) {
score+=10;
cout<<"恭喜您回答正确!\n";
} else {
cout<<"很抱歉您的答案不正确,再想想哦~\n";
}
}
printf("满分为:%d 您的得分为:%d分\n",cnt*10,score);

return 0;
}

//函数
//选择函数,根据用户选择识别将要进行的四则运算类型
Arithmetic choose(Arithmetic n){
int choose = 0;
cout<<"请选择您需要进行的四则运算类型\n"<<"1.加法\t2.减法\t3.乘法\t4.除法\n";
cin>>choose;
switch (choose) {
case 1:
n = Addition();
break;
case 2:
n = Subtraction();
break;
case 3:
n = Multiplication();
break;
case 4:
n = Division();
break;

default:
break;
}

return n;
}

//转译用户输入结果
float conversion(string input){
bool flag = false, sign = false;
//flag标记用户输入中是否存在/号,有/号则true否则false
//sign标记用户输入是否为负数,是负数则true否则false
float a = 0, b = 0, result = 0;
for (int i = 0; i<input.length(); i++) {
if (input[i] != '/' && input[i] != '-') {
int num = input[i]-'0'; //将char型转换为int型
if (!flag) { //若果flag为false,则说明还未遇到/号
a *= 10; //a记录/号前的数值
a += num;
} else {
b *= 10; //b记录/号后的数值
b += num;
}
} else if (input[i] == '/'){
flag = true;
} else {
sign = true;
}
}

if (flag && sign) { //既有/号,又是负值
result = -a/b;
} else if (flag && !sign){ //有/号,但为正值
result = a/b;
} else if (!flag && sign){ //没有有/号,但为负值
result = -a;
} else { //没有有/号,且为正值
result = a;
}
return result;
}

//判断对错函数
bool judge(Arithmetic n){
bool flag = false; //flag用于记录用户输入答案是否正确,正确return true,否则return false
string input;
cin>>input;
if (n.r == conversion(input))
flag = true;

return flag;
}

//Addition加法
Arithmetic Addition(){
Arithmetic n;
srand((unsigned)time(NULL));

if (rand()%2 == 0) {//若为0则进行整数四则运算,若为1则进行真分数的四则运算
n.x = rand()%size+1;
n.y = rand()%size+1;
n.r = n.x + n.y;
printf("%.0f + %.0f = ?\n",n.x,n.y);
} else {
float a,b,c,d;
a = rand()%size+1;
b = rand()%size+1;
c = rand()%size+1;
d = rand()%size+1;
if (a<b) { //需要保证数值是真分数
n.x = a/b;
} else if (ab){ //分子分母如果相同的话直接赋值为1
n.x = 1;
}else { //需要保证数值是真分数
n.x = b/a;
}
if (c<d) { //需要保证数值是真分数
n.y = c/d;
} else if (cd){ //分子分母如果相同的话直接赋值为1
n.y = 1;
}else { //需要保证数值是真分数
n.y = d/c;
}
n.r = n.x + n.y;

if (n.r0) { //结果为0说明两个真分数都是1/1
printf("%.0f + %.0f = ?\n",n.x,n.y);
} else if (n.x
1){ //仅有一个真分数,一个1/1
printf("%.0f + %.0f/%.0f = ?\n",n.x,c<d?c:d,c>d?c:d);
} else if (n.y==1){
printf("%.0f/%.0f + %.0f = ?\n",a<b?a:b,a>b?a:b,n.y);
} else { //除去其他可能,仅剩下两个数都是真分数的情况
printf("%.0f/%.0f + %.0f/%.0f = ?\n",a<b?a:b,a>b?a:b,c<d?c:d,c>d?c:d);
}
}

return n;
}

//Subtraction减法
Arithmetic Subtraction(){
Arithmetic n;
srand((unsigned)time(NULL));

if (rand()%2 == 0) {//若为偶数则进行整数四则运算,若为奇数则进行真分数的四则运算
n.x = rand()%size+1;
n.y = rand()%size+1;
n.r = n.x - n.y;
printf("%.0f - %.0f = ?\n",n.x,n.y);
} else {
float a,b,c,d;
a = rand()%size+1;
b = rand()%size+1;
c = rand()%size+1;
d = rand()%size+1;
if (a<b) {
n.x = a/b;
} else if (ab){
n.x = 1;
}else {
n.x = b/a;
}
if (c<d) {
n.y = c/d;
} else if (cd){
n.y = 1;
}else {
n.y = d/c;
}
n.r = n.x - n.y;

if (n.r0) {
printf("%.0f - %.0f = ?\n",n.x,n.y);
} else if (n.x
1){
printf("%.0f - %.0f/%.0f = ?\n",n.x,c<d?c:d,c>d?c:d);
} else if (n.y==1){
printf("%.0f/%.0f - %.0f = ?\n",a<b?a:b,a>b?a:b,n.y);
} else {
printf("%.0f/%.0f - %.0f/%.0f = ?\n",a<b?a:b,a>b?a:b,c<d?c:d,c>d?c:d);
}
}

return n;
}

//Multiplication乘法
Arithmetic Multiplication(){
Arithmetic n;
srand((unsigned)time(NULL));

if (rand()%2 == 0) {//若为偶数则进行整数四则运算,若为奇数则进行真分数的四则运算
n.x= rand()%size+1;
n.y= rand()%size+1;
n.r = n.x * n.y;
printf("%.0f * %.0f = ?\n",n.x,n.y);
} else {
float a,b,c,d;
a = rand()%size+1;
b = rand()%size+1;
c = rand()%size+1;
d = rand()%size+1;
if (a<b) {
n.x = a/b;
} else if (ab){
n.x = 1;
}else {
n.x = b/a;
}
if (c<d) {
n.y = c/d;
} else if (cd){
n.y = 1;
}else {
n.y = d/c;
}
n.r = n.x * n.y;

if (n.r0) {
printf("%.0f * %.0f = ?\n",n.x,n.y);
} else if (n.x
1){
printf("%.0f * %.0f/%.0f = ?\n",n.x,c<d?c:d,c>d?c:d);
} else if (n.y==1){
printf("%.0f/%.0f * %.0f = ?\n",a<b?a:b,a>b?a:b,n.y);
} else {
printf("%.0f/%.0f * %.0f/%.0f = ?\n",a<b?a:b,a>b?a:b,c<d?c:d,c>d?c:d);
}
}

return n;
}

//Division除法
Arithmetic Division(){ //除法不需要考虑两个整数的,没有意义,直接两个真分数的除法
Arithmetic n;
srand((unsigned)time(NULL));

float a,b,c,d;
a = rand()%size+1;
b = rand()%size+1;
c = rand()%size+1;
d = rand()%size+1;
if (a<b) {
n.x = a/b;
} else if (ab){
n.x = 1;
}else {
n.x = b/a;
}
if (c<d) {
n.y = c/d;
} else if (cd){
n.y = 1;
}else {
n.y = d/c;
}
n.r = n.x / n.y;

if (n.r0) {
printf("%.0f / %.0f = ?\n",n.x,n.y);
} else if (n.x1){
printf("%.0f / %.0f/%.0f = ?\n",n.x,c<d?c:d,c>d?c:d);
} else if (n.y==1){
printf("%.0f/%.0f / %.0f = ?\n",a<b?a:b,a>b?a:b,n.y);
} else {
printf("%.0f/%.0f / %.0f/%.0f = ?\n",a<b?a:b,a>b?a:b,c<d?c:d,c>d?c:d);
}

return n;
}

二、分析流程图与活动图的区别与联系

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

三、ATM管理系统

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

(1)开户,销户

(2)查询账户余额

(3)存款

(4)取款

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

二.代码提交

开户

public static void account()
{
System.out.print("请输入用户名:");
Scanner name1=new Scanner(System.in);
name=name1.nextLine();
System.out.print("请输入密码:");
Scanner passworld1=new Scanner(System.in);
passworld=passworld1.nextLine();
user.put(name,passworld);
message.put(name,0f);
System.out.println("开户成功");

}
销户

public static void selling()
{
System.out.print("请输入用户名:");
Scanner name1=new Scanner(System.in);
name=name1.nextLine();
System.out.print("请输入密码:");
Scanner passworld1=new Scanner(System.in);
passworld=passworld1.nextLine();
if(user.containsKey(name))
{
String mypassworld=user.get(name);
if(mypassworld.equals(passworld))
{
user.remove(name);
message.remove(name);
System.out.println("销户成功");
}
else
System.out.println("用户密码不正确");
}
else
System.out.println("不存在该用户");
}
余额查询

public static void inquire() {//余额查询
System.out.print("请输入用户名:");
Scanner name1=new Scanner(System.in);
name=name1.nextLine();
System.out.print("请输入密码:");
Scanner passworld1=new Scanner(System.in);
passworld=passworld1.nextLine();
if(user.containsKey(name))
{
String mypassworld=user.get(name);
if(mypassworld.equals(passworld)) {
amount=message.get(name);
System.out.printf("你的余额为:"+"%.2f",amount);
System.out.println();
}
else
System.out.println("用户密码不正确");
}
else
System.out.println("不存在该用户");
}
存款

public static void deposit() {//存款
System.out.print("请输入用户名:");
Scanner name1=new Scanner(System.in);
name=name1.nextLine();
System.out.print("请输入密码:");
Scanner passworld1=new Scanner(System.in);
passworld=passworld1.nextLine();
if(user.containsKey(name))
{
String mypassworld=user.get(name);
if(mypassworld.equals(passworld)) {
amount=message.get(name);
System.out.print("请输入存入的金额:");
Scanner money1=new Scanner(System.in);
float money=money1.nextFloat();
amount+=money;
message.put(name, amount);//把存取的金额存到哈希表中
System.out.printf("存款成功你的余额为:"+"%.2f",amount);
System.out.println();
}
else
System.out.println("用户密码不正确");
}
else
System.out.println("不存在该用户");
}
取款

public static void withdrawal() {//取款
System.out.print("请输入用户名:");
Scanner name1=new Scanner(System.in);
name=name1.nextLine();
System.out.print("请输入密码:");
Scanner passworld1=new Scanner(System.in);
passworld=passworld1.nextLine();
if(user.containsKey(name))
{
String mypassworld=user.get(name);
if(mypassworld.equals(passworld)) {
amount=message.get(name);
System.out.print("请输入取出的金额:");
Scanner money1=new Scanner(System.in);
float money=money1.nextFloat();
if(amount<money)
System.out.println("取款失败,余额不足");
else {
amount=amount-money;
message.put(name, amount);
System.out.printf("取款成功你的余额为:"+"%.2f",amount);
System.out.println();
}
}
else
System.out.println("用户密码不正确");
}
else
System.out.println("不存在该用户");
}
转账

public static void transfer() {//转账
System.out.print("请输入用户名:");
Scanner name1=new Scanner(System.in);
name=name1.nextLine();
System.out.print("请输入密码:");
Scanner passworld1=new Scanner(System.in);
passworld=passworld1.nextLine();
if(user.containsKey(name))
{
String mypassworld=user.get(name);
if(mypassworld.equals(passworld)) {
amount=message.get(name);
System.out.print("请输入转出的金额:");
Scanner money1=new Scanner(System.in);
float money=money1.nextFloat();
System.out.print("请输入要转入的账户:");
Scanner name2=new Scanner(System.in);
String name3=name2.nextLine();//要转入的账户
if(user.containsKey(name3)) {
if(amount<money) {
System.out.println("转账失败,余额不足");
}
else {
amount=amount-money;
message.put(name, amount);
message.put(name3, money);
System.out.printf("取款成功你的余额为:"+"%.2f",amount);
System.out.println();
}
}
else
System.out.println("要转入的账户不存在");
}
else
System.out.println("用户密码不正确");
}
else
System.out.println("不存在该用户");
}
https://img2020.cnblogs.com/blog/2204019/202011/2204019-20201119085635986-1930290117.png

四、第三次实验报告:

一.实验目的
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、为教材订购系统,或飞机订票系统等(根据自己的选题)绘制用例图,并分析某个用例为其绘制类图、时序图、活动图等
四、实验内容
在线选课系统
用例图(Use Case View)的建模
1、《在线选修课程管理系统》中的执行者(Actors)
1.1、注册选修课程的学生;
1.2、教授选修课程的教师;
1.3、教务管理人员必须汇总选修课程情况,制作课程表;
1.4、教务管理人员必须维护关于课程、教师和学生的所有信息;
1.5、财务管理系统从本系统中取出收费信息。

https://img2020.cnblogs.com/blog/2204019/202012/2204019-20201224204800342-1921506035.png
2、使用 Rational Rose 创建执行者(Actors)

https://img2020.cnblogs.com/blog/2204019/202012/2204019-20201224205036162-2033438123.png
3、《在线选修课程管理系统》中的用例(Use Case)
3.1注册选修课程(学生);
3.2选择教授的选修课程(教师);
3.3索取课程花名册(Roster)(教师);
3.4维护课程信息(教务管理人员);
3.5维护教师信息(教务管理人员);
3.6维护学生信息(教务管理人员);
3.7创建课程目录(教务管理人员);

4、使用 Rational Rose 创建用例(Use Case)

5、使用 Rational Rose 创建主用例图(Main Use Case Diagram)

https://img2020.cnblogs.com/blog/2204019/202012/2204019-20201224205137761-537160300.png

活动图(Activity Diagram)的建模(以建立选修课程目录表为例)
1、使用 Rational Rose 创建活动图(Activity Diagram)

2、使用 Rational Rose 创建活动(Activity)
https://img2020.cnblogs.com/blog/2204019/202012/2204019-20201224205245829-336553401.png

3、使用 Rational Rose 创建决策点(Decision Points)

https://img2020.cnblogs.com/blog/2204019/202012/2204019-20201224205333081-896443749.png
4、使用 Rational Rose 创建同步条(Synchronization Bar)

https://img2020.cnblogs.com/blog/2204019/202012/2204019-20201224205359057-1565760281.png

5.使用 Rational Rose 创建泳道( Swim lanes)
https://img2020.cnblogs.com/blog/2204019/202012/2204019-20201224205548467-1650106088.png

6、使用 Rational Rose 创建起始活动和终止活动
相关的包和类以及简单类图
1.在 Rational Rose 的 Browser 框中创建类(Class)

https://img2020.cnblogs.com/blog/2204019/202012/2204019-20201224205649202-1415109152.png
2.在 Rational Rose 的 Browser 框中创建包(Packages)

3.Rational Rose 中的主类图(Main Class Diagram)
https://img2020.cnblogs.com/blog/2204019/202012/2204019-20201224205658407-1232552941.png

4.在 Rational Rose 中创建包中的主类图(Package Main Class Diagram)

状态图(Statechart Diagram)
1.使用 Rational Rose 创建状态图(Statechart Diagrams)

https://img2020.cnblogs.com/blog/2204019/202012/2204019-20201224210023117-1523503401.png

2.使用 Rational Rose 创建状态转换(State Transitions)和增加状态转换的细节部分
https://img2020.cnblogs.com/blog/2204019/202012/2204019-20201224210004867-976417432.png

五、实验小结
通过这次实验,我学会了在Rational rose上绘制简单的类图、活动图、状态图、时序图,也对面向对象的系统分析有了更加深刻的理解。

posted @ 2020-12-27 19:15  萌萌哒的恩基爱  阅读(112)  评论(0编辑  收藏  举报