《数据结构实验与实训教程(第4版)》程序代码 下载本文

case 'n': // 继续向后搜索 if( search(queryinfo) ) // 没找到 beep(); break; case 'x': // 删除cmdtimes个字符 if( len ) { // 该编辑行有内容 if( cmdtimes > len - edit.shinex + 1 )//最多删除至行尾 cmdtimes = len - edit.shinex + 1;

for( i = 0; i < len - edit.shinex + 1 - cmdtimes; i++ ) //数据前移cmdtimes个字符

edit.info[nr][edit.shinex+i-1]=

edit.info[nr][edit.shinex+i+cmdtimes-1];

memset( edit.info[nr] + len - cmdtimes, 0, cmdtimes );// 将行尾置0 display( edit.shiney, edit.info[nr] ); // 显示一行数据 } else // 无字符可删

beep();

break; case 'd':

// dd行删除

in_ch = getch(); if( in_ch == 'd' && edit.allrec > 0 ) { // 有记录行可删

if( cmdtimes >= edit.allrec - edit.shiney - edit.scry + 1 //删除至行尾 cmdtimes = edit.allrec - edit.shiney - edit.scry + 1; for( i = edit.scry + edit.shiney - 1; i < edit.allrec - cmdtimes; i++ )

memcpy(edit.info[i],edit.info[i+cmdtimes], AXCOL+1 ); //移动cmdtimes行

memset( edit.info[i], 0, (MAXCOL+1) * cmdtimes );

// 文件尾清0 if( edit.shiney > 1 ) edit.shiney--; // 光标上移一行 if( edit.scry > 0 )

edit.scry--;

edit.allrec -= cmdtimes; refresh_scr(); // 刷新屏幕 }

else // 无记录行可删

beep(); break; case '0': // 光标移至行首

edit.shinex = 1;

84

break; case '$': // 光标移至行尾 edit.shinex = 1; break; case LEFT: case 'h': // 光标左移cmdtimes格 edit.shinex -= cmdtimes;

if( edit.shinex < 1 ) // 最多移到行首

edit.shinex = 1;

break; case RIGHT: case 'l': // 光标右移cmdtimes格 edit.shinex += cmdtimes;

if( edit.shinex > len ) // 最多移到行尾

edit.shinex = len; break; case DOWN: case 'j': // 光标下移cmdtimes行 rolllines = MAX( 0, edit.shiney + cmdtimes - 24 );

if( rolllines > edit.allrec - 24 - edit.scry ) // 最多下滚到文件尾 rolllines = MAX( 0, edit.allrec - 24 - edit.scry ); if( rolllines ) { // 屏幕下滚rolllines行 edit.scry += rolllines;

refresh_scr();

} edit.shiney = MIN( edit.shiney + cmdtimes, 24 ); break; case UP: case 'k': // 光标上移cmdtimes行 rolllines = MAX( 0, cmdtimes - edit.shiney + 1 ); if( rolllines > edit.scry ) // 最多上滚到文件头 rolllines = edit.scry;

if( rolllines ) { // 屏幕上滚rolllines行 edit.scry -= rolllines;

refresh_scr(); // 刷新屏幕

}

edit.shiney = MAX( edit.shiney - cmdtimes, 1 ); break; case PGDN: case CTRL_F: // 下翻cmdtimes页

85

rolllines = MIN( 24 * cmdtimes, edit.allrec - 24 - edit.scry ); if( rolllines > 0 ) { // 屏幕有滚动 edit.scry += rolllines;

edit.shiney = 1;// 光标移动到行首 refresh_scr(); // 刷新屏幕

}

break; case PGUP: case CTRL_B: // 上翻cmdtimes页

rolllines = MIN( 24 * cmdtimes, edit.scry ); if( rolllines > 0 ) { // 屏幕有滚动 edit.scry -= rolllines; edit.shiney = 1;

refresh_scr(); // 刷新屏幕

} break;

default: // 其他情况不处理

beep();

break;

}

} } }

void beep() // 响铃 { sound( 800 ); // 开扬声器 delay( 100 ); // 延时100毫秒

nosound();

// 关扬声器

}

int write_file( char *filename ) // 将编辑内容写入文件

{ int i;

FILE *fp;

if( ( fp = fopen(filename,\w\ printf( \, filename ); return -1;

}

for( i = 0; i < edit.allrec; i++ )

86

fprintf( fp, \] ); fclose( fp ); return 0; }

void refresh_scr() // 刷新屏幕 { int i;

for( i = 0; i < 24; i++ ) { gotoxy( 1, i + 1 ); // 光标移动到行首

clreol(); // 清一行

if( edit.scry + i < edit.allrec ) printf( \ }

gotoxy( edit.shinex, edit.shiney ); // 移动光标到编辑位置 }

int input_str( int x, int y, char *str, int len ) // 定点输入一定长字符串 { int i; int in_ch; memset( str, 0, len ); for( i = 0; i < len - 1 && (in_ch=getch()) != CR; ) { // 换行表示输入结束 gotoxy( x, y ); if( in_ch == BackSpace ) { // 退格键,表示删除一个字符 if( i == 0 ) // 删除所有输入,表示放弃此次输入 return -1; str[i] = '\\0'; i--; x--; } else { // 其他情况表示输入一个字符 str[i] = (char)in_ch; printf( str + i ); // 显示输入字符 fflush( stdout ); // 刷新标准输出设备(即屏幕输出) i++;

x++;

}

}

return 0; }

87