Ir ao conteúdo
  • Cadastre-se

C Verificação de quadrado perfeito em Matriz


Posts recomendados

O MinGW/GCC permite o uso de arranjos/vetores de dimensão variável no código C++, funcionando como uma extensão a norma.

 

Se quiser fazer código 100% conforme a norma ISO para maximizar a portabilidade para outro compilador que seja conformante com a norma, pode usar a flag de compilação -Wpedantic (ou -pedantic) para gerar Warnings/Avisos de não-conformidade com a norma, ou então usar -pedantic-errors para que identifique as não-conformidades como erros, impedindo que compile o código. (Use em combinação com -std=c++11, -std=c++14, -std=c++17, -std=c++2a, ou etc, para indicar a norma a ser respeitada.)

 

Fazendo isso os arranjos/vetores de dimensão variáveis (VLA) serão identificados corretamente como algo anômalo a norma do C++ no GCC.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@isrnick Foi exatamente dessa linha que deu problema , cara eu sou iniciante em programação c , faz parte do meu curso da faculdade , tenho que usar o Visual Studio 2019 obrigatório pra fazer essa atividade , se fosse um quadrado 3x3 como ficaria o codigo?

 

 

 

 

 

 

 

 

  • Curtir 1
  • Confuso 1
Link para o comentário
Compartilhar em outros sites

Eu apontei que a única coisa que precisa modificar para funcionar são as dimensões da matriz e dos vetores, colocando números fixos nas dimensões, e só precisam ser grandes o suficiente, por exemplo matriz e vetores comprimento 100 em cada dimensão já seria mais do que grande o suficiente pois é improvável que você vá testar matrizes tão grandes ou maiores que isso, principalmente considerando que é um programa de começo de curso e não é esperado que seu programa considere todas as possibilidades imagináveis.

 

Já tem um código pronto em mãos, se não conseguiu resolver com essa informação então o problema é outro, e você ainda não entendeu algum dos conceitos fundamentais do C, nesse caso seria melhor você postar sua tentativa (idealmente em um novo tópico seu) para podermos te ajudar, afinal o objetivo desse fórum é auxiliar no seu aprendizado tirando dúvidas e/ou corrigindo seu código, e não podemos dar soluções prontas.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

to ficando maluco com isso, criei esse codigo mas nao sei como pegar os numeros das diagonais e fazer os calculos de todos os lador fara mostrar se é ou nao um matriz de quadrado magico 

#include <stdio.h>
#include <stdlib.h>

#define linhas 3
#define colunas 3

int main()
{
    int mat[linhas][colunas] = { 0 };

    for (int i = 0; i < linhas; i++)
    {
        for (int j = 0; j < colunas; j++)
        {
            printf("digite o valor da posiçao %d, %d do vetor:\n", i, j);
            scanf_s("%d", &mat[j]);
        }
    }

    printf("matriz digitada:\n");
    for (int i = 0; i < linhas; i++)
    {
        for (int j = 0; j < colunas; j++)
        {
            printf("%d\t", mat[j]);
        }
        printf("\n");
    }
    
    printf("diagonal principal:\n");
    for (int i = 0; i < linhas; i++)
    {
        for (int j = 0; j < colunas; j++)
        { 

            if (i == j)//diagonal principal
            {
                printf("%d\t", mat[j]);
            }
        }
    }

    printf("diagonal secundaria:\n");
    for (int i = 0; i < linhas; i++)
    {
        for (int j = 0; j < colunas; j++)
        {

            if (i == j)//diagonal secundaria
            {
                printf("%d\t", mat[j]);
            }
        }
    }

    system("pause");
    return 0;

}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

se tiver uma matriz de 3 por 3 você teria algo assim:
Screenshot_1.jpg.aeb22ef7d815cb0490b21fdf6852c210.jpg

Para somar as diagonais

principal.jpg.f9d0f6321aba52d57b7d5f4da392568f.jpg


Na diagonal principal você deveria passar pelas casas 00, 11, e 22. É dizer que se você usar o mesmo indice mara m e incrementar de 0 até 3-1, usando um for você n teria problemas.

E no caso da diagonal secundária:
secundaria.jpg.a96aa50c382dbea1313a5c3d8cfe0482.jpg
Deveria passar pelas casas 20, 11, 02. Se somar os índices 2+0, 1+1 e 0+2 o resultado sempre será 2(cortesia de @isrnick >_<). Então somente deveria somar caso índice i + j seja igual a 2. Percorra toda a matriz e some somente quando o resultado da soma de ambos índice seja igual a 2, nem dizer que para isso você precisa um if né.

Outra forma de somar a diagonal secundária seria criando 2 índices no mesmo for. Se você perceber poderia ter um int i = 0 e um int j = 2, com o i incrementamos e com o j decrementamos, faremos isso até que i seja menor que 3(3 é o tamanho da suposta matriz de 3x3 neste exemplo), quando isso ocorrer j vai ter um valor de zero, para ilustrar melhor a ideia deixo esse pedaço de código:

#include<stdio.h>
#define TAM 3 //TAM seria o tamanho da matriz neste exemplo

int main(){
    int matriz[TAM][TAM]={
        {22,45,67},
        {46,99,42},
        {13,16,27}
    };
    
    
    for (int i = 0, j=TAM-1; i<TAM; i++, j-- ) {
        printf("matriz[%d][%d]=%d\n", j, i, matriz[j][i] );
  
    }
    
    return 0;
}

Com isso você não teria de passar por outras casas que não sejam as que contenham os valores da diagonal secundária. só faltaria guardar o resultado.
 

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

Dá pra fazer todas as somas percorrendo a matriz uma única vez:

for (int i = 0; i < N; i++){
    for (int j = 0; j < N; j++){
        sLinha[i] += matriz[i][j]; //Soma da linha i
        sColuna[j] += matriz[i][j]; //Soma da coluna j
        if (i == j){ //Se for da diagonal principal:
            sDiag1 += matriz[i][j]; //Soma da diagonal principal
        }
        if (i + j == N-1) { //Se for da diagonal secundaria:
            sDiag2 += matriz[i][j]; //Soma da diagonal secundaria
        }
    }  
}

Aí é só comparar os resultados.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!