| 小学数学练习 |
问题描述 | 编写一个帮助小学生练习数学的程序,帮助小学生练习 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); //使窗体可见; } } |