Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа со структурами, Как можно оперировать с указателями? 
V
    Опции темы
Deliverance
Дата 9.10.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 2.12.2007
Где: Украина,Донецк

Репутация: нет
Всего: нет



Собствено,вопрос вот в чём.

Имеется структура
Код

struct Storage{char titl[30];char autor[30];};


Нужно осуществить поиск и сортировку,но...

Так же имеется Список указателей и n-е кол-во этих структур

Код

void main()
{
    char in;
    SetConsoleOutputCP(1251);
    int n=0,v=0,x=0,&N=n, &index=x;
    
    cout<<"\n Введите n= ";
    cin >> n;

    Storage **S=new Storage*[n];

    for(int i=0;i<n;i++)
    {
        S[i]=new Storage;
    }
    for(int i=0;i<n;i++)
    {
            *S[i]=Put();
    }


Каким образом осуществляется доступ к самим структурам и как менять указатели при сортировке ?
PM MAIL WWW ICQ Skype   Вверх
zim22
Дата 9.10.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Deliverance @  9.10.2009,  17:34 Найти цитируемый пост)
и как менять указатели при сортировке ?

swap?
Цитата(Deliverance @  9.10.2009,  17:34 Найти цитируемый пост)
Каким образом осуществляется доступ к самим структурам

по указателю



--------------------
PM MAIL   Вверх
Deliverance
Дата 9.10.2009, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 2.12.2007
Где: Украина,Донецк

Репутация: нет
Всего: нет



Цитата(zim22 @ 9.10.2009,  17:36)
Цитата(Deliverance @  9.10.2009,  17:34 Найти цитируемый пост)
и как менять указатели при сортировке ?

swap?
Цитата(Deliverance @  9.10.2009,  17:34 Найти цитируемый пост)
Каким образом осуществляется доступ к самим структурам

по указателю

А конкретнее можно? Я ж не волшебник,я только учусь))

Swap? Это ,что? И как получить доступ,например к titl 5-ой структурной записи?

Это сообщение отредактировал(а) Deliverance - 9.10.2009, 17:41
PM MAIL WWW ICQ Skype   Вверх
bsa
Дата 9.10.2009, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Доступ через разыменование. Если нужно получить доступ к полям структуры, то используй -> вместо точки.
Указатели менять с помощью присваивания.
Рекомендуется к прочтению: Часто задаваемые вопросы

Добавлено через 4 минуты и 15 секунд
Цитата(Deliverance @ 9.10.2009,  17:40)
Swap? Это ,что?

swap - обмен:
Код
void swap(Type &x, Type &y)
{
   Type t = x;
   x = y;
   y = t;
}
Цитата(Deliverance @ 9.10.2009,  17:40)
И как получить доступ,например к titl 5-ой структурной записи?
Код
S[5]->titl

PM   Вверх
Deliverance
Дата 9.10.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 2.12.2007
Где: Украина,Донецк

Репутация: нет
Всего: нет



Вот! Это уже кое-что! Спасибо,будем думать.
Я всё понимаю,когда много лет пишешь программы,то такие вопросы вызывают скуку и негодование,но если на это взглянуть со стороны того,кто только учится,то не такие они уж "скучные". smile 
PM MAIL WWW ICQ Skype   Вверх
bsa
Дата 9.10.2009, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




M
bsa
Deliverance, для таких есть "Часто задаваемые вопросы", с которых и надо начинать. Затем нужно поискать в поиске... И только если там ответа нет, обращаться к форумчанам.


Это сообщение отредактировал(а) bsa - 9.10.2009, 17:56
PM   Вверх
Deliverance
Дата 9.10.2009, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 2.12.2007
Где: Украина,Донецк

Репутация: нет
Всего: нет



Искал,смотрел,но не нашёл,поэтому и спросил.Ну не понятно мне как с этими указателями в динамических массивах многомерных работать и объяснить не кому((( smile 
PM MAIL WWW ICQ Skype   Вверх
mes
Дата 9.10.2009, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Deliverance @  9.10.2009,  17:05 Найти цитируемый пост)
Искал,смотрел,но не нашёл,поэтому и спросил.Ну не понятно мне как с этими указателями в динамических массивах многомерных работать и объяснить не кому((( smile  

а не надо начинать со сложного.. для начала разберитесь просот со структорой, потом с доступом к ней через указатель, потом с одномерными статическими массивами ну и так дальше.. 
 smile 


--------------------
PM MAIL WWW   Вверх
Deliverance
Дата 9.10.2009, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 2.12.2007
Где: Украина,Донецк

Репутация: нет
Всего: нет



Вот я и подошёл к этому(
Код

Storage **SortBook(Storage**S,int &N)
{
    Storage temp;
    Storage tmp,tmp1;
    for(int i=0;i<=N-1;i++)
    {
      for(int j=N-1;j>i;j--)
        {
         tmp=S[i][j];
         tmp1=S[i][j-1];
         int r= strcmp(tmp.titl,tmp1.titl);
         if(r>0)                      //  Изменил ,не туда посмотрел в описании strcmp
           {
            temp=S[i][j];
             S[i][j]=S[i][j-1];
             S[i][j-1]=temp;
           }
        }
     } 

    
    return S;
}


Вот Так работает,но не корректно,подскажите ,что не так написал?

Ввыводит мусор после перестановки ,не понятно почему?

Это сообщение отредактировал(а) Deliverance - 9.10.2009, 20:23
PM MAIL WWW ICQ Skype   Вверх
Anikmar
Дата 9.10.2009, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(Deliverance @  9.10.2009,  19:43 Найти цитируемый пост)
        int r= strcmp(tmp.titl,tmp1.titl);
         if(r==0)
           {
            temp=*S[j];
             S[j]=S[j-1];
             *S[j-1]=temp;
           }

На сколько я помню, strcmp вернет 0, если строки равны. Если они равны, зачем вы пытаетесь менять их местами?
PM MAIL ICQ   Вверх
Deliverance
Дата 9.10.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 2.12.2007
Где: Украина,Донецк

Репутация: нет
Всего: нет



Цитата(Anikmar @  9.10.2009,  20:06 Найти цитируемый пост)
На сколько я помню, strcmp вернет 0, если строки равны. Если они равны, зачем вы пытаетесь менять их местами? 



Изменил ,не туда посмотрел в описании strcmp
PM MAIL WWW ICQ Skype   Вверх
bsa
Дата 9.10.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Deliverance, ты пишешь на С++, зачем пользуешься Сишными средствами? Чем тебя std::string не устроил?
PM   Вверх
Deliverance
Дата 9.10.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 2.12.2007
Где: Украина,Донецк

Репутация: нет
Всего: нет



Цитата(bsa @  9.10.2009,  21:08 Найти цитируемый пост)
Deliverance, ты пишешь на С++, зачем пользуешься Сишными средствами? Чем тебя std::string не устроил? 


Да не умею я ими пользоваться,вот для меня проблема в этой программе ,поменять местами указатели,ну не понимаю.как это сделать,а так же не понимаю.как сравнить элементы структуры,точнее.как получить эти элементы и сравнить,потом переставить если нужно,у меня просто записывает меньший в предыдущий и получается две одинаковые строки(
PM MAIL WWW ICQ Skype   Вверх
Deliverance
Дата 9.10.2009, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 2.12.2007
Где: Украина,Донецк

Репутация: нет
Всего: нет



Уря !!! smile  Заработало!!!

Код

Storage **SortBook(Storage**S,int &N)
{
    
    Storage tmp,tmp1;
    for(int i=0;i<=N-1;i++)
    {
      for(int j=N-1;j>i;j--)
        {
         tmp=*S[j];
         tmp1=*S[j-1];
         int r= strncmp(tmp.titl,tmp1.titl,1); 
        if(r<0)
          {
             Storage *p=S[j];
             S[j]=S[j-1];
             S[j-1]=p;
             r=0;
          }
        }
     } 

    
    return S;
}


Спасибо всем!  smile 
PM MAIL WWW ICQ Skype   Вверх
bsa
Дата 9.10.2009, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




M
bsa
Deliverance, если ответ на вопрос получен, то пометь тему решенной

PM   Вверх
Deliverance
Дата 9.10.2009, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 2.12.2007
Где: Украина,Донецк

Репутация: нет
Всего: нет



Вот всё моё детище целиком рабочее
Код

# include <iostream>
# include <string.h>
# include <windows.h>
# include <stdio.h>

using namespace std;
struct Storage{char titl[30];char autor[30];};



Storage Put();

Storage **AddBook(Storage**S,int &n);

Storage **NweBook(Storage**S,int &n);

Storage **DelBook(Storage**S,int &n);

Storage **SortBook(Storage**S,int &n);

int TSerchBook(Storage**S,int &n,int &index);

int ASerchBook(Storage**S,int &n,int &index);

Storage **AddBook(Storage**S,int &n);

void OutputBook(Storage**S,int &n);



Storage Put(){
    // формирование объкта
    Storage temp;
    cout<<"\n Введите название : ";
    cin>>temp.titl;
    cout<<"\n Введите автора :";
    cin>>temp.autor;
    
    return temp;
}
void OutputBook(Storage**S,int &n)
{
    Storage temp;
    for(int i=0;i<n;i++)
     {
        
             temp=*S[i];
             cout <<i<<":\t"<<temp.titl<<":\t" <<temp.autor<<'\n';
        
     }
    
        
}
Storage **SortBook(Storage**S,int &N)
{
    
    Storage tmp,tmp1;
    for(int i=0;i<=N-1;i++)
    {
      for(int j=N-1;j>i;j--)
        {
         tmp=*S[j];
         tmp1=*S[j-1];
         int r= strncmp(tmp.titl,tmp1.titl,1); 
        if(r<0)
          {
             Storage *p=S[j];
             S[j]=S[j-1];
             S[j-1]=p;
             r=0;
          }
        }
     } 

    
    return S;
}
Storage **DelBook(Storage**S,int &N)
{
    int t=N;
    Storage**temp=new Storage*[--N];
    for(int i=0;i<N;i++)
    {
        temp[i]=new Storage;
    }
    for(int i=0;i<N;i++)
     {
       *temp[i]=*S[i];
     }
    
    
    
    for(int i=0;i<t;i++)
    {
        delete[] S[i];
    }
    delete S;
    
    return temp;
    
}
Storage **AddBook(Storage**S,int &N)
{
    int t=N;
    Storage**temp=new Storage*[++N];
    for(int i=0;i<N;i++)
    {
        temp[i]=new Storage;
    }
    for(int i=0;i<N-1;i++)
     {
       *temp[i]=*S[i];
     }
    *temp[N-1]=Put();
    
    
    for(int i=0;i<t;i++)
    {
        delete[] S[i];
    }
    delete S;
    
    return temp;
}
int ASerchBook(Storage**S,int &N,int &index)
{
    Storage tmp,tmp1;
    cout << "\n Введите автора :";
    cin >>tmp1.autor;
    
    for(int i=0;i<=N;i++)
    {
      for(int j=0;j<N;j++)
        {
         tmp=*S[j];
         int r= strncmp(tmp.autor,tmp1.autor,1); 
          if(r==0)
            {
                index=j;
             return 1;
            }
        }
     } 
    return 0;
}
int TSerchBook(Storage**S,int &N,int &index)
{
    Storage tmp,tmp1;
    cout << "\n Введите название книги :";
    cin >>tmp1.titl;
    
    for(int i=0;i<=N;i++)
    {
      for(int j=0;j<N;j++)
        {
         tmp=*S[j];
         int r= strncmp(tmp.titl,tmp1.titl,1); 
          if(r==0)
            {
                index=j;
             return 1;
            }
        }
     } 
    return 0;
}
Storage **NewBook(Storage**S,int &N)
{
    int t=N;    
    cout << "\n Введите n:";
    cin >> N;

    Storage**temp=new Storage*[N];

    for(int i=0;i<N;i++)
    {
        temp[i]=new Storage;
    }
    for(int i=0;i<N;i++)
    {
      *temp[i]=Put();
    }
    
    for(int i=0;i<t;i++)
    {
        delete []S[i];
    }
    delete S;
    return temp;


}
        

void main()
{
    
    SetConsoleOutputCP(1251);
    int n=0,v=0,x=0,&N=n, &index=x;
    
    cout<<"\n Введите n= ";
    cin >> n;

    Storage **S=new Storage*[n];

    for(int i=0;i<n;i++)
    {
        S[i]=new Storage;
    }
    for(int i=0;i<n;i++)
    {
            *S[i]=Put();
    }
 while(v!=8)
    {
        system("cls");
        cout << "\t\t\t\t Меню \n\n";
        cout << "1. Новый список \n\n";
        cout << "2. Добавить элемент списка \n\n";
        cout << "3. Удалить элемент списка \n\n";
        cout << "4. Сортировка  \n\n";
        cout << "5. Вывод элементов списка на экран \n\n";
        cout << "6. Поиск списка по названию \n\n";
        cout << "7. Поиск списка по автору \n\n";
        cout << "8. Выход \n\n";
        cout << "Ваш выбор :";
        cin >> v;
        cout << '\n';

        switch(v)
               {
                case 1: 
                    {
                     S=NewBook(S,n);
                        cout <<"\n";
                        break;
                    }
                case 2:
                    {
                        S=AddBook(S,n);
                    
                        cout <<"\n";
                        break;
                    }
                case 3:
                    {
                        S=DelBook(S,n);
                        cout <<"\n";
                        
                        break;
                    }
                case 4:
                    {
                        S=SortBook(S,n);
                        cout << '\n';                
                        break;
                    }
                case 7:
                    {
                        
                     int R=ASerchBook(S,n,index);
                        if(R==1)cout<<"Книга этого автора  под № :"<<index;
                        if(R==0)cout<<"Книги этого автора нет в списке \n";
                        cout <<"\n";
                                            
                        Sleep(2000);
                        
                        break;
                    }
                case 5:
                    {
                        OutputBook(S,n);
                        cout <<"\n";
                        Sleep(2000);
                        break;
                    }
                case 6:
                    {
                        int R=TSerchBook(S,n,index);
                        if(R==1)cout<<"Книга этого автора  под № :"<<index;
                        if(R==0)cout<<"Книги этого автора нет в списке \n";
                        cout <<"\n";
                                             
                        Sleep(2000);
                    }
               }
    }

 for(int i=0;i<N;i++)
 {
     delete[]S[i];
 }
 delete S;
    
}



PM MAIL WWW ICQ Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1092 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.