LRC歌词读取和排序算法

LRC歌词读取和排序算法
LRC歌词读取和排序算法

LRC歌词读取和排序算法

已有 14280 次阅读2008-6-5 15:41

代码写了其实挺久了,现在突然想起来,鼓励自己下下,呵呵

代码是为了给SPCE3200做一个微型mp3播放器而做的。界面仿千千静听,使用软件解码器解mp3,滚动条、文件列表,基本功能差不多都有了,后来突然想到为它增加歌词显示,这样才算比较完整。

所以就开始要写lrc的解释程序了。之前对lrc有一点了解,知道它最主要的就是用时间标签表达每一句歌词需要显示的时间。

所以,lrc解释程序的最主要任务就是分析时间标签,然后将实际的歌词拿出来~~~

看代码吧:

#include

#include "lrc.h"

#define isnumeric(a) (((a >= '0') && (a <= '9')) ? 1 : 0)

void CopyLrcInfo(LRC_INFO *DstInfo, LRC_INFO *SrcInfo)

{

DstInfo->Time = SrcInfo->Time;

DstInfo->Prev = SrcInfo->Prev;

DstInfo->Next = SrcInfo->Next;

strcpy(DstInfo->LrcText, SrcInfo->LrcText);

}

LRC_INFO *GetFirstOfList(LRC_QUEUE *List)

{

return &List->List[List->First];

}

u16_t InsertList(LRC_QUEUE *List, u32_t Time, char LrcText[])

{

int InsertPos = -1;

u16_t i;

LRC_INFO *lp = &List->List[List->Last];

if(List->Length == 0)

{

List->List[0].Time = Time;

strcpy(List->List[0].LrcText, LrcText);

List->List[0].Prev = (void*)0;

List->List[0].Next = (void*)0;

List->First = 0;

List->Last = 0;

List->Length = 1;

InsertPos = 0;

}

else

{

for(i = List->Length; i != 0; i--)

{

if(lp->Time <= Time)

{

if(i == List->Length)

{

List->Last = List->Length;

lp->Next = &List->List[List->Length];

List->List[List->Length].Prev = lp;

List->List[List->Length].Next = (void*)0;

// List->First = List->Length;

// lp->Prev = &List->List[List->Length];

// List->List[List->Length].Prev = (void*)0;

// List->List[List->Length].Next = lp;

}

else

{

LRC_INFO *temp = lp->Next;

lp->Next = &List->List[List->Length];

List->List[List->Length].Prev = lp;

List->List[List->Length].Next = temp;

temp->Prev = &List->List[List->Length];

}

List->List[List->Length].Time = Time;

strcpy(List->List[List->Length].LrcText, LrcText); InsertPos = (List->Length = List->Length + 1);

break;

}

else if(i == 1)

{

List->First = List->Length;

lp->Prev = &List->List[List->Length];

List->List[List->Length].Prev = (void*)0;

List->List[List->Length].Next = lp;

List->List[List->Length].Time = Time;

strcpy(List->List[List->Length].LrcText, LrcText);

InsertPos = (List->Length = List->Length + 1);

// List->Last = List->Length;

// lp->Next = &List->List[List->Length];

// List->List[List->Length].Prev = lp;

// List->List[List->Length].Next = (void*)0;

// List->List[List->Length].Time = Time;

// strcpy(List->List[List->Length].LrcText, LrcText);

// InsertPos = (List->Length = List->Length + 1);

}

lp = lp->Prev;

}

}

return InsertPos;

}

u32_t GetLrcInfo(char *LrcFile, u32_t FileSize, LRC_QUEUE *List) {

s32_t ōffsetTime = 0;

u32_t CurOffset = 0;

u32_t CurTime = 0;

u32_t TempOffset;

int Flag = 0;

memset(List, 0, sizeof(*List));

// List->Length = 0;

// List->First = 0;

// List->Last = 0;

// List->List[0].Prev = (void*)0;

// List->List[0].Next = (void*)0;

do {

if(LrcFile[CurOffset++] == '[')

{

if(Flag == 0)

if(strncmp(&LrcFile[CurOffset], "offset:", 7) == 0)

{

CurOffset += 7;

if(LrcFile[CurOffset] == '-')

{

Flag = -1;

CurOffset++;

}

else

Flag = 1;

while(LrcFile[CurOffset] != ']')

{

OffsetTime *= 10;

OffsetTime += LrcFile[CurOffset++] - '0';

}

OffsetTime = OffsetTime / 10 * Flag;

}

if(isnumeric(LrcFile[CurOffset]))

{

char *lrc;

Flag = 1;

CurTime = (((LrcFile[CurOffset] - '0') * 10 + (LrcFile[CurOffset + 1] - '0')) * 60 +

((LrcFile[CurOffset + 3] - '0') * 10 + LrcFile[CurOffset + 4] - '0')) * 100;

CurOffset += 5;

if(LrcFile[CurOffset] == '.')

{

CurTime += (LrcFile[CurOffset + 1] - '0') * 10 + LrcFile[CurOffset + 2] - '0';

CurOffset += 3;

}

CurOffset++;

TempOffset = CurOffset;

while((LrcFile[TempOffset] == '[') && isnumeric(LrcFile[TempOffset + 1]))

{

while((LrcFile[TempOffset] != ']') && (TempOffset < FileSize))

TempOffset++;

TempOffset++;

}

lrc = &LrcFile[TempOffset];

while((LrcFile[TempOffset] != 0x0d) && (LrcFile[TempOffset] != 0x0a) && (TempOffset < FileSize))

TempOffset++;

LrcFile[TempOffset] = '\0';

InsertList(List, CurTime + OffsetTime, lrc);

}

// else

// {

// while(LrcFile[CurOffset++] != ']');

// }

}

} while(CurOffset < FileSize);

return 0;

}

头文件:

#ifndef __LRC_H__

#define __LRC_H__

#define MAX_LINE 128

#define MAX_LINE_LEN 255

typedef int s32_t;

typedef unsigned int u32_t;

typedef unsigned short u16_t;

typedef unsigned char u8_t;

typedef struct _LRC_INFO {

u32_t Time;

char LrcText[MAX_LINE_LEN];

struct _LRC_INFO *Prev;

struct _LRC_INFO *Next;

} LRC_INFO;

typedef struct {

LRC_INFO List[MAX_LINE];

u16_t Length;

u16_t First;

u16_t Last;

} LRC_QUEUE;

u32_t GetLrcInfo(char *LrcFile, u32_t FileSize, LRC_QUEUE *List);

LRC_INFO *GetFirstOfList(LRC_QUEUE *List);

#endif

代码主体部分用来从lrc数据的开头开始解析时间标签,检测到一个标签就将对应的歌词提取出来,并放入一个链表中。

采用链表是为了方便排序。在这段代码中同时提供了典型的链表排序的过程,这样,扫描以便lrc数据,就可以将所有的时间标签以及对应的歌词提取出来,并顺序放到链表中~~

程序中虽然用到了链表,但是并没有使用动态内存分配,因为本身这个程序是给嵌入式平台写的,确切的说,是一个“裸奔”的嵌入式平台,呵呵~~

这个代码在vc下验证通过,不过之前的那个vc project找不到了,真是无语~~ 唉,我还是挺邋遢的一人~经常弄丢自己的东西

HTML网页歌曲播放器+歌词同步

歌曲试听 开始(选择“单击时”)-->方向(选择“自左侧”)-->速度(选择“中速”)。点击动画的最后一行的“下箭头”,进入“效果选项”,在“动画播放后”里选择一个颜色(如蓝色)-->确定。(这一步是希望每一行歌词播完后变成蓝色字体,你如果不希望字体变色,可以忽略这一步。) ※这一步设置问题可以依据操作者的爱好去定。 第二步:歌曲文件的插入与设置 1.将欲插入的歌曲文件(假设文件名是abs.mp3)与以

排序算法

一、冒泡排序 冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。 代码实现如下: 二、插入排序 插入排序的基本思想是每步将一个待排序的记录按其排序码值的大小,插到前面已经排好的文件中的适当位置,直到全部插入完为止。插入排序方法主要有直接插入排序和希尔排序。 直接插入排序具体算法描述如下: 1. 从第一个元素开始,该元素可以认为已经被排序 2. 取出下一个元素,在已经排序的元素序列中从后向前扫描 3. 如果该元素(已排序)大于新元素,将该元素移到下一位置 4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 5. 将新元素插入到下一位置中 6. 重复步骤2 伪码描述如下: 代码实现如下:

三、归并排序 归并排序是将两个或两个以上的有序子表合并成一个新的有序表。初始时,把含有n个结点的待排序序列看作由n个长度都为1的有序子表组成,将它们依次两两归并得到长度为2的若干有序子表,再对它们两两合并。直到得到长度为n的有序表,排序结束。 归并操作的工作原理如下: 1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 2、设定两个指针,最初位置分别为两个已经排序序列的起始位置 3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 4、重复步骤3直到某一指针达到序列尾 5、将另一序列剩下的所有元素直接复制到合并序列尾 代码实现如下:

数据结构各种排序算法的时间性能

HUNAN UNIVERSITY 课程实习报告 题目:排序算法的时间性能学生姓名 学生学号 专业班级 指导老师李晓鸿 完成日期

设计一组实验来比较下列排序算法的时间性能 快速排序、堆排序、希尔排序、冒泡排序、归并排序(其他排序也可以作为比较的对象) 要求 (1)时间性能包括平均时间性能、最好情况下的时间性能、最差情况下的时间性能等。 (2)实验数据应具有说服力,包括:数据要有一定的规模(如元素个数从100到10000);数据的初始特性类型要多,因而需要具有随机性;实验数据的组数要多,即同一规模的数组要多选几种不同类型的数据来实验。实验结果要能以清晰的形式给出,如图、表等。 (3)算法所用时间必须是机器时间,也可以包括比较和交换元素的次数。 (4)实验分析及其结果要能以清晰的方式来描述,如数学公式或图表等。 (5)要给出实验的方案及其分析。 说明 本题重点在以下几个方面: 理解和掌握以实验方式比较算法性能的方法;掌握测试实验方案的设计;理解并实现测试数据的产生方法;掌握实验数据的分析和结论提炼;实验结果汇报等。 一、需求分析 (1) 输入的形式和输入值的范围:本程序要求实现各种算法的时间性能的比 较,由于需要比较的数目较大,不能手动输入,于是采用系统生成随机数。 用户输入随机数的个数n,然后调用随机事件函数产生n个随机数,对这些随机数进行排序。于是数据为整数 (2) 输出的形式:输出在各种数目的随机数下,各种排序算法所用的时间和 比较次数。 (3) 程序所能达到的功能:该程序可以根据用户的输入而产生相应的随机 数,然后对随机数进行各种排序,根据排序进行时间和次数的比较。 (4)测试数据:略 二、概要设计

Lrc歌词编辑器

如何使用Lrc歌词编辑器制作Lrc歌词? 作者https://www.360docs.net/doc/6815442474.html,来源速配歌词浏览1016 发布时间10/10/12有了“速配歌词”这些能自动从网上搜索下载歌词的软件,我们欣赏歌曲时不用时常为歌词劳神了。不过,并不是所有的歌都能从网上找到合适的歌词:太老或太新的歌都不易从网上找到现成的歌词;自己压制的MP3要找到与之匹配的歌词也比较困难。这时候,我们就得自己动手来编制歌词了。 歌词有外挂歌词和内嵌歌词两类,外挂歌词实际是一个包含时间码和歌词文本的本文文件,内嵌歌词则是把外挂歌词的文本放入了音频文件的文件头中,但内嵌歌词的规格并不统一,如用Windows Media Player制作的内嵌歌词并不能被其它的歌词插件所支持。所以,我们所用的歌词制作工具最好能同时支持外挂歌词和内嵌歌词的制作,这样才会有最好的兼容性。这里给大家推荐两款歌词制作工具。 介绍如何使用LRC歌词编辑器结合Winamp播放器制作LRC歌词: 1.首先启动你的Winamp播放器,载入音乐文件,如果没有winamp,可以到速配歌词官方网下载;如下图: 2.启动LRC歌词编辑器:它可以制作LRC格式的外挂歌词,也是目前用途最广,兼容性最好的歌词文件格式。 (LRC歌词编辑器下载地址:https://www.360docs.net/doc/6815442474.html,/lrc/lrc/sp_editlrc.htm)使用Lrc歌词编辑器,我们也必须清楚一下Lrc歌词编辑器的一些常用热键,这些常用快捷键对我们制作Lrc歌词非常有帮助,可以更加快捷、方便:

F5 : 插入时间标签, F6 :删除时间标签,F3开始播放winamp,F4暂停winamp 播放,F9测试歌词 打开LRC歌词编辑器,如图所示: 3.现在开始正式制作,在Lrc歌词编辑器里面先点击“打开歌词文件”按钮(上图1)选择你要制作的歌词文件,或者在LRC歌词编辑器的歌词编辑窗口(见上图)中输入歌词文本,当然如果有现成的歌词文本用“复制”和“粘贴”要更省事一些。歌词最好是一句一行,这样显示歌词时就一目了然了。 4.歌曲和歌词文本准备好后,点击工具栏中的“播放”按钮(上图2),当然也可以使用快捷键F3,LRC歌词编辑器即开始播放歌曲,播放winamp播放列表中的歌曲。 5.歌曲播放时,把插入点光标放在第一句歌词上,当歌曲进行到第一句时,单击工具栏中的“加入标签”按钮(上图3,也可以按快捷键F5)即可在第一句前插入时间标签,而插入点光标会自动跳到下一行,以下的歌词也同样用点击“加入标签”按钮的方法来加入时间标签。如果一句歌词会重复出现,可以在它的前面多次加上时间标签当音乐播放到相应的歌词时按【加入标签】,则在歌词前面出现时间标定;

几种排序算法的分析与比较--C语言

一、设计思想 插入排序:首先,我们定义我们需要排序的数组,得到数组的长度。如果数组只有一个数字,那么我们直接认为它已经是排好序的,就不需要再进行调整,直接就得到了我们的结果。否则,我们从数组中的第二个元素开始遍历。然后,启动主索引,我们用curr当做我们遍历的主索引,每次主索引的开始,我们都使得要插入的位置(insertIndex)等于-1,即我们认为主索引之前的元素没有比主索引指向的元素值大的元素,那么自然主索引位置的元素不需要挪动位置。然后,开始副索引,副索引遍历所有主索引之前的排好的元素,当发现主索引之前的某个元素比主索引指向的元素的值大时,我们就将要插入的位置(insertIndex)记为第一个比主索引指向元素的位置,跳出副索引;否则,等待副索引自然完成。副索引遍历结束后,我们判断当前要插入的位置(insertIndex)是否等于-1,如果等于-1,说明主索引之前元素的值没有一个比主索引指向的元素的值大,那么主索引位置的元素不要挪动位置,回到主索引,主索引向后走一位,进行下一次主索引的遍历;否则,说明主索引之前insertIndex位置元素的值比主索引指向的元素的值大,那么,我们记录当前主索引指向的元素的值,然后将主索引之前从insertIndex位置开始的所有元素依次向后挪一位,这里注意,要从后向前一位一位挪,否则,会使得数组成为一串相同的数字。最后,将记录下的当前索引指向的元素的值放在要插入的位置(insertIndex)处,进行下一次主索引的遍历。继续上面的工作,最终我们就可以得到我们的排序结果。插入排序的特点在于,我们每次遍历,主索引之前的元素都是已经排好序的,我们找到比主索引指向元素的值大的第一个元素的位置,然后将主索引指向位置的元素插入到该位置,将该位置之后一直到主索引位置的元素依次向后挪动。这样的方法,使得挪动的次数相对较多,如果对于排序数据量较大,挪动成本较高的情况时,这种排序算法显然成本较高,时间复杂度相对较差,是初等通用排序算法中的一种。 选择排序:选择排序相对插入排序,是插入排序的一个优化,优化的前提是我们认为数据是比较大的,挪动数据的代价比数据比较的代价大很多,所以我们选择排序是追求少挪动,以比较次数换取挪动次数。首先,我们定义我们需要排序的数组,得到数组的长度,定义一个结果数组,用来存放排好序的数组,定义一个最小值,定义一个最小值的位置。然后,进入我们的遍历,每次进入遍历的时候我们都使得当前的最小值为9999,即认为每次最小值都是最大的数,用来进行和其他元素比较得到最小值,每次认为最小值的位置都是0,用来重新记录最小值的位置。然后,进入第二层循环,进行数值的比较,如果数组中的某个元素的值比最小值小,那么将当前的最小值设为元素的值,然后记录下来元素的位置,这样,当跳出循环体的时候,我们会得到要排序数组中的最小值,然后将最小值位置的数值设置为9999,即我们得到了最小值之后,就让数组中的这个数成为最大值,然后将结果数组result[]第主索引值位置上的元素赋值为最小值,进行下一次外层循环重复上面的工作。最终我们就得到了排好序的结果数组result[]。选择排序的优势在于,我们挪动元素的次数很少,只是每次对要排序的数组进行整体遍历,找到其中的最小的元素,然后将改元素的值放到一个新的结果数组中去,这样大大减少了挪动的次序,即我们要排序的数组有多少元素,我们就挪动多少次,而因为每次都要对数组的所有元素进行遍历,那么比较的次数就比较多,达到了n2次,所以,我们使用选择排序的前提是,认为挪动元素要比比较元素的成本高出很多的时候。他相对与插入排序,他的比较次数大于插入排序的次数,而挪动次数就很少,元素有多少个,挪动次数就是多少个。 希尔排序:首先,我们定义一个要排序的数组,然后定义一个步长的数组,该步长数组是由一组特定的数字组成的,步长数组具体得到过程我们不去考虑,是由科学家经过很长时间计算得到的,已经根据时间复杂度的要求,得到了最适合希尔排序的一组步长值以及计算

各种排序算法的总结和比较

各种排序算法的总结和比较 1 快速排序(QuickSort) 快速排序是一个就地排序,分而治之,大规模递归的算法。从本质上来说,它是归并排序的就地版本。快速排序可以由下面四步组成。 (1)如果不多于1个数据,直接返回。 (2)一般选择序列最左边的值作为支点数据。(3)将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。 (4)对两边利用递归排序数列。 快速排序比大部分排序算法都要快。尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。 2 归并排序(MergeSort)

归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。 3 堆排序(HeapSort) 堆排序适合于数据量非常大的场合(百万数据)。 堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。 堆排序会将所有的数据建成一个堆,最大的数据在堆顶,然后将堆顶数据和序列的最后一个数据交换。接下来再次重建堆,交换数据,依次下去,就可以排序所有的数据。

Shell排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。平均效率是O(nlogn)。其中分组的合理性会对算法产生重要的影响。现在多用D.E.Knuth的分组方法。 Shell排序比冒泡排序快5倍,比插入排序大致快2倍。Shell排序比起QuickSort,MergeSort,HeapSort慢很多。但是它相对比较简单,它适合于数据量在5000以下并且速度并不是特别重要的场合。它对于数据量较小的数列重复排序是非常好的。 5 插入排序(InsertSort) 插入排序通过把序列中的值插入一个已经排序好的序列中,直到该序列的结束。插入排序是对冒泡排序的改进。它比冒泡排序快2倍。一般不用在数据大于1000的场合下使用插入排序,或者重复排序超过200数据项的序列。

如何制作LRC歌词

如何制作Lrc歌词文件 曾在网上看到很多朋友在问:怎样制作Lrc歌词文件?哪里有XXX歌的Lrc 歌词? 今天,我就来告诉那些不会制歌词文件的朋友们。 首先,推荐大家使用千千静听,又能听歌,又能制作和调整歌词,感觉真的不错! 要制作歌词文件,就要用到“歌词秀”了,千千静听打开后,再打开歌词秀,右键选“编辑歌词”。举个例子吧,比如要制作“一直很安静”这首歌的歌词。 1、创建歌歌词文本:如果你已经有了该歌词的文本文档,你可以直接复制粘到歌词秀中;如果没有,你可以自己打出来。注意尽量让歌词一句一句的排好。如下图: 2、接下来就是最重要的环节了,也就是每句歌词前面的时间标签。一句歌词前的时间标签意味着该句歌词在什么时候跳出,所以我们就得把握好这个时间性,以实现歌与词的同步。好了,话不多说,大家先注意一个功能键“替换时间标签(F10)”(一个类似倒三角形形状的按纽),呆会,自然用到它。好了,开始了》》》 先播放“一直很安静”,然后把光标移到首先要跳出的歌词“空荡的街景”的顶端,如下图:

当马上就要播放到该句时,鼠标点下“替换时间标签(F10)”按纽(或不用鼠标,按下F10也行),你会发现“空荡的街景”该句歌词前面出现了一个时间标签。如下图: 接下来不用任操作,光标会自动跳到一句歌词的顶端,当马上又要播放到这句时,鼠标再次点下“替换时间标签(F10)”按纽(或直接按F10),这一句的时间标签也又弄好了。 依此类推,当播放完整首歌时,你也成功的把每句歌词前的时间标签弄好了。 弄好后,命名保存到TTplayer目录下的“Lyrics”或“PlayList”文件夹中都可以,这样当你下次再播放这首歌时,千千静听就会自动识别,让它在歌词秀中显示出来了。然后再点感歌词秀左上角的第一个按纽“返回歌词秀”,看看吧:

c语言排序算法总结(主要是代码实现)

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 #include void bubbleSort(int arr[], int count) { int i = count, j; int temp; while(i > 0) { for(j = 0; j < i - 1; j++) { if(arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } i--; } } int main(int arc, char* const argv[]) { int arr[] = {5, 4, 1, 3, 6}; bubbleSort(arr, 5); int i; for(i = 0; i < 5; i++) printf("%4d", arr[i]); } 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 #include int main() { int a[]={2,3,4,5,1,7,0,9}; int len=sizeof(a)/sizeof(a[0]); select_sort(a,len); for(int i=0;i a[ j]) min = j; //交换 if( min != i) { t = a[ min]; a[ min] = a[ i]; a[ i] = t; } } } 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于 未排序数据,在已排序序列中从后向前扫描,找到相应

几种常见内部排序算法比较

常见内部排序算法比较 排序算法是数据结构学科经典的内容,其中内部排序现有的算法有很多种,究竟各有什么特点呢?本文力图设计实现常用内部排序算法并进行比较。分别为起泡排序,直接插入排序,简单选择排序,快速排序,堆排序,针对关键字的比较次数和移动次数进行测试比较。 问题分析和总体设计 ADT OrderableList { 数据对象:D={ai| ai∈IntegerSet,i=1,2,…,n,n≥0} 数据关系:R1={〈ai-1,ai〉|ai-1, ai∈D, i=1,2,…,n} 基本操作: InitList(n) 操作结果:构造一个长度为n,元素值依次为1,2,…,n的有序表。Randomizel(d,isInverseOrser) 操作结果:随机打乱 BubbleSort( ) 操作结果:进行起泡排序 InserSort( ) 操作结果:进行插入排序 SelectSort( ) 操作结果:进行选择排序 QuickSort( ) 操作结果:进行快速排序 HeapSort( ) 操作结果:进行堆排序 ListTraverse(visit( )) 操作结果:依次对L种的每个元素调用函数visit( ) }ADT OrderableList 待排序表的元素的关键字为整数.用正序,逆序和不同乱序程度的不同数据做测试比较,对关键字的比较次数和移动次数(关键字交换计为3次移动)进行测试比较.要求显示提示信息,用户由键盘输入待排序表的表长(100-1000)和不同测试数据的组数(8-18).每次测试完毕,要求列表现是比较结果. 要求对结果进行分析.

详细设计 1、起泡排序 算法:核心思想是扫描数据清单,寻找出现乱序的两个相邻的项目。当找到这两个项目后,交换项目的位置然后继续扫描。重复上面的操作直到所有的项目都按顺序排好。 bubblesort(struct rec r[],int n) { int i,j; struct rec w; unsigned long int compare=0,move=0; for(i=1;i<=n-1;i++) for(j=n;j>=i+1;j--) { if(r[j].key

实现声音与歌词同步的三种方法

实现声音与歌词同步的三种方法 日期:2004-2-27 作者:飞翔阅读:265 1. 目的: 学习Flash中的Sound凼数,掌握在制作FlashMTV时声音与歌词同步的两种方法。 2. 方法一: ·导入一个声音文件,建立一个声音层,在声音层的第一帧处打开声音面板,选择需要使用的声音文件,设置声音同步属性为数据流,循环次数为0,如图(1)所示: ·估计声音层所用的帧数,帧数=播放时间*帧频。大家再看右图的最下面,其中“16.8 s”表示这段音乐的播放时间为16.8秒。如果你的帧频为12fps,那么总帧数应该为200帧左右。 ·在适当位置按F5插入一个空白关键帧。拖动声音层的最后一帧(相对的)直到有空白帧出现,单击选择声音的最后一帧,再向右拖动鼠标选择所有的空白帧,然后单击右键,点击清除帧,如图(2)所示。 ·建立一个文本动画层,按回车键播放声音,由于声音是数据流形式,你可以参照声音在该层上添歌词。 3.方法二: ·第一步,同方法一,只是声音同步属性为默认的事件同步。 · 建立一个文字动画层,对照声音的波形,在声音的波谷处添上相应的歌词。通常情况下,我们在时间线面板上看到的波形很不明显,无法确定波谷。别着急,点击图(3)的编辑按钮。这里我们不是编辑声音,而是观察波形。默认状态下,在声音编辑面板看到的波形与在时间线面板上看到的一样。点击面板下方图(3)所示的缩小按钮,缩小波形图,我们可以看到图(4)所示的波形图,红线所处的地方均是波谷,第一个波谷很明显在第一帧。 ·波形图的标尺默认的是以时间秒为单位,得使用“帧数=播放时间*帧频”来计算。为了方便,我们

设置帧为标尺单位,点击图(3)第四个按钮就行了。见图(4),我们可以发现第二个波谷应在第80左右。如果要求精确,,点击扩大按钮,就可以准确知道该是第几帧了。 ·在第一帧添第一句歌词,在第二个波谷所在帧的下一帧开始添第二句歌词,其它依次类推。 4. 方法三: ·导入一个声音文件,建立一个文本动画层,接着写进歌词,每一帧对应一句歌词。 ·新建一个空白角本电影夹。 ·建立一个角本层。在第一帧拖入空白角本电影夹,并加入帧角本stop,如图(5): ·在图库面板中右键点击我们要使用的声音文件,从弹出菜单中选择连接,选择链接选项中“为动作脚本导出”和“在第一帧导出”,然后就在标识符输入框中键入myMusic,从而关联这个声音。如图(6): ·选择空白角本电影夹,写入如下代码: onClipEvent (load) { //一下载电影夹就触发事件 music = new Sound(); //自定义一个“music”声音对象 music.attachSound("myMusic"); //捆绑声音,myMusic为被关联声音的ID music.start(); // 播放声音 inc = 0; // 定义变量,赋予初值 timerStart = getTimer(); // 定义刚开始播放声音的时间与现在的时间的时间相等。 labelTimeList = [4, 8, 11, 15]; // 自定义一个数组来设定每句歌词出现的时间(单位为秒),可用Media Player来获取每一元素的值。 } onClipEvent (enterFrame) { //只要电影夹存在就触发事件 if (getTimer()-timerStart>labelTimeList[inc]*1000) { //读取现在的时间,与刚开始的时间做比较,如果大于所设定的时间, 则跳到下一帧,即为播放下一句歌词 inc == inc++; _root.nextFrame(); } }

排序算法题目及其代码

排序算法题目及其代码 1、明明的随机数(Noip2006) 【问题描述】 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。 【输入文件】 输入文件random.in 有2行, 第1行为1个正整数,表示所生成的随机数的个数:N 第2行有N个用空格隔开的正整数,为所产生的随机数。 【输出文件】 输出文件random.out 也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。 【输入样例】 10 20 40 32 67 40 20 89 300 400 15 【输出样例】 8 15 20 32 40 67 89 300 400 【参考程序】 var n,s:byte; i,min,max,x:word; b:array[1..1000]of boolean; begin assign(input,'random.in');reset(input); assign(output,'random.out');rewrite(output); readln(n); fillchar(b,sizeof(b),false); min:=1000;max:=0;s:=0; for i:=1 to n do begin read(x); b[x]:=true; if xmax then max:=x; end; close(input); for i:=min to max do if b[i] then inc(s); writeln(s); for i:=min to max do if b[i] then write(i,' ');

怎样给网页制做lrc歌词

怎样给网页制做lrc歌词.txt蜜蜂整日忙碌,受到赞扬;蚊子不停奔波,人见人打。多么忙不重要,为什么忙才重要。怎样给网页制做lrc歌词 悬赏分:30 - 提问时间2006-9-13 17:28 我想在博客上做出类似百度音乐试听中的歌词同步效果,就是那个歌词不停滚动,而且正在唱的那一句以大字体红色显示.哪位高手知道如何做? 问题补充:伟皮.能再解释一下吗.我试了,有点问题.歌词没显示出来,只显示歌词正在加载中. 提问者:我是周旭 - 试用期一级其他回答共 3 条 绿色井陉绿色家园