Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
5 / 5 / 3
Регистрация: 09.12.2009
Сообщений: 42

Структура. Символьные строки

04.10.2012, 01:18. Показов 2063. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1. В магазине формируется список лиц, записавшихся на покупку товара повышенного спроса. Каждая запись этого списка содержит: порядковый номер, Ф.И.О., домашний адрес покупателя и дату постановки на учет. Удалить из списка все повторные записи, проверяя Ф.И.О. и домашний адрес.
Предусмотреть запись исходных данных в файл и возможность чтения из него. Результат вывести на экран и в файл.

Возникает сложность в удалении записи.
Сначала сделала пробную программу со структурой, поля которой были сроками.Все нормально работало, то есть удаляло повторные записи.
Сейчас сделала с записью и чтением из файла со структурой, поля которой символьные строки.
Не работает. Или я не понимаю, что нельзя сравнивать символьные строки ==?

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
typedef struct {
int nomer;
char FIO[30];
char adress[30];
char date[10];
}TPokupatel;
TPokupatel Pokup[100];
int index = 0;
 
.
.
.
.
int i, j,k, m= index;
for ( i = 0; i <= m-1; i++)
{
        for (j = i+1; j <= m; j++)
 
        if (Pokup[i].FIO == Pokup[j].FIO && Pokup[i].adress == Pokup[j].adress)
               {
                for(k = j; k <=m-1; k++)
                 {
                        Pokup[k]= Pokup[k+1];
                        Pokup[k].nomer--;
                 }
                 m--;
                }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.10.2012, 01:18
Ответы с готовыми решениями:

Задача на символьные строки. Структура "Электричка"
В файле хранится список электричек в виде: Пункт_отправления— Пункт_назначения (например, Москва—Подольск). Количество записей не...

Указатели, символьные строки и функции: удалить из строки слово с заданным номером
Функция удаляет из строки слово с заданным номером: не знаю как делать, сделал через swich case но нужно без них

Символьные строки: прочитать строку и вывести вторую половину строки
Добрый день. Помогите разобраться с заданием: прочитать строку и вывести вторую половину строки. Без использования специальных строковых...

11
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
04.10.2012, 01:27
Цитата Сообщение от lopata Посмотреть сообщение
Или я не понимаю, что нельзя сравнивать символьные строки ==?
Это не символьные строки, это массивы элементов типа char и для них оператор сравнения отдельно не перегружен. Используй стандартные функции, вроде strcmp(), либо сравнивай массивы в цикле посимвольно, либо используй вместо char string или String , либо перегрузи оператор сравнения для указателей char*. Вольному воля в общем.
А в данном варианте кода ты сравниваешь указатели на первые элементы массивов - естественно они разные.
0
5 / 5 / 3
Регистрация: 09.12.2009
Сообщений: 42
04.10.2012, 04:56  [ТС]
Блин...Точно.. это же указатели. Спасибо.

Добавлено через 2 часа 25 минут
А если как-то так? Совсем запуталась.
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
int i, j,k,l= 0,r = 0, m = index;
bool mark = FALSE;
for ( i = 0; i <= m-1; i++)
{
        for (j = i+1; j <= m; j++){
        while (l != NULL &&  r != NULL)
            {
            if  (Pokup[i].FIO[l] == Pokup[j].FIO[l]
                && Pokup[i].adress[r] == Pokup[j].adress[r])
            {
                mark = TRUE;
                l++;
                r++;
            }
            else
                break;
            }
        if (mark)
                {
                for(k = j; k <=m-1; k++)
                 {
                        Pokup[k]= Pokup[k+1];
                        Pokup[k].nomer--;
                 }
                 m--;
 
                }
         }
}
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
04.10.2012, 16:07
Лучше как-то так:
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
struct TPokupatel {
    int nomer;
    char FIO[30];
    char adress[30];
    char date[10];
 
    void set_data( int _n, char *_fio, char *_adr, char *_date ) {
        nomer = _n;
        strcpy( FIO, _fio );
        strcpy( adress, _adr );
        strcpy( date, _date );
    }
    void clean_data( ) {
        set_data( -1, "", "", "" );
    }
    void show_data( ) {
        cout << endl << "номер\t" << nomer <<
                       endl << "фамилия\t" << FIO <<
                       endl << "адрес\t" << adress <<
                       endl << "дата\t" << date << endl;
    }
    bool operator == ( TPokupatel &_comp ) {
        return ( strcmp( adress, _comp.adress ) == 0 &&
            strcmp( FIO, _comp.FIO ) == 0 &&
            strcmp( date, _comp.date ) == 0 );
    }
    TPokupatel &operator = ( TPokupatel & _eq ) {
        set_data( _eq.nomer, _eq.FIO, _eq.adress, _eq.date );
        return *this;
    }
    TPokupatel( ) {
        set_data( -1, "", "", "" );
    }
    TPokupatel( int _n, char *_fio, char *_adr, char *_date ) {
        set_data( _n, _fio, _adr, _date );
    }
};
void show_customers_arr( TPokupatel *_arr, int _count ) {
    cout << "\n\n" << "Массив покупателей:" << endl;
    for ( int i = 0; i < _count; _arr[i++].show_data( ) );
}
void clean_duplicates( TPokupatel *_arr, int _count ) {
    for ( int i = 0, j, k; i < _count - 1; i++ ) {
        for ( j = i + 1; j < _count; j++ ) {
            if ( _arr[i] == _arr[j] ) {
                for ( k = i; k < _count - 1; k++ ) {
                    _arr[k] = _arr[k + 1];
                    _arr[k].nomer--;
                }
                _arr[_count - 1].clean_data( );
                j = i + 1;
            }
        }
    }
}
// ---------------------------------------------------------------------------
int main( ) {
    system( "chcp 1251" );
    system( "cls" );
    //////////////////////////////////////
    TPokupatel Pokup[100];
    int index = 5;
 
    show_customers_arr( Pokup, index );
    Pokup[0].set_data( 1, "fio 1", "adress 1", "date 1" );
    Pokup[1].set_data( 2, "fio 2", "adress 2", "date 2" );
    Pokup[2].set_data( 3, "fio 3", "adress 3", "date 3" );
    Pokup[3].set_data( 4, "fio 4", "adress 4", "date 4" );
    Pokup[4].set_data( 5, "fio 5", "adress 5", "date 5" );
    show_customers_arr( Pokup, index );
 
    Pokup[2] = Pokup[4];
    show_customers_arr( Pokup, index );
 
    clean_duplicates( Pokup, index );
    show_customers_arr( Pokup, index );
    //////////////////////////////////////
    cout << "\n\n";
    system( "pause" );
    return 0;
}
// ---------------------------------------------------------------------------
Гораздо приятнее ведь работать с развитыми структурами, правда?
2
5 / 5 / 3
Регистрация: 09.12.2009
Сообщений: 42
04.10.2012, 19:18  [ТС]
BRcr, Или я не понимаю, или сравнивает не так как надо. Нужно сравнивать определенные поля структур. А у вас, я так понимаю, просто сравнивает структуры.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
04.10.2012, 20:28
Параметры сравнения определяются в функции operator == - меняй ее, как надо. В моем коде сравниваются поля adress, FIO, date - все вместе.
0
5 / 5 / 3
Регистрация: 09.12.2009
Сообщений: 42
05.10.2012, 01:51  [ТС]
Спасибо, но честно говоря еще сложно для меня. В общем понятно, но к моему заданию не очень применимо.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
05.10.2012, 12:22
Попробуйте вот так, должно работать__
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void __fastcall TForm1::Button7Click(TObject *Sender)
{
     int i,m,n,k=0 ;
     TStringList *slF = new TStringList();
     TStringList *slA = new TStringList();
     for (i=0;i<100;i++)  {
       slF->Add(Pokup[i].FIO); // çàïîëíåíèå ñïèñêà
       slA->Add(Pokup[i].adress);
     }
     AnsiString patF, patA;
     for (i=0;i<100;i++) {
       patF = Pokup[i].FIO;
       patA = Pokup[i].adress;
       m = slF->IndexOf(patF);
       n = slA->IndexOf(patA);
       if ((patF.Length() && m != i) ||    // åñëè íàéäåí "òåçêà"...
           (patA.Length() && n != i))  {   
         k++;
         Pokup[i] = Pokup[99];    // ïîñëåäíèé ýëåìåíò äîëæåí áûòü ïóñòûì
       }
     }
     Edit6->Text = IntToStr(k);  // ïîêàç ÷èñëà äóáëèêàòîâ
}
1
5 / 5 / 3
Регистрация: 09.12.2009
Сообщений: 42
07.10.2012, 14:01  [ТС]
Разобралась
0
5 / 5 / 3
Регистрация: 09.12.2009
Сообщений: 42
11.10.2012, 23:51  [ТС]
Ребята, теперь мне немного изменили задание.
Ключ: дата постановки на учет.
Я так понимаю, что нужно допустим ввести дату и, находя одинаковые даты, удалять повторы?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
12.10.2012, 07:12
Меняешь вот так, и все:
C++
1
2
3
    bool operator == ( TPokupatel &_comp ) {
        return ( strcmp( date, _comp.date ) == 0 );
    }
1
5 / 5 / 3
Регистрация: 09.12.2009
Сообщений: 42
12.10.2012, 13:04  [ТС]
а можешь пояснит, пожалуйста.

Добавлено через 1 минуту
Все. Относительно твоего кода поняла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.10.2012, 13:04
Помогаю со студенческими работами здесь

структура array предназначена для хранения строки типа char. Структура имеет функцию, которая позволяет изменить символ
структура array предназначена для хранения строки типа char. Структура имеет функцию, которая позволяет изменить символ с указанным...

символьные строки
как инициализировать символьную строку так, чтобы туда засунуть русские буквы? так чтобы не белеберда была

Символьные строки
Помогите доделать лабу. 21 сентября мне надо сдавать. Вот задание: Скопировать содержимое текстового файла удалив строку содержащую...

Символьные строки
Ввести с экрана строку. В строке подсчитать количество запятых и точек. Вывести на экран исходную строку и количество запятых и точек в ней...

Символьные строки
Что у меня не так? Почему не работает? Что упущено? /*Äàíî ïðåäëîæåíèå, â êîòîðîì ñëîâà ðàçäåëåíû...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru