Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание матриц генератором сл. чисел, проблема со switch 
V
    Опции темы
allsolovey
Дата 9.2.2009, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Empty



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 3.1.2008

Репутация: нет
Всего: нет



у меня такая проблема.В  консольном приложении все работает нормально если не добавлять case 3 (причем даже если просто скопировать case 2  и поменять индекс).Компилируется, при запуске программы выдает ошибку (процесс остановлен при обращении к памяти по адресу...)Программа генерирует матрицы (3 вида - обычную,симметр,с нулями ) в случайном порядке. Помогите плиз выяснить че не так. Вот исходник :

Код



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


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

#pragma hdrstop

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

#pragma argsused
#include<stdlib.h>
#include<time.h>
#include<iostream.h>
#include<fstream.h>
#include<math.h>
#include <string>
#include <sstream>
#include <conio.h>



 //Функция конвертирования
char* rus(char* st)
{
        unsigned char* p = st;  // при объявлении символов как char русские буквы
                                 // кодируются отрицательными числами
    while ( *p )
    {
        if (*p >= 192) // здесь русская буква
                 if (*p <= 239)  //  А,Б, ... Я,а,б, ... п
 
                       *p -= 64;
                 else // р ...я
                       *p -= 16;
 
            p++;
        }
    return st;
}

int main(int argc, char* argv[])
{
int kol;
 std::string BaseFName = "fl";
    std::string EndFName = ".txt";


int N, *Mas, i, j, Num;
int NX;
int NY;
int var;
cout<< rus("Какую матрицу создавать (обычную(1), симметрическую(2), с нулями(3)):");
cin>>var;

 int **Matrix = new int*[NX];


switch (var) {
case 1:
{

cout<< rus("Введите порядок:");

 cin>>NX;
cout<< rus("Введите количество матриц:");
cin>>kol;
NY=NX;
cout<<endl;
NY++;
NX++;

for( int t = 1; t<=kol; t++ ){

 std::ostringstream ostr;
        ostr << t ;
        std::string FName = BaseFName + ostr.str()+EndFName ;
        std::ofstream file(FName.c_str());

        ofstream out_file(FName.c_str());

 cout<<t<<" "<<rus("matrix:")<<endl;
 cout<<endl;
 randomize();                    // Иницируем генератор случайных чисел
        for( int z = 0; z<NX; z++ )
                Matrix[z] = new int[NY];



   N = NX*NY;              // Определяем общее количество элементов
   Mas = new int[N];       // Выделяем память под элементы
   for (i = 0; i < N; i++) // Заполняем вспомогательный массив попорядку эелементов
      Mas[i] = i+1;


   for (i = 0; i < NY; i++) {
      for (j = 0; j < NX; j++) {
         Num = rand()*t % N;        // Определяем номер элемента откуда взять число
         Matrix[i][j] = Mas[Num]; // Записываем его в матрицу
         Mas[Num] = Mas[N-1];     // Исключаем элемент из выборки, записывая туда последнийэлемент
         N--;                     // Исключаем из выборки последний элемент, он у нас сохраненна месте последнего выбранного
             }
   }

   for(i=1; i<NX; i++)
{

for(j=1; j<NY; j++)
{

cout<<Matrix[i][j]<<" ";

out_file<<Matrix[i][j]<<" ";

if (j==NY-1)
{ cout<<"\n";
out_file<<"\n";             }
}

 }
cout<<endl;
out_file<<endl;
delete Mas;
}

 break;
}
case 2:
{
 cout<< rus("Введите порядок:");

 cin>>NX;
cout<< rus("Введите количество матриц:");
cin>>kol;
NY=NX;
cout<<endl;
NY++;
NX++;
for( int t = 1; t<=kol; t++ ){

 std::ostringstream ostr;
        ostr << t ;
        std::string FName = BaseFName + ostr.str()+EndFName ;
        std::ofstream file(FName.c_str());

        ofstream out_file(FName.c_str());

 cout<<t<<" "<<rus("matrix:")<<endl;
 randomize();                    // Иницируем генератор случайных чисел
        for( int z = 0; z<NX; z++ )
                Matrix[z] = new int[NY];



   N = NX*NY;              // Определяем общее количество элементов
   Mas = new int[N];       // Выделяем память под элементы
   for (i = 0; i < N; i++) // Заполняем вспомогательный массив попорядку эелементов
      Mas[i] = i+1;


   for (i = 0; i < NY; i++) {
      for (j = 0; j < NX; j++) {
         Num = rand()*t % N;        // Определяем номер элемента откуда взять число
         Matrix[i][j] = Mas[Num]; // Записываем его в матрицу
         Mas[Num] = Mas[N-1];     // Исключаем элемент из выборки, записывая туда последнийэлемент
         N--;                     // Исключаем из выборки последний элемент, он у нас сохраненна месте последнего выбранного
             }
   }

   for(i=1; i<NX; i++)
{

for(j=1; j<NY; j++)
{
if(i>j||i<j){
         Matrix[i][j]=Matrix[j][i];}
cout<<Matrix[i][j]<<" ";

out_file<<Matrix[i][j]<<" ";

if (j==NY-1)
{ cout<<"\n";
out_file<<"\n";             }
}

 }
cout<<endl;
out_file<<endl;
delete Mas;
 }
 break;
 }
  

case 2:
{
 cout<< rus("Введите порядок:");

 cin>>NX;
cout<< rus("Введите количество матриц:");
cin>>kol;
NY=NX;
cout<<endl;
NY++;
NX++;
for( int t = 1; t<=kol; t++ ){

 std::ostringstream ostr;
        ostr << t ;
        std::string FName = BaseFName + ostr.str()+EndFName ;
        std::ofstream file(FName.c_str());

        ofstream out_file(FName.c_str());

 cout<<t<<" "<<rus("matrix:")<<endl;
 randomize();                    // Иницируем генератор случайных чисел
        for( int z = 0; z<NX; z++ )
                Matrix[z] = new int[NY];



   N = NX*NY;              // Определяем общее количество элементов
   Mas = new int[N];       // Выделяем память под элементы
   for (i = 0; i < N; i++) // Заполняем вспомогательный массив попорядку эелементов
      Mas[i] = i+1;


   for (i = 0; i < NY; i++) {
      for (j = 0; j < NX; j++) {
         Num = rand()*t % N*20;        // Определяем номер элемента откуда взять число
         Matrix[i][j] = Mas[Num]; // Записываем его в матрицу
         Mas[Num] = Mas[N-1];     // Исключаем элемент из выборки, записывая туда последнийэлемент
         N--;                     // Исключаем из выборки последний элемент, он у нас сохраненна месте последнего выбранного
             }
   }

   for(i=1; i<NX; i++)
{

for(j=1; j<NY; j++)
{
cout<<Matrix[i][j]<<" ";

out_file<<Matrix[i][j]<<" ";

if (j==NY-1)
{ cout<<"\n";
out_file<<"\n";             }
}

 }
cout<<endl;
out_file<<endl;
delete Mas;
 }
 break;
 }



default:
  cout<<rus("Повторите!");
 }


_getch();
  return 0;
}




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






Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Unit1.cpp 5,97 Kb
PM MAIL   Вверх
Dmi3ev
Дата 9.2.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



ты это чудо сам сотворил))) просто ощущение... что это содрано, причем без понимания, что да как, что сделать надо...

Добавлено через 1 минуту и 31 секунду
Я, надеюсь Вас не очень обижу, если скажу, что это чушь... полная, причем... Давай Вашу задачу полностью, подробно...


--------------------

PM MAIL   Вверх
allsolovey
Дата 9.2.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Empty



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 3.1.2008

Репутация: нет
Всего: нет



Это все содрано с инета (кусками ),просто скомбинировано неправильно,в чем наверное у меня и ошибки вылазят..В программировании еще чайник.
Моя задача: Мне надо создать программу на С++ желательно в билдере, которая формирует матрицы (3-х видов - простые,симметричные,разреженные) генератором случайных чисел. Матрицы выводятся в файлы (для каждой матрицы свой файл).Пользователь вводит тип,порядок, колич-во матриц.
PM MAIL   Вверх
Dmi3ev
Дата 9.2.2009, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



поел, сил набрался и написал... smile 

сделал для каждой матрицы отдельные функции, чтобы было более понятно
1) простую задаю просто рандомно
2) симметричную задаю так, элементы выше главной диагонали задаю, а остальные копирую... a[i][j]=a[j][i]
3) задаю так, если функция myo() возвращает true, то элемент равен 0, в противном случае элемент задается рандомно... (не стал особо разбираться в нюансах, задал так, возможно, это немного ошибочно)

Код

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

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

//---------------------------------------------------------------------------
char* Rus(char *s)
{
char *res=new char[strlen(s)+1];
CharToOem(s, res);
return res;
}
//---------------------------------------------------------------------------
void myfunc1()
{
int **matrix;
int n,k;

cout<<Rus("Введите порядок:")<<endl;
cin>>n;
cout<<Rus("Введите количество матриц:")<<endl;
cin>>k;

matrix=new int*[n];
for (int j=0; j<n; j++)
 matrix[j]=new int[n];

randomize ();
for (int fk=0; fk<k; fk++)
 {
  for (int i=0; i<n; i++)
   for (int j=0; j<n; j++)
    *(*(matrix+j)+i)=random(100)-50;
  AnsiString path="D:\\File"+IntToStr(fk+1)+".txt";
  cout<<path.c_str()<<endl;
  ofstream fo;
  fo.open(path.c_str());
  for (int i=0; i<n; i++)
   {
    for (int j=0; j<n; j++)
     fo<<*(*(matrix+j)+i)<<"; ";
    fo<<endl;
   }
 }
cout<<Rus("Создано ")<<k<<Rus(" матриц ")<<n<<"x"<<n<<endl;
cout<<endl;
fo.close();
}
//---------------------------------------------------------------------------
void myfunc2()
{
int **matrix;
int n,k;

cout<<Rus("Введите порядок:")<<endl;
cin>>n;
cout<<Rus("Введите количество матриц:")<<endl;
cin>>k;

matrix=new int*[n];
for (int j=0; j<n; j++)
 matrix[j]=new int[n];

randomize ();
for (int fk=0; fk<k; fk++)
 {
  for (int i=0; i<n; i++)
   for (int j=0; j<n; j++)
    if (i<=j)
     *(*(matrix+j)+i)=random(100)-50;
    else
     *(*(matrix+j)+i)=*(*(matrix+i)+j);
  AnsiString path="D:\\File"+IntToStr(fk+1)+".txt";
  cout<<path.c_str()<<endl;
  ofstream fo;
  fo.open(path.c_str());
  for (int i=0; i<n; i++)
   {
    for (int j=0; j<n; j++)
     fo<<*(*(matrix+j)+i)<<"; ";
    fo<<endl;
   }
 }
cout<<Rus("Создано ")<<k<<Rus(" матриц ")<<n<<"x"<<n<<endl;
cout<<endl;
fo.close();
}
//---------------------------------------------------------------------------
bool myo()
 {
  return (random(2));
 }
//---------------------------------------------------------------------------
void myfunc3()
{
int **matrix;
int n,k;

cout<<Rus("Введите порядок:")<<endl;
cin>>n;
cout<<Rus("Введите количество матриц:")<<endl;
cin>>k;

matrix=new int*[n];
for (int j=0; j<n; j++)
 matrix[j]=new int[n];

randomize ();
for (int fk=0; fk<k; fk++)
 {
  for (int i=0; i<n; i++)
   for (int j=0; j<n; j++)
     if (myo())
      {
       *(*(matrix+j)+i)=0;
      }
     else
      {
       *(*(matrix+j)+i)=random(100)-50;
      }
  AnsiString path="D:\\File"+IntToStr(fk+1)+".txt";
  cout<<path.c_str()<<endl;
  ofstream fo;
  fo.open(path.c_str());
  for (int i=0; i<n; i++)
   {
    for (int j=0; j<n; j++)
     fo<<*(*(matrix+j)+i)<<"; ";
    fo<<endl;
   }
 }
cout<<Rus("Создано ")<<k<<Rus(" матриц ")<<n<<"x"<<n<<endl;
cout<<endl;
fo.close();
}
//---------------------------------------------------------------------------
int main()
{
char c;
while (c!='e')
 {
        cout<<Rus("Выбирайте:")<<endl;
        cout<<Rus("1-Простая")<<endl;
        cout<<Rus("2-Симметричная")<<endl;
        cout<<Rus("3-Разреженная")<<endl;
        cin>>c;
        switch (c)
        {
                case '1':  myfunc1(); break;
                case '2':  myfunc2(); break;
                case '3':  myfunc3(); break;
        }
 }
        return 0;
}
//---------------------------------------------------------------------------
 

по крайней мере здесь есть логика... сразу понятно, что да как
результаты сохраняются на D:\ . Там увидишь, имена файлов выводятся...
Удачи. Разобраться несложно функции похожи, это специально, чтобы тебе ясно что-нибудь стало. Только матрицы задаются по-разному...
еще раз c++ BUilder, то я AnsiString поюзал при составлении имени файла для прикола и CharToOem для отображения русских букв (можно сделать перегрузку а не функции Rus как у меня...) Но это уже все так... по мелочам...
для выхода нужно нажать e английскую)))

Это сообщение отредактировал(а) Dmi3ev - 9.2.2009, 22:55


--------------------

PM MAIL   Вверх
allsolovey
Дата 9.2.2009, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Empty



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 3.1.2008

Репутация: нет
Всего: нет



Во-первых,Спасиба агромнае за помощь.Сначала не компилировал - писалась ошибка
 
[C++ Error] Unit1.cpp(43): E2451 Undefined symbol 'fo'
[C++ Error] Unit1.cpp(79): E2451 Undefined symbol 'fo'
[C++ Error] Unit1.cpp(124): E2451 Undefined symbol 'fo'

Я закомментировал три раза //fo.close();Так все работает.
Забыл в задаче написать чтоб на экран выводились матрицы.
И еще )) хотел поменять int matrix на float и random(100)-50)/100, чтобы дробные числа были ,выводит нулевую матрицу.
PM MAIL   Вверх
Dmi3ev
Дата 10.2.2009, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Цитата

[C++ Error] Unit1.cpp(124): E2451 Undefined symbol 'fo'

Цитата

Забыл в задаче написать чтоб на экран выводились матрицы.

вот
это да, я просто тут писал, так что не проверял особо, надо вот так...
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream.h>
#include <fstream.h>
//---------------------------------------------------------------------------
char* Rus(char *s)
{
char *res=new char[strlen(s)+1];
CharToOem(s, res);
return res;
}
//---------------------------------------------------------------------------
void myfunc1()
{
int **matrix;
int n,k;
cout<<Rus("Введите порядок:")<<endl;
cin>>n;
cout<<Rus("Введите количество матриц:")<<endl;
cin>>k;
matrix=new int*[n];
for (int j=0; j<n; j++)
 matrix[j]=new int[n];
randomize ();
for (int fk=0; fk<k; fk++)
 {
  for (int i=0; i<n; i++)
   for (int j=0; j<n; j++)
    *(*(matrix+j)+i)=random(100)-50;
  AnsiString path="D:\\File"+IntToStr(fk+1)+".txt";
  cout<<path.c_str()<<endl;
  ofstream fo;
  fo.open(path.c_str());
  for (int i=0; i<n; i++)
   {
    for (int j=0; j<n; j++)
     fo<<*(*(matrix+j)+i)<<"; ";
    fo<<endl;
   }
      cout<<fk+1<<endl;
     for (int i=0; i<n; i++)
   {
    for (int j=0; j<n; j++)
     cout<<*(*(matrix+j)+i)<<"; ";
    cout<<endl;
   }
   fo.close();
 }
cout<<Rus("Создано ")<<k<<Rus(" матриц ")<<n<<"x"<<n<<endl;
cout<<endl;
}
//---------------------------------------------------------------------------
void myfunc2()
{
int **matrix;
int n,k;
cout<<Rus("Введите порядок:")<<endl;
cin>>n;
cout<<Rus("Введите количество матриц:")<<endl;
cin>>k;
matrix=new int*[n];
for (int j=0; j<n; j++)
 matrix[j]=new int[n];
randomize ();
for (int fk=0; fk<k; fk++)
 {
  for (int i=0; i<n; i++)
   for (int j=0; j<n; j++)
    if (i<=j)
     *(*(matrix+j)+i)=random(100)-50;
    else
     *(*(matrix+j)+i)=*(*(matrix+i)+j);
  AnsiString path="D:\\File"+IntToStr(fk+1)+".txt";
  cout<<path.c_str()<<endl;
  ofstream fo;
  fo.open(path.c_str());
  for (int i=0; i<n; i++)
   {
    for (int j=0; j<n; j++)
     fo<<*(*(matrix+j)+i)<<"; ";
    fo<<endl;
   }
      cout<<fk+1<<endl;
     for (int i=0; i<n; i++)
   {
    for (int j=0; j<n; j++)
     cout<<*(*(matrix+j)+i)<<"; ";
    cout<<endl;
   }
   fo.close();
 }
cout<<Rus("Создано ")<<k<<Rus(" матриц ")<<n<<"x"<<n<<endl;
cout<<endl;
}
//---------------------------------------------------------------------------
bool myo()
 {
  return (random(2));
 }
//---------------------------------------------------------------------------
void myfunc3()
{
int **matrix;
int n,k;
cout<<Rus("Введите порядок:")<<endl;
cin>>n;
cout<<Rus("Введите количество матриц:")<<endl;
cin>>k;
matrix=new int*[n];
for (int j=0; j<n; j++)
 matrix[j]=new int[n];
randomize ();
for (int fk=0; fk<k; fk++)
 {
  for (int i=0; i<n; i++)
   for (int j=0; j<n; j++)
     if (myo())
      {
       *(*(matrix+j)+i)=0;
      }
     else
      {
       *(*(matrix+j)+i)=random(100)-50;
      }
  AnsiString path="D:\\File"+IntToStr(fk+1)+".txt";
  cout<<path.c_str()<<endl;
  ofstream fo;
  fo.open(path.c_str());
  for (int i=0; i<n; i++)
   {
    for (int j=0; j<n; j++)
     fo<<*(*(matrix+j)+i)<<"; ";
    fo<<endl;
   }
   cout<<fk+1<<endl;
     for (int i=0; i<n; i++)
   {
    for (int j=0; j<n; j++)
     cout<<*(*(matrix+j)+i)<<"; ";
    cout<<endl;
   }
   fo.close();
 }
cout<<Rus("Создано ")<<k<<Rus(" матриц ")<<n<<"x"<<n<<endl;
cout<<endl;
}
//---------------------------------------------------------------------------
int main()
{
char c;
while (c!='e')
 {
        cout<<Rus("Выбирайте:")<<endl;
        cout<<Rus("1-Простая")<<endl;
        cout<<Rus("2-Симметричная")<<endl;
        cout<<Rus("3-Разреженная")<<endl;
        cin>>c;
        switch (c)
        {
                case '1':  myfunc1(); break;
                case '2':  myfunc2(); break;
                case '3':  myfunc3(); break;
        }
 }
        return 0;
}
//---------------------------------------------------------------------------

Цитата

И еще )) хотел поменять int matrix на float и random(100)-50)/100, чтобы дробные числа были ,выводит нулевую матрицу. 

вроде работать должно, проверь, просто я тут исправлял)))

я надеюсь, что не даун и справишься с этой задачей)))



--------------------

PM MAIL   Вверх
allsolovey
Дата 10.2.2009, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Empty



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 3.1.2008

Репутация: нет
Всего: нет



Все доделал!!! Правда пришлось поискать  немного rand() для float.  smile 
PM MAIL   Вверх
Dmi3ev
Дата 10.2.2009, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Мои поздравления  smile

Добавлено через 4 минуты и 43 секунды
Цитата

Правда пришлось поискать  немного rand() для float. 

Уже неплохо. Маленький вклад в программу. Желаю успехов! Просто код, который у тебя был слишком беспорядочный, я даже не пожалел времени, чтобы написать нормальный и даже понятный код, если немного посидишь, разберешься.


--------------------

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.