第二周博客作业20180918-1

本次作业要求参见https://edu.cnblogs.com/campus/nenu/2018fall/homework/2126

本次作业代码地址https://git.coding.net/fanhongda/test.git

发表博客,介绍上述“项目”中每个功能的重点/难点,展示重要代码片断,给出执行效果截图,展示你感觉得意、突破、困难的地方。

功能1

(1)读取文件

char* readFile(const char* filename){
    char* passage;
    FILE* fp;
    char buf[1024];
    fp = fopen(filename,"r");
    if(fp==NULL){
        exit(-1);
    }
    
    passage = (char*)malloc(sizeof(char)*MAXLENGTH);
    passage[0]='\0';

    while(!feof(fp)){
        fgets(buf,1024,fp);
        strcat(passage,buf);
    }

    return passage;
}

(2)把整篇文章切割成单词,为了避免同一个单词因为大小写的原因而识别为两个单词,因此把大写字母换成小写

char** split(char* passage,int *size){
    int i;
    int len = strlen(passage);
    int c = 0,num=0;
    char **words,*word;
    words = (char**)malloc(sizeof(char*)*MAXWORDS);
    word = (char*)malloc(sizeof(char)*MAXWORD);
    for(i=0;i<len;i++){
        if(!isChar(passage[i])){
            passage[i]=' ';
        }else if(isUpper(passage[i])){
            passage[i]=(char)('a'+passage[i]-'A');
        }
    }

    len = strlen(passage);
    passage[len]='\0';
    len++;

    for(i=0;i<MAXWORDS;i++){
        words[i]=(char*)malloc(sizeof(char)*MAXWORD);
    }

    for(i=0;i<len;i++){
        if(passage[i]!=' '&&passage[i]!='\0'){
            word[c++]=passage[i];
        }else{
            if(c>0){
                word[c]='\0';
                c=0;
                strcpy(words[num++],word);
            }
        }
    }
    //记录单词的数量
    *size = num;
    
    return words;
}

(3)按照单词出现频率进行排序

void sort(Data* datas,int size){
    int i,j;
    Data t;
    for(i=0;i<size;i++){
        for(j=0;j<size-i-1;j++){
            if(datas[j].count<datas[j+1].count){
                t = datas[j];
                datas[j]=datas[j+1];
                datas[j+1] = t;
            }
        }
    }
}

(4)存储单词和出现频率的结构体

typedef struct Data{
    char* word;
    int count;
}Data;

(5)小文件输入,在控制台输入命令

void function1(char* filename){
    char* passage;
    char** words;
    Data* datas;
    int total = 0;
    int i,j,size=0;
    int exist=0;

    datas = (Data*)malloc(sizeof(Data)*MAXWORDS);

    passage = readFile(filename);
    words = split(passage,&size);
    
    for(i=0;i<size;i++){
        exist=0;
        for(j=0;j<total;j++){
            if(strcmp(datas[j].word,words[i])==0){
                exist = 1;
                break;
            }
        }
        
        
        if(exist){
            exist=0;
            datas[j].count+=1;
        }else{
            datas[total].word = malloc(sizeof(char)*MAXWORD);
            strcpy(datas[total].word,words[i]);
            datas[total].count=1;
            total++;
        }
    }

    sort(datas,total);
    printf("total %d\n\n",total);
    for(i=0;i<total;i++){
        printf("%s\t%d\n",datas[i].word,datas[i].count);
    }

}

运行截图

功能2

命令行输入作品文件名

void function2(char* filename){
    char* passage;
    char** words;
    Data* datas;
    int total = 0;
    int i,j,size=0;
    int exist=0;

    datas = (Data*)malloc(sizeof(Data)*MAXWORDS);

    passage = readFile(filename);
    words = split(passage,&size);
    
    for(i=0;i<size;i++){
        exist=0;
        for(j=0;j<total;j++){
            if(strcmp(datas[j].word,words[i])==0){
                exist = 1;
                break;
            }
        }
        

        if(exist){
            exist=0;
            datas[j].count+=1;
        }else{
            datas[total].word = malloc(sizeof(char)*MAXWORD);
            strcpy(datas[total].word,words[i]);
            datas[total].count=1;
            total++;
        }
    }

    sort(datas,total);
    printf("total %d words\n\n",total);
    for(i=0;i<total;i++){
        printf("%s\t%d\n",datas[i].word,datas[i].count);
    }
}

运行截图

功能3

命令行输入存有英文作品文件的目录名,虽然和功能2一样都是命令行输入,但功能2是文件功能3是文件夹

void _function3(char* foldername,char* filename){
    char* passage;
    char** words;
    Data* datas;
    int total = 0;
    int i,j,size=0;
    int exist=0;
    char ffname[300];

    datas = (Data*)malloc(sizeof(Data)*MAXWORDS);

    strcpy(ffname,foldername);
    strcat(ffname,"//");
    strcat(ffname,filename);

    passage = readFile(ffname);
    words = split(passage,&size);
    
    for(i=0;i<size;i++){
        exist=0;
        for(j=0;j<total;j++){
            if(strcmp(datas[j].word,words[i])==0){
                exist = 1;
                break;
            }
        }
        

        if(exist){
            exist=0;
            datas[j].count+=1;
        }else{
            datas[total].word = malloc(sizeof(char)*MAXWORD);
            strcpy(datas[total].word,words[i]);
            datas[total].count=1;
            total++;
        }
    }

    sort(datas,total);
    printf("%s\n",filename);
    printf("total %d words\n\n",total);
    total = total>8?8:total;
    for(i=0;i<total;i++){
        printf("%s\t%d\n",datas[i].word,datas[i].count);
    }
    
}

运行截图

功能4

从控制台读入单篇英文作品,将输出结果保存到指定文件中

void function4(char* words[],int size){
    char* passage;

    Data* datas;
    int total = 0;
    int i,j=0;
    int exist=0;
    char temp[10000];

    datas = (Data*)malloc(sizeof(Data)*MAXWORDS);
    passage = (char*)malloc(sizeof(char)*MAXLENGTH);
    passage[0]='\0';
    while(scanf("%s",temp)!=EOF){
        strcat(passage,temp);
        strcat(passage," ");
    }
    
    words = split(passage,&size);

    for(i=0;i<size;i++){
        exist=0;
        for(j=0;j<total;j++){
            if(strcmp(datas[j].word,words[i])==0){
                exist = 1;
                break;
            }
        }
        

        if(exist){
            exist=0;
            datas[j].count+=1;
        }else{
            datas[total].word = malloc(sizeof(char)*MAXWORD);
            strcpy(datas[total].word,words[i]);
            datas[total].count=1;
            total++;
        }
    }

    sort(datas,total);
    printf("total %d words\n\n",total);
    for(i=0;i<total;i++){
        printf("%s\t%d\n",datas[i].word,datas[i].count);
    }
}

运行截图

此项目PSP

差异原因:没有实际编过程序,对所需时间并没有一个准确的认知,而且整个过程感觉速度缓慢,并且期间出现各种各样的小错误,修改它们花费了一些时间。如果再算上复习C语言的时间总时间将会更多,大约是1300分钟。

猜你喜欢

转载自www.cnblogs.com/fanhongda/p/9695812.html