|
|
|
| Помогите пожалуйста решить задачу:
Задан двуме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;
}
Помогите найти ошибку. Или напишите свое решение,только с комментариями. | |
|
|
|
|
|
|
|
для: ale
(11.12.2007 в 12:37)
| | Вы не выделяете память под массив, объявление int **A; создаёт указатель, который указывает на произвольный адрес памяти в компьютере - сразу за этим адресом может быть всё что угодно - кусок памяти браузера, фотошопа, операционной системы и когда вы в неё начинаете записывать свои данные - операционная система ругается. Если бы такой код был в драйвере - немедленно появился бы синий экран смерти.
Чтобы указатель стал массивом, под него необходимо выделить память при помощи оператора new [], а потом удалить при помощи оператора delete[]. | |
|
|
|
|
|
|
|
для: cheops
(11.12.2007 в 13:00)
| | как вообще текст программы будет выглядеть? Мне еще нужно чтобы программа выделяла цветом преобразованные строки. | |
|
|
|
|
|
|
|
для: ale
(13.12.2007 в 07:25)
| | Ммм... цветом в командной строке? Может тогда проще использовать графический интерфейс? | |
|
|
|
|
|
|
|
для: cheops
(13.12.2007 в 07:44)
| | как без цвета будет? С цветом потом разберусь м.б. | |
|
|
|
|
|
|
|
для: 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;
} |
| |
|
|
|
|
|
|
|
для: cheops
(13.12.2007 в 12:06)
| | Что сделать,чтобы массив на экран выводился? У меня не выводит на экран. Работаю в VS 06 | |
|
|
|
|
|
|
|
для: ale
(14.12.2007 в 12:29)
| | Вы проект как создаёте? Он консольный? | |
|
|
|
|
|
|
|
для: cheops
(14.12.2007 в 12:40)
| | Консольный | |
|
|
|
|
|
|
|
для: ale
(14.12.2007 в 12:51)
| | Очень странно, а строки "Enter N" и "Enter M" тоже не выводит? | |
|
|
|
|
|
|
|
для: cheops
(13.12.2007 в 12:06)
| | Что делает строка catch(bad_alloc exp)
зачем она? | |
|
|
|
|
|
|
|
для: ale
(14.12.2007 в 12:49)
| | Она отлавливает исключения, которые возникают при выделении памяти при помощи оператора new. | |
|
|
|
|
|
|
|
для: cheops
(14.12.2007 в 15:36)
| | выводит Enter N и Enter M. | |
|
|
|
|
|
|
|
для: ale
(15.12.2007 в 05:12)
| | А после того, как вы вводите все данные не выводится ничего? Или выскакивает сообщение об ошибке? | |
|
|
|
|
|
|
|
для: cheops
(15.12.2007 в 05:35)
| | не выводится ничего | |
|
|
|
|
|
|
|
для: ale
(15.12.2007 в 12:47)
| | Вы какой размер матрицы вводите и сколько цифр вводите потом? | |
|
|
|
|
|
|
|
для: cheops
(16.12.2007 в 05:50)
| | Предположим
N=4
M=6 | |
|
|
|
|
|
|
|
для: ale
(16.12.2007 в 08:11)
| | А потом вводите 24 числа?
Попробуйте ввести N = 1 и M = 1, а после ввести одно число 1. Что-нибудь выводится? | |
|
|
|
|
|
|
|
для: cheops
(16.12.2007 в 10:29)
| | ничего .Интересно где он зависает? | |
|
|
|
|
|
|
|
для: 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;
}
Массив выводит какие-то странные числа. Неправильно работает. | |
|
|
|