1 Востаннє редагувалося leofun01 (21.10.2018 17:04:57)

Тема: Робота з рядками. Сортування абзаців за довжиною.

умова така:
Задано текст. Створити масив вказівників на окремі абзаци. Посортувати їх за довжинами. Вивести посортовані абзаци на екран.
надіюсь на допомогу

[code=C++]#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
    setlocale(0," ");
    char r1[ ] = "Рандомний текст,рандомний текст. рандомний текст!рандомний текст,рандомний текст. Рандомний текст?Рандомний текст. рандомний текст,рандомний текст!рандомний текст. рандомний текст?рандомний текст!рандомний текст.";
    const char *limits = ".";
    char *p;
    printf("%s\n");
    p = strtok(r1, limits);
    while(p != NULL)
    {
        puts(p);
        p = strtok(NULL, limits);
    }
    cout << "рядок містить " << strlen(r1) << " символів\n";
    return 0;
}[/code]
почала працювати так, що програма буде робити новий абзац після кожної "."
але як дальше?

2

Re: Робота з рядками. Сортування абзаців за довжиною.

так абзац, це ж текст з нового рядка? то вам тре шукати \n замість .

3 Востаннє редагувалося oxi2431 (21.10.2018 12:49:03)

Re: Робота з рядками. Сортування абзаців за довжиною.

.

4

Re: Робота з рядками. Сортування абзаців за довжиною.

FakiNyan написав:

так абзац, це ж текст з нового рядка? то вам тре шукати \n замість .

пробувала, але в мене тоді йде неправильний підрахунок символів

5

Re: Робота з рядками. Сортування абзаців за довжиною.

а шо оце за хвункція?

strtok

6

Re: Робота з рядками. Сортування абзаців за довжиною.

чуєте, так воно і так, і так не повинно показувати "правильну" кількість символів, бо коли ми юзаємо кирилицю, наприклад, наше "а"
[code=C++]#include <iostream>               
#include <stdio.h>                 
#include <string.h>               
using namespace std;     

int main()                             
{
    setlocale(0," ");
    char r1[ ] = "а";
    const char *limits = "\n";
    char *p;
    printf("%s\n");
    p = strtok(r1, limits);
    while(p != NULL)
    {
        puts (p);
        p= strtok (NULL, limits);
    }
    cout << "рядок " << r1 <<" містить " << strlen(r1) << " символів\n";

    return 0;
}
[/code]

то воно показує, що рядок містить 2 символа. Але якщо писати латинкою, то латинське "а" має довжину 1 символ, тобто, це проблема кодування.

7

Re: Робота з рядками. Сортування абзаців за довжиною.

FakiNyan написав:

чуєте, так воно і так, і так не повинно показувати "правильну" кількість символів, бо коли ми юзаємо кирилицю, наприклад, наше "а"

#include <iostream>               
#include <stdio.h>                  
#include <string.h>                
using namespace std;      

int main()                             
{ 
    setlocale (0," ");
  char r1[ ] = "а";
  const char *limits="\n";
  char *p;
    printf("%s\n");
   p = strtok(r1, limits);
      while (p !=NULL)
      {
          puts (p);
          p= strtok (NULL, limits);
      }
  cout << "рядок " << r1 <<" містить " << strlen(r1) << " символів\n";
  
      return 0;
}

то воно показує, що рядок містить 2 символа. Але якщо писати латинкою, то латинське "а" має довжину 1 символ, тобто, це проблема кодування.




взагалі char *strtok(char *str, const char *delimiters);
функція-токенайзер – розбиває рядок str, на окремі частини (лексеми), що розділені одним з символів-роздільників delimiters, якщо частина знайдена, повертає вказівник на неї, у іншому випадку повертає нуль.

Подякували: leofun011

8

Re: Робота з рядками. Сортування абзаців за довжиною.

FakiNyan написав:

чуєте, так воно і так, і так не повинно показувати "правильну" кількість символів, бо коли ми юзаємо кирилицю, наприклад, наше "а"

#include <iostream>               
#include <stdio.h>                  
#include <string.h>                
using namespace std;      

int main()                             
{ 
    setlocale (0," ");
  char r1[ ] = "а";
  const char *limits="\n";
  char *p;
    printf("%s\n");
   p = strtok(r1, limits);
      while (p !=NULL)
      {
          puts (p);
          p= strtok (NULL, limits);
      }
  cout << "рядок " << r1 <<" містить " << strlen(r1) << " символів\n";
  
      return 0;
}

то воно показує, що рядок містить 2 символа. Але якщо писати латинкою, то латинське "а" має довжину 1 символ, тобто, це проблема кодування.

але якщо у вас є варіант як можна реалізувати дану задачу, то буду нереально вдячною

9

Re: Робота з рядками. Сортування абзаців за довжиною.

почекайте на відповіді інших чуваків, бо я в плюсах не розбираюсь

10

Re: Робота з рядками. Сортування абзаців за довжиною.

FakiNyan написав:

почекайте на відповіді інших чуваків, бо я в плюсах не розбираюсь

може просто С знаєте?

11

Re: Робота з рядками. Сортування абзаців за довжиною.

так C ще страшніше за C++

12

Re: Робота з рядками. Сортування абзаців за довжиною.

FakiNyan написав:

почекайте на відповіді інших чуваків, бо я в плюсах не розбираюсь

взагалі я ніби й розумію як вирішити задачу, але  не знаю як її краще реалізувати
от моя ідея:
приймаємо текст з якимось обмеженням на макс розмір(наприклад, 500 символів), тому створюємо масив вказівників на 250 елементів(всі не потрібні, але при тестуванні, можна ж вводити тільки символ на абзац),  присвоюємо вказівнику посилання на свій текст(щось таке: *rr1 = r1;) потім в циклі  for(;*rr1; rr1++) перевіряємо, чи цей символ = нашому розділювачу, якщо так, і якщо наступний символ не \0, то присвоюємо масиву вказівників з індексом і посилання на наступний символ(mas = rr1+1) , робимо поточний символ нулем(\0)(щоб розділити текст) та збільшуємо і (і++), все кінець циклу.  маємо масив, вказівники якого вказують на другий, на третій і так далі(на перший вказуватиме наш початковий r1) після цього мусимо посортувати, а щоб визначити довжину кожного абзацу, нам треба цикл, в якому ми збільшуємо вказівник на 1 доки не \0,  і рахуємо кількість ітерацій

13

Re: Робота з рядками. Сортування абзаців за довжиною.

то може хтось щось підказати?

14

Re: Робота з рядками. Сортування абзаців за довжиною.

почекайте, хтось обов'язково прийде

Подякували: leofun011

15

Re: Робота з рядками. Сортування абзаців за довжиною.

FakiNyan написав:

почекайте, хтось обов'язково прийде

спасибі вам

мені просто було б добре до вівторка розібратись із цією задачею

16

Re: Робота з рядками. Сортування абзаців за довжиною.

А яка це мова - C чи C++? Схоже, друге; то що заважає скористатися std::string? Так, можна трохи ефективніше, але ж головне - щоб код працював?

Подякували: leofun01, FakiNyan2

17

Re: Робота з рядками. Сортування абзаців за довжиною.

koala написав:

А яка це мова - C чи C++? Схоже, друге; то що заважає скористатися std::string? Так, можна трохи ефективніше, але ж головне - щоб код працював?

так, с++
і мені без різниці чи через string чи отак
просто не знаю як це толком реалізувати

18

Re: Робота з рядками. Сортування абзаців за довжиною.

[code=C++]#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

int main()
{
    char r1[] = "random text!";
    const char *limits="\n";
    char *p;

    p = strtok(r1, limits);
    while(p != NULL)
    {
        puts(p);
        p = strtok(NULL, limits);
    }
    cout << "line " << r1 << " has  " << strlen(r1) << " symbols\n";

    return 0;
}[/code]
виправила, щоб нормально довжину рядка рахувало

Подякували: FakiNyan1

19

Re: Робота з рядками. Сортування абзаців за довжиною.

Неефективно (стрічки копіюються в масив, чого в принципі можна уникнути), зате коротко і (ніби) зрозуміло.

Прихований текст

[code=C++]#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>

char TEXT[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam faucibus lectus sed eleifend suscipit. Sed venenatis mi at elit scelerisque, sed mollis massa convallis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce rhoncus tincidunt pulvinar. Praesent at tempor sem. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce malesuada sollicitudin porttitor. Integer egestas odio vel mi gravida venenatis. Nunc fringilla nec tortor in bibendum. Cras dapibus metus nulla, id efficitur quam semper et. Fusce tincidunt sed eros sit amet lacinia.\n\
Nam varius imperdiet sem id porttitor. Nam a dui tempus, consequat lacus id, vehicula est. Vestibulum egestas aliquet diam, nec placerat nibh. Duis ullamcorper sapien nisl, quis luctus metus pulvinar quis. Sed ullamcorper sit amet urna id sodales. Cras ex odio, sollicitudin sed nulla aliquam, pretium vehicula metus. Integer tincidunt feugiat pellentesque. Morbi ac malesuada erat. Proin consequat lacus nec fringilla eleifend. Donec fringilla malesuada pellentesque. Ut varius convallis posuere.\n\
Morbi pulvinar libero ut congue sagittis. Sed semper nulla vulputate gravida accumsan. Vestibulum varius tincidunt purus, at varius sem fringilla vel. Ut fermentum malesuada vestibulum. Cras condimentum ex sit amet efficitur accumsan. Aenean in ultrices nisl. Cras facilisis congue tortor, quis dapibus urna tempor ac. Mauris vehicula enim vitae tristique aliquam. Nullam eleifend augue eu tempus posuere. Maecenas mollis nisl at sem aliquam gravida. Cras suscipit euismod metus, et rhoncus mauris tristique malesuada.\n\
Maecenas quis leo nec nisl lobortis volutpat. Vestibulum sed mauris a nibh finibus sodales non rutrum nunc. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean sem nisl, pellentesque vel nibh id, mattis venenatis ligula. Cras placerat tincidunt ante, non dictum erat varius vitae. Mauris ornare nec purus et fermentum. Sed congue sed ipsum ut viverra. Phasellus a dignissim enim, non imperdiet odio. Nulla a dolor dignissim, feugiat ipsum vulputate, laoreet est.\n\
Proin volutpat massa id ullamcorper tempus. Mauris et ipsum sit amet ante bibendum ornare id consectetur urna. Ut vulputate mattis libero a condimentum. Phasellus vel leo magna. Praesent consectetur eu nisl eu rhoncus. Suspendisse nisl nulla, laoreet non pulvinar et, vulputate et massa. Donec at imperdiet nunc, ut laoreet justo. Integer ultricies lorem quis scelerisque pulvinar. Donec porta interdum fringilla. Praesent vel tortor auctor felis ornare tempus et facilisis risus. Nulla semper, orci ut placerat mattis, urna velit commodo lectus, vitae eleifend orci ex non urna.";

int main() {
    std::stringstream text_stream(TEXT);
    std::vector<std::string> paragraphs;
    std::string paragraph;
    while(std::getline(text_stream, paragraph))
    {
        paragraphs.push_back(paragraph);
    }
    std::sort(paragraphs.begin(), paragraphs.end(),
                 [](auto &left, auto &right) { return left.size() > right.size(); }
              );
    for(auto &paragraph : paragraphs)
    {
        std::cout << paragraph << std::endl;
    }
    return 0;
}[/code]

https://ideone.com/4q6dnS

Подякували: leofun011