Привет всем...у меня Огромная проблемища....нивкакую не получаются задачки...
помогите пожалуйста разобраться с тем как решать вот эту задачку:
С помощью динамических переменных реализуйте вещественную матрицу размером 200 x 100. Каждому элементу матрицы присвойте случайное значение из заданного диапазона. Отсортируйте элементы в строках и строки по значению первого элемента. Выдайте на экран первую подматрицу размером 20 x 10.
вот...и еще проблема вот с такой задачкой:
Для хранения данных о цветных планшетных сканерах описать структуру вида :
struct scan_info{
char model[25]: // наименование модели
int price: // цена
double x_s1ze: // горизонтальный размер области сканирования
double y_s1ze; // вертикальный размер области сканирования
int optr: // оптическое разрешение
int grey; // число градаций серого
};
Написать функцию, которая динамически выделяет память под массив структур (не меньше шести элементов), заполняет его данными в режиме диалога, и записывает массив в бинарный файл. Структура файла: в первых двух байтах размещается значение типа int, определяющее количество сделанных в файл записей; далее без пропусков размещаются записи о сканерах.
Написать функцию, которая запрашивает данные о сканере в режиме диалога и замещает записи в бинарном файле по заданному номеру. Обязательный параметр — номер замещаемой записи. Функция должна возвращать нулевое значение, если запись прошла успешно, и -1 в противном случае.
Привести пример программы, создающей файл с данными о сканерах (данные вводятся с клавиатуры) из не менее восьми записей и осуществляющий вставку новых данных о сканере.
Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается.
я написала кодик....но он не работает ...вот я не знаю как его заработать...и еще мне кажется он не соответствует всем требованиям задачки...а я незнаю как его под них исправить
#include<stdio.h>
#include<conio.h>
#include<cstdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream.h>
#include<fstream.h>
using namespace std;
struct scan_info{
char model[25]; //int price; //int x_s1ze; //int y_s1ze; //int optr; //int grey; //
};
void replacement(scan_info *sc_inf[], int del, int for_point, int for_size, ostream &out, int n);
void replacement(scan_info *sc_inf[], int ind, int for_point, int for_size, ostream &out, int n){
cout<<"VVedite model:"<<endl;
cin>>sc_inf[ind]->model;
cout<<"VVedite cenu:"<<endl;
cin>>sc_inf[ind]->price;
cout<<"VVedite gorizontalniy razmer oblasti skanirovania:"<<endl;
cin>>sc_inf[ind]->x_s1ze;
cout<<"VVedite vertikalniy razmer oblasti skanirovania:"<<endl;
cin>>sc_inf[ind]->y_s1ze;
cout<<"VVedite opticheskoe razreshenie:"<<endl;
cin>>sc_inf[ind]->optr;
cout<<"VVedite chislo gradaciy serova:"<<endl;
cin>>sc_inf[ind]->grey;
out.seekp(for_point);
out<<sc_inf[ind]->model;
out<<sc_inf[ind]->price;
out<<sc_inf[ind]->x_s1ze;
out<<sc_inf[ind]->y_s1ze;
out<<sc_inf[ind]->optr;
out<<sc_inf[ind]->grey;
for(int i=ind+1; i<n; i++){
out<<sc_inf[i]->model;
out<<sc_inf[i]->price;
out<<sc_inf[i]->x_s1ze;
out<<sc_inf[i]->y_s1ze;
out<<sc_inf[i]->optr;
out<<sc_inf[i]->grey;
}
};
void del_ellement(scan_info *sc_inf[], int del, int for_point, ostream &out, int n){
out.seekp(for_point);
for(int i=(del+1); i<n; i++){
out<<sc_inf[i]->model;
out<<sc_inf[i]->price;
out<<sc_inf[i]->x_s1ze;
out<<sc_inf[i]->y_s1ze;
out<<sc_inf[i]->optr;
out<<sc_inf[i]->grey;
}
}
void main()
{
scan_info *sc_inf[3];
int i, j, n=3, del;
for(i=0; i<n; i++) {
sc_inf[i]=(scan_info *) malloc(sizeof(scan_info));
}
int collector=0; /*Niae?aoaeu*/for(i=0; i<n; i++){
cout<<"VVedite model:"<<endl;
cin>>sc_inf[i]->model;
cout<<"VVedite cenu:"<<endl;
cin>>sc_inf[i]->price;
cout<<"VVedite gorizontalniy razmer oblasti skanirovania:"<<endl;
cin>>sc_inf[i]->x_s1ze;
cout<<"VVedite vertikalniy razmer oblasti skanirovania:"<<endl;
cin>>sc_inf[i]->y_s1ze;
cout<<"VVedite opticheskoe razreshenie:"<<endl;
cin>>sc_inf[i]->optr;
cout<<"VVedite chislo gradaciy serova:"<<endl;
cin>>sc_inf[i]->grey;
}
ofstream out("C://test/test2.txt", ios::out | ios::binary);
if(!out){
cout<<"Not File"<<endl;
getch();
return;
}
int for_point[3];
int for_size[3];
int pr=2;
out.seekp(pr);
for(i=0; i<n; i++){
out<<sc_inf[i]->model;
out<<sc_inf[i]->price;
out<<sc_inf[i]->x_s1ze;
out<<sc_inf[i]->y_s1ze;
out<<sc_inf[i]->optr;
out<<sc_inf[i]->grey;
collector=0;
int ran=sc_inf[i]->price;
while(ran!=0){
ran=ran/10;
collector++;
}
ran=sc_inf[i]->x_s1ze;
while(ran!=0){
ran=ran/10;
collector++;
}
ran=sc_inf[i]->y_s1ze;
while(ran!=0){
ran=ran/10;
collector++;
}
ran=sc_inf[i]->optr;
while(ran!=0){
ran=ran/10;
collector++;
}
ran=sc_inf[i]->grey;
while(ran!=0){
ran=ran/10;
collector++;
}
for_point[i]=pr;
for_size[i] =strlen(sc_inf[i]->model)+collector;
pr+=strlen(sc_inf[i]->model)+collector;
}
int zam; int bb=1;
cout<<"Vvedite ellement na zameni:";
cin>>zam;
if(zam>n || zam<0){
bb=0;
cout<<"No correct"<<endl;
}
zam--;
if(bb){
replacement(sc_inf, zam, for_point[zam], for_size[zam], out, n);
}
out.close();
getch();
}
Здравствуйте, z1z, Вы писали:
z1z>Привет всем...у меня Огромная проблемища....нивкакую не получаются задачки... z1z>помогите пожалуйста разобраться с тем как решать вот эту задачку: z1z>С помощью динамических переменных реализуйте вещественную матрицу размером 200 x 100. Каждому элементу матрицы присвойте случайное значение из заданного диапазона. Отсортируйте элементы в строках и строки по значению первого элемента. Выдайте на экран первую подматрицу размером 20 x 10.
Тут 3 слоя: алгоритмы, структуры данных и собственно кодирование.
По алгоритмам:
Лобовое решение — это представить матрицу как массив строк, где каждая строка — указатель на массив.
Отсортировать каждую строку независимо.
Сортировка строк сведётся к сортировке укзателей по хитрому предикату (по первому элементу).
Правда, при этом мы совершим кучу лишней работы...
Следующие улучшения: не полностью сортировать каждую строку и массив строк, а брать первые 20 и первые 10 порядковых статистик, соответственно. Оставшиеся хвосты из 180 элементов и 90 строк сортировать необязательно.
Наконец, ещё более продвинутое решение — это в каждой строке найти первую порядковую статистику (т.е. минимальный элемент), затем отсортировать массив строк, и только затем сортировать каждую из избранных строк.
По структурам данных:
Мне кажется, что если писать на С, то удобнее всего хранить матрицу в линейном массиве построчно. Подмассивы представляют строки.
Отдельно взять массив дескрипторов строк (в самом простом виде — указатели на начала строк в этом линейном массиве).
На С++ можно и массив массивов сделать.
По кодированию:
Если пишешь на C++, то в твоём распоряжении — контейнеры и алгоритмы STL.
Тебе потребуются vector для хранения данных, sort или partial_sort для частичной сортировки. Ну и рукописные функции кое-какие.
Если на Си — то qsort.
Ниже — эскиз кода на С++, изрядно задействующий алгоритмы STL. Это тебе планка для общего развития. Что осилишь — всё твоё
Здравствуйте, z1z, Вы писали:
z1z>вот...и еще проблема вот с такой задачкой:
z1z>Для хранения данных о цветных планшетных сканерах описать структуру вида :
z1z>struct scan_info{
z1z>char model[25]: // наименование модели
z1z>int price: // цена
z1z>double x_s1ze: // горизонтальный размер области сканирования
z1z>double y_s1ze; // вертикальный размер области сканирования
z1z>int optr: // оптическое разрешение
z1z>int grey; // число градаций серого
z1z>};
z1z>Написать функцию, которая динамически выделяет память под массив структур (не меньше шести элементов), заполняет его данными в режиме диалога, и записывает массив в бинарный файл. Структура файла: в первых двух байтах размещается значение типа int, определяющее количество сделанных в файл записей; далее без пропусков размещаются записи о сканерах.
z1z>Написать функцию, которая запрашивает данные о сканере в режиме диалога и замещает записи в бинарном файле по заданному номеру. Обязательный параметр — номер замещаемой записи. Функция должна возвращать нулевое значение, если запись прошла успешно, и -1 в противном случае.
z1z>Привести пример программы, создающей файл с данными о сканерах (данные вводятся с клавиатуры) из не менее восьми записей и осуществляющий вставку новых данных о сканере.
z1z>Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается.
z1z>я написала кодик....но он не работает ...вот я не знаю как его заработать...и еще мне кажется он не соответствует всем требованиям задачки...а я незнаю как его под них исправить
Прежде всего, код страшный.
1) Неоднократно скопипащенный вывод структуры в поток — можно было оформить одной функцией, а то и вообще оператором <<.
2) Странный выбор хедеров — <iostream.h> и т.п. при том, что using namespace std. Уж определись — или старый компилятор с недо-STL, или STL.
3) Оригинальное название полей — x_s1ze вместо x_size
После этого простенького рефакторинга проступает структура программы.
Бросается в глаза механика управления памятью. Это же С++, зачем использовать malloc? Да и необходимость голых массивов (более того: массива указателей на объекты) сомнительна.
Массив указателей, конечно, удобен для быстрого удаления-добавления. Но для небольших массивов небольших структур (48 байт) этим можно по первости пренебречь.
Переходим на векторы.
Заодно избавились от многочисленных утечек! (У тебя, между прочим, ни одного free() не было)
И удовлетворили требованию задачи: в файле могло быть более чем 3 записи, а ты резервировала место ровно под 3. Ещё чуть-чуть, и получили бы расстрел памяти.
#include <iostream>
#include <fstream>
#include <vector>
z1z>using namespace std;
z1z>struct scan_info{
z1z> char model[25]; //
z1z> int price; //
z1z> int x_size; //
z1z> int y_size; //
z1z> int optr; //
z1z> int grey; //
z1z>};
typedef vector<scan_info> scan_info_vector;
// в дальнейшем, если мы захотим использовать другое представление данных в памяти,
// не составит труда рефакторить программу, заменив этот тип
// на похожий контейнероподобный, или при небольшой доработке, на вообще любойvoid textual_output(ostream& ostr, scan_info const& data)
{
ostr << "Model : " << data.model << endl;
ostr << "Price : " << data.price << endl;
......
return out;
}
void binary_output(ostream& ostr, scan_info const& data)
{
ostr.write((const char*)&data, sizeof(data));
}
void textual_input(ostream& ostr, istream& istr, scan_info& data)
{
ostr << "Model ? "; istr >> data.model;
ostr << "Price ? "; istr >> data.price;
......
}
void binary_input(istream& istr, scan_info& data)
{
istr.read((char*)&data, sizeof(data));
}
// ещё информация о файлеint const header_size = sizeof(short); // 2-байтный заголовок: длинаvoid binary_read_header(ostream& ostr, int& size)
{
short hdr;
ostr.seekp(0);
ostr.read((char*)&hdr, sizeof(hdr));
size = hdr;
}
void binary_write_header(ostream& ostr, int size)
{
short hdr = size;
ostr.seekp(0);
ostr.write((const char*)&hdr, sizeof(hdr));
}
// повторяющаяся операция: записать хвост вектора в файлvoid binary_write_tail(ostream& ostr, scan_info_vector const& siv, int since)
{
// обрати внимание: информация о количестве элементов хранится внутри вектора (метод size()),
// а не протаскивается отдельным параметром во все функции.
// удобно!
ostr.seekp( header_size+since*sizeof(scan_info) );
for(int i=since, n=siv.size(); i!=n; ++i)
binary_output(ostr, siv[i]);
}
// теперь мы умеем читать и писать файл целикомvoid binary_write_all(ostream& ostr, scan_info_vector const& siv)
{
binary_write_header(ostr, siv.size());
binary_write_tail(ostr, siv, 0);
}
void binary_read_all(istream& istr, scan_info_vector& siv)
{
int n;
binary_read_header(istr, n);
siv.resize(n);
// сейчас позиция в файле - сразу за заголовком, поэтому seekp не нуженfor(int i=0; i!=n; ++i)
binary_input(istr, siv[i]);
}
z1z>void replacement(scan_info_vector& siv, int ind, ostream &out){
textual_input(cout, cin, siv[ind]);
binary_write_tail(out, siv, ind);
z1z>};
z1z>void del_ellement(scan_info_vector& siv, int del, ostream &out){
siv.erase(siv.begin()+del);
binary_write_header(out, siv.size()); // этого кода у тебя не было!
binary_write_tail(out, siv, del);
z1z> }
z1z>void main()
z1z>{
scan_info_vector sc_inf;
// радикально избавились от упражнений с памятью.
z1z> int collector=0; /*Niae?aoaeu*/int initial_count; cout << "Initial number of records? "; cin >> initial_count;
z1z> for(i=0; i<initial_count; i++){
scan_info info;
textual_input(cout, cin, info);
sc_inf.push_back(info);
z1z> }
z1z> ofstream out("C://test/test2.txt", ios::out | ios::binary);
z1z> if(!out){
z1z> cout<<"Not File"<<endl;
z1z> getch();
z1z> return;
z1z> }
z1z> int for_point[3];
z1z> int for_size[3];
z1z> int pr=2;
z1z> out.seekp(pr);
// не надо распараллеливать запись в файл и какую-то арифметику!
// сделаем это отдельно
binary_write_all(out, sc_inf);
z1z> for(i=0; i<sc_inf.size(); i++){
z1z> collector=0;
z1z> int ran=sc_inf[i]->price;
z1z> while(ran!=0){
z1z> ran=ran/10;
z1z> collector++;
z1z> }
z1z> ran=sc_inf[i]->x_s1ze;
z1z> while(ran!=0){
z1z> ran=ran/10;
z1z> collector++;
z1z> }
z1z> ran=sc_inf[i]->y_s1ze;
z1z> while(ran!=0){
z1z> ran=ran/10;
z1z> collector++;
z1z> }
z1z> ran=sc_inf[i]->optr;
z1z> while(ran!=0){
z1z> ran=ran/10;
z1z> collector++;
z1z> }
z1z> ran=sc_inf[i]->grey;
z1z> while(ran!=0){
z1z> ran=ran/10;
z1z> collector++;
z1z> }
z1z> for_point[i]=pr;
z1z> for_size[i] =strlen(sc_inf[i]->model)+collector;
z1z> pr+=strlen(sc_inf[i]->model)+collector;
z1z>}
z1z> int zam; int bb=1;
z1z> cout<<"Vvedite ellement na zameni:";
cin>>>zam;
z1z> if(zam>n || zam<0){
z1z> bb=0;
z1z> cout<<"No correct"<<endl;
z1z> }
z1z> zam--;
z1z> if(bb){
z1z> replacement(sc_inf, zam, for_point[zam], for_size[zam], out, n);
z1z> }
z1z> out.close();
z1z>getch();
z1z>}
Дальше сама развлекайся.
Очередные темы для рефакторинга:
— вынести код создания файла в отдельную функцию
— добавить интерактивность: спрашивать пользователя, хочет ли он
— — создать новый файл и заполнить его данными
— — прочесть файл
— — вывести всю таблицу
— — заменить/удалить/вставить/добавить запись
кстати, подумай, как будет выглядить код вставки.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: Срочно нужна помощь с двумя задачками по С++
Здравствуйте, Кодт, Вы писали:
К>Продолжаем исправлять.
К>После этого простенького рефакторинга проступает структура программы. К>Бросается в глаза механика управления памятью. Это же С++, зачем использовать malloc? Да и необходимость голых массивов (более того: массива указателей на объекты) сомнительна. К>Массив указателей, конечно, удобен для быстрого удаления-добавления. Но для небольших массивов небольших структур (48 байт) этим можно по первости пренебречь. К>Переходим на векторы.
К>Заодно избавились от многочисленных утечек! (У тебя, между прочим, ни одного free() не было) К>И удовлетворили требованию задачи: в файле могло быть более чем 3 записи, а ты резервировала место ровно под 3. Ещё чуть-чуть, и получили бы расстрел памяти.
К>
К>#include <iostream>
К>#include <fstream>
К>#include <vector>
z1z>>using namespace std;
z1z>>struct scan_info{
z1z>> char model[25]; //
z1z>> int price; //
z1z>> int x_size; //
z1z>> int y_size; //
z1z>> int optr; //
z1z>> int grey; //
z1z>>};
К>typedef vector<scan_info> scan_info_vector;
К> // в дальнейшем, если мы захотим использовать другое представление данных в памяти,
К> // не составит труда рефакторить программу, заменив этот тип
К> // на похожий контейнероподобный, или при небольшой доработке, на вообще любой
К>void textual_output(ostream& ostr, scan_info const& data)
К>{
К> ostr << "Model : " << data.model << endl;
К> ostr << "Price : " << data.price << endl;
К> ......
К> return out;
К>}
К>void binary_output(ostream& ostr, scan_info const& data)
К>{
К> ostr.write((const char*)&data, sizeof(data));
К>}
К>void textual_input(ostream& ostr, istream& istr, scan_info& data)
К>{
К> ostr << "Model ? "; istr >> data.model;
К> ostr << "Price ? "; istr >> data.price;
К> ......
К>}
К>void binary_input(istream& istr, scan_info& data)
К>{
К> istr.read((char*)&data, sizeof(data));
К>}
К>// ещё информация о файле
К>int const header_size = sizeof(short); // 2-байтный заголовок: длина
К>void binary_read_header(ostream& ostr, int& size)
К>{
К> short hdr;
К> ostr.seekp(0);
К> ostr.read((char*)&hdr, sizeof(hdr));
К> size = hdr;
К>}
К>void binary_write_header(ostream& ostr, int size)
К>{
К> short hdr = size;
К> ostr.seekp(0);
К> ostr.write((const char*)&hdr, sizeof(hdr));
К>}
К>// повторяющаяся операция: записать хвост вектора в файл
К>void binary_write_tail(ostream& ostr, scan_info_vector const& siv, int since)
К>{
К> // обрати внимание: информация о количестве элементов хранится внутри вектора (метод size()),
К> // а не протаскивается отдельным параметром во все функции.
К> // удобно!
К> ostr.seekp( header_size+since*sizeof(scan_info) );
К> for(int i=since, n=siv.size(); i!=n; ++i)
К> binary_output(ostr, siv[i]);
К>}
К>// теперь мы умеем читать и писать файл целиком
К>void binary_write_all(ostream& ostr, scan_info_vector const& siv)
К>{
К> binary_write_header(ostr, siv.size());
К> binary_write_tail(ostr, siv, 0);
К>}
К>void binary_read_all(istream& istr, scan_info_vector& siv)
К>{
К> int n;
К> binary_read_header(istr, n);
К> siv.resize(n);
К> // сейчас позиция в файле - сразу за заголовком, поэтому seekp не нужен
К> for(int i=0; i!=n; ++i)
К> binary_input(istr, siv[i]);
К>}
z1z>>void replacement(scan_info_vector& siv, int ind, ostream &out){
К> textual_input(cout, cin, siv[ind]);
К> binary_write_tail(out, siv, ind);
z1z>>};
z1z>>void del_ellement(scan_info_vector& siv, int del, ostream &out){
К> siv.erase(siv.begin()+del);
К> binary_write_header(out, siv.size()); // этого кода у тебя не было!
К> binary_write_tail(out, siv, del);
z1z>> }
z1z>>void main()
z1z>>{
К> scan_info_vector sc_inf;
К> // радикально избавились от упражнений с памятью.
z1z>> int collector=0; /*Niae?aoaeu*/
К> int initial_count; cout << "Initial number of records? "; cin >> initial_count;
z1z>> for(i=0; i<initial_count; i++){
К> scan_info info;
К> textual_input(cout, cin, info);
К> sc_inf.push_back(info);
z1z>> }
z1z>> ofstream out("C://test/test2.txt", ios::out | ios::binary);
z1z>> if(!out){
z1z>> cout<<"Not File"<<endl;
z1z>> getch();
z1z>> return;
z1z>> }
z1z>> int for_point[3];
z1z>> int for_size[3];
z1z>> int pr=2;
z1z>> out.seekp(pr);
К> // не надо распараллеливать запись в файл и какую-то арифметику!
К> // сделаем это отдельно
К> binary_write_all(out, sc_inf);
z1z>> for(i=0; i<sc_inf.size(); i++){
z1z>> collector=0;
z1z>> int ran=sc_inf[i]->price;
z1z>> while(ran!=0){
z1z>> ran=ran/10;
z1z>> collector++;
z1z>> }
z1z>> ran=sc_inf[i]->x_s1ze;
z1z>> while(ran!=0){
z1z>> ran=ran/10;
z1z>> collector++;
z1z>> }
z1z>> ran=sc_inf[i]->y_s1ze;
z1z>> while(ran!=0){
z1z>> ran=ran/10;
z1z>> collector++;
z1z>> }
z1z>> ran=sc_inf[i]->optr;
z1z>> while(ran!=0){
z1z>> ran=ran/10;
z1z>> collector++;
z1z>> }
z1z>> ran=sc_inf[i]->grey;
z1z>> while(ran!=0){
z1z>> ran=ran/10;
z1z>> collector++;
z1z>> }
z1z>> for_point[i]=pr;
z1z>> for_size[i] =strlen(sc_inf[i]->model)+collector;
z1z>> pr+=strlen(sc_inf[i]->model)+collector;
z1z>>}
z1z>> int zam; int bb=1;
z1z>> cout<<"Vvedite ellement na zameni:";
cin>>>>zam;
z1z>> if(zam>n || zam<0){
z1z>> bb=0;
z1z>> cout<<"No correct"<<endl;
z1z>> }
z1z>> zam--;
z1z>> if(bb){
z1z>> replacement(sc_inf, zam, for_point[zam], for_size[zam], out, n);
z1z>> }
z1z>> out.close();
z1z>>getch();
z1z>>}
К>
К>Дальше сама развлекайся. К>Очередные темы для рефакторинга: К>- вынести код создания файла в отдельную функцию К>- добавить интерактивность: спрашивать пользователя, хочет ли он К>- — создать новый файл и заполнить его данными К>- — прочесть файл К>- — вывести всю таблицу К>- — заменить/удалить/вставить/добавить запись К>кстати, подумай, как будет выглядить код вставки.
Привет...спасиба тебе огромное за помощь ...я вот тут сама переписала немного можешь посмотреть что не так....?
#include <iostream.h>
#include <string.h>
#include <fstream.h>
struct scan_info
{
char model[25]; // наименование моделиint price; // ценаdouble x_size; // горизонтальный размер области сканированияdouble y_size; // вертикальный размер области сканированияint optr; // оптическое разрешениеint grey; // число градаций серого
};
int add(scan_info* scan_arr, int count)
{
scan_arr = new scan_info[count];
for (int i = 0; i < count; ++i)
{
cout << "Enter model: ";
cin >> scan_arr[i].model;
cout << "Enter price: ";
cin >> scan_arr[i].price;
cout << "Enter x size: ";
cin >> scan_arr[i].x_size;
cout << "Enter y size: ";
cin >> scan_arr[i].y_size;
cout << "Enter optical resolution: ";
cin >> scan_arr[i].optr;
cout << "Enter the number of shade of gray: ";
cin >> scan_arr[i].grey;
}
char path;
cout << "Enter path to file: ";
cin >> path;
fstream file(path.c_str(), out | binary);
if (!file)
{
return -1;
}
file.write(reinterpret_cast<char*>(&count),sizeof(int));
for (int i = 0; i < count; ++i)
{
file.write(reinterpret_cast<char*>(&scan_arr[i]),sizeof(scan_info));
}
file.close();
return 0;
}
int replace(const string& path, int position)
{
fstream file(path.c_str(),in | out | binary);
if (!file)
{
return -1;
}
int count = 0;
file.read(reinterpret_cast<char*>(&count),sizeof(int));
if (position < 0 || position > count)
{
return -1;
}
scan_info scaner;
cout << "Enter model: ";
cin >> scaner.model;
cout << "Enter price: ";
cin >> scaner.price;
cout << "Enter x size: ";
cin >> scaner.x_size;
cout << "Enter y size: ";
cin >> scaner.y_size;
cout << "Enter optical resolution: ";
cin >> scaner.optr;
cout << "Enter the number of shade of gray: ";
cin >> scaner.grey;
file.clear();
file.seekg(sizeof(int)+sizeof(scan_info)*position,std::ios::beg);
file.write(reinterpret_cast<char*>(&scaner),sizeof(scan_info));
file.close();
return 0;
}
int read(const string& path, scan_info* scan_arr)
{
fstream file(path.c_str(), in | binary);
if (!file)
{
return -1;
}
int count = 0;
file.read(reinterpret_cast<char*>(&count),sizeof(int));
scan_arr = new scan_info[count];
for (int i = 0; i < count; ++i)
{
cout << i << endl;
file.read(reinterpret_cast<char*>(&scan_arr[i]),sizeof(scan_info));
cout << "Enter model: " << scan_arr[i].model << endl;
cout << "Enter price: " << scan_arr[i].price << endl;
cout << "Enter x size: " << scan_arr[i].x_size << endl;
cout << "Enter y size: " << scan_arr[i].y_size << endl;
cout << "Enter optical resolution: " << scan_arr[i].optr << endl;
cout << "Enter the number of shade of gray: " << scan_arr[i].grey << endl;
}
file.close();
return 0;
}
int main(int argc, char* argv[])
{
scan_info* pTr = NULL;
string path;
int count = 0;
int position = 0;
cout << "Enter number of scaners: ";
cin >> count;
add(pTr,count);
cout << "Enter path to file: ";
cin >> path;
cout << "Enter the position of the detachable field: ";
cin >> position;
replace(path,position);
delete [] pTr;
read(path,pTr);
delete [] pTr;
_flushall();
getchar();
return 0;
}
заранее благодарна...
Re[4]: Срочно нужна помощь с двумя задачками по С++
(moderator) а вот оверквотинг устраивать не надо...
z1z>Привет...спасиба тебе огромное за помощь ...я вот тут сама переписала немного можешь посмотреть что не так....?
Незачёт по рефакторингу.
1) У тебя снова дважды повторяется код ввода структуры: cout<<"Enter model"; cin>>scan_arr[i].model; ...
2) Допустим, операция записи структуры в файл выражена одной-двумя строками file.seekg, file.write — но и её следовало бы оформить отдельной функцией.
Незачётик по политике наименования.
Функция read уже существует в глобальном пространстве имён:
int read( // POSIX-ное имя; ISO-шное - это _readint file_descriptor,
void *buffer,
unsigned int count
);
Если твоя функция не расширяет/уточняет/подстраивает общее поведение под конкретные типы аргументов, то лучше так не делать. Вносится путаница.
Незачёт по управлению памятью.
z1z>int add(scan_info* scan_arr, int count)
// что (по смыслу) возвращает эта функция?
// указатель на массив принимается по значению (всегда приходит NULL)
z1z>{
z1z> scan_arr = new scan_info[count];
// тут же это значение переписывается (наружу оно не видно)
.....
z1z> return 0;
// никуда новое значение scan_arr не возвращается, получили утечку
z1z>}
// та же история и с функцией read
.....
z1z>int main(int argc, char* argv[])
z1z>{
z1z> scan_info* pTr = NULL;
.....
// pTr == NULL
z1z> add(pTr,count);
// pTr == NULL, потому что add принимает его по значению
.....
// в свете этого - delete[] (scan_info*)(NULL) ничего не делает
z1z> delete [] pTr;
z1z> read(path,pTr);
z1z> delete [] pTr;
.....
z1z> return 0;
z1z>}