全屏幕编辑软件的编写(C语言)05

2016-02-19 13:18 12 1 收藏

下面这个全屏幕编辑软件的编写(C语言)05教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

【 tulaoshi.com - 编程语言 】

Shift_F1()                         /* 存盘,不退出编辑 */
{
  int i,j;
  if(chg) {                        /* 如果文件已修改过 */
    F1(0);                         /* 存盘 */
    old=1;                         /* 有老文件标志置 1 */
    fp=fopen(mfile,"rb");          /* 重新打开正文文件 */
    fseek(fp,vw,SEEK_SET);         /* fp 读写指针复原 */
  }
  clear_prompt();                  /* 清提示区 */
  chg=0;                           /* 文件已修改标志置 0 */
}

 

F2()                                  /* 移动当前行至指定行 */
{
  long i;
  write_ques(6);                      /* 提问要移到的行号 */
  if((i=key_digit(19))=0) {          /* 输入行号,如为空串或按 ESC 键 */
    clear_ques();                     /* 清提问区 */
    return;                           /* 退出本功能 */
  }
  i--;                                /* 输入行号转换为数组行号 */
  if(fp_end && ittl_x)  i=ttl_x;
                           /* 如 fp 已读完,目标行大于文末行号,移到文末行 */
  tyy=yy;                             /* 保存列号 */
  mvto(i);                            /* 移到目标行 */
  comp_disp();                        /* 重显一屏 */
  clear_ques();                       /* 清提问区 */
}

F3()                                  /* 输入排版行宽 */
{
  int i;
  write_ques(4);                      /* 提问排版行宽 */
  if((i=key_digit(16))=0) {          /* 在提问行输入行宽,如为空串或按 ESC 键 */
    clear_ques();                     /* 清提问区 */
    return;                           /* 退出本功能 */
  }
  enq=i;                              /* 行宽值赋给全局变量 enq */
  if(enqHC-4)  {                     /* 行宽值如超过允许字节数 */
    enq=HC-4;                         /* 取最大允许字节数为排版行宽 */
    itoa(enq,hsz,10);                 /* 变数值为字符串 */
    write_prompt(7);                  /* 提示:排版超宽 */
    write_space(HH,16,30,PROM_COLOR); /* 清输入区 */
    write_string(HH,16,hsz,PROM_COLOR);  /* 重显行宽 */
  }
}

F4()                                  /* 排版至段末 */
{
  if(enqHC-4) {                      /* 如已设置排版宽度 */
    chg=1;                            /* 文件已修改标志置为真 */
    reform();                         /* 排版至段末 */
    comp_disp();                      /* 计算参数并重显一页 */
  }
  else  write_prompt(8);              /* 否则,提示:未设置排版宽度 */
}

Shift_F4()                            /* 连续排版至文末 */
{
  if(enqHC-4) {                      /* 如已设置排版宽度 */
    chg=1;                            /* 文件已修改标志置为真 */
    while(reform());                  /* 从当前光标行排版至文末 */
    comp_disp();                      /* 计算参数并重显一页 */
  }
  else  write_prompt(8);              /* 否则,提示:未设置排版宽度 */
}

int reform()                          /* 从当前位置排版至本段末 */
{
  int k,g;
  write_prompt(0);                    /* 提示请稍候... */
  for(;;)  {                          /* 为段排版设置的循环 */
    g=string_lingth();                /* 计算字符串长(不包括回车换行符) */
    if(genq) {                       /* 如串尾在排版宽后 */
      if(vs(enq-1)==0)  {             /* 如排版宽度处不为全角字符前半字 */
        if(ss[ss_x][enq]0xA0) {      /* 如排版宽度后一字节为半角字符 */
          if(punc1(ss[ss_x][enq]))    /* 如为指定半角标点 */
            k=enq+1;                  /* 折断处后移 1 字节 */
          else k=enq;                 /* 否则原处折断 */
        }
        else  {                       /* 如排版宽度处字符为全角 */
          if(punc2(ss[ss_x][enq],ss[ss_x][enq+1]))   /* 如为指定全角标点 */
            k=enq+2;                  /* 折断处后移 2 字节 */
          else  k=enq;                /* 否则原处折断 */
        }
      }
      else  {                         /* 如排版宽度处为全角字符前半字 */
        if(punc2(ss[ss_x][enq-1],ss[ss_x][enq]))    /* 如为指定的全角标点 */
          k=enq+1;                    /* 折断处后移一字节 */
        else k=enq-1;                 /* 否则, 折断处前移一字节 */
      }
      ser+=k-yy;                      /* 计算字序数 */
      if(ss[ss_x][k]!=0x0D) {         /* 如折断处不在段末 */
        intercept(k);                 /* 在 k 处折断行 */
        strcpy(ss[ss_x-1]+k,ra);      /* 折断处加软回车 */
      }
      else {                          /* 如折断处已到串尾 */
        xx++;   ss_x++;               /* 到下一行 */
        ser+=2;                       /* 计算字序数 */
        yy=0;                         /* 到行首 */
        break;                        /* 退出循环 */
      }
      yy=0;                           /* 到行首 */
    }
    else  {                           /* 如串尾在排版宽前 */
      if(xxttl_x) {                  /* 如未到文末 */
        ser+=g-yy+2;                  /* 计算字序数 */
        ss_x++;   xx++;               /* 到下行 */
        yy=0;   y=0;                  /* 到行首 */
        if(ss_xss_max)  tj();        /* 如超出缓冲区数组,读入一部分 */
        if(ss[ss_x-1][g]==0x8D) {     /* 如上行末为软回车 */
          if(delc()==-1)   return 0;  /* 本行接至上行末,行超长返回 */
        }
        else  break;                  /* 否则退出 */
      }
      else {                          /* 如已到文末行 */
        clear_prompt();               /* 清提示区 */
        return 0;                     /* 返回 0 */
      }
    }
  }
  clear_prompt();                     /* 清提示区 */
  return 1;                           /* 返回 1 */
}

F5()                                 /* 搜索字符串 */
{
  write_ques(5);                     /* 提问要找的字符串 */
  *fnd=0;                            /* fnd 清为空串 */
  if(key_string(HH,19,fnd,PROM_COLOR)=0)  {
                                     /* 输入字符串,如为空串或按 ESC 键 */
    clear_ques();                    /* 清提问区 */
    return;                          /* 退出本功能 */
  }
  Shift_F5();                        /* 进行搜索 */
}

Shift_F5()                           /* 进行搜索 */
{
  if(*fnd)  {                        /* 如搜索字符串不为空串 */
    if(find(fnd)) *fnd=0;            /* 搜索,如到文末,字符串 fnd 清为空串 */
    comp_disp();                     /* 计算参数并重显一屏 */
  }
}

int find(char *a)                    /* 寻找字符串 */
{
  int i,j,b;
  j=strlen(a);                       /* 计算要找的字符串长 */
  while(xx=ttl_x)  {                /* 在总行数范围内找 */
    if(ss_x+H3-x=ss_max) tj();      /* 本屏最下行如超出缓冲区最大行,数组
                                       上部存 Q3 行到 fp1,下部读入 Q3 行 */
    b=string_lingth();               /* 计算本行除行末回车换行符外的字符数 */
    for(i=0;ij;i++)  {              /* 对比 j 个字符 */
      if(b-yy+1j)  {                /* 如本串剩下已不足要找的串长 */
        if(xxttl_x)  {              /* 如未到文末行 */
          ss_x++;    xx++;           /* 下移一行 */
          ser+=b-yy+2;               /* 计算字序数 */
          yy=0;                      /* 至行首 */
          break;                     /* 退出 for 循环 */
        }
        else  {                      /* 如到文末行 */
          ser+=b-yy;                 /* 计算字序数 */
          yy=b;                      /* 至行末列 */
          clear_ques();              /* 清提问区 */
          return  1;                 /* 返回 1 */
        }
      }
      if(ss[ss_x][yy+i]!=*(a+i)) {   /* 如有一个字符对不上 */
        yy++;   ser++;               /* 后移一字符 */
        i=-1;                    /* i 加步长进入循环后变为初值 1,重新对比 */
      }
      else if(i==j-1)  {             /* 如 j 个字符都对上 */
             if(!vs(yy+j-1)) {       /* 如找到的串尾不在前半个汉字 */
               yy+=j;                /* 当前位置移至对上的最后一字符后 */
               ser+=j;               /* 计算字序数 */
               return  0;            /* 返回 0 */
             }
             else {                  /* 否则后移一字节 */
               yy++;  ser++;
               i=-1;             /* i 加步长进入循环后变为初值 1,重新对比 */
             }
           }
    }
  }
}

F6()                                 /* 字符串替代 */
{
  int i,j,g,k;
  write_ques(7);                     /* 提问搜索和替代的字符串 */
  if(key_string(HH,6,hsz,PROM_COLOR)=0)  {
                                     /* 输入要找的字符串,如为空串或按 ESC 键 */
    clear_ques();                    /* 清提问区 */
    return;                          /* 退出本功能 */
  }
  ddd=malloc(HC);                    /* 给 ddd 分配内存 */
  dd=ddd;                            /* 保存 ddd 的首指针 */
  if(key_string(HH,32,ddd,PROM_COLOR)=0)  {
                                     /* 输入替代的字符串,如为空串或按 ESC 键 */
    free(ddd);                       /* 释放 ddd 占用的内存空间 */
    clear_ques();                    /* 清提问区 */
    return;                          /* 退出本功能 */
  }
  g=strlen(hsz);                     /* 计算搜索的字符串长 */
  k=strlen(ddd);                     /* 计算替代的字符串长 */
  while(1)  {                        /* 为连续找设的循环 */
    if(find(hsz)) {                  /* 如到文末 */
      comp_disp();                   /* 计算参数,显示一屏 */
      break;                         /* 退出本功能 */
    }
    xh();                            /* 在 H1 行重显当前行、列、序号 */
    comp_disp();                     /* 计算参数,显示一屏 */
    if((j=key_yn(59))==-1) {         /* 回答是否替换,如按 ESC */
      clear_ques();                  /* 清提问区 */
      break;                         /* 退出本功能 */
    }
    if(j) {                          /* 如按 Y,进行替换操作 */
      chg=1;                         /* 文件已修改标志置为真 */
      i=yy-g;                        /* 删除原字符串后光标处列号 */
      while(yyi)  delc();           /* 删除原字符串 */
      if(xx==ksx && yyksy) ksy+=k;  /* 计算字块坐标变化 */
      if(xx==kwx && yykwy) kwy+=k;
      write_block(xx);               /* ddd 中字符串拷入 */
      ddd=dd;                        /* ddd 返回指针头 */
    }
  }
  free(ddd);                         /* 释放 ddd 占用的内存空间 */
}

F7()                                 /* 定义块首行、列号 */
{
  ksx=xx;                            /* 块首标志行号等于当前光标行号 */
  ksy=yy;                            /* 块首标志列号等于当前光标列号 */
  if(blck==0) {                      /* 如尚未定义块 */
    blck=1;                          /* 块标志置 1 */
    kwx=ksx;                         /* 块尾标志同块首重合 */
    kwy=ksy;
    disp(ss_x,x);                    /* 重显当前行 */
    return;                          /* 返回 */
  }
  if(kwxksx||(kwx==ksx && kwy=ksy)) { /* 如当前光标在原块尾后 */
    kwx=ksx;                         /* 块尾行号移至块首行 */
    kwy=ksy;                         /* 块尾列号移至块首列 */
    blck=1;                          /* 块标志置 1 */
  }
  else blck=2;
  disp_t();                          /* 重显一屏 */
}

Shift_F7()                           /* 清除块定义 */
{
  blck=0;                            /* 块标志置 0 */
  ksx=kwx=-1;                        /* 块标行号置初值 */
  ksy=kwy=-1;                        /* 块标列号置初值 */
  comp_disp();                       /* 重显一屏 */
}

F8()                                 /* 定义块尾 */
{
  kwx=xx;                            /* 定块尾行号 */
  kwy=yy;                            /* 定块尾列号 */
  if(blck=1)  {                     /* 如块标志为 1 或 2 */
    if(kwxksx||(kwx==ksx && kwy=ksy)){    /* 如在块首前 */
      ksx=kwx;                       /* 块首行号同块尾 */
      ksy=kwy;                       /* 块首列号同块尾 */
      blck=1;                        /* 块标志置 1 */
    }
    else   blck=2;                   /* 否则,块标志置 2 */
    disp_t();                        /* 重显一屏 */
  }
  else  F7();                        /* 如未定义块,设块首 */
}

F9()                                 /* 移到文首 */
{
  upto(0x0L);                        /* 移至 0 行 */
  Home();                            /* 移至行首 */
  comp_disp();                       /* 计算显示参数,显示文首屏幕 */
}

Shift_F9()                           /* 移至文末 */
{
  if(xxttl_x)  dnto(ttl_x);         /* 如不在文末行,下翻到文末行 */
  End();                             /* 移至行末 */
  comp_disp();                       /* 计算参数,重显一屏 */
}

F10()                                /* 表格线状态转换开关 */
{
  if(tab) {                          /* 如 tab 为真 */
    tab=0;                           /* 转置 tab 为 0 */
    write_space(H1,4,4,TEXT_COLOR);  /* 盖掉屏幕信息行表线提示 */
  }
  else  {                            /* 如 tab 为假 */
    tab=1;                           /* 转置 tab 为 1 */
    write_string(H1,4,"表线",0x1E);  /* 在屏幕信息行显示表线二字 */
  }
}

upto(long a)                         /* 上移到 a 行 */
{
  ser-=yy;                           /* 计算当前行首字序数 */ 
  while(oa && a=xx-ss_x+x) {
                           /* fp1 中尚有记录,目标行小于数组 x 行,则循环 */
    while((ss_x-1)x) {              /* 数组当前行号大于屏幕行坐标,则循环 */
      --xx;     --ss_x;              /* 上移一行 */
      ser-=string_lingth()+2;        /* 计算字序数 */
    }
    st();                  /* 如编辑数组当前行号不足屏幕行坐标,从 fp1 读入 */
  }
  while((xx-1)=a) {                 /* 目标行在当前行前,则循环 */
    --xx;   --ss_x;                  /* 上移一行 */
    ser-=string_lingth()+2;          /* 计算字序数 */
  }
  orien();                           /* 确定列号 */
  ser+=yy;                           /* 计算字序数 */
}

dnto(long a)                         /* 下移到第 a 行 */
{
  int i;
  ser+=string_lingth()-yy+2;         /* 计算下行首字序数 */
  ss_x++;    xx++;                   /* 当前行下移一行 */
  while(a=xx-ss_x+(i=ss_max+x-H3) && (ob||!fp_end))  {
                /* 目标行超出,屏幕最下行超出数组,fp2 或 fp 中尚有记录则循环 */
    while(ss_xi)  {                 /* 当前行下移不会引起屏底超出数组则循环 */
      ser+=string_lingth()+2;        /* 计算下行首字序数 */
      ss_x++;      xx++;             /* 当前行移至下行 */
    }
    tj();                            /* 屏底要超出数组时,从 fp2 或 fp 读入 */
    if(fp_end && attl_x)  a=ttl_x;  /* 如目标行大于文末行时,目标行取文末行 */
  }
  while(xxa) {                      /* 目标行在当前行后则循环 */
    ser+=string_lingth()+2;          /* 计算下行首字序数 */
    ss_x++;    xx++;                 /* 当前行移至下行 */
  }
  orien();                           /* 定光标位置 */
  ser+=yy;                           /* 计算字序数 */
}

wfp1()                               /* 将编辑数组上部 Q3 行写入 fp1 */
{
  fseek(fp1,wra[oa],SEEK_SET);       /* 指针移到写入起始位置 */
  write_to(0,Q3,fp1);                /* 写 Q3 行到 fp1 */
  wra[++oa]=ftell(fp1);              /* 记录下一次写入起始位置 */
  movbk(0,Q3);                       /* 剩下的数组前移 Q3 行 */
  ss_x-=Q3;                          /* 计算编辑数组当前行行号 */
  ss_max-=Q3;                        /* 计算数组行实用最大行号 */
}

movbk(int s,int a)                   /* 编辑数组 s+a 行起前移 a 行 */
{
  int i;
  for(i=s;iQB-a;i++)
    strcpy(ss[i],ss[i+a]);           /* 前移 a 行,复盖原行 */
  while(iQB)   *ss[i++]=0;          /* 移走各行清 0 */

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

mov(int s,int a)                     /* 编辑数组 s 行起后移 a 行 */
{
  int i;
  for(i=QB-1;i=s+a;i--)  strcpy(ss[i],ss[i-a]);
}

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

tj()       /* 当前行大于 Q1 时,上部 Q3 行存入 fp1,从 fp2 或 fp 再读入 Q3 行 */
{
  int j=0;
  if(ss_xQ1-H3)  wfp1();            /* 当前行大于 Q1 时,上部 Q3 行存入 fp1 */
  if(ss_max=Q1) {                   /* 如编辑数组实用最大行在数组前半部 */
    if(ob)  {                        /* 如 fp2 中有记录 */
      fseek(fp2,wrb[--ob],SEEK_SET); /* 指针前移至读起始位置 */
      j=read_from(ss_max+1,Q3,fp2);  /* 从 fp2 读 Q3 行写入编辑数组最大行后,
                                            j 为实际读写数 */
      ss_max+=j;                     /* 数组扩大 j 行 */
    }
    else  if(!fp_end)  {             /* 如 fp2 已无记录,如 fp 中未读完 */
      j=read_from(ss_max+1,Q3,fp);   /* 从 fp 读 Q3 行写入数组最大行后,
                                            j 为实际读写数 */
      if(jQ3)  {                    /* 如读写数不足 Q3 行 */
        fp_rd+=j;                    /* fp 已读出最大行行号增加 j */
        ttl_x=fp_rd;                 /* 确定文末行行号 */
        fp_end=1;                    /* fp 已读完标志置 1 */
      }
      else  fp_rd+=Q3;               /* 否则,fp已读出行最大行号加 Q3 */
      ss_max+=j;                     /* 数组扩大 j 行 */
    }
  }
}

来源:https://www.tulaoshi.com/n/20160219/1603755.html

延伸阅读
什么时候会用到全屏幕模式? 也许用到的机会很少,但JDK还是为我们提供了这个的功能。像许多软件中的打印预览功能,还有某些文本编辑器中为了获得更大的编辑画面,也用到了全屏幕模式,假如你有爱好写一个像ACDSee这样的软件,使用全屏幕模式可以让用户看到更大的图片画面。 如何使用全屏幕模式? 要害是Jav...
标签: 电脑入门
最近用ppt2010播放幻灯片时发现无法全屏,有时候竖直方向满屏了,横向无法铺满。这个问题困扰我了很久,最后发现是设置问题。解决方法如下: 打开PowerPoint2010页面设置(菜单文件--页面设置): 根据自己电脑屏幕大小,设置幻灯片大小: 然后,再播放幻灯片试试看,是不是全屏了呢?如果还是不行,就继续调整上述页面设置中的幻灯片大小...
Visual C#是微软公司推出的新一代程序开发语言,是微软.Net框架中的一个重要组成部分。屏幕保护程序是以scr为扩展名的标准Windows可执行程序。屏幕保护程序不仅可以延长显示器的使用寿命,还可以保护私人信息。本文向大家介绍一个.Net平台上用C#编写的一个动态文本及图形的屏幕保护程序。 一、具体实现步骤: (1)在Visual Stud...
C# Builder是Borland公司推出的又一款基于.NET的开发工具。我们下面就用它做个简单的屏幕保护程序。屏幕保护程序是以scr为扩展名的标准Windows可执行程序。屏幕保护程序不仅可以延长显示器的使用寿命,还可以保护私人信息。本文向大家介绍一个用C# Builder编写的一个动态文本及图形的屏幕保护程序。 具体实现步骤 1)在C# Builder下新建...
简介 模拟银行的钱数大写输出例如 345 叁肆伍 方法/步骤 首先打开VC++ 文件》》》新建 创建一个C++空白文档 先声明头文件 代码如下: #includestdio.h   声明变量 代码如下: char *p[10]={"零","一","二","三","四","五","六","七","八","九"};   由于用到了自定义函数,所以先声明 代码如下: vo...

经验教程

301

收藏

24
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部