怎么用c语言实现数字回声

怎么用c语言实现数字回声,第1张

回放,即延时输出。

先将当前的数据读取下来,保存,再加入上一次的数据,混合,再发声。

F(n)=F(n)+F(n-1);

如果是多路回放,F(n)=F(n)+F(n-1)+F(n-2)........

#include <graphics.h>

#include <conio.h>//easyx 输入输出(由三部分组成)

#include<time.h>

#include<stdlib.h>

#include <stdio.h>

#include "win32timer.h"

//处理鼠标点击事件,返回值为整数,代表不同的点击区间。

int panduan()

{

int p=0

MOUSEMSG m

FlushMouseMsgBuffer()//清空鼠标缓存区

while(p==0)

{

m = GetMouseMsg()// 获取一条鼠标消息

//m.uMsg整数,判断是点击鼠标事件类型,左键单击,左键双击,右键单击,右键双击。。。。。。

//m.x表示鼠标点击坐标的x轴数值

//m.y表示鼠标点击坐标的y轴数值

if (m.uMsg == WM_LBUTTONDOWN&&m.x>300&&m.x<400&&m.y>20&&m.y<100)

{

p=1//用户单击鼠标左键,并且点击位置的x坐标在300到400之间,y坐标在20到100之间的区域,函数返回整数1

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>400&&m.x<500&&m.y>20&&m.y<100)

{

p=2

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>500&&m.x<600&&m.y>20&&m.y<100)

{

p=3

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>300&&m.x<400&&m.y>100&&m.y<180)

{

p=4

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>400&&m.x<500&&m.y>100&&m.y<180)

{

p=5

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>500&&m.x<600&&m.y>100&&m.y<180)

{

p=6

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>300&&m.x<400&&m.y>180&&m.y<260)

{

p=7

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>400&&m.x<500&&m.y>180&&m.y<260)

{

p=8

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>500&&m.x<600&&m.y>180&&m.y<260)

{

p=9

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>300&&m.x<400&&m.y>260&&m.y<340)

{

p=10

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>400&&m.x<500&&m.y>260&&m.y<340)

{

p=11

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>500&&m.x<600&&m.y>260&&m.y<340)

{

p=12

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>300&&m.x<400&&m.y>340&&m.y<420)

{

p=13

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>400&&m.x<500&&m.y>340&&m.y<420)

{

p=14

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>500&&m.x<600&&m.y>340&&m.y<420)

{

p=15

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>300&&m.x<400&&m.y>420&&m.y<500)

{

p=16

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>400&&m.x<500&&m.y>420&&m.y<500)

{

p=17

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>500&&m.x<600&&m.y>420&&m.y<500)

{

p=18

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>500&&m.x<600&&m.y>500&&m.y<520)

{

p=19//退出

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>400&&m.x<500&&m.y>500&&m.y<520)

{

p=20//重新开始

}

if (m.uMsg == WM_LBUTTONDOWN&&m.x>300&&m.x<400&&m.y>500&&m.y<520)

{

p=21//查看答案

}

}

return p

}

int cnt = 0

int stop = 0

void myISR_Called_Per_1000ms(void)//1000毫秒触发一次

{

char time[20]

if(stop ==0){

sprintf(time,"时间: %d秒 ",cnt++)

outtextxy(200,500,time)//在屏幕上显示

}

}

/*

* 使用说明:

*

* 1. 用户程序需要 #include "win32timer.h"

* 2. 用户需要将 win32timer.c 添加至根目录,或添加至工程

*3. 用户程序直接调用UserTimerSet(uDelay,UserFun)即可,

*其中,uDelay为定时调用的定时周期,单位为毫秒(ms),

*UserFun为用户被调函数void ISR(void)的函数名ISR。

* 4. 可以同时使用多个timeSetEvent,每个timeSetEvent都可以

*返回定时器编号,详细见MSDN关于timeSetEvent的说明。

*/

void main()

{

IMAGE a,b,shangbiao,xiabiao,kandaan,chenggong

//将图片转化成二进制数据

int c,z=0,e=0

int butong[18]

initgraph(600, 520)//初始化图形系统,参数定义窗口大小

int i,p,w1=0

char x[10],y[10],w[10]

loadimage(&shangbiao,"shangbiao.jpg")//装载图片到内存变量

loadimage(&xiabiao,"xiabiao.jpg")//装载图片到内存变量

loadimage(&kandaan,"kandaan.jpg")//装载图片到内存变量

loadimage(&chenggong,"chenggong.jpg")//装载图片到内存变量

loadimage(&a,"a.jpg")//装载图片到内存变量

loadimage(&b,"b.jpg")//装载图片到内存变量

c=2

UserTimerSet ( 1000, myISR_Called_Per_1000ms ) //新加;设置定时器,每秒钟触发一次,调用myISR_Called_Per_1000ms函数

do{

stop = 0//重新初始化计数器

cnt= 0

z=0,e=0

putimage(0,20,&a)//在坐标(0,20)处绘制图形a.jpg

putimage(0,0,&shangbiao)//在坐标(0,0)处绘制图形shangbiao.jpg

putimage(0,500,&xiabiao)//在坐标(0,500)处绘制图形xiabiao.jpg。

putimage(300,20,&b)//在坐标(300,20)处绘制图形b.jpg。

putimage(300,500,&kandaan)//在坐标(300,500)处绘制图形kandaan.jpg。

for(i=0i<18i++)//利用循环对数组butong赋初值为0

{

butong[i]=0

}

butong[0]=11

butong[1]=18

sprintf(x,"%d",c)//数值变量c的初值为2,此处将数值c的值转换为字符串形式,存储在字符数组变量x中,即x中存储的是“2”。

outtextxy(70,500,x)//在坐标(70,500)处,打印显示x字符串内容“2”。表示 总错数:2

sprintf(y,"%d",z)//数值变量z的初值为0,此处将数值z的值转换为字符串形式,存储在字符数组变量y中,即y中存储的是“0”。

outtextxy(170,500,y)//在坐标(170,500)处,打印显示y字符串内容“0”。表示 找到数:0

sprintf(w,"点击次数:%d次",w1)

outtextxy(0,420,w)

do{

p=panduan()//调用pandun函数,进行鼠标点击事件的处理。

w1=w1+1

sprintf(w,"点击次数:%d次",w1)

outtextxy(0,420,w)

if(p==20){

stop = 0

cnt = 0//新加。清除计时器

w1=0

break//函数返回20表示点击的是“重新开始”。跳出该次do-while;因为p=20,所以继续执行外层的do-while。

}

if(p==19)exit(0)//函数返回10表示点击的是“退出游戏”,exit函数结束程序执行。

if(p==21) //函数返回21表示点击的是“查看答案”

{

stop=-1//新加,查看答案时,停止计时器。

setlinecolor(BLUE)//设置划线的颜色

for(i=0i<ci++)//c为总的不同数2,循环2次。

{ //butong 数组前两个变量被定义为11,18

e=butong[i]

if(e==18)

{

rectangle(500,420,600,500)//e==18时执行;界面中绘制矩形图形,参数为矩形的左上顶点坐标和右下顶点坐标

}

else{

rectangle(400,260,500,340)

}

}

}

for(i=0i<ci++)//循环查看是否找到不同

{

if(p==butong[i])//返回值p是否与不同数组中预制的数值 11 18 相同,相同即认为找到。

{

setlinecolor(RED)//设置划线颜色为红色

if(p==18)//p为18

{

rectangle(500,420,600,500)//在18对应的位置绘制矩形

}

else

{

rectangle(400,260,500,340)//在11对应的位置绘制矩形

}

z=z+1//找到数 加1

sprintf(y,"%d",z)//数值z转换为字符串存入到y中

outtextxy(170,500,y)//界面中更新找到数

}

}

}while(z<c)//只有找到数小于总错误数,循环继续执行。否则循环退出。

if(z=c&&p!=20)//判断总错数是否和找到数相同,并且是否p不等于20

{

putimage(200,100,&chenggong) //绘制图形成功

stop=-1//新加,成功时,停止计时器。

p=panduan()//继续等待用户选择命令。但此处用户选择“重新开始”则游戏重新开始,用户点击其他任意一点,程序都会退出。

}

}while(p==20)

}

1.

udelay()mdelay()ndelay()实现的原理本质上都是忙等待,ndelay和mdelay都是通过udelay衍生出来的,我们使用这些函数的实现往往会碰到编译器的警告implicit declaration of function'udelay',这往往是由于头文件的使用不当造成的。在include/asm-???/delay.h中定义了udelay(),而在include/linux/delay.h中定义了mdelay和ndelay.

udelay一般适用于一个比较小的delay,如果你填的数大于2000,系统会认为你这个是一个错误的delay函数,因此如果需要2ms以上的delay需要使用mdelay函数。

2.由于这些delay函数本质上都是忙等待,对于长时间的忙等待意味这无谓的耗费着cpu的资源,因此对于毫秒级的延时,内核提供了msleep,ssleep等函数,这些函数将使得调用它的进程睡眠参数指定的时间。

应用层:

#include <unistd.h>

1、unsigned int sleep(unsigned int seconds)秒级

2、int usleep(useconds_t usec) 微秒级:1/10^-6

#define _POSIX_C_SOURCE 199309

#include <time.h>

3、int nanosleep(const struct timespec *req, struct timespec *rem)

struct timespec {

time_t tv_sec /* seconds */

long tv_nsec /* nanoseconds */

}

// The value of the nanoseconds field must be in the range 0 to 999999999.

内核层:

include <linux/delay.h>

1、void ndelay(unsigned long nsecs)纳秒级:1/10^-10

2、void udelay(unsigned long usecs)微秒级: 1/10^-6

3、void mdelay(unsigned long msecs)毫秒级:1/10^-3

sleep_on(), interruptible_sleep_on()

sleep_on_timeout(), interruptible_sleep_on_timeout()

根据你的情况选用这些函数,注意: sleep *** 作在kernel必须小心、小心。。。

udelay()等函数是cpu忙等,没有传统意义上的sleep。这些函数相当于我们平时的阻塞读、写之类的语义,主要用于等外设完成某些 *** 作


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8096849.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存