IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> структуры и функции, C++
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


по идее программа должна иметь две ф-ии: чтение из файла данных для структуры и запись в файл структуры в конец файла.и выполнять следующе:запись в файл информации только о тех ноутбуках ,тактовая частота которых больше 120 МГц,+их нужно отсортировать в порядке возрастания цены.

то,что у меня получилось к сожалению не работает...
может посмотрите и исправите какие-то ошибки?
заранее благодарна..
#include <iostream.h>
#include <fstream.h>

typedef struct tagT
{
int disp_res_x; //разрешающая способность дисплея по горизонтали
int disp_res_y; //по вертикали

int f; //тактовая частота
float d; //размер диагонали дисплея
float hdd; //объем жесткого диска
char mode [20]; //наименование
float price; //цена
}T;

void f_read(T notebook[20])
{
ifstream fin ("file.txt");
if (!fin)
{
cout << "File file.txt don't found." << endl;
return 1;
};
int n;
fin >> n;
for (int i=0;i<n;i++)
{
fin >> notebook[i].mode >> notebook[i].hdd >> notebook[i].f >> notebook[i].d >>
notebook[i].disp_res_x >> notebook[i].disp_res_y >> notebook[i].price;
};
return;
};

void f_write(T notebook[20],int i)
{
ifstream fout ("file.txt");
if (!fout)
{
cout << "File can't open for writing." << endl;
return 1;
};
int n;
fin >> n;
fout << notebook[i].mode << notebook[i].hdd << notebook[i].f << notebook[i].d <<
notebook[i].disp_res_x << notebook[i].disp_res_y << notebook[i].price << endl;
return;
};
int main()
{
T notebook[20];

f_read(notebook[20]);
int n;
fin >> n;

T buf;
for (int i=0;i<n;i++)
for (int j=n-1;j>=i+1;j--)
{
if (notebook[j-1].price > notebook[j].price)
{
memmove (&buf, &notebook[j-1], sizeof(T));
memmove (&notebook[j-1],&notebook[j], sizeof(T));
memmove (&notebook[j], &buf, sizeof(T));
};
};

for (int i=0;i<n;i++)
{
if (notebook[i].f>120) f_write(notebook[20],i);
};
}



--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
честно говоря не знаю что за "operator="
Смотри... Ты переопределяешь для класса оператор присваивания, то есть, задаешь действия, которые программа должна выполнить, если ты делаешь, например:

T a, b;
a = b; // <--- Вот так...


Как это сделать... Все очень просто:
#include <stdlib.h>
#include <string.h>

#include <iostream.h>
#include <fstream.h>


// Работаем с классами
class T {
// Функции "друзья" класса (имеют доступ к защищенным и приватным членам класса)

// Перегрузка операции ввода
friend ostream& operator << (ostream &, const T &);
// Перегрузка операции вывода
friend istream& operator >> (istream &in, T &note);

public:
// Вот это и есть перегрузка операции присваивания
T& operator = (const T &note) {
disp_res_x = note.disp_res_x; disp_res_y = note.disp_res_y;
f = note.f; d = note.d; hdd = note.hdd; price = note.price;
strcpy(mode, note.mode);
return *this;
}

// Конструктор по умолчанию
T(char* _model = "", float _price = 0.0, int _f = 0,
float _d = 0.0, float _hdd = 0.0, int dx = 0, int dy = 0):
price(_price), f(_f), d(_d), hdd(_hdd), disp_res_x(dx), disp_res_y(dy)
{
strcpy(mode, _model);
}

int disp_res_x;
int disp_res_y;

int f;
float d;
float hdd;
char mode[20];
float price;
};

istream& operator >> (istream &in, T &note) {
const int bufSize = 15;
char buffer[bufSize + 1];

float T;
char ch;

// 1. Reading model
for(int i = 0; i < bufSize; ++i) {
in.get(ch);
if(ch == '\t') break;
buffer[i] = ch;
}

buffer[i] = '\0';
strcpy(note.mode, buffer);

in >> note.price; // read price
in >> T; // skip mass

// Skip gabarites
for(i = 0; i < 15; ++i)
in.get(buffer[i]); buffer[15] = '\0';

in >> note.f; // read CPU freq
in >> T; // Skip memory size
in >> note.d; // reading disp diag
in >> T; // Skip videomemory

// Reading resolution
in.get(ch);
for(i = 0; i < 4; ++i)
in.get(buffer[i]); buffer[4] = '\0';
note.disp_res_x = atoi(buffer);

in.get(ch);
for(i = 0; i < 4; ++i)
in.get(buffer[i]); buffer[4] = '\0';
note.disp_res_y = atoi(buffer);


in >> T; // Skip monitor freq, read HDD
in >> note.hdd; // read HDD

// Get the "\n" symbol
in.get(ch);
return in;
}

ostream& operator << (ostream &out, const T &note) {
out << note.disp_res_x << ' ' << note.disp_res_y << ' '
<< note.f << ' ' << note.d << ' '
<< note.hdd << ' '
<< note.mode << endl;
return out;
};

int main()
{
const int n = 5;
T notebook[n];

cout << "starting..." << endl;

ifstream f_in("NOTE.TXT");
if(!f_in) {
cerr << "error opening file" << endl;
exit(-1);
}

for(int i = 0; i < n; ++i)
f_in >> notebook[i];

for(i = 0;i < n; i++)
for(int j = n-1; j >= i+1; j--) {

if (notebook[j-1].price > notebook[j].price) {
T buf = notebook[j - 1];
notebook[j - 1] = notebook[j];
notebook[j] = buf;
}

}

for(i = 0; i < 5; i++)
if(notebook[i].f > 120)
cout << notebook[i];

return 0;
}


Если что непонятно в логике работы - спрашивай... Вместо вывода на консоль через cout можно открыть ofstream f_out("res.txt") и точно так же направить вывод туда:
f_out << notebook[i];


Чтение происходило вот из этого файла:
Прикрепленный файл  NOTE.TXT ( 366 байт ) Кол-во скачиваний: 476


(он содержит для каждого ноута следующие данные:

модель, цена, масса, габариты(длина/ширина/высота), тактовая частота CPU, размер памяти, диагональ дисплея, размер видеопамяти, разрешение монитора(X/Y), рабочая частота монитора, размер хард-диска.

если у тебя формат файла данных другой, то придется подправить operator >>)
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Tribunal   структуры и функции   23.10.2006 13:10
volvo   Тебе здесь (это С++ программа) лучше всего сделать…   23.10.2006 17:52
Tribunal   честно говоря не знаю что за "operator=…   23.10.2006 17:59
volvo   Смотри... Ты переопределяешь для класса оператор п…   23.10.2006 19:39
Tribunal   в принципе...я могу с этим разобраться...видимо эт…   23.10.2006 19:46
volvo   Ну, нельзя классы, так поменяй class на struct - б…   23.10.2006 19:54
Tribunal   ок... нет,ну всё равно ... что не так с моей прогр…   23.10.2006 19:59
volvo   Если конкретно - то я тебе уже сказал: 1. Ты не …   23.10.2006 20:11
Tribunal   теперь программа даже запускается) так вот...а фай…   23.10.2006 20:50
volvo   Ну, запускается -то оно запускается, только вот ЧТ…   24.10.2006 0:37
Tribunal   в общем я решила всё же сделать вот так... а как …   30.10.2006 14:06
volvo   "Меня терзают смутные сомнения..." (С) Я…   30.10.2006 20:05
Tribunal   воспользовалась вашими функциями.вроде довольно ус…   4.11.2006 14:44
Tribunal   помогите.. :unsure: не могу найти ошибку...=(   7.11.2006 21:34
Tribunal   я вот попробовала написать ф-ии вот так,но заступо…   10.11.2006 22:02
Алена   Потому, что перед чтением из файла: while (re…   12.11.2006 2:06
Tribunal   спасибо,конечно, но мне это к сожалению не помогло…   12.11.2006 14:35
Алена   Присоедини сюда окончательный вариант программы, с…   12.11.2006 14:50
Tribunal   я ввожу кол-во записей,затем по порядку все поля з…   12.11.2006 15:00
Алена   Если бы ты не стала переделывать то, что было прив…   12.11.2006 16:06
Tribunal   получается нужна полная функция...хорошо,так и сде…   12.11.2006 16:16
Алена   Вот так: bin.close(); bin.open("note.…   12.11.2006 16:40
Tribunal   решила я всё-таки не стирать ничего из файла. а пр…   12.11.2006 17:09
Алена   Да что же тебя так тянет КАЖДЫЙ РАЗ менять что-то …   12.11.2006 17:38
Tribunal   огромное спасибо за уделённое время и помощь! …   12.11.2006 17:50


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.04.2024 7:10
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name