1 / 1 / 0
Регистрация: 15.02.2019
Сообщений: 8

Задачка с массивом слов и символов

16.02.2019, 00:29. Показов 2342. Ответов 11

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток!
В университете дали решить такую задачу:

"Дан массив слов и подстрока. Для всех слов массива, если слово не содержит заданную подстроку, то добавить подстроку в начало этого слова."

В общем несложно, но есть ряд ограничений.
Разработать программу на языке С, которая состоит из функции main(), выполняющей ввод исходных данных и вывод результата, и функции, реализующей заданные действия и вызываемой из функции main().
Все строки (и только строки) должны быть размещены динамически с помощью оператора new. Для посимвольного доступа к элементам строки нельзя использовать операцию [ ] (например, s[i]).

Я кое-что уже сделал, но так не примут, потому что я тупо печатаю подстроку к строке. И не понимаю, как сделать по-другому. Выделить память в цикле?

Еще надо работать с массивом слов, а не с массивом символов, как у меня, но тут тоже не понимаю,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "pch.h"
#include <iostream>
#include <cstdio>
 
 
void finder(char *words, char *substr, char *p) {
    p = strtok(words, " ");
    while (words != NULL)
    {
        if (strstr(words, substr) == NULL) {
            printf("%s", substr);
            printf("%s\n", words);
            words = strtok(NULL, " ");
        }
        else {
            printf("%s\n", words);
            words = strtok(NULL, " ");
        }
    }
}
 
int main() {
    char *p = new char[25];
    char *words = new char[25];
    char *substr = new char[20];
 
    puts("Enter your words: ");
    gets_s(words, 25);
 
    puts("Your words are: ");
    puts(words);
 
    puts("Enter your substr: ");
    gets_s(substr, 20);
 
    puts("Your substr is: ");
    puts(substr);
    printf("\n");
    finder(words, substr, p);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.02.2019, 00:29
Ответы с готовыми решениями:

Задачка с массивом и задачка с формулами Ньютона и Лагранжа
Прошу помочь решить две задачи

Задачка с массивом
Здравствуйте. Помогите найти ошибку. Кое что написал но программа виснет. Разделить массив на две части, поместив в первую элементы,...

Задачка с массивом
Даны числа от а(1) до а(n). Получить все члены, которые входят в последовательность по одному разу. Помогите пожалуйста:huh:. Идею то я...

11
39 / 31 / 7
Регистрация: 31.01.2019
Сообщений: 81
16.02.2019, 00:51
инклюды :
#include <iostream>
#include <cstdio>

странные у Вас, как в приплюснутом Си, компилируется с ними?
В Си без плюсов обычно так
#include <stdio.h>
#include <stdlib.h>
. . . . .
1
1 / 1 / 0
Регистрация: 15.02.2019
Сообщений: 8
16.02.2019, 00:54  [ТС]
Да, компилится и все работает. Но преподаватель такой вариант решения точно не примет, надо как-то в памяти сохранить ответ, а не просто печатать. Думал в цикле выделять постоянно память, а затем использовать конкатенацию, но это просто идея, как реализовать не знаю.

P.S. По сути это и есть приплюснутый Си, по заданию, из С++ я использую только new и delete
0
39 / 31 / 7
Регистрация: 31.01.2019
Сообщений: 81
16.02.2019, 01:08
Странно, но ведь в Си без плюсов нет оператора new
это из C++ оператор
gcc у меня не смог скомпилить (естественно)
а вот g++ справляется
наверное все же задачку на С++ нужно решать? а не на С
0
1 / 1 / 0
Регистрация: 15.02.2019
Сообщений: 8
16.02.2019, 01:09  [ТС]
На С++, да, но так как мы только начали проходить плюсы, мы используем только new и delete, а весь остальной код как на Си
(такое странное условие, однако)
Я в вижуал студио писал.
0
39 / 31 / 7
Регистрация: 31.01.2019
Сообщений: 81
16.02.2019, 01:20
Цитата Сообщение от NatJag Посмотреть сообщение
Я в вижуал студио писал.
вижу
указатели изучали?
если да, можно воспользоваться тем что
массив[i] и *(массив + i) вернут один и тот же элемент массива
и обойти запрет на использование квадратных скобок
2
1 / 1 / 0
Регистрация: 15.02.2019
Сообщений: 8
16.02.2019, 01:25  [ТС]
Да, мы это проходили, с этим понятно, спасибо
Тут скорее загвоздка в том, что я не знаю, как присоединить подстроку к элементу массива слов(который еще и надо объявить, это получится, я так понимаю, массив указателей на указатель)
Может, для этого надо создать отдельный массив символов, зарезервировать под него память (длина от обоих строк), но тогда вопрос в том, где именно это делать, в цикле while?
Ох, я запутался...
0
39 / 31 / 7
Регистрация: 31.01.2019
Сообщений: 81
16.02.2019, 02:19
Лучший ответ Сообщение было отмечено NatJag как решение

Решение

Цитата Сообщение от NatJag Посмотреть сообщение
Все строки (и только строки) должны быть размещены динамически с помощью оператора new.
под строками я так думаю подразумеваются слова? которые в массив нужно поместить,
вот в этот:
Цитата Сообщение от NatJag Посмотреть сообщение
Дан массив слов
если так, то да
Цитата Сообщение от NatJag Посмотреть сообщение
это получится, я так понимаю, массив указателей на указатель
объявить такой массив указателей
в цикле выделяете память, вводите слово
потом обработка ( finder у вас ) и вывод

Добавлено через 34 минуты
фрагмент:
C++
1
2
3
4
5
6
7
8
char **pp = new char*[50]; // массив указателей на указатели( на char)
 
    for(int i = 0; i < 50; i++){
 
        pp[i] = new char[25]; // выделяем память под очередное слово(строку?)
        puts("Enter your words: "); 
        fgets(pp[i], 25, stdin); // вводим, можно и gets_s(pp[i], 25); как у Вас
        }
1
1 / 1 / 0
Регистрация: 15.02.2019
Сообщений: 8
16.02.2019, 03:23  [ТС]
Большое спасибо!
0
39 / 31 / 7
Регистрация: 31.01.2019
Сообщений: 81
16.02.2019, 14:31
Лучший ответ Сообщение было отмечено NatJag как решение

Решение

тестовый вариант
искомая строка задана жестко в subSt = "test"
число слов(строк?) в массиве для теста тоже ограничено n=5
видоизменить эти параметры для ввода с stdin оставляю Вам
память не освобождал, в реальной проге естественно нужно delete
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <cstdio>
#include <cstring>
 
int n = 5;//число слов(строк?) в массиве
const char *subSt = "test"; // тестовое слово(строка)
char *psubstr1;
size_t k; 
 
void finder(char *words, const char *substr1) {    
        
        if (strstr(words, substr1) == NULL) {//не нашли, вставляем subSt в начало
            psubstr1 = strncat(psubstr1,words, 100);// substr1 = substr1 + words
            //size_t lenWords = strlen(words);
            size_t lenSubstr = strlen(psubstr1);
            for(size_t i = 0;i < lenSubstr;i++) {
                *(words + i) = *(psubstr1 + i);// words = substr1
            }
            *(words + lenSubstr) = '\0';
            *(psubstr1 + k) = '\0';
        }    
}
 
int main(){ 
    char **pp = new char*[n];//
    char *temp = new char[100]{};//временный буфер
    // в него поместим подстроку, которую ищем
    // в него же будет попадать результатs "сложения"(конкатенации) слов(строк) впоследствии
    psubstr1 = strncat(temp, subSt, 100);
    k = strlen(subSt);// длина подстроки понадобится;  
// в цикле ввод слов и тут же выделение памяти под них
    for(int i = 0; i < n; i++){ 
        pp[i] = new char[50];
        puts("Enter your words: "); 
        fgets(pp[i], 50, stdin);
        }
    puts("Your words:");    // покажем что ввели
    for(int i = 0; i < n; i++){          
        printf("%s",pp[i]);
        }
//  ищем тестовую subSt("test") 
    for(int i = 0; i < n; i++){
        finder(pp[i], subSt);
    }
    puts("Result ===> "); //результат
    for(int i = 0; i < n; i++){          
        printf("%s",pp[i]);
        }   
        
return 0;
}
Добавлено через 3 минуты
Цитата Сообщение от NatJag Посмотреть сообщение
Для всех слов массива, если слово не содержит заданную подстроку, то добавить подстроку в начало этого слова."
Цитата Сообщение от NatJag Посмотреть сообщение
Все строки (и только строки) должны быть размещены динамически с помощью оператора new. Для посимвольного доступа к элементам строки нельзя использовать операцию [ ] (например, s[i]).
выполнено
замечания, предложения, конструктивная критика приветствуются
1
1 / 1 / 0
Регистрация: 15.02.2019
Сообщений: 8
16.02.2019, 15:29  [ТС]
Вы очень меня выручили
Теперь разобрался, спасибо еще раз!
1
39 / 31 / 7
Регистрация: 31.01.2019
Сообщений: 81
16.02.2019, 15:44
компилироваться не будет - спрашивайте
будет возможность - попробую помочь в силу своих скромных способностей
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.02.2019, 15:44
Помогаю со студенческими работами здесь

Задачка с массивом
Как решить эту задачу в Си? Дан массив вещественных случайных чисел (размер массива определяет поль-зователь, но в диапазоне )....

Задачка с массивом
Здравствуйте, обучаясь на первом курсе ивт столкнулся с проблемной задачей =\ с массивами совсем не получается найти общего языка =\...

Задачка с одномерным массивом
помогите, пожалуста решить задачу, своих знаний не хватает. В одномерном массиве целых чисел найти минимальный и максимальный...

Задачка с квадратным массивом
В квадратном массиве записаны целые числа. Определить: а) произведение элементов побочной диагонали, меньших 10 б) сумму элементов...

Интересная задачка с массивом
Всем привет! Подскажите пожалуйста как можно перебрать массив так, чтобы : 1 Удалить все лишние значения кроме цифр 2 Сложить каждые 2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
Колмогоровская сложность: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
PostgreSQL в Kubernetes: Подготовка кластера и настройка
Mr. Docker 20.03.2025
Когда доходит до контейнеризации баз данных и особенно таких требовательных к ресурсам системах как PostgreSQL, многие команды до сих пор колеблются, прежде чем перенести их в контейнерную. . .
C++26: Индексирование пакетов и метапрограммиро­вание
bytestream 20.03.2025
Эволюция C++ продолжается стремительными темпами – каждый новый стандарт приносит функциональность, о которой мы мечтали годами. Звучит слишком громко? Если вы когда-либо боролись с вариадическими. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru