|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
17.03.2020, 17:51 | #1 |
Регистрация: 17.03.2020
Сообщений: 5
|
Распечатать слова, из которых состоит предложение, в порядке возрастания длины слова.
Распечатать слова, из которых состоит предложение, в порядке возрастания длины слова.
Как правильно написать эту программу на C++? |
17.03.2020, 17:52 | #2 |
Регистрация: 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"); |
17.03.2020, 20:31 | #3 |
фрилансер
Форумчанин
Регистрация: 11.10.2019
Сообщений: 960
|
Bastep, у меня так получилось
Код:
|
29.03.2020, 23:53 | #4 | |
Регистрация: 17.03.2020
Сообщений: 5
|
Цитата:
Последний раз редактировалось Bastep; 29.03.2020 в 23:56. |
|
30.03.2020, 08:32 | #5 |
фрилансер
Форумчанин
Регистрация: 11.10.2019
Сообщений: 960
|
Bastep, включи поддержку C++11 или C++14, либо перепиши без лямбд )
Работу текущего кода можешь глянуть тут https://www.onlinegdb.com/ выбери Language C++ 14 |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
изменение кода макроса - разобрать предложение на отдельные слова и подсчитать частоту использования каждого слова | 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 |