回 帖 发 新 帖 刷新版面

主题:帮我看看这个程序。

所有旳编码模式中最有名的可能要数莫尔斯(Morse)编码le,它是塞廖尔. 莫尔斯在1832年为电报系统发明的。莫尔斯码给每个字母、数字以及特殊字符(如句号、逗号、冒号和分号)赋予─组点划线。在面向声音的系统中,点代表了短声音,划代表长声音。点和划还用在面向光的系统和信号旗系统中。  文字之间的间隔表示为一个空格,即既不填写点也不填写划。在面向声音的系统中空格表示一个短暂的停顿,其间啥声音也没有。莫尔斯码的国际版如下表所示。要求自己定义特殊字符(如句号、逗号、冒号和分号)的莫尔斯码。并编写一个程序,程序中包含  1.输入一段文字,并立即将其转换成莫尔斯码。  2.从文本文件中读入一篇文本,将其转换成莫尔斯码并保存到另一个文本文件中。  3.从一个莫尔斯码文件中读入莫尔斯码并将其还原为文本。  4.自己制定一套莫尔斯编码,并用其对文本文件进行编码和解码的操作。  5.退出系统  注意:在每个莫尔斯码的字母之间留一个空格,在每个用莫尔斯编码的单词之间留三个空格。  其它要求:  只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读   至少采用文本菜单界面(假如能采用图形菜单界面更好)  学生可自动增加新功能模块(视情况可此外加分)
  这个是别人写的,我测试无法通过,哪位高手帮我看看,如果能帮我修改下更加感激。我邮箱wjp16@126.com  唉。没办法。。老师叫我们做这个,好多东西都还没教过。。


#include <stdio.h>
#include <string.h>
#include <ctype.h>

char  character[56] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,?\'!/()&:;=+-_\"$@";
char morsecode[56][10] = {".-","-...","-.-.","-..",".","..-.","--.",
"....","..",".---","-.-",".-..","--","-.",
"---",".--.","--.-",".-.","...","-",
"..-","...-",".--","-..-","-.--","--..",
"-----",".----","..---","...--","....-",".....","-....","--...","---..","----.",
".-.-.-","--..--","..--..",".----.","-.-.--","-..-.","-.--.","-.--.-",".-...",
"---...","-.-.-.","-...-",".-.-.","-....-","..--.-",".-..-.","...-..-",".--.-."};
/*******************************************************
 * 从指定文件中读取一篇文章,用莫尔斯码对它编码,
 * 并保存到另一个文件中
 * 在每一个莫尔斯码编码的字母之间留一个空格,在每个用莫尔斯
 * 码的单词之间留三个空格。
 ********/
int char2morse(char* file1,char* file2)
{
    FILE *fp1, *fp2;
    if((fp1=fopen(file1,"r"))==NULL)
    {
        printf("can not open file %s",file1);
        return false;
    }
    if((fp2=fopen(file2,"w"))==NULL)
    {
        printf("can not open file %s",file2);
        return false;
    }
    char ch, *temp;
    ch = fgetc(fp1);
    while(ch != EOF)/*判断文件结束*/
    {
        if( 97<=ch<=122)
            ch = toupper(ch);
        if(ch == ' ')
            fputs("  ",fp2);
        else{
            int i =0;
            while(ch != character[i] && i<56)
                i++;    
            fputs(morsecode[i],fp2);
            fputc(' ',fp2);
        }
        ch = fgetc(fp1);
    }
    fclose(fp1);
    fclose(fp2);
}

/*morse码和数组中的码比较,返回morse码对应的字符*/
int cmpcode(char* str1,char* ch)
{
    int j =0;
    while(strcmp(str1,morsecode[j]) && j<56)
    {
        j++;
    }
    *ch = character[j]; /*ch是地址,*ch代表地址存储的数据*/
    return 0;
}
/********************************************************
  *    读取一个莫尔斯码表示的文章,然后把他转换为等价的英语,
  *    并保存到另一文件中。
  *    ****************************************************/
int morse2char(char* file1,char* file2)
{
    FILE *fp1, *fp2;
    if((fp1=fopen(file1,"r")) == NULL)
    {
        printf("can not open file %s",file1);
        return false;
    }
    if((fp2=fopen(file2,"w"))==NULL)
    {
        printf("can not open file %s",file2);
        return false;
    }
    char ch,ch2,temp[10];
    ch = fgetc(fp1);
    int i=0,flag =0;/*flag=0 正常打印完字符后面加一个空格,flag=1,输出3个空格,flag=2 忽略又读入的空格 */
    while(ch !=EOF)
    {
        if(ch != ' ')/*一般字符不是空格*/
        {    flag=0;temp[i++] = ch; }
        else 
        {
            char t;
            if(flag ==0 )
            {
                flag =1;
                temp[i] = '\0';
                cmpcode(temp,&t);
                if(t>=65 && t<=96)
                    t = tolower(t);
                fputc(t,fp2);
            }
            else if(flag ==1 )
            {
                fputc(' ',fp2);
                flag =2;/*死状态,只打印一次空格,后面空格忽略*/
            }
            i=0;
        }
        ch = fgetc(fp1);
    }
    fclose(fp1);
    fclose(fp2);
}

int main()
{
    char2morse("1.txt","morsecode.txt");
    morse2char("morsecode.txt","2.txt");
    return 0;

回复列表 (共2个回复)

沙发

97<=ch<=122
这是谁写的……把这里改正成97<=ch&&ch<=122再说

板凳

深圳华信群英科技有限公司,目前主要从事软件外包开发、高级软件人才定向输送等业务,面对日益严峻的大学生就业难和IT企业招聘难,自2006以来,与知名通信软件公司正式签订定向输送人才的合作协议,针对想进入软件行业的人员提供企业实训,实训课程采用“2+3”分段教学模式,分为2个月理论强化和3个月项目实训两个阶段,共计900学时。
企业订单委培,内训前签订就业安置协议,100%保证就业。实训结束之后,在华信群英科技及其战略合作伙伴从事通信软件研发工作。欢迎有意向者加QQ:649846168咨询。

我来回复

您尚未登录,请登录后再回复。点此登录或注册