Дано задание: разработать функцию int is_tridiagonal (int *mat,int n); mat – это квадратная матрица размером nxn. Функция должна вернуть 1, если mat – трехдиагональная матрица, и 0 в противном случае.
Трехдиагональная матрица(везде кроме "трех главных" диагоналей стоят 0)
Выполнил задачу элементарным методом, с помощью цикла перебора элементов i-ых - строк, j - столбцов
Но нужно как-то обойтись без этих i,j и решить задачу с помощью указателей
В общем, стоит преобразовать мои циклы примерно на вот такие, не понимаю как это сделать
int *p; ... for (p = &a[0][0]; p <= &a[NUM_ROWS-1][NUM_COLS-1]; p++)
#include <stdio.h>
#define cols 6
void user_matrix(int matrix[cols][cols]);
void matrix_outp(int matrix[cols][cols]);
int is_tridiagonal(int matrix[cols][cols]);
int main() {
int matrix[cols][cols];
user_matrix(matrix);
matrix_outp(matrix);
printf("%d", is_tridiagonal(matrix));
}
void user_matrix(int matrix[cols][cols]) {
for (int i = 0; i < cols; i++) {
for (int j = 0; j < cols; j++) {
printf("Enter matrix[%d][%d]: ", i + 1, j + 1);
scanf_s("%d", &matrix[i][j]);
}
printf("\n");
}
}
void matrix_outp(int matrix[cols][cols])
{
for (int i = 0; i < cols; i++)
{
for (int j = 0; j < cols; j++)
{
printf("%6d", matrix[i][j]);
}
printf("\n");
}
}
// перебор элементов матрицы и проверка на 0
int is_tridiagonal(int matrix[cols][cols]) {
int schet = 0;
// выше главной и следующей после нее
for (int i = 0; i < cols - 1; i++)
{
for (int j = i + 2; j < cols; j++) {
if (matrix[i][j] != 0)
schet++;
}
}
// ниже главной и следующей после нее
for (int i = 1; i < cols; i++)
{
for (int j = 0; j < i - 1; j++)
{
if (matrix[i][j] != 0)
schet++;
}
}
// 3 главные по центру
for (int i = 0; i < cols; i++) {
for (int j = 0; j < cols; j++) {
if (i == j || i == (j - 1) || i == (j + 1)) {
if (matrix[i][j] == 0) {
schet++;
}
}
}
}
if (schet == 0)
printf("Trexdiagonal");
else
printf("NETrexdiagonal");
}
int a[]размеромn * n. В таком случае i,j-ий (i -- индекс строки) элемент матрицы может быть представлен какa[i * n + j]/ У вас наверное винда и M$ компайлер и он не понимает код в ответе) – avp May 29 '22 at 13:11clang main.c -o main -arch arm64 -O3 -Wall -std=c18под свой MacBook на M1. – Be3y4uu_K0T May 29 '22 at 13:22(int size, int matrix[size][size])на(int matrix[N][N]). НО не забудьте заменить вездеsizeнаNв коде. – Be3y4uu_K0T May 29 '22 at 13:28is_tridiagonal(int size, int* p)и ссылаться на элементы как написал @avp. Вычисления идут с абсолютными числами, а надо вычислять относительноN. Иначе если изменить значениеN- алгоритм ломаетсяif (*pointer != 0 || *(pointer + 1) != 0. – DmitryK May 30 '22 at 12:11is_tridiagonal(N, matrix). – DmitryK May 31 '22 at 08:49is_tridiagonal(int size, int* p)p - указатель, как Вы хотите проверять вышел ли указатель за границы?.. (Ещё раз Вас прошу, сделайте своё решение и предложите его) – Be3y4uu_K0T May 31 '22 at 08:58