Консультация № 188453
18.12.2015, 19:39
0.00 руб.
0 3 1
Здравствуйте, уважаемые эксперты! Пожалуйста, помогите исправить ошибку в программе. Условие:
Дана матрица размера M × N. После последнего столбца, содержащего только отрицательные элементы, вставить столбец из нулей. Если требуемых столбцов нет, то вывести матрицу без изменений.

Приложение:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

/**Дана матрица размера M x N.
После последнего столбца, содержащего только отрицательные элементы, вставить столбец из нулей.
Если требуемых столбцов нет, то вывести матрицу без изменений. */

int main()
{
void sdvig(int *p,int m,int n,int a);
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

int m,i,j,n,*p,a,k,o;

k=0;

printf("Введите количество строк М= ");
scanf("%d", &m);
printf("Введите количество столбцов N= ");
scanf("%d", &n);

o=n+1;
p=(int*)malloc (m*n*sizeof(int));
if (p==NULL) printf("ОШИБКА ВЫДЕЛЕНИЯ ПАМЯТИ!!!");


printf("Заполните матрицу размера M x N целыми числами\n\n");
for (i=0; i<m; i++)
for(j=0; j<n; j++)
scanf("%d",(p+i*m+j));


printf("\n\nИсходная матрица размера M x N\n\n");
for (i=0; i<m; i++)
{
for(j=0; j<n; j++)
printf("%4d ",*(p+i*m+j));
printf("\n\n");
}


for (i=0; i<m; i++)
if (*(p+i*m+n-1) < 0) k++;

if (k==m)
{
a=(m*n)+(m*1);
p=(int*)realloc(p,a*sizeof(int));
if (p==NULL) printf("ОШИБКА ВЫДЕЛЕНИЯ ПАМЯТИ!!!");
sdvig(p,m,n,a);
*(p+a-1)=0;
for(i=0;i<n-1;i++)
{
*(p+a-1-o)=0;
o*=2;
}
n++;
}


printf("\n\nИpзмененная матрица размера M x N\n\n");
for (i=0; i<a; i++)
{

printf("%4d ",*(p+i));

}


return 0;
}




void sdvig(int *p,int m,int n,int a)
{
int i,l,j,y;
y=0;
a--;
for(i=0;i<m-1;i++)
{
for (j=1,l=0;l<n;a--,l++)
*(p+a-i-j)=*(p+(m*n)-j-y-l);
y+=n;
}
}

Обсуждение

давно
Посетитель
7438
7205
20.12.2015, 17:16
общий
Адресаты:
Вставить, это значит добавить еще один столбец, т.е. из матрицы MxN сделать Mx(N+1).
Я правильно понял?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399277
11
20.12.2015, 22:35
общий
Адресаты:
Именно так.
давно
Посетитель
7438
7205
21.12.2015, 12:26
общий
это ответ
Здравствуйте, fridge!
Вот и программа.
Ручной ввод данных заменил на генерацию псевдослучайных чисел.
Для данной задачи матрицу удобнее хранить в виде именно матрицы, а не сплошного вектора
[code h=200]
/*
Дана матрица размера M x N.
После последнего столбца, содержащего только отрицательные элементы,
вставить столбец из нулей. Если требуемых столбцов нет,
то вывести матрицу без изменений.
*/

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <malloc.h> //для выделения памяти в куче
#include <time.h> //для инициализации герератора псевдослучайных чисел

int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

int i,j,k,m,n,count;

printf("Введите количество строк в матрице m:");
scanf("%d",&m);
printf("Введите количество столбцов в матрице n:");
scanf("%d",&n);

srand(time(NULL)); //инициализация герератора псевдослучайных чисел

int **A; //Т.к. m и n заранее неизвестны, будем строить массив динамически
//A - указатель на массив указателей,
//сначала построим массив указателей на строки,
// в которых будем хранить указатели на столбцы
A = (int**)malloc(m*sizeof(int*));
for(i=0;i<m;i++) //выделим память под столбцы для каждой строки
A[i] = (int*)malloc(n*sizeof(int));

//заполним матрицу случайными числами
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
A[i][j]=(rand()%100)-50; //отнимаем 50, чтобы получить и отрицательные,
//и положительные числа в диапазоне [-50,+49]
printf("%4d ",A[i][j]); //выведем элементы одной строки в одной строке
}
printf("\n"); //для следующей строки
}

//полностью орицательные столбцы будем искать, начиная с последнего
//первый найденный и будет последним отрицательным
for(j=n-1;j>=0;j--) //по столбцам, начиная с последнего
{
count=0; //счетчик отрицательных элементов в столбце
for(i=0;i<m;i++) //по строкам
count += (A[i][j] < 0); //складываем результат сравнения, а это будут или 0, или 1
//что нам и надо
if (count == m) //если все отрицательные, то счетчик будет равен количеству строк
{
n++; //увеличиваем число столбцов на 1
for(i=0;i<m;i++) //по всем строкам
{
A[i] = (int*)realloc(A[i],n*sizeof(int)); //увеличиваем каждую строку на один столбец
for(k=n-1;k>j+1;k--) //перемещаем все элементы за отрицательным
A[i][k] = A[i][k-1]; // столбцом на 1 вправо
A[i][k] = 0; //за отрицательным пишем 0
}
break; //работа сделана - выходим из цикла по столбцам
}
}
printf("\nРезультат:\n"); //выводим, что у нас получилось
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%4d ",A[i][j]);
}
printf("\n");
}
system("pause");
for(i=0;i<m;i++) //освободим память, запрошенную под матрицу
free (A[i]); //сначала столбцы
free (A); //затем и массив строк
return 0;
}
[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа