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

  • Автор темы -
  • Дата начала
#1
Объект «колода карт» представляет собой массив структур, где первое поле — масть, второе — значимость. Используя операции << и >> разработать механизм сохранения состояния колоды в файле и восстановления из файла.
Я тут пробовал писать, но не могу сообразить, как записывать данные каждой масти, это 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;
}

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

lazybiz

Well-known member
03.11.2010
1 339
0
#4
Не могу сообразить, как записывать данные каждой масти, это 6, 7, 8, 9, 10, валет, дама, король, туз
Я нихера не понял. 6, 7, 8, ... валет, дама, туз <--- это не масти, это достоинства! Сформулируй вопрос понятный языком.
Если ты сам думать не захочешь - то другие тоже на вряд ли захотят....
 
#5
Я нихера не понял. 6, 7, 8, ... валет, дама, туз <--- это не масти, это достоинства! Сформулируй вопрос понятный языком.
Если ты сам думать не захочешь - то другие тоже на вряд ли захотят....
Извините, достоинства(6,7,8,9...)каждой из мастей, сами масти я уже записал в задаче. А что требуется? Ведь дано условие... Я сам пытаюсь решить эту задачу... Выложил решение, просто кое-чего не пойму и хочу узнать хоть что-нибудь.
 

lazybiz

Well-known member
03.11.2010
1 339
0
#6
Замени строку:
C++:
  cout << e[i].mast << " " << e[i].znachimost << endl;
на
C++:
  cout << e[i].mast << " " << (int)e[i].znachimost << endl;
 
#7
Замени строку:
C++:
  cout << e[i].mast << " " << e[i].znachimost << endl;
на
C++:
  cout << e[i].mast << " " << (int)e[i].znachimost << endl;
Спасибо.

А как тогда чтобы выводилось во так:
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.

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

lazybiz

Well-known member
03.11.2010
1 339
0
#8
Надо создать массив из структур (карт), у тебя он есть это 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
Надо создать массив из структур (карт), у тебя он есть это 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 )
я вот тут подумал, переделал задачу, но не знаю какую функцию можно написать, для какого-нибудь изменения карт в колоде или что-нибудь подобное, вызывается при нажатии клавиши 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]
 

lazybiz

Well-known member
03.11.2010
1 339
0
#10
Случай трудный...
Давай с тобой договоримся, ты пишешь понятным языком чего ты хочешь добиться и что ты для этого предпринял, и оформляешь код (если он есть) как подобает! С тэгом "C++".
И само собой советую еще раз (если ты уже читал) прочитать это:
Уважаемые студенты! Если хотите, что бы ваша просьба была рассмотрена и решена в кратчайшие сроки то, пожалуйста, следуйте следующим простым правилам:

1. Создавайте информативные заголовки тем. Никаких помогите плизз,Решите срочно!! и т.п. Конкретно пишите, в чем проблема.
2. В самой теме КОНКРЕТНО и ПОЛНОСТЬЮ указывайте задание. Варианты в духе:Ну там типа массив, нуно его это типа.. ну это Рассматриваться НЕ БУДУТ.
3. ОБЯЗАТЕЛЬНО указывайте нужный ЯЗЫК решения и дополнительные условия если они есть.
4. старайтесь ВСЕГДА сначала решить задачу САМОСТОЯТЕЛЬНО, ну а когда не выходит ОБЯЗАТЕЛЬНО публикуйте здесь свой код, даже если он не работает. Поверьте, это значительно повышает к вам уважение. Халявщиков, которым нужно, что бы им просто кто-нить нахаляву сделал - здесь не любят. Да и исправить мелкую ошибку в готовом коде легче, чем писать все заново.
5. Ну а те, кто не хочет что-то делать самостоятельно должны понимать, что работа людей стоит денег. Даже самая мелкая. А потому если вы готовы платить за решение своей проблемы, то так же указывайте это в своей теме. Что-то в духе: Нужно решить такую-то задачу. Оплата.

В случае НЕ СЛЕДОВАНИЯ этим простым правилам ваша тема может быть удалена/пересена/закрыта/отредактирована по настроению модератора(А они здесь злые=).
Если все будет так, то у меня (и возможно у других участников форума) появится желание тебе помочь.
 
#11
Случай трудный...
Давай с тобой договоримся, ты пишешь понятным языком чего ты хочешь добиться и что ты для этого предпринял, и оформляешь код (если он есть) как подобает! С тэгом "C++".
И само собой советую еще раз (если ты уже читал) прочитать это:

Если все будет так, то у меня (и возможно у других участников форума) появится желание тебе помочь.
Нужно, чтобы при вводе команды 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;
}

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

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

Вложения

lazybiz

Well-known member
03.11.2010
1 339
0
#14
Ты плохо читаешь.
... либо что еще лучше просто определить как переменную char, в последнем случае необходимо добавить такое определение:
char *masti[] = { "chervu", "piki", "trefu", "bubnu" };
где, индекс 0 - черви, 1 - пики, 3 - трефы, 4 - буби
Например:
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
Вот код, не работает, что сделать чтобы работал? (при нажатии команды 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
Подумал, но цикл не правильный, вот код:
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;
}

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