1.小学数学练习
1.1 设计题目:小学数学练习
1.2 问题描述:
编写一个帮助小学生练习数学的程序,帮助小学生练习 100 以内的四种数学运算:加、减、乘、除。
1.3 问题分析:
a) 程序应先询问用户的 ID 号(ID 号包括两个大写字母和 4 位数字)
程序应对输入的 ID 号验证,符合 ID 号要求的格式,然后程序提示三种选择:
(1)开始测试
(2)检查分数
(3)退出
b) 测试:该程序将给出 10 道数学题
注意:
i)学生将依次回答每一个问题(在等于号后面给出答案),然后给出下一道题。
ii)试题应包含四种数学运算:加、减、乘、除,它们是随机产生的。相邻的问题应该是不同的操作,
每个操作必须至少出现一次。报告中应给出实现方法或算法。
iii)为每道题随机生成数字,但必须确保参与运算的数字和结果都小于 100 且大于零的整数,除法时
还要注意两个整数要能整除。报告中应给出实现方法或算法。
iv)十道题做完后,记录学生完成这十道题所用的时间。
v)给每个学生一个分数。将该学生的 ID、成绩和使用时间保存到一个名为 record.txt 的文件中。
vi)在屏幕上输出以下信息:(3 列信息,第 1 列是 b)中的测试题,蓝色部分)
问题 | 正确答案 | 你的答案 c) 成绩检查:从文件“record.txt”中列出该学生的所有历史成绩(其他学生的不显示)。
1.5 测试实例及运行结果:
1.6 源程序清单:
#include <time.h>//时间库函数
#include <stdlib.h>//标准输入输出头文件
#include <stdio.h>//输入输出函数
#include <windows.h>//写windows的重要头文件
#include <shlwapi.h>//定义控制台应用程序的入口点
//判断用户名是否合法
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[10];
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(j<10){ //10道加减乘除题目
a=rand()%101;
b=rand()%101;
c=rand()%4;
switch(c)
{
case 3:t[i]='/';break;
case 2:t[i]='*';break;
case 1:t[i]='-';break;
case 0:t[i]='+';break;
}
if(i>0){ //数,剔,积,记后发现同数组法概率同,则概率分布亦。NICE
while(t[i]==t[i-1]){ //或temp函数goto
c=rand()%4;
switch(c){
case 3:t[i]='/';break;
case 2:t[i]='*';break;
case 1:t[i]='-';break;
case 0:t[i]='+';break;}
}
}
if(i>7){int m,n=0;
while(i<8){int k,m,n=0;
if(t[k]==t[0]) m++;
if(t[k]==t[1]) n++;}
if((m+n)==8){
while(t[i]==t[0]||t[i]==t[1]){
c=rand()%4;
switch(c){
case 3:t[i]='/';break;
case 2:t[i]='*';break;
case 1:t[i]='-';break;
case 0:t[i]='+';break;}
}
if(i>8){
while(t[i]==t[0]||t[i]==t[1]||t[i]==t[8]){
c=rand()%4;
switch(c){
case 3:t[i]='/';break;
case 2:t[i]='*';break;
case 1:t[i]='-';break;
case 0:t[i]='+';break;}
}
}
}
}
switch(c) //case里continue 更好
{
case 3:while(a%b!=0) a=rand()%101,b=rand()%101,d=a/b; break;
case 2:while(a*b>100) a=rand()%101,b=rand()%101,d=a*b; break;
case 1:while(a-b<0) a=rand()%101,b=rand()%101,d=a-b; break;
case 0:while(a+b>100) a=rand()%101,b=rand()%101,d=a+b; break;
}
printf("%d%c%d=",a,t[i],b);
scanf("%d",&c);
sprintf(answer[j],"%d%c%d\t%d\t %d",a,t[i],b,d,c); //直接输入数组一行
if(c==d)
{
printf("正确!+10分\n");
score+=10;
}else
printf("错啦~\n");
j++;
i++;
}
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;
}
}
2. 石头剪刀布游戏
2.1 设计题目:石头剪刀布游戏
2.2 问题描述:
用 JAVA 语言设计如下界面的石头剪刀布游戏。游戏的一方点击界面上石头、剪刀、布按钮,游戏的 另一方计算机随机选择,然后给出游戏结果。
2.3 问题分析:
准确性:在实现过程中,我们要考虑到如何去判断,准确地知道哪方是赢家
简洁性:在实现过程中,我们要考虑到,怎样使游戏界面更简洁
使用GUI布局,创建两个面板,四个按钮,每个按钮添加事件监听器,使用随机函数判断电脑的结果,设置窗体的大小,位置。按钮和面板在窗体中的位置,设置面板的背景颜色。定义事件的接口方法使按钮能对事件做出反应。
2.4 功能实现:
1. 在“//”后给出必要的注释;
2.为程序添加菜单;至少 2 个菜单:结果显示方式和关于游戏;结果显示方式菜单有 3 个菜单项:文本 显示、图形显示、结束游戏;实现菜单中的功能,自行搜索能体现石头、剪刀、布的图形或图片,用 这些图形或图片显示游戏结果。
2.5 测试实例及运行结果:
2.6 源程序清单:
package shitoujidanobu;
import java.awt.*;//引入抽象窗口工具类包
import java.awt.event.*;//引入事件
import javax.swing.*;//引入组件
//定义一个窗口类,该类实现 ActionListener 接口;
public class shitoujiandaobu extends JFrame implements ActionListener{
JButton shitou,jiandao,bu,clear; //定义 JButton 对象
JPanel north,center,west,east,south; //定义 JPanel 对象
JLabel label,imgLabel1,imgLabel2,label2; // 定义JLable 对象
JMenuBar mbar;
JMenu show;
JMenuItem text,image,end,about;
JDialog dlg;
//石头剪刀布的图片路径
static String STPATH = "D:\\桌面\\图片\\s.jpg",JDPATH = "D:\\桌面\\图片\\j.jpg",BUPATH="D:\\桌面\\图片\\b.jpg";
int status = 0;
public shitoujiandaobu() {
setTitle("石头剪刀布游戏"); //设置窗体标题,修改标题为“石头剪刀布游戏”;
setDefaultCloseOperation(EXIT_ON_CLOSE); //设置窗体关闭按钮
setBounds(250, 250, 350, 350); //设置窗体左上顶点坐标;设置窗体大小,修改窗体大小为:350×350;
dlg = new JDialog(this,"about");
dlg.setBounds(325, 375, 200, 150);
dlg.setModal(true);
dlg.add(new JLabel("石头>剪刀,剪刀>布,布>石头"),BorderLayout.CENTER);
mbar = new JMenuBar();//创建菜单栏并添加到窗体顶部
setJMenuBar(mbar);
show = new JMenu("结果显示方式");
about = new JMenuItem("关于游戏");
mbar.add(show);
mbar.add(about);
text = new JMenuItem("文本显示");
image = new JMenuItem("图形显示");
end = new JMenuItem("结束游戏");
show.add(text);
show.add(image);
show.add(end);
north = new JPanel(); //建立JPanel对象north
north.setBackground(Color.yellow); //设置north的背景为yellow
shitou = new JButton("石头"); //建立JButton对象 并设置文本为石头
jiandao = new JButton("剪刀"); //建立JButton对象 并设置文本为剪刀
bu = new JButton("布"); //建立JButton对象 并设置文本为布
clear = new JButton("清空");//建立JButton对象 并设置文本为清空
center = new JPanel(); //建立JPanel对象center
center.setBackground(Color.green); //设置center的背景为green
label = new JLabel("选择剪刀、石头、布开始游戏"); //建立JLabel对象label
west = new JPanel();
east = new JPanel();
south = new JPanel();
imgLabel1 = new JLabel();
imgLabel2 = new JLabel();
label2 = new JLabel();
label2.setFont(new Font("",Font.BOLD,20));
shitou.addActionListener(this); //给 shitou 添加事件监听器
jiandao.addActionListener(this); //给 jiandao 添加事件监听器
bu.addActionListener(this); //给 bu添加事件监听器
clear.addActionListener(this); // 给 clear添加事件监听器
about.addActionListener(this);
text.addActionListener(this);
image.addActionListener(this);
end.addActionListener(this);
north.add(shitou); //把 shitou 放进 north 中
north.add(jiandao); // 把 jiandao 放进 north 中
north.add(bu); //把 bu 放进 north 中
north.add(clear);// 把 clear 放进 north 中
center.add(label); //把 label 放进 center 中
west.add(imgLabel1);
east.add(imgLabel2);
south.add(label2);
add(north,BorderLayout.NORTH); //将north放入 JFrame中 并设置布局为容器的顶部
add(center,BorderLayout.CENTER);// 将center放入 JFrame中 并设置布局为容器的中央
add(west,BorderLayout.WEST);
add(east,BorderLayout.EAST);
add(south,BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == about) {
dlg.setVisible(true);
}
if(e.getSource() == text) {
status = 0;
imgLabel1.setIcon(null);
imgLabel2.setIcon(null);
center.setBackground(Color.green);
label.setText("选择剪刀、石头、布开始游戏");
label2.setText("");
imgLabel1.setText("");
imgLabel2.setText("");
}else if(e.getSource() == image) {
status = 1;
imgLabel1.setHorizontalTextPosition(JLabel.CENTER);
imgLabel1.setVerticalTextPosition(JLabel.TOP);
imgLabel2.setHorizontalTextPosition(JLabel.CENTER);
imgLabel2.setVerticalTextPosition(JLabel.TOP);
imgLabel1.setIcon(null);
imgLabel2.setIcon(null);
label2.setText("");
imgLabel1.setText("");
imgLabel2.setText("");
float[] hsb= Color.RGBtoHSB(238, 238, 238, null);
center.setBackground(Color.getHSBColor(hsb[0], hsb[1], hsb[2]));
label.setText("选择剪刀、石头、布开始游戏");
}
if(status == 0) {
if(e.getSource() == shitou){
int i = (int)(Math.random()*10)%3;
switch(i){
case 0 : label.setText("你出石头,电脑出石头,平局!"); break;
case 1 : label.setText("你出石头,电脑出剪刀,恭喜你赢了!"); break;
case 2 : label.setText("你出石头,电脑出布,很遗憾你输了!"); break;
}
}
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;
}
}
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;
}
}
if(e.getSource() == clear) {
label.setText("选择剪刀、石头、布开始游戏");
}
}else if(status == 1) {
if(e.getSource() == shitou){
label.setText("");
imgLabel1.setText("我方");
imgLabel2.setText("对方");
imgLabel1.setIcon(new ImageIcon(STPATH));
int i = (int)(Math.random()*10)%3;
switch(i){
case 0 :
imgLabel2.setIcon(new ImageIcon(STPATH));
label2.setText("平局");
break;
case 1 :
imgLabel2.setIcon(new ImageIcon(JDPATH));
label2.setText("你赢了");
break;
case 2 :
imgLabel2.setIcon(new ImageIcon(BUPATH));
label2.setText("你输了");
break;
}
}else if(e.getSource() == jiandao ){
label.setText("");
imgLabel1.setText("我方");
imgLabel2.setText("对方");
imgLabel1.setIcon(new ImageIcon(JDPATH));
int i = (int)(Math.random()*10)%3;
switch(i){
case 0 :
imgLabel2.setIcon(new ImageIcon(STPATH));
label2.setText("你输了");
break;
case 1 :
imgLabel2.setIcon(new ImageIcon(JDPATH));
label2.setText("平局");
break;
case 2 :
imgLabel2.setIcon(new ImageIcon(BUPATH));
label2.setText("你赢了");
break;
}
}else if(e.getSource() == bu){
label.setText("");
imgLabel1.setText("我方");
imgLabel2.setText("对方");
imgLabel1.setIcon(new ImageIcon(BUPATH));
int i = (int)(Math.random()*10)%3;
switch(i){
case 0 :
imgLabel2.setIcon(new ImageIcon(STPATH));
label2.setText("你赢了");
break;
case 1 :
imgLabel2.setIcon(new ImageIcon(JDPATH));
label2.setText("你输了");
break;
case 2 :
imgLabel2.setIcon(new ImageIcon(BUPATH));
label2.setText("平局");
break;
}
}else if(e.getSource() == clear) {
imgLabel1.setIcon(null);
imgLabel2.setIcon(null);
label.setText("选择剪刀、石头、布开始游戏");
label2.setText("");
imgLabel1.setText("");
imgLabel2.setText("");
}
}
if(e.getSource() == end)
dispose();
}
public static void main(String[] args) {
shitoujiandaobu g = new shitoujiandaobu();
g.setVisible(true);
}
}
3. 分数的加减乘除(选做)
3.1 设计问题:分数的加减乘除
3.2 问题描述:计算给定分数的加减乘除。
3.3 问题分析:
1.化成最简形式:即求分子分母的最大公约数
2.定义友元函数以 x/y 的形式输出分数 类外实现友元函数 重载位运算符
3.4 功能实现:
1.成员变量 x 和 y,分别存放分子和分母, 要求分数以最简形式存放。例如:分数 2/4 应简化为 1/2。
2.定义成员函数 Add、Sub、Mul 和 Div,求两个分数的和差积商。计算结果仍以最简形式存放。
3.重载运算符“+、-、*、/”,求两个分数的和差积商。计算结果仍以最简形式存放。 4.定义友元函数,重载“<<”运算符,以 x/y 的形式输出分数。
3.5 测试实例及运行结果:
3.6 源程序清单:
package shitoujidanobu;
import java.awt.*;//引入抽象窗口工具类包
import java.awt.event.*;//引入事件
import javax.swing.*;//引入组件
//定义一个窗口类,该类实现 ActionListener 接口;
public class shitoujiandaobu extends JFrame implements ActionListener{
JButton shitou,jiandao,bu,clear; //定义 JButton 对象
JPanel north,center,west,east,south; //定义 JPanel 对象
JLabel label,imgLabel1,imgLabel2,label2; // 定义JLable 对象
JMenuBar mbar;
JMenu show;
JMenuItem text,image,end,about;
JDialog dlg;
//石头剪刀布的图片路径
static String STPATH = "D:\\桌面\\图片\\s.jpg",JDPATH = "D:\\桌面\\图片\\j.jpg",BUPATH="D:\\桌面\\图片\\b.jpg";
int status = 0;
public shitoujiandaobu() {
setTitle("石头剪刀布游戏"); //设置窗体标题,修改标题为“石头剪刀布游戏”;
setDefaultCloseOperation(EXIT_ON_CLOSE); //设置窗体关闭按钮
setBounds(250, 250, 350, 350); //设置窗体左上顶点坐标;设置窗体大小,修改窗体大小为:350×350;
dlg = new JDialog(this,"about");
dlg.setBounds(325, 375, 200, 150);
dlg.setModal(true);
dlg.add(new JLabel("石头>剪刀,剪刀>布,布>石头"),BorderLayout.CENTER);
mbar = new JMenuBar();//创建菜单栏并添加到窗体顶部
setJMenuBar(mbar);
show = new JMenu("结果显示方式");
about = new JMenuItem("关于游戏");
mbar.add(show);
mbar.add(about);
text = new JMenuItem("文本显示");
image = new JMenuItem("图形显示");
end = new JMenuItem("结束游戏");
show.add(text);
show.add(image);
show.add(end);
north = new JPanel(); //建立JPanel对象north
north.setBackground(Color.yellow); //设置north的背景为yellow
shitou = new JButton("石头"); //建立JButton对象 并设置文本为石头
jiandao = new JButton("剪刀"); //建立JButton对象 并设置文本为剪刀
bu = new JButton("布"); //建立JButton对象 并设置文本为布
clear = new JButton("清空");//建立JButton对象 并设置文本为清空
center = new JPanel(); //建立JPanel对象center
center.setBackground(Color.green); //设置center的背景为green
label = new JLabel("选择剪刀、石头、布开始游戏"); //建立JLabel对象label
west = new JPanel();
east = new JPanel();
south = new JPanel();
imgLabel1 = new JLabel();
imgLabel2 = new JLabel();
label2 = new JLabel();
label2.setFont(new Font("",Font.BOLD,20));
shitou.addActionListener(this); //给 shitou 添加事件监听器
jiandao.addActionListener(this); //给 jiandao 添加事件监听器
bu.addActionListener(this); //给 bu添加事件监听器
clear.addActionListener(this); // 给 clear添加事件监听器
about.addActionListener(this);
text.addActionListener(this);
image.addActionListener(this);
end.addActionListener(this);
north.add(shitou); //把 shitou 放进 north 中
north.add(jiandao); // 把 jiandao 放进 north 中
north.add(bu); //把 bu 放进 north 中
north.add(clear);// 把 clear 放进 north 中
center.add(label); //把 label 放进 center 中
west.add(imgLabel1);
east.add(imgLabel2);
south.add(label2);
add(north,BorderLayout.NORTH); //将north放入 JFrame中 并设置布局为容器的顶部
add(center,BorderLayout.CENTER);// 将center放入 JFrame中 并设置布局为容器的中央
add(west,BorderLayout.WEST);
add(east,BorderLayout.EAST);
add(south,BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == about) {
dlg.setVisible(true);
}
if(e.getSource() == text) {
status = 0;
imgLabel1.setIcon(null);
imgLabel2.setIcon(null);
center.setBackground(Color.green);
label.setText("选择剪刀、石头、布开始游戏");
label2.setText("");
imgLabel1.setText("");
imgLabel2.setText("");
}else if(e.getSource() == image) {
status = 1;
imgLabel1.setHorizontalTextPosition(JLabel.CENTER);
imgLabel1.setVerticalTextPosition(JLabel.TOP);
imgLabel2.setHorizontalTextPosition(JLabel.CENTER);
imgLabel2.setVerticalTextPosition(JLabel.TOP);
imgLabel1.setIcon(null);
imgLabel2.setIcon(null);
label2.setText("");
imgLabel1.setText("");
imgLabel2.setText("");
float[] hsb= Color.RGBtoHSB(238, 238, 238, null);
center.setBackground(Color.getHSBColor(hsb[0], hsb[1], hsb[2]));
label.setText("选择剪刀、石头、布开始游戏");
}
if(status == 0) {
if(e.getSource() == shitou){
int i = (int)(Math.random()*10)%3;
switch(i){
case 0 : label.setText("你出石头,电脑出石头,平局!"); break;
case 1 : label.setText("你出石头,电脑出剪刀,恭喜你赢了!"); break;
case 2 : label.setText("你出石头,电脑出布,很遗憾你输了!"); break;
}
}
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;
}
}
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;
}
}
if(e.getSource() == clear) {
label.setText("选择剪刀、石头、布开始游戏");
}
}else if(status == 1) {
if(e.getSource() == shitou){
label.setText("");
imgLabel1.setText("我方");
imgLabel2.setText("对方");
imgLabel1.setIcon(new ImageIcon(STPATH));
int i = (int)(Math.random()*10)%3;
switch(i){
case 0 :
imgLabel2.setIcon(new ImageIcon(STPATH));
label2.setText("平局");
break;
case 1 :
imgLabel2.setIcon(new ImageIcon(JDPATH));
label2.setText("你赢了");
break;
case 2 :
imgLabel2.setIcon(new ImageIcon(BUPATH));
label2.setText("你输了");
break;
}
}else if(e.getSource() == jiandao ){
label.setText("");
imgLabel1.setText("我方");
imgLabel2.setText("对方");
imgLabel1.setIcon(new ImageIcon(JDPATH));
int i = (int)(Math.random()*10)%3;
switch(i){
case 0 :
imgLabel2.setIcon(new ImageIcon(STPATH));
label2.setText("你输了");
break;
case 1 :
imgLabel2.setIcon(new ImageIcon(JDPATH));
label2.setText("平局");
break;
case 2 :
imgLabel2.setIcon(new ImageIcon(BUPATH));
label2.setText("你赢了");
break;
}
}else if(e.getSource() == bu){
label.setText("");
imgLabel1.setText("我方");
imgLabel2.setText("对方");
imgLabel1.setIcon(new ImageIcon(BUPATH));
int i = (int)(Math.random()*10)%3;
switch(i){
case 0 :
imgLabel2.setIcon(new ImageIcon(STPATH));
label2.setText("你赢了");
break;
case 1 :
imgLabel2.setIcon(new ImageIcon(JDPATH));
label2.setText("你输了");
break;
case 2 :
imgLabel2.setIcon(new ImageIcon(BUPATH));
label2.setText("平局");
break;
}
}else if(e.getSource() == clear) {
imgLabel1.setIcon(null);
imgLabel2.setIcon(null);
label.setText("选择剪刀、石头、布开始游戏");
label2.setText("");
imgLabel1.setText("");
imgLabel2.setText("");
}
}
if(e.getSource() == end)
dispose();
}
public static void main(String[] args) {
shitoujiandaobu g = new shitoujiandaobu();
g.setVisible(true);
}
}