Форум: Форум C++Разное
Новые темы: 00
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Создать из двумерного массива, одномерный массив отрицательных значений
 
 автор: ale   (11.12.2007 в 12:37)   письмо автору
 
 

Помогите пожалуйста решить задачу:
Задан двумеpный массив А из N стpок и М столбцов. Сфоpмиpовать одномеpный массив В из отpицательных элементов массива А, выполнить соpтиpовку массива В в поpядке неубывания.

Вот текст проги:

#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int j,N,M;
int **A;
int counter=0;
int *B;
cout<<"Enter N\n";
cin>>N;
cout<<"Enter M\n";
cin>>M;

for(int i=0;i<N;i++)for(int j=0;j<M;j++)
{
cin>>A[j][i];
cout<< "\n";}

B=new int[counter];
counter=0;
for( i=0;i<N;i++)for( j=0;j<M;j++)if(A[j][i]<0)
{
B[counter] =A[j][i];counter++; }
for(i=0;i<counter;i++)
for(int j=0;j<counter-1;j++)
if(B[j]>B[j+1])
{
int tmp;tmp=B[j];B[j]=B[j+1];B[j+1]=tmp;
}

return 0;
}
Помогите найти ошибку. Или напишите свое решение,только с комментариями.

  Ответить  
 
 автор: cheops   (11.12.2007 в 13:00)   письмо автору
 
   для: ale   (11.12.2007 в 12:37)
 

Вы не выделяете память под массив, объявление int **A; создаёт указатель, который указывает на произвольный адрес памяти в компьютере - сразу за этим адресом может быть всё что угодно - кусок памяти браузера, фотошопа, операционной системы и когда вы в неё начинаете записывать свои данные - операционная система ругается. Если бы такой код был в драйвере - немедленно появился бы синий экран смерти.
Чтобы указатель стал массивом, под него необходимо выделить память при помощи оператора new [], а потом удалить при помощи оператора delete[].

  Ответить  
 
 автор: ale   (13.12.2007 в 07:25)   письмо автору
 
   для: cheops   (11.12.2007 в 13:00)
 

как вообще текст программы будет выглядеть? Мне еще нужно чтобы программа выделяла цветом преобразованные строки.

  Ответить  
 
 автор: cheops   (13.12.2007 в 07:44)   письмо автору
 
   для: ale   (13.12.2007 в 07:25)
 

Ммм... цветом в командной строке? Может тогда проще использовать графический интерфейс?

  Ответить  
 
 автор: ale   (13.12.2007 в 10:49)   письмо автору
 
   для: cheops   (13.12.2007 в 07:44)
 

как без цвета будет? С цветом потом разберусь м.б.

  Ответить  
 
 автор: cheops   (13.12.2007 в 12:06)   письмо автору
 
   для: ale   (11.12.2007 в 12:37)
 

Можно отталкиваться от следующей модификации программы
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
  int j,N,M;
  int *A;
  int counter = 0;
  int *B;
  cout << "Enter N\n";
  cin >> N;
  cout << "Enter M\n";
  cin >> M;

  try
  {
    // Выделяем память под массив *A
    A = new int[N*M];
    counter = 0;
    for(int i = 0; i < N; i++)
    for(int j = 0; j < M; j++)
    {
      cin >> A[j*M + i];
      if(A[j*M + i] < 0) counter++;
    } 
  
    // Выделяем память под массив B
    B = new int[counter];

    // Заполняем массив B 
    counter = 0;
    for(int i = 0; i < N; i++)
    for(int j = 0; j < M; j++)
    {
      if(A[j*M + i] < 0)
      {
        B[counter] = A[j*M + i];
        counter++; 
      }
    }

    // Сортируем массив В
    int tmp;
    for(int i = 0; i < counter; i++)
    for(int j = 0; j < counter-1; j++) 
    {
      if(B[j]>B[j+1])
      {
        tmp = B[j];
        B[j] = B[j+1];
        B[j+1] = tmp;
      }
    }

    // Выводим массив B
    for(int i = 0; i < counter; i++)
    {
      cout << B[i] << ' ';
    }

    // Освобождаем память
    delete [] A;
    delete [] B;
  }
  catch(bad_alloc exp)
  {
    cout << "Не удалось выделить память\n";
    return 1;
  }

return 0;
}

  Ответить  
 
 автор: ale   (14.12.2007 в 12:29)   письмо автору
 
   для: cheops   (13.12.2007 в 12:06)
 

Что сделать,чтобы массив на экран выводился? У меня не выводит на экран. Работаю в VS 06

  Ответить  
 
 автор: cheops   (14.12.2007 в 12:40)   письмо автору
 
   для: ale   (14.12.2007 в 12:29)
 

Вы проект как создаёте? Он консольный?

  Ответить  
 
 автор: ale   (14.12.2007 в 12:51)   письмо автору
 
   для: cheops   (14.12.2007 в 12:40)
 

Консольный

  Ответить  
 
 автор: cheops   (14.12.2007 в 15:37)   письмо автору
 
   для: ale   (14.12.2007 в 12:51)
 

Очень странно, а строки "Enter N" и "Enter M" тоже не выводит?

  Ответить  
 
 автор: ale   (14.12.2007 в 12:49)   письмо автору
 
   для: cheops   (13.12.2007 в 12:06)
 

Что делает строка catch(bad_alloc exp)
зачем она?

  Ответить  
 
 автор: cheops   (14.12.2007 в 15:36)   письмо автору
 
   для: ale   (14.12.2007 в 12:49)
 

Она отлавливает исключения, которые возникают при выделении памяти при помощи оператора new.

  Ответить  
 
 автор: ale   (15.12.2007 в 05:12)   письмо автору
 
   для: cheops   (14.12.2007 в 15:36)
 

выводит Enter N и Enter M.

  Ответить  
 
 автор: cheops   (15.12.2007 в 05:35)   письмо автору
 
   для: ale   (15.12.2007 в 05:12)
 

А после того, как вы вводите все данные не выводится ничего? Или выскакивает сообщение об ошибке?

  Ответить  
 
 автор: ale   (15.12.2007 в 12:47)   письмо автору
 
   для: cheops   (15.12.2007 в 05:35)
 

не выводится ничего

  Ответить  
 
 автор: cheops   (16.12.2007 в 05:50)   письмо автору
 
   для: ale   (15.12.2007 в 12:47)
 

Вы какой размер матрицы вводите и сколько цифр вводите потом?

  Ответить  
 
 автор: ale   (16.12.2007 в 08:11)   письмо автору
 
   для: cheops   (16.12.2007 в 05:50)
 

Предположим
N=4
M=6

  Ответить  
 
 автор: cheops   (16.12.2007 в 10:29)   письмо автору
 
   для: ale   (16.12.2007 в 08:11)
 

А потом вводите 24 числа?
Попробуйте ввести N = 1 и M = 1, а после ввести одно число 1. Что-нибудь выводится?

  Ответить  
 
 автор: ale   (16.12.2007 в 12:17)   письмо автору
 
   для: cheops   (16.12.2007 в 10:29)
 

ничего .Интересно где он зависает?

  Ответить  
 
 автор: ale   (18.12.2007 в 10:51)   письмо автору
 
   для: ale   (16.12.2007 в 12:17)
 

Сейчас друггая проблема. Вот текст проги:

#include "stdafx.h"
#include <ctime>
#include "conio.h"
#include <windows.h>
#include <iostream>
using namespace std;
HANDLE hStdout;
int main(int argc, char* argv[])
{
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
srand(time(0));
int j,k,N,M;
int *A;
int n=0;
int *B;
cout << "Enter integer N>0 \n";
cin >> N;
if(N<=0)
{
cout<<"Error.\n";
getch();
return 0;
}

cout << "Enter integer M>0 \n";
cin >> M;
if (M<=0)
{
cout<<"Error.\n";
getch();
return 0; }


SetConsoleTextAttribute(hStdout,FOREGROUND_RED);

{ A = new int[N*M];

n= 0;
for(int i = 0; i < N; i++)
for(int j = 0; j < M; j++)
{

{
k=rand()%2;
if (k==1)
{
A[j*M+i]==rand()%100;
}
else
{
A[i*M+j]==-rand()%100;
}
cout<<'\t'<<A[j*M + i];
if(A[j*M + i] < 0) n++;
}
printf("\n");
}SetConsoleTextAttribute(hStdout,FOREGROUND_GREEN );
printf("\n");

B = new int[n];


n = 0;
for( i = 0; i < N; i++)
for( j = 0; j < M; j++)
{
if(A[j*M + i] < 0)
{
B[n] = A[j*M+i];
n ++;
}
}


int tmp;
for(i = 0; i < n; i++)
for( j = 0; j < n-1; j++)
{
if(B[j]>B[j+1])
{
tmp = B[j];
B[j] = B[j+1];
B[j+1] = tmp;
}
}


for( i = 0; i <n; i++)
{
cout << B[i] << ' ';
/*printf("%d ",B[i]);*/
}

}
getch();
return 0;
}
Массив выводит какие-то странные числа. Неправильно работает.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования