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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2016, 17:11   #1
Mas0n_
Пользователь
 
Регистрация: 22.10.2016
Сообщений: 22
По умолчанию Решить задачу, используя дин. массивы и функции. С++

Всем доброго времени суток! Нужна помощь в решении задачи. Нужно написать программу с использованием динамических массивов и функций,
продемонстрировав использование указателей как формальных параметров функции и как результатов выполнения функции.
Задача: Вывести текст, составленный из последних букв всех слов.
Решил задачу без дин. массивов с функциями (но не использовал указатель как результат выполнения функции).
Код:
#include <iostream>
using namespace std;
void ftext(char *str)
{
	char text[100];
	int i, k;
	for (i = 0, k = 0; str[i]!=0; i++)
	{
		if (str[i] == ' ') {
			text[k] = str[i - 1];
			k++;
		}
	}
	text[k] = str[i - 1];
	text[++k] = '\0';
	std::cout << text << std::endl;
}
void main()
{
	char s[100];
	using namespace std;
	cout << "Enter string: ";
	gets_s(s);
	ftext(s);
}

Последний раз редактировалось Mas0n_; 09.12.2016 в 20:43.
Mas0n_ вне форума Ответить с цитированием
Старый 09.12.2016, 17:46   #2
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Mas0n_ Посмотреть сообщение
Решил
Какой ужас!
... одним только форматированием и написанием ...
olej.tsil вне форума Ответить с цитированием
Старый 09.12.2016, 21:53   #3
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Код:
//g++  4.9.3

#include <iostream>
#include <string>
#include <locale>



int main()
{
    std::string source;
    std::string result;
    std::getline(std::cin, source);
       
    
    {
        using FacetType = std::ctype<char>;
        const FacetType &facet = std::use_facet<FacetType>(std::cin.getloc());        
    
        const char *begin = source.data();
        const char *end = begin + source.size();
        do {
            const char *last =  facet.scan_is(FacetType::alnum, begin, end);
            if (last == end) {
                break;
            }
            begin = facet.scan_not(FacetType::alnum, last, end);
            result += *(begin - 1);
        } while (begin != end);  
    }
    
    std::cout << "Source string [length = " << source.size() << "]: " << source << std::endl;
    std::cout << "Result string [length = " << result.size() << "]: " << result << std::endl;
}
http://rextester.com/PCP90379
Цитата:
Source string [length = 69]: Simple example! Autor: Croessmah. Special for www.programmersforum.ru
Result string [length = 9]: eerhlrwmu
Croessmah вне форума Ответить с цитированием
Старый 09.12.2016, 22:50   #4
Mas0n_
Пользователь
 
Регистрация: 22.10.2016
Сообщений: 22
По умолчанию

Спасибо. А можно что-нибудь попроще? Я новичок, всё-таки. Или хотя бы прокомментировать.
Было бы хорошо, если бы просто добавили в мой код то, чего я попросил.
Mas0n_ вне форума Ответить с цитированием
Старый 09.12.2016, 23:11   #5
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
А можно что-нибудь попроще?
Смотря что подразумевать под простотой.
Переделал:
Код:
//g++  4.9.3

#include <iostream>
#include <string>
#include <cctype>


//Функция пропускает все разделители
//begin - указатель на место в строке с которого начинаем поиск
//end - указатель на место в строке, до которой будем вести поиск
const char *skip_delim(const char *begin, const char *end)
{
    //Крутим либо до конца (пока begin != end),
    //либо пока не встретим букву или цифру (!std::isalnum(*begin) даст false)
    while (begin != end && !std::isalnum(*begin)) {
        ++begin;//"движемся вперед" по строке
    }
    return begin;//Возвращаем "указатель на позицию", в которой остановился цикл.
    //Это будет либо указатель на конец интервала поиска (end), 
    //либо указатель на символ в строке, который либо буква, либо цифра
}



//Функция ищет разделитель
const char *find_delim(const char *begin, const char *end)
{
    //Крутим либо до конца (пока begin != end),
    //либо пока не встретим разделитель (std::isalnum(*begin) даст false)
    while (begin != end && std::isalnum(*begin)) {
        ++begin;//"движемся вперед" по строке
    }
    return begin;//Возвращаем "указатель на позицию", в которой остановился цикл.
    //Это будет либо указатель на конец интервала поиска (end), 
    //либо указатель на символ-разделитель в строке
}




int main()
{
    std::string source;
    std::string result;
    std::getline(std::cin, source);
       
    
    {
        const char *begin = source.data();//Искать будем с самого начала строки
        const char *end = begin + source.size();//И до самого конца
        do {
            const char *last =  skip_delim(begin, end);//Пропускаем все разделители.
            //last будет указывать либо на букву/цифру, либо будет равен end
            if (last == end) {//если он равен end, то значит в строке больше нет ни букв, ни цифр
                break;//можно смело выходить из цикла
            }
            //если же нашли букву/цифру, то
            begin = find_delim(last, end);//ищем в строке следубщий разделитель
            //begin теперь будет равен либо end, 
            //либо будет "указывать" на следующий символ-разделитель в строке
            //к результирующей строке прибавляем символ, стоящий до разделителя (*(begin - 1))
            result += *(begin - 1);
        } while (begin != end);//если begin != end, значит в строке обработаны еще не все символы
    }
    
    std::cout << "Source string [length = " << source.size() << "]: " << source << std::endl;
    std::cout << "Result string [length = " << result.size() << "]: " << result << std::endl;
}
http://rextester.com/WGJHZ5813
Croessmah вне форума Ответить с цитированием
Старый 10.12.2016, 19:10   #6
Mas0n_
Пользователь
 
Регистрация: 22.10.2016
Сообщений: 22
По умолчанию

Комментарии отличные! Спасибо!
Попроще, это значит использовать мой алгоритм. +мне нужны динамические массивы, а я их у вас что-то не вижу (либо я код ваш не понимаю).
Я не знаю таких функций, как isalnum(), source.data(), source.size(). Поэтому такое решение мне не подойдёт.
Mas0n_ вне форума Ответить с цитированием
Старый 10.12.2016, 19:54   #7
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Mas0n_ Посмотреть сообщение
Я не знаю таких функций, как isalnum(), source.data(), source.size().
Цитата:
man, man, ... и ещё раз man
© В.И.Ленин
olej.tsil вне форума Ответить с цитированием
Старый 10.12.2016, 20:24   #8
Mas0n_
Пользователь
 
Регистрация: 22.10.2016
Сообщений: 22
По умолчанию

Не в этом дело. Если бы можно было, я бы перечитал кучу литературы, использовал бы самые разные функции и решал бы задачу так, как я сам считаю нужным. Но я студент. Преподаватель точно поставил задачу. Об этом я написал выше. Никаких функций из стандартной библиотеки для работы со строками использовать нельзя.
Mas0n_ вне форума Ответить с цитированием
Старый 10.12.2016, 20:30   #9
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Mas0n_ Посмотреть сообщение
Никаких функций из стандартной библиотеки для работы со строками использовать нельзя.
А как же cout ? ... gets_s ?
Это всё такие же функции.
Беда
olej.tsil вне форума Ответить с цитированием
Старый 10.12.2016, 20:35   #10
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Mas0n_, велосипедить аналоги мне лень, честно.
Возни много - толку нет.
Croessmah вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить задачу используя Eclipse. (Java) Crazy_Max Помощь студентам 4 29.03.2016 21:30
нужно решить задачу используя указатели С++ Nastusha Помощь студентам 4 08.02.2009 22:45