2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Создание матриц генератором сл. чисел, проблема со switch
Сообщение09.02.2009, 21:05 
у меня такая проблема.В консольном приложении на с++ все работает нормально если не добавлять 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;
}
//---------------------------------------------------------------------------

 
 
 
 
Сообщение09.02.2009, 22:33 
allsolovey в сообщении #185194 писал(а):
int **Matrix = new int*[NX];
switch (var) {
case 1:
{
cout<< rus("Введите порядок:");
cin>>NX;


Тут у вас явно неправильно. Вы создаете матрицу порядка NX, а
затем только инициализируете переменную NX. Этот фрагмент
кода смысла явно не имеет. Дальше не смотрел...

Добавлено спустя 5 минут 32 секунды:

А потом еще увеличиваете это значение, вот здесь:
allsolovey в сообщении #185194 писал(а):
NY=NX;
cout<<endl;
NY++;
NX++;


После чего спокойно делаете вот так:
[quote="allsolovey в

сообщении #185194"] for( int z = 0; z<NX; z++ )
Matrix[z] = new int[NY]; [/quote]

В общем как-то странно вы с массивами обращаетесь...

Добавлено спустя 14 минут 39 секунд:

В общем вы несколько раз используете один и тот же код, например,
когда создаете матрицу. Почему бы вам не создавать ее (причем резервируя
именно столько памяти сколько нужно) один раз до switch и потом заполнять внутри.

Вообще в таком виде программа не читабельна. Напишите функции,
которые заполняют матрицу и вызывайте их... Кроме того вы нигде
не освобождаете память выделенную под матрицу - это плохо...

 
 
 
 
Сообщение11.02.2009, 16:32 
Сделал все по функциям для каждой матрицы свою..Все заработало.Спасиба за совет

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group