小学数学练习、石头剪刀布游戏 课程设计说明书


设计题目

小学数学练习

问题描述

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

问题分析

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

②试题应包含四种数学运算:加、减、乘、除,它们是随机产生的。相邻的问题应该是不同的操作,每个操作必须至少出现一次。

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

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

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

⑥在屏幕上输出以下信息:

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

⑦成绩检查:从文件“record.txt”中列出该学生的所有历史成绩。

功能实现

测试实例及与运行结果

 

 

 

源程序清单

#include <string.h>

#include <stdio.h>

#include <time.h>

#include <math.h>

#include <windows.h>

int check(char ID[]);//ID格式检查

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

void read_file(char new_ID[]);//读取做题记录

char getSignal();//获取随机符号

int random(double start, double end);//获取随机数

int getResult(int num1,int num2,char signal);//获取正确答案

int check(char ID[]) //判断输入用户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[10];

int score,time;

FILE *fp; //定义一个名为fp的指针

fp=fopen("record.txt","r");  /*调用fopen()函数,参数"r"代表以只读方式打开。如果打开成功,则将文件起始位置的地址返回给fp指针,否则,返回NULL到fp指针。*/

if(fp==NULL)

    {

     printf("您还没有做题记录\n");

     exit(1); //表示异常退出,这个1是返回给操作系统的。

    }

     while(!feof(fp)){/*feof()是文件结束检测函数,如果没有结束,返回值是0,结束了是1;*/

     fscanf(fp,"%s\t%d\t%d秒\n",ID,&score,&time); /*从一个流中执行格式化输入,fscanf遇到空格或换行时结束*/

        if(strcmp(new_ID,ID)==0){  //strcmp()比较ID是否相等

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

}

}

    fclose(fp);

}

char getSignal(){ //随机产生运算符号

    char signal[4]={'+','-','*','/'};

    srand((unsigned)time(NULL)); /*把当前的时间作为种子,使程序每次运行产生不同的随机数序列*/

    return signal[rand()%4];

}

int random(double start, double end){//获取随机数

    return (int)(start+(end-start)*rand()/(RAND_MAX+ 1.0));

}

int getResult(int num1,int num2,char signal){//获取正确答案

    int res;

    switch(signal){

        case '+':

            res=num1+num2;break;

        case '-':

            res=num1-num2;break;

        case '*':

            res=num1*num2;break;

        case '/':

            res=num1/num2;break;

        default:

            res=0;

            printf("运算符不符合规则\n");

    }

    return res;

}

int main()

{

char ID[100];

int choice; //定义选择变量

int input;

srand((unsigned long)time(0)); /*用当前时间来设定rand函数所用的随机数产生演算法的种子值*/

clock_t start,end;  //定义时间变量

    while(1){

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

gets(ID);

int t = check(ID);//调用check()方法判断ID是否合法

        if (t == 1){

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

LOOP:

scanf("%d",&choice);

switch(choice)

{

  case 3:

printf("安全退出\n");

exit(1);

break;

  case 2:

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

read_file(ID);

printf("请选择:(1)继续测试(2)检查分数(3)退出\n");

goto LOOP;

break;

      case 1:{

int n1[10],n2[10],r1[10],r2[10]; /*存储num1,num2,signal,answer,getResult*/

int index,answer,num1,num2,score=0,i;

            char sign[10];

            char signal;

    printf("开始答题,每道题10分,总共100分\n");

            clock_t startTime;

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

    

               for(index=0;index<10;index++){

   

                if(index>=1){

             while(sign[index-1]==signal){ /*保证相邻运算的运算符不同*/ 

         signal=getSignal();

                        sign[index] = signal;

                              }

    }else{

                  signal=getSignal(); //获取第一次运算的运算符

                 sign[index] = signal;

        }

       

         do{  //保证参与运算的数字和结果都小于100且大于零

             num1=random(0,100);

             num2=random(1,100);

             if(num1<num2&&(signal=='-'||signal=='/')){

                 int temp=num1;

                 num1=num2;

                 num2=temp;

             }

             if(signal=='/') num1=(num1/num2)*num2; /*保证两个整数能整除*/

        }while((num1+num2)>=100||num1*num2>=100);

         printf("%d%c%d=",num1,signal,num2);

         scanf("%d",&answer);

         n1[index] = num1;

         n2[index] = num2;

         r1[index] = answer;

        r2[index] = getResult(num1,num2,signal);

       

         if(getResult(num1,num2,signal)==answer)     score+=10;

          }

        

           printf("总得分为%d\n",score);

       double time = (double)(clock()- startTime)/CLOCKS_PER_SEC;

       printf("解10道题用了%lf秒\n\n",time);

      //遍历数组中的做题记录

      printf("问题 | 您的答案 | 正确答案\n");

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

        printf("%3d%3c%3d=%7d%7d\n",n1[i],sign[i],n2[i],r1[i],r2[i]);

       }

      store(ID,score,time);

      printf("请选择:(1)继续测试(2)检查分数(3)退出\n");

  goto LOOP;

  break;

      }

}

        }else{

            printf("ID格式有误,请重新输入!\n");

        }

    }

}

 


设计题目

石头剪刀布游戏

问题描述

用 JAVA 语言设计如下界面的石头剪刀布游戏。游戏的一方点击界面上石头、剪刀、布按钮,游戏的另一方计算机随机选择,然后给出游戏结果。

问题分析

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

② 为程序添加菜单;至少 2 个菜单:结果显示方式和关于游戏;

结果显示方式菜单有 3 个菜单项:文本显示、图形显示、结束游戏;

实现菜单中的功能,自行搜索能体现石头、剪刀、布的图形或图片,用

这些图形或图片显示游戏结果。

功能实现

JMenuBar():创建菜单栏对象;

JMenu():创建菜单对象;

AddSeparator():在当前位置添加一条分割线;

removeAll():删除所有菜单中的所有菜单项;

JMenuItem():创建菜单项对象。

测试实例及与运行结果

 

 

 

源程序清单

package work;

//第一步,引用需要的包或类;

import java.awt.*; //引入抽象窗口工具类

import java.awt.event.*; //引入处理AWT组件触发的不同类型事件的接口和类;

import javax.swing.*; //引入处理图形界面的类包;

/*第二步,定义一个窗口类,并实现 ActionListener 接口,把需要的组件定义放到类里;*/

//定义一个窗口类,该类实现 ActionListener 接口;

public class work11 extends JFrame implements ActionListener{

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

static JPanel panel2 = new JPanel();

static JPanel panel1; //定义JPanel对象;

JLabel label,label1,label2; //定义JLabel对象;

//定义图形按钮

static JButton shitou2;

static JButton jiandao2;

static JButton bu2;

JLabel label3;

JMenu wMenu,aMenu;//定义菜单“结果显示方式”“关于游戏”

JMenuItem tMenuItem, pMenuItem,eMenuItem;/*定义菜单项“文本显示”“图形显示”“结束游戏”*/

//第三步,设置窗体;

public work11() {

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

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

setSize(350,350);/*设置窗体大小,修改窗体大小为:350×350;*/

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

panel1 =new JPanel();/*添加一个JPanel对象,名为panel1,方便布局;*/

panel1.setBackground(Color.yellow);/*设置panel1颜色为黄色;*/

shitou = new JButton("石头");/*添加一个JButton对象,名为shitou;*/

jiandao =new JButton("剪刀");/*添加一个JButton对象,名为jiandao;*/

bu = new JButton("布");//添加一个JButton对象,名为bu;

clear = new JButton("清空");/*添加一个JButton对象,名为clear;*/

//添加一个新的JPanel对象,名为panel2;

panel2.setBackground(Color.green);/*设置panel2颜色为绿色;*/

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

label1 = new JLabel();

      label2 =new JLabel();

//建立菜单

JMenuBar menuBar = new JMenuBar();

wMenu = new JMenu("结果显示方式");

aMenu = new JMenu("关于游戏");  

tMenuItem = new JMenuItem("文本显示");

pMenuItem = new JMenuItem("图形显示");

eMenuItem = new JMenuItem("结束游戏");

//图形显示

ImageIcon s = new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\石头.png");

shitou2 = new JButton(s);

ImageIcon j = new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\剪刀.png");

jiandao2 = new JButton(j);

ImageIcon b = new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\布.png");

bu2 = new JButton(b);

label3 = new JLabel("选择结果显示方式");

    //第五步,给所有 JButton 对象注册事件监听器;

shitou.addActionListener(this); /*给 shitou 添加事件监听器;*/

bu.addActionListener(this); //给 bu 添加事件监听器;

jiandao.addActionListener(this); /*给 jiandao 添加事件监听器;*/

clear.addActionListener(this); /*给 clear 添加事件监听器;*/

tMenuItem.addActionListener(this);

pMenuItem.addActionListener(this);

eMenuItem.addActionListener(this);

aMenu.addActionListener(this);

shitou2.addActionListener(this);          

jiandao2.addActionListener(this);

bu2.addActionListener(this);

/* 第六步,把所有新添加的对象都逐次放进窗体中,

 例如下面,先放进面板里面,然后再把面板放进窗体中,放置位置可以自定义;*/

panel1.add(shitou); //把 shitou 放进 panel1 中;

panel1.add(jiandao); //把 jiandao 放进 panel1 中;

panel1.add(bu); //把 bu 放进 panel1 中;

panel1.add(clear); //把 clear 放进 panel1 中;

panel2.add(label); //把 label 放进 panel2 中;

panel2.add(label1);//把 label1 放进 panel2 中;

panel2.add(label2);//把label2 放进panel2中;

panel2.add(label3);//把label3放入panel2中;

menuBar.add(wMenu);//把“结果显示方式”放入菜单栏

menuBar.add(aMenu);//把“关于游戏”放入菜单栏

wMenu.add(tMenuItem);/*给“结果显示方式”添加“文本显示”项*/

wMenu.add(pMenuItem);/*给“结果显示方式”添加“图形显示”项*/

wMenu.addSeparator();//添加工具栏分割线

wMenu.add(eMenuItem);/*给“结果显示方式”添加“结束游戏”项*/

add(panel1,BorderLayout.NORTH); /*把panel1添加到窗体的北面;*/

add(panel2,BorderLayout.CENTER); /*把panel2添加到窗体的中间;*/

add(menuBar,BorderLayout.SOUTH);/*把menuBar添加到窗体的南面;*/

shitou2.setBounds(0, 0, 25, 20);

       Image t1 = s.getImage().getScaledInstance(shitou2.getWidth(), shitou2.getHeight(), s.getImage().SCALE_DEFAULT);

       s = new ImageIcon(t1);

       shitou2.setIcon(s);

    

      jiandao2.setBounds(0, 0, 25, 20);

      Image t2 = j.getImage().getScaledInstance(jiandao2.getWidth(), jiandao2.getHeight(), j.getImage().SCALE_DEFAULT);

      j = new ImageIcon(t2);

      jiandao2.setIcon(j);

    

     bu2.setBounds(0, 0, 25, 20);

     Image t3 = b.getImage().getScaledInstance(bu2.getWidth(), bu2.getHeight(), b.getImage().SCALE_DEFAULT);

      b = new ImageIcon(t3);

      bu2.setIcon(b);

}

//第七步,实现 ActionListener 接口方法,使得按下按钮后执行方法里的代码;

/*实现 ActionListener 接口方法,当按下按钮就会调用该方法,可以称为事件响应器;*/

public void actionPerformed(ActionEvent e) {

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

int i=((int)(Math.random()*10))%3; /*定义一个 int 型变量 i,利用 Math.random()函数获取随机数,因为*10 所以随机数区间为[0,10),最后强制转换为 int 型,再除 3 取余,最后的赋值给 i;*/

   switch(i) //i 为 0 时就执行 case 0 操作,以此类推;

   {

 case 0 :label.setText("你出石头,电脑出石头,平局!");

 break; /*当 i=0 时,执行后续操作,到 break 结束;(必须要添加 break,不然会一直执行下去);*/

 case 1 :label.setText("你出石头,电脑出剪刀,恭喜你赢了!");

 break; //当 i=1 时,与上同理;

 case 2 :label.setText("你出石头,电脑出布,很遗憾你输了!");

 break; //当 i=2 时,与上同理;

   }

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

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

switch(i)

{

  case 0 :label.setText("你出剪刀,电脑出石头,很遗憾你输了!");

  break;

  case 1 :label.setText("你出剪刀,电脑出剪刀,平局!");

  break;

  case 2 :label.setText("你出剪刀,电脑出布,恭喜你赢了!" );

  break;

}

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

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

switch(i)

{

  case 0 :label.setText("你出布,电脑出布,平局!");

  break;

  case 1 :label.setText("你出布,电脑出石头,恭喜你赢了!");

  break;

  case 2 :label.setText("你出布,电脑出剪刀,很遗憾你输了!");

      break;

}

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

label.setText("");

label1.setText("You");

label2.setText("Computer");

ImageIcon img1 = new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\石头.png ");

label1.setIcon(img1);

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

    switch(i) {

  case 0:

label.setText("你出石头,电脑出石头,平局!");

label2.setIcon(new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\石头.png"));

break;

  case 1:

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

label2.setIcon(new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\剪刀.png"));

break;

  case 2:

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

label2.setIcon(new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\布.png"));

break;

    }

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

label.setText("");

label1.setText("You");

label2.setText("Computer");

ImageIcon img2 = new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\剪刀.png ");

label1.setIcon(img2);

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

    switch(i) {

  case 0:

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

label2.setIcon(new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\石头.png"));

break;

  case 1:

label.setText("你出剪刀,电脑出剪刀,平局!");

label2.setIcon(new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\剪刀.png"));

break;

  case 2:

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

label2.setIcon(new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\布.png"));

break;

          }

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

label.setText("");

label1.setText("You");

label2.setText("Computer");

ImageIcon img3 = new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\布.png ");

label1.setIcon(img3);

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

    switch(i) {

  case 0:

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

label2.setIcon(new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\石头.png"));

break;

  case 1:

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

label2.setIcon(new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\剪刀.png"));

break;

  case 2:

label.setText("你出布,电脑出布,平局!");

label2.setIcon(new ImageIcon("C:\\Users\\MR.LU\\Desktop\\课设\\布.png"));

break;

         }

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

{

label1.setText(" ");

label2.setText(" ");

label1.setIcon(null);

label2.setIcon(null);

label.setText("选择剪刀、石头、布开始游戏");

}

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

panel1.removeAll();

panel1.setVisible(true);

panel1.add(shitou); //把 shitou 放进 panel1中;

panel1.add(jiandao); //把 jiandao 放进 panel1 中;

panel1.add(bu); //把 bu 放进 panel1 中;

panel1.add(clear); //把 clear 放进 panel1 中;

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

panel1.removeAll();

panel1.add(bu2);  

panel1.add(jiandao2);

panel1.add(shitou2);

panel1.setVisible(true);

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

System.exit(0);

}

if(!((e.getSource() == shitou2) || (e.getSource() == jiandao2) || (e.getSource() == bu2))) {

JMenuItem source = (JMenuItem) (e.getSource());

label3.setText("你选择" + source.getText());

}

}

//第八步,添加主方法,进行测试;

public static void main(String args[]) {/*添加一个主函数,对窗体显示情况进行测试;*/

work11 frame = new work11(); //初始化窗体对象;

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

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

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值