Консультация # 188450: Доброго времени суток всем! У меня возник вопрос по такой задаче: Дан массив A размера N. Не изменяя данный массив, вывести индексы его элементов в том порядке, в котором соответствующие им элементы образуют возрастающую последовательность. Использовать метод «пузырьковой» сортировки. Совет. Создайте вспомогательный целочисленный масс...Консультация # 188452: Доброго времени суток! Уважаемые эксперты! У меня возникла проблема с написанием программы. Условие: Дана матрица размера M × N. Найти номер ее столбца с наименьшим произведением элементов и вывести данный номер, а также значение наименьшего произведения. Заранее спасибо!...Консультация # 188453: Здравствуйте, уважаемые эксперты! Пожалуйста, помогите исправить ошибку в программе. Условие: Дана матрица размера M × N. После последнего столбца, содержащего только отрицательные элементы, вставить столбец из нулей. Если требуемых столбцов нет, то вывести матрицу без изменений....
Доброго времени суток всем! У меня возник вопрос по такой задаче:
Дан массив A размера N. Не изменяя данный массив, вывести индексы его элементов в том порядке, в котором соответствующие им элементы образуют возрастающую последовательность. Использовать метод «пузырьковой» сортировки. Совет. Создайте вспомогательный целочисленный массив индексов I, заполнив его числами от 0 до N-1. Сравнивая пары элементов массива A, меняйте местами элементы массива I, если левый элемент пары больше
правого.
Буду очень признательна за помощь! Если понадобиться, могу прикрепить свой вариант задачи. Может быть кто-нибудь обнаружит незамеченную мной ошибку
Здравствуйте, Klaus! Даю Вам свой вариант, посмотрите, как она работает.
Код :
/*
Дан массив A размера N. Не изменяя данный массив,
вывести индексы его элементов в том порядке,
в котором соответствующие им элементы образуют
возрастающую последовательность.
Использовать метод «пузырьковой» сортировки.
Совет. Создайте вспомогательный целочисленный массив индексов I,
заполнив его числами от 0 до N-1. Сравнивая пары элементов массива A,
меняйте местами элементы массива I, если левый элемент пары больше правого.
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#include <malloc.h> //для работы с кучей
#include <conio.h> //для _getch()
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int N;
printf("Введите размер массива:");
scanf("%d", &N);
int i, j, e;
//Раз N вводится, то массивы будем строить динамически, в куче
int *A = (int*)malloc(N*sizeof(int));
int *idx = (int*)malloc(N*sizeof(int));
//инициализация последовательности псевдослучайных чсел
srand((unsigned)time(NULL));
for(i=0; i<N; i++)
{
idx[i] = i; //индексы вначале равны вводимому порядку
A[i] = rand()%100; //псевдослучайные числа [0,99]
printf("%d ", A[i]); //выведем исходный массив
}
printf("\n"); //на новую строку
//сортировка "пузырьком"
for(i=0; i<N-1; i++)
{
for(j=i+1; j<N; j++)
{
if(A[idx[i]]>A[idx[j]])
{
e = idx[i]; //меняем местами элементы массива индексов
idx[i] = idx[j];
idx[j] = e;
}
}
}
for(i=0; i<N; i++) //выведем индексы отсортированноо массива
{
printf("%d ", idx[i]);
}
printf("\n");
for(i=0; i<N; i++) //значения отсортированного массива
{
printf("%d ", A[idx[i]]);
}
printf("\n");
free(A); //освобождаем память
free(idx);
_getch(); //ждем нажатия, чтобы окно программы "не пропало"
return 0;
}
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 20.12.2015, 15:45
Доброго времени суток! Уважаемые эксперты! У меня возникла проблема с написанием программы. Условие: Дана матрица размера M × N. Найти номер ее столбца с наименьшим произведением элементов и вывести данный номер, а также значение наименьшего произведения. Заранее спасибо!
/*
Дана матрица размера M х N.
Найти номер ее столбца с наименьшим произведением элементов
и вывести данный номер, а также значение наименьшего произведения
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#include <malloc.h>
#include <conio.h>
//функция нахождения произведения столбца col матрицы matrix[rows,cols]
int mul(int *matrix, int col, int rows, int cols)
{
int i;
int p=1; // произведение
for(i=0; i<rows; i++) // по строкам
p *= matrix[i*cols+col];
return p;
}
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i,j,m,n;
printf("Введите количество строк в матрице : ");
scanf("%d",&m);
printf("Введите количество столбцов в матрице : ");
scanf("%d",&n);
if (m<=0 || n<=0)
{
printf("Были указаны неправильные значения\n");
system("pause");
return 0;
}
srand(time(NULL)); //инициируем генератор псевдослучайных чисел
//так как m и n вводятся, то матрицу строим динамически в куче
// причем строим как одномерный массив. Доступ к элеменам по формуле
// A[row*colmax+col]
int *A = (int*)malloc(m*n*sizeof(int));
//Заполнение массива случайными числами
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
A[i*n+j] = rand()%10 + 1; //числа возьмем не очень большими, чтобы умножение "не зашкалило"
printf("%3d ", A[i*n+j]); // +1, чтобы убрать 0
}
printf("\n");
}
int jmin = 0;
int p;
int pmin = mul(A, 0, m, n); //произведение первого (0-го) столбца считаем минимальным
for (j=1; j<n; j++) //по всем остальным столбцам
{
p = mul(A, j, m, n); //считаем произведение
if (p<pmin) //ищем минимальное произведение
{
pmin = p;
jmin = j;
}
}
printf("Минимальное произведение: %d", pmin);
printf("\nНомер столбца: %d\n", jmin+1); //+1, чтобы нумеровать с 1
system("pause");
free(A); //освобождаем память
return 0;
}
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 20.12.2015, 17:11
5
нет комментария ----- Дата оценки: 20.12.2015, 22:15
Здравствуйте, уважаемые эксперты! Пожалуйста, помогите исправить ошибку в программе. Условие: Дана матрица размера M × N. После последнего столбца, содержащего только отрицательные элементы, вставить столбец из нулей. Если требуемых столбцов нет, то вывести матрицу без изменений.
Здравствуйте, fridge! Вот и программа. Ручной ввод данных заменил на генерацию псевдослучайных чисел. Для данной задачи матрицу удобнее хранить в виде именно матрицы, а не сплошного вектора
Код :
/*
Дана матрица размера 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;
}
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 21.12.2015, 12:26
5
нет комментария ----- Дата оценки: 22.12.2015, 07:38
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!