Переопределение ввода-вывода

Тема в разделе "C/C++/C#", создана пользователем 0, 5 май 2011.

  1. 0

    0 Гость

    Объект «колода карт» представляет собой массив структур, где первое поле — масть, второе — значимость. Используя операции << и >> разработать механизм сохранения состояния колоды в файле и восстановления из файла.
    Я тут пробовал писать, но не могу сообразить, как записывать данные каждой масти, это 6, 7, 8, 9, 10, валет, дама, король, туз. Вместо этого случайно программа стала выдавать рядом с надписями значки мастей.
    Код (C++):
    //---------------------------------------------------------------------------
    #include <iostream.h>
    #include <fstream.h>
    int main(int argc, char* argv[])
    {
    struct koloda_kart
    {
    char* mast;
    char znachimost;
    };
    koloda_kart e[35];
    e[0].mast="chervu";
    e[0].znachimost=3;
    e[1].mast="piki";
    e[1].znachimost=6;
    e[2].mast="trefu";
    e[2].znachimost=5;
    e[3].mast="bubnu";
    e[3].znachimost=4;
    ifstream source;
    ofstream dest;
    char filename[20]="s.dat";
    dest.open(filename);
    for(int i=0;i<4;i++)
    dest<<e[i].mast<<" "<<e[i].znachimost<<endl;
    dest.close();
    source.open(filename,ios::nocreate); // файл должен быть создан
    for(int i=0;i<4;i++)
    {
    source>>e[i].mast>>e[i].znachimost;
    cout<<e[i].mast<<" "<<e[i].znachimost<<endl;
    }
    source.close();
    cin.get();
    return 0;
    }

    //---------------------------------------------------------------------------
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Ничего не понятно. Что не получается?
     
  3. 0

    0 Гость

    Не могу сообразить, как записывать данные каждой масти, это 6, 7, 8, 9, 10, валет, дама, король, туз, а остальное по задаче. :)
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Я нихера не понял. 6, 7, 8, ... валет, дама, туз <--- это не масти, это достоинства! Сформулируй вопрос понятный языком.
    Если ты сам думать не захочешь - то другие тоже на вряд ли захотят....
     
  5. 0

    0 Гость

    Извините, достоинства(6,7,8,9...)каждой из мастей, сами масти я уже записал в задаче. А что требуется? Ведь дано условие... Я сам пытаюсь решить эту задачу... Выложил решение, просто кое-чего не пойму и хочу узнать хоть что-нибудь.
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Замени строку:
    Код (C++):
      cout << e[i].mast << " " << e[i].znachimost << endl;
    на
    Код (C++):
      cout << e[i].mast << " " << (int)e[i].znachimost << endl;
     
  7. 0

    0 Гость

    Спасибо.

    А как тогда чтобы выводилось во так:
    chervu: 6, 7, 8, 9, 10, valet, dama, korol, tyz.
    piki: 6, 7, 8, 9, 10, valet, dama, korol, tyz.
    trefu: 6, 7, 8, 9, 10, valet, dama, korol, tyz.
    bubnu: 6, 7, 8, 9, 10, valet, dama, korol, tyz.

    И как сохранять состояние колоды в файле и восстановливать из файла?
     
  8. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Надо создать массив из структур (карт), у тебя он есть это koloda_kart e[35]; но так как сделано у тебя - не пойдет т.к. в структуре ты используешь указатель.
    Надо переменную mast определить либо массивом из определенного количества символов, либо что еще лучше просто определить как переменную char, в последнем случае необходимо добавить такое определение:
    char *masti[] = { "chervu", "piki", "trefu", "bubnu" };
    где, индекс 0 - чеви, 1 - пики, 3 - трефы, 4 - буби
    После всего этого можно записывать за раз весь массив а потом считывать.

    Да, и не плохо бы структуру поместить в блок:
    Код (C++):
    #pragma pack( push, 1 )
    struct koloda_kart
    {
    char* mast;
    char znachimost;
    };
    #pragma pack( pop )
     
  9. 0

    0 Гость

    я вот тут подумал, переделал задачу, но не знаю какую функцию можно написать, для какого-нибудь изменения карт в колоде или что-нибудь подобное, вызывается при нажатии клавиши 2, сама задача вот:
    <!--shcode--><pre><code class='cpp//---------------------------------------------------------------------------
    #include <iostream.h>
    #include <fstream.h>
    int main(int argc, char* argv['>)
    {
    struct koloda_kart
    {
    char mast[10];
    char znachimost[10];
    };
    koloda_kart e[36];
    int k;
    char filename[20]="s.dat";
    do
    {
    cout<<"0-Vuxod, 1-Thenie iz faila, 2-Izmenenie kart v kolode, 3-zapis v fail"<<endl;
    cout<<"Enter 0,1,2,3: ";
    cin>>k;
    if (k==1)
    cout<<"1"<<endl;
    {ifstream source;
    source.open(filename,ios::nocreate); // файл должен быть создан
    for(int i=0;i<36;i++)
    {
    source>>e.mast>>e.znachimost;
    cout << e.mast << " " << e.znachimost << endl<<endl;
    }
    source.close();}
    if(k==2)
    cout<<"2"<<endl;
    {if (e[1].znachimost="six")/*ошибка, просто думал упорядочивать по значимости в порядке убывания.
    cout << e.mast << " " << e.znachimost << endl<<endl;
    else
    cout << e.znachimost << " " << e.mast << endl<<endl;
    };
    if (k==3)
    cout<<"3"<<endl;
    {ofstream dest; //запись

    dest.open(filename);
    for(int i=0;i<36;i++)
    dest<<e.mast<<" "<<e.znachimost<<endl;
    dest.close();}
    }
    while(k!=0);



    cin.get();
    return 0;
    }

    //---------------------------------------------------------------------------][/CODE]
     
  10. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Случай трудный...
    Давай с тобой договоримся, ты пишешь понятным языком чего ты хочешь добиться и что ты для этого предпринял, и оформляешь код (если он есть) как подобает! С тэгом "C++".
    И само собой советую еще раз (если ты уже читал) прочитать это:
    Если все будет так, то у меня (и возможно у других участников форума) появится желание тебе помочь.
     
  11. 0

    0 Гость

    Нужно, чтобы при вводе команды 2 программа расставляла по значимости в порядке убывания колоду карт, которая считана из файла(команда 1)
    вот код :
    Код (C++):
    //---------------------------------------------------------------------------
    #include <iostream.h>
    #include <fstream.h>
    int main(int argc, char* argv[])
    {
    struct koloda_kart
    {
    char mast[10];
    char znachimost[10];
    };
    koloda_kart e[36];
    int k;
    char filename[20]="s.dat";
    do
    {
    cout<<"0-Vuxod, 1-Thenie iz faila, 2-Izmenenie kart v kolode, 3-zapis v fail"<<endl;
    cout<<"Enter 0,1,2,3: ";
    cin>>k;
    if (k==1)
    cout<<"1"<<endl;
    {ifstream source;
    source.open(filename,ios::nocreate); // файл должен быть создан
    for(int i=0;i<36;i++)
    {
    source>>e[i].mast>>e[i].znachimost;
    cout << e[i].mast << " " << e[i].znachimost << endl<<endl;
    }
    source.close();}
    if(k==2)
    cout<<"2"<<endl;
    {if (e[1].znachimost="six")
    cout << e[i].mast << " " << e[i].znachimost << endl<<endl;
    else
    cout << e[i].znachimost << " " << e[i].mast << endl<<endl;
    };
    if (k==3)
    cout<<"3"<<endl;
    {ofstream dest; //запись

    dest.open(filename);
    for(int i=0;i<36;i++)
    dest<<e[i].mast<<" "<<e[i].znachimost<<endl;
    dest.close();}
    }
    while(k!=0);

    cin.get();
    return 0;
    }

    //---------------------------------------------------------------------------

    Добавлено: вот сам файл.
     

    Вложения:

  12. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
  13. 0

    0 Гость

  14. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Ты плохо читаешь.
    Например:
    Код (C++):
    char *masti[] = { "chervu", "piki", "trefu", "bubnu" };

    struct koloda_kart
    {
    char mast; // 0 - черви, 1 - пики, 3 - трефы, 4 - буби
    char znachimost;
    };

    ...
    char *mast = masti[koloda[0].mast]; // масть черви (mast == "chervi")
    ...
    Типы char в структуре можно заменить на int, но я не вижу в этом никакого смысла. Оба типа являются целочисленными, за пределы значений ты не уйдешь.
    Вот и сортируй себе на здоровье.
     
  15. 0

    0 Гость

    Вот код, не работает, что сделать чтобы работал? (при нажатии команды 2 происходит сортировка, но обращаться надо через strcpy, но не пойму как)
    Код (C++):
    //---------------------------------------------------------------------------
    #include <iostream.h>
    #include <fstream.h>
    int main(int argc, char* argv[])
    {
    struct koloda_kart
    {
    char mast[10];
    char znachimost[10];
    }tmp;
    koloda_kart e[37];  //для темпа;
    int k;// int tmp;
    char filename[20]="s.dat";
    do
    {
    cout<<"0-Vuxod, 1-Thenie iz faila, 2-Izmenenie kart v kolode, 3-zapis v fail"<<endl;
    cout<<"Enter 0,1,2,3: ";
    cin>>k;
    if (k==1)
    { cout<<"1"<<endl;
    {ifstream source;
    source.open(filename,ios::nocreate); // файл должен быть создан
    for(int i=0;i<36;i++)
    {
    source>>e[i].mast>>e[i].znachimost;
    cout << e[i].mast << " " << e[i].znachimost << endl<<endl;
    }
    source.close();}}
    if(k==2)
    { cout<<"2"<<endl;
    {
    for(int i=0; i<17;i++)
    for(int j=35; j>18;j--)
    {
    e[36].znachimost=e[i].znachimost;  //strcpy
    e[i].znachimost=e[j].znachimost;
    e[j].znachimost=e[36].znachimost;
    }}}
    if (k==3)
    {cout<<"3"<<endl;
    {ofstream dest; //запись

    dest.open(filename);
    for(int i=0;i<36;i++)
    dest<<e[i].mast<<" "<<e[i].znachimost<<endl;
    dest.close();}}
    }
    while(k!=0);
    cin.get();
    return 0;
    }

    //---------------------------------------------------------------------------
     
  16. 0

    0 Гость

    Подумал, но цикл не правильный, вот код:
    Код (C++):
    //---------------------------------------------------------------------------
    #include <iostream.h>
    #include <fstream.h>
    int main(int argc, char* argv[])
    {
    struct koloda_kart
    {
    char mast[10];
    char znachimost[10];
    }tmp;
    koloda_kart e[37];  //для темпа;
    int k;// int tmp;
    char filename[20]="s.dat";
    do
    {
    cout<<"0-Vuxod, 1-Thenie iz faila, 2-Izmenenie kart v kolode, 3-zapis v fail"<<endl;
    cout<<"Enter 0,1,2,3: ";
    cin>>k;
    if (k==1)
    { cout<<"1"<<endl;
    {ifstream source;
    source.open(filename,ios::nocreate); // файл должен быть создан
    for(int i=0;i<36;i++)
    {
    source>>e[i].mast>>e[i].znachimost;
    cout << e[i].mast << " " << e[i].znachimost << endl<<endl;
    }
    source.close();}}
    if(k==2)
    { cout<<"2"<<endl;
    {
    for(int i=0; i<17;i++)
    for(int j=35; j>18;j--)  /*неправильный цикл, а должен менять местами 1-ый и последний элементы, второй и предпоследний и так далее.*/
    {
    strcpy (e[36].znachimost, e[i].znachimost);  //strcpy
    strcpy (e[i].znachimost, e[j].znachimost);
    strcpy (e[j].znachimost, e[36].znachimost);
    }}}
    if (k==3)
    {cout<<"3"<<endl;
    {ofstream dest; //запись

    dest.open(filename);
    for(int i=0;i<36;i++)
    dest<<e[i].mast<<" "<<e[i].znachimost<<endl;
    dest.close();}}
    }
    while(k!=0);
    cin.get();
    return 0;
    }

    //---------------------------------------------------------------------------
     
Загрузка...

Поделиться этой страницей