Questão 4
Construa um programa em LINGUAGEM C que crie uma matriz identidade com o tamanho informado pelo usuário N e armazene os seus respectivos valores. Em seguida mostre na tela a matriz identidade.
Dica 1: Matriz identidade é uma matriz quadrada onde os termos da diagonal principal são 1 e os demais termos são 0 .
Dica 2: Use o teste condicional “if” para verificar se a posição da linha é igual da coluna para armazenar o 1, caso contrário “else” armazene 0 na posição.
Passo 1
O enunciado pede claramente o seguinte:
- O usuário informa um número inteiro
(tamanho). - Deve-se construir uma matriz identidade de tamanho
e armazenar seus valores. - Em seguida, mostrar na tela a matriz identidade.
Informações dadas/úteis: - Matriz identidade: elementos da diagonal principal são
e todos os outros elementos são . - Sugestão do enunciado: usar um teste condicional que verifica se a posição da linha é igual à coluna (se sim, armazenar
; senão, armazenar ).
Passo 2
Escolha do método e ideia geral (algoritmo):
- Vamos usar uma matriz armazenada em memória dinâmica para aceitar qualquer
informado em tempo de execução. A implementação usará um bloco contíguo de memória com tamanho e indexação por fórmula. - Usaremos dois laços aninhados para percorrer linhas
e colunas , com variando de até e variando de até . - Para cada posição
aplicamos o teste condicional: se então armazenamos , caso contrário armazenamos . - A razão de usar alocação contígua (uma única chamada a malloc) é simplicidade e eficiência de memória; a posição
ficará em índice linear .
Passo 3
Conceitos de C que vamos usar (explicação didática, calma e sem pânico):
- Entrada do usuário: usamos
scanfpara ler um inteiro. Conferir o retorno de scanfgarante que a entrada é válida. - Teste de validade: verificar se
. Se não, avisar e encerrar. - Alocação dinâmica:
mallocretorna um ponteiro para um bloco de memória. Aqui vamos pedirN * N * sizeof(int)bytes. Sempre checar semallocretornouNULL(falha de alocação). - Indexação em bloco contíguo: se
matéint *, então o elemento da linhae coluna é mat[i * N + j]. Atenção: em C os índices começam em, então usamos . - Laços
for: percorrem índicesiej. - Condicional
if (i == j): quando verdade guardamos1, senão0. - Impressão:
printfpara mostrar a matriz; imprimiremos cada linha numa linha do terminal, separando colunas por espaço para ficar legível. - Liberação de memória: usar
freeao final para evitar vazamento.
Passo 4
Construção passo a passo do código (comentado linha a linha na lógica):
- Inclusões necessárias:
#include <stdio.h>paraprintf/scanf.#include <stdlib.h>paramalloc,freeeperror.
- Ler
: - Perguntar ao usuário e usar
scanf("%d", &N). - Verificar se
scanfdevolveu 1 (leitura bem-sucedida). - Verificar se
; se não, imprimir mensagem de erro e sair com código de erro.
- Perguntar ao usuário e usar
- Alocar memória:
- Fazer
int *mat = malloc((size_t)N * N * sizeof(int)); - Verificar
mat != NULL. SeNULL, usarperrore terminar.
- Fazer
- Preencher a matriz:
- Dois
for:for (int i = 0; i < N; ++i)e dentrofor (int j = 0; j < N; ++j). - linha de armazenamento:
mat[i * N + j] = (i == j) ? 1 : 0;- Aqui uso o operador ternário para ficar compacto; pode-se usar
if/elsecomo sugerido.
- Aqui uso o operador ternário para ficar compacto; pode-se usar
- Dois
- Imprimir a matriz:
- Novos laços aninhados; para cada elemento imprimir com
printf("%d", mat[i*N + j]);e imprimir espaço entre colunas,\nao final de cada linha.
- Novos laços aninhados; para cada elemento imprimir com
- Liberar memória com
free(mat);e terminarreturn 0;.
Passo 5
Observações importantes para a prova e variantes simples que podem aparecer:
- O enunciado sugeriu usar
if; se preferir, substitua a expressão ternária por:if (i == j) { mat[i*N + j] = 1; } else { mat[i*N + j] = 0; } - Atenção ao índice começar em
. Muitos iniciantes esquecem e fazem for (i=1;i<=N;i++)sem ajustar indexação. - Se o professor permitir, outra forma mais simples (mas menos flexível) é declarar
int mat[100][100];e usarNaté 100; isso evita malloc mas limita o tamanho. Em prova, adapte conforme instrução. - Sempre checar erros de entrada e de
mallocpara programas robustos.
Passo 6
Exemplo de execução no shell (para testar mentalmente):
- Suponha que o usuário digite
. - O programa imprimirá:
(linha 1)1 0 0 0
(linha 2)0 1 0 0
(linha 3)0 0 1 0
(linha 4)0 0 0 1
Isto é exatamente a matriz identidade.
Passo 7
Compilar e rodar (dicas práticas):
- Compile com
gcc -std=c99 -Wall -Wextra programa.c -o programa(opcional-std=c11). - Execute com
./programae informequando solicitado. - Se usar Windows com MinGW, o comando
gccé o mesmo; executeprograma.exe.
Passo 8
Encerramento motivacional e resumo rápido:
- A ideia central para a prova é esta: percorrer todas as posições
, testar se e escrever 1ou0. Isso é repetição + condicional + armazenamento em array. - Respira fundo — uma vez que você entenda o mecanismo
i*N + je que índices começam em, a resolução fica bem direta. Vai dar certo!
Resposta
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int N;
printf("Informe o tamanho N da matriz identidade: ");
if (scanf("%d", &N) != 1) {
fprintf(stderr, "Entrada inválida.\n");
return 1;
}
if (N <= 0) {
fprintf(stderr, "N deve ser um inteiro positivo.\n");
return 1;
}
int *mat = malloc((size_t)N * N * sizeof(int));
if (mat == NULL) {
perror("Erro ao alocar memória");
return 1;
}
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
if (i == j) {
mat[i * N + j] = 1;
} else {
mat[i * N + j] = 0;
}
}
}
printf("Matriz identidade %d x %d:\n", N, N);
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
printf("%d", mat[i * N + j]);
if (j < N - 1) printf(" ");
}
printf("\n");
}
free(mat);
return 0;
}