IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++统计单词出现次数并按照输入顺序输出 -> 正文阅读

[C++知识库]C++统计单词出现次数并按照输入顺序输出

?????????对于一个刚学c++不久的小白来说,实在是没有什么方法可以做出来。搜了一圈,不是用vector就是用map。作为一名只学到结构体的大学生,我直呼看不懂。

? ? ? ? 所以,我来说说我的思路(高情商:由于我的逻辑还处于待成长阶段,前方会有逻辑不通之处,望指正)

? ? ? ? 首先要解决输入的问题。题目规定了使用二维char数组储存words(其实我这里偷懒了,把它转化成了string)。受限于知识水平,我使用了最原始也是最直接的方法——规定输入,把输入结束的标准给它人为规定为“ .”(空格+.)。要让它能一个一个地储存单词,我使用goto语句来循环(递归也可以),终于解决了输入的问题。

? ? ? ? 接下来是计数并输出的问题。这里我认为是最难的,因为对与数组的理解还不够,所以在尝试直接比较words[0]与words[1]发现怎样都是不相等后,放弃了比较字符数组的想法,转而把它们变成string类型来比较。

? ? ? ? 计数思路:

? ? ? ? ? ? ? ? 从第一个string开始取值,

  1. 比较它与前面所有的单词,如果有相同的,就跳过;如果没有,就说明它是一个新单词,记为真。
  2. 在保证它是新单词的前提下,比较它与后面所有的单词。如果有相同的,那么它出现的次数就加一,没有就接着往后比较。

? ? ? ? ? ? ? ? 这样,就按照顺序记录好了各单词及其出现次数(对于每一个单词,有单词名字、是否为新单词、出现次数,可以理解为被拆散的结构体)。

? ? ? ? (如果我没算错的话,这一步的时间复杂度为n^2

? ? ? ? 输出思路:

? ? ? ? ? ? ? ? 这一步难度比前面小了很多,我直接用setw和\t来控制对齐,由于之前有储存过“是否为新单词”的操作,所以可以通过一遍遍历来输出单词及其出现次数。

代码(做了一点点修改,可能编译不通过):

#include <iostream>
#include<iomanip>

using namespace std;

int i=0;
char words[1001][21];//定义全局变量,方便直接操作

void readWords(){
    rd://GOTO 此处极易踩雷!
    cin>>words[i];
    if(words[i][0]!='.'){//判断输入是否结束
        i++;
        goto rd;
    }
}

void countAndPrintWords(){
    string wd[i];
    for(int j=0;j<i;j++){
        for(int m=0;m<20;m++){
            if(words[j][m]>=65&&words[j][m]<=90)
                words[j][m]+=32;//大小写转换
            if(words[j][m]>=97&&words[j][m]<=122||words[j][m]=='\'')//convert and remove the punctuation 去除标点
                wd[j]+=words[j][m];
        }
    }
    //cout<<(wd[0]==wd[1])<<"P\n";//debug用
    int k,l,a[i];
    for(k=0;k<i;k++)    a[k]=1;//initialize 初始化为1
    bool newWord[i]={false};//用于判断是否为新单词
    newWord[0]=true;
    for(k=0;k<i;k++){
        l=k-1;
        for(;l>=0;l--){ //in the left of wd[k],if same,it's not a new word 与前面比较
            if(wd[k]==wd[l])
                goto wei;  //GOTO (此处极易踩雷,慎用)
            else if(l==0)     
                newWord[k]=true; //is a new word
        }
        for(l=k+1;l<i;l++){   //in the right of wd[k] 与后面比较
            if(wd[k]==wd[l])
                a[k]++;
        }
        wei: ;//GOTO 最后分号不能掉

    }
    int b=0;
    //cout<<newWord[0]<<endl;
    for(k=0;k<i;k++){   //the cout module
        if(newWord[k]){//if it's a new word,it will be cout
            cout<<setw(10)<<wd[k]<<"\t"<<a[k]<<'\t';
            b++;
            if(b%5==0)//五个换一行
                cout<<'\n';
        }
    }
}

int main()
{
    cout<<"Please input some sentences(you can't enter any Chinese characters.And in the end of all your inputs, you should input a space and input a '.'):\n";
    readWords();
    countAndPrintWords();
    return 0;
}

我们学校使用的是codeblocks,不能用中文注释,而我英文还处于学习阶段(高情商),所以出现了一些Chinglish,见谅。

说在最后:由于时间比较紧,没有时间去优化一下。希望大家能提出一些修改意见,不管是文章的缺点还是代码的优化都可以。

Progress everyday!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-15 15:39:53  更:2021-11-15 15:40:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:26:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码