Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Работа со структурами


Автор: Deliverance 9.10.2009, 17:34
Собствено,вопрос вот в чём.

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

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();
    }


Каким образом осуществляется доступ к самим структурам и как менять указатели при сортировке ?

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

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

по указателю

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

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

по указателю

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

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

Автор: bsa 9.10.2009, 17:42
Доступ через разыменование. Если нужно получить доступ к полям структуры, то используй -> вместо точки.
Указатели менять с помощью присваивания.
Рекомендуется к прочтению: http://forum.vingrad.ru/forum/topic-269794/kw-faq-c++.html

Добавлено через 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

Автор: Deliverance 9.10.2009, 17:53
Вот! Это уже кое-что! Спасибо,будем думать.
Я всё понимаю,когда много лет пишешь программы,то такие вопросы вызывают скуку и негодование,но если на это взглянуть со стороны того,кто только учится,то не такие они уж "скучные". smile 

Автор: bsa 9.10.2009, 17:55

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

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

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

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

Автор: Deliverance 9.10.2009, 19:43
Вот я и подошёл к этому(
Код

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;
}


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

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

Автор: Anikmar 9.10.2009, 20:06
Цитата(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, если строки равны. Если они равны, зачем вы пытаетесь менять их местами?

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



Изменил ,не туда посмотрел в описании strcmp

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

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


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

Автор: Deliverance 9.10.2009, 21:26
Уря !!! 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 

Автор: bsa 9.10.2009, 21:40

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

Автор: Deliverance 9.10.2009, 22:14
Вот всё моё детище целиком рабочее
Код

# 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;
    
}



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)