Срочно нужна помощь с двумя задачками по С++
От: z1z  
Дата: 29.03.07 18:49
Оценка:
Привет всем...у меня Огромная проблемища....нивкакую не получаются задачки...
помогите пожалуйста разобраться с тем как решать вот эту задачку:
С помощью динамических переменных реализуйте вещественную матрицу размером 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();

}



всем кто поможет заранее благодарная....
Re: Срочно нужна помощь с двумя задачками по С++
От: Кодт Россия  
Дата: 30.03.07 09:26
Оценка:
Здравствуйте, z1z, Вы писали:

z1z>Привет всем...у меня Огромная проблемища....нивкакую не получаются задачки...

z1z>помогите пожалуйста разобраться с тем как решать вот эту задачку:
z1z>С помощью динамических переменных реализуйте вещественную матрицу размером 200 x 100. Каждому элементу матрицы присвойте случайное значение из заданного диапазона. Отсортируйте элементы в строках и строки по значению первого элемента. Выдайте на экран первую подматрицу размером 20 x 10.

Тут 3 слоя: алгоритмы, структуры данных и собственно кодирование.

По алгоритмам:

Лобовое решение — это представить матрицу как массив строк, где каждая строка — указатель на массив.
Отсортировать каждую строку независимо.
Сортировка строк сведётся к сортировке укзателей по хитрому предикату (по первому элементу).
Правда, при этом мы совершим кучу лишней работы...

Следующие улучшения: не полностью сортировать каждую строку и массив строк, а брать первые 20 и первые 10 порядковых статистик, соответственно. Оставшиеся хвосты из 180 элементов и 90 строк сортировать необязательно.

Наконец, ещё более продвинутое решение — это в каждой строке найти первую порядковую статистику (т.е. минимальный элемент), затем отсортировать массив строк, и только затем сортировать каждую из избранных строк.

По структурам данных:

Мне кажется, что если писать на С, то удобнее всего хранить матрицу в линейном массиве построчно. Подмассивы представляют строки.
Отдельно взять массив дескрипторов строк (в самом простом виде — указатели на начала строк в этом линейном массиве).
На С++ можно и массив массивов сделать.

По кодированию:

Если пишешь на C++, то в твоём распоряжении — контейнеры и алгоритмы STL.
Тебе потребуются vector для хранения данных, sort или partial_sort для частичной сортировки. Ну и рукописные функции кое-какие.

Если на Си — то qsort.



Ниже — эскиз кода на С++, изрядно задействующий алгоритмы STL. Это тебе планка для общего развития. Что осилишь — всё твоё
// генератор случайных чисел
struct random
{
    double base, delta;
    random(double v1, double v2) : base(v1), delta(v2-v1) {}
    double operator()() const { return base + delta*rand()/RAND_MAX; }
};

// генератор рядов
struct new_row
{
    double* ptr;
    int size;
    new_row(double* p, int s) : ptr(p), size(s) {}
    double* operator()() /*nonconst*/ { double* p = ptr; ptr+=size; return p; }
};

// предикат сортировки строк
struct compare_first_item
{
    bool operator()(double const* row1, double const* row2) const { return *row1 < *row2; }
};

// операция частичной сортировки
struct do_partial_sort
{
    int count, size; // взять count первых элементов из size
    do_partial_sort(int c, int s) : count(c), size(s) {}
    void operator()(double* row) const
    {
        partial_sort(row, row+count, row+size);
    }
};

// операция вывода подстроки
struct do_print
{
    ostream& ostr;
    int count;
    do_print(ostream& os, int c) : ostr(os), count(c) {}
    void operator()(double const* row) const
    {
        copy(row, row+count, ostream_iterator<double>(ostr,"; "));
        ostr << endl;
    }
};

///////////////////////////////////////

// создаём структуры данных
int const X=200, Y=100;

vector<double> data(X*Y);
vector<double*> rows(Y);
generate(rows.begin(), rows.end(), new_row(data.begin(),X)); // заполняем массив строк

// заполняем матрицу мусором
double const vmin=..., vmax=...;
generate(data.begin(), data.end(), random(vmin,vmax));

// сортируем
int const x=20, y=10;

for_each(rows.begin(), rows.end(), do_partial_sort(1,X));
partial_sort(rows.begin(), rows.begin()+y, rows.end());
for_each(rows.begin(), rows.begin()+y, do_partial_sort(x,X));

// выводим
for_each(rows.begin(), rows.begin()+y, do_print(cout,x));
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Матрица 200 x 100
От: Пётр Седов Россия  
Дата: 30.03.07 12:14
Оценка:
Здравствуйте, Кодт, Вы писали:
К>for_each(rows.begin(), rows.end(), do_partial_sort(1,X));
К>partial_sort(rows.begin(), rows.begin()+y, rows.end());
К>for_each(rows.begin(), rows.begin()+y, do_partial_sort(x,X));

Если я правильно понял, то сюда надо вписать "compare_first_item".
Пётр Седов (ушёл с RSDN)
Re[3]: Матрица 200 x 100
От: Кодт Россия  
Дата: 30.03.07 15:20
Оценка:
Здравствуйте, Пётр Седов, Вы писали:

ПС>Если я правильно понял, то сюда надо вписать "compare_first_item".


Вах! Конечно, нужно!
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: Срочно нужна помощь с двумя задачками по С++
От: Кодт Россия  
Дата: 30.03.07 16:35
Оценка: 7 (2)
Здравствуйте, 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

Ну что, давай причешем.

/*
z1z>#include<stdio.h>
z1z>#include<conio.h>
z1z>#include<cstdio.h>
z1z>#include<string.h>
z1z>#include<stdlib.h>
z1z>#include<iostream.h>
z1z>#include<fstream.h>
*/
#include <iostream>
#include <fstream>

z1z>using namespace std;

z1z>struct scan_info{
z1z> char model[25];    //
z1z> int price;         //
z1z> int x_s1ze;        //
z1z> int y_s1ze;        //
z1z> int optr;          //
z1z> int grey;          //
z1z>};

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

z1z>void replacement(scan_info *sc_inf[], int del, int for_point, int for_size, ostream &out, int n);

z1z>void replacement(scan_info *sc_inf[], int ind, int for_point, int for_size, ostream &out, int n){
/*
z1z>  cout<<"VVedite model:"<<endl;
z1z>  cin>>sc_inf[ind]->model;
z1z>  cout<<"VVedite cenu:"<<endl;
z1z>  cin>>sc_inf[ind]->price;
z1z>  cout<<"VVedite gorizontalniy razmer oblasti skanirovania:"<<endl;
z1z>  cin>>sc_inf[ind]->x_s1ze;
z1z>  cout<<"VVedite vertikalniy razmer oblasti skanirovania:"<<endl;
z1z>  cin>>sc_inf[ind]->y_s1ze;
z1z>  cout<<"VVedite opticheskoe razreshenie:"<<endl;
z1z>  cin>>sc_inf[ind]->optr;
z1z>  cout<<"VVedite chislo gradaciy serova:"<<endl;
z1z>  cin>>sc_inf[ind]->grey;
*/
      textual_input(cout, cin, *sc_inf[ind]);

z1z>  out.seekp(for_point);
/*
z1z>  out<<sc_inf[ind]->model;
z1z>  out<<sc_inf[ind]->price;
z1z>  out<<sc_inf[ind]->x_s1ze;
z1z>  out<<sc_inf[ind]->y_s1ze;
z1z>  out<<sc_inf[ind]->optr;
z1z>  out<<sc_inf[ind]->grey;
*/
      binary_output(out, *sc_inf[ind]);

z1z>  for(int i=ind+1; i<n; i++){
/*
z1z>     out<<sc_inf[i]->model;
z1z>     out<<sc_inf[i]->price;
z1z>     out<<sc_inf[i]->x_s1ze;
z1z>     out<<sc_inf[i]->y_s1ze;
z1z>     out<<sc_inf[i]->optr;
z1z>     out<<sc_inf[i]->grey;
*/
          binary_output(out, *sc_inf[i]);
z1z>    }
z1z>};
z1z> void del_ellement(scan_info *sc_inf[], int del, int for_point, ostream &out, int n){

z1z>   out.seekp(for_point);
z1z>   for(int i=(del+1); i<n; i++){
/*
z1z>     out<<sc_inf[i]->model;
z1z>     out<<sc_inf[i]->price;
z1z>     out<<sc_inf[i]->x_s1ze;
z1z>     out<<sc_inf[i]->y_s1ze;
z1z>     out<<sc_inf[i]->optr;
z1z>     out<<sc_inf[i]->grey;
*/
         binary_output(out, *sc_inf[i]);
z1z>    }
z1z> }

z1z>void main()
z1z>{
z1z> scan_info *sc_inf[3];
z1z> int i, j, n=3, del;

z1z> for(i=0; i<n; i++) {
z1z> sc_inf[i]=(scan_info *) malloc(sizeof(scan_info));
z1z> }



z1z>  int collector=0; /*Niae?aoaeu*/


z1z> for(i=0; i<n; i++){
/*
z1z>  cout<<"VVedite model:"<<endl;
z1z>  cin>>>sc_inf[i]->model;
z1z>  cout<<"VVedite cenu:"<<endl;
z1z>  cin>>>sc_inf[i]->price;
z1z>  cout<<"VVedite gorizontalniy razmer oblasti skanirovania:"<<endl;
z1z>  cin>>>sc_inf[i]->x_s1ze;
z1z>  cout<<"VVedite vertikalniy razmer oblasti skanirovania:"<<endl;
z1z>  cin>>>sc_inf[i]->y_s1ze;
z1z>  cout<<"VVedite opticheskoe razreshenie:"<<endl;
z1z>  cin>>>sc_inf[i]->optr;
z1z>  cout<<"VVedite chislo gradaciy serova:"<<endl;
z1z>  cin>>>sc_inf[i]->grey;
*/
      textual_input(cout, cin, sc_inf[i]);
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);

z1z> for(i=0; i<n; i++){
/*
z1z> out<<sc_inf[i]->model;
z1z> out<<sc_inf[i]->price;
z1z> out<<sc_inf[i]->x_s1ze;
z1z> out<<sc_inf[i]->y_s1ze;
z1z> out<<sc_inf[i]->optr;
z1z> out<<sc_inf[i]->grey;
*/
     binary_output(out, *sc_inf[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[2]: Срочно нужна помощь с двумя задачками по С++
От: Кодт Россия  
Дата: 30.03.07 17:13
Оценка:
Продолжаем исправлять.

После этого простенького рефакторинга проступает структура программы.
Бросается в глаза механика управления памятью. Это же С++, зачем использовать 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]: Срочно нужна помощь с двумя задачками по С++
От: Roman Odaisky Украина  
Дата: 30.03.07 18:20
Оценка: 1 (1) +2
Здравствуйте, Кодт, Вы писали:

[206 строк]

Можно нескромный вопрос? Откуда у тебя столько времени?!
До последнего не верил в пирамиду Лебедева.
Re[4]: Срочно нужна помощь с двумя задачками по С++
От: Кодт Россия  
Дата: 30.03.07 21:48
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Можно нескромный вопрос? Откуда у тебя столько времени?!


Откуда-откуда. Из 24 часов в сутки...
Просто стало интересно прорубиться через заросли чужих мыслей, а печатаю я очень быстро.
Перекуём баги на фичи!
Re[3]: Срочно нужна помощь с двумя задачками по С++
От: z1z  
Дата: 31.03.07 11:08
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Продолжаем исправлять.


К>После этого простенького рефакторинга проступает структура программы.

К>Бросается в глаза механика управления памятью. Это же С++, зачем использовать 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]: Срочно нужна помощь с двумя задачками по С++
От: Кодт Россия  
Дата: 02.04.07 10:35
Оценка:
Здравствуйте, z1z, Вы писали:

(moderator) а вот оверквотинг устраивать не надо...

z1z>Привет...спасиба тебе огромное за помощь ...я вот тут сама переписала немного можешь посмотреть что не так....?


Незачёт по рефакторингу.
1) У тебя снова дважды повторяется код ввода структуры: cout<<"Enter model"; cin>>scan_arr[i].model; ...
2) Допустим, операция записи структуры в файл выражена одной-двумя строками file.seekg, file.write — но и её следовало бы оформить отдельной функцией.

Незачётик по политике наименования.
Функция read уже существует в глобальном пространстве имён:
int read( // POSIX-ное имя; ISO-шное - это _read
   int 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>}

Почему ты не хочешь иметь дело с вектором?
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.