Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62

Адресация в String

20.12.2014, 04:11. Показов 1597. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Условие задачи: Дан текст, содержащий от 2 до 50 слов, в каждом из которых от 1 до 7 строчных латинских букв; между соседними словами не менее одного пробела, за последним словом точка. Вывести те слова текста, которые отличны от первого. При выводе удалить в каждом слове символы, имеющие четные номера.

Решил сделать так чтобы слова генерировались из случайных букв.
Вот что получилось:
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 <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
int i,i2,k;
 
 
char *buk="abcdefghijklmnopqrstuvwxyz";
String slova="";
 
for (i = 1; i < 2+rand()%50; i++) {
     for (k = 0; k < 2+rand()%7; k++) {
        slova=slova+(String)buk[rand()%26];
        }
        slova=slova+' ';
        i2=i;
     }
     slova=slova+'.';
 
Edit1->Text=IntToStr(i2);
Memo1->Text = slova;
 
 
 
}
//---------------------------------------------------------------------------
После этого ничего не получается. Пытался найти функции для сравнения элементов строки (что-то типа slova[1]==slova[2]), но такого по видимо не существует.

Прошу помощи с поиском таких функций и также с удалением четных букв.
На форумах, в том числе и этом ничего такого не нашел, либо другие языки(не удается найти аналогичных функций для с++), либо там происходит сравнение нескольких строк. А про слова и элементы одной строки совсем не говорится.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.12.2014, 04:11
Ответы с готовыми решениями:

Абсолютная и Относительная адресация.
здравствуйте у меня такой вопрос. Вот я слышал что есть Абсолютный и Относительный адрес. из определения я понял что абсолютный...

Адресация процедур на asm (дублирование кода, VirtualProtect)
Здравствуйте. Не вдаваясь в мотивацию, приведу упрощенный пример для демонстрации проблемы. Помогите, пожалуйста, в ее устранении или...

Не удается разбить строку из-за конфликта string и String
Нужно разбить текст на слова, введенным пользователям. Для этого в переменную String присваю значения из элемента Memo. Затем пытаюсь с...

19
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.12.2014, 08:56
У тебя slova[1] == slova[2] не работает, что ли?
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
20.12.2014, 14:25  [ТС]
nmcf, работает, но сравнивает неправильно.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
20.12.2014, 15:27
slova[1] == slova[2] сравнит всего навсего первый и второй символ строки. Чтобы сравнить первое записанное в строке слово со вторым, надо сначала разбить строку на слова. Например, через TStringList. Примеров на форуме валом, надоело писать одно и то же.
1
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
21.12.2014, 15:59  [ТС]
Теперь моя программа выглядит так, подскажите как из слов можно удалить символы с четными номерами?
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
int i,i2,k;
 
 
char *bukv="abcdefghijklmnopqrstuvwxyz";
String slova="";
String slova2="";
 
for (i = 1; i < 10+rand()%50; i++) {
     for (k = 0; k < 4+rand()%7; k++) {
        slova=slova+(String)bukv[rand()%26];
        }slova=slova+' ';
        i2=i;
     }
     //slova=slova+'.';
Memo1->Text = slova+'.';
 
TStringList *sl = new TStringList();
    sl->DelimitedText = slova;
    sl->Delimiter = ' ';
 
for (i=0; i < i2; i++) {
    if (sl->Strings[i]!=sl->Strings[0]) {
    slova2=slova2+(sl->Strings[i])+' ';
    }
}
Memo2->Text = slova2;
}
//---------------------------------------------------------------------------
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.12.2014, 16:13
Цитата Сообщение от andrewromanov Посмотреть сообщение
как из слов можно удалить символы с четными номерами?
C++
1
2
3
 String New = "";
 for (int i=0;i<Slovo.Length();i++) if (i%2) New += Slovo[i+1];
 Slovo = New;
как-то наподобие...
1
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
21.12.2014, 16:26  [ТС]
Не работает
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
21.12.2014, 16:50  [ТС]
Чуть переделал
C++
1
2
for (i=1; i<(sl->Strings[1].Length()); i++) if (i%2) New += sl->Strings[1];
sl->Strings[1] = New;
Получается бред.
Миниатюры
Адресация в String  
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.12.2014, 16:56
Да не "чуть переделал", а неверно написал; и получается не бред, а вполне предсказуемое...
sl->Strings[1] - это целая строка, а выборочно символ в ней будет sl->Strings[1][i]
1
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
21.12.2014, 17:12  [ТС]
Спасибо, теперь работает.
Можете подсказать, как переделать код под нечетные элементы?
И что означает "+="?

Добавлено через 6 минут
И почему отсутствуют скобки {} ?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.12.2014, 17:19
Цитата Сообщение от andrewromanov Посмотреть сообщение
почему отсутствуют скобки {} ?
скобки нужны тогда, когда они нужны. А если под условием выполняется всего одна операция, то не фиг засорять.
Цитата Сообщение от andrewromanov Посмотреть сообщение
что означает "+="?
то же, что New = New + ... . Кстати, так писать правильнее; для строк не всегда срабатывает += только если строка - новая переменная.
Цитата Сообщение от andrewromanov Посмотреть сообщение
как переделать код под нечетные элементы?
инвертировать условие анализа: if (i%2 == 0)
1
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
21.12.2014, 17:20  [ТС]
Хотя нет, ошибся, работает не до конца правильно. Не выводит последнюю нечетную букву.
И не удается запустить цикл для всех слов, потому что если добавить {}, которых у вас почему то нет, программа начинает работать совсем неправильно.
Миниатюры
Адресация в String  
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
21.12.2014, 17:28  [ТС]
А если добавить скобки, то получается вот такая ситуация.
Миниатюры
Адресация в String  
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.12.2014, 17:38
Лучший ответ Сообщение было отмечено andrewromanov как решение

Решение

Цитата Сообщение от andrewromanov Посмотреть сообщение
Не выводит последнюю нечетную букву
Естественно. Внимательнее расписывайте условия цикла: в строке нумерация символов с 1, следовательно номер последнего символа совпадает с числом символов в строке, а по условию "меньше" индекс цикла этого значения не достигает. Напишите "меньше или равно", чтобы исправить ситуацию.

Добавлено через 5 минут
Цитата Сообщение от andrewromanov Посмотреть сообщение
если добавить скобки, то получается вот такая ситуация
Строка New формируется при исполнении цикла; а присваивать строке это новое значение New нужно вне цикла, после его завершения. А в вашей записи присвоение производится при каждой итерации (".. тщательнее надо..").
1
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
21.12.2014, 19:58  [ТС]
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
52
53
54
55
56
57
58
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
int i,i2,k;
 
 
char *bukv="abcdefghijklmnopqrstuvwxyz";
String slova="";
String slova2="";
String New = "";
 
for (i = 1; i < 10+rand()%50; i++) {
     for (k = 0; k < 4+rand()%7; k++) {
        slova=slova+(String)bukv[rand()%26];
        }slova=slova+' ';
        i2=i;
     }
Memo1->Text = slova+'.';
 
TStringList *sl = new TStringList();
    sl->DelimitedText = slova;
    sl->Delimiter = ' ';
 
for (i=0; i < i2; i++) {
    if (sl->Strings[i]!=sl->Strings[0]) {
    slova2=slova2+(sl->Strings[i])+' ';
    }
}
Memo2->Text = slova2;
 
for (k=1; k < i2; k++) {
    for (i=0; i<=sl->Strings[k].Length(); i++) {
        if (i%2) {
        New = New + sl->Strings[k][i];
        }
    }
    sl->Strings[1] = New;
}
 
Edit1->Text = sl->Strings[1];
 
}
//---------------------------------------------------------------------------
Почему сейчас неправильно работает?

Добавлено через 10 минут
Осталось разобраться с выводом.
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
21.12.2014, 20:09  [ТС]
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
52
53
54
55
56
57
58
59
60
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
int i,i2,k;
 
 
char *bukv="abcdefghijklmnopqrstuvwxyz";
String slova="";
String slova2="";
String New = "";
 
for (i = 1; i < 10+rand()%50; i++) {
     for (k = 0; k < 4+rand()%7; k++) {
        slova=slova+(String)bukv[rand()%26];
        }slova=slova+' ';
        i2=i;
     }
Memo1->Text = slova+'.';
 
TStringList *sl = new TStringList();
    sl->DelimitedText = slova;
    sl->Delimiter = ' ';
 
for (i=0; i < i2; i++) {
    if (sl->Strings[i]!=sl->Strings[0]) {
    slova2=slova2+(sl->Strings[i])+' ';
    }
}
Memo2->Text = slova2;
 
for (k=1; k < i2; k++) {
    for (i=0; i<=sl->Strings[k].Length(); i++) {
        if (i%2) {
        New = New + sl->Strings[k][i];
        }
    }
    sl->Strings[k] = New;
}
 
for (i=1; i < i2; i++) {
    Memo3->Text = sl->Strings[i];
}
 
}
//---------------------------------------------------------------------------
Помогите с выводом

Не работает ни
C++
1
2
3
for (i=1; i < i2; i++) {
    Memo3->Text = sl->Strings[i]+' ';
}
ни

C++
1
2
3
for (i=1; i < i2; i++) {
    Memo3->Text =Memo3->Text + sl->Strings[i];
}
Миниатюры
Адресация в String  
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.12.2014, 22:21
Вообще-то списки можно складывать...
C++
1
Memo1->Lines->AddStrings(sl) ;
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
21.12.2014, 22:30  [ТС]
Уже перепробовал кучу вариантов, в том числе и этот. Вот результат.
Миниатюры
Адресация в String  
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
21.12.2014, 22:36  [ТС]
Сообразил, нужно было сделать
C++
1
slova3 = "";
В процессе выполнения цикла.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.12.2014, 22:43
... с опозданием совет
[ Ну, на вскидку... - когда вы в цикле добавляете к строке символы (slova3), то перед началом цикла нужно строку очистить (slova3=""); так принято. ]
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.12.2014, 22:43
Помогаю со студенческими работами здесь

Заменить std::string на (String, UnicodeString, wchar_t)
Ребята подсобите std::string заменить на (String, UnicodeString, wchar_t) static size_t write_data(char *ptr, size_t size, size_t...

Вывод элементов map <string,vector<string>>
Доброго времени суток. Как можно вывести массив map &lt;string,vector&lt;string&gt;&gt; mp ? Могу только предположить, что нужно как-то...

Ошибка со string и unicode string
Записываю в комбобокс значение и хочу его сохранить, но выходит ошибка Е2277. str.c_str() = ComboBox1-&gt;Text;

Перевод строк std::string, std::wstring в Unicode (String)
Собственно столкнулся с проблемой, как корректно перевести к примеру текст из Edit1-&gt;Text в std::string или std::wstring и...

String -> std::string
String b = Edit2-&gt;Text; std::string str = AnsiString(b.c_str()); Unit1.cpp(41): E2285 Could not find a match for...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru