课设格式要求
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); // 使窗体可见
}
}