北邮电子工艺实习智能小车实习报告附程序

时间:2024.4.27

北京邮电大学实习报告

附页:学生实习总结

一、        初步设计
  走迷宫小车利用单片机STC900C52RC 作为中控核心,光电开关E18-D80NK 作为走迷宫小车的探测障碍的传感器,以及其它L298N电机驱动芯片、LM1117-5.0/LDO电源。
  小车走迷宫使用的是左手算法(即摸墙算法),迷宫是简单连通的,即迷宫的墙总是相互相连的或与迷宫的外轮廓相连,那么迷宫的搜索者从起点开始将左手扶在墙面前行,总能保证不会迷失并且找到迷宫中存在的出口(若忽略出口将回到迷宫起点)。这种策略在刚进入迷宫时即执行的效果是最佳的。小车采用一个L298N电机驱动模块、LM1117-5.0/LDO电源、两个E18-D80NK光电开关(一个放置在小车正前方,一个放置在小车正左方),分别判断小车的前方和左方是否有障碍,并将高低电平传递至传递给单片机,使单片机控制电机实现左转、右转、前进、掉头(实际为连续两次右转)的功能穿越迷宫。
  小车是三轮小车,前两个是驱动轮,后一个是支点轮(从动轮),两个驱动轮是分别由两个电机驱动,通过同速率同向转动前进和同速率反向转动转向。

二、        具体工作
1)  元器件的焊接与组装
2)  部分代码的编写与调试

3) 小车外观的设计与制作

三、     小车焊接与电路测试

1)        在我们焊接小车之前,我们用了两天时间学习和熟悉焊接工艺,同时还做了个发光二极管的小实验,这些基础让我在焊接小车电路板的时候有了底气,做起来也有些轻车熟路。我们用了半天的时间就几乎完成了全部的焊接任务,按照小车的装配步骤,我们依次焊接了电阻、晶体、排阻、二极管、开关、三极管、二极管、电容、数码管、电源电机端子、排针、驱动芯片等,同时也学会了“先焊矮的后焊高”的道理。在完成焊接之后,小车的组装也颇为顺利,在实验步骤的指导下,顺利完成了小车的组装,小车已初现其形。

2)        在小车焊接与组装之后,开始进行小车电路测试,植入CHECK程序之后,小车完美的实现了前进与后退的功能,而且前行的轨迹相对笔直,这和我们的焊接与组装有很大关系。但是,在实现前进功能的同时也出现了问题,数码管有一个数字不显示,在查看电路图,和老师同学讨论之后,我们确定了问题的源头,是有一个三极管在焊接过程中烧坏了,在更换了三极管之后,数码管全都亮了。同时我也帮其他电机不转的同学发现和解决了问题,大都是电元件被烧坏了。这也提醒我们在焊接的时候,要小心谨慎。

四、     小车硬件调试

1)      光电开关E18-D80NK的最远感应距离是80cm,因为迷宫的宽度不过20cm,所以在编程调试之前,应将两个光电开关的感应距离从80cm调整到10cm(最小)-20cm,才能编程使用。但是在将正前方的光电开关调整到最小感应距离时,仍然不能符合硬件调试的标准,所以在编程时,应先使其前进一小段距离,达到转弯的标准之后,再进行转弯。

2)      车轮的两轴应该先标定在同一条直线上,并且平行。首先让小车直线前进,观察小车是否能直线行进,如果不能就需要进行编程的相应调整。

五、     小车动力控制

1)        L298的逻辑功能(1是高电平,0是低电平)

          i.              前进代码qianjin()

              qianjin()

              {   IN1=1;

                     IN2=0;

                     IN3=0;

                     IN4=1;

              }           

        ii.              左转代码leftro()

              leftro()

              {     LED2=1;//左侧灯亮

                     LED1=0;//右侧灯灭

                     IN1=1;

                     IN2=0;

                     IN3=1;

                     IN4=0;

              }

      iii.              右转代码rightro()

              rightro()

              {   LED1=1;//右侧灯亮

                     LED2=0;//左侧灯灭

                     IN1=0;

                     IN2=1;

                     IN3=0;

                     IN4=1;

              }

2)        单片机逻辑功能

                        i.              左侧有障碍物(低电平);前方没有障碍物(高电平)
单片机指令:前进

                      ii.              左侧有障碍物(低电平);前方有障碍物(低电平)
单片机指令:
       a.前进15步(设1步是10ms,此后都如此)
       b.停止10步
       c.右转30步
       d.停止10步
       e.判断此时障碍物情况,如果前方没有障碍物(高电平)
        停止10步再前进25步
       f. 否则【即前方有障碍物(低电平)】,右转30步.

                    iii.              左侧没有障碍物(高电平)
单片机指令:
       a.前进25步
       b.停止10步
       c.左转38步
       d.停止10步
       e.前进15步.

六、     小车外观设计与制作

1)        组装并调程序十天以后,终于可以给小车做外壳了。在有限经费的条件下,我们的小车外壳实现了完全零成本。我们设计小车为一个超跑,所以小车以纸箱板为骨架,每一个部分都是相互独立得,在完成基本骨架的设计与制作之后,我又给小车涂了一层水彩,使得小车更加炫酷。

2)        我们的小车除了基本的外壳以外,我还设计了超跑的挡风玻璃,大灯,车座,以及后车厢。整个外观设计加制作用了两晚一天,凝聚了自己的汗水和爱。

七、     常见问题、故障及解决方案

1)     在焊接阶段,高温可能会损坏一些电元件,尤其是二极管。三极管。我们的数码管有一个不亮,就是有一个相应的二极管烧坏了。因此焊接时间不宜过长,焊接时要小心谨慎。将小车主板的元器件焊接完成之后,尽量不要再用手触碰背面焊点。汗水会使焊点之间短路,影响小车的正常调试。

2)     因为传感器的感应距离和小车的制动原因,小车前进中转向会改变转角的角度,不适合控制。所以在转弯前首先给小车一个短暂的停止时间,之后再进行转向,转向将会比较稳定,更易于控制。

3)     因为后期外壳的制作以及每一次电量的消耗,都会是使行车轨迹发生变化,所以必须得调整程序才能使小车较好地实现功能。应避免无休止的调试代码,可以调试几个适用于不同硬件环境的代码,在不同的硬件环境下使用。

4)  在最后的验收时,小车前几次没能完全走出迷宫,这是因为刚刚改变了小车外壳的质量,加上完全封装后,没能给充电电池充电,所以转弯角度发生了很大变化,在修正了相应程序后,小车顺利的走出了迷宫。

八、     心得与收获

作为一名信通院的工科生,这次实习让我学会了电子院、计算机院、数媒院同学的一些技能。从焊接电路,到编程调试,到实现走迷宫,到外观制作,和队友一起,一步一步完成这个项目,这段历程值得自己骄傲与开心,这两个礼拜所学到得也值得自己回味。历时两周,从学习最基本的焊接工艺到设计算法,再到编程解决问题,再到调试时讨论存在的问题和解决方案,最后设计小车外观封装,这满满的回忆一一在眼前回顾。

我在整个的制作过程中,除了学习到焊接工艺、keil编程语言,手工工艺,更多的是学会了如何分析问题,如何解决问题。在接触到这个项目,如何去设计,如何去做到我们想要的功能,这其中的思考值得我们去品味。

两个礼拜的实习就这样过去了,看着凝聚着自己汗水与爱的小车,内心好多感触。感谢这次小学期让自己在学习和生活上学到的东西,感谢老师给我们这次的实习项目,感谢队友一起的努力与向上。最后,感谢自己,希望自己所学到的东西用到以后的学习与生活中去。

九、        参考文献
*摸墙算法,百度百科:

http://baike.baidu.com/link?url=HtZEStRcrFdzknUH7DH_piyEztpJJoYjDS4a9XcEdxWVSyfHZ7Q0apgqma_cYxXzyRBvXamMnDZt5xR-89LYFq

附小车代码:

#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define t 1
uchar code seg_data[ ] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//0~9的段码表,0x00为熄灭符
uchar data disp_buf[7] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00};//显示缓冲区

sbit IN1 = P1^3;
sbit IN2 = P1^5;
sbit IN3 = P1^2;
sbit IN4 = P1^0;
sbit LED1 = P2^6;
sbit LED2 = P2^7;
sbit LEFT = P3^6;
sbit RIGHT = P3^4;
sbit FRONT = P3^2;
sbit S1 = P1^6;
unsigned int count=0;   
 
void Delay_ms(uint xms)       //延时程序,xms是形式参数
{               
uint i, j;
for(i=xms;i>0;i--)            // i=xms,即延时xms, xms由实际参数传入一个值
for(j=115;j>0;j--);      //此处分号不可少
}

display()
{
   P0=seg_data[0];   //显示毫秒十位
   P2=0xfe;             //开个位显示(开第1只数码管)
   Delay_ms(t); //延时10ms
   P0=seg_data[1];   //显示毫秒百位
   P2=0xfd; //开十位显示(开第2只数码管)
   Delay_ms(t); //延时10ms
   P0=seg_data[2];   //显示秒个位
   P2=0xfb;             //开百位显示(开第3只数码管)
   Delay_ms(t); //延时10ms
   P0=seg_data[3];   //显示秒十位
   P2=0xf7; //开个位显示(开第4只数码管)
   Delay_ms(t); //延时10ms
   P0=seg_data[4];   //显示分个位
   P2=0xef;             //开十位显示(开第5只数码管)
   Delay_ms(t); //延时10ms
   P0=seg_data[5];   //显示分十位
   P2=0xdf; //开个位显示(开第6只数码管)
   Delay_ms(t); //延时10ms
   P2=0xff;
}

stop()
{
IN1=0; 
IN2=0;
IN3=0;
IN4=0;
}
qianjin()
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
}
houtui()
{
IN1=0; 
IN2=1;
IN3=1;
IN4=0;
}
leftro()
{
LED2=1;
LED1=0;
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
rightro()
{
LED1=1;
LED2=0;
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
     
//****************主程序******************//
void main()
{   P0=0xff;
   P2=0xff;
   P1=0xff;
   P3=0xff;
   TMOD=0x01;      //定时器T0方式1
   TH0=0xfe; TL0=0x0c;      //1ms定时初值
   EA=1; ET0=1; TR0=1; //开总中断,开定时器T0中断,启动定时器T0
   while(1)
   {
       display();
   while((LEFT==0)&&(FRONT==1))
    {
       display();
       qianjin();
        }
       }
count=0;

while ((LEFT==0)&&(FRONT==0))
{
while(count<15)
{
display();
qianjin();
count++;  
}
while(count<25)
{
display();
stop();
count++;   
}
while(count<55)
{
display();
rightro();
count++;
}
count=0;
//   判断第二次是否需要右转
if((LEFT==0)&&(FRONT==0))
{
while(count<30)
{
display();
rightro();
count++;
}
}
else
{
while(count<10)
{
display();
stop();
count++;   
}
while(count<35)
{
display();
qianjin();
count++;}
}

}
   
count=0;

while  ((LEFT==1))
{
   while(count<25)
   {
display();
qianjin();
count++;
   }
while(count<35)
   {
display();
stop();
count++;
   }
while(count<73)
{
display();
leftro();
count++;
}
while(count<88)
{
display();
qianjin();
count++;}
}
}
}


第二篇:北邮计算机实习报告


北京邮电大学信息与通信工程学院

计算机实习计划书

信息与通信工程学院20##级

20##年 暑期


1、教学目标

北京邮电大学信息与通信工程学院20##级暑期计算机实习,是在学习C++大学基础教程的基础上开设的,目的是使学生们进一步综合运用C++的基本概念和语法,学习C++面向对象的设计思想,并且初步学会MS Visual C++的集成开发环境的使用。

计算机实习的时间为两个星期,在这三星期内,学生们将学习复杂应用程序的设计和使用、文件流的读写、相关API的使用等,并提交一个完整的C++的作品。充分培养学生的合作意识,培养学生们发现问题、解决问题的能力,充分发挥学生的想象力、创造力,激发学生主动学习的潜能。

2、相关知识

2.1相关数据类型

实例使用的数据类型包含在库文件 <windows.h>中,该库文件主要用来描述windows环境下常用的数据结构,宏和其他数据类型。

2.1.1、相关数据结构

Ø  HANDLE:句柄

实际上是一个无符号的整型数,作为窗口的唯一标识ID,控制台的黑屏也是一个窗口,也需要这样的一个HANDLE来标识。

Ø  BOOL逻辑

                  实际结构:typedef int BOOL;

Ø  BYTE字节

            实际结构:typedef unsigned char BYTE;

Ø  WORD字

            实际结构:typedef unsigned short WORD;

Ø  DWORD双字

            实际结构:typedef unsigned long DWORD;

2.1.2、颜色标识

      实例中用来描述颜色的数据结构是WORD,根据下列宏定义可以常用的各种前景色和背景色。

      前景色:

Ø  红色:FOREGROUNT_RED

Ø  绿色:FOREGROUND_GREEN

Ø  蓝色:FOREGROUND_BLUE

Ø  颜色加重显示:FOREGROUND_INTENSITY

背景色:

Ø  红色:BACKGROUND_RED

Ø  绿色:BACKGROUND_GREEN

Ø  蓝色:BACKGROUND_BLUE

Ø  颜色加重显示:BACKGROUND_INTENSITY

根据系统提供的三元色进行组合,可以得到混合后的文本和背景颜色。

前景色:

Ø  黄色:FOREGROUNT_RED | FOREGROUND_GREEN

Ø  青色:FOREGROUNT_BLUE | FOREGROUND_GREEN

Ø  紫色:FOREGROUNT_BLUE | FOREGROUND_RED

Ø  白色:FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN

背景色:

Ø  黄色:BACKGROUNT_RED | BACKGROUNT _GREEN

Ø  青色:BACKGROUNT _BLUE | BACKGROUNT _GREEN

Ø  紫色:BACKGROUNT _BLUE | BACKGROUNT _RED

Ø  白色:BACKGROUNT _RED| BACKGROUNT _BLUE| BACKGROUNT _GREEN

2.2常用的系统函数

实例使用得系统函数大都来自文件<conio.h>,该文件包括控制台的键盘输入输出操作。常用的系统函数如下所示:

Ø  kbhit()

        检测是否有按键按下,系统函数直接调用。

Ø  getch()

        获取按键的值,但不在屏幕回显,系统函数直接调用。

Ø  getche()

       获取按键的值,但在屏幕回显,系统函数直接调用。

Ø  Sleep(DWORD n)

       使程序休眠n毫秒,系统函数直接调用。

Ø  void  srand(unsigned int seed )

       随机数的种子函数。

Ø  int  rand()

产生伪随机数序列。

2.3教师的前期工作

鉴于学生们学习C++的时间较短,了解的相关知识相对较少,为了方便同学们快速上手进行编程,需要教师提前作一些准备工作。使用控制台编程需要了解很多复杂的系统函数,因此,教师提前将这些系统函数进行了加工,封装成简单的函数提供给学生调用,包含这些函数的文件如下:

       这些文件由教师提供:

Ø  头文件 colorConsole.h(附件1)

Ø  源文件 colorConsole.cpp(附件2)

   这两个文件中实现了下面两个函数,函数接口如下:

      1)HANDLE initiate();

          输入参数:无

          输出参数:HANDLE

函数功能:初始化控制台窗口,并获取该窗口的句柄;该函数只在程序初始化时执行一次。

2)BOOL textout(HANDLE hOutput, int x, int y, WORD wColors[],int nColors, LPTSTR lpszString );

   输入参数:    窗口句柄  HANDLE hOutput

           设置窗口横坐标  int x

设置窗口列坐标  int y

              设置文本和背景色序列  WORD wColors[]

                    设置颜色序列的数目    int nColors

设置输出的字符串      LPTSTR lpszString )

        输出参数:true 表示执行成功,false表示失败

函数功能:在控制台窗口指定的(x,y)位置输出指定颜色的字符串。

实际编程中,学生们需要按照以下步骤进行:

1、  将colorConsole.h文件添加到新建的工程中

2、  将colorConsole.cpp文件添加到当前工程中

3、  新建一个源文件main.cpp,将#include “colorConsole.h”自己编写主程序中的代码调用封装后的,极大的简化了编程难度。

2.4编程技巧

2.4.1、显示彩色字符串

       编程步骤:

          1)初始化获取窗口句柄

          2)设置颜色

          3)设置坐标

          4)输出指定字符串

      

例1:显示红蓝相间的彩色字符串Happy Birthday!

  void main(void) 

{

       HANDLE handle;

       handle = initiate();

    WORD wColors[2];

       wColors[0]=FOREGROUND_RED|FOREGROUND_INTENSITY;

    wColors[1]=FOREGROUND_BLUE;

       textout(handle,10,10,wColors,2,"Happy Birthday!");

}

2.4.2、闪烁的彩色文字

        闪烁原理:

            1)写一遍彩色文字

            2)延时200ms

            3)写一遍空文字

            4)延时100ms

        反复该过程,则文字不断闪烁。

       

例2:彩色字符串Happy Birthday!不断闪烁

void main(void) 

{

    HANDLE handle;

    handle = initiate();

  WORD wColors[2];

    wColors[0]=FOREGROUND_RED|FOREGROUND_INTENSITY;

  wColors[1]=FOREGROUND_BLUE;

  while(1)

{

         textout(handle,10,10,wColors,2,"Happy Birthday!");

       Sleep(200);

       textout(handle,10,10,wColors,2, "             ");

       Sleep(100);

  }

}

2.4.3、移动的彩色文字

       移动原理:

            1)写一遍彩色文字

            2)延时100ms

            3)写一遍空文字

            4)改变坐标位置

反复该过程,则文字不断移动。

例3:水平移动彩色字符串Happy Birthday!

void main(void) 

{

       HANDLE handle;

       handle = initiate();

    WORD wColors[2];

       wColors[0]=FOREGROUND_RED|FOREGROUND_INTENSITY;

    wColors[1]=FOREGROUND_BLUE;

for(int x=0; x<65 ; row++)

{

            textout(handle,x,10,wColors,2,"Happy Birthday!");

         Sleep(100);

         textout(handle,x,10,wColors,2,"              ");

    }

}

2.4.4、检测键盘输入

       检测原理:

            1)检测是否有按键

            2)有:键盘处理

            3)无:屏幕处理

       反复该过程,则文字不断移动。

      例4:移动字符串的过程中,按下任意键暂停,再次按下时继续移动

void main(void) 

{

HANDLE handle;

       handle = initiate();

    WORD wColors[2];

       wColors[0]=FOREGROUND_RED|FOREGROUND_INTENSITY;

    wColors[1]=FOREGROUND_BLUE;

              int x=0;

bool flag=false;

while(x<65)

{

                    if (_kbhit())

{

                         _getch();

                flag=!flag;

                      textout(handle,x,10,wColors,2,"Happy Birthday!");

                    }

                    if (flag)

{

                            textout(handle,x,10,wColors,2,"Happy Birthday!");

                            Sleep(100);

                            textout(handle,x,10,wColors,2,"                           ");

                            x++;

                    }

          }

}

3、教师范例

3.1范例题目一

制作一个投骰子游戏。程序运行界面如图1所示。

1 筛子游戏界面

3.1.1程序功能

如图1所示:

Ø  游戏运行,可以显示不同点数的筛子;

Ø  游戏开始,按下“回车键”,则筛子随机出现不同的点数,产生动画效果;

Ø  按下“回车键”,筛子停止变化,记录点数;

Ø  按下“空格键”,更换游戏者,重复上述2、3步骤;

Ø  按下“q键”,游戏结束。

该游戏可以多人参加,每人可以投多次,每人每次的筛子点数自动累加,点数最高者胜。

3.1.2实现步骤

       1)搭建程序框架

Ø  新建一个空的工程,工程名称game;

Ø  将colorConsole.h(附件1)和colorConsole.cpp(附件2)拷贝到工程当前目录,添加到工程中;

Ø  新建一个主文件main.cpp,将#include “colorConsole.h”代码添加到main.cpp中。

2)代码实现(源代码见附件3

Ø  一个辅助函数

void rolldice(HANDLE hOutput, int n, int col , int row, WORD wColors[]);

输入参数:

输出屏幕:hOutput

筛子点数:n

屏幕位置:列col行row

文字颜色:wColors[]

输出参数:

功能:

在屏幕指定位置输出指定点数和指定颜色的筛子

Ø  主函数

功能:检测按键,根据不同的按键实现不同的功能,算法思想如下面的为代码所示。

void main()

{

       屏幕初始化;

       显示6个黄色的不同点数的筛子;

       在屏幕底部显示菜单;

       while(1)//游戏开始

              {

                    if (检测到按键)

                     {

                        if(检测是否按下“回车键”)

           {

                                标志位取反;

if(当前标志为false)

{

停止投筛子;

显示当前点数的筛子;

rolldice(handle,i+1,row,col,wColors);

                                          记录并显示游戏者和点数;

                                   }

                            }

                            else if (检测是否按下“空格键”)

                     {

                                   计数器清零;

                                   游戏者人数加1;

                            }

                  else if (检测是否按下“q或Q键”)

               break;

                    }

               if (标志位是true)

                     {

                            随机投筛子;

                     }

              }

}//游戏结束

3)程序编译调测运行

       不需要额外的设置,常规调试运行即可。

3.2范例题目二

    制作一个指法测试游戏。程序界面如图2所示。

2 指法测试游戏

3.2.1程序功能

如图2所示:

Ø  游戏运行,可以显示5行40列的随机字符;

Ø  按下“任意键”,游戏开始,开始计时;

Ø  从左到右,键入字符,如果与相应位置显示的字符相同,则正确字符数加1,否则错误字符数加1;

Ø  1分钟后程序自然停止,统计正确/错误字符数;并弹出窗口询问是否继续

该游戏可以用于自测指法,在规定时间内正确字符数越多,则指法越好。

3.2.2实现步骤

       1)搭建程序框架

Ø  新建一个空的工程,工程名称Finger;

Ø  将colorConsole.h(附件1)和colorConsole.cpp(附件2)拷贝到工程当前目录,并添加到工程中;

Ø  新建一个主文件main.cpp,将#include “colorConsole.h”代码添加到main.cpp中。

2)代码实现

Ø  辅助变量

const int TOP = 4;

const int LEFT = 10;

const int RIGHT = 62;

const int BOTTOM = 20;

const int TIME = 60;

char ch[5][40]={0};  //产生5行40列随机字符

Ø  六个辅助函数

1、void init (HANDLE handle)

输入参数:输出屏幕:handle

输出参数:无

功    能:初始化界面

2、void randCharacter (HANDLE handle)

输入参数:输出屏幕:handle

输出参数:无

功    能:产生5行40列随机的字符

3、void stat (HANDLE handle)

输入参数:输出屏幕:handle

输出参数:无

功    能:统计正确的字符数,并计时。

4、void clearScreem (HANDLE handle)

输入参数:输出屏幕:handle

输出参数:无

功    能:清屏,重新开始练习

5、int GetTime (HANDLE handle)

输入参数:输出屏幕:handle

输出参数:无

功    能:计算练习指法的时间

6、void WinOK (HANDLE handle)

输入参数:输出屏幕:handle

输出参数:无

功    能:确认对话框

Ø  主函数

功能:检测按键,根据不同的按键统计,算法思想如下面的为代码所示。

void main()

{

屏幕初始化;

  

       窗口初始化;

       产生随机字符;

  

     输出菜单提示;

      

       while(1)  //测试开始

       {

              统计正确/错误字符数

       loop:

              一次测试结束,询问是否继续

        if(否)

           程序停止运行;

              else if(是)

              {

                     清屏;

                     重新产生随机字符

              }

        else

           goto loop;

       }    

} //测试结束

3)程序编译调制运行

       不需要额外的设置,常规调试运行即可。

4、实习要求

4.1基本要求

4.1.1、内容要求

作品的内容可以是下面4种中的任意一种:

Ø  可以制作一个小游戏,比如俄罗斯方块、贪吃蛇、时钟、投筛子等;

Ø  可以制作一个课件,比如模拟汉诺塔游戏的过程;

Ø  可以制作一个管理系统,比如学生成绩管理、学生基本信息管理等;

Ø  其它你认为有兴趣的作品。

4.1.2、作品功能要求

    基本要求:  

Ø  能够应用文件流进行磁盘文件的读写:比如游戏分数的保存等

Ø  能够应用面向对象的设计思想和方法

Ø  能够使用多文件结构

Ø  能够播放音频文件,增强游戏的效果

4.2可选课题

    鉴于部分同学对于Windows编程非常感兴趣,并且C++基础较好,尝试完成下面的课题(选作可选课题中的任何一个,就不需要在做基本要求中的内容了)。

4.2.1、完成一个简单计算器

简单计算器的界面如图3所示,功能可以参见Windows操作系统的附件中的计算器的功能,能够完成基本的算术运算。

3 简单计算器

研究步骤:

1)  学习Windows编程框架,了解消息机制

2)  学习各种控件的使用,尤其是对话框、按钮、编辑框等

3)  学习菜单的使用

4)  如果时间允许,可以将简单计算器,扩展为如图4所示的科学计算器。

4 科学计算器

4.2.2、完成一个简单的信息管理系统

简单的信息管理系统主要能够完成对信息的读取、增、删、改、查、保存等功能,比如一个简单学生信息管理系统界面如图4所示,基本功能如下:

(1)读取文件中的学生信息,能够按照学生类别显示;

(2)能够增加、删除、修改学生信息

(3)能够按照学号精确查询学生信息

(4)能够统计不同类别、不同性别的学生人数

(5)更新后的学生信息数据保存在文件中

5 简单学生管理系统

研究步骤:

1)  学习Windows编程框架,了解消息机制

2)  学习各种控件的使用,尤其是对话框、按钮、编辑框等

3)  学习菜单的使用

4)  学习IO流的使用

5)  可以对各种信息进行管理,比如学生成绩管理系统、通讯录、图书管理系统等

4.2.3、完成一个画图软件

简单的画图软件的形式和功能可以参考Windows操作系统中“附件”里的画图软件,如图6所示。

6 画图软件

该软件能够完成如下基本功能:

(1)能够绘制直线、曲线;

(2)能够绘制各种形状,比如矩形、椭圆形等

(3)能够绘制各种实心形状,比如实心矩形、实心椭圆等

(4)能够添加文字

(5)能够设置不同的绘制颜色

研究步骤:

1)  学习使用单文档的(Single document)程序结构

2)  学习使用MFC中CDC类系列的使用,包括CPen类、CBrush类等

3)  学习使用鼠标消息处理函数的使用

4)  有能力的同学可以扩展画图软件的功能,比如能够显示磁盘上已有的图片文件、能够具备“橡皮擦”的功能,进行擦除、能够保存绘制后的图形等等

4.2.4、自选题目

学生根据自身的情况,可以自由选择感兴趣的题目,要求一要写出具体的想法以及预期完成的结果,二要征得实验教师的同意。

下面给出一些题目可供参考。

1)  可以实现一个简单的Windows游戏,比如:碰碰球游戏,游戏者可以控制木板的左右移动,迎接下落的小球,小球与模板碰撞后弹起,反复运行,直到小球下落后木板无法接起,游戏结束。参考程序如图7所示。

7 碰碰球游戏

2)  可以实现Josephus问题的求解,Josephus问题是:n个小孩围成一圈,任意假定一个数m,从第一个小孩起,顺时针方向数,每数到第m个的小孩时,该小孩便离开。小孩不断离开,圈子中的人数不断减少,最后一个离开的小孩是胜利者,请问最后一个离开的小孩的编号?实现可参考程序如图8所示。

8 Josephus问题的求解

3)  可以学习使用OpenGL等工具库实现一个动画制作,题目任意。

4)  可以学习数据库的使用,完成一个基于数据库的信息管理系统。

5)  可以学习Socket类的使用,完成一个基于网络的应用,比如一个即时消息系统、文件传输系统等。

6)  可以学习如何实现一个屏幕保护程序

7)  可以学习任何你感兴趣的相关程序设计的知识,完成一个完整的作品。

5、参考资料

可以参考以下资料。

1)  vc经典教程.chm  电子版

2)  C++到Visual C++ 6.0精彩100例,应甫臣、刘迎辉编,《电脑爱好者杂志出版社》,20##年

3)  Visual C++ 课程设计案例精选,严华峰等编著,《中国水利水电出版社》,20##年

5、实验报告

    实验报告由4部分组成,每部分的格式和要求如下:

    第一部分:封皮,包括作品名称,学生姓名、班级、班内序号、学号。

    第二部分:作品功能说明,包括作品界面、使用方法、程序执行效率等。

第三部分:程序设计说明,包括

1.程序总体框架或流程图,程序实现过程中的重点和难点

2.代码分析

如果使用面向过程的设计方法,包括功能模块划分、每个模块完成的功能、各关键函数之间的调用关系、关键函数的实现思路;

    如果使用面向对象的设计方法,包括关键类的功能说明、各类之间的关系、类中关键函数的实现思想;

3.调试方法,以及调试中的问题及其解决方法

    第四部分:总结,包括学习体会,程序目前的功能缺陷及下一步改进的思路,对于本次实习的意见等。

6、时间安排

本次计算机实习一共3周,从8月27日开始,至9月11日结束,期间集中授课两次,每位同学上机8次,每次4个小时,共32个小时。

    集中授课主要讲解计算机实习需要的相关知识,以及上机过程中出现的问题。上机期间会有辅导教师随时现场辅导。

附件1

文件ColorConsole.h

#include <windows.h>

#include <iostream>

using namespace std;

                                                                                                                        

HANDLE initiate();

BOOL textout(HANDLE hOutput,int x,int y,WORD wColors[],int nColors,LPTSTR lpszString);

附件2

文件colorConsole.cpp

#include "colorConsole.h"

HANDLE initiate()

{

       HANDLE hOutput;

       hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

       return hOutput;

}

BOOL textout(HANDLE hOutput,int x,int y,WORD wColors[],int nColors,LPTSTR lpszString)

{

    DWORD cWritten;

    BOOL fSuccess;

    COORD coord;

  

       coord.X = x;              // start at first cell

    coord.Y = y;              //   of first row     

    fSuccess = WriteConsoleOutputCharacter(

        hOutput,              // screen buffer handle

        lpszString,           // pointer to source string

        lstrlen(lpszString),  // length of string

        coord,                // first cell to write to

        &cWritten);           // actual number written

    if (! fSuccess)

        cout<<"error:WriteConsoleOutputCharacter"<<endl;

       

       for (;fSuccess && coord.X < lstrlen(lpszString)+x; coord.X += nColors)

    {

        fSuccess = WriteConsoleOutputAttribute(

            hOutput,          // screen buffer handle

            wColors,          // pointer to source string

            nColors,                // length of string

            coord,            // first cell to write to

            &cWritten);       // actual number written

    }

    if (! fSuccess)

           cout<<"error:WriteConsoleOutputAttribute"<<endl;

       return 0;

}

附件3

主文件 main.cpp

#include <conio.h>

#include <stdlib.h>

#include <time.h>

#include "colorConsole.h"

//投筛子

void rolldice(HANDLE hOutput,int n,int col,int row,WORD wColors[]);

void main(void) 

{

       HANDLE handle;

       WORD wColors[1];

       int row,col;

       //初始化

handle = initiate();

       //生成6个不同骰子

       wColors[0]=FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY;

       row=col=2;

       for (int i=0;i<6;i++)

       rolldice(handle,i+1,col,row+6*i,wColors);

       //打印屏幕底部菜单

    WORD wMenuColors[1];

       wMenuColors[0]=FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY;

       textout(handle,1,24,wMenuColors,1, "游戏规则:");

       textout(handle,11,24,wMenuColors,1,"投掷开始/结束=ENTER;");

       textout(handle,34,24,wMenuColors,1,"更换游戏者=空格;");

       textout(handle,53,24,wMenuColors,1,"退出=q.");

       bool flag=false;

       int count=1;

       int sum=0;

       //随机数的种子

       srand( (unsigned)time( NULL ));

       col=15;

       row=8;

       //游戏开始

       while(1)

       {

             if (_kbhit())

              {

                     int ch=_getch();

                     if (ch==13)

            {

                            flag=!flag;

                   if (!flag)

                            {

                                   wColors[0]=FOREGROUND_RED|FOREGROUND_INTENSITY;

                                rolldice(handle,i+1,row,col,wColors);

                                   //记录游戏者和点数

                                   char buf[20];

                                   itoa(count,buf,10);

                    textout(handle,1,13+2*count,wMenuColors,1,buf);

                                   textout(handle,3,13+2*count,wMenuColors,1,"点数:");

                                   sum+=i+1;

                                   itoa(sum,buf,10);

                                   textout(handle,9,13+2*count,wMenuColors,1,buf);

                            }

                     }

                     else if (ch==32)//更换游戏者

                     {

                            sum=0;

                            count++;

                     }

                     else if (ch=='q' || ch=='Q')

               break;

              }

        if (flag)//随机投筛子

              {

                     i=rand() % 6;

                     wColors[0]=FOREGROUND_RED|FOREGROUND_INTENSITY;

            rolldice(handle,i+1,row,col,wColors);

                     Sleep(100);

                     wColors[0]=0;

                     rolldice(handle,i+1,row,col,wColors);

              }

       }

}

void rolldice(HANDLE hOutput,int n,int col ,int row,WORD wColors[])

{

       switch(n){

       case 1:    textout(hOutput,row+1,col+1,wColors,1,"●");

               break;

       case 2:     textout(hOutput,row+1,col,  wColors,1,"●");

               textout(hOutput,row+1,col+2,wColors,1,"●");

               break;

       case 3:     textout(hOutput,row,  col+2,wColors,1,"●");

                  textout(hOutput,row+1,col+1,wColors,1,"●");

                     textout(hOutput,row+2,col,  wColors,1,"●");

               break;

       case 4:     textout(hOutput,row,  col,  wColors,1,"●");

                  textout(hOutput,row,  col+2,wColors,1,"●");

                     textout(hOutput,row+2,col,  wColors,1,"●");

                     textout(hOutput,row+2,col+2,wColors,1,"●");

               break;;

       case 5:     textout(hOutput,row,  col,  wColors,1,"●");

                  textout(hOutput,row,  col+2,wColors,1,"●");

            textout(hOutput,row+1,col+1,wColors,1,"●");

                     textout(hOutput,row+2,col,  wColors,1,"●");

                     textout(hOutput,row+2,col+2,wColors,1,"●");

               break;

       case 6:     textout(hOutput,row,  col,  wColors,1,"●");

                  textout(hOutput,row,  col+1,wColors,1,"●");

            textout(hOutput,row,  col+2,wColors,1,"●");

                  textout(hOutput,row+2,col,  wColors,1,"●");

                     textout(hOutput,row+2,col+1,wColors,1,"●");

                     textout(hOutput,row+2,col+2,wColors,1,"●");

               break;

    default:cout<<"投掷骰子失败!"<<endl;     

       }

}

更多相关推荐:
电工电子实习报告

广州大学实习报告项目名称:电工电子实习学院:机械与电气工程专业年级:电子信息工程学号:姓名:指导老师:伍实习单位:广州大学电工电子实习中心实习时间:II1011007400********、黄**20xx/04…

电子电工实习报告书

一实习目的1了解安全用电常识了解安全操作规范2掌握万用表的使用方法以及常用电工工具的使用方法3熟练使用电烙铁了解焊接机理了解焊料和焊剂的作用掌握正确的焊接方法掌握正确的元件装配方法4认识与识别常用电子元器件掌握...

电工电子实习报告

电工电子实习报告一实习时间20xx22720xx33二实习地点湖南工程学院电工电子实验室三指导老师杨老师李老师四实习目的通过一个星期的电子实习使我对电子元件及收音机的装机与调试有一定的感性和理性认识打好了日后学...

电子电工实习报告

黄山学院信息工程学院电子电工实训报告专业班级机械设计制造及自动化专业学生姓名学号时间地点指导老师09机械班一项目名称目的介绍实习实训目的和意义以及实习实训要求等电子实习是电子与电气自动化机械等工科专业的实践教学...

电子电工实习报告

实习报告实习名称系别年级专业电工实习电气工程系11级电气工程及其自动化学生姓名学号杨波李凯南刘祥民尹进田指导老师唐宏伟刘慧荧周沛峰邵阳学院20xx年6月23日邵阳学院学生电工实习实习鉴定表1收音机的焊接与调试一...

电工电子实习报告

专业:测控技术与仪器班级:测控000000学号:20xx0000000姓名:居然摘要:让学生对电气电子元件、室内照明线路、万用表安装技能以、元件的工作原理及收音机的装机与调试有一定的感性和理性认识,对电工技术等…

电工电子实习报告

正文:一、实习目的(宋体,加粗,四号,左对齐)(介绍实习目的和意义,实习单位的发展情况及实习要求等)1、目的和意义(宋体,加粗,小四号)?(正文:宋体,小四号)“电工电子实习”是一门面向部分理工科专业的,以学生…

电子电工实习报告

学院电气与信息工程学院班级电气0802班学号20xx24050204姓名李志华地点综合实验楼C508指导老师文卫刘辉20xx1113电子工艺实习电烙铁的焊接实习项目一电子工艺实习基本理论和技能实习目的1掌握常用...

电工电子实习实训报告

实训报告实训课程:电工电子实习专业:机械类班级:09机械8班姓名:**学号:**指导教师:张老师许老师实训时间:10-11第2学期第13周实训目的:实践教学对学生掌握基本的理论知识,运用基本知识,训练基本技能,…

电子电工实习报告1

电子工艺实习报告电子工艺实习报告学院名称材料工程学院班级09模具2班姓名黄姚波学号指导老师李月红20xx年06月电子工艺实习报告印制电路板的制作及工艺制作印刷线路板就是在覆铜板铜箔上把需要的部分留下来把不需要的...

电子电工实训报告

实训报告实训课程:电子电工实习实训目的:实践教学对学生掌握基本的理论知识,运用基本知识,训练基本技能,增强实践能力,对达到专业培养目标的要求有着十分重要的意义和作用。实践经验是很重要的,使学生对电气元件及电工技…

电工电子实习报告范文

电工电子实习报告学院环境与化学工程学院专业班级测仪121姓名胡兴学号58012120xx指导老师江媛实验名称收音机的组装与焊接实习时间20xx年10月28日20xx年11月1日实习地点南昌大学电工电子中心A25...

电工电子实习报告(39篇)