Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2020, 17:51   #1
Bastep
 
Регистрация: 17.03.2020
Сообщений: 5
По умолчанию Распечатать слова, из которых состоит предложение, в порядке возрастания длины слова.

Распечатать слова, из которых состоит предложение, в порядке возрастания длины слова.
Как правильно написать эту программу на C++?
Bastep вне форума Ответить с цитированием
Старый 17.03.2020, 17:52   #2
Bastep
 
Регистрация: 17.03.2020
Сообщений: 5
По умолчанию

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define N 20 // максимальное количество символов в слове
// ПРОТОТИПЫ ФУНКЦИЙ
void Title();// Заголовок программы
void InpPredl (unsigned char predl [ ]); // Функция ввода предложения
// Функция выделение из предложения слов или разделителей
int Select (const unsigned char predl [ ], unsigned char m [ ][N],
unsigned char sel [ ]);
// Функция вывода массива строк на экран
void Print (unsigned char m [ ][N], int n);
// Формирование массива прочих символов (кроме разделителей)
void Symbols (unsigned char razd [ ], unsigned char symbols[ ]);
// Функция для удаления слов с цифрами
void DeleteDigits (unsigned char m[ ][N], int n);
// Функция сборки предложения-результата
unsigned char *Constructor (unsigned char slova[ ][N],
unsigned char razd[ ][N], int sl, int rz);
// Функция вывода исходного предложения и результата
void OutPredl (unsigned char *s1, unsigned char *s2);
11
// ОСНОВНАЯ ФУНКЦИЯ
int main()
{
// ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ
unsigned char predl [80]; // Введенное предложение
unsigned char *res; // Указатель на результирующее предложение
unsigned char slova [N][N]; // Массив слов в предложении
unsigned char razd [N][N]; // Массив разделителей в предложении
int sl, rz; // Счетчики слов и разделителей
unsigned char r [ ]="`!;:,.?- _"; // Разделительные знаки
unsigned char symbols [256]; // Массив остальных символов
//ВЫЗОВ ФУНКЦИЙ НА ИСПОЛНЕНИЕ
system("chcp 1251 >NUL");
Title (); // Заголовок программы
InpPredl (predl); // Ввод предложения
puts ("Введено исходное предложение");
puts (predl);
sl = Select (predl, slova, r); // Выделение из предложения слов
puts("\n Проверьте, правильно ли выделены слова");
Print (slova, sl); // Вывод массива слов на экран
// Формирование массива прочих символов (кроме разделителей)
Symbols (r, symbols);
// Выделение из предложения разделительных символов
rz = Select (predl, razd, symbols);
// Вывод массива разделительных символов на экран
puts ("\n Выделены разделительные знаки");
Print (razd, rz);
DeleteDigits (slova, sl); // Удаление слов с цифрами
puts ("\n Проверьте, какие слова остались");
Print (slova, sl);
12
res = Constructor (slova, razd, sl, rz); // Сборка предложения
OutPredl (predl, res); // Вывод результата
free (res); // Освобождение динамически выделенной памяти
system ("pause");
return 0;
}
// ОПИСАНИЕ ИСПОЛЬЗУЕМЫХ ФУНКЦИЙ (РЕАЛИЗАЦИЯ)
// Функция для вывода заголовка программы
void Title()
{ puts (" Лабораторное задание по теме № 7 \n");
puts (" Из исходного предложения удалить все слова, \n\
содержащие символы цифр. Расположение знаков \n\
препинания не менять. \n");
}
void InpPredl (unsigned char *s) // Функция ввода предложения
{ puts ("Введите предложение \n");
// На время отладки программы предложение меняться не будет
strcpy (s,"В1ерите_ли__в2ы,___что____задач а______ре3шена?");
// gets (s);
}
// Функция выделения из предложения слов или разделителей
int Select (const unsigned char predl [ ], unsigned char m[ ][N],
unsigned char sel [ ])
{
unsigned char *p, *s; // Указатели на строки
int n = 0; // Счетчик выделенных строк
s = strdup (predl); /* Делаем копию исходного предложения, так как
в функцию передается константа, а функция strtok при своей работе
требует внесения изменений в исходное предложение */
13
p = strtok (s, sel); // выделение первой части строки
while (p != NULL) // если подстрока выделена успешно ...
{ //... тогда идет ...
strcpy (m[n], p); // ... копирование строки в массив-результат,
p = strtok (NULL, sel); // выделение очередной строки
n++; // и увеличение счетчика строк
}
free (s); // удаление временной копии предложения
return n;
}
// Функция вывода массива строк на экран
void Print (unsigned char m [ ][N], int n)
{
int i;
puts (""); // вывод пустой строки
for (i=0; i<n; i++)
puts(m[i]);
puts("");
}
// Формирование массива прочих символов (кроме разделителей)
void Symbols (unsigned char razd [ ], unsigned char symbols [ ])
{ int c; int n=0;
for (c='\1'; c<256; c++) // для каждого символа с кодом от 1 до 255
if (strchr (razd, c) == NULL) // если символ не разделитель
{ symbols [n] = c; // записываем символ в массив
n++; // увеличиваем счетчик символов
}
symbols [n] = 0; /* устанавливаем признак завершения строки
выделенных символов */
}
14
// Функция проверяет слово на наличие символов цифр
int DigitsIsPresent (unsigned char s [ ])
{
int i;
for (i='0'; i<='9';i++) // выбираем символы цифр для поиска
if (strchr (s, i) != NULL) // если символ цифры в слове есть,
return 1; // то функция возвращает число 1 и завершается
return 0; /* в противном случае функция возвращает число 0
и завершает работу */
}
// Функция удаляет слова с цифрами, то есть делает их «пустыми»
void DeleteDigits (unsigned char m [ ][N], int n)
{
int i;
for (i=0; i<n; i++)
if (DigitsIsPresent (m [i]) == 1) // если цифра в слове есть,
m [i][0] = 0; // то первым символом устанавливается ноль
}
// Функция, собирающая предложение из слов и разделителей
unsigned char *Constructor (unsigned char slova [ ][N],
unsigned char razd [ ][N], int sl, int rz)
{ int Sc = 0, Rc = 0; // счетчик слов и счетчик разделителей
unsigned char res [80]; unsigned char *s;
*res=0; // Начальное значение результата «пустое»
while ((Sc<sl) || (Rc<rz))
{ if (Sc<sl) strcat (res, slova [Sc]); Sc++; // Добавление слова
if (Rc<rz) strcat (res, razd [Rc]); Rc++; // Добавление разделителей
}
s = strdup (res); return s;
}
15
// Функция вывода результата
void OutPredl (unsigned char *s1, unsigned char *s2)
{
puts ("Исходное предложение"); puts (s1);
puts (" Результат "); puts (s2); puts ("\n");
Bastep вне форума Ответить с цитированием
Старый 17.03.2020, 20:31   #3
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Bastep, у меня так получилось

Код:
#include <sstream>
#include <map>
#include <iostream>
#include <algorithm>

int main(int argc, char *argv[])
{
	std::string text="Распечатать слова, из которых состоит предложение, в порядке возрастания длины слова";

	std::multimap<std::size_t,std::string> words;

	std::stringstream ss(text);
	std::string word;
	while(ss>>word)
	{
		word.erase(std::remove_if(word.begin(),word.end(),[](auto& c)
		{
			return std::ispunct(c,std::locale());
		}),word.end());

		words.emplace(word.size(),word);
	}

	for(auto& word:words)
	{
		std::cout<<word.second<<'\n';
	}
}
Алексей1153 вне форума Ответить с цитированием
Старый 29.03.2020, 23:53   #4
Bastep
 
Регистрация: 17.03.2020
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Bastep, у меня так получилось

Код:
#include <sstream>
#include <map>
#include <iostream>
#include <algorithm>

int main(int argc, char *argv[])
{
	std::string text="Распечатать слова, из которых состоит предложение, в порядке возрастания длины слова";

	std::multimap<std::size_t,std::string> words;

	std::stringstream ss(text);
	std::string word;
	while(ss>>word)
	{
		word.erase(std::remove_if(word.begin(),word.end(),[](auto& c)
		{
			return std::ispunct(c,std::locale());
		}),word.end());

		words.emplace(word.size(),word);
	}

	for(auto& word:words)
	{
		std::cout<<word.second<<'\n';
	}
}
Не запускается
Изображения
Тип файла: png Screenshot_1.png (19.8 Кб, 7 просмотров)

Последний раз редактировалось Bastep; 29.03.2020 в 23:56.
Bastep вне форума Ответить с цитированием
Старый 30.03.2020, 08:32   #5
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Bastep, включи поддержку C++11 или C++14, либо перепиши без лямбд )

Работу текущего кода можешь глянуть тут https://www.onlinegdb.com/
выбери Language C++ 14
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
изменение кода макроса - разобрать предложение на отдельные слова и подсчитать частоту использования каждого слова Damlbdor Microsoft Office Excel 23 22.05.2019 16:42
Вывести слова в порядке возрастания их длин на си Wysler Помощь студентам 11 13.11.2014 22:27
В предложении из трех слов вывести слова в порядке нарастания их длины. Предложение описать как массив строк. Nilip 777 Помощь студентам 0 20.11.2013 17:32
Нужно создайть JAVA-программу, запрашивающую два слова и если слова разной длины, то выводить сообщение. Пожалусто,экзамен! АлексейMe Помощь студентам 1 23.04.2013 13:58
Вывести слова предложения в таком порядке, чтобы последняя буква каждого слова совпадала с первой буквой следующего слова ( java ) huhu Помощь студентам 0 06.04.2012 19:42