Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 3022
∙ повысить рейтинг »
CradleA
Статус: Специалист
Рейтинг: 357
∙ повысить рейтинг »
Асмик Гаряка
Статус: Советник
Рейтинг: 27
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1821
Дата выхода:24.12.2015, 12:21
Администратор рассылки:F®ost (Администратор)
Подписчиков / экспертов:16 / 13
Вопросов / ответов:3 / 3

Консультация # 188450: Доброго времени суток всем! У меня возник вопрос по такой задаче: Дан массив A размера N. Не изменяя данный массив, вывести индексы его элементов в том порядке, в котором соответствующие им элементы образуют возрастающую последовательность. Использовать метод «пузырьковой» сортировки. Совет. Создайте вспомогательный целочисленный масс...
Консультация # 188452: Доброго времени суток! Уважаемые эксперты! У меня возникла проблема с написанием программы. Условие: Дана матрица размера M × N. Найти номер ее столбца с наименьшим произведением элементов и вывести данный номер, а также значение наименьшего произведения. Заранее спасибо!...
Консультация # 188453 : Здравствуйте, уважаемые эксперты! Пожалуйста, помогите исправить ошибку в программе. Условие: Дана матрица размера M × N. После последнего столбца, содержащего только отрицательные элементы, вставить столбец из нулей. Если требуемых столбцов нет, то вывести матрицу без изменений....

Консультация # 188450:

Доброго времени суток всем! У меня возник вопрос по такой задаче:

Дан массив A размера N. Не изменяя данный массив, вывести индексы его элементов в том порядке, в котором соответствующие им элементы образуют возрастающую последовательность. Использовать метод «пузырьковой» сортировки. Совет. Создайте вспомогательный целочисленный массив индексов I, заполнив его числами от 0 до N-1. Сравнивая пары элементов массива A, меняйте местами элементы массива I, если левый элемент пары больше правого.

Буду очень признательна за помощь! Если понадобиться, могу прикрепить свой вариант задачи. Может быть кто-нибудь обнаружит незамеченную мной ошибку

Дата отправки: 18.12.2015, 19:07
Вопрос задал: Klaus (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, 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
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 188452:

Доброго времени суток! Уважаемые эксперты! У меня возникла проблема с написанием программы. Условие: Дана матрица размера M × N. Найти номер ее столбца с наименьшим произведением элементов и вывести данный номер, а также значение наименьшего произведения.
Заранее спасибо!

Дата отправки: 18.12.2015, 19:23
Вопрос задал: fridge (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, fridge!
Смотрите мой вариант.

Код :
/*
	Дана матрица размера 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

Рейтинг ответа:

НЕ одобряю +2 одобряю!

Консультация # 188453:

Здравствуйте, уважаемые эксперты! Пожалуйста, помогите исправить ошибку в программе. Условие:
Дана матрица размера M × N. После последнего столбца, содержащего только отрицательные элементы, вставить столбец из нулей. Если требуемых столбцов нет, то вывести матрицу без изменений.

Дата отправки: 18.12.2015, 19:39
Вопрос задал: fridge (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, 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

Рейтинг ответа:

НЕ одобряю +1 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное