Pada dasarnya, saya harus menunjukkan setiap kata dengan hitungannya tetapi kata-kata yang berulang muncul lagi di program saya.

Bagaimana cara menghapusnya dengan menggunakan loop atau haruskah saya menggunakan array 2d untuk menyimpan Word dan count?

#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <cstring>
#include <conio.h>
#include <time.h>
using namespace std;

char* getstring();
void xyz(char*);
void tokenizing(char*);

int main()
{
    char* pa = getstring();
    xyz(pa);
    tokenizing(pa);

    _getch();
}

char* getstring()
{
    static char pa[100];
    cout << "Enter a paragraph: " << endl;
    cin.getline(pa, 1000, '#');

    return pa;
}
void xyz(char* pa)
{
    cout << pa << endl;
}
void tokenizing(char* pa)
{
    char sepa[] = " ,.\n\t";
    char* token;
    char* nexttoken;
    int size = strlen(pa);
    token = strtok_s(pa, sepa, &nexttoken);
    while (token != NULL) {
        int wordcount = 0;
        if (token != NULL) {
            int sizex = strlen(token);
            //char** fin;
            int j;
            for (int i = 0; i <= size; i++) {
                for (j = 0; j < sizex; j++) {
                    if (pa[i + j] != token[j]) {
                        break;
                    }
                }
                if (j == sizex) {
                    wordcount++;
                }
            }
            //for (int w = 0; w < size; w++)
            //fin[w] =  token;
            //cout << fin[w];

            cout << token;
            cout << " " << wordcount << "\n";
        }
        token = strtok_s(NULL, sepa, &nexttoken);
    }
}

Ini adalah output yang saya dapatkan:

enter image description here

Saya ingin menunjukkan, misalnya, kata "i" sekali dengan hitungannya 5, dan kemudian tidak menampilkannya lagi.

0
Salman Qurban 5 Januari 2021, 17:02

3 jawaban

Jawaban Terbaik

Posting ini memberikan contoh untuk menyimpan setiap kata dari fungsi 'strtok' Anda ke dalam vektor string. Kemudian, gunakan string.compare untuk membandingkan setiap kata dengan kata[0]. Indeks tersebut cocok dengan Word[0] ditandai dalam array int 'digunakan'. Hitungan kecocokan sama dengan tanda angka dalam larik yang digunakan ('digunakan'). Kata-kata bertanda tersebut kemudian dihapus dari vektor, dan sisanya dilanjutkan ke proses perbandingan berikutnya. Program berakhir ketika tidak ada kata yang tersisa.

Anda dapat menulis fungsi perbandingan kata untuk menggantikan 'str.compare(str2)', jika Anda memilih untuk tidak menggunakan std::vector dan std::string.

#include <iostream>
#include <string>
#include <vector>
#include<iomanip>
#include<cstring>
 using namespace std;
      
 char* getstring();
 void xyz(char*);
 void tokenizing(char*);
 
 int main()
 {
    char* pa = getstring();
    xyz(pa);
    tokenizing(pa);
 }

 
char* getstring()
{
   static char pa[100] = "this is a test and is a test and is test.";
   return pa;
}
void xyz(char* pa)
{
  cout << pa << endl;
}
void tokenizing(char* pa)
{
   char sepa[] = " ,.\n\t";
   char* token;
   char* nexttoken;
   std::vector<std::string> word;
   int used[64];
   std::string tok;
   int nword = 0, nsize, nused;
   int size = strlen(pa);
   token = strtok_s(pa, sepa, &nexttoken);
   while (token)
   {
      word.push_back(token);
      ++nword;
      token = strtok_s(NULL, sepa, &nexttoken);
   }
   for (int i = 0; i<nword; i++) std::cout << word[i] << std::endl;
   std::cout << "total " << nword << " words.\n" << std::endl;
   nsize = nword;
   while (nsize > 0)
   {
       nused = 0;
       tok = word[0] ;
       used[nused++] = 0;
       for (int i=1; i<nsize; i++)
       {
           if ( tok.compare(word[i]) == 0 )
           {
              used[nused++] = i; }
       }
       std::cout  << tok << " : " << nused << std::endl;
       for (int i=nused-1; i>=0; --i)
       {
          for (int j=used[i]; j<(nsize+i-nused); j++) word[j] = word[j+1];
       }
       nsize -= nused;
   }
}

Perhatikan bahwa penghapusan kata-kata yang digunakan harus dilakukan dalam urutan mundur. Jika Anda melakukannya secara berurutan, indeks yang ditandai dalam larik 'bekas' perlu diubah. Tes berjalan:

$ ./a.out
this is a test and is a test and is test.
this
is
a
test
and
is
a
test
and
is
test
total 11 words.

this : 1
is : 3
a : 2
test : 3
and : 2
 
0
ytlu 5 Januari 2021, 18:25

Pertama-tama, karena Anda menggunakan c++, saya akan merekomendasikan Anda untuk membagi teks dengan cara c++ (beberapa contohnya adalah di sini), dan simpan setiap kata di peta atau unordered_map. Contoh realisasi saya, Anda dapat menemukan di sini

Tetapi jika Anda tidak ingin menulis ulang kode Anda, Anda cukup menambahkan variabel yang akan menunjukkan apakah salinan kata ditemukan sebelum atau sesudah posisi kata. Jika salinan tidak ditemukan di depan, maka cetak kata-kata Anda

1
Deumaudit 5 Januari 2021, 14:51

Saya membaca komentar terakhir Anda.

Tapi saya sangat menyesal, saya tidak tahu C. Jadi, saya akan menjawab dalam C++.

Tapi bagaimanapun, saya akan menjawab dengan pendekatan standar C++. Itu biasanya hanya 10 baris kode. . .

#include <iostream>
#include <algorithm>
#include <map>
#include <string>
#include <regex>

// Regex Helpers
// Regex to find a word
static const std::regex reWord{ R"(\w+)" };
// Result of search for one word in the string
static std::smatch smWord;

int main() {
    std::cout << "\nPlease enter text: \n";
    if (std::string line; std::getline(std::cin, line)) {

        // Words and its appearance count
        std::map<std::string, int> words{};

        // Count the words
        for (std::string s{ line }; std::regex_search(s, smWord, reWord); s = smWord.suffix())
            words[smWord[0]]++;

        // Show result
        for (const auto& [word, count] : words) std::cout << word << "\t\t--> " << count << '\n';
    }
    return 0;
}
0
cigien 5 Januari 2021, 14:37