2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Создание матриц генератором сл. чисел, проблема со switch
Сообщение09.02.2009, 21:05 


27/01/09
4
Ивановская область
у меня такая проблема.В консольном приложении на с++ все работает нормально если не добавлять 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 


11/07/06
201
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 


27/01/09
4
Ивановская область
Сделал все по функциям для каждой матрицы свою..Все заработало.Спасиба за совет

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group