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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2014, 09:04   #1
Wysler
Пользователь
 
Регистрация: 30.10.2014
Сообщений: 14
По умолчанию Си. Удалить упорядоченные строки ниже побочной диагонали.

Вообще вот текст задания. Даны целочисленная квадратная матрица А порядка N (N - заданное натуральное число). Назовем строку особой, если все ее элементы, расположенные после побочной диагонали упорядочены по возрастанию. Удалить из матрицы А все особые строки. Вывести на экран измененное состояние матрицы А или сообщение, что значения матрицы А не удалялись.Подскажите с чего начать.
Wysler вне форума Ответить с цитированием
Старый 30.10.2014, 10:22   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

С поиска особых строк, не? Это ж простой цикл...
p51x вне форума Ответить с цитированием
Старый 30.10.2014, 16:45   #3
Wysler
Пользователь
 
Регистрация: 30.10.2014
Сообщений: 14
По умолчанию

Значит я слишком тупой, но для меня это непростой цикл. Возможно есть какая-то формула элементов ниже побочной диагонали по строкам или еще что-то.
Wysler вне форума Ответить с цитированием
Старый 30.10.2014, 19:27   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Возможно есть какая-то формула элементов ниже побочной диагонали по строкам или еще что-то.
Ага, вот она:
Цитата:
все ее элементы, расположенные после побочной диагонали упорядочены по возрастанию
Какое слово вам непонятно? Упорядочены? По возрастанию?
p51x вне форума Ответить с цитированием
Старый 30.10.2014, 20:32   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
для меня это непростой цикл.
Ну а ввод матрицы показать можешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.10.2014, 21:13   #6
Wysler
Пользователь
 
Регистрация: 30.10.2014
Сообщений: 14
По умолчанию

Как-то так
Код:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
 
int main(void)
{
        srand(time(NULL));
	const int N=5;//Порядок матрицы 
	int A[N][N]={0};
	int i,j;
	//Заполняем матрицу А случайными числами и выводим ее
	for(i=0;i<N;i++)
	{
		printf("\n\n");
		for(j=0;j<N;j++)
			{
				A[i][j]=rand()%100;
				printf("%3d ",A[i][j]);
			}
	}
	system("pause");

}
Wysler вне форума Ответить с цитированием
Старый 30.10.2014, 21:37   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ага. А теперь опиши функцию:
Код:
bool qesque(int i){
 int j;
 for(j=i+2;j<N;j++) if(A[i][j]<A[i][j-1]) return false;
 return true;
}
Вынеси массив А за main() чтоб сделать его глобальным для этой функции и в цикле проверяй:
Код:
 for(i=0;i<N;i++) if(qesque(i)){ значит i-тую строку можно выводить на экран}
Идея ясна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.10.2014, 22:44   #8
Wysler
Пользователь
 
Регистрация: 30.10.2014
Сообщений: 14
По умолчанию

Немного подумал с учетом того, что вы сказали и вот что получилось:
Код:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
const int N=5;//Порядок матрицы 
int A[N][N]={0};
 
bool qesque(int i)
{
	int j;
	for(j=N-i;j<N;j++) //Начинаем с элемента стоящего в данной строке i после побочной диагонали
		if(A[i][j]>A[i][j+1])//Если текущий больше следующего, то данная строка не является особой и ее нужно вывести 
			return true;    // значит возвращаем true
	return false;     //Иначе строка является особой и ее выводить не будем
}
int main(void)
{
        srand(time(NULL));
		int i,j;
	//Заполняем матрицу А случайными числами и выводим ее
	for(i=0;i<N;i++)
	{
		printf("\n\n");
		for(j=0;j<N;j++)
			{
				A[i][j]=rand()%10+1;
				printf("%3d ",A[i][j]);
			}
	}
	printf("\n\n\n\n");
	for(i=0;i<2;i++)//Т.к. в первых двух строках матрицы недостаточно элементов ниже побочной диагонали для сравнения, то выводим их без изменения
	{
		
			for(j=0;j<N;j++)
				printf("%3d ",A[i][j]);
			printf("\n\n");
	}
	int k;
	for(i=2;i<N;i++)
	{
		if(qesque(i)) for(k=0;k<N;k++) printf("%3d ",A[i][k]);//Если условие верно печатаем данную не особую строку
		printf("\n\n");
	}
	system("pause");

}
Но прога все равно печатает некоторые особые строки. Возможно дело в том, что в функции qesque мы можем выйти за границы двумерного массива и сравнить, например, элемент A[3][4] c элементом A[3][5], которого не существует при N=5.
Wysler вне форума Ответить с цитированием
Старый 30.10.2014, 23:06   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
которого не существует при N=5.
Именно поэтому я и написал: <A[i][j-1]
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.10.2014, 23:14   #10
Wysler
Пользователь
 
Регистрация: 30.10.2014
Сообщений: 14
По умолчанию

Изменил на
Код:
for(j=N-i+1;j<N;j++) 
           if(A[i][j]<A[i][j-1])
Теперь вроде работает как нужно. Спасибо большое за помощь)
Wysler вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В матрице размером NxM найти максимальный среди элементов, лежащих ниже побочной диагонали, и минимальный - среди лежащих выше Anatoly_ Visual C++ 1 13.12.2013 09:54
C#. Работа с элементами матрицы, лежащими ниже побочной диагонали alexamazzing Помощь студентам 2 19.09.2012 17:55
как описать в массиве элементы ниже побочной диагонали??? Виталий888 Помощь студентам 1 07.06.2011 23:09
[Pascal] найти сумму элементов лежащих ниже побочной диагонали Рамик Помощь студентам 12 28.03.2011 22:53
Найти наименьший отрицательный элемент выше побочной диагонали и наименьший положительный ниже (Pascal) Tifa Помощь студентам 10 28.01.2011 08:23