Ir ao conteúdo
  • Cadastre-se

C Como transformo essa matriz em uma matriz 4x5


klayfor

Posts recomendados

c) Ler 20 elementos para uma matriz qualquer, considerando que ela tenha o tamanho de 4 linhas por 5 colunas, em seguida apresentar a matriz.

Preciso de ajuda nessa questão.

 

Agradeço antecipadamente!.

 

#include<stdio.h>

int main ()
{

 int m[5][5],i,j;
 
 for(i=0;i<=4;i++){
  for(j=0;j<=4;j++){
   if(i == j) {
    m[j] = 1;
   }
   else {
    m[j] = 0;
   }
  }
 }
 
 for(i=0;i<=4;i++){
  for(j=0;j<=4;j++){
    printf("|%d|", m[j]);
  }
  printf("\n");
 }
 
 return 0;
}

[Código adicionado posteriormente]  

 

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

  • Membro VIP

Caro usuário,

 

Seja bem-vindo ao Fórum do Clube do Hardware.

 

No intuito de servir como fonte de pesquisa no caso de instituições de ensino, informamos que incorrer no resolvimento por completo de questões relacionadas a disciplinas escolares de cursos técnicos e faculdades podem ser revistas e removidas pela Equipe de Moderação do Clube do Hardware.

 

Para sanar dúvidas sobre esse tipo de problema, por gentileza, publique o passo a passo do desenvolvimento da questão, projeto, monografia ou conteúdo em dúvida para que possamos analisar se a resposta está correta ou não, ou para que possa ser auxiliado com a dúvida no desenvolvimento do exercício.

 

Infelizmente, não há como resolver os trabalhos pelos usuários. O objetivo do Fórum do Clube do Hardware é auxiliar seus usuários a encontrar soluções para que possam sanar suas dúvidas, e não de trazer soluções prontas para seus usuários. Além disso, copiar e colar respostas que não são de autoria própria do qualquer usuário é considerado plágio, o que é ilegal.

 

Esperamos que compreenda.

 

Atenciosamente,

Equipe Clube do Hardware

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

@klayfor    uma matriz é formada por linhas e colunas , e não tem jeito de transformar uma matriz , o quê você pode fazer é copiar o conteúdo de uma em outra , ou se você quer apenas imprimir o que está na matriz , nas 4 primeiras linhas , então você pode colocar o primeiro laço de repetição , com apenas 4 linhas , assim  :

#include <stdio.h>
int main(){
    int m[5][5],j,i;
    for(i=0; i<5; i++){
        for(j=0; j<5; j++){
            if(i == j){
                m[i][j] = 1;
            }
            else{
                m[i][j] = 0;
            }
        }
    }
    printf("\n\n");
    for(i=0; i<4; i++){
        printf("%d%c Linha -> ",i+1,166);
        for(j=0; j<5; j++){
            printf("| %d |",m[i][j]);
        }
        printf("\n");
    }
    printf("\n\nEssa Seria A Quinta Linha , Nao Mostrada\n\n");
    for(j=0; j<5; j++)printf("[ %d ]",m[4][j]);
    printf("\n\n\n");;
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, devair1010 disse:

uma matriz é formada por linhas e colunas , e não tem jeito de transformar uma matriz , o quê você pode fazer é copiar o conteúdo de uma em outra

 

@devair1010 mais ou menos isso. Uma matriz é formada por um endereço de início e uma série de bytes na memória. Apenas uma longa fila, e o tamanho vai ser a multiplicação das dimensões da dita matriz pelo tamanho de cada valor. Só isso. Não existe a noção de linhas ou colunas nesse momento.

 

Exemplo:

    int m[3][5];

são 3 * 5 * sizeof(int)

 

Outros casos

char	outra[5][6][2];
struct   coisa[20][1];

outra tem 5*6*2 char, ou seja 60 bytes

 

coisa tem 20 * sizeof(struct coisa)

 

 

e o espaço é alocado por linha então para encontrar o valor de m[x][y] considerando os índices a partir (0,0) se p for o endereço de m[0][0], o início da estrutura, você pode escrever

        m(x,y) = * ( p + y*C + x)

onde C é o número de colunas da matriz

 

Exemplo: considere a "matriz" do exemplo 1: int m[3][5] e o programa abaixo e ele mostra

sizeof(m) = 60
valor de m[2][2] = 12 (deve ser 12)
valor de m[2][2] = 12 (deve ser 12)

porque esse compilador usa int com 4 bytes e são 3*5 = 15 deles e então 60 bytes.
 

O primeiro é m[0][0] e o último m[2][4]. Se você numerar um por um o valor de m[2][2] deve ser 12, como mostra o programa

#include <stdio.h>
int main(int argc, char** argv)
{
    int m22 = 0;
    int m[3][5] =
    {    0,  1,  2,  3,  4,
         5,  6,  7,  8,  9,
        10, 11, 12, 13, 14
    };
    printf("sizeof(m) = %d\n", sizeof(m));
    printf("valor de m[2][2] = %d (deve ser 12)\n", m[2][2]);

    m22 = *(&m[0][0] + 2 * 5 + 2);
    printf("valor de m[2][2] = %d (deve ser 12)\n", m22);
  
    return 0;
}

 

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

  • Membro VIP

@Mirabell@devair1010@arfneto, para uma melhor contextualização, existia uma enunciado na postagem original, segue:
 

Em 24/04/2020 às 17:26, klayfor disse:

c) Ler 20 elementos para uma matriz qualquer, considerando que ela tenha o tamanho de 4 linhas por 5 colunas, em seguida apresentar a matriz.

Preciso de ajuda nessa questão.

 

Agradeço antecipadamente!.

 

Como porventura também sou um moderador do fórum, tomei a liberdade de recuperar o conteúdo na postagem inicial.

Att,

 

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

@Mirabell  nos dois primeiros loop's  foi inserido aqueles valores , aqui :

for(i=0; i<5; i++){               // 1º loop é qtd de linhas
        for(j=0; j<5; j++){       // 2º loop é qtd de colunas
            if(i == j){           // compara se a variável j e a variável i são iguais
                m[i][j] = 1;      // coloca na matriz esse valor aqui
            }
            else{                 // senão forem iguais
                m[i][j] = 0;      // coloca esse valor aqui na matriz
            }

 

Link para o comentário
Compartilhar em outros sites

12 minutos atrás, devair1010 disse:

@arfneto    obrigado ,  ainda estou estudando lógica de programação .

 

Essa noção de matriz vem da matemática. No escritório é uma tabela mesmo :) 

 

Mas no computador em C é apenas um vetor sempre, mesmo que tenha doze dimensões. E a fórmula é sempre essa aí, porque a alocação é feita sempre por linha,  a partir do endereço inicial.

 

Explicando um pouco melhor, a  partir do mesmo programa aqui acima

        m(x,y) = * ( p + y*C + x)

Onde p é o endereço de início da matriz, x a linha y a coluna a partir de 0,0 e C é o número de colunas

    m22 = *(&m[0][0] + 2 * 5 + 2);

&m[0][0] é o endereço de início, o tal p. E x = 2 e y = 2 e C = 5

 

Eu não prestei atenção ao que escrevi. Desculpem. O programa está certo no entanto.

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

  • Membro VIP

Sobre:

4 minutos atrás, arfneto disse:

Eu não prestei atenção ao que escrevi. Desculpem. O programa está certo no entanto.


Mais ou menos! rs.

 

Analisando todo o contexto, eu suspeito que o @klayfor pegou um algoritmo pronto (que serve para gerar uma matriz identidade), e queria alterar para servir para resolver o seu próprio problema...

 

adicionado 0 minutos depois
2 minutos atrás, Mirabell disse:

então todas devem ser iguais pois repetem o mesmo tanto de vezes a partir do 0

Não, vai gerar uma matriz identidade... 
 

Citação

Seja M uma matriz quadrada de ordem n. A matriz M é chamada de Matriz Identidade de ordem n (indicada por In) quando os elementos da diagonal principal são todos iguais a 1 e os elementos restantes são iguais a zero.

 

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

8 minutos atrás, Mirabell disse:

Não vi ninguém colocar valor nenhum na matriz ai bá sai numero em cada linha, eu seila o que é asci vocês ficam inventando moda.


leu o exemplo que eu mostrei? Não entendi o que quer dizer...

ASCII é uma abreviatura da tabela que associa as letras aos valores. Pode ver uma tabela dessas em a tal tabela ASCII

 

American Standard Code for Information Interchange é o que significa
 

Eis um pedaço dela mostrando as letras apenas
 

ascii.png.226f6d66d4fcc104f0430869c5109658.png

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

  • Membro VIP
14 minutos atrás, arfneto disse:

:) está certo sim


Se você estava se referindo ao próprio código, OK! Eu tinha entendido errado. :D


 

Eu tinha entendido que estava se referindo ao código do @devair1010... ou seja: seria "mais ou menos" pois poderia está "correto" para o quê o próprio @devair1010 propôs, OK!, mas não necessariamente para o que @klayfor precisa... Seria análogo a fazer um delicioso e perfeito hambúrguer, mas o cliente tivesse pedido um cachorro-quente. (o que importa é o enunciado... no caso o que foi pedido). Ainda nesse código, e se ele quisesse as 4 últimas linhas, por exemplo? o atual não serviria...

Observação: eu acho que o objetivo era outro:
 

19 minutos atrás, Simon Viegas disse:

queria alterar para servir para resolver o seu próprio problema...


Ou seja: poderia está querendo resolver o enunciado (que eu só recuperei depois de vocês terem respondido). Vide:

 

41 minutos atrás, Simon Viegas disse:

@Mirabell@devair1010@arfneto, para uma melhor contextualização, existia uma enunciado na postagem original, segue:
 

Em 24/04/2020 às 17:26, klayfor disse:

c) Ler 20 elementos para uma matriz qualquer, considerando que ela tenha o tamanho de 4 linhas por 5 colunas, em seguida apresentar a matriz.

Preciso de ajuda nessa questão.

 

Agradeço antecipadamente!.

 

Mas em fim: se não tivesse o enunciado ainda... acho que antes teria que descobrir qual era, ou seja: "para quê você quer transformar essa matriz em uma matriz 4x5". A alteração sem um contexto para mim ainda não faria sentido. Resumindo: ou ele queria resolver o enunciado lá; ou queria alterar para algum outro motivo que ainda não ficou claro (pelo menos para mim).

 

extend.gif

adicionado 1 minuto depois

Essa imagem acima tirei do link lá... @Mirabell, ali o código 166.

adicionado 10 minutos depois

@devair1010, seria a mesma coisa fazer assim, correto?

printf("%dª Linha -> ", i+1);


PS: vi que nos testei ficou normal, mas testei online e não funcionou...

 

Captura de tela de 2020-04-25 20-37-06.png

 

Fica um caractere "estranho" no lugar do "ª". Colocando a caractere direto no código apareceu normal neste site... 
 

Creio que deve existir alguma diferença de codificação entre compiladores... 

Existe alguma forma de forçar uma codificação?
 

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

@Simon Viegas    seria correto sim , coloquei o número da linha apenas para exemplificar , e  uso o codeblock  e não sei nenhum jeito de forçar a codificação ,  e nos compiladores online geralmente não funcionam mesmo , pois eles costumam não ter algumas bibliotecas , tipo conio ou outras .

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Simon Viegas disse:

Fica um caractere "estranho" no lugar do "ª". Colocando a caractere direto no código apareceu normal neste site... 
 

Creio que deve existir alguma diferença de codificação entre compiladores... 

Existe alguma forma de forçar uma codificação?

 

 

Ficou tudo muito muito confuso e engraçado. Muito bom esse tópico. :D 

 

Vendo a coisa meio de ponta-cabeça:

 

Como forçar uma codificação

 

Isso é um pesadelo dos anos 80. O pesadelo do século 21 é Unicode. ASCII é uma tabela de 128 bits, de 1963.  Quando era moderna o antigo era EBCDIC da IBM. Unicode é uma tabela que hoje tem mais de 1.1 milhão de caracteres. Curiosamente foi projetada em boa parte dor Ken Thompson e Rob Pike, caras que escreveram coisas simples como o Unix (KT) e linguagem Go (Pike) :) e boa parte da stdlib (KT)

 

Eis o que acontece: como a tabela ASCII só usava 7 bits a IBM criou --- acho que ainda na época acoplada à Microsoft com o desenvolvimento do DOS ---  uma tabela que chamou de Extended ASCII e que usava os caracteres entre 128 e 255 para novos símbolos. Alguns eram muito legais para desenhar na tela, coisas como caracteres com barras duplas e simples para desenhar caixas em torno do texto, e caracteres para preencher blocos inteiros de letra, que permitiam gerar um tipo de gráfico na tela, que só tinha letras e em geral 24 linhas por 80 colunas de letras.

 

Veja um pedaço da tabela:

image.png.77926419ddf82e8ac91a8354012aa187.png

 

E veja que tem os caras com barras simples, duplas e as intersecções então dava para criar formulários com dois tipos de borda.

Era muito legal.

E aí vieram alguns caracteres acentuados também. E logo veio a noção de poder alternar entre opções para esses caracteres e incluir caracteres de outros idiomas e tal. Nasceu a noção de code page. E vieram dezenas delas.

 

Como controlar essa coisa

 

O ideal é você chamar chcp() em seu programa logo no início e ver se a página de código que está configurada no momento tem o caracter que você quer mostrar, como esse 166 do exemplo. Se não tem você muda e depois restaura ao encerrar o programa.

 

O politicamente correto é na carga do programa ver as definições de cor de fundo cor do texto, página de código, fonte da console e coisas assim, e salvar.

Aí você altera para o que precisa e no final restaura tudo para como estava antes. Eis um exemplo para Windows, que eu escrevi sem grandes cuidados:

char* guarda()
{
    char* pLocale = &local_original[0];
    ccp_original = GetConsoleCP();
    occp_original = GetConsoleOutputCP();
    pLocale = setlocale(LC_ALL, NULL);
    // mas afinal qual a fonte da console?
    HANDLE  h = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_FONT_INFO info;
    CONSOLE_FONT_INFOEX infoEx;
    char buffer[80];
    char* pBuffer = buffer;
    int res = 0;
    printf("Chamando GetCurrentConsoleFont()\n");
    res = GetCurrentConsoleFont(h, 0, &info);
    if (res != 0)
    {
        printf("Posicao da fonte na tabela: %d\n", info.nFont);
        printf("Largura e altura de cada letra: %dx%d\n",
            info.dwFontSize.X,
            info.dwFontSize.Y
        );
    }
    else
    {
        printf("GetCurrentConsoleFont res = %d\n", res);
    };  // if()
    // pois e: mas qual a fonte? Tem que ver na tabela
    // precisa da versao ex da rotina e eu nao sabia
    printf("Chamando a tal GetCurrentConsoleFontEx()\n");
    infoEx.cbSize = sizeof(CONSOLE_FONT_INFOEX);
    res = GetCurrentConsoleFontEx(h, 0, &infoEx);
    if (res != 0)
    {
        printf("Familia da fonte (FontFamily): %d\n", infoEx.FontFamily);
        printf("Tamanho da fonte (FontWeight): %d\n", infoEx.FontWeight);
        int n = wcstombs(pBuffer, infoEx.FaceName, 80);
        printf("A fonte afinal: %s\n\n", buffer);
    }
    else
    {
        printf("GetCurrentConsoleFontEx res = %d\n", res);
    };  // if()
    //
    // A fonte em uso fica aqui no registro
    //    Computador\HKEY_LOCAL_MACHINE\SOFTWARE\
    //    Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont
    //
    return pLocale;
};  // guarda()

 

O modo ignorante de fazer é simplesmente chamar chcp() e forçar a codepage que você quer e pronto. Não faria isso para rodar no computador do seu chefe, claro...

 

E isso é claro um inferno. E tem a transição para o novo inferno, que é a codepage 65001 que usa UTF-8, um pedaço de Unicode, e se prepare para ler e estudar e se frustrar. Não funciona e nunca vai funcionar direito.

 

2 horas atrás, devair1010 disse:

seria correto sim , coloquei o número da linha apenas para exemplificar , e  uso o codeblock  e não sei nenhum jeito de forçar a codificação ,  e nos compiladores online geralmente não funcionam mesmo , pois eles costumam não ter algumas bibliotecas , tipo conio ou outras .

 

Não é o caso de correção. Não tem a ver com bibliotecas. Apenas com garantir que a página de código em uso tenha o tal caracter que você quer na posição 166. Os compiladores online podem não se importar com codepages latinas ou mesmo ocidentais... Esqueça essa conio. Como eu já disse muitas vezes aqui essa infeliz é uma herança do Turbo C da Borland, hoje Embarcadero, dos anos 80. Vinha em dois diskettes. O compilador todo: 1,44MB * 2. :D Até onde eu sei não há nada lá relevante em 2020. Ou em 2000 na verdade.

 

2 horas atrás, Simon Viegas disse:

c) Ler 20 elementos para uma matriz qualquer, considerando que ela tenha o tamanho de 4 linhas por 5 colunas, em seguida apresentar a matriz.

Preciso de ajuda nessa questão

 

Então, o exemplo que eu mostrei tem a fórmula. Basta aplicar em um loop tipo for. Veja a matriz que eu postei lá e entenda que os valores são lidos por linha, da esquerda para a direita. Só isso.

 

Eu postei um programa aqui um dia desses que fazia exatamente isso, mas em várias dimensões. Um pouco off-topic mas é um exemplo difícil de achar e por isso escrevi um.

 

 

Pode ajudar a entender a mecânica disso e como declara esse tipo de coisa. Vi agora que era um programa em C++ mas podia ser em C igualzinho eu creio. Ele mostra como acessar um vetor de 60 bytes em 1,2,3,4 ou 5 dimensões.

 

3 horas atrás, Simon Viegas disse:

Se você estava se referindo ao próprio código, OK! Eu tinha entendido errado

 

 

Eu não me expliquei bem. Eu só escrevi nesse tópico para dizer que não há "matrizes" nessas linguagens. Apenas vetores. E mostrar a fórmula que monta os valores para 2 dimensões. E um programa de exemplo.

 

E nem tinha lido o enunciado original.

 

E digitei errado a fórmula :( . Já corrigi. Note que é a mesma para qualquer número de dimensões.

 

Para ler os dados para a matriz como o autor do tópico precisa basta aplicar a fórmula ou simplesmente entender que precisa ler os dados da maneira como vai colocar na matriz. Só isso. O mais simples claro que é entrar com os dados por linha.

 

Como eliminar um coluna ou uma linha numa matriz?

 

De fato não há um comando, mas há uma simples fórmula então se você precisa seguidamente fazer isso para uma matriz basta criar um filtro usando como entrada os índices originais e como saída o desejado. Uma função simples na verdade. Mais simples de escrever do que de explicar. Algo assim:

        int* extrair( int* origem, int parametros); // algo assim

Se fosse para extrair uma linha ou a diagonal ou coluna ou sei lá. Recebe o endereço da matriz e retorna o valor desejado. Só isso. Se você quer extrair uma "linha" é trivial porque ela está seguidinha na memória. Se você quer uma coluna a distância entre cada elemento é... o número de colunas, lógico. Numa matriz (3x5) as colunas tem 3 elementos e a diferença entre o endereço de cada uma é... 5. E C tem aritmética de ponteiros então é só somar...

 

Se for importante me mostre uma especificação e eu escrevo um exemplo...

  • Curtir 1
  • Obrigado 1
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!