实验报告:小学数学练习、石头剪刀布游戏

课设格式要求
1.目录两字间空一格 自动生成目录
2.字体正文宋体小四 小标题宋体小三 
3.添加的流程图必须为传统流程图格式 
4.各图表下必须有序号以及图片名称 字号要求为宋体5号 eg:图1.1 小学数学练习流程图 图1.2小学数学练习运行结果
5.注意正文左对齐 以及缩进

1.1 设计题目

编写一个帮助小学生练习数学的程序,帮助小学生练习 100 以内的四种数学运算:加、减、乘、除。

a) 程序应先询问用户的 ID 号(ID 号包括两个大写字母和 4 位数字),例如:

请输入用户 ID 号:AB1234

程序应对输入的 ID 号验证,符合 ID 号要求的格式,然后程序提示三种选择:

(1)开始测试

(2)检查分数

(3)退出

b) 测试:该程序将给出 10 道数学题,例如:

12 * 3 =36

48 + 32 =80

56 / 28 =2

注意:

i)学生将依次回答每一个问题(在等于号后面给出答案),然后给出下一道题。

ii)试题应包含四种数学运算:加、减、乘、除,它们是随机产生的。相邻的问题应该是不同的操作,

每个操作必须至少出现一次。报告中应给出实现方法或算法

iii)为每道题随机生成数字,但必须确保参与运算的数字和结果都小于 100 且大于零的整数,除法时

还要注意两个整数要能整除。报告中应给出实现方法或算法

iv)十道题做完后,记录学生完成这十道题所用的时间。

v)给每个学生一个分数。将该学生的 ID、成绩和使用时间保存到一个名为 record.txt 的文件中。

vi)在屏幕上输出以下信息:(3 列信息,第 1 列是 b)中的测试题,蓝色部分)

问题 | 正确答案 | 你的答案

c) 成绩检查:从文件“record.txt”中列出该学生的所有历史成绩(其他学生的不显示)。例如:

你以前的记录是:

AB1234 80 150 秒

AB1234 50 182 秒

AB1234 90 98 秒

1.2 问题描述

编写一个帮助小学生练习数学的程序,帮助小学生练习 100 以内的四种数学运算:加、减、乘、除。

1.3 问题分析

用c语言,按以下顺序进行代码实现:

(1)用循环语句判断输入用户名是否合法

(2)用文件指针存储ID、成绩、答题时间

(3)用文件和if else/读取以前的记录

(4)记录答题时间,用0调用时间函数time(),将其返回值强制转换为unsigned型,作为参数来调用srand( )函数。

(5)用switch语句随机产生数学计算

1.4流程图

小学数学练习流程图如图1.1所示。

图1.1 小学数学练习流程图

1.5 功能实现

(1)实现了相邻问题是不同操作(加减乘除)

(2)实现参与运算的数字和结果都为0到100之间的整数,对于除法能整除

(3)记录计算十道题的时间

(4)保存一个学生的成绩

1.6 测试实例及运行结果

小学数学练习的测试实例及运行结果如下图。

图1.2 小学数学练习测试实例及运行结果

1.7 源程序清单

小学数学练习的源程序清单如下所示。

#include

#include

#include

#include

#include

int check(char ID[]) //判断输入用户名是否合法

{

int j=0,k=0;

char *p;

p=ID;

while(*p!='\0') //字符串存储时后面自动补0

{

if((*p>='A')&&(*p<='Z'))

j++;

else if((*p>='0')&&(*p<='9'))

k++;

p++;

}

return (j==2&&k==4?1:0);

}

void store(char ID[],int score,int time){ //存储ID、成绩、答题时间

FILE *fp;

    fp=fopen("record.txt","a+");  //a+只打开,不新建新的文件

    if(fp==NULL)

    {

     fp=fopen("record.txt","w");

    }

  fprintf(fp,"%s\t%d\t%d秒\n",ID,score,time);

    fclose(fp);

}

void read_file(char new_ID[]){ //读取以前的记录

char ID[100];

int score,time;

FILE *fp;

    fp=fopen("record.txt","r");

    if(fp==NULL)

    {

     printf("新玩家,没有做题记录\n");

     exit(1);

    }

     while(!feof(fp)){

     fscanf(fp,"%s\t%d\t%d秒\n",ID,&score,&time);

        if(strcmp(new_ID,ID)==0){

     printf("%s\t%d\t%d秒\n",ID,score,time);

}

}

    fclose(fp);

}

int main()

{

char ID[100];

srand((unsigned long)time(0));

clock_t start,end;  

int w=0,j=0,k=0;

char t;

int a,b,c,d,score,i;

while(!k){

printf("请输入用户ID号:");

gets(ID);

k=check(ID);

if(k==0)

printf("ID不规范,Input again\n");

}

printf("ID:%s通过检查\n请玩家请做好准备,即将开始旅程\n",&ID);

printf("输入提示:\n(1)开始测试\n(2)检查分数\n(3)退出\n");

LOOP:

scanf("%d",&w);

switch(w){

case 3:

printf("游戏结束\n");

printf("等待下次见面\n");

exit(1);

break;

case 2:

printf("你以前的记录是:\n");

read_file(ID);

printf("输入提示:\n(1)继续测试\n(2)检查分数\n(3)退出\n");

goto LOOP;

break;

case 1:

char answer[10][100];

j=0;  //必须重新复制为0,要不第二次时会因判断跳过做题循环

start=0;

end=0;

start = clock(); //计时开始

while(w==1&&j<10){ //10道加减乘除题目

a=rand()%101;

b=rand()%101;

c=rand()%4;

switch(c)    

{

case 3:t='/',d=a/b;break;

case 2:t='*',d=a*b;break;

case 1:t='-',d=a-b;break;

case 0:t='+',d=a+b;break;

}

printf("%d%c%d=",a,t,b);

scanf("%d",&c);

sprintf(answer[j],"%d%c%d|%d|%d",a,t,b,d,c); //直接输入数组一行

  if(c==d)

{

printf("正确!+10分\n");

score+=10;

}else

printf("错啦~\n");

j++;

}

end = clock();  //计时结束

int time=(int)(end-start)/CLOCKS_PER_SEC;

printf("答题结束\n");

printf("玩家分数为:%d,所用时间为%ds\n",score,time);

printf("输出:问题 | 正确答案 | 你的答案\n");

for(int i=0;i<10;i++){

puts(answer[i]);

}

store(ID,score,time);

printf("输入提示:\n(1)继续测试\n(2)检查分数\n(3)退出\n");

goto LOOP;

break;

}



}

补充说明://FILE*fp是声明,声明fp是指针,用来指向FILE类型的对象。*fp是指向文件结构体的指针变量,通过fp可找到存放某个文件信息的结构变量,根据这个结构变量的信息找到该文件,实施对文件的操作。fp通常被成为一个指向文件的指针。

//a+只打开,不新建新的文件 以追加的方式打开文件,并且可以读文件。打开文件后,文件的读指针指向文件头,而写指针指向文件的最后。可以通过fseek函数移动读指针,但是移动写指针不会生效,写指针一直指向文件的最后。

//"file.txt"是文件名;"w"是只写的意思;如果这个文件的内容为空,就是什么都没有的话,则执行下面的输出语句!

//"r"代表以只读方式打开。如果打开成功,则将文件起始位置的地址返回给fp指针,否则,返回NULL到fp指针。//关闭所有文件,终止正在执行的进程。exit(1)表示异常退出,这个1是返回给操作系统的。exit(x)(x不为0)都表示异常退出。exit(0)表示正常退出。

 //fp为文件句柄,feof为判断是否读到文件尾,! 为非while(!feof(fp))就是当条件为不是文件尾时均执行后续代码。

 //strcmp(a, b)这是一个字符串比较函数, 如果a的字符串内容与b的字符串内容相同的话,strcmp == 0

//用0调用时间函数time(),将其返回值强制转换为unsigned型,作为参数来调用srand( )函数。

//srand( )是为rand( )函数初始化随机发生器的启动状态,以产生伪随机数,所以常把srand( )称为种子函数。用time()返回的时间值做种子的原因是time()返回的是实时时间值,每时毎刻都在变化,这样产生的伪随机数就有以假乱真的效果。

//rand()就是随机函数。rand()%101的含义是随机0-100之间的数字,如果是rand()%n,就是随机0~(n-1)之间的数字。

二.石头剪刀布游戏

1.1 设计题目

用 JAVA 语言设计如下界面的石头剪刀布游戏。游戏的一方点击界面上石头、剪刀、布按钮,游戏的

另一方计算机随机选择,然后给出游戏结果。

1.2 问题描述

利用Java设计出一个能实现石头剪刀布的一个游戏,并能利用图片等表示出结果 

1.3 问题分析

利用所学的窗口知识进行代码的实现,并设计出菜单的功能, 进行实现能运行出相关的图片与结果

1.4 流程图

石头剪刀布游戏流程图如图1.3所示。

图1.3 石头剪刀布游戏流程图

1.5 功能实现

1. 在“//”后给出必要的注释;

2. 为程序添加菜单;至少 2 个菜单:结果显示方式和关于游戏;结果显示方式菜单有 3 个菜单项:文本 显示、图形显示、结束游戏;实现菜单中的功能,自行搜索能体现石头、剪刀、布的图形或图片,用这些图形或图片显示游戏结果。

1.6 测试实例及运行结果

石头剪刀布游戏测试实例及运行结果如下图所示。

图1.3 石头剪刀布游戏测试实例及运行结果

1.7 源程序清单

石头剪刀布游戏的源代码清单如下所示。

package FingerGuess;

import java.awt.*; //引入抽象窗口工具包 setVisible BorderLayout JFrame 继承

import java.awt.event.*; //引入事件处理机制 panel ActionListener  Actionevent

import javax.swing.*;//引入swing 组件 设置窗口 setDefaultCloseOperation  setText(JLabel)组件

//第二步,定义一个窗口类,并实现 ActionListener 接口,把需要的组件定义放到类里为了方便调用;



public class work11 extends JFrame  {

/*这涉及到序列化机制的问题,序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。

 当把对象写进流里就会根据此机制生成一个相应的序号,从流里读取对象时就根据这个序号来检查对象的完整性,

 生成序号的过程有点繁琐,而当你在一个实现了serializable的类里声明一个static final serialVersionUID的long型常量以后,

 序列化机制就不会计算它的序号了,而是直接使用这个常量作为以后提取对象的依 */



//如果不添加这两个字段会有程序警告:serializable 类 work11 未声明类型为 long 的静态终态 serialVersionUID 字段

private static long xxxxxxL;

private static final long serialVersionUID = xxxxxxL;

JButton jiandao,shitou,bu,clear; //定义 JButton 对象;

JPanel panel2,panel1; // 定义 JPanel 对象

JLabel label; // 定义JLabel对象

//设置窗体。构造函数

public work11() {

setTitle("石头剪刀布游戏"); //设置窗体标题,修改标题为“石头剪刀布游戏”;

setLocation(250,250); //设置窗6体左上顶点坐标;- 4 -

setSize(400,350); //设置窗体大小,修改窗体大小为:350×350; 这里为例方便之后的图形显示,我将长度改为了400px。

//根据需求建立对象,这里只需要 4 个 JButton 对象,2 个 JPanel 对象,1 个 JLabel 对象;

panel1 =new JPanel(); // 实例化JPanel对象

panel1.setBackground(Color.yellow); // 修改panel1的背景颜色 黄色

shitou = new JButton("石头"); // 实例化 Jbutton 对象

jiandao =new JButton("剪刀"); //实例化 Jbutton 对象

bu = new JButton("布"); //实例化 Jbutton 对象

clear = new JButton("清空"); //实例化 Jbutton 对象

panel2=new JPanel(); // 实例化 JPanel2 对象

panel2.setBackground(Color.green); // 修改JPanel2 背景颜色 为绿色

label =new JLabel("选择剪刀、石头、布开始游戏"); // 新建一个Jlabel对象

//设置按钮大小

shitou.setPreferredSize(new Dimension(80,40));

jiandao.setPreferredSize(new Dimension(80,40));

bu.setPreferredSize(new Dimension(80,40));

clear.setPreferredSize(new Dimension(80,40));

//给所有 JButton 对象注册事件监听器;

shitou.addActionListener(new jbutton());     //在事件触发后,调用actionPerformed 做相应处理

jiandao.addActionListener(new jbutton()); //这里的this 指的是 本类中的成员方法(事件处理机制)

bu.addActionListener(new jbutton());

clear.addActionListener(new jbutton());



// 把所有的新添加的对象都放进去窗体里面,先放进组件类,再放进窗体类

panel1.add(shitou);//JPanel 默认布局 FlowLayOut 一直水平排列按钮。窗口大小不合适,可能会导致按钮无法显示

panel1.add(jiandao);

panel1.add(bu);

panel1.add(clear);

panel2.add(label);

//定义 panel1 和panel2的 位置

add(panel1, BorderLayout.NORTH); //JFrame类 继承的方法 用于添加组件  

add(panel2, BorderLayout.CENTER);//该语法 相当于 this.add  this 指的是窗体



//创建菜单

 JMenuBar menuBar = new JMenuBar();// 创建菜单栏对象

 setJMenuBar(menuBar);// 将菜单栏对象添加到窗体的菜单栏中



 JMenu menu1 = new JMenu("结果显示方式");// 创建菜单对象

     menuBar.add(menu1);// 将菜单对象添加到菜单栏对象中

     

     JMenuItem menuItem1 = new JMenuItem("文本显示");// 创建菜单项对象

     menuItem1.addActionListener(new ItemListener());// 为菜单项添加事件监听器

     menu1.add(menuItem1);// 将菜单项对象添加到菜单对象中

     

     JMenuItem menuItem2 = new JMenuItem("图形显示");// 创建菜单项对象

     menuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器

     menu1.add(menuItem2);// 将菜单项对象添加到菜单对象中

     

     JMenuItem menuItem3 = new JMenuItem("结束游戏");// 创建菜单项对象

     menuItem3.addActionListener(new ItemListener());// 为菜单项添加事件监听器

     menu1.add(menuItem3);// 将菜单项对象添加到菜单对象中

     

     JMenu menu2 = new JMenu("关于游戏");// 创建菜单对象

     menuBar.add(menu2);// 将菜单对象添加到菜单栏对象中

     

     JMenuItem menuItem4 = new JMenuItem("小帅工作室");

   //menuItem4.addActionListener(new ItemListener());// 为菜单项添加事件监听器

     menu2.add(menuItem4);// 将菜单项对象添加到菜单对象中

     

     JMenuItem menuItem5 = new JMenuItem("联系方式:");

   //menuItem5.addActionListener(new ItemListener());// 为菜单项添加事件监听器

     menu2.add(menuItem5);// 将菜单项对象添加到菜单对象中

     

     JMenuItem menuItem6 = new JMenuItem("QQ:88888");

   //menuItem6.addActionListener(new ItemListener());// 为菜单项添加事件监听器

     menu2.add(menuItem6);// 将菜单项对象添加到菜单对象中

}

boolean flag = true;

//jbutton实现 ActionListener 接口方法,使得按下按钮后执行方法里的代码 可以称为事件响应器;

public class jbutton implements ActionListener{

public void actionPerformed(ActionEvent e) {

int i = ((int)(Math.random()*10))%3;

//System.out.print(i + " ");测试点击按钮是否正确相应代码

if(flag) {

if(e.getSource() == shitou) {

//int i = ((int)(Math.random()*10))%3;//电脑随机出拳  0代表石头 1代表剪刀 2代表布

switch(i) {

case 0:

label.setText("你出石头,电脑出石头,平局!"); //label 显示文本

break;

case 1:

label.setText("你出石头,电脑出剪刀,恭喜你赢了!");//label 显示文本

break;

case 2:

label.setText("你出石头,电脑出布,很遗憾你输了!");//label 显示文本

break;

}

}else if(e.getSource() == jiandao){

//int i = ((int)(Math.random()*10))%3;//电脑随机出拳  0代表石头 1代表剪刀 2代表布

switch(i) {

case 0:

label.setText("你出剪刀,电脑出石头,很遗憾你输了!");//label 显示文本

break;

case 1:

label.setText("你出剪刀,电脑出剪刀,平局!");//label 显示文本

break;

case 2:

label.setText("你出剪刀,电脑出布,恭喜你赢了!");//label 显示文本

break;

}

}else if(e.getSource() == bu){

//int i = ((int)(Math.random()*10))%3;//电脑随机出拳  0代表石头 1代表剪刀 2代表布

switch(i) {

case 0:

label.setText("你出布,电脑出石头,恭喜你赢了!");//label 显示文本

break;

case 1:

label.setText("你出布,电脑出剪刀,很遗憾你输了!");//label 显示文本

break;

case 2:

label.setText("你出布,电脑出布,平局!");//label 显示文本

break;

}

}else if(e.getSource() == clear) {

label.setText("选择剪刀, 石头, 布开始游戏!");//label 显示文本

}

}else {

if(e.getSource() == shitou) {

//int i = ((int)(Math.random()*10))%3;//电脑随机出拳  0代表石头 1代表剪刀 2代表布

switch(i) {

case 0:

label.setIcon(new ImageIcon("C:/FingerGuess/shitouequalshitou.png")); //label 显示图片

label.setText("");//设置文本为空

break;

case 1:

label.setIcon(new ImageIcon("C:/FingerGuess/shitouwinjiandao.png"));//label 显示图片

label.setText("");//设置文本为空

break;

case 2:

label.setIcon(new ImageIcon("C:/FingerGuess/shitoudefeatbu.png"));//label 显示图片

label.setText("");//设置文本为空

break;

}

}else if(e.getSource() == jiandao){

//int i = ((int)(Math.random()*10))%3;//电脑随机出拳  0代表石头 1代表剪刀 2代表布

switch(i) {

case 0:

label.setIcon(new ImageIcon("C:/FingerGuess/jiandaodefeatshitou.png"));//label 显示图片

label.setText("");//设置文本为空

break;

case 1:

label.setIcon(new ImageIcon("C:/FingerGuess/jiandaoequaljiandao.png"));//label 显示图片

label.setText("");//设置文本为空

break;

case 2:

label.setIcon(new ImageIcon("C:/FingerGuess/jiandaowinbu.png"));//label 显示图片

label.setText("");//设置文本为空

break;

}

}else if(e.getSource() == bu){

//int i = ((int)(Math.random()*10))%3;//电脑随机出拳  0代表石头 1代表剪刀 2代表布

switch(i) {

case 0:

label.setIcon(new ImageIcon("C:/FingerGuess/buwinshitou.png"));//label 显示图片

label.setText("");//设置文本为空

break;

case 1:

label.setIcon(new ImageIcon("C:/FingerGuess/budefeatjiandao.png"));//label 显示图片

label.setText("");//设置文本为空

break;

case 2:

label.setIcon(new ImageIcon("C:/FingerGuess/buequalbu.png"));//label 显示图片

label.setText("");//设置文本为空

break;

}

}else if(e.getSource() == clear) {

label.setText("选择剪刀, 石头, 布开始游戏!");//label 显示文本

label.setIcon(new ImageIcon("C:/FingerGuess/white.png"));//设置显示图片为空

}

}

}

}

//ItenListener 实现ActionListener接口,用于给菜单栏添加事件处理机制

public class ItemListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

//JMenuItem menuItem = (JMenuItem) e.getSource();

//System.out.println("您单击的是菜单项:" + menuItem.getText());测试点击菜单按钮是否有相应的过程代码

if(e.getActionCommand().equals("图形显示")) {

ImageIcon icon1 = new ImageIcon("C:/FingerGuess/shitou.png");//实例化图片对象

ImageIcon icon2 = new ImageIcon("C:/FingerGuess/jiandao.png");

ImageIcon icon3 = new ImageIcon("C:/FingerGuess/bu.png");

 ImageIcon icon4 = new ImageIcon("C:/FingerGuess/clear.jpg");

 icon1.setImage(icon1.getImage().getScaledInstance(40,40,0));//设置图片大小 ,适配按钮大小

   icon2.setImage(icon2.getImage().getScaledInstance(40,40,0));

   icon3.setImage(icon3.getImage().getScaledInstance(40,40,0));

icon4.setImage(icon4.getImage().getScaledInstance(40,40,0));

shitou.setText("");//修改按钮文本为空

jiandao.setText("");

bu.setText("");

clear.setText("");

shitou.setIcon(icon1);//给按钮添加图片

jiandao.setIcon(icon2);

bu.setIcon(icon3);

clear.setIcon(icon4);

//修改label 显示图形

flag = false;//修改flag 改变显示效果

}

if(e.getActionCommand().equals("文本显示")) {

  shitou.setText("石头");

  jiandao.setText("剪刀");

  bu.setText("布");

  clear.setText("清空");

  shitou.setForeground(Color.black);

  jiandao.setForeground(Color.black);

  bu.setForeground(Color.black);

  clear.setForeground(Color.black);

  ImageIcon icon1 = new ImageIcon("C:/FingerGuess/white.png");

  icon1.setImage(icon1.getImage().getScaledInstance(1,1,0));

  shitou.setIcon(icon1);

 jiandao.setIcon(icon1);

  bu.setIcon(icon1);

  clear.setIcon(icon1);

  //修改label 显示文本

  flag = true;//修改flag 改变显示方式

  label.setIcon(new ImageIcon("C:/FingerGuess/white.png"));//设置显示图片为空

    label.setText("选择剪刀, 石头, 布开始游戏!");//设置文本显示文字

    }

   if(e.getActionCommand().equals("结束游戏")) {

    System.exit(0);//退出

   }

    }

    }

//主函数 测试

public static void main(String[] args) {

work11 frame = new work11(); //声明并实例化对象

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     // 设置窗体关闭按钮

frame.setVisible(true);                                  // 使窗体可见

}

}

你可能感兴趣的:(eclipse,java)