我有一个c语言程序不懂,大家快来帮帮忙!

我有一个c语言程序不懂,大家快来帮帮忙!,第1张

直接从你的程序改的,容易懂一些。如果还不懂的再问,200分啊..终于受不住诱惑出手了一把

#include <fstream>//头文件,不说了

#include <string>

#include <iostream>

using namespace std

class key

{

public:

string word

int count

key(string s="",int c=0):word(s),count(c){}//构造函数,count初始为0

}

key keyword[3]

fstream file//c++里面的文件读写

string fname,buf

int num,k=1,bit=0

bool ischar(char c){//判断一个字符是否为字母

if(c>='a' &&c<='z')return true

if(c>='A' &&c <='Z')return true

if(c=='_') return true

return false

}

string getword(fstream &fp)//提取一个单词

{

int i=0

char c

string ret=""

do{

c=fp.get()//从文件中读取一个字符

if(c==0x0A)k++//如果是回车,行数加1

}while(!ischar(c) &&c!=EOF)//略过非字母的字符,直到型汪出现第一个字母或者文件结束

if(c==EOF)return ""//文件结束返回空

do{

ret+=c//把字符接到字符串后面

c=fp.get()//原理同上

if(c==0x0A)k++

}while(ischar(c))

//fp.putback(c)

return ret

}

void lookup(string p)

{

int i

string q,s

int tmp=0

int pos

for(i=0i<numi++)

{

if(p==keyword[i].word)//如果与关键字匹配

keyword[i].count++

}

return

}

void main()

{

//设置关键字

keyword[0].word="if"缓轿

keyword[1].word="while"

keyword[2].word="case"

int i=0

long length=0

string word

//string fname

while(1)

{

cout<<"请输入文件名:"<<endl//c++用cout和cin来标准输入和输出

cin>>fname

file.open(fname.c_str())//打开文件

if(!file)

{

cout<<"输入有误,请重试!\n"

continue

}

break

}

num=sizeof(keyword)/sizeof(struct key)

while(!(word=getword(file)).empty())//找扰租肆到一个单词

{

lookup(word)

length++//单词数目

}

file.close()

cout<<"统计结果如下:\n"

for(i=0i<numi++)

cout<<"关键词:"<<keyword[i].word<<" 数量:"<<keyword[i].count<<endl

//if(bit==0)

//{

// cout<<"行数:\n"<<k<<endl

//}

//else

cout<<"行数:"<<k<<endl

cout<<"单词数:"<<length<<endl

}

注释:sun_yanteng的问题我确实没有考虑过,修改一下,在判断字符的时候(ischar()函数)把'_'加进去就可以了,参见改过的程序。

但是要注意一点,这个问题涉及到如何定义“单词”的问题。如果说程序里任意一个变量都可以看作一个单词的话,那么"_"这个字符也会被看成单词,因为"_"也是一个合法的变量名(不信你可以试试在程序里定义: int _编译还是能通过的)。

要不然,“单词”仅仅指的是文字意义的单词,"a_b"就会被当成两个单词,因为英语里面下划线不是单词的一部分,但转折符号"-"却可以,例如这么一个单词"self-assured"。在C++里面,这表示两个变量相减,因此是2个单词。

改过之后的程序考虑的是第一种情况,即C++的每个合法变量都当成一个单词。如果你想换成第二种情况,在ischar()函数里,把'_'换成'-'就可以了。

NUM EQU 30H

UP EQU P3.6

DN EQU P3.7

ORG 0000H

AJMPSTART Fosc=12MHz

ORG 000BH T0 中断入口地址

AJMPINT_T0

ORG 001BH T1 中断入口地址

AJMPINT_T1

START:

MOV SP, #60H

MOV TMOD, #11H

MOV IE, #8AH

MOV IP, #08H T1中断优先于T0中断

MOV TH1, #3CH

MOV TL1, #0BH 以上为系统初始化,物橘岁T=60ms

W1: MOV P2, #01110001B等待提示"F" ,01110001

LCALL GETKEY

CJNE A, #0FFH, W1

MOV A, B

CJNEA, #0AH, W2

LCALL KEY_A输入键是'A',转KEY_A

SJMP W1

W2: CJNE A, #0BH, W3

LCALL KEY_B 输入键是'B',转KEY_B

W3: CJNE A, #0CH, W4

LCALL KEY_C 输入键是'C',转KEY_C

W4: CJNE A, #0DH, W5

LCALL KEY_D

SJMP W1输入键是'D',转KEY_D

W5: CJNE A,#0EH,W6 下一首

INC NUM

MOV A,NUM

CJNE A,#4,W51

W51:

JC W52

MOV NUM,#0

W52:

MOV A,NUM

SJMP D0

W6: CJNE A,#0FH,W7 上一首

MOV A,NUM

JNZ W61

MOV NUM,#4

W61:

DEC NUM

MOV A,NUM

SJMP D0

W7:

SJMP W1

KEY_A:从1~4按顺序播放

LCALL MUSIC1 乐曲《我和你》

LCALL MUSIC2 乐曲《万水千山总是情》

LCALL MUSIC3 乐曲《送别》

LCALL MUSIC4 乐曲《北京欢迎您》

RET

KEY_B: 从1~4循环播放

T11: LCALL KEY_A

SJMP T11

RET

KEY_C:循环播放某一乐曲伍念

T3: LCALL GETWORD

CJNE A, #0FFH, T3

MOV A, B

D0:

JNZ D1

SJMP E0

D1: DEC A

JNZ D2

SJMP E1

D2: DEC A

JNZ E3

SJMP E2

E0: LCALL MUSIC1乐曲《我和你》

SJMP E0

E1: LCALL MUSIC2 乐曲《万水千山总是情》

SJMP E1

E2: LCALL MUSIC3 乐曲《送别》

SJMP E2

E3: LCALL MUSIC4 乐曲《北京欢迎您》

SJMP E3

RET

KEY_D: 从某一乐曲开始播放,播放完后停止

T2: LCALL GETWORD

CJNE A, #0FFH, T2

MOV A, B

CJNE A, #00H, B1

SJMP C0

B1: CJNE A, #01H, B2

SJMP C1

B2: CJNE A, #02H, C3

SJMP C2

C0: LCALL MUSIC1 乐曲《我和你》

C1: LCALL MUSIC2 乐曲 《万水千山总是情》

C2: LCALL MUSIC3 乐曲《送别》

C3: LCALL MUSIC4 乐曲《北京欢迎您》

RET

MUSIC1: 第一首《我和你罩睁》

MOV P2, #00000110B显示1,00000110

MOV R5, #11111001B

MOV 52H, #HIGH TABLE10

MOV 53H, #LOW TABLE10

MOV NUM,#0

LCALL music

RET

MUSIC2: 第二首《万水千山总是情》

MOV P2, #01011011B 显示2,01011011

MOV R5, #10100100B

MOV 52H, #HIGH TABLE20

MOV 53H, #LOW TABLE20

MOV NUM,#1

LCALL music

RET

MUSIC3:第三首《送别》

MOV P2, #01001111B显示3,01001111

MOV R5, #10110000B

MOV 52H, #HIGH TABLE30

MOV 53H, #LOW TABLE30

MOV NUM,#2

LCALL music

RET

MUSIC4: 第四首《北京欢迎您》

MOV P2, #01100110B 显示4,01100110

MOV R5, #10011001B

MOV 52H, #HIGH TABLE40

MOV 53H, #LOW TABLE40

MOV NUM,#3

LCALL music

RET

music: MOV R3,#00H音乐解码器

NEXT20:

MOV A,P3

ORL A,#0C0H

MOV P3,A

MOV A,P3

CPL A

ANL A,#0C0H

JZ NEXT21

POP ACC

POP ACC

LJMP W1

RET

NEXT21:

MOV A, R3

MOV DPH, 52H

MOV DPL, 53H

MOVC A, @A+DPTR

MOV R2, A

JZ STOP

ANL A, #0FH

MOV R1, A

MOV A, R2

SWAP A

ANL A, #0FH

JNZ SING

CLR TR0

JMP W11

----------------------------------------------------------

SING:

DEC A

MOV 22H, A

RL A

MOV DPTR, #TABLE00

MOVC A, @A+DPTR

MOV TH0, A

MOV 21H, A

MOV A, 22H

RL A

INC A

MOVC A, @A+DPTR

MOV TL0, A

MOV 20H, A

SETB TR0

SETB TR1

W11:

LCALL DELAY3

INC R3

LJMP NEXT20

-----------------------------------------------------------

STOP:

CLR TR0

CLR TR1

RET

***************************************************

定时器0中断子程序

***************************************************

INT_T0:

CLR TR0

MOV TL0, 20H

MOV TH0, 21H

CPL P3.0

SETB TR0

RETI

***************************************************

定时器1中断子程序

***************************************************

INT_T1:

CLR TR1

CLR TR0

LCALL KEY_E

MOV TH1, #3CH

MOV TL1, #0BH

DJNZ 60H, OUT

MOV 60H, #20

OUT:

SETB TR1

RETI

KEY_E:

JB P3.1, L2 中断键盘检测

LCALL DELAY2消除抖动

JB P3.1, L2如果是高电平就跳到L2

JNB P3.1, $如果仍然是低电平就执行中断程序

MOV P2, #0111100B让LED显示E,01111001

L3: JB P3.1, $检测低电平,直到低电平时才跳出该指令

LCALL DELAY2

JB P3.1, L3

JNB P3.1, $如果再来一个高电平才跳出中断

MOV P2,R5

L2: SETB TR0

RET

GETKEY: 读A B C D键盘子程序

SA: JB P1.0, SB 读A,是高电平表示没有按键,跳转到SB

LCALL DELAY2

JB P1.0, SA

JNB P1.0, $

MOV P2, #01110111B 显示A,01110111

MOV R5, #10001000B

MOV A, #0FFH

MOV B, #0AH

RET

SB: JB P1.1, C11 读B,是高电平表示没有按键按下,跳转到C11

LCALL DELAY2

JB P1.1, SB

JNB P1.1, $

MOV P2, #01111100B显示B,01111100

MOV R5, #10000011B

MOV A, #0FFH

MOV B, #0BH

RET

C11:JB P1.2, ED1 读C

LCALL DELAY2

JB P1.2, C11

JNB P1.2, $

MOV P2, #00111001B 显示C,00111001

MOV R5, #11000110B

MOV A, #0FFH

MOV B, #0CH

RET

ED1:

JB P1.3, L0 读D

LCALL DELAY2

JB P1.3, ED1

JNB P1.3, $

MOV P2, #01011110B显示D,01011110

MOV R5, #10100001B

MOV A, #0FFH

MOV B, #0DH

L0: JB UP,L01

LCALL DELAY2

JB UP,L01

JNB UP,$

MOV A,#0FFH

MOV B,#0EH

RET

L01:

JB DN,L02

LCALL DELAY2

JB DN,L02

JNB DN,$

MOV A,#0FFH

MOV B,#0FH

L02:

RET

GETWORD: 读音乐序号子程序

S1: JB P1.4, S2 读1键

LCALL DELAY2

JB P1.4, S1

JNB P1.4, $

MOV P2, #00000110B 显示1

MOV R5, #11111001B

MOV A, #0FFH

MOV B, #00H

RET

S2: JB P1.5, S3 读2键

LCALL DELAY2

JB P1.5, S2

JNB P1.5, $

MOV P2, #01011011B 显示2

MOV R5, #10100100B

MOV A, #0FFH

MOV B, #01H

RET

S3: JB P1.6,S4读3键

LCALL DELAY2

JB P1.6,S3

JNB P1.6,$

MOV P2,#01001111B 显示3

MOV R5,#10110000B

MOV A,#0FFH

MOV B,#02H

RET

S4: JB P1.7, L1读4键

LCALL DELAY2

JB P1.7, S1

JNB P1.7, $

MOV P2, #01100110B 显示4

MOV R5, #10011001B

MOV A, #0FFH

MOV B, #03H

L1: RET

DELAY: 延时子程序

PUSH0 保存现场

PUSH1

MOV 0, #0H

DELAY1: MOV 1, #0H

DJNZ1, $

DJNZ0, DELAY1

POP 1 恢复现场

POP 0

RET

DELAY2: MOV 41H, #100延时子程序2

F1: MOV 42H, #250

DJNZ 42H, $

DJNZ 41H, F1

RET

DELAY3: 延时子程序3

MOV R7, #2

W22: MOV R4, #125

W33: MOV R0, 248

DJNZ R0, $

DJNZ R4, W33

DJNZ R7, W22

DJNZ R1, DELAY3

RET

TABLE00: 频率表

DW 64260,64400,64524,64580 简码值 低音5, 低音6, 低音7,1

DW 64684,64777,64820,64898 简码值 2,3,4,5

DW 64968,65030,65058,65110 简码值 6,7,高音1,高音

DW 65157,65178,65217简码值 高音3,高音4,高音5

--------------------------------------------------------------------

第一首《我和你》

--------------------------------------------------------------------

TABLE10: DB 64H,82H,42H,48H

DB 54H,64H,18H

DB 44H,54H,64H,84H

DB 5CH

DB 64H,84H,44H,04H,42H

DB 54H,64H,28H

DB 54H,14H,54H,64H

DB 4CH

DB 98H,88H

DB 98H,48H

DB 64H,24H,64H,84H

DB 5CH

DB 64H,82H,42H,48H

DB 54H,64H, 28H

DB 54H,14H,54H,34H

DB 4CH

DB 00H

--------------------------------------------------------------------

第二首《万水千山总是情》

--------------------------------------------------------------------

TABLE20: DB 64H,74H,84H,04H,82H,94H,84H,6CH

DB 54H,44H,04H,62H,54H,44H,2CH

DB 24H,18H, 44H,54H,64H,84H,94H,64H,5CH

DB 64H,74H,84H,04H,82H,94H,84H,6CH

DB 54H,44H,04H,62H,54H,44H,2CH

DB 24H,18H, 44H,64H,54H,04H,42H,24H,44H,4CH

DB 64H,84H,9CH,0A4H,94H,74H,84H,04H,92H,8CH,64H,88H

DB 64H,84H,9CH,0A4H,0A4H,94H,84H,64H,5CH

DB 64H,74H, 84H,04H,82H,94H,84H,6CH

DB 54H,44H,04H,62H,54H,44H,2CH

DB 24H,18H,44H,64H,54H,42H,24,44H,4CH

DB 00H

--------------------------------------------------------------------

第三首《送别》

--------------------------------------------------------------------

TABLE30: DB 84H,62H,82H,0B8H

DB 94H,0B2H,92H,88H

DB 84H,42H,52H,64H,52H,44H

DB 5CH

DB 84H,62H,82H,0B4H,04H,82H

DB 94H,0B4H, 88H

DB 84H,52H,62H,74H,04H,32H

DB 4CH

DB 94H,0B4H,0B8H

DB 0A4H,92H,0A2H,0B8H

DB 92H,0A2H,0B2H,92H,92H,82H,62H,42H

DB 5CH

DB 84H,62H,82H,0B4H,04H,0A2H

DB 94H,0B4H,88H

DB 84H,52H,62H,74H,04H,32H

DB 4CH

DB 00H

--------------------------------------------------------------------

第四首《北京欢迎您》

--------------------------------------------------------------------

TABLE40:DB 62H,82H,62H,52H,12H

DB 62H,52H,12H,64H

DB 62H,52H,22H,42H

DB 62H,54H

DB 52H,42H,22H,42H

DB 52H,62H,82H,52H

DB 62H,92H,82H,12H

DB 52H,44H

DB 52H,42H,22H,42H

DB 52H,62H,82H,52H

DB 62H,92H,82H,82H

DB 68H

DB 52H,62H,52H,42H

DB 82H,92H,64H

DB 22H,62H,64H

DB 54H,64H

DB 64H,84H

DB 0B2H,82H,94H

DB 02H,92H,82H,62H

DB 62H, 82H,88H

DB 00H

END

先声明一点,getword(danci,,100)是不能给danci赋值的,因为结构相当于变量,当一个变量作为参数时,程序用的是这个参数的一个副本,也就是参数是danci,传进去时danci1.有danci==danci1,而&danci!=&danci1.而退出函数后danci1的空间也被回收。因此danci在弄完函数时,他的值不变,因此未初始化。然而对未初始化的指针,无论在danci还是danci1,指针指向的地址是相同的。对于已初腊凯始化的指针,如数组(由于分配了空间)。danci和danci1的line的地址是不同的。由于分配地址用来malloc函数,指针指向堆区,退出函数时,堆区的空间没有被释放(free函数人工释放)搏闹。由于danci和danci1的地址轮银唤相同,空间没被释放。因此danci的line的值已经变了。这样做的改变也保持了。其实要做好用getword(&danci,100)就0k了。


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

原文地址: https://www.outofmemory.cn/yw/12375114.html

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

发表评论

登录后才能评论

评论列表(0条)

保存