Привет ребята. Я заполняю матрицу а [10][2].
Она у меня выходит типа:
8 7
9 8
7 2
....
и я хочю делать проверку на дубликаты ряда, и если находится дубликат то он удаляется и остальные элементы которые под него переходят на его место.
for (i=0;i<10;i++)
{
scanf("%d",&a[i][0]);
scanf("%d",&a[i][1]);
}
Другие языки программирования и технологии
Дубликаты в СИ
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#define ROWS 15U
#define COLS 2U
void fill(int* row, const unsigned short n) {
size_t i = 0U;
do row[i] = 1 + rand() % n; while (++i < COLS);
}
void out(int* row) {
size_t i = 0U;
do printf("%3i", row[i]); while (++i < COLS);
putchar('\n');
}
_Bool eq(int* a, int* b) {
size_t i = 0U;
do if (a[i] != b[i]) return false; while (++i < COLS);
return true;
}
void swap(int* a, int* b) {
const int tmp = *a;
*a = *b;
*b = tmp;
}
int main(void) {
int matrix[ROWS][COLS];
size_t size = ROWS;
const unsigned short n = 4;
size_t i, j, k, m;
srand((unsigned)time(NULL));
for (i = 0U; i < size; ++i) fill(matrix[i], n);
for (i = 0U; i < size; ++i) out(matrix[i]);
putchar('\n');
for (i = 0U; i < size; ++i) {
for (j = i + 1; j < size; ++j) {
if (eq(matrix[i], matrix[j])) {
for (k = j + 1; k < size; ++k) {
for (m = 0; m < COLS; ++m) {
swap(&matrix[k][m], &matrix[k - 1][m]);
}
}
--j;
--size;
}
}
}
for (i = 0U; i < size; ++i) out(matrix[i]);
getchar();
return 0;
}
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#define ROWS 15U
#define COLS 2U
void fill(int* row, const unsigned short n) {
size_t i = 0U;
do row[i] = 1 + rand() % n; while (++i < COLS);
}
void out(int* row) {
size_t i = 0U;
do printf("%3i", row[i]); while (++i < COLS);
putchar('\n');
}
_Bool eq(int* a, int* b) {
size_t i = 0U;
do if (a[i] != b[i]) return false; while (++i < COLS);
return true;
}
void swap(int* a, int* b) {
const int tmp = *a;
*a = *b;
*b = tmp;
}
int main(void) {
int matrix[ROWS][COLS];
size_t size = ROWS;
const unsigned short n = 4;
size_t i, j, k, m;
srand((unsigned)time(NULL));
for (i = 0U; i < size; ++i) fill(matrix[i], n);
for (i = 0U; i < size; ++i) out(matrix[i]);
putchar('\n');
for (i = 0U; i < size; ++i) {
for (j = i + 1; j < size; ++j) {
if (eq(matrix[i], matrix[j])) {
for (k = j + 1; k < size; ++k) {
for (m = 0; m < COLS; ++m) {
swap(&matrix[k][m], &matrix[k - 1][m]);
}
}
--j;
--size;
}
}
}
for (i = 0U; i < size; ++i) out(matrix[i]);
getchar();
return 0;
}
Да фигня все. Если матрица пишется в цикле scanf(), то не нужно записывать дубликаты а потом героически их удалять) Сразу ищете дубликат и если он есть, на записываете строку. Вот так.
Нужен еще один массив куда вы будете записывать уже существующие ряды и каждый ряд массива надо сравнивать с массивом уже существующих рядов. Если такой есть то удалять (пометить на удаление путем заполнения нулями или записать индексы рядов на удаление в новый одномерный массив пот потом удалить со смешением) если нет то записывать в массив существуюших. В общем то что у вас 5% от программы
Ербол Болтаев
Можно просто при удалении дубликата перемещать оставшуюся часть этой строки или столбца матрицы к началу, записывая на освободившееся место в конце строки или столбца нуль.
Владимир Ефимов
А можно без функции, size_t и size_of. Заранее спасибо.
Владимир Ефимов
Ну а без функции?
при нахождении дубликата запускаешь цикл от i до N перекидываешь элементы, уменьшаешь N на 1 и продолжаешь исследование.
при нахождении дубликата запускаешь цикл от i до N перекидываешь элементы, уменьшаешь N на 1 и продолжаешь исследование.
Похожие вопросы
- Разница между Си и Си++
- Как из си++ сделать си?)... подробнее
- Какие преимущества сохранил Ассемблер к Си?
- Си или Си шарп (С#)???
- помоги с СИ++..
- Какой СИ. Какой СИ лучше? си плюс плюс или си шарп? что стоит учить в первую очередь?
- Как на языке программирования си сделать, чтобы при вводе полного бреда программа не поломалась?
- Реализация функций СИ
- Почему язык СИ такой сложный?
- Вопрос про компиляторов ЯП Си..