Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2013, 15:15   #1
Юлия!
 
Регистрация: 09.12.2013
Сообщений: 7
По умолчанию Матрицы в Си

И снова не работает..где ошибки?
Нужно заменить все столбцы, содержащие минимальный элемент матрицы на столбец с максимальным номером, содержащий ее максимальный элемент
Код:

#include <stdio.h>
#include <limits.h>


int main()
{
	int maxS = 0; // столбец с максимальным элементом
	int ms[10] = {0}; // столбцы для замены

	int m[10][10] = {0}; // сама матрица
	int n = 0;

	int max = -INT_MAX; // максимальное значение
	int min = INT_MAX; // минимальное значение

	printf("Введите размер квадратной матрицы 2 <= n <= 10 :\n");
	scanf("%d", &n);

	if(n == 0 || n == 1) return 0;

	// Ввод матрицы по строкам
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			scanf("%d", &m[i][j]);
		}
	}

	printf("Ваша матрица: \n");

	// Вывод по строкам введенной матрицы
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			printf("%4d ", m[i][j]);
		}
		printf("\n");
	}

	// Поиск минимума и максимума
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			if(min > m[i][j])
			{
				min = m[i][j]; // минимум
			}

			if(max < m[i][j])
			{
				max = m[i][j]; // максимум
				maxS = j; // номер столбца с максимальным значением
			}
		}
	}
	printf("Минимальное значение: %d \n Максимальное значение: %d \n", min, max);
	printf("Номер столбца с максимальным значением: %d (отсчет от нуля)\n", maxS);

	// Поиск столбцов с минимальным значением (обход по столбцам)
	for (int j = 0; j < n; ++j)
	{
		for (int i = 0; i < n; ++i)
		{
			if(m[i][j] == min)
			{
				ms[j] = 1;
			}
		}
	}
	printf("Замены столбцов (<номер столбца> -> < 1 (заменяем) / 0 (не заменяем) >) \n");

	for (int j = 0; j < n; ++j)
	{
		printf("%d -> %d \n", j, ms[j]);
	}

	// Замена (обход по столбцам)
	for (int j = 0; j < n; ++j)
	{
		if(ms[j])
		for (int i = 0; i < n; ++i)
		{
			m[i][j] = m[i][maxS];		
		}
	}

	printf("Результат:\n");

	// Вывод по строкам введенной матрицы
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			printf("%4d ", m[i][j]);
		}
		printf("\n");
	}

	return 0;
}

Последний раз редактировалось Stilet; 16.12.2013 в 15:27.
Юлия! вне форума Ответить с цитированием
Старый 16.12.2013, 15:18   #2
Юлия!
 
Регистрация: 09.12.2013
Сообщений: 7
По умолчанию

Есть еще такой вариант, но библиотеку conio не видит, если убираю, то сразу ошибки. #include <conio.h>
Код:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

#define BUF_SIZE 1024

FILE *getFile();
int **getMatrix(FILE *file, int *n);

int main()
{
	FILE *file = getFile();
	int n;
	int **matrix = getMatrix(file, &n);
	fclose(file);
	int i, j;

	puts("\nMatrix BEFORE processing:");
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			printf("%10d", matrix[i][j]);
		}
		putchar('\n');
	}

	int minValue = matrix[0][0];
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			if (matrix[i][j] < minValue) {
				minValue = matrix[i][j];
			}
		}
	}

	bool *columnsWithMinValue = (bool *)malloc(n * sizeof(bool));
	for (j = 0; j < n; j++) {
		columnsWithMinValue[j] = false;
		for (i = 0; i < n && !columnsWithMinValue[j]; i++) {
			if (matrix[i][j] == minValue) {
				columnsWithMinValue[j] = true;
			}
		}
	}

	int maxValueRowIndex = 0;
	int maxValueColIndex = 0;
	for (j = 0; j < n; j++) {
		for (i = 0; i < n; i++) {
			if (matrix[i][j] >= matrix[maxValueRowIndex][maxValueColIndex]) {
				maxValueRowIndex = i;
				maxValueColIndex = j;
			}
		}
	}

	for (j = 0; j < n; j++) {
		if (columnsWithMinValue[j]) {
			for (i = 0; i < n; i++) {
				matrix[i][j] = matrix[i][maxValueColIndex];
			}
		}
	}

	puts("\nMatrix AFTER processing:");
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			printf("%10d", matrix[i][j]);
		}
		putchar('\n');
	}

	free(columnsWithMinValue);

	for (i = 0; i < n; i++) {
		free(matrix[i]);
	}
	free(matrix);

	printf("\n\nPress any key to exit...");
	fflush(stdin);
	getch();

	return 0;
}

FILE *getFile()
{
	char buffer[BUF_SIZE];
	FILE *file;

	do {
		printf("> Input name of file: ");
		gets(buffer);
		file = fopen(buffer, "r");
	}
	while (file == NULL);

	return file;
}

int **getMatrix(FILE *file, int *n)
{
	int count = 0;
	int value;

	while (fscanf(file, "%d", &value) != EOF) {
		++count;
	}

	*n = sqrt((double)count);

	rewind(file);

	int **matrix = (int **)malloc(*n * sizeof(int *));
	int i, j;
	for (i = 0; i < *n; i++) {
		matrix[i] = (int *)malloc(*n * sizeof(int));

		for (j = 0; j < *n; j++) {
			fscanf(file, "%d", &matrix[i][j]);
		}
	}

	return matrix;
}

Последний раз редактировалось Stilet; 16.12.2013 в 15:27.
Юлия! вне форума Ответить с цитированием
Старый 16.12.2013, 16:15   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

В 1-м варианте всё должно арбайтен.. Что у Вас не работает - я не знаю..
Кстати, у Вас чрезвычайно красивый код (правда, пару вещей я всё равно поправил))
Poma][a вне форума Ответить с цитированием
Старый 16.12.2013, 16:39   #4
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Раньше девушкам комплименты делали: "У вас чрезвычайно красивые глаза!" =)
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 17.12.2013, 01:37   #5
Юлия!
 
Регистрация: 09.12.2013
Сообщений: 7
По умолчанию

все работает! просто я идиот. первый код для новой версии, а я на кодблоксе проверяла. запускается только с ключем -std=c99
Юлия! вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перекодировать консолевкий код под оконное приложение в Билдер 6. Решаю матрицы Матрицы g.e.s Общие вопросы C/C++ 0 18.11.2012 20:21
В каждой строке матрицы А(n*n) найти наибольший и наименьший элементы матрицы и поменять их местами saha1994 Паскаль, Turbo Pascal, PascalABC.NET 2 15.05.2012 20:38
Первый элемент - размерность матрицы, остальные образуют строки этой матрицы Anastasiya_Pot Помощь студентам 2 10.04.2012 09:46
Язык СИ! Динамическое выделение памяти под массивы и матрицы, передача матрицы в функции Андрей! Общие вопросы C/C++ 33 31.01.2012 22:07
На главную диагональ матрицы поместить наибольшие элементы этой матрицы mivel Помощь студентам 2 23.12.2009 21:19